@opengsd/gsd-pi 1.2.0-dev.84c56d87 → 1.2.0-dev.8e6112e9

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 (631) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  15. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  16. package/dist/resources/extensions/async-jobs/index.js +65 -0
  17. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  18. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  19. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  20. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  21. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  23. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  24. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  25. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  26. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  27. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  28. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  29. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  31. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  33. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  34. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  35. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  36. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  37. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  38. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  39. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  40. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  41. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  42. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  43. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  44. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  45. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  46. package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
  47. package/dist/resources/extensions/gsd/auto-start.js +35 -15
  48. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  49. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  50. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  51. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  52. package/dist/resources/extensions/gsd/auto.js +52 -2
  53. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  54. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  55. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  56. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  57. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +145 -50
  58. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  59. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  62. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  63. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  64. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  65. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  66. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  67. package/dist/resources/extensions/gsd/constants.js +0 -2
  68. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  69. package/dist/resources/extensions/gsd/db/engine.js +5 -3
  70. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  71. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  72. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  73. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  74. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  75. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  76. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  77. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  78. package/dist/resources/extensions/gsd/files.js +33 -19
  79. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  80. package/dist/resources/extensions/gsd/gsd-db.js +11 -8
  81. package/dist/resources/extensions/gsd/guidance.js +60 -0
  82. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  83. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  84. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  85. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  86. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  87. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  88. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  89. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  90. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  91. package/dist/resources/extensions/gsd/notifications.js +12 -7
  92. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  93. package/dist/resources/extensions/gsd/preferences-models.js +2 -2
  94. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  95. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  96. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  97. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  100. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  107. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  108. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  111. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  112. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  113. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  114. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  115. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  116. package/dist/resources/extensions/gsd/state.js +11 -2
  117. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  118. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  119. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  120. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  121. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  122. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  123. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
  124. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  125. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  126. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  127. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  128. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  129. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  130. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  131. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  132. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  133. package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
  134. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  135. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  136. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  137. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  138. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  139. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  140. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  141. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  142. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  143. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  144. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  145. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  146. package/dist/resources/extensions/gsd/worktree.js +8 -1
  147. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  148. package/dist/resources/extensions/shared/gsd-browser-cli.js +45 -3
  149. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  150. package/dist/resources/shared/package-manager-detection.js +1 -1
  151. package/dist/resources/shared/package.json +3 -0
  152. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  153. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  154. package/dist/runtime-checks.d.ts +10 -0
  155. package/dist/runtime-checks.js +27 -0
  156. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  157. package/dist/update-check.d.ts +2 -0
  158. package/dist/update-check.js +24 -1
  159. package/dist/update-cmd.js +20 -3
  160. package/dist/web/standalone/.next/BUILD_ID +1 -1
  161. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  162. package/dist/web/standalone/.next/build-manifest.json +3 -3
  163. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  164. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/index.html +1 -1
  184. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  191. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  192. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  195. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  196. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  197. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  198. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  199. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  200. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  201. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  202. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  203. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  204. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  205. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  206. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  207. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  208. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  209. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  210. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  211. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  212. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  213. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  214. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  215. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  216. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  217. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  218. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  219. package/package.json +3 -3
  220. package/packages/cloud-mcp-gateway/package.json +2 -2
  221. package/packages/contracts/dist/rpc.d.ts +1 -0
  222. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  223. package/packages/contracts/dist/rpc.js.map +1 -1
  224. package/packages/contracts/package.json +1 -1
  225. package/packages/daemon/package.json +4 -4
  226. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  227. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  228. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  229. package/packages/gsd-agent-core/package.json +5 -5
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  250. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  263. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  264. package/packages/gsd-agent-modes/package.json +7 -7
  265. package/packages/mcp-server/README.md +12 -3
  266. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  267. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  268. package/packages/mcp-server/dist/cli-runner.js +137 -0
  269. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  270. package/packages/mcp-server/dist/cli.js +2 -53
  271. package/packages/mcp-server/dist/cli.js.map +1 -1
  272. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  273. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  275. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  276. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  277. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/pid-registry.js +452 -0
  279. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  280. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  281. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  282. package/packages/mcp-server/dist/probe-mode.js +10 -0
  283. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  284. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  285. package/packages/mcp-server/dist/server.js +4 -0
  286. package/packages/mcp-server/dist/server.js.map +1 -1
  287. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  288. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  289. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  290. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  291. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  292. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  293. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  294. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  295. package/packages/mcp-server/package.json +5 -4
  296. package/packages/native/package.json +1 -1
  297. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  298. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  299. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  300. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  301. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  302. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  303. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  304. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  305. package/packages/pi-agent-core/dist/index.js +3 -0
  306. package/packages/pi-agent-core/dist/index.js.map +1 -1
  307. package/packages/pi-agent-core/package.json +1 -1
  308. package/packages/pi-ai/README.md +1 -0
  309. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  310. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  311. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  312. package/packages/pi-ai/dist/index.d.ts +2 -0
  313. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/index.js +2 -0
  315. package/packages/pi-ai/dist/index.js.map +1 -1
  316. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  317. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/models.generated.js +460 -261
  319. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  322. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  323. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  324. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  325. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  326. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  327. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  329. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  330. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  331. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  332. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  333. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  334. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  336. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  337. package/packages/pi-ai/package.json +3 -2
  338. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  339. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  341. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  344. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  346. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  348. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  350. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  352. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  354. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/index.js +1 -1
  356. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  359. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  361. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  363. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  364. package/packages/pi-coding-agent/package.json +7 -7
  365. package/packages/pi-tui/dist/index.d.ts +1 -1
  366. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  367. package/packages/pi-tui/dist/index.js +1 -1
  368. package/packages/pi-tui/dist/index.js.map +1 -1
  369. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  370. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/terminal-image.js +54 -2
  372. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  373. package/packages/pi-tui/dist/tui.d.ts +8 -0
  374. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  375. package/packages/pi-tui/dist/tui.js +63 -18
  376. package/packages/pi-tui/dist/tui.js.map +1 -1
  377. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  378. package/packages/pi-tui/dist/utils.js +110 -36
  379. package/packages/pi-tui/dist/utils.js.map +1 -1
  380. package/packages/pi-tui/package.json +2 -2
  381. package/packages/rpc-client/package.json +2 -2
  382. package/pkg/dist/theme/theme.d.ts.map +1 -1
  383. package/pkg/dist/theme/theme.js +45 -17
  384. package/pkg/dist/theme/theme.js.map +1 -1
  385. package/pkg/package.json +1 -1
  386. package/src/resources/GSD-WORKFLOW.md +5 -4
  387. package/src/resources/extensions/ask-user-questions.ts +7 -2
  388. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  389. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  390. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  391. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  392. package/src/resources/extensions/async-jobs/index.ts +79 -0
  393. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  394. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  395. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  396. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  397. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  398. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  399. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  400. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  401. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  402. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  403. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  404. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  405. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  406. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  407. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  408. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  409. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  410. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  411. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  412. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  413. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  414. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  415. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  416. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  417. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  418. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  419. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  420. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  421. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  422. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  423. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  424. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  425. package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
  426. package/src/resources/extensions/gsd/auto-start.ts +36 -18
  427. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  428. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  429. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  430. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  431. package/src/resources/extensions/gsd/auto.ts +64 -2
  432. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  433. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  434. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  435. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  436. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +163 -55
  437. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  440. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  441. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  442. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  443. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  444. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  445. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  446. package/src/resources/extensions/gsd/constants.ts +0 -3
  447. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  448. package/src/resources/extensions/gsd/db/engine.ts +5 -3
  449. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  450. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  451. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  452. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  453. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  454. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  455. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  456. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  457. package/src/resources/extensions/gsd/files.ts +33 -12
  458. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  459. package/src/resources/extensions/gsd/gsd-db.ts +13 -10
  460. package/src/resources/extensions/gsd/guidance.ts +78 -0
  461. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  462. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  463. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  464. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  465. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  466. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  467. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  468. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  469. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  470. package/src/resources/extensions/gsd/notifications.ts +13 -6
  471. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  472. package/src/resources/extensions/gsd/preferences-models.ts +2 -1
  473. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  474. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  475. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  476. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  477. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  478. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  479. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  480. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  483. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  484. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  485. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  486. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  487. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  488. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  489. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  490. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  491. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  492. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  493. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  494. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  495. package/src/resources/extensions/gsd/state.ts +12 -1
  496. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  498. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  499. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  500. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  501. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  503. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  504. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  505. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  506. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  507. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  508. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  509. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  510. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  511. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  512. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  513. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  514. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  515. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  516. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  517. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  518. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  519. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  520. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  521. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  522. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  523. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  524. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  525. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  526. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  527. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  528. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  529. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  530. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  531. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  532. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  533. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  534. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  535. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  536. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  537. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  538. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  539. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  540. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  541. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  542. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  543. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  544. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  545. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  546. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  547. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  548. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  549. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  550. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  551. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  552. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  553. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  554. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  555. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  556. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  557. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  558. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  559. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  560. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  561. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  562. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  563. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  564. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +45 -2
  565. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  566. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  567. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  568. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  569. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
  570. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  571. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  572. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  573. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  574. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  575. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  576. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  577. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  578. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  579. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  580. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  582. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  583. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  584. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  585. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  586. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  587. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  588. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  589. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  590. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  591. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  592. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  593. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  594. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
  595. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  596. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  597. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  598. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  599. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  600. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  601. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  602. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  603. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  604. package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
  605. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  606. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  607. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  608. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  609. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  610. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  611. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  612. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  613. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  614. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  615. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  616. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  617. package/src/resources/extensions/gsd/worktree.ts +7 -1
  618. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  619. package/src/resources/extensions/shared/gsd-browser-cli.ts +54 -3
  620. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  621. package/src/resources/shared/package-manager-detection.ts +1 -1
  622. package/src/resources/shared/package.json +3 -0
  623. package/src/resources/skills/create-skill/SKILL.md +3 -0
  624. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  625. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  626. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  627. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  628. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  629. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  630. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
  631. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
@@ -15,7 +15,7 @@ import { homedir } from "node:os";
15
15
  import { createRequire } from "node:module";
16
16
  import { dirname, join } from "node:path";
17
17
  import { ZERO_USAGE, mapUsage } from "./partial-builder.js";
18
- import { attachExternalResultsToToolBlocks, buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, } from "./turn-assembler.js";
18
+ import { attachExternalResultsToToolBlocks, buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
19
19
  import { buildWorkflowMcpServers, getRequiredWorkflowToolsForAutoUnit, resolveWorkflowMcpProjectRoot, } from "../gsd/workflow-mcp.js";
20
20
  import { resolveWorkflowQuestionToolSurface } from "../gsd/question-transport.js";
21
21
  import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
@@ -24,10 +24,13 @@ import { markToolStart, markToolEnd } from "../gsd/auto.js";
24
24
  import { markInteractiveElicitationStart, markInteractiveElicitationEnd, } from "../gsd/auto-tool-tracking.js";
25
25
  import { discoverBrowserMcpServerName, discoverMcpServers, discoverMcpServerNames, discoverUserMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools, } from "../gsd/mcp-filter.js";
26
26
  import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
27
- import { getToolSurfaceReadinessError } from "../gsd/tool-surface-readiness.js";
27
+ import { getUnitToolSurfaceContract } from "../gsd/unit-tool-contracts.js";
28
+ import { awaitWorkflowMcpToolRegistration, getToolSurfaceReadinessError, POST_PREFLIGHT_READINESS_RETRY_DELAYS_MS, POST_PREFLIGHT_SDK_SETTLE_MS, TOOL_SURFACE_NOT_READY, } from "../gsd/tool-surface-readiness.js";
29
+ import { beginWorkflowMcpSdkSession, endWorkflowMcpSdkSession, } from "../gsd/workflow-mcp-readiness-cache.js";
30
+ import { getGuidedUnitContext } from "../gsd/guided-unit-context.js";
28
31
  import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
29
32
  import { showInterviewRound } from "../shared/tui.js";
30
- export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, } from "./turn-assembler.js";
33
+ export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
31
34
  export function serverToolUseToToolCallLike(block) {
32
35
  const argumentsValue = block.input && typeof block.input === "object" && !Array.isArray(block.input)
33
36
  ? block.input
@@ -179,13 +182,18 @@ const GSD_PHASE_PATTERNS = [
179
182
  ["reassess-roadmap", /\b(?:UNIT:\s*Reassess Roadmap|reassess-roadmap)\b/i],
180
183
  ["complete-slice", /\b(?:UNIT:\s*Complete Slice|complete-slice)\b/i],
181
184
  ["replan-slice", /\b(?:UNIT:\s*Replan Slice|replan-slice)\b/i],
185
+ ["refine-slice", /\b(?:UNIT:\s*Refine Slice|refine-slice)\b/i],
182
186
  ["plan-slice", /\b(?:UNIT:\s*Plan Slice|plan-slice|gsd_plan_slice)\b/i],
183
187
  ["plan-milestone", /\b(?:UNIT:\s*Plan Milestone|plan-milestone|gsd_plan_milestone)\b/i],
184
188
  ["execute-task", /\b(?:UNIT:\s*Execute Task|execute-task|execute-task-simple|reactive-execute)\b/i],
185
189
  ["gate-evaluate", /\b(?:UNIT:\s*Gate Evaluate|gate-evaluate|gsd_save_gate_result)\b/i],
186
190
  ["research-milestone", /\b(?:UNIT:\s*Research Milestone|research-milestone)\b/i],
187
191
  ["research-slice", /\b(?:UNIT:\s*Research Slice|research-slice)\b/i],
192
+ ["research-decision", /\b(?:research decision|research-decision)\b/i],
188
193
  ["discuss-milestone", /\b(?:Discuss milestone|discuss-milestone)\b/i],
194
+ ["discuss-slice", /\b(?:Discuss slice|discuss-slice)\b/i],
195
+ ["discuss-project", /\b(?:discuss-project|Discuss project)\b/i],
196
+ ["discuss-requirements", /\b(?:discuss-requirements|Discuss requirements)\b/i],
189
197
  ];
190
198
  export function inferGsdPhaseFromContext(context) {
191
199
  const text = [
@@ -198,6 +206,24 @@ export function inferGsdPhaseFromContext(context) {
198
206
  }
199
207
  return undefined;
200
208
  }
209
+ /**
210
+ * Resolve the GSD unit phase for Claude Code SDK sessions. Guided-flow
211
+ * dispatch records the authoritative unit type before the turn is queued;
212
+ * prefer that over regex inference from prompt text.
213
+ */
214
+ export function resolveGsdPhaseForSdk(context, projectRoot) {
215
+ const resolvedRoot = resolveWorkflowMcpProjectRoot(projectRoot);
216
+ const guided = getGuidedUnitContext(resolvedRoot)
217
+ ?? getGuidedUnitContext(projectRoot)
218
+ ?? getGuidedUnitContext();
219
+ if (guided?.unitType) {
220
+ const guidedRoot = resolveWorkflowMcpProjectRoot(guided.basePath);
221
+ if (guidedRoot === resolvedRoot) {
222
+ return guided.unitType;
223
+ }
224
+ }
225
+ return inferGsdPhaseFromContext(context);
226
+ }
201
227
  /**
202
228
  * Build a full conversational prompt from GSD's context messages.
203
229
  *
@@ -223,10 +249,15 @@ export function buildPromptFromContext(context, toolContext = {}) {
223
249
  const workflowToolLine = toolContext.workflowMcpServerName
224
250
  ? "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
225
251
  `are MCP tools — call them as mcp__${toolContext.workflowMcpServerName}__<tool_name> ` +
226
- `(e.g. mcp__${toolContext.workflowMcpServerName}__gsd_exec, mcp__${toolContext.workflowMcpServerName}__gsd_save_gate_result)\n`
252
+ `(e.g. mcp__${toolContext.workflowMcpServerName}__gsd_exec, mcp__${toolContext.workflowMcpServerName}__gsd_save_gate_result)\n` +
253
+ `- Structured user input: call mcp__${toolContext.workflowMcpServerName}__ask_user_questions. ` +
254
+ "Do not call bare ask_user_questions. Do not call native AskUserQuestion.\n"
227
255
  : "- GSD workflow MCP tools are unavailable in this Claude Code run.\n";
228
256
  const toolSearchLine = toolContext.workflowMcpServerName
229
- ? "- ToolSearch is NOT available never use it to discover tools; invoke the MCP tool directly\n"
257
+ ? "- ToolSearch is available only for Claude Code deferred workflow MCP hydration. " +
258
+ `If mcp__${toolContext.workflowMcpServerName}__<tool_name> is missing or Claude Code reports the server is still connecting, ` +
259
+ `use ToolSearch with select:mcp__${toolContext.workflowMcpServerName}__<tool_name> or the base tool name, then call the returned MCP tool directly. ` +
260
+ "Do not use ToolSearch for browser_* tools or general discovery.\n"
230
261
  : "- ToolSearch is NOT available — never use it to discover tools\n";
231
262
  const browserToolLine = toolContext.browserMcpServerName
232
263
  ? "- Browser verification uses gsd-browser MCP by default — call browser tools as " +
@@ -320,9 +351,11 @@ export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext
320
351
  message: { role: "user", content },
321
352
  parent_tool_use_id: null,
322
353
  };
323
- return (async function* () {
324
- yield sdkMessage;
325
- })();
354
+ return {
355
+ async *[Symbol.asyncIterator]() {
356
+ yield sdkMessage;
357
+ },
358
+ };
326
359
  }
327
360
  // ---------------------------------------------------------------------------
328
361
  // Error helper
@@ -341,6 +374,40 @@ function makeErrorMessage(model, errorMsg) {
341
374
  timestamp: Date.now(),
342
375
  };
343
376
  }
377
+ export function buildWorkflowMcpReadinessProgressMessage(input) {
378
+ const { unitType, workflowServerName, stage } = input;
379
+ if (stage === "preflight") {
380
+ return `Starting ${workflowServerName} MCP for ${unitType}; waiting for workflow tools to register...`;
381
+ }
382
+ const attempt = input.attempt === undefined ? "" : ` attempt ${input.attempt}`;
383
+ const delay = input.delayMs === undefined ? "" : ` Retrying in ${formatReadinessDelay(input.delayMs)}.`;
384
+ return `Still waiting for ${workflowServerName} MCP tools for ${unitType}${attempt}.${delay}`;
385
+ }
386
+ function formatReadinessDelay(delayMs) {
387
+ if (delayMs < 1_000)
388
+ return `${delayMs}ms`;
389
+ const seconds = delayMs / 1_000;
390
+ return Number.isInteger(seconds) ? `${seconds}s` : `${seconds.toFixed(1)}s`;
391
+ }
392
+ export function pushWorkflowMcpReadinessProgressEvent(input) {
393
+ const { stream, partial, state, message } = input;
394
+ if (!message)
395
+ return;
396
+ let contentIndex = state.contentIndex;
397
+ const existing = contentIndex === undefined ? undefined : partial.content[contentIndex];
398
+ if (contentIndex === undefined || existing?.type !== "text") {
399
+ contentIndex = partial.content.length;
400
+ state.contentIndex = contentIndex;
401
+ partial.content.push({ type: "text", text: "" });
402
+ stream.push({ type: "text_start", contentIndex, partial });
403
+ }
404
+ const block = partial.content[contentIndex];
405
+ if (block.type !== "text")
406
+ return;
407
+ const delta = block.text.length === 0 ? message : `\n${message}`;
408
+ block.text += delta;
409
+ stream.push({ type: "text_delta", contentIndex, delta, partial });
410
+ }
344
411
  export function isClaudeCodeAbortErrorMessage(message) {
345
412
  if (!message)
346
413
  return false;
@@ -1354,11 +1421,13 @@ function resolveProjectMcpServerConfigs(projectRoot, serverNames, fallbackServer
1354
1421
  function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, workflowExplicitlyBlocked) {
1355
1422
  if (!gsdPhase || !workflowServerName || workflowExplicitlyBlocked)
1356
1423
  return [];
1357
- const requiredTools = gsdPhase === "run-uat"
1424
+ const requestedTools = gsdPhase === "run-uat"
1358
1425
  ? [...RUN_UAT_WORKFLOW_TOOL_NAMES]
1359
- : getRequiredWorkflowToolsForAutoUnit(gsdPhase);
1360
- const supportTools = gsdPhase === "run-uat" ? [] : ["gsd_milestone_status"];
1361
- const requestedToolNames = [...new Set([...requiredTools, ...supportTools])];
1426
+ : [
1427
+ ...(getUnitToolSurfaceContract(gsdPhase)?.allowedGsdTools ?? []),
1428
+ ...getRequiredWorkflowToolsForAutoUnit(gsdPhase),
1429
+ ];
1430
+ const requestedToolNames = [...new Set(requestedTools.filter((toolName) => toolName.startsWith("gsd_") || toolName === "ask_user_questions"))];
1362
1431
  if (requestedToolNames.length === 0)
1363
1432
  return [];
1364
1433
  return resolveToolPresentationPlan({
@@ -1368,6 +1437,25 @@ function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, work
1368
1437
  requestedToolNames,
1369
1438
  }).presentedToolNames;
1370
1439
  }
1440
+ function resolveClaudeNativeToolsForPhase(gsdPhase) {
1441
+ const standardClaudeTools = [
1442
+ "Read",
1443
+ "Write",
1444
+ "Edit",
1445
+ "Glob",
1446
+ "Grep",
1447
+ "Bash",
1448
+ "Agent",
1449
+ "WebFetch",
1450
+ "WebSearch",
1451
+ ];
1452
+ if (!gsdPhase)
1453
+ return standardClaudeTools;
1454
+ if (gsdPhase === "run-uat" || gsdPhase === "complete-slice") {
1455
+ return [...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES];
1456
+ }
1457
+ return standardClaudeTools;
1458
+ }
1371
1459
  export function autoInitClaudeCodeWorkflowMcp(cwd) {
1372
1460
  const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
1373
1461
  try {
@@ -1379,6 +1467,51 @@ export function autoInitClaudeCodeWorkflowMcp(cwd) {
1379
1467
  }
1380
1468
  }
1381
1469
  }
1470
+ export function resolveClaudeCodeToolSurfaceReadinessError(input) {
1471
+ const error = getToolSurfaceReadinessError(input);
1472
+ if (error
1473
+ && input.allowPendingToolSearchHydration
1474
+ && input.workflowServerName
1475
+ && input.observation.mcpServers.some((server) => server.name === input.workflowServerName && server.status === "pending")) {
1476
+ return Promise.resolve(null);
1477
+ }
1478
+ return Promise.resolve(error);
1479
+ }
1480
+ export { awaitWorkflowMcpToolRegistration } from "../gsd/tool-surface-readiness.js";
1481
+ const TOOL_SURFACE_READINESS_RETRY_DELAYS_MS = [500, 1_000, 2_000, 4_000, 8_000, 15_000, 15_000, 15_000];
1482
+ export function shouldRetryClaudeCodeToolSurfaceReadiness(error) {
1483
+ if (!error)
1484
+ return false;
1485
+ return error.includes(TOOL_SURFACE_NOT_READY) && !/\bterminal\b/i.test(error);
1486
+ }
1487
+ export function resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(error, attempt, preflightVerified = false) {
1488
+ if (!shouldRetryClaudeCodeToolSurfaceReadiness(error))
1489
+ return null;
1490
+ const delays = preflightVerified
1491
+ ? POST_PREFLIGHT_READINESS_RETRY_DELAYS_MS
1492
+ : TOOL_SURFACE_READINESS_RETRY_DELAYS_MS;
1493
+ return delays[attempt] ?? null;
1494
+ }
1495
+ function makeAbortError() {
1496
+ const error = new Error("AbortError: The operation was aborted");
1497
+ error.name = "AbortError";
1498
+ return error;
1499
+ }
1500
+ function delay(ms, signal) {
1501
+ if (signal?.aborted)
1502
+ return Promise.reject(makeAbortError());
1503
+ return new Promise((resolve, reject) => {
1504
+ const timeout = setTimeout(() => {
1505
+ signal?.removeEventListener("abort", onAbort);
1506
+ resolve();
1507
+ }, ms);
1508
+ const onAbort = () => {
1509
+ clearTimeout(timeout);
1510
+ reject(makeAbortError());
1511
+ };
1512
+ signal?.addEventListener("abort", onAbort, { once: true });
1513
+ });
1514
+ }
1382
1515
  /**
1383
1516
  * Build the options object passed to the Claude Agent SDK's `query()` call.
1384
1517
  *
@@ -1510,34 +1643,27 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1510
1643
  `mcp__${workflowServerName}__gsd_save_gate_result`,
1511
1644
  ]
1512
1645
  : [];
1646
+ const allowToolSearchForWorkflowMcp = workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0;
1513
1647
  const disallowedTools = [...new Set([
1514
- "ToolSearch",
1648
+ ...(allowToolSearchForWorkflowMcp ? [] : ["ToolSearch"]),
1649
+ ...(gsdPhase ? ["Skill"] : []),
1515
1650
  ...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
1516
1651
  ...questionToolSurface.disallowedTools,
1517
1652
  ...runUatDisallowedTools,
1518
1653
  ...extraDisallowedTools,
1519
1654
  ])];
1520
- const standardClaudeTools = [
1521
- "Read",
1522
- "Write",
1523
- "Edit",
1524
- "Glob",
1525
- "Grep",
1526
- "Bash",
1527
- "Agent",
1528
- "WebFetch",
1529
- "WebSearch",
1530
- ];
1655
+ const nativeTools = resolveClaudeNativeToolsForPhase(gsdPhase);
1531
1656
  const allowedTools = gsdPhase === "run-uat"
1532
1657
  ? [
1533
- ...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES,
1658
+ ...nativeTools,
1534
1659
  ...(exactWorkflowMcpTools.length > 0 ? exactWorkflowMcpTools : []),
1535
1660
  ...allowedBrowserMcpTools,
1536
1661
  ]
1537
1662
  : [
1538
- ...standardClaudeTools,
1663
+ ...nativeTools,
1539
1664
  ...exactWorkflowMcpTools,
1540
- ...(workflowMcpTools.length > 0 ? workflowMcpTools : ["AskUserQuestion"]),
1665
+ ...(!gsdPhase && workflowMcpTools.length > 0 ? workflowMcpTools : []),
1666
+ ...(workflowMcpTools.length === 0 && exactWorkflowMcpTools.length === 0 ? ["AskUserQuestion"] : []),
1541
1667
  ...allowedBrowserMcpTools,
1542
1668
  ];
1543
1669
  const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
@@ -1594,33 +1720,33 @@ export function streamViaClaudeCode(model, context, options) {
1594
1720
  void pumpSdkMessages(model, context, options, stream);
1595
1721
  return stream;
1596
1722
  }
1723
+ function createSdkAttemptMessageState() {
1724
+ return {
1725
+ builder: null,
1726
+ intermediateToolBlocks: [],
1727
+ toolResultsById: new Map(),
1728
+ };
1729
+ }
1597
1730
  /** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
1598
1731
  async function pumpSdkMessages(model, context, options, stream) {
1599
1732
  const modelId = model.id;
1600
- let builder = null;
1601
1733
  /** Track the last text content seen across all assistant turns for the final message. */
1602
1734
  let lastTextContent = "";
1603
1735
  let lastThinkingContent = "";
1604
- /** Collect tool blocks from intermediate SDK turns for tool execution rendering. */
1605
- const intermediateToolBlocks = [];
1606
- /** Preserve real external tool results from Claude Code's synthetic user messages. */
1607
- const toolResultsById = new Map();
1608
1736
  try {
1609
- // Dynamic import — the SDK is an optional dependency.
1610
- const sdkModule = "@anthropic-ai/claude-agent-sdk";
1611
- const sdk = (await import(/* webpackIgnore: true */ sdkModule));
1612
- // Bridge GSD's AbortSignal to SDK's AbortController
1613
- const controller = new AbortController();
1614
- if (options?.signal) {
1615
- options.signal.addEventListener("abort", () => controller.abort(), { once: true });
1616
- }
1617
1737
  const permissionMode = await resolveClaudePermissionMode();
1618
- const uiContext = options?.extensionUIContext;
1619
- const onExternalToolCall = options?.onExternalToolCall;
1620
- const onExternalToolResult = options?.onExternalToolResult;
1738
+ const claudeOptions = options;
1739
+ const uiContext = claudeOptions?.extensionUIContext;
1740
+ const onExternalToolCall = claudeOptions?.onExternalToolCall;
1741
+ const onExternalToolResult = claudeOptions?.onExternalToolResult;
1742
+ const sdkQueryForTest = claudeOptions?._sdkQueryForTest;
1743
+ const query = sdkQueryForTest ??
1744
+ // Dynamic import — the SDK is an optional dependency.
1745
+ (await import(/* webpackIgnore: true */ "@anthropic-ai/claude-agent-sdk")).query;
1621
1746
  const cwd = resolveClaudeCodeCwd(options);
1747
+ const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
1622
1748
  autoInitClaudeCodeWorkflowMcp(cwd);
1623
- const gsdPhase = inferGsdPhaseFromContext(context);
1749
+ const gsdPhase = resolveGsdPhaseForSdk(context, projectRoot);
1624
1750
  const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
1625
1751
  // When no UI is available (headless / auto-mode), auto-approve all
1626
1752
  // tool requests. This replaces the old bypassPermissions workaround.
@@ -1638,18 +1764,13 @@ async function pumpSdkMessages(model, context, options, stream) {
1638
1764
  : {}),
1639
1765
  });
1640
1766
  const workflowMcpServerName = workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools);
1767
+ const allowPendingToolSearchHydration = Boolean(workflowMcpServerName && gsdPhase)
1768
+ && !sdkOpts.disallowedTools?.includes("ToolSearch");
1641
1769
  const prompt = buildPromptFromContext(context, {
1642
1770
  workflowMcpServerName,
1643
1771
  browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
1644
1772
  });
1645
1773
  const queryPrompt = buildSdkQueryPrompt(context, prompt);
1646
- const queryResult = sdk.query({
1647
- prompt: queryPrompt,
1648
- options: {
1649
- ...sdkOpts,
1650
- abortController: controller,
1651
- },
1652
- });
1653
1774
  // Emit start with an empty partial
1654
1775
  const initialPartial = {
1655
1776
  role: "assistant",
@@ -1662,192 +1783,303 @@ async function pumpSdkMessages(model, context, options, stream) {
1662
1783
  timestamp: Date.now(),
1663
1784
  };
1664
1785
  stream.push({ type: "start", partial: initialPartial });
1665
- for await (const msg of queryResult) {
1666
- if (options?.signal?.aborted) {
1667
- // User-initiated cancel — emit an aborted error so the agent
1668
- // loop classifies this as a deliberate stop, not a transient
1669
- // provider failure that should be retried.
1670
- stream.push({
1671
- type: "error",
1672
- reason: "aborted",
1673
- error: makeAbortedMessage(modelId, lastTextContent),
1674
- });
1675
- return;
1676
- }
1677
- switch (msg.type) {
1678
- // -- Init --
1679
- case "system": {
1680
- // Tool Surface Readiness gate: the init message is the first (and
1681
- // only) point where the session reports its live tool surface and
1682
- // MCP server statuses. If the workflow server failed or has not
1683
- // registered this Unit's required tools, abort before the first
1684
- // model turn with a transient, recovery-classifiable error
1685
- // (tool-unavailable → retry) instead of letting the model hit
1686
- // "No such tool available" mid-Unit and improvise around it.
1687
- const init = msg;
1688
- if (init.subtype === "init") {
1689
- const readinessError = getToolSurfaceReadinessError({
1690
- unitType: gsdPhase,
1691
- workflowServerName: workflowMcpServerName,
1692
- observation: { tools: init.tools ?? [], mcpServers: init.mcp_servers ?? [] },
1786
+ const readinessProgressState = {};
1787
+ const trackWorkflowMcpSdk = Boolean(workflowMcpServerName && gsdPhase);
1788
+ if (trackWorkflowMcpSdk)
1789
+ beginWorkflowMcpSdkSession();
1790
+ try {
1791
+ let workflowMcpPreflightVerified = false;
1792
+ const shouldRunWorkflowMcpPreflight = workflowMcpServerName && gsdPhase && !claudeOptions?._skipWorkflowMcpPreflightForTest;
1793
+ if (shouldRunWorkflowMcpPreflight) {
1794
+ try {
1795
+ const progressMessage = buildWorkflowMcpReadinessProgressMessage({
1796
+ unitType: gsdPhase,
1797
+ workflowServerName: workflowMcpServerName,
1798
+ stage: "preflight",
1799
+ });
1800
+ pushWorkflowMcpReadinessProgressEvent({
1801
+ stream,
1802
+ partial: initialPartial,
1803
+ state: readinessProgressState,
1804
+ message: progressMessage,
1805
+ });
1806
+ uiContext?.setStatus?.("gsd-step", progressMessage);
1807
+ const preflightError = await awaitWorkflowMcpToolRegistration({
1808
+ unitType: gsdPhase,
1809
+ workflowServerName: workflowMcpServerName,
1810
+ projectRoot,
1811
+ signal: options?.signal,
1812
+ });
1813
+ if (preflightError) {
1814
+ stream.push({
1815
+ type: "error",
1816
+ reason: "error",
1817
+ error: makeErrorMessage(modelId, preflightError),
1693
1818
  });
1694
- if (readinessError) {
1695
- controller.abort();
1819
+ return;
1820
+ }
1821
+ workflowMcpPreflightVerified = true;
1822
+ }
1823
+ finally {
1824
+ uiContext?.setStatus?.("gsd-step", "");
1825
+ }
1826
+ if (workflowMcpPreflightVerified) {
1827
+ await delay(POST_PREFLIGHT_SDK_SETTLE_MS, options?.signal);
1828
+ }
1829
+ }
1830
+ sdkAttemptLoop: for (let readinessAttempt = 0;; readinessAttempt++) {
1831
+ let { builder, intermediateToolBlocks, toolResultsById } = createSdkAttemptMessageState();
1832
+ const controller = new AbortController();
1833
+ const forwardAbort = () => controller.abort();
1834
+ if (options?.signal) {
1835
+ options.signal.addEventListener("abort", forwardAbort, { once: true });
1836
+ }
1837
+ const queryResult = query({
1838
+ prompt: queryPrompt,
1839
+ options: {
1840
+ ...sdkOpts,
1841
+ abortController: controller,
1842
+ },
1843
+ });
1844
+ try {
1845
+ for await (const msg of queryResult) {
1846
+ if (options?.signal?.aborted) {
1847
+ // User-initiated cancel — emit an aborted error so the agent
1848
+ // loop classifies this as a deliberate stop, not a transient
1849
+ // provider failure that should be retried.
1696
1850
  stream.push({
1697
1851
  type: "error",
1698
- reason: "error",
1699
- error: makeErrorMessage(modelId, readinessError),
1852
+ reason: "aborted",
1853
+ error: makeAbortedMessage(modelId, lastTextContent),
1700
1854
  });
1701
1855
  return;
1702
1856
  }
1703
- }
1704
- break;
1705
- }
1706
- // -- Streaming partial messages --
1707
- case "stream_event": {
1708
- const partial = msg;
1709
- const event = partial.event;
1710
- const result = handleClaudeCodePartialStreamEvent(builder, event, modelId);
1711
- builder = result.builder;
1712
- const assistantEvent = result.assistantEvent;
1713
- if (assistantEvent) {
1714
- stream.push(assistantEvent);
1715
- if (assistantEvent.type === "toolcall_start") {
1716
- const toolBlock = assistantEvent.partial.content[assistantEvent.contentIndex];
1717
- if (toolBlock?.type === "toolCall") {
1718
- try {
1719
- await onExternalToolCall?.(toolBlock);
1720
- }
1721
- catch (error) {
1722
- console.warn("[claude-code] onExternalToolCall callback failed:", error);
1857
+ switch (msg.type) {
1858
+ // -- Init --
1859
+ case "system": {
1860
+ // Tool Surface Readiness gate: the init message is the first (and
1861
+ // only) point where the session reports its live tool surface and
1862
+ // MCP server statuses. If the workflow server failed or has not
1863
+ // registered this Unit's required tools, abort before the first
1864
+ // model turn with a transient, recovery-classifiable error
1865
+ // (tool-unavailable → retry) instead of letting the model hit
1866
+ // "No such tool available" mid-Unit and improvise around it.
1867
+ const init = msg;
1868
+ if (init.subtype === "init") {
1869
+ const readinessError = await resolveClaudeCodeToolSurfaceReadinessError({
1870
+ unitType: gsdPhase,
1871
+ workflowServerName: workflowMcpServerName,
1872
+ projectRoot,
1873
+ observation: { tools: init.tools ?? [], mcpServers: init.mcp_servers ?? [] },
1874
+ allowPendingToolSearchHydration,
1875
+ });
1876
+ if (readinessError) {
1877
+ const retryDelayMs = resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(readinessError, readinessAttempt, workflowMcpPreflightVerified);
1878
+ if (retryDelayMs !== null && !options?.signal?.aborted) {
1879
+ controller.abort();
1880
+ const progressMessage = buildWorkflowMcpReadinessProgressMessage({
1881
+ unitType: gsdPhase ?? "workflow unit",
1882
+ workflowServerName: workflowMcpServerName ?? "workflow",
1883
+ stage: "retry",
1884
+ attempt: readinessAttempt + 1,
1885
+ delayMs: retryDelayMs,
1886
+ });
1887
+ pushWorkflowMcpReadinessProgressEvent({
1888
+ stream,
1889
+ partial: initialPartial,
1890
+ state: readinessProgressState,
1891
+ message: progressMessage,
1892
+ });
1893
+ uiContext?.setStatus?.("gsd-step", progressMessage);
1894
+ await delay(retryDelayMs, options?.signal);
1895
+ uiContext?.setStatus?.("gsd-step", "");
1896
+ continue sdkAttemptLoop;
1897
+ }
1898
+ controller.abort();
1899
+ stream.push({
1900
+ type: "error",
1901
+ reason: "error",
1902
+ error: makeErrorMessage(modelId, readinessError),
1903
+ });
1904
+ return;
1905
+ }
1723
1906
  }
1907
+ break;
1724
1908
  }
1725
- }
1726
- }
1727
- break;
1728
- }
1729
- // -- Complete assistant message (non-streaming fallback) --
1730
- case "assistant": {
1731
- const sdkAssistant = msg;
1732
- // Capture text content from complete messages
1733
- for (const block of sdkAssistant.message.content) {
1734
- if (block.type === "text") {
1735
- lastTextContent = block.text;
1736
- }
1737
- else if (block.type === "thinking") {
1738
- lastThinkingContent = block.thinking;
1739
- }
1740
- }
1741
- break;
1742
- }
1743
- // -- User message (synthetic tool result — signals turn boundary) --
1744
- case "user": {
1745
- // Capture content from the completed turn before resetting
1746
- if (builder) {
1747
- for (const block of builder.message.content) {
1748
- if (block.type === "text" && block.text) {
1749
- lastTextContent = block.text;
1750
- }
1751
- else if (block.type === "thinking" && block.thinking) {
1752
- lastThinkingContent = block.thinking;
1909
+ // -- Streaming partial messages --
1910
+ case "stream_event": {
1911
+ const partial = msg;
1912
+ const event = partial.event;
1913
+ const result = handleClaudeCodePartialStreamEvent(builder, event, modelId);
1914
+ builder = result.builder;
1915
+ const assistantEvent = result.assistantEvent;
1916
+ if (assistantEvent) {
1917
+ stream.push(assistantEvent);
1918
+ if (assistantEvent.type === "toolcall_start") {
1919
+ const toolBlock = assistantEvent.partial.content[assistantEvent.contentIndex];
1920
+ if (toolBlock?.type === "toolCall") {
1921
+ try {
1922
+ await onExternalToolCall?.(toolBlock);
1923
+ }
1924
+ catch (error) {
1925
+ console.warn("[claude-code] onExternalToolCall callback failed:", error);
1926
+ }
1927
+ }
1928
+ }
1929
+ }
1930
+ break;
1753
1931
  }
1754
- else if (block.type === "toolCall" || block.type === "serverToolUse") {
1755
- // Collect tool blocks for externalToolExecution rendering
1756
- intermediateToolBlocks.push(block);
1932
+ // -- Complete assistant message (non-streaming fallback) --
1933
+ case "assistant": {
1934
+ const sdkAssistant = msg;
1935
+ // Capture text content from complete messages
1936
+ for (const block of sdkAssistant.message.content) {
1937
+ if (block.type === "text") {
1938
+ lastTextContent = block.text;
1939
+ }
1940
+ else if (block.type === "thinking") {
1941
+ lastThinkingContent = block.thinking;
1942
+ }
1943
+ }
1944
+ break;
1757
1945
  }
1758
- }
1759
- }
1760
- // Extract tool results from the SDK's synthetic user message
1761
- // and attach to corresponding tool call blocks immediately.
1762
- for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg)) {
1763
- toolResultsById.set(toolUseId, result);
1764
- }
1765
- attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
1766
- // Push a synthetic toolcall_end for each tool call from this turn
1767
- // so the TUI can render tool results in real-time during the SDK
1768
- // session instead of waiting until the entire session completes.
1769
- if (builder) {
1770
- for (const block of builder.message.content) {
1771
- const extResult = block.externalResult;
1772
- if (!extResult)
1773
- continue;
1774
- const contentIndex = builder.message.content.indexOf(block);
1775
- if (contentIndex < 0)
1776
- continue;
1777
- // Push synthetic completion events with result attached so the
1778
- // chat-controller can update pending ToolExecutionComponents.
1779
- if (block.type === "toolCall") {
1780
- try {
1781
- await onExternalToolResult?.({
1782
- toolCall: block,
1783
- result: extResult,
1784
- });
1946
+ // -- User message (synthetic tool result — signals turn boundary) --
1947
+ case "user": {
1948
+ // Capture content from the completed turn before resetting
1949
+ if (builder) {
1950
+ for (const block of builder.message.content) {
1951
+ if (block.type === "text" && block.text) {
1952
+ lastTextContent = block.text;
1953
+ }
1954
+ else if (block.type === "thinking" && block.thinking) {
1955
+ lastThinkingContent = block.thinking;
1956
+ }
1957
+ else if (block.type === "toolCall" || block.type === "serverToolUse") {
1958
+ // Collect tool blocks for externalToolExecution rendering
1959
+ intermediateToolBlocks.push(block);
1960
+ }
1961
+ }
1785
1962
  }
1786
- catch (error) {
1787
- console.warn("[claude-code] onExternalToolResult callback failed:", error);
1963
+ // Extract tool results from the SDK's synthetic user message
1964
+ // and attach to corresponding tool call blocks immediately.
1965
+ for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg)) {
1966
+ toolResultsById.set(toolUseId, result);
1788
1967
  }
1789
- stream.push({
1790
- type: "toolcall_end",
1791
- contentIndex,
1792
- toolCall: block,
1793
- partial: builder.message,
1794
- });
1968
+ attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
1969
+ // Push a synthetic toolcall_end for each tool call from this turn
1970
+ // so the TUI can render tool results in real-time during the SDK
1971
+ // session instead of waiting until the entire session completes.
1972
+ if (builder) {
1973
+ for (const block of builder.message.content) {
1974
+ const extResult = block.externalResult;
1975
+ if (!extResult)
1976
+ continue;
1977
+ const contentIndex = builder.message.content.indexOf(block);
1978
+ if (contentIndex < 0)
1979
+ continue;
1980
+ const suppressDuplicateUnavailable = shouldSuppressDuplicateToolUnavailableBlock(block, builder.message.content);
1981
+ // Push synthetic completion events with result attached so the
1982
+ // chat-controller can update pending ToolExecutionComponents.
1983
+ if (block.type === "toolCall") {
1984
+ if (suppressDuplicateUnavailable) {
1985
+ delete block.externalResult;
1986
+ stream.push({
1987
+ type: "toolcall_end",
1988
+ contentIndex,
1989
+ toolCall: block,
1990
+ partial: builder.message,
1991
+ });
1992
+ block.externalResult = extResult;
1993
+ continue;
1994
+ }
1995
+ try {
1996
+ await onExternalToolResult?.({
1997
+ toolCall: block,
1998
+ result: extResult,
1999
+ });
2000
+ }
2001
+ catch (error) {
2002
+ console.warn("[claude-code] onExternalToolResult callback failed:", error);
2003
+ }
2004
+ stream.push({
2005
+ type: "toolcall_end",
2006
+ contentIndex,
2007
+ toolCall: block,
2008
+ partial: builder.message,
2009
+ });
2010
+ }
2011
+ else if (block.type === "serverToolUse") {
2012
+ try {
2013
+ await onExternalToolResult?.({
2014
+ toolCall: serverToolUseToToolCallLike(block),
2015
+ result: extResult,
2016
+ });
2017
+ }
2018
+ catch (error) {
2019
+ console.warn("[claude-code] onExternalToolResult callback failed:", error);
2020
+ }
2021
+ stream.push({
2022
+ type: "server_tool_use",
2023
+ contentIndex,
2024
+ partial: builder.message,
2025
+ });
2026
+ }
2027
+ }
2028
+ }
2029
+ builder = null;
2030
+ break;
1795
2031
  }
1796
- else if (block.type === "serverToolUse") {
1797
- try {
1798
- await onExternalToolResult?.({
1799
- toolCall: serverToolUseToToolCallLike(block),
1800
- result: extResult,
1801
- });
2032
+ // -- Result (terminal) --
2033
+ case "result": {
2034
+ const result = msg;
2035
+ const finalContent = buildFinalAssistantContent({
2036
+ intermediateToolBlocks,
2037
+ pendingContent: builder?.message.content,
2038
+ toolResultsById,
2039
+ lastThinkingContent,
2040
+ lastTextContent,
2041
+ fallbackResultText: result.subtype === "success" && result.result ? result.result : undefined,
2042
+ });
2043
+ const finalMessage = {
2044
+ role: "assistant",
2045
+ content: finalContent,
2046
+ api: "anthropic-messages",
2047
+ provider: "claude-code",
2048
+ model: modelId,
2049
+ usage: mapUsage(result.usage, result.total_cost_usd),
2050
+ stopReason: result.is_error ? "error" : "stop",
2051
+ timestamp: Date.now(),
2052
+ };
2053
+ if (result.is_error) {
2054
+ finalMessage.errorMessage = getResultErrorMessage(result);
2055
+ stream.push({ type: "error", reason: "error", error: finalMessage });
1802
2056
  }
1803
- catch (error) {
1804
- console.warn("[claude-code] onExternalToolResult callback failed:", error);
2057
+ else {
2058
+ stream.push({ type: "done", reason: "stop", message: finalMessage });
1805
2059
  }
1806
- stream.push({
1807
- type: "server_tool_use",
1808
- contentIndex,
1809
- partial: builder.message,
1810
- });
2060
+ return;
1811
2061
  }
2062
+ default:
2063
+ break;
1812
2064
  }
1813
2065
  }
1814
- builder = null;
1815
- break;
1816
2066
  }
1817
- // -- Result (terminal) --
1818
- case "result": {
1819
- const result = msg;
1820
- const finalContent = buildFinalAssistantContent({
1821
- intermediateToolBlocks,
1822
- pendingContent: builder?.message.content,
1823
- toolResultsById,
1824
- lastThinkingContent,
1825
- lastTextContent,
1826
- fallbackResultText: result.subtype === "success" && result.result ? result.result : undefined,
1827
- });
1828
- const finalMessage = {
1829
- role: "assistant",
1830
- content: finalContent,
1831
- api: "anthropic-messages",
1832
- provider: "claude-code",
1833
- model: modelId,
1834
- usage: mapUsage(result.usage, result.total_cost_usd),
1835
- stopReason: result.is_error ? "error" : "stop",
1836
- timestamp: Date.now(),
1837
- };
1838
- if (result.is_error) {
1839
- finalMessage.errorMessage = getResultErrorMessage(result);
1840
- stream.push({ type: "error", reason: "error", error: finalMessage });
1841
- }
1842
- else {
1843
- stream.push({ type: "done", reason: "stop", message: finalMessage });
1844
- }
1845
- return;
2067
+ finally {
2068
+ options?.signal?.removeEventListener("abort", forwardAbort);
1846
2069
  }
1847
- default:
1848
- break;
2070
+ // The SDK stream ended without a terminal `result` message and
2071
+ // without a readiness retry (the only restart path, via
2072
+ // `continue sdkAttemptLoop`). Break out so the post-loop
2073
+ // exhaustion handler emits a transient stream-exhausted error,
2074
+ // instead of silently starting another SDK session and looping
2075
+ // forever.
2076
+ break sdkAttemptLoop;
1849
2077
  }
1850
2078
  }
2079
+ finally {
2080
+ if (trackWorkflowMcpSdk)
2081
+ endWorkflowMcpSdkSession();
2082
+ }
1851
2083
  // Generator exhaustion without a terminal result is a stream interruption,
1852
2084
  // not a successful completion. Emitting an error lets GSD classify it as a
1853
2085
  // transient provider failure instead of advancing auto-mode state.