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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1016) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli-web-branch.d.ts +2 -0
  6. package/dist/cli-web-branch.js +9 -2
  7. package/dist/cli.js +2 -19
  8. package/dist/headless-events.d.ts +4 -2
  9. package/dist/headless-events.js +14 -34
  10. package/dist/help-text.js +5 -0
  11. package/dist/loader.js +6 -4
  12. package/dist/mcp-server.js +2 -1
  13. package/dist/models-resolver.d.ts +3 -13
  14. package/dist/models-resolver.js +3 -22
  15. package/dist/register-agent-bundles.d.ts +11 -2
  16. package/dist/register-agent-bundles.js +18 -4
  17. package/dist/resource-loader.d.ts +10 -5
  18. package/dist/resource-loader.js +123 -20
  19. package/dist/resources/.managed-resources-content-hash +1 -1
  20. package/dist/resources/GSD-WORKFLOW.md +5 -4
  21. package/dist/resources/extensions/ask-user-questions.js +81 -25
  22. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  23. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  24. package/dist/resources/extensions/async-jobs/index.js +65 -0
  25. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  26. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  27. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  28. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  29. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  30. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  31. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  32. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  33. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  34. package/dist/resources/extensions/browser-tools/index.js +69 -12
  35. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  36. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +546 -426
  37. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -0
  38. package/dist/resources/extensions/github-sync/templates.js +3 -3
  39. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  40. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  41. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  42. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  43. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  44. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  45. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  46. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  47. package/dist/resources/extensions/gsd/auto/loop.js +80 -56
  48. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  49. package/dist/resources/extensions/gsd/auto/orchestrator.js +310 -78
  50. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  51. package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
  52. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  53. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  54. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  55. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  56. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  57. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  58. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  59. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  60. package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
  61. package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
  62. package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
  63. package/dist/resources/extensions/gsd/auto-prompts.js +161 -26
  64. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  65. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  66. package/dist/resources/extensions/gsd/auto-start.js +59 -52
  67. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  68. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  69. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  70. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
  71. package/dist/resources/extensions/gsd/auto-verification.js +30 -37
  72. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  73. package/dist/resources/extensions/gsd/auto-worktree.js +68 -370
  74. package/dist/resources/extensions/gsd/auto.js +71 -29
  75. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  76. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  77. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  78. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +74 -50
  79. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  80. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  81. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  82. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +316 -161
  83. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
  84. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  85. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  86. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  87. package/dist/resources/extensions/gsd/captures.js +5 -15
  88. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  89. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  90. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  91. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  92. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  93. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  94. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  95. package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
  96. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  97. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  98. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  99. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  100. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  101. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  102. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  103. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  104. package/dist/resources/extensions/gsd/constants.js +0 -2
  105. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  106. package/dist/resources/extensions/gsd/db/engine.js +757 -0
  107. package/dist/resources/extensions/gsd/db/queries.js +428 -0
  108. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  109. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  110. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  111. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  112. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  113. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  114. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  115. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  116. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  117. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  118. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  119. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  120. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  121. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  122. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  123. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  124. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  125. package/dist/resources/extensions/gsd/doctor.js +16 -9
  126. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  127. package/dist/resources/extensions/gsd/error-classifier.js +10 -1
  128. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  129. package/dist/resources/extensions/gsd/files.js +33 -19
  130. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  131. package/dist/resources/extensions/gsd/git-service.js +1 -0
  132. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  133. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  134. package/dist/resources/extensions/gsd/gsd-db.js +186 -2048
  135. package/dist/resources/extensions/gsd/guidance.js +158 -0
  136. package/dist/resources/extensions/gsd/guided-flow.js +174 -473
  137. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  138. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  139. package/dist/resources/extensions/gsd/markdown-renderer.js +12 -1
  140. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  141. package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
  142. package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
  143. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  144. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  145. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  146. package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
  147. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  148. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  149. package/dist/resources/extensions/gsd/milestone-closeout.js +97 -28
  150. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  151. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  152. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  153. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  154. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  155. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  156. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  157. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  158. package/dist/resources/extensions/gsd/model-router.js +3 -0
  159. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  160. package/dist/resources/extensions/gsd/notifications.js +12 -7
  161. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  162. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  163. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  164. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  165. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  166. package/dist/resources/extensions/gsd/paths.js +37 -24
  167. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  168. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  169. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  170. package/dist/resources/extensions/gsd/preferences.js +161 -29
  171. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  172. package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -4
  173. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -2
  174. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  175. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  176. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  177. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  178. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  179. package/dist/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  180. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  181. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  182. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  183. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  184. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  185. package/dist/resources/extensions/gsd/prompts/system.md +6 -3
  186. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  187. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  188. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  189. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  190. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  191. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  192. package/dist/resources/extensions/gsd/publication.js +87 -0
  193. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  194. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  195. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  196. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  197. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  198. package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
  199. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  200. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  201. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  202. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  203. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  204. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  205. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  206. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  207. package/dist/resources/extensions/gsd/state.js +24 -26
  208. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  209. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  210. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  211. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  212. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  213. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  214. package/dist/resources/extensions/gsd/tool-contract.js +66 -11
  215. package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
  216. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  217. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  218. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  219. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  220. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  221. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  222. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  223. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  224. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  225. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +41 -2
  226. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  227. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  228. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  229. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  230. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  231. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  232. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  233. package/dist/resources/extensions/gsd/uat-policy.js +57 -25
  234. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  235. package/dist/resources/extensions/gsd/undo.js +8 -7
  236. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  237. package/dist/resources/extensions/gsd/unit-context-composer.js +114 -21
  238. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  239. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  240. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  241. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
  242. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  243. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  244. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  245. package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
  246. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  247. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  248. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  249. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  250. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  251. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  252. package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
  253. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  254. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  255. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  256. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  257. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  258. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  259. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  260. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  261. package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
  262. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  263. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  264. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  265. package/dist/resources/extensions/gsd/worktree.js +8 -1
  266. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  267. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  268. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  269. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  270. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  271. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  272. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  273. package/dist/resources/shared/package-manager-detection.js +1 -1
  274. package/dist/resources/shared/package.json +3 -0
  275. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  276. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  277. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  278. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  279. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  280. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  281. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  282. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  283. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  284. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  285. package/dist/runtime-checks.d.ts +10 -0
  286. package/dist/runtime-checks.js +27 -0
  287. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  288. package/dist/update-check.d.ts +2 -0
  289. package/dist/update-check.js +24 -1
  290. package/dist/update-cmd.js +40 -3
  291. package/dist/web/standalone/.next/BUILD_ID +1 -1
  292. package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
  293. package/dist/web/standalone/.next/build-manifest.json +3 -3
  294. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  295. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  296. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  297. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  298. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  299. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  300. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  301. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  302. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  303. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  304. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  305. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  306. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  307. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  308. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  309. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  310. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  311. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  312. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  313. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  314. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  315. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  316. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  317. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  318. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  319. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  320. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  321. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  322. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  323. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  324. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  325. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  326. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  327. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  328. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  329. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  330. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  331. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  332. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  333. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  334. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  335. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  336. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  337. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  338. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  339. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  340. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  341. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  342. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  343. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  344. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  345. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  346. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  347. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  348. package/dist/web/standalone/.next/server/app/index.html +1 -1
  349. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  350. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  351. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  352. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  353. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  354. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  355. package/dist/web/standalone/.next/server/app-paths-manifest.json +4 -4
  356. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  357. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  358. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  359. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  360. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  361. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  362. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  363. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  364. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  365. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  366. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  367. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  368. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  369. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +10 -0
  370. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  371. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  372. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  373. package/dist/web/standalone/package.json +1 -1
  374. package/dist/web-mode.d.ts +2 -0
  375. package/dist/web-mode.js +20 -8
  376. package/dist/worktree-cli.js +3 -6
  377. package/dist/worktree-status-banner.js +7 -11
  378. package/package.json +4 -3
  379. package/packages/cloud-mcp-gateway/package.json +2 -2
  380. package/packages/contracts/dist/rpc.d.ts +1 -0
  381. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  382. package/packages/contracts/dist/rpc.js.map +1 -1
  383. package/packages/contracts/dist/workflow.d.ts +4 -0
  384. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  385. package/packages/contracts/dist/workflow.js.map +1 -1
  386. package/packages/contracts/package.json +1 -1
  387. package/packages/daemon/package.json +4 -4
  388. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  389. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  390. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  391. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  392. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  393. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  394. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  395. package/packages/gsd-agent-core/package.json +5 -5
  396. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  397. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  398. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  399. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  400. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  401. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  402. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +58 -6
  403. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  404. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  405. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  406. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  407. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  408. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  409. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +113 -40
  410. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  411. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  412. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  413. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  414. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  415. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  416. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  417. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  418. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  419. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  420. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  421. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  422. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  423. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  424. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  425. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  426. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  427. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  428. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  429. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  430. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  431. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  432. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  433. package/packages/gsd-agent-modes/package.json +7 -7
  434. package/packages/mcp-server/README.md +12 -3
  435. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  436. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  437. package/packages/mcp-server/dist/cli-runner.js +137 -0
  438. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  439. package/packages/mcp-server/dist/cli.js +2 -50
  440. package/packages/mcp-server/dist/cli.js.map +1 -1
  441. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  442. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  443. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  444. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  445. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  446. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  447. package/packages/mcp-server/dist/pid-registry.js +452 -0
  448. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  449. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  450. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  451. package/packages/mcp-server/dist/probe-mode.js +10 -0
  452. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  453. package/packages/mcp-server/dist/server.d.ts +10 -0
  454. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  455. package/packages/mcp-server/dist/server.js +12 -0
  456. package/packages/mcp-server/dist/server.js.map +1 -1
  457. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  458. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  459. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  460. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  461. package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
  462. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  463. package/packages/mcp-server/dist/workflow-tools.js +209 -103
  464. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  465. package/packages/mcp-server/package.json +5 -4
  466. package/packages/native/package.json +1 -1
  467. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  468. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  469. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  470. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  471. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  472. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  473. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  474. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  475. package/packages/pi-agent-core/dist/index.js +3 -0
  476. package/packages/pi-agent-core/dist/index.js.map +1 -1
  477. package/packages/pi-agent-core/package.json +1 -1
  478. package/packages/pi-ai/README.md +1 -0
  479. package/packages/pi-ai/dist/index.d.ts +2 -0
  480. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  481. package/packages/pi-ai/dist/index.js +2 -0
  482. package/packages/pi-ai/dist/index.js.map +1 -1
  483. package/packages/pi-ai/dist/models.generated.d.ts +183 -76
  484. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  485. package/packages/pi-ai/dist/models.generated.js +193 -112
  486. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  487. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  488. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  489. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  490. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  491. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  492. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  493. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  494. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  495. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  496. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  497. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  498. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  499. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  500. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  501. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  502. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  503. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  504. package/packages/pi-ai/package.json +3 -2
  505. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  506. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  507. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  508. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  510. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  511. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  513. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  514. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  515. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  516. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  517. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  518. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  520. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  521. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  522. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  524. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  525. package/packages/pi-coding-agent/dist/index.js +1 -1
  526. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  528. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  529. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  530. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  531. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  532. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  533. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  534. package/packages/pi-coding-agent/package.json +7 -7
  535. package/packages/pi-tui/dist/components/input.js +1 -1
  536. package/packages/pi-tui/dist/components/input.js.map +1 -1
  537. package/packages/pi-tui/dist/index.d.ts +1 -1
  538. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  539. package/packages/pi-tui/dist/index.js +1 -1
  540. package/packages/pi-tui/dist/index.js.map +1 -1
  541. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  542. package/packages/pi-tui/dist/keys.js +39 -30
  543. package/packages/pi-tui/dist/keys.js.map +1 -1
  544. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  546. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  547. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  548. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  549. package/packages/pi-tui/dist/terminal-image.js +54 -2
  550. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  551. package/packages/pi-tui/dist/tui.d.ts +8 -0
  552. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  553. package/packages/pi-tui/dist/tui.js +72 -18
  554. package/packages/pi-tui/dist/tui.js.map +1 -1
  555. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  556. package/packages/pi-tui/dist/utils.js +110 -36
  557. package/packages/pi-tui/dist/utils.js.map +1 -1
  558. package/packages/pi-tui/package.json +2 -2
  559. package/packages/rpc-client/package.json +2 -2
  560. package/pkg/dist/theme/theme.d.ts.map +1 -1
  561. package/pkg/dist/theme/theme.js +45 -17
  562. package/pkg/dist/theme/theme.js.map +1 -1
  563. package/pkg/package.json +1 -1
  564. package/src/resources/GSD-WORKFLOW.md +5 -4
  565. package/src/resources/extensions/ask-user-questions.ts +94 -26
  566. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  567. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  568. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  569. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  570. package/src/resources/extensions/async-jobs/index.ts +79 -0
  571. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  572. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  573. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  574. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  575. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  576. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  577. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  578. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  579. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  580. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  581. package/src/resources/extensions/browser-tools/index.ts +71 -13
  582. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  583. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  584. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  585. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  586. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +651 -483
  587. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +940 -7
  588. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -0
  589. package/src/resources/extensions/github-sync/templates.ts +3 -3
  590. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  591. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  592. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  593. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  594. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  595. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  596. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  597. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  598. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  599. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  600. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  601. package/src/resources/extensions/gsd/auto/loop.ts +89 -61
  602. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  603. package/src/resources/extensions/gsd/auto/orchestrator.ts +350 -81
  604. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  605. package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
  606. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  607. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  608. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  609. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  610. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  611. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  612. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  613. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  614. package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
  615. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
  616. package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
  617. package/src/resources/extensions/gsd/auto-prompts.ts +225 -44
  618. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  619. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  620. package/src/resources/extensions/gsd/auto-start.ts +65 -53
  621. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  622. package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
  623. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  624. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
  625. package/src/resources/extensions/gsd/auto-verification.ts +33 -36
  626. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  627. package/src/resources/extensions/gsd/auto-worktree.ts +83 -386
  628. package/src/resources/extensions/gsd/auto.ts +99 -34
  629. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  630. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  631. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  632. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +93 -49
  633. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  634. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  635. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  636. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +375 -177
  637. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
  638. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  639. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  640. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  641. package/src/resources/extensions/gsd/captures.ts +5 -16
  642. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  643. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  644. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  645. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  646. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  647. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  648. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  649. package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
  650. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  651. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  652. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  653. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  654. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  655. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  656. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  657. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  658. package/src/resources/extensions/gsd/constants.ts +0 -3
  659. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  660. package/src/resources/extensions/gsd/db/engine.ts +811 -0
  661. package/src/resources/extensions/gsd/db/queries.ts +519 -0
  662. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  663. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  664. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  665. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  666. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  667. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  668. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  669. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  670. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  671. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  672. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  673. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  674. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  675. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  676. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  677. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  678. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  679. package/src/resources/extensions/gsd/doctor.ts +15 -5
  680. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  681. package/src/resources/extensions/gsd/error-classifier.ts +12 -1
  682. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  683. package/src/resources/extensions/gsd/files.ts +33 -12
  684. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  685. package/src/resources/extensions/gsd/git-service.ts +1 -0
  686. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  687. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  688. package/src/resources/extensions/gsd/gsd-db.ts +190 -2375
  689. package/src/resources/extensions/gsd/guidance.ts +217 -0
  690. package/src/resources/extensions/gsd/guided-flow.ts +240 -585
  691. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  692. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  693. package/src/resources/extensions/gsd/markdown-renderer.ts +13 -1
  694. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  695. package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
  696. package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
  697. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  698. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  699. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  700. package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
  701. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  702. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  703. package/src/resources/extensions/gsd/milestone-closeout.ts +121 -28
  704. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  705. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  706. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  707. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  708. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  709. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  710. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  711. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  712. package/src/resources/extensions/gsd/model-router.ts +3 -0
  713. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  714. package/src/resources/extensions/gsd/notifications.ts +13 -6
  715. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  716. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  717. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  718. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  719. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  720. package/src/resources/extensions/gsd/paths.ts +42 -22
  721. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  722. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  723. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  724. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  725. package/src/resources/extensions/gsd/preferences.ts +191 -28
  726. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  727. package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -4
  728. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -2
  729. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  730. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  731. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  732. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  733. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  734. package/src/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  735. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  736. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  737. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  738. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  739. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  740. package/src/resources/extensions/gsd/prompts/system.md +6 -3
  741. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  742. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  743. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  744. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  745. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  746. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  747. package/src/resources/extensions/gsd/publication.ts +122 -0
  748. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  749. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  750. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  751. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  752. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  753. package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
  754. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  755. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  756. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  757. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  758. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  759. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  760. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  761. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  762. package/src/resources/extensions/gsd/state.ts +31 -27
  763. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  764. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  765. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  766. package/src/resources/extensions/gsd/templates/project.md +1 -0
  767. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  768. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  769. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  770. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  771. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  772. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  773. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +649 -26
  774. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  775. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  776. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  777. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +395 -30
  778. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  779. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +80 -2
  780. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  781. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  782. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  783. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  784. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  785. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  786. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  787. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  788. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  789. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  790. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  791. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  792. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  793. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  794. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  795. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  796. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  797. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
  798. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  799. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  800. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  801. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  802. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  803. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  804. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  805. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  806. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  807. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  808. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  809. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
  810. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  811. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  812. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  813. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  814. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  815. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  816. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  817. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  818. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  819. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  820. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  821. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  822. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  823. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  824. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  825. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  826. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  827. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  828. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  829. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  830. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  831. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  832. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  833. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  834. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  835. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  836. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  837. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  838. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  839. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  840. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  841. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  842. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  843. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +120 -4
  844. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  845. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  846. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  847. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  848. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  849. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  850. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  851. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  852. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  853. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  854. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  855. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  856. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  857. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  858. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  859. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  860. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  861. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  862. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  863. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  864. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  865. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  866. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  867. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  868. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  869. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +56 -2
  870. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  871. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  872. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +11 -4
  873. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  874. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  875. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  876. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  877. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
  878. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  879. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  880. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  881. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +51 -2
  882. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  883. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  884. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  885. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +300 -41
  886. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  887. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  888. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
  889. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  890. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  891. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  892. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  893. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  894. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  895. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  896. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  897. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  898. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  899. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  900. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  901. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -6
  902. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  903. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -2
  904. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  905. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  906. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  907. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  908. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  909. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
  910. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  911. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  912. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +193 -13
  913. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  914. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  915. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  916. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  917. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  918. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  919. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  920. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  921. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  922. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  923. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  924. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  925. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  926. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
  927. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  928. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  929. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  930. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  931. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  932. package/src/resources/extensions/gsd/tests/write-gate.test.ts +188 -1
  933. package/src/resources/extensions/gsd/tool-contract.ts +124 -11
  934. package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
  935. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  936. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  937. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  938. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  939. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  940. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  941. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  942. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  943. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  944. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +45 -2
  945. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  946. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  947. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  948. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  949. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  950. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  951. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  952. package/src/resources/extensions/gsd/uat-policy.ts +80 -25
  953. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  954. package/src/resources/extensions/gsd/undo.ts +9 -8
  955. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  956. package/src/resources/extensions/gsd/unit-context-composer.ts +196 -21
  957. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  958. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  959. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  960. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
  961. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  962. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  963. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  964. package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
  965. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  966. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  967. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  968. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  969. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  970. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  971. package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
  972. package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
  973. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  974. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  975. package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
  976. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  977. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  978. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  979. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  980. package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
  981. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  982. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  983. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  984. package/src/resources/extensions/gsd/worktree.ts +7 -1
  985. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  986. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  987. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  988. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  989. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  990. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  991. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  992. package/src/resources/shared/package-manager-detection.ts +1 -1
  993. package/src/resources/shared/package.json +3 -0
  994. package/src/resources/skills/create-skill/SKILL.md +3 -0
  995. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  996. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  997. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  998. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  999. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  1000. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  1001. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  1002. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  1003. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  1004. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -195
  1005. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  1006. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  1007. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  1008. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  1009. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  1010. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  1011. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  1012. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
  1013. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
  1014. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  1015. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
  1016. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
@@ -13,7 +13,8 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
13
13
  import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
14
14
 
15
15
  import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
16
- import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isMilestoneDepthVerified, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
16
+ import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
17
+ import { canonicalToolName } from "../engine-hook-contract.js";
17
18
  import { resolveManifest } from "../unit-context-manifest.js";
18
19
  import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
19
20
  import { loadFile, saveFile, formatContinue } from "../files.js";
@@ -25,10 +26,13 @@ import {
25
26
  isAutoActive,
26
27
  isAutoCompletionStopInProgress,
27
28
  isAutoPaused,
29
+ isInteractiveElicitationInFlight,
28
30
  markToolEnd,
29
31
  markToolStart,
32
+ recordAutoToolSurfaceSnapshot,
30
33
  recordToolInvocationError,
31
34
  } from "../auto-runtime-state.js";
35
+ import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
32
36
 
33
37
  import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
34
38
  import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
@@ -36,29 +40,44 @@ import { saveActivityLog } from "../activity-log.js";
36
40
  import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
37
41
  import { parseUnitId } from "../unit-id.js";
38
42
  import { classifyCommand } from "../safety/destructive-guard.js";
43
+ import {
44
+ confirmDestructiveCommand,
45
+ consumeDestructiveConfirmation,
46
+ isDestructiveConfirmGateId,
47
+ requestDestructiveConfirmation,
48
+ } from "../safety/destructive-confirmation.js";
39
49
  import { logWarning as safetyLogWarning } from "../workflow-logger.js";
50
+ import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
40
51
  import { installNotifyInterceptor } from "./notify-interceptor.js";
41
52
  import { initNotificationStore } from "../notification-store.js";
42
53
  import { initNotificationWidget } from "../notification-widget.js";
54
+ import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
43
55
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
44
56
  import { extractSubagentAgentClasses } from "./subagent-input.js";
45
- import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
57
+ import {
58
+ approvalGateIdForUnit,
59
+ evaluateAskUserQuestionsRound,
60
+ formatUnansweredConsentQuestionMessage,
61
+ isExplicitApprovalResponse,
62
+ messageHasPendingAskUserQuestionsTool,
63
+ shouldPauseForQuestion,
64
+ } from "../consent-question.js";
46
65
  import { resolveSkillManifest } from "../skill-manifest.js";
47
66
  import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
48
67
  import { getGuidedUnitContext } from "../guided-unit-context.js";
49
68
  import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
50
- import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
69
+ import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
70
+ import { hasBrowserContractPrefix } from "../../shared/browser-contract.js";
51
71
  import { filterToolsForProvider } from "../model-router.js";
72
+ import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
52
73
  import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
53
- import { injectSourceContextBlockIntoPayload, supportsSourceObservationsForUnit } from "../source-observations.js";
74
+ import { supportsSourceObservationsForUnit } from "../source-observations.js";
75
+ import { clearPendingAutoStart } from "../pending-auto-start.js";
76
+ import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
77
+ import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
54
78
 
55
79
  let approvalQuestionAbortInFlight = false;
56
80
 
57
- interface DeferredApprovalGate {
58
- gateId: string;
59
- basePath: string;
60
- }
61
-
62
81
  type WelcomeScreenModule = {
63
82
  buildWelcomeScreenLines(opts: { version: string; remoteChannel?: string; width?: number }): string[];
64
83
  };
@@ -129,7 +148,13 @@ async function installWelcomeHeader(ctx: ExtensionContext): Promise<void> {
129
148
  }
130
149
  }
131
150
 
132
- let deferredApprovalGate: DeferredApprovalGate | null = null;
151
+ /**
152
+ * Approval gates whose durable arming is deferred until tool execution /
153
+ * agent end, keyed by basePath. A Map (not a single slot) so concurrent
154
+ * projects in one process cannot lose each other's deferred gate; entries
155
+ * are bounded — cleared on activation, session boundaries, and verification.
156
+ */
157
+ const deferredApprovalGates = new Map<string, string>();
133
158
 
134
159
  export const MINIMAL_GSD_TOOL_NAMES = [
135
160
  "gsd_exec",
@@ -167,7 +192,7 @@ function withPreservedShimTools(toolNames: readonly string[]): string[] {
167
192
 
168
193
  /** True for the browser automation tools (browser_navigate, browser_click, ...). */
169
194
  function isBrowserTool(toolName: string): boolean {
170
- return canonicalToolName(toolName).startsWith("browser_");
195
+ return hasBrowserContractPrefix(canonicalToolName(toolName));
171
196
  }
172
197
 
173
198
  /**
@@ -210,16 +235,22 @@ function resolveScopedToolNames(
210
235
 
211
236
  for (const requested of requestedToolNames) {
212
237
  const scopedMatches: string[] = [];
238
+ const aliasFallbacks: string[] = [];
213
239
 
214
240
  for (const activeName of activeToolNames) {
215
- if (!activeName.startsWith("mcp__")) continue;
216
- const toolSeparator = activeName.indexOf("__", "mcp__".length);
217
- if (toolSeparator < 0) continue;
218
- if (activeName.slice(toolSeparator + 2) === requested) {
241
+ if (mcpToolMatchesBaseName(activeName, requested)) {
219
242
  scopedMatches.push(activeName);
243
+ } else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
244
+ aliasFallbacks.push(activeName);
220
245
  }
221
246
  }
222
247
 
248
+ // Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
249
+ // Prevents the alias from resurfacing alongside the canonical when both are in the active set.
250
+ if (!exact.has(requested) && scopedMatches.length === 0) {
251
+ scopedMatches.push(...aliasFallbacks);
252
+ }
253
+
223
254
  if (requested.startsWith("browser_") && scopedMatches.length > 0) {
224
255
  for (const match of scopedMatches) resolved.add(match);
225
256
  continue;
@@ -242,6 +273,7 @@ export function buildMinimalAutoGsdToolSet(
242
273
  activeToolNames: readonly string[],
243
274
  unitType: string | undefined,
244
275
  registeredToolNames: readonly string[] = activeToolNames,
276
+ warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
245
277
  ): string[] {
246
278
  if (unitType === "run-uat") {
247
279
  return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
@@ -257,7 +289,36 @@ export function buildMinimalAutoGsdToolSet(
257
289
  [...activeToolNames, ...registeredToolNames],
258
290
  [...MINIMAL_GSD_TOOL_NAMES, ...unitTools],
259
291
  );
260
- return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
292
+ const result = withPreservedShimTools([...new Set([...preserved, ...scoped])]);
293
+ warnIfRequiredWorkflowToolsUnresolved(unitType, result, warnOnUnresolvedRequiredTools);
294
+ return result;
295
+ }
296
+
297
+ function hasResolvedWorkflowTool(
298
+ resolvedToolNames: readonly string[],
299
+ requiredToolName: string,
300
+ ): boolean {
301
+ return resolvedToolNames.some(
302
+ (name) => name === requiredToolName || mcpToolMatchesBaseName(name, requiredToolName),
303
+ );
304
+ }
305
+
306
+ function warnIfRequiredWorkflowToolsUnresolved(
307
+ unitType: string | undefined,
308
+ scopedToolNames: readonly string[],
309
+ shouldWarn: boolean,
310
+ ): void {
311
+ if (!unitType || !shouldWarn) return;
312
+
313
+ const unresolved = getRequiredWorkflowToolsForUnit(unitType).filter(
314
+ (toolName) => !hasResolvedWorkflowTool(scopedToolNames, toolName),
315
+ );
316
+ if (unresolved.length === 0) return;
317
+
318
+ safetyLogWarning(
319
+ "bootstrap",
320
+ `buildMinimalAutoGsdToolSet(${unitType}): required workflow tool(s) not in active/registered surface after scoping: ${unresolved.join(", ")}. Tool registration may have partially failed, provider filtering may have removed a required tool, or workflow MCP may be disconnected.`,
321
+ );
261
322
  }
262
323
 
263
324
  export function buildRunUatGsdToolSet(
@@ -276,7 +337,7 @@ export function buildRunUatGsdToolSet(
276
337
  const resolved = [...new Set(scoped)];
277
338
 
278
339
  const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter(
279
- (tool) => !resolved.some((name) => name === tool || (name.startsWith("mcp__") && name.endsWith(`__${tool}`))),
340
+ (tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
280
341
  );
281
342
  if (unresolved.length > 0) {
282
343
  safetyLogWarning(
@@ -310,6 +371,7 @@ export function buildRequestScopedGsdToolSet(
310
371
  requestCustomMessages: readonly { customType?: string }[] | undefined,
311
372
  registeredToolNames: readonly string[] = activeToolNames,
312
373
  guidedUnitType?: string,
374
+ warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
313
375
  ): string[] | undefined {
314
376
  for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
315
377
  const currentCustomType = requestCustomMessages?.[index]?.customType;
@@ -320,7 +382,12 @@ export function buildRequestScopedGsdToolSet(
320
382
  currentCustomType === "gsd-triage"
321
383
  ) {
322
384
  if (guidedUnitType) {
323
- return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames);
385
+ return buildMinimalAutoGsdToolSet(
386
+ activeToolNames,
387
+ guidedUnitType,
388
+ registeredToolNames,
389
+ warnOnUnresolvedRequiredTools,
390
+ );
324
391
  }
325
392
  return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
326
393
  }
@@ -368,11 +435,23 @@ function applyMinimalGsdToolSurface(pi: ExtensionAPI): void {
368
435
  if (isFullGsdToolSurfaceRequested()) return;
369
436
  const dash = getAutoRuntimeSnapshot();
370
437
  if (dash.active && dash.currentUnit) {
371
- pi.setActiveTools(buildMinimalAutoGsdToolSet(
372
- pi.getActiveTools(),
438
+ const currentToolNames = pi.getActiveTools();
439
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
440
+ const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
441
+ const scopedToolNames = buildMinimalAutoGsdToolSet(
442
+ currentToolNames,
373
443
  dash.currentUnit.type,
374
- resolveRegisteredToolNames(pi, pi.getActiveTools()),
375
- ));
444
+ registeredToolNames,
445
+ hasRegisteredSurface,
446
+ );
447
+ recordAutoToolSurfaceSnapshot({
448
+ source: "runtime-scope",
449
+ unitType: dash.currentUnit.type,
450
+ modelFacingToolNames: scopedToolNames,
451
+ registeredToolNames,
452
+ scopedToolNames,
453
+ });
454
+ pi.setActiveTools(scopedToolNames);
376
455
  return;
377
456
  }
378
457
  if (!isGeneralGsdToolScopingRequested()) return;
@@ -385,10 +464,18 @@ export function scopeGsdWorkflowToolsForDispatch(
385
464
  ): ScopedGsdWorkflowState | null {
386
465
  if (isFullGsdToolSurfaceRequested()) return null;
387
466
  const current = pi.getActiveTools();
467
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
388
468
  const registeredToolNames = resolveRegisteredToolNames(pi, current);
389
469
  const scoped = unitType
390
- ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
470
+ ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
391
471
  : buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
472
+ recordAutoToolSurfaceSnapshot({
473
+ source: "dispatch-scope",
474
+ unitType,
475
+ modelFacingToolNames: scoped,
476
+ registeredToolNames,
477
+ scopedToolNames: scoped,
478
+ });
392
479
  const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
393
480
  const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
394
481
  if (!toolsChanged && !canScopeSkills) {
@@ -475,13 +562,22 @@ async function applyCompactionThresholdOverride(ctx: ExtensionContext): Promise<
475
562
  }
476
563
 
477
564
  function clearDeferredApprovalGate(basePath?: string): void {
478
- if (!basePath || deferredApprovalGate?.basePath === basePath) {
479
- deferredApprovalGate = null;
565
+ if (!basePath) {
566
+ deferredApprovalGates.clear();
567
+ } else {
568
+ deferredApprovalGates.delete(basePath);
480
569
  }
481
570
  }
482
571
 
483
572
  function deferApprovalGate(gateId: string, basePath: string): void {
484
- deferredApprovalGate = { gateId, basePath };
573
+ // Verified-on-disk wins (same adapter policy as activation/re-arm): if the
574
+ // workflow MCP child already verified this gate, deferring would block
575
+ // tools for a gate that can never legitimately arm.
576
+ const snapshot = hostWriteGateAdapter.readState(basePath);
577
+ if (isApprovalGateVerifiedInSnapshot(snapshot, gateId)) return;
578
+ const milestoneId = extractDepthVerificationMilestoneId(gateId);
579
+ if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId)) return;
580
+ deferredApprovalGates.set(basePath, gateId);
485
581
  }
486
582
 
487
583
  function contextBasePath(ctx?: { cwd?: string }): string {
@@ -538,9 +634,13 @@ function isShellExecutionTool(canonicalName: string): boolean {
538
634
  }
539
635
 
540
636
  function activateDeferredApprovalGate(basePath: string): void {
541
- if (deferredApprovalGate?.basePath !== basePath) return;
542
- setPendingGate(deferredApprovalGate.gateId, basePath);
543
- deferredApprovalGate = null;
637
+ const gateId = deferredApprovalGates.get(basePath);
638
+ if (gateId === undefined) return;
639
+ deferredApprovalGates.delete(basePath);
640
+ // hostWriteGateAdapter.setPending applies the verified-on-disk-wins merge
641
+ // policy: it refuses to arm (and thereby clobber) a gate the workflow MCP
642
+ // child already verified on disk.
643
+ hostWriteGateAdapter.setPending(gateId, basePath);
544
644
  }
545
645
 
546
646
  function extractGateQuestionId(input: unknown): string | undefined {
@@ -551,7 +651,7 @@ function extractGateQuestionId(input: unknown): string | undefined {
551
651
 
552
652
  function isApprovalGateBlocking(basePath: string): boolean {
553
653
  return Boolean(getPendingGate(basePath))
554
- || (deferredApprovalGate?.basePath === basePath);
654
+ || deferredApprovalGates.has(basePath);
555
655
  }
556
656
 
557
657
  function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
@@ -560,6 +660,26 @@ function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
560
660
  return (input as { artifact_type?: unknown }).artifact_type === "CONTEXT-DRAFT";
561
661
  }
562
662
 
663
+ /**
664
+ * External engines (claude-code-cli) deliver ask_user_questions results as
665
+ * relayed MCP tool results: the structured round payload arrives in
666
+ * `result.structuredContent`, not in pi-native `event.details`. Without this
667
+ * fallback, applyAskUserQuestionsGateResult sees no response for an answered
668
+ * gate question and lands in the "waiting" branch — leaving a re-armed gate
669
+ * permanently pending and the discuss→auto handoff blocked.
670
+ */
671
+ function resolveAskUserQuestionsGateDetails(event: { details?: unknown; result?: unknown }): any {
672
+ const hasRoundShape = (value: any): boolean =>
673
+ !!value && typeof value === "object" &&
674
+ (value.cancelled !== undefined || value.response !== undefined);
675
+
676
+ const details = event.details as any;
677
+ if (hasRoundShape(details)) return details;
678
+ const structured = (event.result as { structuredContent?: unknown } | undefined)?.structuredContent;
679
+ if (hasRoundShape(structured)) return structured;
680
+ return details ?? {};
681
+ }
682
+
563
683
  type StructuredQuestion = {
564
684
  id?: string;
565
685
  header?: string;
@@ -676,13 +796,14 @@ function shouldBlockDeferredApprovalTool(
676
796
  input: unknown,
677
797
  basePath: string,
678
798
  ): { block: boolean; reason?: string; displayReason?: string } {
679
- if (deferredApprovalGate?.basePath !== basePath) return { block: false };
799
+ const deferredGateId = deferredApprovalGates.get(basePath);
800
+ if (deferredGateId === undefined) return { block: false };
680
801
  if (toolName === "ask_user_questions") return { block: false };
681
802
  if (isContextDraftSummarySave(toolName, input)) return { block: false };
682
803
  return withDepthGateDisplayReason({
683
804
  block: true,
684
805
  reason: [
685
- `HARD BLOCK: Approval question "${deferredApprovalGate.gateId}" has been shown to the user.`,
806
+ `HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
686
807
  `Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
687
808
  `Wait for the user's answer before calling additional tools.`,
688
809
  ].join(" "),
@@ -697,6 +818,7 @@ function initSessionNotifications(ctx: ExtensionContext): void {
697
818
  initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
698
819
  installNotifyInterceptor(ctx);
699
820
  initNotificationWidget(ctx);
821
+ notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
700
822
  }
701
823
 
702
824
  async function prepareWorkflowMcpForHookContext(
@@ -768,7 +890,7 @@ export function registerHooks(
768
890
  }
769
891
  });
770
892
 
771
- pi.on("session_switch", async (_event, ctx) => {
893
+ pi.on("session_switch", async (event, ctx) => {
772
894
  const basePath = contextBasePath(ctx);
773
895
  const preserveCloseoutSurface = isAutoCompletionStopInProgress();
774
896
  initSessionNotifications(ctx);
@@ -777,6 +899,13 @@ export function registerHooks(
777
899
  clearDeferredApprovalGate();
778
900
  await resetAskUserQuestionsTurnCache();
779
901
  clearDiscussionFlowState(basePath);
902
+ // /clear or /new destroys the conversation holding a discuss interview, so
903
+ // its pending discuss→auto handoff can never be answered — clear it. Resume
904
+ // restores the interview transcript, so the entry survives. Auto-mode's own
905
+ // newSession() calls are safe: the handoff consumes the entry on agent_end.
906
+ if (event.reason === "new") {
907
+ clearPendingAutoStart(basePath);
908
+ }
780
909
  await syncServiceTierStatus(ctx);
781
910
  await applyDisabledModelProviderPolicy(ctx);
782
911
  await applyCompactionThresholdOverride(ctx);
@@ -804,10 +933,12 @@ export function registerHooks(
804
933
  const beforeAgentBasePath = contextBasePath(ctx);
805
934
  const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
806
935
  if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
807
- markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
936
+ // Host adapter explicitly: the ambient write-gate exports env-sniff the
937
+ // adapter per call and are reserved for the MCP child's import surface.
938
+ hostWriteGateAdapter.markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
808
939
  const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
809
- if (milestoneId) markDepthVerified(milestoneId, beforeAgentBasePath);
810
- clearPendingGate(beforeAgentBasePath);
940
+ if (milestoneId) hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
941
+ hostWriteGateAdapter.clearPending(beforeAgentBasePath);
811
942
  if (isAutoPaused() && !isAutoActive()) {
812
943
  const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
813
944
  void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
@@ -994,6 +1125,18 @@ export function registerHooks(
994
1125
 
995
1126
  pi.on("message_update", async (event, ctx: ExtensionContext) => {
996
1127
  if (approvalQuestionAbortInFlight) return;
1128
+ // If the model asked via ask_user_questions, that in-flight elicitation IS
1129
+ // the human boundary. Arming the pause/gate here (and emitting the "waiting
1130
+ // for your approval - pausing" notice) would tear it down and trigger the
1131
+ // foreground self-cancel/re-ask loop. The marker is set only by the
1132
+ // claude-code-cli SDK elicitation handler and is ungated, so it is true in
1133
+ // foreground; under the native-TUI provider it is always false and this path
1134
+ // runs unchanged (#cc-elicitation-self-cancel).
1135
+ if (isInteractiveElicitationInFlight()) return;
1136
+ // Prose with "?" can stream before the MCP tool/elicitation starts. When the
1137
+ // structured ask_user_questions call is already in the partial message, the
1138
+ // tool IS the human boundary — do not arm the text-based approval pause.
1139
+ if (messageHasPendingAskUserQuestionsTool(event.message)) return;
997
1140
 
998
1141
  const dash = getAutoRuntimeSnapshot();
999
1142
  if (dash.active) return;
@@ -1019,7 +1162,7 @@ export function registerHooks(
1019
1162
  }
1020
1163
  }
1021
1164
 
1022
- if (!shouldPauseForUserApprovalQuestion(unitType, [event.message])) return;
1165
+ if (!shouldPauseForQuestion(unitType, [event.message])) return;
1023
1166
 
1024
1167
  const gateId = approvalGateIdForUnit(unitType, unitId);
1025
1168
  if (gateId) {
@@ -1034,7 +1177,7 @@ export function registerHooks(
1034
1177
 
1035
1178
  approvalQuestionAbortInFlight = true;
1036
1179
  ctx.ui.notify(
1037
- `${unitType}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`,
1180
+ `${unitType ?? "The discussion"}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`,
1038
1181
  "info",
1039
1182
  );
1040
1183
  // The durable pending gate is activated at agent_end so same-turn
@@ -1062,6 +1205,13 @@ export function registerHooks(
1062
1205
  }
1063
1206
  });
1064
1207
 
1208
+ // Engine hook contract (../engine-hook-contract.ts): tool_call is
1209
+ // NATIVE_ONLY_TOOL_HOOKS — it never fires under external engines
1210
+ // (claude-code-cli pre-executes tools). The guards below (loop guard,
1211
+ // pending/deferred gate blocks, queue guard, planning-unit tools policy,
1212
+ // worktree write gate, STATE.md single-writer, context-write depth gate)
1213
+ // are therefore native-engine enforcement only. The write-gate arming
1214
+ // concern has a universal mirror at tool_execution_start below.
1065
1215
  pi.on("tool_call", async (event, ctx) => {
1066
1216
  const discussionBasePath = contextBasePath(ctx);
1067
1217
  const toolName = canonicalToolName(event.toolName);
@@ -1249,6 +1399,11 @@ export function registerHooks(
1249
1399
  });
1250
1400
 
1251
1401
  // ── Safety harness: evidence collection + destructive command blocking ──
1402
+ // Engine hook contract: tool_call is NATIVE_ONLY_TOOL_HOOKS. Evidence
1403
+ // collection here is mirrored universally at tool_execution_start
1404
+ // (safetyRecordToolCall dedupes by toolCallId); the destructive-command
1405
+ // hard gate has NO universal mirror — blocking is impossible once an
1406
+ // external engine has already executed the command.
1252
1407
  pi.on("tool_call", async (event, ctx) => {
1253
1408
  markToolStart(event.toolCallId, event.toolName);
1254
1409
  safetyRecordToolCall(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
@@ -1268,23 +1423,39 @@ export function registerHooks(
1268
1423
 
1269
1424
  // Destructive command classification + hard gate in all modes.
1270
1425
  if (isToolCallEventType("bash", event)) {
1271
- const classification = classifyCommand(event.input.command);
1426
+ const command = event.input.command;
1427
+ const classification = classifyCommand(command);
1272
1428
  if (classification.destructive) {
1429
+ const guardBasePath = contextBasePath(ctx);
1430
+ // Escape hatch: if the user already confirmed this exact command via a
1431
+ // destructive_confirm gate, consume the one-shot token and let it run.
1432
+ // Without this, the block below loops forever — the model cannot satisfy
1433
+ // "confirm in the current turn" because nothing ever clears the gate.
1434
+ if (consumeDestructiveConfirmation(command, guardBasePath)) {
1435
+ safetyLogWarning("safety", `destructive command confirmed: ${classification.labels.join(", ")}`, {
1436
+ command: String(command).slice(0, 200),
1437
+ });
1438
+ return;
1439
+ }
1440
+ // Record the command as pending so an affirmative answer to a
1441
+ // destructive_confirm gate (handled in tool_result) can confirm it.
1442
+ requestDestructiveConfirmation(command, guardBasePath);
1273
1443
  const reason = [
1274
1444
  "HARD BLOCK: destructive Bash command requires explicit human confirmation.",
1275
1445
  `Detected: ${classification.labels.join(", ")}`,
1276
- "Run this via ask_user_questions, wait for the user's response,",
1277
- "then issue the command only when confirmed in the current turn.",
1446
+ "Call ask_user_questions with a question id containing \"destructive_confirm\"",
1447
+ "and a first option that affirms the action; wait for the user's response,",
1448
+ "then re-issue this exact command in the same turn to run it once.",
1278
1449
  ].join(" ");
1279
1450
  safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
1280
- command: String(event.input.command).slice(0, 200),
1451
+ command: String(command).slice(0, 200),
1281
1452
  });
1282
1453
  if (ctx) {
1283
1454
  await maybePauseAutoForApprovalGate(
1284
1455
  ctx,
1285
1456
  pi,
1286
1457
  isAutoActive(),
1287
- "Depth confirmation is waiting for your answer — pausing auto-mode.",
1458
+ "Destructive-command confirmation is waiting for your answer — pausing auto-mode.",
1288
1459
  );
1289
1460
  }
1290
1461
  return { block: true, reason };
@@ -1292,6 +1463,11 @@ export function registerHooks(
1292
1463
  }
1293
1464
  });
1294
1465
 
1466
+ // Engine hook contract: tool_result is NATIVE_ONLY_TOOL_HOOKS — external
1467
+ // engines skip it. Error classification and markToolEnd are mirrored
1468
+ // universally at tool_execution_end; the ask_user_questions gate lifecycle
1469
+ // here is paired with the tool_execution_start arming path, which external
1470
+ // engines do reach.
1295
1471
  pi.on("tool_result", async (event, ctx) => {
1296
1472
  if (isAutoActive() && typeof event.toolCallId === "string") {
1297
1473
  markToolEnd(event.toolCallId);
@@ -1322,82 +1498,108 @@ export function registerHooks(
1322
1498
  } else if (isAutoActive()) {
1323
1499
  clearToolInvocationError();
1324
1500
  }
1501
+ // Interactive Closeout adapter (ADR-032): auto-mode owns closeout for its
1502
+ // own units; interactive completions get the durable git subset (commit +
1503
+ // Closeout Git Verdict) instead of silently bypassing git.isolation.
1504
+ if (!event.isError && !isAutoActive() && isUnitCloseoutTool(toolName)) {
1505
+ try {
1506
+ runInteractiveUnitCloseout({
1507
+ basePath: resolveWorkflowToolBasePath(ctx, event.input as { milestone_id?: string }),
1508
+ canonicalToolName: toolName,
1509
+ input: event.input,
1510
+ });
1511
+ } catch (err) {
1512
+ safetyLogWarning("engine", `interactive unit closeout failed: ${err instanceof Error ? err.message : String(err)}`);
1513
+ }
1514
+ }
1325
1515
  if (toolName !== "ask_user_questions") return;
1326
1516
  const basePath = contextBasePath(ctx);
1327
1517
  const milestoneId = await getDiscussionMilestoneIdFor(basePath);
1328
1518
 
1329
- const details = event.details as any;
1330
-
1331
- // ── Discussion gate enforcement: handle gate question responses ──
1332
- // If the result is cancelled or has no response, the pending gate stays active
1333
- // so the model is blocked from non-read-only tools until it re-asks.
1334
- // If the user responded at all (even "needs adjustment"), clear the pending gate
1335
- // because the user engaged — the prompt handles the re-ask-after-adjustment flow.
1336
- const questions: any[] = (event.input as any)?.questions ?? [];
1337
- const currentPendingGate = getPendingGate(basePath);
1338
- if (currentPendingGate) {
1339
- if (details?.cancelled || !details?.response) {
1340
- // Gate stays pending. Direct the agent to the most reliable recovery
1341
- // path — re-calling ask_user_questions with the same gate id — without
1342
- // misrepresenting the plain-text path. The plain-text path also works
1343
- // (isExplicitApprovalResponse on the next before_agent_start clears
1344
- // the gate when the user replies with an approval keyword), but the
1345
- // structured re-ask is more deterministic and gives the user a clear UI.
1346
- resetToolCallLoopGuard();
1347
- const interrupted = details?.interrupted === true;
1348
- if (ctx) {
1349
- await maybePauseAutoForApprovalGate(
1350
- ctx,
1351
- pi,
1352
- true,
1353
- interrupted
1354
- ? "Depth confirmation was interrupted — pausing auto-mode until you respond."
1355
- : "Depth confirmation is waiting for your answer — pausing auto-mode.",
1356
- );
1357
- }
1358
- return {
1359
- content: [{
1360
- type: "text" as const,
1361
- text: [
1362
- `Waiting for depth confirmation on gate "${currentPendingGate}".`,
1363
- interrupted
1364
- ? "The confirmation question was interrupted before a response was recorded."
1365
- : "No user response was received for the confirmation question.",
1366
- "Do not infer approval from earlier or prior messages.",
1367
- "Do not proceed, write files, save artifacts, or call other tools.",
1368
- `Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
1369
- ].join(" "),
1370
- }],
1371
- };
1372
- } else {
1373
- const pendingQuestion = questions.find((question) => question?.id === currentPendingGate);
1374
- if (pendingQuestion) {
1375
- const answer = details.response?.answers?.[currentPendingGate];
1376
- if (isDepthConfirmationAnswer(answer?.selected, pendingQuestion.options)) {
1377
- markApprovalGateVerified(currentPendingGate, basePath);
1378
- const milestoneIdFromGate = extractDepthVerificationMilestoneId(currentPendingGate);
1379
- if (milestoneIdFromGate) markDepthVerified(milestoneIdFromGate, basePath);
1380
- clearPendingGate(basePath);
1381
- clearDeferredApprovalGate(basePath);
1382
- }
1383
- }
1519
+ const details = resolveAskUserQuestionsGateDetails(event);
1520
+
1521
+ const questions: any[] = (event.input as any)?.questions ?? details?.questions ?? [];
1522
+ const gateResult = applyAskUserQuestionsGateResult({
1523
+ basePath,
1524
+ questions,
1525
+ details,
1526
+ fallbackMilestoneId: milestoneId,
1527
+ });
1528
+ if (gateResult.status === "waiting") {
1529
+ resetToolCallLoopGuard();
1530
+ if (ctx) {
1531
+ await maybePauseAutoForApprovalGate(
1532
+ ctx,
1533
+ pi,
1534
+ true,
1535
+ gateResult.interrupted
1536
+ ? "Depth confirmation was interrupted — pausing auto-mode until you respond."
1537
+ : "Depth confirmation is waiting for your answer — pausing auto-mode.",
1538
+ );
1384
1539
  }
1540
+ return {
1541
+ content: [{
1542
+ type: "text" as const,
1543
+ text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
1544
+ }],
1545
+ };
1546
+ }
1547
+ if (gateResult.status === "verified") {
1548
+ clearDeferredApprovalGate(basePath);
1385
1549
  }
1386
1550
 
1387
- if (details?.cancelled || !details?.response) return;
1551
+ // ── Consent Question policy (consent-question.ts): one home for the
1552
+ // answer lifecycle of every ask_user_questions round. Per-question
1553
+ // verdicts come from the consent-verdict leaf — the same engine
1554
+ // applyAskUserQuestionsGateResult consumed above for gate persistence —
1555
+ // so empty answers on fail-closed kinds never pass as real answers (#528)
1556
+ // and cancellations get one unified handler.
1557
+ const roundOutcome = evaluateAskUserQuestionsRound(questions, details ?? {});
1558
+ if (roundOutcome === "cancelled") {
1559
+ resetToolCallLoopGuard();
1560
+ if (ctx) {
1561
+ await maybePauseAutoForApprovalGate(
1562
+ ctx,
1563
+ pi,
1564
+ true,
1565
+ "ask_user_questions was cancelled before receiving a response — pausing auto-mode until you respond.",
1566
+ );
1567
+ }
1568
+ return;
1569
+ }
1570
+ if (roundOutcome === "waiting") {
1571
+ resetToolCallLoopGuard();
1572
+ if (ctx) {
1573
+ await maybePauseAutoForApprovalGate(
1574
+ ctx,
1575
+ pi,
1576
+ true,
1577
+ "A user question received no answer — pausing auto-mode until you respond.",
1578
+ );
1579
+ }
1580
+ return {
1581
+ content: [{
1582
+ type: "text" as const,
1583
+ text: formatUnansweredConsentQuestionMessage(questions),
1584
+ }],
1585
+ };
1586
+ }
1388
1587
 
1588
+ // Cancelled rounds already returned via roundOutcome === "cancelled".
1589
+ if (!details?.response) return;
1590
+
1591
+ // Destructive-command confirmation: an affirmative answer to a
1592
+ // destructive_confirm gate promotes the pending blocked command to a
1593
+ // one-shot confirmed token, which the bash tool_call guard consumes on the
1594
+ // next attempt. Rejecting/declining leaves the command blocked.
1595
+ // (Depth-verification gate handling now lives in
1596
+ // applyAskUserQuestionsGateResult above; only the destructive-confirm gate
1597
+ // is handled inline here.)
1389
1598
  for (const question of questions) {
1390
- if (typeof question.id === "string" && question.id.includes("depth_verification")) {
1391
- // Only unlock the gate if the user selected the first option (confirmation).
1392
- // Cross-references against the question's defined options to reject free-form "Other" text.
1599
+ if (isDestructiveConfirmGateId(question?.id)) {
1393
1600
  const answer = details.response?.answers?.[question.id];
1394
- const inferredMilestoneId = extractDepthVerificationMilestoneId(question.id) ?? milestoneId;
1395
1601
  if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
1396
- if (currentPendingGate && question.id !== currentPendingGate) break;
1397
- markApprovalGateVerified(question.id, basePath);
1398
- markDepthVerified(inferredMilestoneId, basePath);
1399
- clearPendingGate(basePath);
1400
- clearDeferredApprovalGate(basePath);
1602
+ confirmDestructiveCommand(basePath);
1401
1603
  }
1402
1604
  break;
1403
1605
  }
@@ -1407,20 +1609,50 @@ export function registerHooks(
1407
1609
  await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
1408
1610
  });
1409
1611
 
1612
+ // Engine hook contract: tool_execution_start is UNIVERSAL_TOOL_HOOKS — the
1613
+ // only pre-execution event that fires for every tool call on every engine.
1614
+ // Universal mirrors live here: write-gate arming and evidence collection.
1410
1615
  pi.on("tool_execution_start", async (event, ctx) => {
1411
1616
  const basePath = contextBasePath(ctx);
1412
1617
  const toolName = canonicalToolName(event.toolName);
1413
1618
  if (toolName === "ask_user_questions") {
1414
1619
  const questionId = extractGateQuestionId(event.args);
1415
1620
  if (typeof questionId === "string") {
1416
- setPendingGate(questionId, basePath);
1621
+ // External engines (claude-code-cli) ingest the SDK turn's tool blocks
1622
+ // post-hoc, so this event can fire AFTER the workflow MCP child already
1623
+ // verified this gate and allowed the CONTEXT save. Arming also revokes
1624
+ // verifiedDepthMilestones/verifiedApprovalGates, so an unconditional
1625
+ // re-arm here would wipe the child's verification and leave the
1626
+ // discuss→auto handoff permanently blocked. hostWriteGateAdapter
1627
+ // .setPending applies the verified-on-disk-wins policy and skips the
1628
+ // re-arm in that case. Stale verified state cannot leak into a later
1629
+ // re-discussion: a successful handoff deletes the snapshot via
1630
+ // clearDiscussionFlowState.
1631
+ hostWriteGateAdapter.setPending(questionId, basePath);
1417
1632
  clearDeferredApprovalGate(basePath);
1418
1633
  }
1419
1634
  }
1635
+
1636
+ // Safety harness: record evidence here, not only in tool_call — see
1637
+ // ../engine-hook-contract.ts for why tool_call never fires under external
1638
+ // engines. recordToolCall dedupes by toolCallId, so native tools (which
1639
+ // hit both events) record once.
1640
+ safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}) as Record<string, unknown>);
1641
+ const execDash = getAutoRuntimeSnapshot();
1642
+ if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
1643
+ const { milestone: xMid, slice: xSid, task: xTid } = parseUnitId(execDash.currentUnit.id);
1644
+ if (xMid && xSid && xTid) {
1645
+ saveEvidenceToDisk(execDash.basePath, xMid, xSid, xTid);
1646
+ }
1647
+ }
1648
+
1420
1649
  if (!isAutoActive()) return;
1421
1650
  markToolStart(event.toolCallId, event.toolName);
1422
1651
  });
1423
1652
 
1653
+ // Engine hook contract: tool_execution_end is UNIVERSAL_TOOL_HOOKS — fires
1654
+ // for every finalized tool call on every engine, so error classification
1655
+ // and evidence persistence here cover external engines that skip tool_result.
1424
1656
  pi.on("tool_execution_end", async (event) => {
1425
1657
  markToolEnd(event.toolCallId);
1426
1658
  // #2883/#4974: Capture deterministic invocation/policy errors
@@ -1458,66 +1690,10 @@ export function registerHooks(
1458
1690
  const payload = event.payload as Record<string, unknown> | null;
1459
1691
  if (!payload || typeof payload !== "object") return;
1460
1692
 
1461
- // ── Context Management ──────────────────────────────────────────────
1462
- // Load preferences once for both masking and truncation.
1463
- try {
1464
- const { loadEffectiveGSDPreferences } = await import("../preferences.js");
1465
- const {
1466
- createObservationMask,
1467
- createResponsesInputObservationMask,
1468
- truncateContextResultMessages,
1469
- truncateResponsesInputResultItems,
1470
- } = await import("../context-masker.js");
1471
- const prefs = loadEffectiveGSDPreferences();
1472
- const cmConfig = prefs?.preferences.context_management;
1473
-
1474
- // Observation masking: replace old tool results with placeholders.
1475
- // Only active during auto-mode when context_management.observation_masking is enabled.
1476
- if (isAutoActive() && cmConfig?.observation_masking !== false) {
1477
- const keepTurns = cmConfig?.observation_mask_turns ?? 8;
1478
- const messages = payload.messages;
1479
- if (Array.isArray(messages)) {
1480
- payload.messages = createObservationMask(keepTurns)(messages);
1481
- }
1482
- const input = payload.input;
1483
- if (Array.isArray(input)) {
1484
- payload.input = createResponsesInputObservationMask(keepTurns)(input);
1485
- }
1486
- }
1487
-
1488
- // Tool result truncation: cap individual tool result content length.
1489
- // Applies in ALL modes (auto + interactive) to prevent context bloat.
1490
- // In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
1491
- // Creates new objects to avoid mutating shared conversation state.
1492
- const maxChars = cmConfig?.tool_result_max_chars ?? 800;
1493
- const msgs = payload.messages;
1494
- if (Array.isArray(msgs)) {
1495
- payload.messages = truncateContextResultMessages(msgs as any, maxChars);
1496
- }
1497
- const input = payload.input;
1498
- if (Array.isArray(input)) {
1499
- payload.input = truncateResponsesInputResultItems(input as any, maxChars);
1500
- }
1501
- } catch { /* non-fatal */ }
1502
-
1503
- try {
1504
- if (isAutoActive()) {
1505
- const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
1506
- if (sourceContextBlock) {
1507
- const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
1508
- Object.assign(payload, nextPayload);
1509
- }
1510
- }
1511
- } catch { /* non-fatal */ }
1512
-
1513
- // ── Service Tier ────────────────────────────────────────────────────
1514
- const modelId = event.model?.id;
1515
- if (!modelId) return payload;
1516
- const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
1517
- const tier = getEffectiveServiceTier();
1518
- if (!tier || !supportsServiceTier(modelId)) return payload;
1519
- payload.service_tier = tier;
1520
- return payload;
1693
+ return applyProviderPayloadPolicy({
1694
+ payload,
1695
+ modelId: event.model?.id,
1696
+ });
1521
1697
  });
1522
1698
 
1523
1699
  // Capability-aware model routing hook (ADR-004)
@@ -1553,31 +1729,53 @@ export function registerHooks(
1553
1729
  return surfaceReduced ? { toolNames: providerCompatible } : undefined;
1554
1730
  }
1555
1731
  const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
1732
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
1556
1733
  const compatibleRegisteredToolNames = filterToolsForProvider(
1557
1734
  registeredToolNames,
1558
1735
  event.selectedModelApi,
1559
1736
  event.selectedModelProvider,
1560
1737
  ).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
1561
1738
  const guidedUnit = getGuidedUnitContext();
1739
+ const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
1740
+ ? compatibleRegisteredToolNames
1741
+ : registeredToolNames;
1562
1742
  const requestScoped = buildRequestScopedGsdToolSet(
1563
1743
  guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1564
1744
  event.requestCustomMessages,
1565
- guidedUnit?.unitType === "run-uat" ? compatibleRegisteredToolNames : registeredToolNames,
1745
+ requestRegisteredToolNames,
1566
1746
  guidedUnit?.unitType,
1747
+ hasRegisteredSurface,
1567
1748
  );
1568
1749
  if (requestScoped) {
1750
+ recordAutoToolSurfaceSnapshot({
1751
+ source: "provider-adjustment",
1752
+ unitType: guidedUnit?.unitType,
1753
+ modelFacingToolNames: requestScoped,
1754
+ registeredToolNames: requestRegisteredToolNames,
1755
+ scopedToolNames: requestScoped,
1756
+ });
1569
1757
  return { toolNames: requestScoped };
1570
1758
  }
1571
1759
  const dash = getAutoRuntimeSnapshot();
1572
1760
  if (dash.active && dash.currentUnit) {
1761
+ const registeredForUnit = dash.currentUnit.type === "run-uat"
1762
+ ? compatibleRegisteredToolNames
1763
+ : resolveRegisteredToolNames(pi, event.activeToolNames);
1764
+ const scopedToolNames = buildMinimalAutoGsdToolSet(
1765
+ dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1766
+ dash.currentUnit.type,
1767
+ registeredForUnit,
1768
+ hasRegisteredSurface,
1769
+ );
1770
+ recordAutoToolSurfaceSnapshot({
1771
+ source: "provider-adjustment",
1772
+ unitType: dash.currentUnit.type,
1773
+ modelFacingToolNames: scopedToolNames,
1774
+ registeredToolNames: registeredForUnit,
1775
+ scopedToolNames,
1776
+ });
1573
1777
  return {
1574
- toolNames: buildMinimalAutoGsdToolSet(
1575
- dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1576
- dash.currentUnit.type,
1577
- dash.currentUnit.type === "run-uat"
1578
- ? compatibleRegisteredToolNames
1579
- : resolveRegisteredToolNames(pi, event.activeToolNames),
1580
- ),
1778
+ toolNames: scopedToolNames,
1581
1779
  };
1582
1780
  }
1583
1781
  if (isGeneralGsdToolScopingRequested()) {