@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.6ccd27b3

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 (837) 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-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli.js +2 -19
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +14 -34
  8. package/dist/loader.js +6 -4
  9. package/dist/mcp-server.js +2 -1
  10. package/dist/models-resolver.d.ts +3 -13
  11. package/dist/models-resolver.js +3 -22
  12. package/dist/register-agent-bundles.d.ts +11 -2
  13. package/dist/register-agent-bundles.js +18 -4
  14. package/dist/resource-loader.d.ts +10 -5
  15. package/dist/resource-loader.js +123 -20
  16. package/dist/resources/.managed-resources-content-hash +1 -1
  17. package/dist/resources/GSD-WORKFLOW.md +5 -4
  18. package/dist/resources/extensions/ask-user-questions.js +3 -2
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  20. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  21. package/dist/resources/extensions/async-jobs/index.js +65 -0
  22. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  23. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  24. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  25. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  26. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  27. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  28. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  29. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  30. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  31. package/dist/resources/extensions/browser-tools/index.js +69 -12
  32. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  33. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +464 -200
  34. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  35. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  36. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  37. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  38. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  39. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  40. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  41. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  42. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  43. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  44. package/dist/resources/extensions/gsd/auto/orchestrator.js +207 -73
  45. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  46. package/dist/resources/extensions/gsd/auto/phases.js +17 -2324
  47. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  48. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  49. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  50. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  51. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  52. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  53. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  54. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  55. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  56. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  57. package/dist/resources/extensions/gsd/auto-start.js +47 -29
  58. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  59. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  60. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  61. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  62. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  63. package/dist/resources/extensions/gsd/auto-worktree.js +50 -354
  64. package/dist/resources/extensions/gsd/auto.js +49 -22
  65. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  66. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  67. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +69 -19
  68. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  69. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  70. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  71. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  72. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  73. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  74. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  75. package/dist/resources/extensions/gsd/captures.js +5 -15
  76. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  77. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  78. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  79. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  80. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  81. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  82. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  83. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  84. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  85. package/dist/resources/extensions/gsd/constants.js +0 -2
  86. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  87. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  88. package/dist/resources/extensions/gsd/db/queries.js +428 -0
  89. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  90. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  91. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  92. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  93. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  94. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  95. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  96. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  97. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  98. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  99. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  100. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  101. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  102. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  103. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  104. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  105. package/dist/resources/extensions/gsd/files.js +33 -19
  106. package/dist/resources/extensions/gsd/git-service.js +1 -0
  107. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  108. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  109. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  110. package/dist/resources/extensions/gsd/guidance.js +158 -0
  111. package/dist/resources/extensions/gsd/guided-flow.js +144 -9
  112. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  113. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  114. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  115. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  116. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  117. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  118. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  119. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  120. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  121. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  122. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  123. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  124. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  125. package/dist/resources/extensions/gsd/model-router.js +3 -0
  126. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  127. package/dist/resources/extensions/gsd/notifications.js +12 -7
  128. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  129. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  130. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  131. package/dist/resources/extensions/gsd/paths.js +37 -24
  132. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  133. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  134. package/dist/resources/extensions/gsd/preferences.js +14 -0
  135. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  136. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  137. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  138. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  139. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  140. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  141. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  142. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  143. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  144. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  145. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  146. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  147. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  148. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  149. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  150. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  151. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  152. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  153. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  154. package/dist/resources/extensions/gsd/publication.js +87 -0
  155. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  156. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  157. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  158. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  159. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  160. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  161. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  162. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  163. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  164. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  165. package/dist/resources/extensions/gsd/state.js +12 -22
  166. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  167. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  168. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  169. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  170. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  171. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  172. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  173. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  174. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  175. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  176. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  177. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  178. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  179. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  180. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  181. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  182. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  183. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  184. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  185. package/dist/resources/extensions/gsd/undo.js +8 -7
  186. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  187. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  188. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  189. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  190. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  191. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  192. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  193. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  194. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  195. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  196. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  197. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  198. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  199. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  200. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  201. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  202. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  203. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  204. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  205. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  206. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  207. package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
  208. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  209. package/dist/resources/extensions/gsd/worktree.js +8 -1
  210. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  211. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  212. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  213. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  214. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  215. package/dist/resources/shared/package-manager-detection.js +1 -1
  216. package/dist/resources/shared/package.json +3 -0
  217. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  218. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  219. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  220. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  221. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  222. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  223. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  224. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  225. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  226. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  227. package/dist/runtime-checks.d.ts +10 -0
  228. package/dist/runtime-checks.js +27 -0
  229. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  230. package/dist/update-check.d.ts +2 -0
  231. package/dist/update-check.js +24 -1
  232. package/dist/update-cmd.js +20 -3
  233. package/dist/web/standalone/.next/BUILD_ID +1 -1
  234. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  235. package/dist/web/standalone/.next/build-manifest.json +3 -3
  236. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  237. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  238. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  239. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  241. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  242. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  243. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  244. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  245. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  246. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  247. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  248. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  250. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  252. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  253. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  258. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  261. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  262. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  263. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  266. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  267. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  268. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  269. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  271. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  272. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  273. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  274. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  275. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  276. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  277. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  278. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  279. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  280. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  281. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  282. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  283. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  284. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  285. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  286. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  287. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  289. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  290. package/dist/web/standalone/.next/server/app/index.html +1 -1
  291. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  292. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  293. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  294. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  295. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  296. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  297. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  298. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  299. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  300. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  301. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  302. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  303. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  304. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  305. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  306. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  307. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  308. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  309. package/dist/web/standalone/package.json +1 -1
  310. package/dist/worktree-cli.js +3 -6
  311. package/dist/worktree-status-banner.js +7 -11
  312. package/package.json +3 -3
  313. package/packages/cloud-mcp-gateway/package.json +2 -2
  314. package/packages/contracts/dist/rpc.d.ts +1 -0
  315. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  316. package/packages/contracts/dist/rpc.js.map +1 -1
  317. package/packages/contracts/dist/workflow.d.ts +4 -0
  318. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  319. package/packages/contracts/dist/workflow.js.map +1 -1
  320. package/packages/contracts/package.json +1 -1
  321. package/packages/daemon/package.json +4 -4
  322. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  323. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  324. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  325. package/packages/gsd-agent-core/package.json +5 -5
  326. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  327. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  328. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  329. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  330. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  331. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  332. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  333. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  334. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  335. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  336. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  337. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  338. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  339. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  340. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  341. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  342. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  343. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  344. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  345. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  346. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  347. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  348. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  349. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  350. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  351. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  352. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  353. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  354. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  355. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  356. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  357. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  358. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  359. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  360. package/packages/gsd-agent-modes/package.json +7 -7
  361. package/packages/mcp-server/README.md +12 -3
  362. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  363. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  364. package/packages/mcp-server/dist/cli-runner.js +137 -0
  365. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  366. package/packages/mcp-server/dist/cli.js +2 -50
  367. package/packages/mcp-server/dist/cli.js.map +1 -1
  368. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  369. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  370. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  371. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  372. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  373. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  374. package/packages/mcp-server/dist/pid-registry.js +452 -0
  375. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  376. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  377. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  378. package/packages/mcp-server/dist/probe-mode.js +10 -0
  379. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  380. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  381. package/packages/mcp-server/dist/server.js +4 -0
  382. package/packages/mcp-server/dist/server.js.map +1 -1
  383. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  384. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  385. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  386. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  387. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  388. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  389. package/packages/mcp-server/dist/workflow-tools.js +207 -102
  390. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  391. package/packages/mcp-server/package.json +5 -4
  392. package/packages/native/package.json +1 -1
  393. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  394. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  395. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  396. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  397. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  398. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  399. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  400. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  401. package/packages/pi-agent-core/dist/index.js +3 -0
  402. package/packages/pi-agent-core/dist/index.js.map +1 -1
  403. package/packages/pi-agent-core/package.json +1 -1
  404. package/packages/pi-ai/README.md +1 -0
  405. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  406. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  407. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  408. package/packages/pi-ai/dist/index.d.ts +2 -0
  409. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  410. package/packages/pi-ai/dist/index.js +2 -0
  411. package/packages/pi-ai/dist/index.js.map +1 -1
  412. package/packages/pi-ai/dist/models.generated.d.ts +158 -17
  413. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  414. package/packages/pi-ai/dist/models.generated.js +132 -17
  415. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  416. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  417. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  418. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  419. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  420. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  421. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  422. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  423. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  424. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  425. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  426. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  427. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  428. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  429. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  430. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  431. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  432. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  433. package/packages/pi-ai/package.json +3 -2
  434. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  435. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  437. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  440. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  442. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  443. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  444. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  445. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  447. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  449. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  450. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  451. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  452. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  453. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  454. package/packages/pi-coding-agent/dist/index.js +1 -1
  455. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  456. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  457. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  458. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  460. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  461. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  462. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  463. package/packages/pi-coding-agent/package.json +7 -7
  464. package/packages/pi-tui/dist/index.d.ts +1 -1
  465. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  466. package/packages/pi-tui/dist/index.js +1 -1
  467. package/packages/pi-tui/dist/index.js.map +1 -1
  468. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  469. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  470. package/packages/pi-tui/dist/terminal-image.js +54 -2
  471. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  472. package/packages/pi-tui/dist/tui.d.ts +8 -0
  473. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  474. package/packages/pi-tui/dist/tui.js +72 -18
  475. package/packages/pi-tui/dist/tui.js.map +1 -1
  476. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  477. package/packages/pi-tui/dist/utils.js +110 -36
  478. package/packages/pi-tui/dist/utils.js.map +1 -1
  479. package/packages/pi-tui/package.json +2 -2
  480. package/packages/rpc-client/package.json +2 -2
  481. package/pkg/dist/theme/theme.d.ts.map +1 -1
  482. package/pkg/dist/theme/theme.js +45 -17
  483. package/pkg/dist/theme/theme.js.map +1 -1
  484. package/pkg/package.json +1 -1
  485. package/src/resources/GSD-WORKFLOW.md +5 -4
  486. package/src/resources/extensions/ask-user-questions.ts +7 -2
  487. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  488. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  489. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  490. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  491. package/src/resources/extensions/async-jobs/index.ts +79 -0
  492. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  493. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  494. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  495. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  496. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  497. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  498. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  499. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  500. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  501. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  502. package/src/resources/extensions/browser-tools/index.ts +71 -13
  503. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  504. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  505. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  506. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  507. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +543 -202
  508. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +700 -7
  509. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  510. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  511. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  512. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  513. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  514. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  515. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  516. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  517. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  518. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  519. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  520. package/src/resources/extensions/gsd/auto/orchestrator.ts +232 -76
  521. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  522. package/src/resources/extensions/gsd/auto/phases.ts +58 -3013
  523. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  524. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  525. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  526. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  527. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  528. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  529. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  530. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  531. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  532. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  533. package/src/resources/extensions/gsd/auto-start.ts +48 -33
  534. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  535. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  536. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  537. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  538. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  539. package/src/resources/extensions/gsd/auto-worktree.ts +56 -366
  540. package/src/resources/extensions/gsd/auto.ts +69 -26
  541. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  542. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  543. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +89 -18
  544. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  545. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  546. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  547. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  548. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  549. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  550. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  551. package/src/resources/extensions/gsd/captures.ts +5 -16
  552. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  553. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  554. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  555. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  556. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  557. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  558. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  559. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  560. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  561. package/src/resources/extensions/gsd/constants.ts +0 -3
  562. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  563. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  564. package/src/resources/extensions/gsd/db/queries.ts +519 -0
  565. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  566. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  567. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  568. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  569. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  570. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  571. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  572. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  573. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  574. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  575. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  576. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  577. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  578. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  579. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  580. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  581. package/src/resources/extensions/gsd/files.ts +33 -12
  582. package/src/resources/extensions/gsd/git-service.ts +1 -0
  583. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  584. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  585. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  586. package/src/resources/extensions/gsd/guidance.ts +217 -0
  587. package/src/resources/extensions/gsd/guided-flow.ts +195 -29
  588. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  589. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  590. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  591. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  592. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  593. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  594. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  595. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  596. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  597. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  598. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  599. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  600. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  601. package/src/resources/extensions/gsd/model-router.ts +3 -0
  602. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  603. package/src/resources/extensions/gsd/notifications.ts +13 -6
  604. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  605. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  606. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  607. package/src/resources/extensions/gsd/paths.ts +42 -22
  608. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  609. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  610. package/src/resources/extensions/gsd/preferences.ts +18 -0
  611. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  612. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  613. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  614. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  615. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  616. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  617. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  618. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  619. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  620. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  621. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  622. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  623. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  624. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  625. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  626. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  627. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  628. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  629. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  630. package/src/resources/extensions/gsd/publication.ts +122 -0
  631. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  632. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  633. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  634. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  635. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  636. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  637. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  638. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  639. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  640. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  641. package/src/resources/extensions/gsd/state.ts +16 -22
  642. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  643. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  644. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  645. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  646. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +329 -22
  647. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  648. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  649. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  650. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +54 -1
  651. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  652. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  653. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  654. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  655. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  656. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  657. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  658. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  659. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  660. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  661. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  662. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  663. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  664. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  665. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  666. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  667. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  668. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  669. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  670. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  671. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  672. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  673. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  674. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  675. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  676. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  677. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  678. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  679. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  680. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  681. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  682. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  683. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  684. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  685. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  686. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  687. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  688. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  689. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  690. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  691. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  692. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  693. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  694. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  695. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  696. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  697. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  698. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  699. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  700. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  701. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  702. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  703. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  704. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  705. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  706. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  707. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  708. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  709. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  710. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  711. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  712. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  713. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  714. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  715. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  716. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  717. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  718. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  719. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  720. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  721. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  722. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  723. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  724. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  725. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  726. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  727. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  728. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
  729. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  730. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  731. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  732. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  733. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  734. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  735. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  736. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  737. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  738. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  739. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  740. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  741. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  742. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  743. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  744. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  745. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  746. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  747. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  748. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  749. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  750. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  751. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  752. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  753. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  754. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
  755. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  756. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  757. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  758. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  759. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  760. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  761. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  762. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  763. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  764. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  765. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  766. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
  767. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  768. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  769. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  770. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  771. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  772. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  773. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  774. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  775. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  776. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  777. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  778. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  779. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  780. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  781. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  782. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  783. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  784. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  785. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  786. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  787. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  788. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  789. package/src/resources/extensions/gsd/undo.ts +9 -8
  790. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  791. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  792. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  793. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  794. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  795. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  796. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  797. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  798. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  799. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  800. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  801. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  802. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  803. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  804. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  805. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  806. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  807. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  808. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  809. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  810. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  811. package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
  812. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  813. package/src/resources/extensions/gsd/worktree.ts +7 -1
  814. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  815. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  816. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  817. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  818. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  819. package/src/resources/shared/package-manager-detection.ts +1 -1
  820. package/src/resources/shared/package.json +3 -0
  821. package/src/resources/skills/create-skill/SKILL.md +3 -0
  822. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  823. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  824. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  825. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  826. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  827. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  828. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  829. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  830. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  831. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  832. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  833. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  834. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  835. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  836. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
  837. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_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,8 +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 { 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";
31
+ import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
27
32
  import { showInterviewRound } from "../shared/tui.js";
28
- export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, } from "./turn-assembler.js";
33
+ export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
29
34
  export function serverToolUseToToolCallLike(block) {
30
35
  const argumentsValue = block.input && typeof block.input === "object" && !Array.isArray(block.input)
31
36
  ? block.input
@@ -177,13 +182,18 @@ const GSD_PHASE_PATTERNS = [
177
182
  ["reassess-roadmap", /\b(?:UNIT:\s*Reassess Roadmap|reassess-roadmap)\b/i],
178
183
  ["complete-slice", /\b(?:UNIT:\s*Complete Slice|complete-slice)\b/i],
179
184
  ["replan-slice", /\b(?:UNIT:\s*Replan Slice|replan-slice)\b/i],
185
+ ["refine-slice", /\b(?:UNIT:\s*Refine Slice|refine-slice)\b/i],
180
186
  ["plan-slice", /\b(?:UNIT:\s*Plan Slice|plan-slice|gsd_plan_slice)\b/i],
181
187
  ["plan-milestone", /\b(?:UNIT:\s*Plan Milestone|plan-milestone|gsd_plan_milestone)\b/i],
182
188
  ["execute-task", /\b(?:UNIT:\s*Execute Task|execute-task|execute-task-simple|reactive-execute)\b/i],
183
189
  ["gate-evaluate", /\b(?:UNIT:\s*Gate Evaluate|gate-evaluate|gsd_save_gate_result)\b/i],
184
190
  ["research-milestone", /\b(?:UNIT:\s*Research Milestone|research-milestone)\b/i],
185
191
  ["research-slice", /\b(?:UNIT:\s*Research Slice|research-slice)\b/i],
192
+ ["research-decision", /\b(?:research decision|research-decision)\b/i],
186
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],
187
197
  ];
188
198
  export function inferGsdPhaseFromContext(context) {
189
199
  const text = [
@@ -196,6 +206,24 @@ export function inferGsdPhaseFromContext(context) {
196
206
  }
197
207
  return undefined;
198
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
+ }
199
227
  /**
200
228
  * Build a full conversational prompt from GSD's context messages.
201
229
  *
@@ -221,10 +249,15 @@ export function buildPromptFromContext(context, toolContext = {}) {
221
249
  const workflowToolLine = toolContext.workflowMcpServerName
222
250
  ? "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
223
251
  `are MCP tools — call them as mcp__${toolContext.workflowMcpServerName}__<tool_name> ` +
224
- `(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"
225
255
  : "- GSD workflow MCP tools are unavailable in this Claude Code run.\n";
226
256
  const toolSearchLine = toolContext.workflowMcpServerName
227
- ? "- 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"
228
261
  : "- ToolSearch is NOT available — never use it to discover tools\n";
229
262
  const browserToolLine = toolContext.browserMcpServerName
230
263
  ? "- Browser verification uses gsd-browser MCP by default — call browser tools as " +
@@ -318,9 +351,11 @@ export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext
318
351
  message: { role: "user", content },
319
352
  parent_tool_use_id: null,
320
353
  };
321
- return (async function* () {
322
- yield sdkMessage;
323
- })();
354
+ return {
355
+ async *[Symbol.asyncIterator]() {
356
+ yield sdkMessage;
357
+ },
358
+ };
324
359
  }
325
360
  // ---------------------------------------------------------------------------
326
361
  // Error helper
@@ -339,6 +374,40 @@ function makeErrorMessage(model, errorMsg) {
339
374
  timestamp: Date.now(),
340
375
  };
341
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
+ }
342
411
  export function isClaudeCodeAbortErrorMessage(message) {
343
412
  if (!message)
344
413
  return false;
@@ -1242,6 +1311,8 @@ function modelSupportsAdaptiveThinking(modelId) {
1242
1311
  || modelId.includes("opus-4.7")
1243
1312
  || modelId.includes("opus-4-8")
1244
1313
  || modelId.includes("opus-4.8")
1314
+ || modelId.includes("fable-5")
1315
+ || modelId.includes("fable.5")
1245
1316
  || modelId.includes("sonnet-4-6")
1246
1317
  || modelId.includes("sonnet-4.6")
1247
1318
  || modelId.includes("sonnet-4-7")
@@ -1263,7 +1334,9 @@ function mapThinkingLevelToAnthropicEffort(level, modelId) {
1263
1334
  if (modelId.includes("opus-4-7")
1264
1335
  || modelId.includes("opus-4.7")
1265
1336
  || modelId.includes("opus-4-8")
1266
- || modelId.includes("opus-4.8"))
1337
+ || modelId.includes("opus-4.8")
1338
+ || modelId.includes("fable-5")
1339
+ || modelId.includes("fable.5"))
1267
1340
  return "xhigh";
1268
1341
  if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6"))
1269
1342
  return "max";
@@ -1285,7 +1358,7 @@ function browserMcpServerNameFromAllowedTools(allowedTools) {
1285
1358
  const parsed = parseAllowedMcpToolName(toolName);
1286
1359
  if (!parsed)
1287
1360
  continue;
1288
- if (parsed.server === "gsd-browser" || parsed.tool.startsWith("browser_")) {
1361
+ if (parsed.server === "gsd-browser" || hasBrowserContractPrefix(parsed.tool)) {
1289
1362
  return parsed.server;
1290
1363
  }
1291
1364
  }
@@ -1299,7 +1372,7 @@ function workflowMcpServerNameFromAllowedTools(allowedTools) {
1299
1372
  if (typeof toolName !== "string")
1300
1373
  continue;
1301
1374
  const parsed = parseAllowedMcpToolName(toolName);
1302
- if (!parsed || parsed.server === browserServerName || parsed.tool.startsWith("browser_"))
1375
+ if (!parsed || parsed.server === browserServerName || hasBrowserContractPrefix(parsed.tool))
1303
1376
  continue;
1304
1377
  return parsed.server;
1305
1378
  }
@@ -1348,11 +1421,13 @@ function resolveProjectMcpServerConfigs(projectRoot, serverNames, fallbackServer
1348
1421
  function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, workflowExplicitlyBlocked) {
1349
1422
  if (!gsdPhase || !workflowServerName || workflowExplicitlyBlocked)
1350
1423
  return [];
1351
- const requiredTools = gsdPhase === "run-uat"
1424
+ const requestedTools = gsdPhase === "run-uat"
1352
1425
  ? [...RUN_UAT_WORKFLOW_TOOL_NAMES]
1353
- : getRequiredWorkflowToolsForAutoUnit(gsdPhase);
1354
- const supportTools = gsdPhase === "run-uat" ? [] : ["gsd_milestone_status"];
1355
- 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"))];
1356
1431
  if (requestedToolNames.length === 0)
1357
1432
  return [];
1358
1433
  return resolveToolPresentationPlan({
@@ -1362,6 +1437,25 @@ function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, work
1362
1437
  requestedToolNames,
1363
1438
  }).presentedToolNames;
1364
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
+ }
1365
1459
  export function autoInitClaudeCodeWorkflowMcp(cwd) {
1366
1460
  const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
1367
1461
  try {
@@ -1373,6 +1467,51 @@ export function autoInitClaudeCodeWorkflowMcp(cwd) {
1373
1467
  }
1374
1468
  }
1375
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
+ }
1376
1515
  /**
1377
1516
  * Build the options object passed to the Claude Agent SDK's `query()` call.
1378
1517
  *
@@ -1504,34 +1643,27 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1504
1643
  `mcp__${workflowServerName}__gsd_save_gate_result`,
1505
1644
  ]
1506
1645
  : [];
1646
+ const allowToolSearchForWorkflowMcp = workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0;
1507
1647
  const disallowedTools = [...new Set([
1508
- "ToolSearch",
1648
+ ...(allowToolSearchForWorkflowMcp ? [] : ["ToolSearch"]),
1649
+ ...(gsdPhase ? ["Skill"] : []),
1509
1650
  ...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
1510
1651
  ...questionToolSurface.disallowedTools,
1511
1652
  ...runUatDisallowedTools,
1512
1653
  ...extraDisallowedTools,
1513
1654
  ])];
1514
- const standardClaudeTools = [
1515
- "Read",
1516
- "Write",
1517
- "Edit",
1518
- "Glob",
1519
- "Grep",
1520
- "Bash",
1521
- "Agent",
1522
- "WebFetch",
1523
- "WebSearch",
1524
- ];
1655
+ const nativeTools = resolveClaudeNativeToolsForPhase(gsdPhase);
1525
1656
  const allowedTools = gsdPhase === "run-uat"
1526
1657
  ? [
1527
- ...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES,
1658
+ ...nativeTools,
1528
1659
  ...(exactWorkflowMcpTools.length > 0 ? exactWorkflowMcpTools : []),
1529
1660
  ...allowedBrowserMcpTools,
1530
1661
  ]
1531
1662
  : [
1532
- ...standardClaudeTools,
1663
+ ...nativeTools,
1533
1664
  ...exactWorkflowMcpTools,
1534
- ...(workflowMcpTools.length > 0 ? workflowMcpTools : ["AskUserQuestion"]),
1665
+ ...(!gsdPhase && workflowMcpTools.length > 0 ? workflowMcpTools : []),
1666
+ ...(workflowMcpTools.length === 0 && exactWorkflowMcpTools.length === 0 ? ["AskUserQuestion"] : []),
1535
1667
  ...allowedBrowserMcpTools,
1536
1668
  ];
1537
1669
  const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
@@ -1564,7 +1696,9 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1564
1696
  || modelId.includes("opus-4-7")
1565
1697
  || modelId.includes("opus-4.7")
1566
1698
  || modelId.includes("opus-4-8")
1567
- || modelId.includes("opus-4.8")) ? ["context-1m-2025-08-07"] : [],
1699
+ || modelId.includes("opus-4.8")
1700
+ || modelId.includes("fable-5")
1701
+ || modelId.includes("fable.5")) ? ["context-1m-2025-08-07"] : [],
1568
1702
  ...(thinkingConfig ?? {}),
1569
1703
  ...(effort ? { effort } : {}),
1570
1704
  ...sdkExtraOptions,
@@ -1586,33 +1720,33 @@ export function streamViaClaudeCode(model, context, options) {
1586
1720
  void pumpSdkMessages(model, context, options, stream);
1587
1721
  return stream;
1588
1722
  }
1723
+ function createSdkAttemptMessageState() {
1724
+ return {
1725
+ builder: null,
1726
+ intermediateToolBlocks: [],
1727
+ toolResultsById: new Map(),
1728
+ };
1729
+ }
1589
1730
  /** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
1590
1731
  async function pumpSdkMessages(model, context, options, stream) {
1591
1732
  const modelId = model.id;
1592
- let builder = null;
1593
1733
  /** Track the last text content seen across all assistant turns for the final message. */
1594
1734
  let lastTextContent = "";
1595
1735
  let lastThinkingContent = "";
1596
- /** Collect tool blocks from intermediate SDK turns for tool execution rendering. */
1597
- const intermediateToolBlocks = [];
1598
- /** Preserve real external tool results from Claude Code's synthetic user messages. */
1599
- const toolResultsById = new Map();
1600
1736
  try {
1601
- // Dynamic import — the SDK is an optional dependency.
1602
- const sdkModule = "@anthropic-ai/claude-agent-sdk";
1603
- const sdk = (await import(/* webpackIgnore: true */ sdkModule));
1604
- // Bridge GSD's AbortSignal to SDK's AbortController
1605
- const controller = new AbortController();
1606
- if (options?.signal) {
1607
- options.signal.addEventListener("abort", () => controller.abort(), { once: true });
1608
- }
1609
1737
  const permissionMode = await resolveClaudePermissionMode();
1610
- const uiContext = options?.extensionUIContext;
1611
- const onExternalToolCall = options?.onExternalToolCall;
1612
- 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;
1613
1746
  const cwd = resolveClaudeCodeCwd(options);
1747
+ const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
1614
1748
  autoInitClaudeCodeWorkflowMcp(cwd);
1615
- const gsdPhase = inferGsdPhaseFromContext(context);
1749
+ const gsdPhase = resolveGsdPhaseForSdk(context, projectRoot);
1616
1750
  const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
1617
1751
  // When no UI is available (headless / auto-mode), auto-approve all
1618
1752
  // tool requests. This replaces the old bypassPermissions workaround.
@@ -1629,18 +1763,14 @@ async function pumpSdkMessages(model, context, options, stream) {
1629
1763
  }
1630
1764
  : {}),
1631
1765
  });
1766
+ const workflowMcpServerName = workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools);
1767
+ const allowPendingToolSearchHydration = Boolean(workflowMcpServerName && gsdPhase)
1768
+ && !sdkOpts.disallowedTools?.includes("ToolSearch");
1632
1769
  const prompt = buildPromptFromContext(context, {
1633
- workflowMcpServerName: workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
1770
+ workflowMcpServerName,
1634
1771
  browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
1635
1772
  });
1636
1773
  const queryPrompt = buildSdkQueryPrompt(context, prompt);
1637
- const queryResult = sdk.query({
1638
- prompt: queryPrompt,
1639
- options: {
1640
- ...sdkOpts,
1641
- abortController: controller,
1642
- },
1643
- });
1644
1774
  // Emit start with an empty partial
1645
1775
  const initialPartial = {
1646
1776
  role: "assistant",
@@ -1653,169 +1783,303 @@ async function pumpSdkMessages(model, context, options, stream) {
1653
1783
  timestamp: Date.now(),
1654
1784
  };
1655
1785
  stream.push({ type: "start", partial: initialPartial });
1656
- for await (const msg of queryResult) {
1657
- if (options?.signal?.aborted) {
1658
- // User-initiated cancel — emit an aborted error so the agent
1659
- // loop classifies this as a deliberate stop, not a transient
1660
- // provider failure that should be retried.
1661
- stream.push({
1662
- type: "error",
1663
- reason: "aborted",
1664
- error: makeAbortedMessage(modelId, lastTextContent),
1665
- });
1666
- return;
1667
- }
1668
- switch (msg.type) {
1669
- // -- Init --
1670
- case "system": {
1671
- // Nothing to emit — the stream is already started.
1672
- break;
1673
- }
1674
- // -- Streaming partial messages --
1675
- case "stream_event": {
1676
- const partial = msg;
1677
- const event = partial.event;
1678
- const result = handleClaudeCodePartialStreamEvent(builder, event, modelId);
1679
- builder = result.builder;
1680
- const assistantEvent = result.assistantEvent;
1681
- if (assistantEvent) {
1682
- stream.push(assistantEvent);
1683
- if (assistantEvent.type === "toolcall_start") {
1684
- const toolBlock = assistantEvent.partial.content[assistantEvent.contentIndex];
1685
- if (toolBlock?.type === "toolCall") {
1686
- try {
1687
- await onExternalToolCall?.(toolBlock);
1688
- }
1689
- catch (error) {
1690
- console.warn("[claude-code] onExternalToolCall callback failed:", error);
1691
- }
1692
- }
1693
- }
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),
1818
+ });
1819
+ return;
1694
1820
  }
1695
- break;
1821
+ workflowMcpPreflightVerified = true;
1696
1822
  }
1697
- // -- Complete assistant message (non-streaming fallback) --
1698
- case "assistant": {
1699
- const sdkAssistant = msg;
1700
- // Capture text content from complete messages
1701
- for (const block of sdkAssistant.message.content) {
1702
- if (block.type === "text") {
1703
- lastTextContent = block.text;
1704
- }
1705
- else if (block.type === "thinking") {
1706
- lastThinkingContent = block.thinking;
1707
- }
1708
- }
1709
- break;
1823
+ finally {
1824
+ uiContext?.setStatus?.("gsd-step", "");
1710
1825
  }
1711
- // -- User message (synthetic tool result — signals turn boundary) --
1712
- case "user": {
1713
- // Capture content from the completed turn before resetting
1714
- if (builder) {
1715
- for (const block of builder.message.content) {
1716
- if (block.type === "text" && block.text) {
1717
- lastTextContent = block.text;
1718
- }
1719
- else if (block.type === "thinking" && block.thinking) {
1720
- lastThinkingContent = block.thinking;
1721
- }
1722
- else if (block.type === "toolCall" || block.type === "serverToolUse") {
1723
- // Collect tool blocks for externalToolExecution rendering
1724
- intermediateToolBlocks.push(block);
1725
- }
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.
1850
+ stream.push({
1851
+ type: "error",
1852
+ reason: "aborted",
1853
+ error: makeAbortedMessage(modelId, lastTextContent),
1854
+ });
1855
+ return;
1726
1856
  }
1727
- }
1728
- // Extract tool results from the SDK's synthetic user message
1729
- // and attach to corresponding tool call blocks immediately.
1730
- for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg)) {
1731
- toolResultsById.set(toolUseId, result);
1732
- }
1733
- attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
1734
- // Push a synthetic toolcall_end for each tool call from this turn
1735
- // so the TUI can render tool results in real-time during the SDK
1736
- // session instead of waiting until the entire session completes.
1737
- if (builder) {
1738
- for (const block of builder.message.content) {
1739
- const extResult = block.externalResult;
1740
- if (!extResult)
1741
- continue;
1742
- const contentIndex = builder.message.content.indexOf(block);
1743
- if (contentIndex < 0)
1744
- continue;
1745
- // Push synthetic completion events with result attached so the
1746
- // chat-controller can update pending ToolExecutionComponents.
1747
- if (block.type === "toolCall") {
1748
- try {
1749
- await onExternalToolResult?.({
1750
- toolCall: block,
1751
- result: extResult,
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,
1752
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
+ }
1753
1906
  }
1754
- catch (error) {
1755
- console.warn("[claude-code] onExternalToolResult callback failed:", error);
1907
+ break;
1908
+ }
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
+ }
1756
1929
  }
1757
- stream.push({
1758
- type: "toolcall_end",
1759
- contentIndex,
1760
- toolCall: block,
1761
- partial: builder.message,
1762
- });
1930
+ break;
1763
1931
  }
1764
- else if (block.type === "serverToolUse") {
1765
- try {
1766
- await onExternalToolResult?.({
1767
- toolCall: serverToolUseToToolCallLike(block),
1768
- result: extResult,
1769
- });
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
+ }
1770
1943
  }
1771
- catch (error) {
1772
- console.warn("[claude-code] onExternalToolResult callback failed:", error);
1944
+ break;
1945
+ }
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
+ }
1962
+ }
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);
1967
+ }
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
+ }
1773
2028
  }
1774
- stream.push({
1775
- type: "server_tool_use",
1776
- contentIndex,
1777
- partial: builder.message,
2029
+ builder = null;
2030
+ break;
2031
+ }
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,
1778
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 });
2056
+ }
2057
+ else {
2058
+ stream.push({ type: "done", reason: "stop", message: finalMessage });
2059
+ }
2060
+ return;
1779
2061
  }
2062
+ default:
2063
+ break;
1780
2064
  }
1781
2065
  }
1782
- builder = null;
1783
- break;
1784
2066
  }
1785
- // -- Result (terminal) --
1786
- case "result": {
1787
- const result = msg;
1788
- const finalContent = buildFinalAssistantContent({
1789
- intermediateToolBlocks,
1790
- pendingContent: builder?.message.content,
1791
- toolResultsById,
1792
- lastThinkingContent,
1793
- lastTextContent,
1794
- fallbackResultText: result.subtype === "success" && result.result ? result.result : undefined,
1795
- });
1796
- const finalMessage = {
1797
- role: "assistant",
1798
- content: finalContent,
1799
- api: "anthropic-messages",
1800
- provider: "claude-code",
1801
- model: modelId,
1802
- usage: mapUsage(result.usage, result.total_cost_usd),
1803
- stopReason: result.is_error ? "error" : "stop",
1804
- timestamp: Date.now(),
1805
- };
1806
- if (result.is_error) {
1807
- finalMessage.errorMessage = getResultErrorMessage(result);
1808
- stream.push({ type: "error", reason: "error", error: finalMessage });
1809
- }
1810
- else {
1811
- stream.push({ type: "done", reason: "stop", message: finalMessage });
1812
- }
1813
- return;
2067
+ finally {
2068
+ options?.signal?.removeEventListener("abort", forwardAbort);
1814
2069
  }
1815
- default:
1816
- 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;
1817
2077
  }
1818
2078
  }
2079
+ finally {
2080
+ if (trackWorkflowMcpSdk)
2081
+ endWorkflowMcpSdkSession();
2082
+ }
1819
2083
  // Generator exhaustion without a terminal result is a stream interruption,
1820
2084
  // not a successful completion. Emitting an error lets GSD classify it as a
1821
2085
  // transient provider failure instead of advancing auto-mode state.