@opengsd/gsd-pi 1.2.0 → 1.3.0-dev.72e3af2a

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