@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.8e6112e9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1016) 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-web-branch.d.ts +2 -0
  6. package/dist/cli-web-branch.js +9 -2
  7. package/dist/cli.js +2 -19
  8. package/dist/headless-events.d.ts +4 -2
  9. package/dist/headless-events.js +14 -34
  10. package/dist/help-text.js +5 -0
  11. package/dist/loader.js +6 -4
  12. package/dist/mcp-server.js +2 -1
  13. package/dist/models-resolver.d.ts +3 -13
  14. package/dist/models-resolver.js +3 -22
  15. package/dist/register-agent-bundles.d.ts +11 -2
  16. package/dist/register-agent-bundles.js +18 -4
  17. package/dist/resource-loader.d.ts +10 -5
  18. package/dist/resource-loader.js +123 -20
  19. package/dist/resources/.managed-resources-content-hash +1 -1
  20. package/dist/resources/GSD-WORKFLOW.md +5 -4
  21. package/dist/resources/extensions/ask-user-questions.js +81 -25
  22. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  23. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  24. package/dist/resources/extensions/async-jobs/index.js +65 -0
  25. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  26. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  27. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  28. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  29. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  30. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  31. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  32. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  33. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  34. package/dist/resources/extensions/browser-tools/index.js +69 -12
  35. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  36. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +546 -426
  37. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -0
  38. package/dist/resources/extensions/github-sync/templates.js +3 -3
  39. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  40. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  41. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  42. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  43. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  44. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  45. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  46. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  47. package/dist/resources/extensions/gsd/auto/loop.js +80 -56
  48. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  49. package/dist/resources/extensions/gsd/auto/orchestrator.js +310 -78
  50. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  51. package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
  52. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  53. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  54. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  55. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  56. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  57. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  58. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  59. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  60. package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
  61. package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
  62. package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
  63. package/dist/resources/extensions/gsd/auto-prompts.js +161 -26
  64. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  65. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  66. package/dist/resources/extensions/gsd/auto-start.js +59 -52
  67. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  68. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  69. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  70. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
  71. package/dist/resources/extensions/gsd/auto-verification.js +30 -37
  72. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  73. package/dist/resources/extensions/gsd/auto-worktree.js +68 -370
  74. package/dist/resources/extensions/gsd/auto.js +71 -29
  75. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  76. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  77. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  78. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +74 -50
  79. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  80. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  81. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  82. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +316 -161
  83. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
  84. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  85. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  86. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  87. package/dist/resources/extensions/gsd/captures.js +5 -15
  88. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  89. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  90. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  91. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  92. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  93. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  94. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  95. package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
  96. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  97. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  98. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  99. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  100. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  101. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  102. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  103. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  104. package/dist/resources/extensions/gsd/constants.js +0 -2
  105. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  106. package/dist/resources/extensions/gsd/db/engine.js +757 -0
  107. package/dist/resources/extensions/gsd/db/queries.js +428 -0
  108. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  109. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  110. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  111. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  112. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  113. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  114. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  115. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  116. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  117. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  118. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  119. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  120. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  121. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  122. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  123. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  124. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  125. package/dist/resources/extensions/gsd/doctor.js +16 -9
  126. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  127. package/dist/resources/extensions/gsd/error-classifier.js +10 -1
  128. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  129. package/dist/resources/extensions/gsd/files.js +33 -19
  130. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  131. package/dist/resources/extensions/gsd/git-service.js +1 -0
  132. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  133. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  134. package/dist/resources/extensions/gsd/gsd-db.js +186 -2048
  135. package/dist/resources/extensions/gsd/guidance.js +158 -0
  136. package/dist/resources/extensions/gsd/guided-flow.js +174 -473
  137. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  138. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  139. package/dist/resources/extensions/gsd/markdown-renderer.js +12 -1
  140. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  141. package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
  142. package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
  143. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  144. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  145. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  146. package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
  147. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  148. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  149. package/dist/resources/extensions/gsd/milestone-closeout.js +97 -28
  150. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  151. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  152. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  153. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  154. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  155. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  156. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  157. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  158. package/dist/resources/extensions/gsd/model-router.js +3 -0
  159. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  160. package/dist/resources/extensions/gsd/notifications.js +12 -7
  161. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  162. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  163. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  164. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  165. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  166. package/dist/resources/extensions/gsd/paths.js +37 -24
  167. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  168. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  169. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  170. package/dist/resources/extensions/gsd/preferences.js +161 -29
  171. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  172. package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -4
  173. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -2
  174. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  175. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  176. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  177. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  178. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  179. package/dist/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  180. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  181. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  182. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  183. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  184. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  185. package/dist/resources/extensions/gsd/prompts/system.md +6 -3
  186. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  187. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  188. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  189. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  190. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  191. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  192. package/dist/resources/extensions/gsd/publication.js +87 -0
  193. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  194. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  195. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  196. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  197. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  198. package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
  199. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  200. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  201. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  202. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  203. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  204. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  205. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  206. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  207. package/dist/resources/extensions/gsd/state.js +24 -26
  208. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  209. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  210. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  211. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  212. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  213. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  214. package/dist/resources/extensions/gsd/tool-contract.js +66 -11
  215. package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
  216. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  217. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  218. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  219. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  220. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  221. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  222. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  223. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  224. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  225. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +41 -2
  226. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  227. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  228. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  229. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  230. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  231. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  232. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  233. package/dist/resources/extensions/gsd/uat-policy.js +57 -25
  234. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  235. package/dist/resources/extensions/gsd/undo.js +8 -7
  236. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  237. package/dist/resources/extensions/gsd/unit-context-composer.js +114 -21
  238. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  239. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  240. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  241. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
  242. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  243. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  244. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  245. package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
  246. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  247. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  248. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  249. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  250. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  251. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  252. package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
  253. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  254. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  255. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  256. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  257. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  258. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  259. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  260. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  261. package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
  262. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  263. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  264. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  265. package/dist/resources/extensions/gsd/worktree.js +8 -1
  266. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  267. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  268. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  269. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  270. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  271. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  272. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  273. package/dist/resources/shared/package-manager-detection.js +1 -1
  274. package/dist/resources/shared/package.json +3 -0
  275. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  276. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  277. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  278. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  279. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  280. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  281. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  282. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  283. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  284. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  285. package/dist/runtime-checks.d.ts +10 -0
  286. package/dist/runtime-checks.js +27 -0
  287. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  288. package/dist/update-check.d.ts +2 -0
  289. package/dist/update-check.js +24 -1
  290. package/dist/update-cmd.js +40 -3
  291. package/dist/web/standalone/.next/BUILD_ID +1 -1
  292. package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
  293. package/dist/web/standalone/.next/build-manifest.json +3 -3
  294. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  295. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  296. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  297. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  298. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  299. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  300. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  301. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  302. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  303. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  304. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  305. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  306. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  307. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  308. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  309. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  310. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  311. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  312. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  313. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  314. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  315. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  316. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  317. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  318. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  319. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  320. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  321. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  322. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  323. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  324. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  325. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  326. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  327. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  328. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  329. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  330. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  331. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  332. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  333. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  334. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  335. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  336. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  337. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  338. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  339. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  340. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  341. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  342. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  343. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  344. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  345. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  346. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  347. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  348. package/dist/web/standalone/.next/server/app/index.html +1 -1
  349. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  350. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  351. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  352. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  353. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  354. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  355. package/dist/web/standalone/.next/server/app-paths-manifest.json +4 -4
  356. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  357. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  358. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  359. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  360. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  361. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  362. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  363. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  364. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  365. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  366. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  367. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  368. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  369. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +10 -0
  370. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  371. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  372. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  373. package/dist/web/standalone/package.json +1 -1
  374. package/dist/web-mode.d.ts +2 -0
  375. package/dist/web-mode.js +20 -8
  376. package/dist/worktree-cli.js +3 -6
  377. package/dist/worktree-status-banner.js +7 -11
  378. package/package.json +4 -3
  379. package/packages/cloud-mcp-gateway/package.json +2 -2
  380. package/packages/contracts/dist/rpc.d.ts +1 -0
  381. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  382. package/packages/contracts/dist/rpc.js.map +1 -1
  383. package/packages/contracts/dist/workflow.d.ts +4 -0
  384. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  385. package/packages/contracts/dist/workflow.js.map +1 -1
  386. package/packages/contracts/package.json +1 -1
  387. package/packages/daemon/package.json +4 -4
  388. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  389. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  390. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  391. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  392. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  393. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  394. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  395. package/packages/gsd-agent-core/package.json +5 -5
  396. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  397. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  398. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  399. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  400. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  401. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  402. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +58 -6
  403. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  404. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  405. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  406. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  407. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  408. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  409. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +113 -40
  410. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  411. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  412. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  413. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  414. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  415. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  416. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  417. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  418. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  419. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  420. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  421. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  422. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  423. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  424. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  425. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  426. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  427. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  428. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  429. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  430. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  431. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  432. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  433. package/packages/gsd-agent-modes/package.json +7 -7
  434. package/packages/mcp-server/README.md +12 -3
  435. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  436. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  437. package/packages/mcp-server/dist/cli-runner.js +137 -0
  438. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  439. package/packages/mcp-server/dist/cli.js +2 -50
  440. package/packages/mcp-server/dist/cli.js.map +1 -1
  441. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  442. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  443. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  444. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  445. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  446. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  447. package/packages/mcp-server/dist/pid-registry.js +452 -0
  448. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  449. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  450. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  451. package/packages/mcp-server/dist/probe-mode.js +10 -0
  452. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  453. package/packages/mcp-server/dist/server.d.ts +10 -0
  454. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  455. package/packages/mcp-server/dist/server.js +12 -0
  456. package/packages/mcp-server/dist/server.js.map +1 -1
  457. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  458. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  459. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  460. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  461. package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
  462. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  463. package/packages/mcp-server/dist/workflow-tools.js +209 -103
  464. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  465. package/packages/mcp-server/package.json +5 -4
  466. package/packages/native/package.json +1 -1
  467. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  468. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  469. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  470. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  471. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  472. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  473. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  474. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  475. package/packages/pi-agent-core/dist/index.js +3 -0
  476. package/packages/pi-agent-core/dist/index.js.map +1 -1
  477. package/packages/pi-agent-core/package.json +1 -1
  478. package/packages/pi-ai/README.md +1 -0
  479. package/packages/pi-ai/dist/index.d.ts +2 -0
  480. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  481. package/packages/pi-ai/dist/index.js +2 -0
  482. package/packages/pi-ai/dist/index.js.map +1 -1
  483. package/packages/pi-ai/dist/models.generated.d.ts +183 -76
  484. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  485. package/packages/pi-ai/dist/models.generated.js +193 -112
  486. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  487. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  488. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  489. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  490. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  491. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  492. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  493. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  494. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  495. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  496. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  497. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  498. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  499. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  500. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  501. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  502. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  503. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  504. package/packages/pi-ai/package.json +3 -2
  505. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  506. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  507. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  508. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  510. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  511. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  513. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  514. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  515. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  516. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  517. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  518. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  520. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  521. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  522. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  524. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  525. package/packages/pi-coding-agent/dist/index.js +1 -1
  526. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  528. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  529. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  530. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  531. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  532. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  533. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  534. package/packages/pi-coding-agent/package.json +7 -7
  535. package/packages/pi-tui/dist/components/input.js +1 -1
  536. package/packages/pi-tui/dist/components/input.js.map +1 -1
  537. package/packages/pi-tui/dist/index.d.ts +1 -1
  538. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  539. package/packages/pi-tui/dist/index.js +1 -1
  540. package/packages/pi-tui/dist/index.js.map +1 -1
  541. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  542. package/packages/pi-tui/dist/keys.js +39 -30
  543. package/packages/pi-tui/dist/keys.js.map +1 -1
  544. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  546. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  547. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  548. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  549. package/packages/pi-tui/dist/terminal-image.js +54 -2
  550. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  551. package/packages/pi-tui/dist/tui.d.ts +8 -0
  552. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  553. package/packages/pi-tui/dist/tui.js +72 -18
  554. package/packages/pi-tui/dist/tui.js.map +1 -1
  555. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  556. package/packages/pi-tui/dist/utils.js +110 -36
  557. package/packages/pi-tui/dist/utils.js.map +1 -1
  558. package/packages/pi-tui/package.json +2 -2
  559. package/packages/rpc-client/package.json +2 -2
  560. package/pkg/dist/theme/theme.d.ts.map +1 -1
  561. package/pkg/dist/theme/theme.js +45 -17
  562. package/pkg/dist/theme/theme.js.map +1 -1
  563. package/pkg/package.json +1 -1
  564. package/src/resources/GSD-WORKFLOW.md +5 -4
  565. package/src/resources/extensions/ask-user-questions.ts +94 -26
  566. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  567. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  568. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  569. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  570. package/src/resources/extensions/async-jobs/index.ts +79 -0
  571. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  572. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  573. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  574. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  575. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  576. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  577. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  578. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  579. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  580. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  581. package/src/resources/extensions/browser-tools/index.ts +71 -13
  582. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  583. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  584. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  585. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  586. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +651 -483
  587. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +940 -7
  588. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -0
  589. package/src/resources/extensions/github-sync/templates.ts +3 -3
  590. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  591. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  592. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  593. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  594. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  595. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  596. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  597. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  598. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  599. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  600. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  601. package/src/resources/extensions/gsd/auto/loop.ts +89 -61
  602. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  603. package/src/resources/extensions/gsd/auto/orchestrator.ts +350 -81
  604. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  605. package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
  606. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  607. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  608. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  609. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  610. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  611. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  612. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  613. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  614. package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
  615. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
  616. package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
  617. package/src/resources/extensions/gsd/auto-prompts.ts +225 -44
  618. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  619. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  620. package/src/resources/extensions/gsd/auto-start.ts +65 -53
  621. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  622. package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
  623. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  624. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
  625. package/src/resources/extensions/gsd/auto-verification.ts +33 -36
  626. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  627. package/src/resources/extensions/gsd/auto-worktree.ts +83 -386
  628. package/src/resources/extensions/gsd/auto.ts +99 -34
  629. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  630. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  631. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  632. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +93 -49
  633. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  634. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  635. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  636. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +375 -177
  637. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
  638. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  639. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  640. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  641. package/src/resources/extensions/gsd/captures.ts +5 -16
  642. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  643. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  644. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  645. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  646. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  647. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  648. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  649. package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
  650. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  651. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  652. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  653. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  654. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  655. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  656. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  657. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  658. package/src/resources/extensions/gsd/constants.ts +0 -3
  659. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  660. package/src/resources/extensions/gsd/db/engine.ts +811 -0
  661. package/src/resources/extensions/gsd/db/queries.ts +519 -0
  662. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  663. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  664. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  665. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  666. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  667. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  668. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  669. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  670. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  671. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  672. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  673. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  674. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  675. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  676. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  677. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  678. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  679. package/src/resources/extensions/gsd/doctor.ts +15 -5
  680. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  681. package/src/resources/extensions/gsd/error-classifier.ts +12 -1
  682. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  683. package/src/resources/extensions/gsd/files.ts +33 -12
  684. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  685. package/src/resources/extensions/gsd/git-service.ts +1 -0
  686. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  687. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  688. package/src/resources/extensions/gsd/gsd-db.ts +190 -2375
  689. package/src/resources/extensions/gsd/guidance.ts +217 -0
  690. package/src/resources/extensions/gsd/guided-flow.ts +240 -585
  691. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  692. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  693. package/src/resources/extensions/gsd/markdown-renderer.ts +13 -1
  694. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  695. package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
  696. package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
  697. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  698. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  699. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  700. package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
  701. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  702. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  703. package/src/resources/extensions/gsd/milestone-closeout.ts +121 -28
  704. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  705. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  706. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  707. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  708. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  709. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  710. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  711. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  712. package/src/resources/extensions/gsd/model-router.ts +3 -0
  713. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  714. package/src/resources/extensions/gsd/notifications.ts +13 -6
  715. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  716. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  717. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  718. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  719. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  720. package/src/resources/extensions/gsd/paths.ts +42 -22
  721. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  722. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  723. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  724. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  725. package/src/resources/extensions/gsd/preferences.ts +191 -28
  726. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  727. package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -4
  728. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -2
  729. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  730. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  731. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  732. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  733. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  734. package/src/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  735. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  736. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  737. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  738. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  739. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  740. package/src/resources/extensions/gsd/prompts/system.md +6 -3
  741. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  742. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  743. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  744. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  745. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  746. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  747. package/src/resources/extensions/gsd/publication.ts +122 -0
  748. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  749. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  750. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  751. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  752. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  753. package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
  754. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  755. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  756. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  757. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  758. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  759. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  760. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  761. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  762. package/src/resources/extensions/gsd/state.ts +31 -27
  763. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  764. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  765. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  766. package/src/resources/extensions/gsd/templates/project.md +1 -0
  767. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  768. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  769. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  770. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  771. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  772. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  773. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +649 -26
  774. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  775. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  776. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  777. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +395 -30
  778. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  779. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +80 -2
  780. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  781. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  782. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  783. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  784. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  785. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  786. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  787. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  788. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  789. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  790. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  791. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  792. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  793. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  794. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  795. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  796. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  797. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
  798. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  799. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  800. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  801. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  802. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  803. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  804. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  805. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  806. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  807. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  808. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  809. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
  810. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  811. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  812. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  813. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  814. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  815. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  816. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  817. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  818. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  819. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  820. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  821. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  822. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  823. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  824. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  825. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  826. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  827. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  828. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  829. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  830. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  831. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  832. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  833. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  834. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  835. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  836. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  837. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  838. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  839. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  840. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  841. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  842. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  843. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +120 -4
  844. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  845. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  846. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  847. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  848. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  849. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  850. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  851. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  852. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  853. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  854. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  855. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  856. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  857. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  858. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  859. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  860. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  861. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  862. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  863. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  864. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  865. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  866. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  867. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  868. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  869. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +56 -2
  870. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  871. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  872. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +11 -4
  873. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  874. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  875. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  876. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  877. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
  878. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  879. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  880. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  881. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +51 -2
  882. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  883. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  884. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  885. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +300 -41
  886. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  887. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  888. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
  889. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  890. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  891. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  892. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  893. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  894. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  895. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  896. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  897. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  898. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  899. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  900. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  901. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -6
  902. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  903. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -2
  904. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  905. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  906. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  907. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  908. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  909. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
  910. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  911. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  912. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +193 -13
  913. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  914. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  915. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  916. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  917. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  918. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  919. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  920. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  921. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  922. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  923. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  924. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  925. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  926. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
  927. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  928. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  929. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  930. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  931. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  932. package/src/resources/extensions/gsd/tests/write-gate.test.ts +188 -1
  933. package/src/resources/extensions/gsd/tool-contract.ts +124 -11
  934. package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
  935. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  936. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  937. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  938. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  939. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  940. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  941. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  942. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  943. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  944. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +45 -2
  945. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  946. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  947. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  948. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  949. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  950. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  951. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  952. package/src/resources/extensions/gsd/uat-policy.ts +80 -25
  953. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  954. package/src/resources/extensions/gsd/undo.ts +9 -8
  955. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  956. package/src/resources/extensions/gsd/unit-context-composer.ts +196 -21
  957. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  958. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  959. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  960. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
  961. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  962. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  963. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  964. package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
  965. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  966. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  967. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  968. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  969. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  970. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  971. package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
  972. package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
  973. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  974. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  975. package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
  976. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  977. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  978. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  979. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  980. package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
  981. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  982. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  983. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  984. package/src/resources/extensions/gsd/worktree.ts +7 -1
  985. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  986. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  987. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  988. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  989. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  990. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  991. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  992. package/src/resources/shared/package-manager-detection.ts +1 -1
  993. package/src/resources/shared/package.json +3 -0
  994. package/src/resources/skills/create-skill/SKILL.md +3 -0
  995. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  996. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  997. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  998. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  999. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  1000. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  1001. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  1002. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  1003. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  1004. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -195
  1005. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  1006. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  1007. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  1008. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  1009. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  1010. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  1011. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  1012. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
  1013. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
  1014. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  1015. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
  1016. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
@@ -14,13 +14,23 @@ import { existsSync, readFileSync } from "node:fs";
14
14
  import { homedir } from "node:os";
15
15
  import { createRequire } from "node:module";
16
16
  import { dirname, join } from "node:path";
17
- import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
17
+ import { ZERO_USAGE, mapUsage } from "./partial-builder.js";
18
+ import { attachExternalResultsToToolBlocks, buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
18
19
  import { buildWorkflowMcpServers, getRequiredWorkflowToolsForAutoUnit, resolveWorkflowMcpProjectRoot, } from "../gsd/workflow-mcp.js";
20
+ import { resolveWorkflowQuestionToolSurface } from "../gsd/question-transport.js";
19
21
  import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
20
22
  import { loadProjectGSDPreferences } from "../gsd/preferences.js";
23
+ import { markToolStart, markToolEnd } from "../gsd/auto.js";
24
+ import { markInteractiveElicitationStart, markInteractiveElicitationEnd, } from "../gsd/auto-tool-tracking.js";
21
25
  import { discoverBrowserMcpServerName, discoverMcpServers, discoverMcpServerNames, discoverUserMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools, } from "../gsd/mcp-filter.js";
22
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";
23
32
  import { showInterviewRound } from "../shared/tui.js";
33
+ export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, shouldSuppressDuplicateToolUnavailableBlock, } from "./turn-assembler.js";
24
34
  export function serverToolUseToToolCallLike(block) {
25
35
  const argumentsValue = block.input && typeof block.input === "object" && !Array.isArray(block.input)
26
36
  ? block.input
@@ -172,13 +182,18 @@ const GSD_PHASE_PATTERNS = [
172
182
  ["reassess-roadmap", /\b(?:UNIT:\s*Reassess Roadmap|reassess-roadmap)\b/i],
173
183
  ["complete-slice", /\b(?:UNIT:\s*Complete Slice|complete-slice)\b/i],
174
184
  ["replan-slice", /\b(?:UNIT:\s*Replan Slice|replan-slice)\b/i],
185
+ ["refine-slice", /\b(?:UNIT:\s*Refine Slice|refine-slice)\b/i],
175
186
  ["plan-slice", /\b(?:UNIT:\s*Plan Slice|plan-slice|gsd_plan_slice)\b/i],
176
187
  ["plan-milestone", /\b(?:UNIT:\s*Plan Milestone|plan-milestone|gsd_plan_milestone)\b/i],
177
188
  ["execute-task", /\b(?:UNIT:\s*Execute Task|execute-task|execute-task-simple|reactive-execute)\b/i],
178
189
  ["gate-evaluate", /\b(?:UNIT:\s*Gate Evaluate|gate-evaluate|gsd_save_gate_result)\b/i],
179
190
  ["research-milestone", /\b(?:UNIT:\s*Research Milestone|research-milestone)\b/i],
180
191
  ["research-slice", /\b(?:UNIT:\s*Research Slice|research-slice)\b/i],
192
+ ["research-decision", /\b(?:research decision|research-decision)\b/i],
181
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],
182
197
  ];
183
198
  export function inferGsdPhaseFromContext(context) {
184
199
  const text = [
@@ -191,6 +206,24 @@ export function inferGsdPhaseFromContext(context) {
191
206
  }
192
207
  return undefined;
193
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
+ }
194
227
  /**
195
228
  * Build a full conversational prompt from GSD's context messages.
196
229
  *
@@ -216,10 +249,15 @@ export function buildPromptFromContext(context, toolContext = {}) {
216
249
  const workflowToolLine = toolContext.workflowMcpServerName
217
250
  ? "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
218
251
  `are MCP tools — call them as mcp__${toolContext.workflowMcpServerName}__<tool_name> ` +
219
- `(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"
220
255
  : "- GSD workflow MCP tools are unavailable in this Claude Code run.\n";
221
256
  const toolSearchLine = toolContext.workflowMcpServerName
222
- ? "- 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"
223
261
  : "- ToolSearch is NOT available — never use it to discover tools\n";
224
262
  const browserToolLine = toolContext.browserMcpServerName
225
263
  ? "- Browser verification uses gsd-browser MCP by default — call browser tools as " +
@@ -313,9 +351,11 @@ export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext
313
351
  message: { role: "user", content },
314
352
  parent_tool_use_id: null,
315
353
  };
316
- return (async function* () {
317
- yield sdkMessage;
318
- })();
354
+ return {
355
+ async *[Symbol.asyncIterator]() {
356
+ yield sdkMessage;
357
+ },
358
+ };
319
359
  }
320
360
  // ---------------------------------------------------------------------------
321
361
  // Error helper
@@ -334,6 +374,40 @@ function makeErrorMessage(model, errorMsg) {
334
374
  timestamp: Date.now(),
335
375
  };
336
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
+ }
337
411
  export function isClaudeCodeAbortErrorMessage(message) {
338
412
  if (!message)
339
413
  return false;
@@ -1078,7 +1152,26 @@ export function createClaudeCodeCanUseToolHandler(ui) {
1078
1152
  // ---------------------------------------------------------------------------
1079
1153
  // Elicitation handler
1080
1154
  // ---------------------------------------------------------------------------
1081
- /** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
1155
+ /**
1156
+ * Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available.
1157
+ *
1158
+ * For structured (AskUserQuestion) elicitations, the interview round's result
1159
+ * disambiguates two cases that must not be conflated: an `undefined` result
1160
+ * means the custom UI is unavailable, so we fall back to the simpler `select`
1161
+ * dialogs; an empty-answers result means the user dismissed the question, which
1162
+ * is treated as a clean cancel. Falling back to dialogs on dismissal would
1163
+ * re-ask the same questions (the duplicate-question bug).
1164
+ */
1165
+ /**
1166
+ * Monotonic counter so concurrent/sequential elicitations resolved within the
1167
+ * same millisecond get distinct synthetic in-flight-tool ids (the `cc-elicit-*`
1168
+ * namespace never collides with real MCP toolCallIds).
1169
+ */
1170
+ let _elicitationSeq = 0;
1171
+ function nextElicitationSeq() {
1172
+ _elicitationSeq = (_elicitationSeq + 1) % Number.MAX_SAFE_INTEGER;
1173
+ return _elicitationSeq;
1174
+ }
1082
1175
  export function createClaudeCodeElicitationHandler(ui) {
1083
1176
  if (!ui)
1084
1177
  return undefined;
@@ -1091,18 +1184,64 @@ export function createClaudeCodeElicitationHandler(ui) {
1091
1184
  const headlessAnswer = answerElicitationFromHeadlessAnswers(questions, loadHeadlessAnswers());
1092
1185
  if (headlessAnswer)
1093
1186
  return headlessAnswer;
1094
- const interviewResult = await showInterviewRound(questions, { signal }, { ui }).catch(() => undefined);
1095
- if (interviewResult && Object.keys(interviewResult.answers).length > 0) {
1187
+ // The SDK elicitation blocks waiting for human input, but it is not an
1188
+ // MCP tool dispatch, so markToolStart/markToolEnd are never called for
1189
+ // it. Without this the soft/context/idle/hard watchdogs see zero
1190
+ // in-flight tools and re-dispatch (and ultimately abort) the agent
1191
+ // turn hosting this elicitation, tearing the question down (#2676 /
1192
+ // claude-code-cli self-cancel loop). Bracketing the human wait with
1193
+ // the s.active-gated interactive-tool guard makes it visible to
1194
+ // hasInteractiveToolInFlight()/getInFlightToolCount() so those
1195
+ // watchdogs exempt it. No-op outside auto-mode (wrapper self-gates).
1196
+ //
1197
+ // markInteractiveElicitationStart/End is a SEPARATE, ungated signal that
1198
+ // is observable in FOREGROUND (where the s.active-gated markToolStart is a
1199
+ // no-op). The foreground approval-gate pause path (register-hooks
1200
+ // message_update) consults isInteractiveElicitationInFlight() and bails so
1201
+ // it does not tear down the very elicitation that IS the human boundary
1202
+ // (#cc-elicitation-self-cancel). It clears in the finally on every exit.
1203
+ const elicId = "cc-elicit-" + (request.id ?? `${Date.now()}-${nextElicitationSeq()}`);
1204
+ markInteractiveElicitationStart();
1205
+ markToolStart(elicId, "ask_user_questions");
1206
+ try {
1207
+ const interviewResult = await showInterviewRound(questions, { signal, overlay: true }, { ui }).catch(() => undefined);
1208
+ if (interviewResult === undefined) {
1209
+ // `await` so the dialog human-wait stays inside try/finally and the
1210
+ // in-flight guard is held until the dialog resolves. Without it,
1211
+ // `finally` runs the moment the promise is created and the fallback
1212
+ // wait runs with zero in-flight tools — reintroducing the
1213
+ // self-cancel on this path (Bugbot #1c00624d).
1214
+ return await promptElicitationWithDialogs(request, questions, ui, signal);
1215
+ }
1216
+ if (Object.keys(interviewResult.answers).length === 0) {
1217
+ // A system/host teardown (compaction, session_switch, true
1218
+ // interrupt) that aborted the signal mid-wait sets `interrupted`.
1219
+ // Surface that as a non-affirmative `decline` so it is not
1220
+ // laundered into a clean user-declined `cancel` the model re-asks
1221
+ // against. A genuine user dismissal leaves `interrupted` falsy and
1222
+ // keeps the prior `cancel` semantics.
1223
+ return interviewResult.interrupted ? { action: "decline" } : { action: "cancel" };
1224
+ }
1096
1225
  return {
1097
1226
  action: "accept",
1098
1227
  content: roundResultToElicitationContent(questions, interviewResult),
1099
1228
  };
1100
1229
  }
1101
- return promptElicitationWithDialogs(request, questions, ui, signal);
1230
+ finally {
1231
+ markToolEnd(elicId);
1232
+ markInteractiveElicitationEnd();
1233
+ }
1102
1234
  }
1103
1235
  const textFields = parseTextInputElicitation(request);
1104
1236
  if (textFields) {
1105
- return promptTextInputElicitation(request, textFields, ui, signal);
1237
+ const elicId = "cc-elicit-" + (request.id ?? `${Date.now()}-${nextElicitationSeq()}`);
1238
+ markToolStart(elicId, "secure_env_collect");
1239
+ try {
1240
+ return await promptTextInputElicitation(request, textFields, ui, signal);
1241
+ }
1242
+ finally {
1243
+ markToolEnd(elicId);
1244
+ }
1106
1245
  }
1107
1246
  return { action: "decline" };
1108
1247
  };
@@ -1172,6 +1311,8 @@ function modelSupportsAdaptiveThinking(modelId) {
1172
1311
  || modelId.includes("opus-4.7")
1173
1312
  || modelId.includes("opus-4-8")
1174
1313
  || modelId.includes("opus-4.8")
1314
+ || modelId.includes("fable-5")
1315
+ || modelId.includes("fable.5")
1175
1316
  || modelId.includes("sonnet-4-6")
1176
1317
  || modelId.includes("sonnet-4.6")
1177
1318
  || modelId.includes("sonnet-4-7")
@@ -1193,7 +1334,9 @@ function mapThinkingLevelToAnthropicEffort(level, modelId) {
1193
1334
  if (modelId.includes("opus-4-7")
1194
1335
  || modelId.includes("opus-4.7")
1195
1336
  || modelId.includes("opus-4-8")
1196
- || modelId.includes("opus-4.8"))
1337
+ || modelId.includes("opus-4.8")
1338
+ || modelId.includes("fable-5")
1339
+ || modelId.includes("fable.5"))
1197
1340
  return "xhigh";
1198
1341
  if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6"))
1199
1342
  return "max";
@@ -1215,7 +1358,7 @@ function browserMcpServerNameFromAllowedTools(allowedTools) {
1215
1358
  const parsed = parseAllowedMcpToolName(toolName);
1216
1359
  if (!parsed)
1217
1360
  continue;
1218
- if (parsed.server === "gsd-browser" || parsed.tool.startsWith("browser_")) {
1361
+ if (parsed.server === "gsd-browser" || hasBrowserContractPrefix(parsed.tool)) {
1219
1362
  return parsed.server;
1220
1363
  }
1221
1364
  }
@@ -1229,7 +1372,7 @@ function workflowMcpServerNameFromAllowedTools(allowedTools) {
1229
1372
  if (typeof toolName !== "string")
1230
1373
  continue;
1231
1374
  const parsed = parseAllowedMcpToolName(toolName);
1232
- if (!parsed || parsed.server === browserServerName || parsed.tool.startsWith("browser_"))
1375
+ if (!parsed || parsed.server === browserServerName || hasBrowserContractPrefix(parsed.tool))
1233
1376
  continue;
1234
1377
  return parsed.server;
1235
1378
  }
@@ -1278,11 +1421,13 @@ function resolveProjectMcpServerConfigs(projectRoot, serverNames, fallbackServer
1278
1421
  function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, workflowExplicitlyBlocked) {
1279
1422
  if (!gsdPhase || !workflowServerName || workflowExplicitlyBlocked)
1280
1423
  return [];
1281
- const requiredTools = gsdPhase === "run-uat"
1424
+ const requestedTools = gsdPhase === "run-uat"
1282
1425
  ? [...RUN_UAT_WORKFLOW_TOOL_NAMES]
1283
- : getRequiredWorkflowToolsForAutoUnit(gsdPhase);
1284
- const supportTools = gsdPhase === "run-uat" ? [] : ["gsd_milestone_status"];
1285
- 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"))];
1286
1431
  if (requestedToolNames.length === 0)
1287
1432
  return [];
1288
1433
  return resolveToolPresentationPlan({
@@ -1292,6 +1437,25 @@ function resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, work
1292
1437
  requestedToolNames,
1293
1438
  }).presentedToolNames;
1294
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
+ }
1295
1459
  export function autoInitClaudeCodeWorkflowMcp(cwd) {
1296
1460
  const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
1297
1461
  try {
@@ -1303,6 +1467,51 @@ export function autoInitClaudeCodeWorkflowMcp(cwd) {
1303
1467
  }
1304
1468
  }
1305
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
+ }
1306
1515
  /**
1307
1516
  * Build the options object passed to the Claude Agent SDK's `query()` call.
1308
1517
  *
@@ -1417,6 +1626,13 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1417
1626
  // leave allowed mcp__... tools with no registered backing tool.
1418
1627
  const settingSources = strictMcpConfig ? [] : ["user", "project", "local"];
1419
1628
  const exactWorkflowMcpTools = resolveExactWorkflowMcpToolsForPhase(gsdPhase, workflowServerName, workflowExplicitlyBlocked);
1629
+ const questionToolSurface = resolveWorkflowQuestionToolSurface({
1630
+ workflowServerName,
1631
+ workflowExplicitlyBlocked,
1632
+ workflowMcpTools,
1633
+ exactWorkflowMcpTools,
1634
+ env: process.env,
1635
+ });
1420
1636
  const runUatDisallowedTools = gsdPhase === "run-uat" && workflowServerName
1421
1637
  ? [
1422
1638
  ...RUN_UAT_FORBIDDEN_TOOL_NAMES.filter((toolName) => !toolName.startsWith("mcp__")),
@@ -1427,33 +1643,27 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1427
1643
  `mcp__${workflowServerName}__gsd_save_gate_result`,
1428
1644
  ]
1429
1645
  : [];
1646
+ const allowToolSearchForWorkflowMcp = workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0;
1430
1647
  const disallowedTools = [...new Set([
1431
- "ToolSearch",
1648
+ ...(allowToolSearchForWorkflowMcp ? [] : ["ToolSearch"]),
1649
+ ...(gsdPhase ? ["Skill"] : []),
1432
1650
  ...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
1651
+ ...questionToolSurface.disallowedTools,
1433
1652
  ...runUatDisallowedTools,
1434
1653
  ...extraDisallowedTools,
1435
1654
  ])];
1436
- const standardClaudeTools = [
1437
- "Read",
1438
- "Write",
1439
- "Edit",
1440
- "Glob",
1441
- "Grep",
1442
- "Bash",
1443
- "Agent",
1444
- "WebFetch",
1445
- "WebSearch",
1446
- ];
1655
+ const nativeTools = resolveClaudeNativeToolsForPhase(gsdPhase);
1447
1656
  const allowedTools = gsdPhase === "run-uat"
1448
1657
  ? [
1449
- ...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES,
1658
+ ...nativeTools,
1450
1659
  ...(exactWorkflowMcpTools.length > 0 ? exactWorkflowMcpTools : []),
1451
1660
  ...allowedBrowserMcpTools,
1452
1661
  ]
1453
1662
  : [
1454
- ...standardClaudeTools,
1663
+ ...nativeTools,
1455
1664
  ...exactWorkflowMcpTools,
1456
- ...(workflowMcpTools.length > 0 ? workflowMcpTools : ["AskUserQuestion"]),
1665
+ ...(!gsdPhase && workflowMcpTools.length > 0 ? workflowMcpTools : []),
1666
+ ...(workflowMcpTools.length === 0 && exactWorkflowMcpTools.length === 0 ? ["AskUserQuestion"] : []),
1457
1667
  ...allowedBrowserMcpTools,
1458
1668
  ];
1459
1669
  const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
@@ -1486,234 +1696,14 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1486
1696
  || modelId.includes("opus-4-7")
1487
1697
  || modelId.includes("opus-4.7")
1488
1698
  || modelId.includes("opus-4-8")
1489
- || 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"] : [],
1490
1702
  ...(thinkingConfig ?? {}),
1491
1703
  ...(effort ? { effort } : {}),
1492
1704
  ...sdkExtraOptions,
1493
1705
  };
1494
1706
  }
1495
- /** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
1496
- function normalizeToolResultContent(content) {
1497
- if (typeof content === "string") {
1498
- return [{ type: "text", text: content }];
1499
- }
1500
- if (!Array.isArray(content)) {
1501
- if (content == null)
1502
- return [{ type: "text", text: "" }];
1503
- return [{ type: "text", text: JSON.stringify(content) }];
1504
- }
1505
- const blocks = [];
1506
- for (const item of content) {
1507
- if (typeof item === "string") {
1508
- blocks.push({ type: "text", text: item });
1509
- continue;
1510
- }
1511
- if (!item || typeof item !== "object") {
1512
- blocks.push({ type: "text", text: String(item) });
1513
- continue;
1514
- }
1515
- const block = item;
1516
- if (block.type === "text") {
1517
- blocks.push({ type: "text", text: typeof block.text === "string" ? block.text : "" });
1518
- continue;
1519
- }
1520
- if (block.type === "image"
1521
- && typeof block.data === "string"
1522
- && typeof block.mimeType === "string") {
1523
- blocks.push({ type: "image", data: block.data, mimeType: block.mimeType });
1524
- continue;
1525
- }
1526
- blocks.push({ type: "text", text: JSON.stringify(block) });
1527
- }
1528
- return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
1529
- }
1530
- /**
1531
- * Extract a `details` payload from an MCP tool-result block.
1532
- *
1533
- * MCP's `CallToolResult` carries structured data in `structuredContent` — the
1534
- * protocol's supported channel for non-text payloads. Claude Code's synthetic
1535
- * user message may surface that field in one of two shapes depending on SDK
1536
- * version: as a sibling on the `mcp_tool_result` block itself, or as a
1537
- * dedicated content sub-block with `type: "structuredContent"`. Snake-case
1538
- * (`structured_content`) is accepted defensively in case a transport hop
1539
- * rewrites casing. All other shapes fall back to an empty object so callers
1540
- * can rely on `details` being present.
1541
- */
1542
- function extractStructuredDetailsFromBlock(block) {
1543
- const sibling = block.structuredContent ?? block.structured_content;
1544
- if (sibling && typeof sibling === "object" && !Array.isArray(sibling)) {
1545
- return sibling;
1546
- }
1547
- if (Array.isArray(block.content)) {
1548
- for (const item of block.content) {
1549
- if (!item || typeof item !== "object")
1550
- continue;
1551
- const sub = item;
1552
- if (sub.type !== "structuredContent" && sub.type !== "structured_content")
1553
- continue;
1554
- const payload = sub.structuredContent ?? sub.structured_content ?? sub.data ?? sub.value;
1555
- if (payload && typeof payload === "object" && !Array.isArray(payload)) {
1556
- return payload;
1557
- }
1558
- }
1559
- }
1560
- // Return undefined (not {}) when no structured payload is present, matching
1561
- // the pre-#4477 contract where `details` was nullable. An empty-object
1562
- // sentinel is truthy and breaks downstream consumers that gate on
1563
- // `if (details)`. `undefined` matches the type of the field these results
1564
- // flow into (`Record<string, unknown> | undefined`).
1565
- return undefined;
1566
- }
1567
- /**
1568
- * True for items that are MCP `structuredContent` pseudo-blocks living inside
1569
- * a tool-result `content[]` array. These blocks carry the structured payload
1570
- * (extracted separately by `extractStructuredDetailsFromBlock`) and must NOT
1571
- * leak into the visible content rendered to the user — otherwise the renderer
1572
- * stringifies the JSON pseudo-block and shows it next to the actual tool
1573
- * output. See PR #4477 review (post-fix-round).
1574
- */
1575
- function isStructuredContentPseudoBlock(item) {
1576
- if (!item || typeof item !== "object")
1577
- return false;
1578
- const type = item.type;
1579
- return type === "structuredContent" || type === "structured_content";
1580
- }
1581
- /**
1582
- * Strip `structuredContent` pseudo-blocks from a tool-result content array
1583
- * before normalization. The structured payload is extracted via the sibling
1584
- * `structuredContent` field (or a dedicated extractor pass on the raw block);
1585
- * the visible content path must not include the pseudo-block itself.
1586
- */
1587
- function stripStructuredContentPseudoBlocks(content) {
1588
- if (!Array.isArray(content))
1589
- return content;
1590
- return content.filter((item) => !isStructuredContentPseudoBlock(item));
1591
- }
1592
- /** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
1593
- export function extractToolResultsFromSdkUserMessage(message) {
1594
- const extracted = [];
1595
- const seen = new Set();
1596
- const rawMessage = message.message;
1597
- const content = Array.isArray(rawMessage?.content) ? rawMessage.content : [];
1598
- for (const item of content) {
1599
- if (!item || typeof item !== "object")
1600
- continue;
1601
- const block = item;
1602
- const type = typeof block.type === "string" ? block.type : "";
1603
- if (type !== "tool_result" && type !== "mcp_tool_result")
1604
- continue;
1605
- const toolUseId = typeof block.tool_use_id === "string" ? block.tool_use_id : "";
1606
- if (!toolUseId || seen.has(toolUseId))
1607
- continue;
1608
- seen.add(toolUseId);
1609
- extracted.push({
1610
- toolUseId,
1611
- result: {
1612
- content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(block.content)),
1613
- details: extractStructuredDetailsFromBlock(block),
1614
- isError: block.is_error === true,
1615
- },
1616
- });
1617
- }
1618
- if (extracted.length === 0) {
1619
- const fallback = message.tool_use_result;
1620
- if (fallback && typeof fallback === "object") {
1621
- const toolResult = fallback;
1622
- const toolUseId = typeof toolResult.tool_use_id === "string" ? toolResult.tool_use_id : "";
1623
- if (toolUseId) {
1624
- extracted.push({
1625
- toolUseId,
1626
- result: {
1627
- content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(toolResult.content)),
1628
- details: extractStructuredDetailsFromBlock(toolResult),
1629
- isError: toolResult.is_error === true,
1630
- },
1631
- });
1632
- }
1633
- }
1634
- }
1635
- return extracted;
1636
- }
1637
- /** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
1638
- function attachExternalResultsToToolBlocks(toolBlocks, toolResultsById) {
1639
- for (const block of toolBlocks) {
1640
- if (block.type !== "toolCall" && block.type !== "serverToolUse")
1641
- continue;
1642
- const externalResult = toolResultsById.get(block.id);
1643
- if (!externalResult)
1644
- continue;
1645
- block.externalResult = externalResult;
1646
- }
1647
- }
1648
- /**
1649
- * Build the final assistant content that Agent Core consumes in
1650
- * `externalToolExecution` mode. This preserves tool-call blocks, attaches any
1651
- * SDK-produced external results by tool-call id, and then appends the final
1652
- * text/thinking blocks for the completed turn.
1653
- */
1654
- export function buildFinalAssistantContent(params) {
1655
- const mergedToolBlocks = [...params.intermediateToolBlocks];
1656
- if (params.pendingContent) {
1657
- mergePendingToolCalls(mergedToolBlocks, params.pendingContent);
1658
- }
1659
- attachExternalResultsToToolBlocks(mergedToolBlocks, params.toolResultsById);
1660
- const finalContent = [...mergedToolBlocks];
1661
- if (params.pendingContent && params.pendingContent.length > 0) {
1662
- for (const block of params.pendingContent) {
1663
- if (block.type === "text" || block.type === "thinking") {
1664
- finalContent.push(block);
1665
- }
1666
- }
1667
- }
1668
- else {
1669
- if (params.lastThinkingContent) {
1670
- finalContent.push({ type: "thinking", thinking: params.lastThinkingContent });
1671
- }
1672
- if (params.lastTextContent) {
1673
- finalContent.push({ type: "text", text: params.lastTextContent });
1674
- }
1675
- }
1676
- if (finalContent.length === 0 && params.fallbackResultText) {
1677
- finalContent.push({ type: "text", text: params.fallbackResultText });
1678
- }
1679
- return finalContent;
1680
- }
1681
- /**
1682
- * Merge tool-call blocks from the active partial-message builder into the
1683
- * running list of intermediate tool calls, preserving order and de-duping
1684
- * by tool-call id. Exposed for testing the F3 fix (final-turn tool calls
1685
- * dropped when `result` arrives without a preceding synthetic `user`).
1686
- */
1687
- export function mergePendingToolCalls(intermediate, pending) {
1688
- const alreadyIncluded = new Set();
1689
- for (const block of intermediate) {
1690
- if (block.type === "toolCall")
1691
- alreadyIncluded.add(block.id);
1692
- }
1693
- for (const block of pending) {
1694
- if (block.type !== "toolCall")
1695
- continue;
1696
- if (alreadyIncluded.has(block.id))
1697
- continue;
1698
- alreadyIncluded.add(block.id);
1699
- intermediate.push(block);
1700
- }
1701
- return intermediate;
1702
- }
1703
- export function handleClaudeCodePartialStreamEvent(builder, event, modelId) {
1704
- if (event.type === "message_start") {
1705
- // Claude Code can emit repeated SDK message_start events inside one
1706
- // logical assistant response. Keep appending until a synthetic user
1707
- // tool-result boundary explicitly clears the builder.
1708
- return {
1709
- builder: builder ?? new PartialMessageBuilder(event.message?.model ?? modelId),
1710
- assistantEvent: null,
1711
- };
1712
- }
1713
- if (!builder)
1714
- return { builder, assistantEvent: null };
1715
- return { builder, assistantEvent: builder.handleEvent(event) };
1716
- }
1717
1707
  // ---------------------------------------------------------------------------
1718
1708
  // streamSimple implementation
1719
1709
  // ---------------------------------------------------------------------------
@@ -1730,33 +1720,33 @@ export function streamViaClaudeCode(model, context, options) {
1730
1720
  void pumpSdkMessages(model, context, options, stream);
1731
1721
  return stream;
1732
1722
  }
1723
+ function createSdkAttemptMessageState() {
1724
+ return {
1725
+ builder: null,
1726
+ intermediateToolBlocks: [],
1727
+ toolResultsById: new Map(),
1728
+ };
1729
+ }
1733
1730
  /** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
1734
1731
  async function pumpSdkMessages(model, context, options, stream) {
1735
1732
  const modelId = model.id;
1736
- let builder = null;
1737
1733
  /** Track the last text content seen across all assistant turns for the final message. */
1738
1734
  let lastTextContent = "";
1739
1735
  let lastThinkingContent = "";
1740
- /** Collect tool blocks from intermediate SDK turns for tool execution rendering. */
1741
- const intermediateToolBlocks = [];
1742
- /** Preserve real external tool results from Claude Code's synthetic user messages. */
1743
- const toolResultsById = new Map();
1744
1736
  try {
1745
- // Dynamic import — the SDK is an optional dependency.
1746
- const sdkModule = "@anthropic-ai/claude-agent-sdk";
1747
- const sdk = (await import(/* webpackIgnore: true */ sdkModule));
1748
- // Bridge GSD's AbortSignal to SDK's AbortController
1749
- const controller = new AbortController();
1750
- if (options?.signal) {
1751
- options.signal.addEventListener("abort", () => controller.abort(), { once: true });
1752
- }
1753
1737
  const permissionMode = await resolveClaudePermissionMode();
1754
- const uiContext = options?.extensionUIContext;
1755
- const onExternalToolCall = options?.onExternalToolCall;
1756
- 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;
1757
1746
  const cwd = resolveClaudeCodeCwd(options);
1747
+ const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
1758
1748
  autoInitClaudeCodeWorkflowMcp(cwd);
1759
- const gsdPhase = inferGsdPhaseFromContext(context);
1749
+ const gsdPhase = resolveGsdPhaseForSdk(context, projectRoot);
1760
1750
  const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
1761
1751
  // When no UI is available (headless / auto-mode), auto-approve all
1762
1752
  // tool requests. This replaces the old bypassPermissions workaround.
@@ -1773,18 +1763,14 @@ async function pumpSdkMessages(model, context, options, stream) {
1773
1763
  }
1774
1764
  : {}),
1775
1765
  });
1766
+ const workflowMcpServerName = workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools);
1767
+ const allowPendingToolSearchHydration = Boolean(workflowMcpServerName && gsdPhase)
1768
+ && !sdkOpts.disallowedTools?.includes("ToolSearch");
1776
1769
  const prompt = buildPromptFromContext(context, {
1777
- workflowMcpServerName: workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
1770
+ workflowMcpServerName,
1778
1771
  browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
1779
1772
  });
1780
1773
  const queryPrompt = buildSdkQueryPrompt(context, prompt);
1781
- const queryResult = sdk.query({
1782
- prompt: queryPrompt,
1783
- options: {
1784
- ...sdkOpts,
1785
- abortController: controller,
1786
- },
1787
- });
1788
1774
  // Emit start with an empty partial
1789
1775
  const initialPartial = {
1790
1776
  role: "assistant",
@@ -1797,169 +1783,303 @@ async function pumpSdkMessages(model, context, options, stream) {
1797
1783
  timestamp: Date.now(),
1798
1784
  };
1799
1785
  stream.push({ type: "start", partial: initialPartial });
1800
- for await (const msg of queryResult) {
1801
- if (options?.signal?.aborted) {
1802
- // User-initiated cancel — emit an aborted error so the agent
1803
- // loop classifies this as a deliberate stop, not a transient
1804
- // provider failure that should be retried.
1805
- stream.push({
1806
- type: "error",
1807
- reason: "aborted",
1808
- error: makeAbortedMessage(modelId, lastTextContent),
1809
- });
1810
- return;
1811
- }
1812
- switch (msg.type) {
1813
- // -- Init --
1814
- case "system": {
1815
- // Nothing to emit — the stream is already started.
1816
- break;
1817
- }
1818
- // -- Streaming partial messages --
1819
- case "stream_event": {
1820
- const partial = msg;
1821
- const event = partial.event;
1822
- const result = handleClaudeCodePartialStreamEvent(builder, event, modelId);
1823
- builder = result.builder;
1824
- const assistantEvent = result.assistantEvent;
1825
- if (assistantEvent) {
1826
- stream.push(assistantEvent);
1827
- if (assistantEvent.type === "toolcall_start") {
1828
- const toolBlock = assistantEvent.partial.content[assistantEvent.contentIndex];
1829
- if (toolBlock?.type === "toolCall") {
1830
- try {
1831
- await onExternalToolCall?.(toolBlock);
1832
- }
1833
- catch (error) {
1834
- console.warn("[claude-code] onExternalToolCall callback failed:", error);
1835
- }
1836
- }
1837
- }
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;
1838
1820
  }
1839
- break;
1821
+ workflowMcpPreflightVerified = true;
1840
1822
  }
1841
- // -- Complete assistant message (non-streaming fallback) --
1842
- case "assistant": {
1843
- const sdkAssistant = msg;
1844
- // Capture text content from complete messages
1845
- for (const block of sdkAssistant.message.content) {
1846
- if (block.type === "text") {
1847
- lastTextContent = block.text;
1848
- }
1849
- else if (block.type === "thinking") {
1850
- lastThinkingContent = block.thinking;
1851
- }
1852
- }
1853
- break;
1823
+ finally {
1824
+ uiContext?.setStatus?.("gsd-step", "");
1854
1825
  }
1855
- // -- User message (synthetic tool result — signals turn boundary) --
1856
- case "user": {
1857
- // Capture content from the completed turn before resetting
1858
- if (builder) {
1859
- for (const block of builder.message.content) {
1860
- if (block.type === "text" && block.text) {
1861
- lastTextContent = block.text;
1862
- }
1863
- else if (block.type === "thinking" && block.thinking) {
1864
- lastThinkingContent = block.thinking;
1865
- }
1866
- else if (block.type === "toolCall" || block.type === "serverToolUse") {
1867
- // Collect tool blocks for externalToolExecution rendering
1868
- intermediateToolBlocks.push(block);
1869
- }
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;
1870
1856
  }
1871
- }
1872
- // Extract tool results from the SDK's synthetic user message
1873
- // and attach to corresponding tool call blocks immediately.
1874
- for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg)) {
1875
- toolResultsById.set(toolUseId, result);
1876
- }
1877
- attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
1878
- // Push a synthetic toolcall_end for each tool call from this turn
1879
- // so the TUI can render tool results in real-time during the SDK
1880
- // session instead of waiting until the entire session completes.
1881
- if (builder) {
1882
- for (const block of builder.message.content) {
1883
- const extResult = block.externalResult;
1884
- if (!extResult)
1885
- continue;
1886
- const contentIndex = builder.message.content.indexOf(block);
1887
- if (contentIndex < 0)
1888
- continue;
1889
- // Push synthetic completion events with result attached so the
1890
- // chat-controller can update pending ToolExecutionComponents.
1891
- if (block.type === "toolCall") {
1892
- try {
1893
- await onExternalToolResult?.({
1894
- toolCall: block,
1895
- 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,
1896
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
+ }
1897
1906
  }
1898
- catch (error) {
1899
- 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
+ }
1900
1929
  }
1901
- stream.push({
1902
- type: "toolcall_end",
1903
- contentIndex,
1904
- toolCall: block,
1905
- partial: builder.message,
1906
- });
1930
+ break;
1907
1931
  }
1908
- else if (block.type === "serverToolUse") {
1909
- try {
1910
- await onExternalToolResult?.({
1911
- toolCall: serverToolUseToToolCallLike(block),
1912
- result: extResult,
1913
- });
1932
+ // -- Complete assistant message (non-streaming fallback) --
1933
+ case "assistant": {
1934
+ const sdkAssistant = msg;
1935
+ // Capture text content from complete messages
1936
+ for (const block of sdkAssistant.message.content) {
1937
+ if (block.type === "text") {
1938
+ lastTextContent = block.text;
1939
+ }
1940
+ else if (block.type === "thinking") {
1941
+ lastThinkingContent = block.thinking;
1942
+ }
1943
+ }
1944
+ break;
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
+ }
1914
1962
  }
1915
- catch (error) {
1916
- console.warn("[claude-code] onExternalToolResult callback failed:", error);
1963
+ // Extract tool results from the SDK's synthetic user message
1964
+ // and attach to corresponding tool call blocks immediately.
1965
+ for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg)) {
1966
+ toolResultsById.set(toolUseId, result);
1917
1967
  }
1918
- stream.push({
1919
- type: "server_tool_use",
1920
- contentIndex,
1921
- partial: builder.message,
1968
+ attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
1969
+ // Push a synthetic toolcall_end for each tool call from this turn
1970
+ // so the TUI can render tool results in real-time during the SDK
1971
+ // session instead of waiting until the entire session completes.
1972
+ if (builder) {
1973
+ for (const block of builder.message.content) {
1974
+ const extResult = block.externalResult;
1975
+ if (!extResult)
1976
+ continue;
1977
+ const contentIndex = builder.message.content.indexOf(block);
1978
+ if (contentIndex < 0)
1979
+ continue;
1980
+ const suppressDuplicateUnavailable = shouldSuppressDuplicateToolUnavailableBlock(block, builder.message.content);
1981
+ // Push synthetic completion events with result attached so the
1982
+ // chat-controller can update pending ToolExecutionComponents.
1983
+ if (block.type === "toolCall") {
1984
+ if (suppressDuplicateUnavailable) {
1985
+ delete block.externalResult;
1986
+ stream.push({
1987
+ type: "toolcall_end",
1988
+ contentIndex,
1989
+ toolCall: block,
1990
+ partial: builder.message,
1991
+ });
1992
+ block.externalResult = extResult;
1993
+ continue;
1994
+ }
1995
+ try {
1996
+ await onExternalToolResult?.({
1997
+ toolCall: block,
1998
+ result: extResult,
1999
+ });
2000
+ }
2001
+ catch (error) {
2002
+ console.warn("[claude-code] onExternalToolResult callback failed:", error);
2003
+ }
2004
+ stream.push({
2005
+ type: "toolcall_end",
2006
+ contentIndex,
2007
+ toolCall: block,
2008
+ partial: builder.message,
2009
+ });
2010
+ }
2011
+ else if (block.type === "serverToolUse") {
2012
+ try {
2013
+ await onExternalToolResult?.({
2014
+ toolCall: serverToolUseToToolCallLike(block),
2015
+ result: extResult,
2016
+ });
2017
+ }
2018
+ catch (error) {
2019
+ console.warn("[claude-code] onExternalToolResult callback failed:", error);
2020
+ }
2021
+ stream.push({
2022
+ type: "server_tool_use",
2023
+ contentIndex,
2024
+ partial: builder.message,
2025
+ });
2026
+ }
2027
+ }
2028
+ }
2029
+ builder = null;
2030
+ break;
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,
1922
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;
1923
2061
  }
2062
+ default:
2063
+ break;
1924
2064
  }
1925
2065
  }
1926
- builder = null;
1927
- break;
1928
2066
  }
1929
- // -- Result (terminal) --
1930
- case "result": {
1931
- const result = msg;
1932
- const finalContent = buildFinalAssistantContent({
1933
- intermediateToolBlocks,
1934
- pendingContent: builder?.message.content,
1935
- toolResultsById,
1936
- lastThinkingContent,
1937
- lastTextContent,
1938
- fallbackResultText: result.subtype === "success" && result.result ? result.result : undefined,
1939
- });
1940
- const finalMessage = {
1941
- role: "assistant",
1942
- content: finalContent,
1943
- api: "anthropic-messages",
1944
- provider: "claude-code",
1945
- model: modelId,
1946
- usage: mapUsage(result.usage, result.total_cost_usd),
1947
- stopReason: result.is_error ? "error" : "stop",
1948
- timestamp: Date.now(),
1949
- };
1950
- if (result.is_error) {
1951
- finalMessage.errorMessage = getResultErrorMessage(result);
1952
- stream.push({ type: "error", reason: "error", error: finalMessage });
1953
- }
1954
- else {
1955
- stream.push({ type: "done", reason: "stop", message: finalMessage });
1956
- }
1957
- return;
2067
+ finally {
2068
+ options?.signal?.removeEventListener("abort", forwardAbort);
1958
2069
  }
1959
- default:
1960
- 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;
1961
2077
  }
1962
2078
  }
2079
+ finally {
2080
+ if (trackWorkflowMcpSdk)
2081
+ endWorkflowMcpSdkSession();
2082
+ }
1963
2083
  // Generator exhaustion without a terminal result is a stream interruption,
1964
2084
  // not a successful completion. Emitting an error lets GSD classify it as a
1965
2085
  // transient provider failure instead of advancing auto-mode state.