@opengsd/gsd-pi 1.2.0 → 1.3.0-dev.65546769

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 (1669) hide show
  1. package/README.md +13 -7
  2. package/dist/cli-model-override.d.ts +15 -0
  3. package/dist/cli-model-override.js +21 -0
  4. package/dist/cli-style.d.ts +17 -0
  5. package/dist/cli-style.js +28 -0
  6. package/dist/cli-web-branch.d.ts +2 -0
  7. package/dist/cli-web-branch.js +9 -2
  8. package/dist/cli.js +30 -20
  9. package/dist/headless-context.js +0 -1
  10. package/dist/headless-events.d.ts +20 -3
  11. package/dist/headless-events.js +33 -36
  12. package/dist/headless.js +8 -1
  13. package/dist/help-text.js +34 -0
  14. package/dist/hermes-integration-install.d.ts +17 -0
  15. package/dist/hermes-integration-install.js +199 -0
  16. package/dist/jiti-workspace-aliases.d.ts +11 -2
  17. package/dist/jiti-workspace-aliases.js +19 -3
  18. package/dist/loader.js +6 -4
  19. package/dist/mcp-server.js +2 -1
  20. package/dist/models-resolver.d.ts +3 -13
  21. package/dist/models-resolver.js +3 -22
  22. package/dist/onboarding.js +9 -4
  23. package/dist/provider-migrations.d.ts +23 -0
  24. package/dist/provider-migrations.js +41 -0
  25. package/dist/read-cli.d.ts +23 -0
  26. package/dist/read-cli.js +90 -0
  27. package/dist/register-agent-bundles.d.ts +11 -2
  28. package/dist/register-agent-bundles.js +18 -4
  29. package/dist/resource-loader.d.ts +10 -5
  30. package/dist/resource-loader.js +121 -27
  31. package/dist/resources/.managed-resources-content-hash +1 -1
  32. package/dist/resources/GSD-WORKFLOW.md +27 -26
  33. package/dist/resources/extensions/ask-user-questions.js +81 -25
  34. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  35. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  36. package/dist/resources/extensions/async-jobs/index.js +65 -0
  37. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  38. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  39. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  40. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  41. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  42. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  43. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  44. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  45. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  46. package/dist/resources/extensions/browser-tools/index.js +69 -12
  47. package/dist/resources/extensions/claude-code-cli/index.js +7 -1
  48. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  49. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +613 -440
  50. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -0
  51. package/dist/resources/extensions/github-sync/templates.js +3 -3
  52. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  53. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  54. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  55. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  56. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  57. package/dist/resources/extensions/gsd/auto/dispatch-history.js +125 -0
  58. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  59. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  60. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  61. package/dist/resources/extensions/gsd/auto/loop.js +147 -58
  62. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  63. package/dist/resources/extensions/gsd/auto/orchestrator.js +349 -77
  64. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  65. package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
  66. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
  67. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  68. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  69. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  70. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
  71. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  72. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  73. package/dist/resources/extensions/gsd/auto-artifact-paths.js +81 -19
  74. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  75. package/dist/resources/extensions/gsd/auto-dashboard.js +271 -435
  76. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +26 -37
  77. package/dist/resources/extensions/gsd/auto-dispatch.js +103 -71
  78. package/dist/resources/extensions/gsd/auto-model-selection.js +56 -19
  79. package/dist/resources/extensions/gsd/auto-post-unit.js +85 -45
  80. package/dist/resources/extensions/gsd/auto-prompts.js +205 -56
  81. package/dist/resources/extensions/gsd/auto-recovery.js +166 -89
  82. package/dist/resources/extensions/gsd/auto-runtime-state.js +27 -0
  83. package/dist/resources/extensions/gsd/auto-start.js +116 -82
  84. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  85. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  86. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  87. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
  88. package/dist/resources/extensions/gsd/auto-verification.js +34 -38
  89. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  90. package/dist/resources/extensions/gsd/auto-worktree.js +230 -467
  91. package/dist/resources/extensions/gsd/auto.js +158 -50
  92. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  93. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +58 -49
  94. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  95. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +74 -50
  96. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  97. package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
  98. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  99. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +42 -1
  100. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +422 -168
  101. package/dist/resources/extensions/gsd/bootstrap/system-context.js +164 -44
  102. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
  103. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +475 -82
  104. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  105. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  106. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  107. package/dist/resources/extensions/gsd/captures.js +5 -15
  108. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +110 -5
  109. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  110. package/dist/resources/extensions/gsd/closeout-wizard.js +97 -0
  111. package/dist/resources/extensions/gsd/codebase-generator.js +1 -0
  112. package/dist/resources/extensions/gsd/commands/catalog.js +12 -62
  113. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  114. package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
  115. package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
  116. package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
  117. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  118. package/dist/resources/extensions/gsd/commands/handlers/core.js +52 -8
  119. package/dist/resources/extensions/gsd/commands/handlers/ops.js +227 -3
  120. package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
  121. package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
  122. package/dist/resources/extensions/gsd/commands-handlers.js +133 -4
  123. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  124. package/dist/resources/extensions/gsd/commands-maintenance.js +140 -43
  125. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  126. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +14 -1
  127. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  128. package/dist/resources/extensions/gsd/commands-verdict.js +21 -5
  129. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  130. package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
  131. package/dist/resources/extensions/gsd/compat/index.js +3 -0
  132. package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
  133. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  134. package/dist/resources/extensions/gsd/consent-question.js +365 -0
  135. package/dist/resources/extensions/gsd/consent-verdict.js +73 -0
  136. package/dist/resources/extensions/gsd/constants.js +0 -2
  137. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  138. package/dist/resources/extensions/gsd/dashboard-overlay.js +39 -3
  139. package/dist/resources/extensions/gsd/db/engine.js +800 -0
  140. package/dist/resources/extensions/gsd/db/queries.js +482 -0
  141. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  142. package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
  143. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  144. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  145. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  146. package/dist/resources/extensions/gsd/db/writers/reconcile.js +476 -0
  147. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  148. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  149. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  150. package/dist/resources/extensions/gsd/db-workspace.js +115 -0
  151. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  152. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  153. package/dist/resources/extensions/gsd/discussion-handoff.js +222 -0
  154. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  155. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  156. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  157. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  158. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  159. package/dist/resources/extensions/gsd/doctor-git-checks.js +36 -25
  160. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  161. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +34 -40
  162. package/dist/resources/extensions/gsd/doctor.js +43 -15
  163. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  164. package/dist/resources/extensions/gsd/error-classifier.js +22 -1
  165. package/dist/resources/extensions/gsd/escalation.js +11 -4
  166. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  167. package/dist/resources/extensions/gsd/export-html.js +10 -3
  168. package/dist/resources/extensions/gsd/export.js +73 -0
  169. package/dist/resources/extensions/gsd/file-lock.js +1 -1
  170. package/dist/resources/extensions/gsd/files.js +33 -19
  171. package/dist/resources/extensions/gsd/flat-phase-migration.js +176 -0
  172. package/dist/resources/extensions/gsd/forensics.js +2 -1
  173. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  174. package/dist/resources/extensions/gsd/git-service.js +8 -4
  175. package/dist/resources/extensions/gsd/gitignore.js +9 -2
  176. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  177. package/dist/resources/extensions/gsd/gsd-db.js +185 -2054
  178. package/dist/resources/extensions/gsd/guidance.js +158 -0
  179. package/dist/resources/extensions/gsd/guided-flow.js +184 -478
  180. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  181. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  182. package/dist/resources/extensions/gsd/layout-policy.js +75 -0
  183. package/dist/resources/extensions/gsd/markdown-renderer.js +403 -117
  184. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  185. package/dist/resources/extensions/gsd/mcp-filter.js +48 -30
  186. package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
  187. package/dist/resources/extensions/gsd/md-importer.js +157 -54
  188. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  189. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  190. package/dist/resources/extensions/gsd/metrics.js +19 -11
  191. package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
  192. package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
  193. package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
  194. package/dist/resources/extensions/gsd/migrate-external.js +51 -6
  195. package/dist/resources/extensions/gsd/migration-auto-check.js +32 -19
  196. package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
  197. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  198. package/dist/resources/extensions/gsd/milestone-closeout.js +108 -29
  199. package/dist/resources/extensions/gsd/milestone-ids.js +50 -19
  200. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  201. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +164 -0
  202. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  203. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  204. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  205. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  206. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +60 -0
  207. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  208. package/dist/resources/extensions/gsd/model-router.js +82 -20
  209. package/dist/resources/extensions/gsd/native-git-bridge.js +36 -0
  210. package/dist/resources/extensions/gsd/notification-store.js +33 -33
  211. package/dist/resources/extensions/gsd/notifications.js +48 -14
  212. package/dist/resources/extensions/gsd/observability-validator.js +12 -4
  213. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  214. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  215. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +144 -42
  216. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  217. package/dist/resources/extensions/gsd/parsers-legacy.js +56 -18
  218. package/dist/resources/extensions/gsd/paths.js +393 -68
  219. package/dist/resources/extensions/gsd/planning-depth.js +2 -1
  220. package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
  221. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  222. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  223. package/dist/resources/extensions/gsd/preferences-models.js +46 -60
  224. package/dist/resources/extensions/gsd/preferences.js +302 -35
  225. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  226. package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  227. package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  228. package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  229. package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  230. package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
  231. package/dist/resources/extensions/gsd/prompts/code-review.md +37 -0
  232. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  233. package/dist/resources/extensions/gsd/prompts/complete-slice.md +25 -15
  234. package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  235. package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
  236. package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  237. package/dist/resources/extensions/gsd/prompts/execute-task.md +9 -2
  238. package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
  239. package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
  240. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  241. package/dist/resources/extensions/gsd/prompts/health.md +37 -0
  242. package/dist/resources/extensions/gsd/prompts/import.md +30 -0
  243. package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
  244. package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  245. package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
  246. package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  247. package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  248. package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  249. package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
  250. package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
  251. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  252. package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  253. package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  254. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  255. package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
  256. package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
  257. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  258. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  259. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  260. package/dist/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  261. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  262. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  263. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  264. package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
  265. package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  266. package/dist/resources/extensions/gsd/prompts/review.md +27 -0
  267. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  268. package/dist/resources/extensions/gsd/prompts/run-uat.md +13 -5
  269. package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  270. package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
  271. package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
  272. package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  273. package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
  274. package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
  275. package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
  276. package/dist/resources/extensions/gsd/prompts/system.md +6 -3
  277. package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
  278. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  279. package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  280. package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
  281. package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  282. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  283. package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  284. package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
  285. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  286. package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
  287. package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
  288. package/dist/resources/extensions/gsd/provider-error-guidance.js +25 -5
  289. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  290. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  291. package/dist/resources/extensions/gsd/publication.js +87 -0
  292. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  293. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  294. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  295. package/dist/resources/extensions/gsd/queue-order.js +3 -2
  296. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  297. package/dist/resources/extensions/gsd/recovery-classification.js +49 -87
  298. package/dist/resources/extensions/gsd/roadmap-slices.js +34 -6
  299. package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
  300. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  301. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  302. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +50 -3
  303. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  304. package/dist/resources/extensions/gsd/service-tier.js +2 -1
  305. package/dist/resources/extensions/gsd/session-lock.js +12 -10
  306. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  307. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
  308. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
  309. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  310. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +51 -10
  311. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
  312. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
  313. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
  314. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
  315. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
  316. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +95 -19
  317. package/dist/resources/extensions/gsd/state-reconciliation/index.js +36 -3
  318. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +12 -0
  319. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  320. package/dist/resources/extensions/gsd/state.js +70 -41
  321. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  322. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  323. package/dist/resources/extensions/gsd/sync-lock.js +11 -18
  324. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  325. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  326. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  327. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  328. package/dist/resources/extensions/gsd/tool-contract.js +66 -11
  329. package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
  330. package/dist/resources/extensions/gsd/tool-surface-readiness.js +297 -0
  331. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  332. package/dist/resources/extensions/gsd/tools/complete-milestone.js +7 -4
  333. package/dist/resources/extensions/gsd/tools/complete-slice.js +58 -57
  334. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -3
  335. package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -112
  336. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  337. package/dist/resources/extensions/gsd/tools/plan-slice.js +13 -9
  338. package/dist/resources/extensions/gsd/tools/plan-task.js +18 -3
  339. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +50 -5
  340. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  341. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  342. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  343. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  344. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  345. package/dist/resources/extensions/gsd/tools/validate-milestone.js +21 -79
  346. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +110 -6
  347. package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
  348. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  349. package/dist/resources/extensions/gsd/uat-policy.js +57 -25
  350. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  351. package/dist/resources/extensions/gsd/undo.js +16 -16
  352. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  353. package/dist/resources/extensions/gsd/unit-context-composer.js +114 -21
  354. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  355. package/dist/resources/extensions/gsd/unit-registry.js +391 -0
  356. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  357. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
  358. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +58 -2
  359. package/dist/resources/extensions/gsd/validation-block-guard.js +47 -0
  360. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  361. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  362. package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
  363. package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
  364. package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
  365. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  366. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  367. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  368. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  369. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  370. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  371. package/dist/resources/extensions/gsd/workflow-mcp.js +24 -103
  372. package/dist/resources/extensions/gsd/workflow-projections.js +25 -4
  373. package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
  374. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  375. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  376. package/dist/resources/extensions/gsd/worktree-command.js +6 -6
  377. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  378. package/dist/resources/extensions/gsd/worktree-health.js +6 -3
  379. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  380. package/dist/resources/extensions/gsd/worktree-manager.js +161 -45
  381. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  382. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  383. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  384. package/dist/resources/extensions/gsd/worktree-safety.js +48 -34
  385. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  386. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  387. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  388. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  389. package/dist/resources/extensions/gsd/worktree.js +8 -1
  390. package/dist/resources/extensions/mcp-client/manager.js +9 -4
  391. package/dist/resources/extensions/search-the-web/index.js +41 -9
  392. package/dist/resources/extensions/search-the-web/native-search.js +23 -7
  393. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  394. package/dist/resources/extensions/shared/gsd-browser-cli.js +156 -8
  395. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  396. package/dist/resources/extensions/subagent/index.js +20 -15
  397. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  398. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  399. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  400. package/dist/resources/shared/package-manager-detection.js +1 -1
  401. package/dist/resources/shared/package.json +3 -0
  402. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  403. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  404. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  405. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  406. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  407. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  408. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  409. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  410. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  411. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  412. package/dist/runtime-checks.d.ts +10 -0
  413. package/dist/runtime-checks.js +27 -0
  414. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  415. package/dist/update-check.d.ts +2 -0
  416. package/dist/update-check.js +39 -5
  417. package/dist/update-cmd.js +40 -3
  418. package/dist/web/standalone/.next/BUILD_ID +1 -1
  419. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  420. package/dist/web/standalone/.next/build-manifest.json +4 -4
  421. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  422. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  423. package/dist/web/standalone/.next/required-server-files.json +3 -3
  424. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  425. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  426. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  427. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  428. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  429. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  430. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  431. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  432. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  433. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  434. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  435. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  436. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  437. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  438. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  439. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  440. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  441. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  442. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  443. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  444. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  445. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  446. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  447. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  448. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  449. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  450. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  451. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  452. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  453. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  454. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  455. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  456. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  457. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  458. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  459. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  460. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  461. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  462. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  463. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  464. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  465. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  466. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  467. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  468. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  469. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  470. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  471. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  472. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  473. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  474. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  475. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  476. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  477. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  478. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  479. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  480. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  481. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  482. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  483. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  484. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  485. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  486. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  487. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  488. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  489. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  490. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  491. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  492. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  493. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  494. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  495. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  496. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  497. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  498. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  499. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  500. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  501. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  502. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  503. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  504. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  505. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  506. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  507. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  508. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  509. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  510. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  511. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  512. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  513. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  514. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  515. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  516. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  517. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  518. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  519. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  520. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  521. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  522. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  523. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  524. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  525. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  526. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  527. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  528. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  529. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  530. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  531. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  532. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  533. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  534. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  535. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  536. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  537. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  538. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  539. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  540. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  541. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  542. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  543. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  544. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  545. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  546. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  547. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  548. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  549. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  550. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  551. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  552. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  553. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  554. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  555. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  556. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  557. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  558. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  559. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  560. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  561. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  562. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  563. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  564. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  565. package/dist/web/standalone/.next/server/app/index.html +1 -1
  566. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  567. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  568. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  569. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  570. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  571. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  572. package/dist/web/standalone/.next/server/app/page.js +2 -2
  573. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  574. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  575. package/dist/web/standalone/.next/server/chunks/1128.js +2 -0
  576. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  577. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  578. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  579. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  580. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  581. package/dist/web/standalone/.next/server/middleware.js +3 -3
  582. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  583. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  584. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  585. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  586. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  587. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  588. package/dist/web/standalone/.next/static/chunks/4283.8e446784528ed9dc.js +2 -0
  589. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  590. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +10 -0
  591. package/dist/web/standalone/.next/static/chunks/8785.481aa5869991b760.js +1 -0
  592. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  593. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  594. package/dist/web/standalone/.next/static/chunks/app/page-6644fc6ee8ca1247.js +1 -0
  595. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  596. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  597. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-f46ea08200a0227e.js} +1 -1
  598. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  599. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  600. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  601. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  602. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  603. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  604. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  605. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  606. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  607. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  608. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  609. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  610. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  611. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  612. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  613. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  614. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  615. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  616. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  617. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  618. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  619. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  620. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  621. package/dist/web/standalone/package.json +1 -1
  622. package/dist/web/standalone/server.js +1 -1
  623. package/dist/web-mode.d.ts +5 -1
  624. package/dist/web-mode.js +27 -13
  625. package/dist/worktree-cli.js +3 -6
  626. package/dist/worktree-status-banner.js +7 -11
  627. package/integrations/hermes/README.md +48 -0
  628. package/integrations/hermes/docs/setup.md +272 -0
  629. package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
  630. package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
  631. package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
  632. package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
  633. package/integrations/hermes/open_gsd_hermes/config.py +59 -0
  634. package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
  635. package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
  636. package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
  637. package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
  638. package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
  639. package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
  640. package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
  641. package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
  642. package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
  643. package/integrations/hermes/open_gsd_hermes/types.py +100 -0
  644. package/integrations/hermes/plugin.yaml +38 -0
  645. package/integrations/hermes/pyproject.toml +32 -0
  646. package/integrations/hermes/scripts/preflight.sh +92 -0
  647. package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
  648. package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
  649. package/integrations/hermes/tests/golden/snapshot.txt +8 -0
  650. package/integrations/hermes/tests/test_binding.py +103 -0
  651. package/integrations/hermes/tests/test_config.py +36 -0
  652. package/integrations/hermes/tests/test_cron.py +34 -0
  653. package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
  654. package/integrations/hermes/tests/test_memory.py +59 -0
  655. package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
  656. package/integrations/hermes/tests/test_register.py +56 -0
  657. package/integrations/hermes/tests/test_snapshot.py +53 -0
  658. package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
  659. package/package.json +19 -14
  660. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
  661. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
  662. package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
  663. package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
  664. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
  665. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
  666. package/packages/cloud-mcp-gateway/package.json +2 -2
  667. package/packages/contracts/dist/rpc.d.ts +1 -0
  668. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  669. package/packages/contracts/dist/rpc.js.map +1 -1
  670. package/packages/contracts/dist/workflow.d.ts +4 -0
  671. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  672. package/packages/contracts/dist/workflow.js.map +1 -1
  673. package/packages/contracts/package.json +1 -1
  674. package/packages/daemon/package.json +4 -4
  675. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  676. package/packages/gsd-agent-core/dist/sdk.js +12 -6
  677. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  678. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  679. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  680. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  681. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  682. package/packages/gsd-agent-core/package.json +5 -5
  683. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  684. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  685. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  686. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  687. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  688. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  689. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  690. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  691. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  692. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  693. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  694. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  695. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  696. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  697. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  698. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  699. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  700. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  701. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  702. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  703. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  704. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  705. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  706. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  707. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  708. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  709. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  710. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  711. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  712. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  713. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  714. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  715. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  716. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  717. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  718. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  719. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  720. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  721. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  722. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  723. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  724. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  725. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  726. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  727. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  728. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  729. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +16 -0
  730. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  731. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +93 -19
  732. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  733. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
  734. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  735. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
  736. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  737. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  738. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  739. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  740. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  741. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  742. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  743. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +139 -50
  744. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  745. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  746. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  747. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  748. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  749. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +13 -1
  750. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  751. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  752. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  753. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  754. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  755. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +14 -6
  756. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  757. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  758. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  759. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  760. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  761. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +31 -0
  762. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  763. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  764. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  765. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  766. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  767. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  768. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  769. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  770. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  771. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  772. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  773. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
  774. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  775. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
  776. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  777. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  778. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  779. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  780. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  781. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  782. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  783. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  784. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  785. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  786. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  787. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +6 -1
  788. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  789. package/packages/gsd-agent-modes/package.json +7 -7
  790. package/packages/mcp-server/README.md +22 -3
  791. package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
  792. package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
  793. package/packages/mcp-server/dist/cli-errors.js +12 -0
  794. package/packages/mcp-server/dist/cli-errors.js.map +1 -1
  795. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  796. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  797. package/packages/mcp-server/dist/cli-runner.js +170 -0
  798. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  799. package/packages/mcp-server/dist/cli.d.ts +1 -0
  800. package/packages/mcp-server/dist/cli.d.ts.map +1 -1
  801. package/packages/mcp-server/dist/cli.js +3 -50
  802. package/packages/mcp-server/dist/cli.js.map +1 -1
  803. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  804. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  805. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  806. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  807. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  808. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  809. package/packages/mcp-server/dist/pid-registry.js +459 -0
  810. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  811. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  812. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  813. package/packages/mcp-server/dist/probe-mode.js +10 -0
  814. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  815. package/packages/mcp-server/dist/server.d.ts +39 -0
  816. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  817. package/packages/mcp-server/dist/server.js +94 -3
  818. package/packages/mcp-server/dist/server.js.map +1 -1
  819. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  820. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  821. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  822. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  823. package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
  824. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  825. package/packages/mcp-server/dist/workflow-tools.js +209 -103
  826. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  827. package/packages/mcp-server/package.json +21 -4
  828. package/packages/native/package.json +1 -1
  829. package/packages/pi-agent-core/dist/agent-loop.js +52 -2
  830. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  831. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  832. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  833. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  834. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  835. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  836. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  837. package/packages/pi-agent-core/dist/index.js +3 -0
  838. package/packages/pi-agent-core/dist/index.js.map +1 -1
  839. package/packages/pi-agent-core/package.json +1 -1
  840. package/packages/pi-ai/README.md +1 -0
  841. package/packages/pi-ai/dist/index.d.ts +2 -0
  842. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  843. package/packages/pi-ai/dist/index.js +2 -0
  844. package/packages/pi-ai/dist/index.js.map +1 -1
  845. package/packages/pi-ai/dist/models.generated.d.ts +183 -76
  846. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  847. package/packages/pi-ai/dist/models.generated.js +205 -124
  848. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  849. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  850. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  851. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  852. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  853. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  854. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  855. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  856. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  857. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  858. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  859. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  860. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  861. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  862. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  863. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  864. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  865. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  866. package/packages/pi-ai/package.json +3 -2
  867. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  868. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  869. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  870. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  871. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  872. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  873. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  874. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  875. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  876. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  877. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  878. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  879. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  880. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  881. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  882. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  883. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  884. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  885. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  886. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  887. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  888. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  889. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  890. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  891. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  892. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  893. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  894. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  895. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  896. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  897. package/packages/pi-coding-agent/dist/index.js +1 -1
  898. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  899. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  900. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  901. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  902. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  903. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  904. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  905. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  906. package/packages/pi-coding-agent/package.json +8 -8
  907. package/packages/pi-tui/README.md +15 -0
  908. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  909. package/packages/pi-tui/dist/autocomplete.js +6 -1
  910. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  911. package/packages/pi-tui/dist/components/input.js +2 -2
  912. package/packages/pi-tui/dist/components/input.js.map +1 -1
  913. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  914. package/packages/pi-tui/dist/components/loader.js +1 -0
  915. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  916. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  917. package/packages/pi-tui/dist/components/select-list.js +8 -2
  918. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  919. package/packages/pi-tui/dist/index.d.ts +2 -2
  920. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  921. package/packages/pi-tui/dist/index.js +2 -2
  922. package/packages/pi-tui/dist/index.js.map +1 -1
  923. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  924. package/packages/pi-tui/dist/keys.js +39 -30
  925. package/packages/pi-tui/dist/keys.js.map +1 -1
  926. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  927. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  928. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  929. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  930. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  931. package/packages/pi-tui/dist/terminal-image.js +54 -2
  932. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  933. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  934. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  935. package/packages/pi-tui/dist/terminal.js +70 -25
  936. package/packages/pi-tui/dist/terminal.js.map +1 -1
  937. package/packages/pi-tui/dist/tui.d.ts +15 -0
  938. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  939. package/packages/pi-tui/dist/tui.js +115 -21
  940. package/packages/pi-tui/dist/tui.js.map +1 -1
  941. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  942. package/packages/pi-tui/dist/utils.js +110 -36
  943. package/packages/pi-tui/dist/utils.js.map +1 -1
  944. package/packages/pi-tui/package.json +2 -2
  945. package/packages/rpc-client/package.json +2 -2
  946. package/pkg/dist/theme/theme.d.ts.map +1 -1
  947. package/pkg/dist/theme/theme.js +45 -17
  948. package/pkg/dist/theme/theme.js.map +1 -1
  949. package/pkg/package.json +1 -1
  950. package/scripts/install/deps.js +10 -0
  951. package/scripts/link-workspace-packages.cjs +7 -40
  952. package/src/resources/GSD-WORKFLOW.md +27 -26
  953. package/src/resources/extensions/ask-user-questions.ts +94 -26
  954. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  955. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  956. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  957. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  958. package/src/resources/extensions/async-jobs/index.ts +79 -0
  959. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  960. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  961. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  962. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  963. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  964. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  965. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  966. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  967. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  968. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  969. package/src/resources/extensions/browser-tools/index.ts +71 -13
  970. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  971. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +120 -1
  972. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  973. package/src/resources/extensions/claude-code-cli/index.ts +8 -1
  974. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  975. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +726 -495
  976. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +47 -0
  977. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1112 -7
  978. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -0
  979. package/src/resources/extensions/github-sync/templates.ts +3 -3
  980. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  981. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  982. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  983. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  984. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  985. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  986. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  987. package/src/resources/extensions/gsd/auto/dispatch-history.ts +186 -0
  988. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  989. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  990. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  991. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  992. package/src/resources/extensions/gsd/auto/loop.ts +158 -63
  993. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  994. package/src/resources/extensions/gsd/auto/orchestrator.ts +401 -79
  995. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  996. package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
  997. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
  998. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  999. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  1000. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  1001. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
  1002. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  1003. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  1004. package/src/resources/extensions/gsd/auto-artifact-paths.ts +83 -20
  1005. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  1006. package/src/resources/extensions/gsd/auto-dashboard.ts +328 -458
  1007. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +33 -50
  1008. package/src/resources/extensions/gsd/auto-dispatch.ts +125 -80
  1009. package/src/resources/extensions/gsd/auto-model-selection.ts +74 -15
  1010. package/src/resources/extensions/gsd/auto-post-unit.ts +107 -46
  1011. package/src/resources/extensions/gsd/auto-prompts.ts +270 -74
  1012. package/src/resources/extensions/gsd/auto-recovery.ts +176 -87
  1013. package/src/resources/extensions/gsd/auto-runtime-state.ts +39 -0
  1014. package/src/resources/extensions/gsd/auto-start.ts +146 -88
  1015. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  1016. package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
  1017. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  1018. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
  1019. package/src/resources/extensions/gsd/auto-verification.ts +37 -42
  1020. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  1021. package/src/resources/extensions/gsd/auto-worktree.ts +180 -407
  1022. package/src/resources/extensions/gsd/auto.ts +220 -54
  1023. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  1024. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +69 -58
  1025. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  1026. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +93 -49
  1027. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  1028. package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
  1029. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  1030. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +46 -1
  1031. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +496 -184
  1032. package/src/resources/extensions/gsd/bootstrap/system-context.ts +185 -46
  1033. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
  1034. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +585 -82
  1035. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  1036. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  1037. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  1038. package/src/resources/extensions/gsd/captures.ts +5 -16
  1039. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +132 -6
  1040. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  1041. package/src/resources/extensions/gsd/closeout-wizard.ts +111 -0
  1042. package/src/resources/extensions/gsd/codebase-generator.ts +1 -0
  1043. package/src/resources/extensions/gsd/commands/catalog.ts +12 -68
  1044. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  1045. package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
  1046. package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
  1047. package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
  1048. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  1049. package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -8
  1050. package/src/resources/extensions/gsd/commands/handlers/ops.ts +230 -3
  1051. package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
  1052. package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
  1053. package/src/resources/extensions/gsd/commands-handlers.ts +140 -4
  1054. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  1055. package/src/resources/extensions/gsd/commands-maintenance.ts +172 -42
  1056. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  1057. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +13 -0
  1058. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  1059. package/src/resources/extensions/gsd/commands-verdict.ts +22 -4
  1060. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  1061. package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
  1062. package/src/resources/extensions/gsd/compat/index.ts +12 -0
  1063. package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
  1064. package/src/resources/extensions/gsd/config-overlay.ts +24 -9
  1065. package/src/resources/extensions/gsd/consent-question.ts +441 -0
  1066. package/src/resources/extensions/gsd/consent-verdict.ts +115 -0
  1067. package/src/resources/extensions/gsd/constants.ts +0 -3
  1068. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  1069. package/src/resources/extensions/gsd/dashboard-overlay.ts +41 -4
  1070. package/src/resources/extensions/gsd/db/engine.ts +855 -0
  1071. package/src/resources/extensions/gsd/db/queries.ts +597 -0
  1072. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  1073. package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
  1074. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  1075. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  1076. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  1077. package/src/resources/extensions/gsd/db/writers/reconcile.ts +523 -0
  1078. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  1079. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  1080. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  1081. package/src/resources/extensions/gsd/db-workspace.ts +185 -0
  1082. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  1083. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  1084. package/src/resources/extensions/gsd/discussion-handoff.ts +280 -0
  1085. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  1086. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  1087. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  1088. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  1089. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  1090. package/src/resources/extensions/gsd/doctor-git-checks.ts +33 -25
  1091. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  1092. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +34 -42
  1093. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  1094. package/src/resources/extensions/gsd/doctor.ts +45 -12
  1095. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  1096. package/src/resources/extensions/gsd/error-classifier.ts +25 -1
  1097. package/src/resources/extensions/gsd/escalation.ts +9 -4
  1098. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  1099. package/src/resources/extensions/gsd/export-html.ts +11 -4
  1100. package/src/resources/extensions/gsd/export.ts +88 -1
  1101. package/src/resources/extensions/gsd/file-lock.ts +1 -1
  1102. package/src/resources/extensions/gsd/files.ts +33 -12
  1103. package/src/resources/extensions/gsd/flat-phase-migration.ts +205 -0
  1104. package/src/resources/extensions/gsd/forensics.ts +2 -1
  1105. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  1106. package/src/resources/extensions/gsd/git-constants.ts +1 -1
  1107. package/src/resources/extensions/gsd/git-service.ts +8 -2
  1108. package/src/resources/extensions/gsd/gitignore.ts +10 -3
  1109. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  1110. package/src/resources/extensions/gsd/gsd-db.ts +189 -2380
  1111. package/src/resources/extensions/gsd/guidance.ts +217 -0
  1112. package/src/resources/extensions/gsd/guided-flow.ts +250 -590
  1113. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  1114. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  1115. package/src/resources/extensions/gsd/layout-policy.ts +85 -0
  1116. package/src/resources/extensions/gsd/markdown-renderer.ts +417 -105
  1117. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  1118. package/src/resources/extensions/gsd/mcp-filter.ts +63 -34
  1119. package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
  1120. package/src/resources/extensions/gsd/md-importer.ts +218 -68
  1121. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  1122. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  1123. package/src/resources/extensions/gsd/metrics.ts +23 -10
  1124. package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
  1125. package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
  1126. package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
  1127. package/src/resources/extensions/gsd/migrate-external.ts +49 -6
  1128. package/src/resources/extensions/gsd/migration-auto-check.ts +34 -18
  1129. package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
  1130. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  1131. package/src/resources/extensions/gsd/milestone-closeout.ts +133 -29
  1132. package/src/resources/extensions/gsd/milestone-ids.ts +49 -19
  1133. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  1134. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +232 -0
  1135. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  1136. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  1137. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  1138. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  1139. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +78 -0
  1140. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  1141. package/src/resources/extensions/gsd/model-router.ts +101 -18
  1142. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -0
  1143. package/src/resources/extensions/gsd/notification-store.ts +43 -31
  1144. package/src/resources/extensions/gsd/notifications.ts +50 -12
  1145. package/src/resources/extensions/gsd/observability-validator.ts +12 -4
  1146. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  1147. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  1148. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +161 -38
  1149. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  1150. package/src/resources/extensions/gsd/parsers-legacy.ts +58 -19
  1151. package/src/resources/extensions/gsd/paths.ts +390 -61
  1152. package/src/resources/extensions/gsd/planning-depth.ts +2 -1
  1153. package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
  1154. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  1155. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  1156. package/src/resources/extensions/gsd/preferences-models.ts +58 -59
  1157. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  1158. package/src/resources/extensions/gsd/preferences.ts +372 -35
  1159. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  1160. package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  1161. package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  1162. package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  1163. package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  1164. package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
  1165. package/src/resources/extensions/gsd/prompts/code-review.md +37 -0
  1166. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  1167. package/src/resources/extensions/gsd/prompts/complete-slice.md +25 -15
  1168. package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  1169. package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
  1170. package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  1171. package/src/resources/extensions/gsd/prompts/execute-task.md +9 -2
  1172. package/src/resources/extensions/gsd/prompts/explore.md +58 -0
  1173. package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
  1174. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  1175. package/src/resources/extensions/gsd/prompts/health.md +37 -0
  1176. package/src/resources/extensions/gsd/prompts/import.md +30 -0
  1177. package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
  1178. package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  1179. package/src/resources/extensions/gsd/prompts/manager.md +21 -0
  1180. package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  1181. package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  1182. package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  1183. package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
  1184. package/src/resources/extensions/gsd/prompts/phase.md +22 -0
  1185. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  1186. package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  1187. package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  1188. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  1189. package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
  1190. package/src/resources/extensions/gsd/prompts/progress.md +30 -0
  1191. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  1192. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  1193. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  1194. package/src/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  1195. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  1196. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  1197. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  1198. package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
  1199. package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  1200. package/src/resources/extensions/gsd/prompts/review.md +27 -0
  1201. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  1202. package/src/resources/extensions/gsd/prompts/run-uat.md +13 -5
  1203. package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  1204. package/src/resources/extensions/gsd/prompts/settings.md +24 -0
  1205. package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
  1206. package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  1207. package/src/resources/extensions/gsd/prompts/spike.md +59 -0
  1208. package/src/resources/extensions/gsd/prompts/stats.md +43 -0
  1209. package/src/resources/extensions/gsd/prompts/surface.md +25 -0
  1210. package/src/resources/extensions/gsd/prompts/system.md +6 -3
  1211. package/src/resources/extensions/gsd/prompts/thread.md +24 -0
  1212. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  1213. package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  1214. package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
  1215. package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  1216. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  1217. package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  1218. package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
  1219. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  1220. package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
  1221. package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
  1222. package/src/resources/extensions/gsd/provider-error-guidance.ts +36 -9
  1223. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  1224. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  1225. package/src/resources/extensions/gsd/publication.ts +122 -0
  1226. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  1227. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  1228. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  1229. package/src/resources/extensions/gsd/queue-order.ts +3 -2
  1230. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  1231. package/src/resources/extensions/gsd/recovery-classification.ts +54 -88
  1232. package/src/resources/extensions/gsd/roadmap-slices.ts +37 -6
  1233. package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
  1234. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  1235. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  1236. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +52 -3
  1237. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  1238. package/src/resources/extensions/gsd/service-tier.ts +2 -0
  1239. package/src/resources/extensions/gsd/session-lock.ts +16 -14
  1240. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  1241. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
  1242. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
  1243. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  1244. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +58 -14
  1245. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
  1246. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
  1247. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
  1248. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
  1249. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
  1250. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +98 -26
  1251. package/src/resources/extensions/gsd/state-reconciliation/index.ts +36 -3
  1252. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +12 -0
  1253. package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
  1254. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  1255. package/src/resources/extensions/gsd/state.ts +87 -41
  1256. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  1257. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  1258. package/src/resources/extensions/gsd/sync-lock.ts +11 -20
  1259. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  1260. package/src/resources/extensions/gsd/templates/project.md +1 -0
  1261. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  1262. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  1263. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
  1264. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
  1265. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
  1266. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
  1267. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
  1268. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
  1269. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
  1270. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
  1271. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  1272. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  1273. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +322 -1
  1274. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  1275. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  1276. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +97 -117
  1277. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  1278. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +753 -26
  1279. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
  1280. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  1281. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +25 -2
  1282. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +107 -1
  1283. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +409 -38
  1284. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  1285. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
  1286. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +100 -5
  1287. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  1288. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  1289. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  1290. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  1291. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  1292. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  1293. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  1294. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
  1295. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  1296. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  1297. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  1298. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  1299. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  1300. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  1301. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  1302. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  1303. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  1304. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  1305. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +26 -0
  1306. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
  1307. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
  1308. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  1309. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
  1310. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +862 -0
  1311. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +47 -9
  1312. package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
  1313. package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
  1314. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
  1315. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  1316. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +82 -0
  1317. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  1318. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -7
  1319. package/src/resources/extensions/gsd/tests/complete-task.test.ts +148 -12
  1320. package/src/resources/extensions/gsd/tests/consent-question.test.ts +396 -0
  1321. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  1322. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  1323. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +37 -0
  1324. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  1325. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  1326. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  1327. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  1328. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  1329. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  1330. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
  1331. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +111 -5
  1332. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  1333. package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
  1334. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  1335. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +54 -4
  1336. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  1337. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +430 -0
  1338. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  1339. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +38 -49
  1340. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  1341. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
  1342. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +15 -0
  1343. package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
  1344. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  1345. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  1346. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  1347. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  1348. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  1349. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  1350. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  1351. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
  1352. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
  1353. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  1354. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  1355. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  1356. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  1357. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
  1358. package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
  1359. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +88 -1
  1360. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
  1361. package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
  1362. package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
  1363. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  1364. package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
  1365. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  1366. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  1367. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +114 -0
  1368. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
  1369. package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
  1370. package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
  1371. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
  1372. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  1373. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  1374. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +154 -1
  1375. package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
  1376. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
  1377. package/src/resources/extensions/gsd/tests/guidance.test.ts +173 -0
  1378. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  1379. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
  1380. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +133 -15
  1381. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  1382. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
  1383. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  1384. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  1385. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
  1386. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  1387. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
  1388. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
  1389. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
  1390. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  1391. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  1392. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  1393. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +372 -0
  1394. package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
  1395. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  1396. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
  1397. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
  1398. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
  1399. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  1400. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  1401. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  1402. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  1403. package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
  1404. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  1405. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  1406. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +125 -4
  1407. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  1408. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  1409. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  1410. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  1411. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +97 -0
  1412. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  1413. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  1414. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  1415. package/src/resources/extensions/gsd/tests/model-router.test.ts +343 -7
  1416. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  1417. package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
  1418. package/src/resources/extensions/gsd/tests/notification-store.test.ts +55 -0
  1419. package/src/resources/extensions/gsd/tests/notifications.test.ts +97 -9
  1420. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +179 -0
  1421. package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
  1422. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  1423. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +339 -0
  1424. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
  1425. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
  1426. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  1427. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  1428. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  1429. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  1430. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  1431. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  1432. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
  1433. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
  1434. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +54 -6
  1435. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  1436. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +58 -23
  1437. package/src/resources/extensions/gsd/tests/plan-task.test.ts +4 -4
  1438. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +64 -0
  1439. package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
  1440. package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
  1441. package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
  1442. package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
  1443. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
  1444. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  1445. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
  1446. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  1447. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  1448. package/src/resources/extensions/gsd/tests/preferences.test.ts +230 -1
  1449. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  1450. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  1451. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  1452. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +72 -2
  1453. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  1454. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +18 -3
  1455. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +118 -4
  1456. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  1457. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  1458. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  1459. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
  1460. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
  1461. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  1462. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  1463. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  1464. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  1465. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  1466. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +421 -5
  1467. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  1468. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
  1469. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  1470. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  1471. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  1472. package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
  1473. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +51 -2
  1474. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  1475. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
  1476. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +148 -0
  1477. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  1478. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  1479. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +301 -41
  1480. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  1481. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
  1482. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  1483. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
  1484. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +155 -58
  1485. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  1486. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  1487. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  1488. package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
  1489. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  1490. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
  1491. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
  1492. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
  1493. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  1494. package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
  1495. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  1496. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  1497. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  1498. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  1499. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  1500. package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
  1501. package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
  1502. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +348 -0
  1503. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +56 -0
  1504. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  1505. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  1506. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  1507. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -6
  1508. package/src/resources/extensions/gsd/tests/undo.test.ts +39 -37
  1509. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  1510. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -2
  1511. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  1512. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +62 -0
  1513. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  1514. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  1515. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +72 -1
  1516. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  1517. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  1518. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
  1519. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +51 -0
  1520. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
  1521. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  1522. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +90 -0
  1523. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
  1524. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
  1525. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
  1526. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  1527. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
  1528. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +133 -0
  1529. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  1530. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +227 -21
  1531. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  1532. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
  1533. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  1534. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  1535. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +339 -48
  1536. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  1537. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  1538. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
  1539. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  1540. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +105 -1
  1541. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  1542. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  1543. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  1544. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  1545. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  1546. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +114 -19
  1547. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  1548. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  1549. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  1550. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  1551. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  1552. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
  1553. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  1554. package/src/resources/extensions/gsd/tests/write-gate.test.ts +291 -1
  1555. package/src/resources/extensions/gsd/tool-contract.ts +124 -11
  1556. package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
  1557. package/src/resources/extensions/gsd/tool-surface-readiness.ts +393 -0
  1558. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  1559. package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -9
  1560. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -79
  1561. package/src/resources/extensions/gsd/tools/complete-task.ts +105 -3
  1562. package/src/resources/extensions/gsd/tools/exec-tool.ts +6 -121
  1563. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  1564. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -9
  1565. package/src/resources/extensions/gsd/tools/plan-task.ts +19 -3
  1566. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +54 -12
  1567. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  1568. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  1569. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  1570. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  1571. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  1572. package/src/resources/extensions/gsd/tools/validate-milestone.ts +26 -90
  1573. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +123 -5
  1574. package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
  1575. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  1576. package/src/resources/extensions/gsd/uat-policy.ts +80 -25
  1577. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  1578. package/src/resources/extensions/gsd/undo.ts +17 -17
  1579. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  1580. package/src/resources/extensions/gsd/unit-context-composer.ts +196 -21
  1581. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  1582. package/src/resources/extensions/gsd/unit-registry.ts +466 -0
  1583. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  1584. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
  1585. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +60 -1
  1586. package/src/resources/extensions/gsd/validation-block-guard.ts +48 -0
  1587. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  1588. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  1589. package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
  1590. package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
  1591. package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
  1592. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  1593. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  1594. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  1595. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  1596. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  1597. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  1598. package/src/resources/extensions/gsd/workflow-mcp.ts +34 -111
  1599. package/src/resources/extensions/gsd/workflow-projections.ts +24 -4
  1600. package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
  1601. package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
  1602. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  1603. package/src/resources/extensions/gsd/worktree-command.ts +6 -6
  1604. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  1605. package/src/resources/extensions/gsd/worktree-health.ts +6 -3
  1606. package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
  1607. package/src/resources/extensions/gsd/worktree-manager.ts +175 -45
  1608. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  1609. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  1610. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  1611. package/src/resources/extensions/gsd/worktree-safety.ts +73 -48
  1612. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  1613. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  1614. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  1615. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  1616. package/src/resources/extensions/gsd/worktree.ts +7 -1
  1617. package/src/resources/extensions/mcp-client/manager.ts +10 -4
  1618. package/src/resources/extensions/search-the-web/index.ts +45 -9
  1619. package/src/resources/extensions/search-the-web/native-search.ts +21 -7
  1620. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  1621. package/src/resources/extensions/shared/gsd-browser-cli.ts +182 -8
  1622. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  1623. package/src/resources/extensions/subagent/index.ts +20 -15
  1624. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  1625. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  1626. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  1627. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  1628. package/src/resources/shared/package-manager-detection.ts +1 -1
  1629. package/src/resources/shared/package.json +3 -0
  1630. package/src/resources/skills/create-skill/SKILL.md +3 -0
  1631. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  1632. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  1633. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  1634. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  1635. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  1636. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  1637. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  1638. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  1639. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  1640. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -195
  1641. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  1642. package/dist/web/standalone/.next/server/chunks/5047.js +0 -2
  1643. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  1644. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  1645. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  1646. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  1647. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  1648. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  1649. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  1650. package/dist/web/standalone/.next/static/chunks/app/page-a48b7c48333b31c8.js +0 -1
  1651. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  1652. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
  1653. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
  1654. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
  1655. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
  1656. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
  1657. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
  1658. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
  1659. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
  1660. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
  1661. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
  1662. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
  1663. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
  1664. package/scripts/ensure-workspace-builds.cjs +0 -129
  1665. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
  1666. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
  1667. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  1668. /package/dist/web/standalone/.next/static/{TA5o9SHAnCdK6Umm1MYxb → BTKtGFF1Y-hvVJEGhBRo9}/_buildManifest.js +0 -0
  1669. /package/dist/web/standalone/.next/static/{TA5o9SHAnCdK6Umm1MYxb → BTKtGFF1Y-hvVJEGhBRo9}/_ssgManifest.js +0 -0
@@ -27,13 +27,30 @@ import { homedir } from "node:os";
27
27
  import { createRequire } from "node:module";
28
28
  import { dirname, join } from "node:path";
29
29
  import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
30
+ import {
31
+ attachExternalResultsToToolBlocks,
32
+ buildFinalAssistantContent,
33
+ extractToolResultsFromSdkUserMessage,
34
+ handleClaudeCodePartialStreamEvent,
35
+ shouldSuppressDuplicateToolUnavailableBlock,
36
+ } from "./turn-assembler.js";
37
+ import type {
38
+ ExternalToolResultPayload,
39
+ ToolCallWithExternalResult,
40
+ } from "./turn-assembler.js";
30
41
  import {
31
42
  buildWorkflowMcpServers,
32
43
  getRequiredWorkflowToolsForAutoUnit,
33
44
  resolveWorkflowMcpProjectRoot,
34
45
  } from "../gsd/workflow-mcp.js";
46
+ import { resolveWorkflowQuestionToolSurface } from "../gsd/question-transport.js";
35
47
  import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
36
48
  import { loadProjectGSDPreferences } from "../gsd/preferences.js";
49
+ import { markToolStart, markToolEnd } from "../gsd/auto.js";
50
+ import {
51
+ markInteractiveElicitationStart,
52
+ markInteractiveElicitationEnd,
53
+ } from "../gsd/auto-tool-tracking.js";
37
54
  import {
38
55
  discoverBrowserMcpServerName,
39
56
  discoverMcpServers,
@@ -43,9 +60,24 @@ import {
43
60
  computeMcpDisallowedTools,
44
61
  } from "../gsd/mcp-filter.js";
45
62
  import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
63
+ import { getUnitToolSurfaceContract } from "../gsd/unit-tool-contracts.js";
64
+ import {
65
+ awaitWorkflowMcpToolRegistration,
66
+ getToolSurfaceReadinessError,
67
+ POST_PREFLIGHT_READINESS_RETRY_DELAYS_MS,
68
+ POST_PREFLIGHT_SDK_SETTLE_MS,
69
+ TOOL_SURFACE_NOT_READY,
70
+ type LiveToolSurfaceObservation,
71
+ } from "../gsd/tool-surface-readiness.js";
72
+ import {
73
+ beginWorkflowMcpSdkSession,
74
+ endWorkflowMcpSdkSession,
75
+ } from "../gsd/workflow-mcp-readiness-cache.js";
76
+ import { getGuidedUnitContext } from "../gsd/guided-unit-context.js";
77
+ import { getActiveAutoUnitType, isAutoActive } from "../gsd/auto-runtime-state.js";
78
+ import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
46
79
  import { showInterviewRound, type Question, type RoundResult } from "../shared/tui.js";
47
80
  import type {
48
- BetaRawMessageStreamEvent,
49
81
  SDKAssistantMessage,
50
82
  SDKMessage,
51
83
  SDKPartialAssistantMessage,
@@ -53,25 +85,18 @@ import type {
53
85
  SDKUserMessage,
54
86
  } from "./sdk-types.js";
55
87
 
56
- /** A single content block returned by an external (SDK-executed) tool call. */
57
- export interface ExternalToolResultContentBlock {
58
- type: string;
59
- text?: string;
60
- data?: string;
61
- mimeType?: string;
62
- }
63
-
64
- /** The full result payload returned by an external tool, including content blocks and error status. */
65
- export interface ExternalToolResultPayload {
66
- content: ExternalToolResultContentBlock[];
67
- details?: Record<string, unknown>;
68
- isError: boolean;
69
- }
70
-
71
- /** A `ToolCall` block augmented with the external result attached by the SDK synthetic user message. */
72
- type ToolCallWithExternalResult = ToolCall & {
73
- externalResult?: ExternalToolResultPayload;
74
- };
88
+ export {
89
+ buildFinalAssistantContent,
90
+ extractToolResultsFromSdkUserMessage,
91
+ handleClaudeCodePartialStreamEvent,
92
+ mergePendingToolCalls,
93
+ shouldSuppressDuplicateToolUnavailableBlock,
94
+ } from "./turn-assembler.js";
95
+ export type {
96
+ ExternalToolResultContentBlock,
97
+ ExternalToolResultPayload,
98
+ ToolCallWithExternalResult,
99
+ } from "./turn-assembler.js";
75
100
 
76
101
  interface PromptToolContextOptions {
77
102
  workflowMcpServerName?: string | null;
@@ -83,6 +108,11 @@ interface ClaudeCodeStreamOptions extends SimpleStreamOptions {
83
108
  extensionUIContext?: ExtensionUIContext;
84
109
  onExternalToolCall?: (toolCall: ToolCall) => Promise<void> | void;
85
110
  onExternalToolResult?: (event: { toolCall: ToolCall; result: ExternalToolResultPayload }) => Promise<void> | void;
111
+ _sdkQueryForTest?: (args: {
112
+ prompt: string | AsyncIterable<unknown>;
113
+ options?: Record<string, unknown>;
114
+ }) => AsyncIterable<SDKMessage>;
115
+ _skipWorkflowMcpPreflightForTest?: boolean;
86
116
  }
87
117
 
88
118
  export function serverToolUseToToolCallLike(block: {
@@ -336,26 +366,46 @@ function extractMessageText(msg: { role: string; content: unknown }): string {
336
366
  return "";
337
367
  }
338
368
 
369
+ // Patterns are anchored to the `UNIT: <Phase>` dispatch header ONLY. The old
370
+ // patterns also matched bare slugs (`run-uat`, `plan-slice`, `gsd_plan_slice`,
371
+ // …) anywhere in the text, so any incidental occurrence — a branch name like
372
+ // `milestone/M039`, an untracked file `m039-s05-…spec.ts`, a forensic report,
373
+ // or the user literally typing "slice"/"UAT" while describing a problem — would
374
+ // misclassify the turn as a dispatched unit. Only the dispatch header is an
375
+ // authoritative phase signal, so match nothing else.
339
376
  const GSD_PHASE_PATTERNS: Array<[string, RegExp]> = [
340
- ["run-uat", /\b(?:UNIT:\s*Run UAT|run-uat)\b/i],
341
- ["complete-milestone", /\b(?:UNIT:\s*Complete Milestone|complete-milestone)\b/i],
342
- ["validate-milestone", /\b(?:UNIT:\s*Validate Milestone|validate-milestone)\b/i],
343
- ["reassess-roadmap", /\b(?:UNIT:\s*Reassess Roadmap|reassess-roadmap)\b/i],
344
- ["complete-slice", /\b(?:UNIT:\s*Complete Slice|complete-slice)\b/i],
345
- ["replan-slice", /\b(?:UNIT:\s*Replan Slice|replan-slice)\b/i],
346
- ["plan-slice", /\b(?:UNIT:\s*Plan Slice|plan-slice|gsd_plan_slice)\b/i],
347
- ["plan-milestone", /\b(?:UNIT:\s*Plan Milestone|plan-milestone|gsd_plan_milestone)\b/i],
348
- ["execute-task", /\b(?:UNIT:\s*Execute Task|execute-task|execute-task-simple|reactive-execute)\b/i],
349
- ["gate-evaluate", /\b(?:UNIT:\s*Gate Evaluate|gate-evaluate|gsd_save_gate_result)\b/i],
350
- ["research-milestone", /\b(?:UNIT:\s*Research Milestone|research-milestone)\b/i],
351
- ["research-slice", /\b(?:UNIT:\s*Research Slice|research-slice)\b/i],
352
- ["discuss-milestone", /\b(?:Discuss milestone|discuss-milestone)\b/i],
377
+ ["run-uat", /\bUNIT:\s*Run UAT\b/i],
378
+ ["complete-milestone", /\bUNIT:\s*Complete Milestone\b/i],
379
+ ["validate-milestone", /\bUNIT:\s*Validate Milestone\b/i],
380
+ ["reassess-roadmap", /\bUNIT:\s*Reassess Roadmap\b/i],
381
+ ["complete-slice", /\bUNIT:\s*Complete Slice\b/i],
382
+ ["replan-slice", /\bUNIT:\s*Replan Slice\b/i],
383
+ ["refine-slice", /\bUNIT:\s*Refine Slice\b/i],
384
+ ["plan-slice", /\bUNIT:\s*Plan Slice\b/i],
385
+ ["plan-milestone", /\bUNIT:\s*Plan Milestone\b/i],
386
+ ["execute-task", /\bUNIT:\s*Execute Task\b/i],
387
+ ["gate-evaluate", /\bUNIT:\s*Gate Evaluate\b/i],
388
+ ["research-milestone", /\bUNIT:\s*Research Milestone\b/i],
389
+ ["research-slice", /\bUNIT:\s*Research Slice\b/i],
390
+ ["research-decision", /\bUNIT:\s*Research Decision\b/i],
391
+ ["discuss-milestone", /\bUNIT:\s*Discuss Milestone\b/i],
392
+ ["discuss-slice", /\bUNIT:\s*Discuss Slice\b/i],
393
+ ["discuss-project", /\bUNIT:\s*Discuss Project\b/i],
394
+ ["discuss-requirements", /\bUNIT:\s*Discuss Requirements\b/i],
353
395
  ];
354
396
 
397
+ /** The set of GSD phases this adapter recognises, derived from the patterns above. */
398
+ const KNOWN_GSD_PHASES = new Set(GSD_PHASE_PATTERNS.map(([phase]) => phase));
399
+
355
400
  export function inferGsdPhaseFromContext(context: Context): string | undefined {
401
+ // Scan only the system prompt and the most recent user directive. Scanning
402
+ // the entire scrollback let a phase header that merely appeared in history
403
+ // (e.g. a SUMMARY the agent read, or a pasted prior dispatch) re-classify
404
+ // every subsequent turn.
405
+ const lastUser = [...context.messages].reverse().find((m) => m.role === "user");
356
406
  const text = [
357
407
  context.systemPrompt ?? "",
358
- ...context.messages.map((message) => extractMessageText(message)),
408
+ lastUser ? extractMessageText(lastUser) : "",
359
409
  ].join("\n");
360
410
  for (const [phase, pattern] of GSD_PHASE_PATTERNS) {
361
411
  if (pattern.test(text)) return phase;
@@ -363,6 +413,47 @@ export function inferGsdPhaseFromContext(context: Context): string | undefined {
363
413
  return undefined;
364
414
  }
365
415
 
416
+ /**
417
+ * Resolve the GSD unit phase for Claude Code SDK sessions. Guided-flow
418
+ * dispatch records the authoritative unit type before the turn is queued;
419
+ * prefer that over regex inference from prompt text.
420
+ */
421
+ export function resolveGsdPhaseForSdk(context: Context, projectRoot: string): string | undefined {
422
+ const resolvedRoot = resolveWorkflowMcpProjectRoot(projectRoot);
423
+ const guided =
424
+ getGuidedUnitContext(resolvedRoot)
425
+ ?? getGuidedUnitContext(projectRoot)
426
+ ?? getGuidedUnitContext();
427
+ if (guided?.unitType) {
428
+ const guidedRoot = resolveWorkflowMcpProjectRoot(guided.basePath);
429
+ if (guidedRoot === resolvedRoot) {
430
+ return guided.unitType;
431
+ }
432
+ }
433
+ // Auto-mode records the dispatched unit type before each turn — that is the
434
+ // authoritative phase, so prefer it over any inference. (Guided interactive
435
+ // dispatch is handled above via getGuidedUnitContext.) Ignore `hook/*`
436
+ // pseudo-units and anything not a recognised GSD phase.
437
+ const autoUnit = getActiveAutoUnitType();
438
+ if (autoUnit && KNOWN_GSD_PHASES.has(autoUnit)) {
439
+ return autoUnit;
440
+ }
441
+
442
+ // No authoritative guided/auto signal → ad-hoc turn. Do NOT regex-infer a
443
+ // phase from prose: that would fire the workflow MCP preflight and, for
444
+ // run-uat, strip Bash/Write/Edit/gsd_exec for the rest of the session the
445
+ // moment the conversation (or the GSD system prompt itself) happened to
446
+ // mention a phase token. An ad-hoc turn keeps the full tool surface.
447
+ //
448
+ // The header-anchored inference remains only as a last resort while auto is
449
+ // running but the current unit wasn't recorded for some reason; even then it
450
+ // matches the `UNIT:` dispatch header only, never bare slugs in scrollback.
451
+ if (!isAutoActive()) {
452
+ return undefined;
453
+ }
454
+ return inferGsdPhaseFromContext(context);
455
+ }
456
+
366
457
  /**
367
458
  * Build a full conversational prompt from GSD's context messages.
368
459
  *
@@ -388,10 +479,15 @@ export function buildPromptFromContext(context: Context, toolContext: PromptTool
388
479
  const workflowToolLine = toolContext.workflowMcpServerName
389
480
  ? "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
390
481
  `are MCP tools — call them as mcp__${toolContext.workflowMcpServerName}__<tool_name> ` +
391
- `(e.g. mcp__${toolContext.workflowMcpServerName}__gsd_exec, mcp__${toolContext.workflowMcpServerName}__gsd_save_gate_result)\n`
482
+ `(e.g. mcp__${toolContext.workflowMcpServerName}__gsd_exec, mcp__${toolContext.workflowMcpServerName}__gsd_save_gate_result)\n` +
483
+ `- Structured user input: call mcp__${toolContext.workflowMcpServerName}__ask_user_questions. ` +
484
+ "Do not call bare ask_user_questions. Do not call native AskUserQuestion.\n"
392
485
  : "- GSD workflow MCP tools are unavailable in this Claude Code run.\n";
393
486
  const toolSearchLine = toolContext.workflowMcpServerName
394
- ? "- ToolSearch is NOT available never use it to discover tools; invoke the MCP tool directly\n"
487
+ ? "- ToolSearch is available only for Claude Code deferred workflow MCP hydration. " +
488
+ `If mcp__${toolContext.workflowMcpServerName}__<tool_name> is missing or Claude Code reports the server is still connecting, ` +
489
+ `use ToolSearch with select:mcp__${toolContext.workflowMcpServerName}__<tool_name> or the base tool name, then call the returned MCP tool directly. ` +
490
+ "Do not use ToolSearch for browser_* tools or general discovery.\n"
395
491
  : "- ToolSearch is NOT available — never use it to discover tools\n";
396
492
  const browserToolLine = toolContext.browserMcpServerName
397
493
  ? "- Browser verification uses gsd-browser MCP by default — call browser tools as " +
@@ -502,9 +598,11 @@ export function buildSdkQueryPrompt(
502
598
  parent_tool_use_id: null,
503
599
  };
504
600
 
505
- return (async function* () {
506
- yield sdkMessage;
507
- })();
601
+ return {
602
+ async *[Symbol.asyncIterator]() {
603
+ yield sdkMessage;
604
+ },
605
+ };
508
606
  }
509
607
 
510
608
  // ---------------------------------------------------------------------------
@@ -526,6 +624,59 @@ function makeErrorMessage(model: string, errorMsg: string): AssistantMessage {
526
624
  };
527
625
  }
528
626
 
627
+ export interface WorkflowMcpReadinessProgressState {
628
+ contentIndex?: number;
629
+ }
630
+
631
+ export function buildWorkflowMcpReadinessProgressMessage(input: {
632
+ unitType: string;
633
+ workflowServerName: string;
634
+ stage: "preflight" | "retry";
635
+ attempt?: number;
636
+ delayMs?: number;
637
+ }): string {
638
+ const { unitType, workflowServerName, stage } = input;
639
+ if (stage === "preflight") {
640
+ return `Starting ${workflowServerName} MCP for ${unitType}; waiting for workflow tools to register...`;
641
+ }
642
+
643
+ const attempt = input.attempt === undefined ? "" : ` attempt ${input.attempt}`;
644
+ const delay = input.delayMs === undefined ? "" : ` Retrying in ${formatReadinessDelay(input.delayMs)}.`;
645
+ return `Still waiting for ${workflowServerName} MCP tools for ${unitType}${attempt}.${delay}`;
646
+ }
647
+
648
+ function formatReadinessDelay(delayMs: number): string {
649
+ if (delayMs < 1_000) return `${delayMs}ms`;
650
+ const seconds = delayMs / 1_000;
651
+ return Number.isInteger(seconds) ? `${seconds}s` : `${seconds.toFixed(1)}s`;
652
+ }
653
+
654
+ export function pushWorkflowMcpReadinessProgressEvent(input: {
655
+ stream: Pick<AssistantMessageEventStream, "push">;
656
+ partial: AssistantMessage;
657
+ state: WorkflowMcpReadinessProgressState;
658
+ message: string;
659
+ }): void {
660
+ const { stream, partial, state, message } = input;
661
+ if (!message) return;
662
+
663
+ let contentIndex = state.contentIndex;
664
+ const existing = contentIndex === undefined ? undefined : partial.content[contentIndex];
665
+ if (contentIndex === undefined || existing?.type !== "text") {
666
+ contentIndex = partial.content.length;
667
+ state.contentIndex = contentIndex;
668
+ partial.content.push({ type: "text", text: "" });
669
+ stream.push({ type: "text_start", contentIndex, partial });
670
+ }
671
+
672
+ const block = partial.content[contentIndex];
673
+ if (block.type !== "text") return;
674
+
675
+ const delta = block.text.length === 0 ? message : `\n${message}`;
676
+ block.text += delta;
677
+ stream.push({ type: "text_delta", contentIndex, delta, partial });
678
+ }
679
+
529
680
  export function isClaudeCodeAbortErrorMessage(message: string | undefined | null): boolean {
530
681
  if (!message) return false;
531
682
  return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user|aborterror)\b/i.test(message);
@@ -1359,7 +1510,27 @@ export function createClaudeCodeCanUseToolHandler(
1359
1510
  // Elicitation handler
1360
1511
  // ---------------------------------------------------------------------------
1361
1512
 
1362
- /** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
1513
+ /**
1514
+ * Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available.
1515
+ *
1516
+ * For structured (AskUserQuestion) elicitations, the interview round's result
1517
+ * disambiguates two cases that must not be conflated: an `undefined` result
1518
+ * means the custom UI is unavailable, so we fall back to the simpler `select`
1519
+ * dialogs; an empty-answers result means the user dismissed the question, which
1520
+ * is treated as a clean cancel. Falling back to dialogs on dismissal would
1521
+ * re-ask the same questions (the duplicate-question bug).
1522
+ */
1523
+ /**
1524
+ * Monotonic counter so concurrent/sequential elicitations resolved within the
1525
+ * same millisecond get distinct synthetic in-flight-tool ids (the `cc-elicit-*`
1526
+ * namespace never collides with real MCP toolCallIds).
1527
+ */
1528
+ let _elicitationSeq = 0;
1529
+ function nextElicitationSeq(): number {
1530
+ _elicitationSeq = (_elicitationSeq + 1) % Number.MAX_SAFE_INTEGER;
1531
+ return _elicitationSeq;
1532
+ }
1533
+
1363
1534
  export function createClaudeCodeElicitationHandler(
1364
1535
  ui: ExtensionUIContext | undefined,
1365
1536
  ): ((request: SdkElicitationRequest, options: { signal: AbortSignal }) => Promise<SdkElicitationResult>) | undefined {
@@ -1375,20 +1546,67 @@ export function createClaudeCodeElicitationHandler(
1375
1546
  const headlessAnswer = answerElicitationFromHeadlessAnswers(questions, loadHeadlessAnswers());
1376
1547
  if (headlessAnswer) return headlessAnswer;
1377
1548
 
1378
- const interviewResult = await showInterviewRound(questions, { signal }, { ui } as any).catch(() => undefined);
1379
- if (interviewResult && Object.keys(interviewResult.answers).length > 0) {
1549
+ // The SDK elicitation blocks waiting for human input, but it is not an
1550
+ // MCP tool dispatch, so markToolStart/markToolEnd are never called for
1551
+ // it. Without this the soft/context/idle/hard watchdogs see zero
1552
+ // in-flight tools and re-dispatch (and ultimately abort) the agent
1553
+ // turn hosting this elicitation, tearing the question down (#2676 /
1554
+ // claude-code-cli self-cancel loop). Bracketing the human wait with
1555
+ // the s.active-gated interactive-tool guard makes it visible to
1556
+ // hasInteractiveToolInFlight()/getInFlightToolCount() so those
1557
+ // watchdogs exempt it. No-op outside auto-mode (wrapper self-gates).
1558
+ //
1559
+ // markInteractiveElicitationStart/End is a SEPARATE, ungated signal that
1560
+ // is observable in FOREGROUND (where the s.active-gated markToolStart is a
1561
+ // no-op). The foreground approval-gate pause path (register-hooks
1562
+ // message_update) consults isInteractiveElicitationInFlight() and bails so
1563
+ // it does not tear down the very elicitation that IS the human boundary
1564
+ // (#cc-elicitation-self-cancel). It clears in the finally on every exit.
1565
+ const elicId = "cc-elicit-" + ((request as { id?: string | number }).id ?? `${Date.now()}-${nextElicitationSeq()}`);
1566
+ markInteractiveElicitationStart();
1567
+ markToolStart(elicId, "ask_user_questions");
1568
+ try {
1569
+ const interviewResult = await showInterviewRound(
1570
+ questions,
1571
+ { signal, overlay: true },
1572
+ { ui } as any,
1573
+ ).catch(() => undefined);
1574
+ if (interviewResult === undefined) {
1575
+ // `await` so the dialog human-wait stays inside try/finally and the
1576
+ // in-flight guard is held until the dialog resolves. Without it,
1577
+ // `finally` runs the moment the promise is created and the fallback
1578
+ // wait runs with zero in-flight tools — reintroducing the
1579
+ // self-cancel on this path (Bugbot #1c00624d).
1580
+ return await promptElicitationWithDialogs(request, questions, ui, signal);
1581
+ }
1582
+ if (Object.keys(interviewResult.answers).length === 0) {
1583
+ // A system/host teardown (compaction, session_switch, true
1584
+ // interrupt) that aborted the signal mid-wait sets `interrupted`.
1585
+ // Surface that as a non-affirmative `decline` so it is not
1586
+ // laundered into a clean user-declined `cancel` the model re-asks
1587
+ // against. A genuine user dismissal leaves `interrupted` falsy and
1588
+ // keeps the prior `cancel` semantics.
1589
+ return interviewResult.interrupted ? { action: "decline" } : { action: "cancel" };
1590
+ }
1380
1591
  return {
1381
1592
  action: "accept",
1382
1593
  content: roundResultToElicitationContent(questions, interviewResult),
1383
1594
  };
1595
+ } finally {
1596
+ markToolEnd(elicId);
1597
+ markInteractiveElicitationEnd();
1384
1598
  }
1385
-
1386
- return promptElicitationWithDialogs(request, questions, ui, signal);
1387
1599
  }
1388
1600
 
1389
1601
  const textFields = parseTextInputElicitation(request);
1390
1602
  if (textFields) {
1391
- return promptTextInputElicitation(request, textFields, ui, signal);
1603
+ const elicId = "cc-elicit-" + ((request as { id?: string | number }).id ?? `${Date.now()}-${nextElicitationSeq()}`);
1604
+ markToolStart(elicId, "secure_env_collect");
1605
+ try {
1606
+ return await promptTextInputElicitation(request, textFields, ui, signal);
1607
+ } finally {
1608
+ markToolEnd(elicId);
1609
+ }
1392
1610
  }
1393
1611
 
1394
1612
  return { action: "decline" };
@@ -1468,6 +1686,8 @@ function modelSupportsAdaptiveThinking(modelId: string): boolean {
1468
1686
  || modelId.includes("opus-4.7")
1469
1687
  || modelId.includes("opus-4-8")
1470
1688
  || modelId.includes("opus-4.8")
1689
+ || modelId.includes("fable-5")
1690
+ || modelId.includes("fable.5")
1471
1691
  || modelId.includes("sonnet-4-6")
1472
1692
  || modelId.includes("sonnet-4.6")
1473
1693
  || modelId.includes("sonnet-4-7")
@@ -1493,6 +1713,8 @@ function mapThinkingLevelToAnthropicEffort(level: ThinkingLevel | undefined, mod
1493
1713
  || modelId.includes("opus-4.7")
1494
1714
  || modelId.includes("opus-4-8")
1495
1715
  || modelId.includes("opus-4.8")
1716
+ || modelId.includes("fable-5")
1717
+ || modelId.includes("fable.5")
1496
1718
  ) return "xhigh";
1497
1719
  if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6")) return "max";
1498
1720
  return "high";
@@ -1512,7 +1734,7 @@ function browserMcpServerNameFromAllowedTools(allowedTools: unknown): string | u
1512
1734
  if (typeof toolName !== "string") continue;
1513
1735
  const parsed = parseAllowedMcpToolName(toolName);
1514
1736
  if (!parsed) continue;
1515
- if (parsed.server === "gsd-browser" || parsed.tool.startsWith("browser_")) {
1737
+ if (parsed.server === "gsd-browser" || hasBrowserContractPrefix(parsed.tool)) {
1516
1738
  return parsed.server;
1517
1739
  }
1518
1740
  }
@@ -1525,7 +1747,7 @@ function workflowMcpServerNameFromAllowedTools(allowedTools: unknown): string |
1525
1747
  for (const toolName of allowedTools) {
1526
1748
  if (typeof toolName !== "string") continue;
1527
1749
  const parsed = parseAllowedMcpToolName(toolName);
1528
- if (!parsed || parsed.server === browserServerName || parsed.tool.startsWith("browser_")) continue;
1750
+ if (!parsed || parsed.server === browserServerName || hasBrowserContractPrefix(parsed.tool)) continue;
1529
1751
  return parsed.server;
1530
1752
  }
1531
1753
  return undefined;
@@ -1539,6 +1761,15 @@ function isStringRecord(value: unknown): value is Record<string, string> {
1539
1761
  return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
1540
1762
  }
1541
1763
 
1764
+ export function resolveWorkflowMcpPreflightServerConfig(
1765
+ mcpServers: unknown,
1766
+ workflowServerName: string | undefined,
1767
+ ): Record<string, unknown> | undefined {
1768
+ if (!workflowServerName || !isRecord(mcpServers)) return undefined;
1769
+ const workflowServerConfig = mcpServers[workflowServerName];
1770
+ return isRecord(workflowServerConfig) ? workflowServerConfig : undefined;
1771
+ }
1772
+
1542
1773
  function cloneSdkMcpServerConfig(config: unknown): Record<string, unknown> | undefined {
1543
1774
  if (!isRecord(config)) return undefined;
1544
1775
  const cloned: Record<string, unknown> = {};
@@ -1583,11 +1814,15 @@ function resolveExactWorkflowMcpToolsForPhase(
1583
1814
  workflowExplicitlyBlocked: boolean,
1584
1815
  ): string[] {
1585
1816
  if (!gsdPhase || !workflowServerName || workflowExplicitlyBlocked) return [];
1586
- const requiredTools = gsdPhase === "run-uat"
1817
+ const requestedTools = gsdPhase === "run-uat"
1587
1818
  ? [...RUN_UAT_WORKFLOW_TOOL_NAMES]
1588
- : getRequiredWorkflowToolsForAutoUnit(gsdPhase);
1589
- const supportTools = gsdPhase === "run-uat" ? [] : ["gsd_milestone_status"];
1590
- const requestedToolNames = [...new Set([...requiredTools, ...supportTools])];
1819
+ : [
1820
+ ...(getUnitToolSurfaceContract(gsdPhase)?.allowedGsdTools ?? []),
1821
+ ...getRequiredWorkflowToolsForAutoUnit(gsdPhase),
1822
+ ];
1823
+ const requestedToolNames = [...new Set(
1824
+ requestedTools.filter((toolName) => toolName.startsWith("gsd_") || toolName === "ask_user_questions"),
1825
+ )];
1591
1826
  if (requestedToolNames.length === 0) return [];
1592
1827
  return resolveToolPresentationPlan({
1593
1828
  phase: gsdPhase,
@@ -1597,6 +1832,25 @@ function resolveExactWorkflowMcpToolsForPhase(
1597
1832
  }).presentedToolNames;
1598
1833
  }
1599
1834
 
1835
+ function resolveClaudeNativeToolsForPhase(gsdPhase: string | undefined): string[] {
1836
+ const standardClaudeTools = [
1837
+ "Read",
1838
+ "Write",
1839
+ "Edit",
1840
+ "Glob",
1841
+ "Grep",
1842
+ "Bash",
1843
+ "Agent",
1844
+ "WebFetch",
1845
+ "WebSearch",
1846
+ ];
1847
+ if (!gsdPhase) return standardClaudeTools;
1848
+ if (gsdPhase === "run-uat" || gsdPhase === "complete-slice") {
1849
+ return [...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES];
1850
+ }
1851
+ return standardClaudeTools;
1852
+ }
1853
+
1600
1854
  export function autoInitClaudeCodeWorkflowMcp(cwd: string): void {
1601
1855
  const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
1602
1856
  try {
@@ -1610,6 +1864,70 @@ export function autoInitClaudeCodeWorkflowMcp(cwd: string): void {
1610
1864
  }
1611
1865
  }
1612
1866
 
1867
+ export function resolveClaudeCodeToolSurfaceReadinessError(input: {
1868
+ unitType: string | undefined;
1869
+ workflowServerName: string | undefined;
1870
+ observation: LiveToolSurfaceObservation;
1871
+ projectRoot?: string | undefined;
1872
+ allowPendingToolSearchHydration?: boolean | undefined;
1873
+ }): Promise<string | null> {
1874
+ const error = getToolSurfaceReadinessError(input);
1875
+ if (
1876
+ error
1877
+ && input.allowPendingToolSearchHydration
1878
+ && input.workflowServerName
1879
+ && input.observation.mcpServers.some(
1880
+ (server) => server.name === input.workflowServerName && server.status === "pending",
1881
+ )
1882
+ ) {
1883
+ return Promise.resolve(null);
1884
+ }
1885
+ return Promise.resolve(error);
1886
+ }
1887
+
1888
+ export { awaitWorkflowMcpToolRegistration } from "../gsd/tool-surface-readiness.js";
1889
+
1890
+ const TOOL_SURFACE_READINESS_RETRY_DELAYS_MS = [500, 1_000, 2_000, 4_000, 8_000, 15_000, 15_000, 15_000] as const;
1891
+
1892
+ export function shouldRetryClaudeCodeToolSurfaceReadiness(error: string | null): boolean {
1893
+ if (!error) return false;
1894
+ return error.includes(TOOL_SURFACE_NOT_READY) && !/\bterminal\b/i.test(error);
1895
+ }
1896
+
1897
+ export function resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(
1898
+ error: string | null,
1899
+ attempt: number,
1900
+ preflightVerified = false,
1901
+ ): number | null {
1902
+ if (!shouldRetryClaudeCodeToolSurfaceReadiness(error)) return null;
1903
+ const delays = preflightVerified
1904
+ ? POST_PREFLIGHT_READINESS_RETRY_DELAYS_MS
1905
+ : TOOL_SURFACE_READINESS_RETRY_DELAYS_MS;
1906
+ return delays[attempt] ?? null;
1907
+ }
1908
+
1909
+ function makeAbortError(): Error {
1910
+ const error = new Error("AbortError: The operation was aborted");
1911
+ error.name = "AbortError";
1912
+ return error;
1913
+ }
1914
+
1915
+ function delay(ms: number, signal?: AbortSignal): Promise<void> {
1916
+ if (signal?.aborted) return Promise.reject(makeAbortError());
1917
+
1918
+ return new Promise((resolve, reject) => {
1919
+ const timeout = setTimeout(() => {
1920
+ signal?.removeEventListener("abort", onAbort);
1921
+ resolve();
1922
+ }, ms);
1923
+ const onAbort = (): void => {
1924
+ clearTimeout(timeout);
1925
+ reject(makeAbortError());
1926
+ };
1927
+ signal?.addEventListener("abort", onAbort, { once: true });
1928
+ });
1929
+ }
1930
+
1613
1931
  /**
1614
1932
  * Build the options object passed to the Claude Agent SDK's `query()` call.
1615
1933
  *
@@ -1743,6 +2061,13 @@ export function buildSdkOptions(
1743
2061
  workflowServerName,
1744
2062
  workflowExplicitlyBlocked,
1745
2063
  );
2064
+ const questionToolSurface = resolveWorkflowQuestionToolSurface({
2065
+ workflowServerName,
2066
+ workflowExplicitlyBlocked,
2067
+ workflowMcpTools,
2068
+ exactWorkflowMcpTools,
2069
+ env: process.env,
2070
+ });
1746
2071
  const runUatDisallowedTools = gsdPhase === "run-uat" && workflowServerName
1747
2072
  ? [
1748
2073
  ...RUN_UAT_FORBIDDEN_TOOL_NAMES.filter((toolName) => !toolName.startsWith("mcp__")),
@@ -1753,33 +2078,27 @@ export function buildSdkOptions(
1753
2078
  `mcp__${workflowServerName}__gsd_save_gate_result`,
1754
2079
  ]
1755
2080
  : [];
2081
+ const allowToolSearchForWorkflowMcp = workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0;
1756
2082
  const disallowedTools: string[] = [...new Set([
1757
- "ToolSearch",
2083
+ ...(allowToolSearchForWorkflowMcp ? [] : ["ToolSearch"]),
2084
+ ...(gsdPhase ? ["Skill"] : []),
1758
2085
  ...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
2086
+ ...questionToolSurface.disallowedTools,
1759
2087
  ...runUatDisallowedTools,
1760
2088
  ...extraDisallowedTools,
1761
2089
  ])];
1762
- const standardClaudeTools = [
1763
- "Read",
1764
- "Write",
1765
- "Edit",
1766
- "Glob",
1767
- "Grep",
1768
- "Bash",
1769
- "Agent",
1770
- "WebFetch",
1771
- "WebSearch",
1772
- ];
2090
+ const nativeTools = resolveClaudeNativeToolsForPhase(gsdPhase);
1773
2091
  const allowedTools = gsdPhase === "run-uat"
1774
2092
  ? [
1775
- ...RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES,
2093
+ ...nativeTools,
1776
2094
  ...(exactWorkflowMcpTools.length > 0 ? exactWorkflowMcpTools : []),
1777
2095
  ...allowedBrowserMcpTools,
1778
2096
  ]
1779
2097
  : [
1780
- ...standardClaudeTools,
2098
+ ...nativeTools,
1781
2099
  ...exactWorkflowMcpTools,
1782
- ...(workflowMcpTools.length > 0 ? workflowMcpTools : ["AskUserQuestion"]),
2100
+ ...(!gsdPhase && workflowMcpTools.length > 0 ? workflowMcpTools : []),
2101
+ ...(workflowMcpTools.length === 0 && exactWorkflowMcpTools.length === 0 ? ["AskUserQuestion"] : []),
1783
2102
  ...allowedBrowserMcpTools,
1784
2103
  ];
1785
2104
  const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
@@ -1817,6 +2136,8 @@ export function buildSdkOptions(
1817
2136
  || modelId.includes("opus-4.7")
1818
2137
  || modelId.includes("opus-4-8")
1819
2138
  || modelId.includes("opus-4.8")
2139
+ || modelId.includes("fable-5")
2140
+ || modelId.includes("fable.5")
1820
2141
  ) ? ["context-1m-2025-08-07"] : [],
1821
2142
  ...(thinkingConfig ?? {}),
1822
2143
  ...(effort ? { effort } : {}),
@@ -1824,265 +2145,23 @@ export function buildSdkOptions(
1824
2145
  };
1825
2146
  }
1826
2147
 
1827
- /** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
1828
- function normalizeToolResultContent(content: unknown): ExternalToolResultContentBlock[] {
1829
- if (typeof content === "string") {
1830
- return [{ type: "text", text: content }];
1831
- }
1832
-
1833
- if (!Array.isArray(content)) {
1834
- if (content == null) return [{ type: "text", text: "" }];
1835
- return [{ type: "text", text: JSON.stringify(content) }];
1836
- }
1837
-
1838
- const blocks: ExternalToolResultContentBlock[] = [];
1839
-
1840
- for (const item of content) {
1841
- if (typeof item === "string") {
1842
- blocks.push({ type: "text", text: item });
1843
- continue;
1844
- }
1845
- if (!item || typeof item !== "object") {
1846
- blocks.push({ type: "text", text: String(item) });
1847
- continue;
1848
- }
1849
-
1850
- const block = item as Record<string, unknown>;
1851
- if (block.type === "text") {
1852
- blocks.push({ type: "text", text: typeof block.text === "string" ? block.text : "" });
1853
- continue;
1854
- }
1855
- if (
1856
- block.type === "image"
1857
- && typeof block.data === "string"
1858
- && typeof block.mimeType === "string"
1859
- ) {
1860
- blocks.push({ type: "image", data: block.data, mimeType: block.mimeType });
1861
- continue;
1862
- }
1863
-
1864
- blocks.push({ type: "text", text: JSON.stringify(block) });
1865
- }
1866
-
1867
- return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
1868
- }
1869
-
1870
- /**
1871
- * Extract a `details` payload from an MCP tool-result block.
1872
- *
1873
- * MCP's `CallToolResult` carries structured data in `structuredContent` — the
1874
- * protocol's supported channel for non-text payloads. Claude Code's synthetic
1875
- * user message may surface that field in one of two shapes depending on SDK
1876
- * version: as a sibling on the `mcp_tool_result` block itself, or as a
1877
- * dedicated content sub-block with `type: "structuredContent"`. Snake-case
1878
- * (`structured_content`) is accepted defensively in case a transport hop
1879
- * rewrites casing. All other shapes fall back to an empty object so callers
1880
- * can rely on `details` being present.
1881
- */
1882
- function extractStructuredDetailsFromBlock(block: Record<string, unknown>): Record<string, unknown> | undefined {
1883
- const sibling = block.structuredContent ?? (block as Record<string, unknown>).structured_content;
1884
- if (sibling && typeof sibling === "object" && !Array.isArray(sibling)) {
1885
- return sibling as Record<string, unknown>;
1886
- }
1887
-
1888
- if (Array.isArray(block.content)) {
1889
- for (const item of block.content) {
1890
- if (!item || typeof item !== "object") continue;
1891
- const sub = item as Record<string, unknown>;
1892
- if (sub.type !== "structuredContent" && sub.type !== "structured_content") continue;
1893
- const payload = sub.structuredContent ?? sub.structured_content ?? sub.data ?? sub.value;
1894
- if (payload && typeof payload === "object" && !Array.isArray(payload)) {
1895
- return payload as Record<string, unknown>;
1896
- }
1897
- }
1898
- }
1899
-
1900
- // Return undefined (not {}) when no structured payload is present, matching
1901
- // the pre-#4477 contract where `details` was nullable. An empty-object
1902
- // sentinel is truthy and breaks downstream consumers that gate on
1903
- // `if (details)`. `undefined` matches the type of the field these results
1904
- // flow into (`Record<string, unknown> | undefined`).
1905
- return undefined;
1906
- }
1907
-
1908
- /**
1909
- * True for items that are MCP `structuredContent` pseudo-blocks living inside
1910
- * a tool-result `content[]` array. These blocks carry the structured payload
1911
- * (extracted separately by `extractStructuredDetailsFromBlock`) and must NOT
1912
- * leak into the visible content rendered to the user — otherwise the renderer
1913
- * stringifies the JSON pseudo-block and shows it next to the actual tool
1914
- * output. See PR #4477 review (post-fix-round).
1915
- */
1916
- function isStructuredContentPseudoBlock(item: unknown): boolean {
1917
- if (!item || typeof item !== "object") return false;
1918
- const type = (item as Record<string, unknown>).type;
1919
- return type === "structuredContent" || type === "structured_content";
1920
- }
1921
-
1922
- /**
1923
- * Strip `structuredContent` pseudo-blocks from a tool-result content array
1924
- * before normalization. The structured payload is extracted via the sibling
1925
- * `structuredContent` field (or a dedicated extractor pass on the raw block);
1926
- * the visible content path must not include the pseudo-block itself.
1927
- */
1928
- function stripStructuredContentPseudoBlocks(content: unknown): unknown {
1929
- if (!Array.isArray(content)) return content;
1930
- return content.filter((item) => !isStructuredContentPseudoBlock(item));
1931
- }
1932
-
1933
- /** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
1934
- export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): Array<{
1935
- toolUseId: string;
1936
- result: ExternalToolResultPayload;
1937
- }> {
1938
- const extracted: Array<{ toolUseId: string; result: ExternalToolResultPayload }> = [];
1939
- const seen = new Set<string>();
1940
- const rawMessage = message.message as Record<string, unknown> | null | undefined;
1941
- const content = Array.isArray(rawMessage?.content) ? rawMessage.content : [];
1942
-
1943
- for (const item of content) {
1944
- if (!item || typeof item !== "object") continue;
1945
- const block = item as Record<string, unknown>;
1946
- const type = typeof block.type === "string" ? block.type : "";
1947
- if (type !== "tool_result" && type !== "mcp_tool_result") continue;
1948
-
1949
- const toolUseId = typeof block.tool_use_id === "string" ? block.tool_use_id : "";
1950
- if (!toolUseId || seen.has(toolUseId)) continue;
1951
- seen.add(toolUseId);
1952
-
1953
- extracted.push({
1954
- toolUseId,
1955
- result: {
1956
- content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(block.content)),
1957
- details: extractStructuredDetailsFromBlock(block),
1958
- isError: block.is_error === true,
1959
- },
1960
- });
1961
- }
1962
-
1963
- if (extracted.length === 0) {
1964
- const fallback = message.tool_use_result;
1965
- if (fallback && typeof fallback === "object") {
1966
- const toolResult = fallback as Record<string, unknown>;
1967
- const toolUseId = typeof toolResult.tool_use_id === "string" ? toolResult.tool_use_id : "";
1968
- if (toolUseId) {
1969
- extracted.push({
1970
- toolUseId,
1971
- result: {
1972
- content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(toolResult.content)),
1973
- details: extractStructuredDetailsFromBlock(toolResult),
1974
- isError: toolResult.is_error === true,
1975
- },
1976
- });
1977
- }
1978
- }
1979
- }
1980
-
1981
- return extracted;
1982
- }
1983
-
1984
- /** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
1985
- function attachExternalResultsToToolBlocks(
1986
- toolBlocks: AssistantMessage["content"],
1987
- toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>,
1988
- ): void {
1989
- for (const block of toolBlocks) {
1990
- if (block.type !== "toolCall" && block.type !== "serverToolUse") continue;
1991
- const externalResult = toolResultsById.get(block.id);
1992
- if (!externalResult) continue;
1993
- (block as ToolCallWithExternalResult & { id: string }).externalResult = externalResult;
1994
- }
1995
- }
1996
-
1997
- /**
1998
- * Build the final assistant content that Agent Core consumes in
1999
- * `externalToolExecution` mode. This preserves tool-call blocks, attaches any
2000
- * SDK-produced external results by tool-call id, and then appends the final
2001
- * text/thinking blocks for the completed turn.
2002
- */
2003
- export function buildFinalAssistantContent(params: {
2004
- intermediateToolBlocks: AssistantMessage["content"];
2005
- pendingContent?: AssistantMessage["content"];
2006
- toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>;
2007
- lastThinkingContent?: string;
2008
- lastTextContent?: string;
2009
- fallbackResultText?: string;
2010
- }): AssistantMessage["content"] {
2011
- const mergedToolBlocks = [...params.intermediateToolBlocks];
2012
- if (params.pendingContent) {
2013
- mergePendingToolCalls(mergedToolBlocks, params.pendingContent);
2014
- }
2015
- attachExternalResultsToToolBlocks(mergedToolBlocks, params.toolResultsById);
2016
-
2017
- const finalContent: AssistantMessage["content"] = [...mergedToolBlocks];
2018
- if (params.pendingContent && params.pendingContent.length > 0) {
2019
- for (const block of params.pendingContent) {
2020
- if (block.type === "text" || block.type === "thinking") {
2021
- finalContent.push(block);
2022
- }
2023
- }
2024
- } else {
2025
- if (params.lastThinkingContent) {
2026
- finalContent.push({ type: "thinking", thinking: params.lastThinkingContent });
2027
- }
2028
- if (params.lastTextContent) {
2029
- finalContent.push({ type: "text", text: params.lastTextContent });
2030
- }
2031
- }
2032
-
2033
- if (finalContent.length === 0 && params.fallbackResultText) {
2034
- finalContent.push({ type: "text", text: params.fallbackResultText });
2035
- }
2148
+ // ---------------------------------------------------------------------------
2149
+ // streamSimple implementation
2150
+ // ---------------------------------------------------------------------------
2036
2151
 
2037
- return finalContent;
2038
- }
2152
+ let capturedClaudeCodeUIContext: ExtensionUIContext | undefined;
2039
2153
 
2040
2154
  /**
2041
- * Merge tool-call blocks from the active partial-message builder into the
2042
- * running list of intermediate tool calls, preserving order and de-duping
2043
- * by tool-call id. Exposed for testing the F3 fix (final-turn tool calls
2044
- * dropped when `result` arrives without a preceding synthetic `user`).
2155
+ * Capture the active extension UI context from `before_provider_request`. Core
2156
+ * invokes `streamSimple` with a plain `SimpleStreamOptions` (no
2157
+ * `extensionUIContext`), so without this the elicitation handler is never wired
2158
+ * and `ask_user_questions` immediately returns cancelled. See index.ts, which
2159
+ * registers the hook that calls this.
2045
2160
  */
2046
- export function mergePendingToolCalls(
2047
- intermediate: AssistantMessage["content"],
2048
- pending: AssistantMessage["content"],
2049
- ): AssistantMessage["content"] {
2050
- const alreadyIncluded = new Set<string>();
2051
- for (const block of intermediate) {
2052
- if (block.type === "toolCall") alreadyIncluded.add(block.id);
2053
- }
2054
- for (const block of pending) {
2055
- if (block.type !== "toolCall") continue;
2056
- if (alreadyIncluded.has(block.id)) continue;
2057
- alreadyIncluded.add(block.id);
2058
- intermediate.push(block);
2059
- }
2060
- return intermediate;
2161
+ export function setClaudeCodeUIContext(ui: ExtensionUIContext | undefined): void {
2162
+ capturedClaudeCodeUIContext = ui;
2061
2163
  }
2062
2164
 
2063
- export function handleClaudeCodePartialStreamEvent(
2064
- builder: PartialMessageBuilder | null,
2065
- event: BetaRawMessageStreamEvent,
2066
- modelId: string,
2067
- ): { builder: PartialMessageBuilder | null; assistantEvent: AssistantMessageEvent | null } {
2068
- if (event.type === "message_start") {
2069
- // Claude Code can emit repeated SDK message_start events inside one
2070
- // logical assistant response. Keep appending until a synthetic user
2071
- // tool-result boundary explicitly clears the builder.
2072
- return {
2073
- builder: builder ?? new PartialMessageBuilder((event as any).message?.model ?? modelId),
2074
- assistantEvent: null,
2075
- };
2076
- }
2077
-
2078
- if (!builder) return { builder, assistantEvent: null };
2079
- return { builder, assistantEvent: builder.handleEvent(event) };
2080
- }
2081
-
2082
- // ---------------------------------------------------------------------------
2083
- // streamSimple implementation
2084
- // ---------------------------------------------------------------------------
2085
-
2086
2165
  /**
2087
2166
  * GSD streamSimple function that delegates to the Claude Agent SDK.
2088
2167
  *
@@ -2103,6 +2182,20 @@ export function streamViaClaudeCode(
2103
2182
  return stream;
2104
2183
  }
2105
2184
 
2185
+ interface SdkAttemptMessageState {
2186
+ builder: PartialMessageBuilder | null;
2187
+ intermediateToolBlocks: AssistantMessage["content"];
2188
+ toolResultsById: Map<string, ExternalToolResultPayload>;
2189
+ }
2190
+
2191
+ function createSdkAttemptMessageState(): SdkAttemptMessageState {
2192
+ return {
2193
+ builder: null,
2194
+ intermediateToolBlocks: [],
2195
+ toolResultsById: new Map<string, ExternalToolResultPayload>(),
2196
+ };
2197
+ }
2198
+
2106
2199
  /** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
2107
2200
  async function pumpSdkMessages(
2108
2201
  model: Model<any>,
@@ -2111,38 +2204,30 @@ async function pumpSdkMessages(
2111
2204
  stream: AssistantMessageEventStream,
2112
2205
  ): Promise<void> {
2113
2206
  const modelId = model.id;
2114
- let builder: PartialMessageBuilder | null = null;
2115
2207
  /** Track the last text content seen across all assistant turns for the final message. */
2116
2208
  let lastTextContent = "";
2117
2209
  let lastThinkingContent = "";
2118
- /** Collect tool blocks from intermediate SDK turns for tool execution rendering. */
2119
- const intermediateToolBlocks: AssistantMessage["content"] = [];
2120
- /** Preserve real external tool results from Claude Code's synthetic user messages. */
2121
- const toolResultsById = new Map<string, ExternalToolResultPayload>();
2122
2210
 
2123
2211
  try {
2124
- // Dynamic import — the SDK is an optional dependency.
2125
- const sdkModule = "@anthropic-ai/claude-agent-sdk";
2126
- const sdk = (await import(/* webpackIgnore: true */ sdkModule)) as {
2127
- query: (args: {
2128
- prompt: string | AsyncIterable<unknown>;
2129
- options?: Record<string, unknown>;
2130
- }) => AsyncIterable<SDKMessage>;
2131
- };
2132
-
2133
- // Bridge GSD's AbortSignal to SDK's AbortController
2134
- const controller = new AbortController();
2135
- if (options?.signal) {
2136
- options.signal.addEventListener("abort", () => controller.abort(), { once: true });
2137
- }
2138
-
2139
2212
  const permissionMode = await resolveClaudePermissionMode();
2140
- const uiContext = (options as ClaudeCodeStreamOptions | undefined)?.extensionUIContext;
2141
- const onExternalToolCall = (options as ClaudeCodeStreamOptions | undefined)?.onExternalToolCall;
2142
- const onExternalToolResult = (options as ClaudeCodeStreamOptions | undefined)?.onExternalToolResult;
2213
+ const claudeOptions = options as ClaudeCodeStreamOptions | undefined;
2214
+ const uiContext = claudeOptions?.extensionUIContext ?? capturedClaudeCodeUIContext;
2215
+ const onExternalToolCall = claudeOptions?.onExternalToolCall;
2216
+ const onExternalToolResult = claudeOptions?.onExternalToolResult;
2217
+ const sdkQueryForTest = claudeOptions?._sdkQueryForTest;
2218
+ const query = sdkQueryForTest ?? (
2219
+ // Dynamic import — the SDK is an optional dependency.
2220
+ (await import(/* webpackIgnore: true */ "@anthropic-ai/claude-agent-sdk")) as {
2221
+ query: (args: {
2222
+ prompt: string | AsyncIterable<unknown>;
2223
+ options?: Record<string, unknown>;
2224
+ }) => AsyncIterable<SDKMessage>;
2225
+ }
2226
+ ).query;
2143
2227
  const cwd = resolveClaudeCodeCwd(options);
2228
+ const projectRoot = resolveWorkflowMcpProjectRoot(cwd);
2144
2229
  autoInitClaudeCodeWorkflowMcp(cwd);
2145
- const gsdPhase = inferGsdPhaseFromContext(context);
2230
+ const gsdPhase = resolveGsdPhaseForSdk(context, projectRoot);
2146
2231
  const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
2147
2232
  // When no UI is available (headless / auto-mode), auto-approve all
2148
2233
  // tool requests. This replaces the old bypassPermissions workaround.
@@ -2165,20 +2250,16 @@ async function pumpSdkMessages(
2165
2250
  : {}),
2166
2251
  },
2167
2252
  );
2253
+ const workflowMcpServerName = workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools);
2254
+ const allowPendingToolSearchHydration =
2255
+ Boolean(workflowMcpServerName && gsdPhase)
2256
+ && !(sdkOpts.disallowedTools as string[] | undefined)?.includes("ToolSearch");
2168
2257
  const prompt = buildPromptFromContext(context, {
2169
- workflowMcpServerName: workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
2258
+ workflowMcpServerName,
2170
2259
  browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
2171
2260
  });
2172
2261
  const queryPrompt = buildSdkQueryPrompt(context, prompt);
2173
2262
 
2174
- const queryResult = sdk.query({
2175
- prompt: queryPrompt,
2176
- options: {
2177
- ...sdkOpts,
2178
- abortController: controller,
2179
- },
2180
- });
2181
-
2182
2263
  // Emit start with an empty partial
2183
2264
  const initialPartial: AssistantMessage = {
2184
2265
  role: "assistant",
@@ -2191,174 +2272,324 @@ async function pumpSdkMessages(
2191
2272
  timestamp: Date.now(),
2192
2273
  };
2193
2274
  stream.push({ type: "start", partial: initialPartial });
2275
+ const readinessProgressState: WorkflowMcpReadinessProgressState = {};
2194
2276
 
2195
- for await (const msg of queryResult as AsyncIterable<SDKMessage>) {
2196
- if (options?.signal?.aborted) {
2197
- // User-initiated cancel — emit an aborted error so the agent
2198
- // loop classifies this as a deliberate stop, not a transient
2199
- // provider failure that should be retried.
2200
- stream.push({
2201
- type: "error",
2202
- reason: "aborted",
2203
- error: makeAbortedMessage(modelId, lastTextContent),
2204
- });
2205
- return;
2277
+ const trackWorkflowMcpSdk = Boolean(workflowMcpServerName && gsdPhase);
2278
+ if (trackWorkflowMcpSdk) beginWorkflowMcpSdkSession();
2279
+ try {
2280
+ let workflowMcpPreflightVerified = false;
2281
+ const shouldRunWorkflowMcpPreflight =
2282
+ workflowMcpServerName && gsdPhase && !claudeOptions?._skipWorkflowMcpPreflightForTest;
2283
+ if (shouldRunWorkflowMcpPreflight) {
2284
+ try {
2285
+ const progressMessage = buildWorkflowMcpReadinessProgressMessage({
2286
+ unitType: gsdPhase,
2287
+ workflowServerName: workflowMcpServerName,
2288
+ stage: "preflight",
2289
+ });
2290
+ pushWorkflowMcpReadinessProgressEvent({
2291
+ stream,
2292
+ partial: initialPartial,
2293
+ state: readinessProgressState,
2294
+ message: progressMessage,
2295
+ });
2296
+ uiContext?.setStatus?.("gsd-step", progressMessage);
2297
+ const preflightError = await awaitWorkflowMcpToolRegistration({
2298
+ unitType: gsdPhase,
2299
+ workflowServerName: workflowMcpServerName,
2300
+ projectRoot,
2301
+ workflowServerConfig: resolveWorkflowMcpPreflightServerConfig(
2302
+ sdkOpts.mcpServers,
2303
+ workflowMcpServerName,
2304
+ ),
2305
+ signal: options?.signal,
2306
+ });
2307
+ if (preflightError) {
2308
+ stream.push({
2309
+ type: "error",
2310
+ reason: "error",
2311
+ error: makeErrorMessage(modelId, preflightError),
2312
+ });
2313
+ return;
2314
+ }
2315
+ workflowMcpPreflightVerified = true;
2316
+ } finally {
2317
+ uiContext?.setStatus?.("gsd-step", "");
2318
+ }
2319
+ if (workflowMcpPreflightVerified) {
2320
+ await delay(POST_PREFLIGHT_SDK_SETTLE_MS, options?.signal);
2321
+ }
2206
2322
  }
2207
2323
 
2208
- switch (msg.type) {
2209
- // -- Init --
2210
- case "system": {
2211
- // Nothing to emit — the stream is already started.
2212
- break;
2324
+ sdkAttemptLoop:
2325
+ for (let readinessAttempt = 0; ; readinessAttempt++) {
2326
+ let { builder, intermediateToolBlocks, toolResultsById } = createSdkAttemptMessageState();
2327
+ const controller = new AbortController();
2328
+ const forwardAbort = (): void => controller.abort();
2329
+ if (options?.signal) {
2330
+ options.signal.addEventListener("abort", forwardAbort, { once: true });
2213
2331
  }
2214
2332
 
2215
- // -- Streaming partial messages --
2216
- case "stream_event": {
2217
- const partial = msg as SDKPartialAssistantMessage;
2218
-
2219
- const event = partial.event;
2220
-
2221
- const result = handleClaudeCodePartialStreamEvent(builder, event, modelId);
2222
- builder = result.builder;
2223
- const assistantEvent = result.assistantEvent;
2224
- if (assistantEvent) {
2225
- stream.push(assistantEvent);
2226
- if (assistantEvent.type === "toolcall_start") {
2227
- const toolBlock = assistantEvent.partial.content[assistantEvent.contentIndex];
2228
- if (toolBlock?.type === "toolCall") {
2229
- try {
2230
- await onExternalToolCall?.(toolBlock);
2231
- } catch (error) {
2232
- console.warn("[claude-code] onExternalToolCall callback failed:", error);
2333
+ const queryResult = query({
2334
+ prompt: queryPrompt,
2335
+ options: {
2336
+ ...sdkOpts,
2337
+ abortController: controller,
2338
+ },
2339
+ });
2340
+
2341
+ try {
2342
+ for await (const msg of queryResult as AsyncIterable<SDKMessage>) {
2343
+ if (options?.signal?.aborted) {
2344
+ // User-initiated cancel emit an aborted error so the agent
2345
+ // loop classifies this as a deliberate stop, not a transient
2346
+ // provider failure that should be retried.
2347
+ stream.push({
2348
+ type: "error",
2349
+ reason: "aborted",
2350
+ error: makeAbortedMessage(modelId, lastTextContent),
2351
+ });
2352
+ return;
2353
+ }
2354
+
2355
+ switch (msg.type) {
2356
+ // -- Init --
2357
+ case "system": {
2358
+ // Tool Surface Readiness gate: the init message is the first (and
2359
+ // only) point where the session reports its live tool surface and
2360
+ // MCP server statuses. If the workflow server failed or has not
2361
+ // registered this Unit's required tools, abort before the first
2362
+ // model turn with a transient, recovery-classifiable error
2363
+ // (tool-unavailable → retry) instead of letting the model hit
2364
+ // "No such tool available" mid-Unit and improvise around it.
2365
+ const init = msg as unknown as {
2366
+ subtype?: string;
2367
+ tools?: string[];
2368
+ mcp_servers?: { name: string; status: string }[];
2369
+ };
2370
+ if (init.subtype === "init") {
2371
+ const readinessError = await resolveClaudeCodeToolSurfaceReadinessError({
2372
+ unitType: gsdPhase,
2373
+ workflowServerName: workflowMcpServerName,
2374
+ projectRoot,
2375
+ observation: { tools: init.tools ?? [], mcpServers: init.mcp_servers ?? [] },
2376
+ allowPendingToolSearchHydration,
2377
+ });
2378
+ if (readinessError) {
2379
+ const retryDelayMs = resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(
2380
+ readinessError,
2381
+ readinessAttempt,
2382
+ workflowMcpPreflightVerified,
2383
+ );
2384
+ if (retryDelayMs !== null && !options?.signal?.aborted) {
2385
+ controller.abort();
2386
+ const progressMessage = buildWorkflowMcpReadinessProgressMessage({
2387
+ unitType: gsdPhase ?? "workflow unit",
2388
+ workflowServerName: workflowMcpServerName ?? "workflow",
2389
+ stage: "retry",
2390
+ attempt: readinessAttempt + 1,
2391
+ delayMs: retryDelayMs,
2392
+ });
2393
+ pushWorkflowMcpReadinessProgressEvent({
2394
+ stream,
2395
+ partial: initialPartial,
2396
+ state: readinessProgressState,
2397
+ message: progressMessage,
2398
+ });
2399
+ uiContext?.setStatus?.("gsd-step", progressMessage);
2400
+ await delay(retryDelayMs, options?.signal);
2401
+ uiContext?.setStatus?.("gsd-step", "");
2402
+ continue sdkAttemptLoop;
2403
+ }
2404
+ controller.abort();
2405
+ stream.push({
2406
+ type: "error",
2407
+ reason: "error",
2408
+ error: makeErrorMessage(modelId, readinessError),
2409
+ });
2410
+ return;
2233
2411
  }
2234
2412
  }
2413
+ break;
2235
2414
  }
2236
- }
2237
- break;
2238
- }
2239
2415
 
2240
- // -- Complete assistant message (non-streaming fallback) --
2241
- case "assistant": {
2242
- const sdkAssistant = msg as SDKAssistantMessage;
2243
-
2244
- // Capture text content from complete messages
2245
- for (const block of sdkAssistant.message.content) {
2246
- if (block.type === "text") {
2247
- lastTextContent = block.text;
2248
- } else if (block.type === "thinking") {
2249
- lastThinkingContent = block.thinking;
2416
+ // -- Streaming partial messages --
2417
+ case "stream_event": {
2418
+ const partial = msg as SDKPartialAssistantMessage;
2419
+
2420
+ const event = partial.event;
2421
+
2422
+ const result = handleClaudeCodePartialStreamEvent(builder, event, modelId);
2423
+ builder = result.builder;
2424
+ const assistantEvent = result.assistantEvent;
2425
+ if (assistantEvent) {
2426
+ stream.push(assistantEvent);
2427
+ if (assistantEvent.type === "toolcall_start") {
2428
+ const toolBlock = assistantEvent.partial.content[assistantEvent.contentIndex];
2429
+ if (toolBlock?.type === "toolCall") {
2430
+ try {
2431
+ await onExternalToolCall?.(toolBlock);
2432
+ } catch (error) {
2433
+ console.warn("[claude-code] onExternalToolCall callback failed:", error);
2434
+ }
2435
+ }
2436
+ }
2437
+ }
2438
+ break;
2250
2439
  }
2251
- }
2252
- break;
2253
- }
2254
2440
 
2255
- // -- User message (synthetic tool result — signals turn boundary) --
2256
- case "user": {
2257
- // Capture content from the completed turn before resetting
2258
- if (builder) {
2259
- for (const block of builder.message.content) {
2260
- if (block.type === "text" && block.text) {
2261
- lastTextContent = block.text;
2262
- } else if (block.type === "thinking" && block.thinking) {
2263
- lastThinkingContent = block.thinking;
2264
- } else if (block.type === "toolCall" || block.type === "serverToolUse") {
2265
- // Collect tool blocks for externalToolExecution rendering
2266
- intermediateToolBlocks.push(block);
2441
+ // -- Complete assistant message (non-streaming fallback) --
2442
+ case "assistant": {
2443
+ const sdkAssistant = msg as SDKAssistantMessage;
2444
+
2445
+ // Capture text content from complete messages
2446
+ for (const block of sdkAssistant.message.content) {
2447
+ if (block.type === "text") {
2448
+ lastTextContent = block.text;
2449
+ } else if (block.type === "thinking") {
2450
+ lastThinkingContent = block.thinking;
2451
+ }
2267
2452
  }
2453
+ break;
2268
2454
  }
2269
- }
2270
2455
 
2271
- // Extract tool results from the SDK's synthetic user message
2272
- // and attach to corresponding tool call blocks immediately.
2273
- for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg as SDKUserMessage)) {
2274
- toolResultsById.set(toolUseId, result);
2275
- }
2276
- attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
2277
-
2278
- // Push a synthetic toolcall_end for each tool call from this turn
2279
- // so the TUI can render tool results in real-time during the SDK
2280
- // session instead of waiting until the entire session completes.
2281
- if (builder) {
2282
- for (const block of builder.message.content) {
2283
- const extResult = (block as ToolCallWithExternalResult).externalResult;
2284
- if (!extResult) continue;
2285
- const contentIndex = builder.message.content.indexOf(block);
2286
- if (contentIndex < 0) continue;
2287
- // Push synthetic completion events with result attached so the
2288
- // chat-controller can update pending ToolExecutionComponents.
2289
- if (block.type === "toolCall") {
2290
- try {
2291
- await onExternalToolResult?.({
2292
- toolCall: block,
2293
- result: extResult,
2294
- });
2295
- } catch (error) {
2296
- console.warn("[claude-code] onExternalToolResult callback failed:", error);
2456
+ // -- User message (synthetic tool result signals turn boundary) --
2457
+ case "user": {
2458
+ // Capture content from the completed turn before resetting
2459
+ if (builder) {
2460
+ for (const block of builder.message.content) {
2461
+ if (block.type === "text" && block.text) {
2462
+ lastTextContent = block.text;
2463
+ } else if (block.type === "thinking" && block.thinking) {
2464
+ lastThinkingContent = block.thinking;
2465
+ } else if (block.type === "toolCall" || block.type === "serverToolUse") {
2466
+ // Collect tool blocks for externalToolExecution rendering
2467
+ intermediateToolBlocks.push(block);
2468
+ }
2297
2469
  }
2298
- stream.push({
2299
- type: "toolcall_end",
2300
- contentIndex,
2301
- toolCall: block,
2302
- partial: builder.message,
2303
- });
2304
- } else if (block.type === "serverToolUse") {
2305
- try {
2306
- await onExternalToolResult?.({
2307
- toolCall: serverToolUseToToolCallLike(block),
2308
- result: extResult,
2309
- });
2310
- } catch (error) {
2311
- console.warn("[claude-code] onExternalToolResult callback failed:", error);
2470
+ }
2471
+
2472
+ // Extract tool results from the SDK's synthetic user message
2473
+ // and attach to corresponding tool call blocks immediately.
2474
+ for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg as SDKUserMessage)) {
2475
+ toolResultsById.set(toolUseId, result);
2476
+ }
2477
+ attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
2478
+
2479
+ // Push a synthetic toolcall_end for each tool call from this turn
2480
+ // so the TUI can render tool results in real-time during the SDK
2481
+ // session instead of waiting until the entire session completes.
2482
+ if (builder) {
2483
+ for (const block of builder.message.content) {
2484
+ const extResult = (block as ToolCallWithExternalResult).externalResult;
2485
+ if (!extResult) continue;
2486
+ const contentIndex = builder.message.content.indexOf(block);
2487
+ if (contentIndex < 0) continue;
2488
+ const suppressDuplicateUnavailable = shouldSuppressDuplicateToolUnavailableBlock(
2489
+ block,
2490
+ builder.message.content,
2491
+ );
2492
+ // Push synthetic completion events with result attached so the
2493
+ // chat-controller can update pending ToolExecutionComponents.
2494
+ if (block.type === "toolCall") {
2495
+ if (suppressDuplicateUnavailable) {
2496
+ delete (block as ToolCallWithExternalResult).externalResult;
2497
+ stream.push({
2498
+ type: "toolcall_end",
2499
+ contentIndex,
2500
+ toolCall: block,
2501
+ partial: builder.message,
2502
+ });
2503
+ (block as ToolCallWithExternalResult).externalResult = extResult;
2504
+ continue;
2505
+ }
2506
+ try {
2507
+ await onExternalToolResult?.({
2508
+ toolCall: block,
2509
+ result: extResult,
2510
+ });
2511
+ } catch (error) {
2512
+ console.warn("[claude-code] onExternalToolResult callback failed:", error);
2513
+ }
2514
+ stream.push({
2515
+ type: "toolcall_end",
2516
+ contentIndex,
2517
+ toolCall: block,
2518
+ partial: builder.message,
2519
+ });
2520
+ } else if (block.type === "serverToolUse") {
2521
+ try {
2522
+ await onExternalToolResult?.({
2523
+ toolCall: serverToolUseToToolCallLike(block),
2524
+ result: extResult,
2525
+ });
2526
+ } catch (error) {
2527
+ console.warn("[claude-code] onExternalToolResult callback failed:", error);
2528
+ }
2529
+ stream.push({
2530
+ type: "server_tool_use",
2531
+ contentIndex,
2532
+ partial: builder.message,
2533
+ });
2534
+ }
2312
2535
  }
2313
- stream.push({
2314
- type: "server_tool_use",
2315
- contentIndex,
2316
- partial: builder.message,
2317
- });
2318
2536
  }
2537
+
2538
+ builder = null;
2539
+ break;
2319
2540
  }
2320
- }
2321
2541
 
2322
- builder = null;
2323
- break;
2324
- }
2542
+ // -- Result (terminal) --
2543
+ case "result": {
2544
+ const result = msg as SDKResultMessage;
2545
+ const finalContent = buildFinalAssistantContent({
2546
+ intermediateToolBlocks,
2547
+ pendingContent: builder?.message.content,
2548
+ toolResultsById,
2549
+ lastThinkingContent,
2550
+ lastTextContent,
2551
+ fallbackResultText:
2552
+ result.subtype === "success" && result.result ? result.result : undefined,
2553
+ });
2554
+
2555
+ const finalMessage: AssistantMessage = {
2556
+ role: "assistant",
2557
+ content: finalContent,
2558
+ api: "anthropic-messages",
2559
+ provider: "claude-code",
2560
+ model: modelId,
2561
+ usage: mapUsage(result.usage, result.total_cost_usd),
2562
+ stopReason: result.is_error ? "error" : "stop",
2563
+ timestamp: Date.now(),
2564
+ };
2325
2565
 
2326
- // -- Result (terminal) --
2327
- case "result": {
2328
- const result = msg as SDKResultMessage;
2329
- const finalContent = buildFinalAssistantContent({
2330
- intermediateToolBlocks,
2331
- pendingContent: builder?.message.content,
2332
- toolResultsById,
2333
- lastThinkingContent,
2334
- lastTextContent,
2335
- fallbackResultText:
2336
- result.subtype === "success" && result.result ? result.result : undefined,
2337
- });
2566
+ if (result.is_error) {
2567
+ finalMessage.errorMessage = getResultErrorMessage(result);
2568
+ stream.push({ type: "error", reason: "error", error: finalMessage });
2569
+ } else {
2570
+ stream.push({ type: "done", reason: "stop", message: finalMessage });
2571
+ }
2572
+ return;
2573
+ }
2338
2574
 
2339
- const finalMessage: AssistantMessage = {
2340
- role: "assistant",
2341
- content: finalContent,
2342
- api: "anthropic-messages",
2343
- provider: "claude-code",
2344
- model: modelId,
2345
- usage: mapUsage(result.usage, result.total_cost_usd),
2346
- stopReason: result.is_error ? "error" : "stop",
2347
- timestamp: Date.now(),
2348
- };
2349
-
2350
- if (result.is_error) {
2351
- finalMessage.errorMessage = getResultErrorMessage(result);
2352
- stream.push({ type: "error", reason: "error", error: finalMessage });
2353
- } else {
2354
- stream.push({ type: "done", reason: "stop", message: finalMessage });
2575
+ default:
2576
+ break;
2355
2577
  }
2356
- return;
2578
+ }
2579
+ } finally {
2580
+ options?.signal?.removeEventListener("abort", forwardAbort);
2357
2581
  }
2358
2582
 
2359
- default:
2360
- break;
2583
+ // The SDK stream ended without a terminal `result` message and
2584
+ // without a readiness retry (the only restart path, via
2585
+ // `continue sdkAttemptLoop`). Break out so the post-loop
2586
+ // exhaustion handler emits a transient stream-exhausted error,
2587
+ // instead of silently starting another SDK session and looping
2588
+ // forever.
2589
+ break sdkAttemptLoop;
2361
2590
  }
2591
+ } finally {
2592
+ if (trackWorkflowMcpSdk) endWorkflowMcpSdkSession();
2362
2593
  }
2363
2594
 
2364
2595
  // Generator exhaustion without a terminal result is a stream interruption,