@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
@@ -7,31 +7,41 @@ import { isToolCallEventType } from "@gsd/pi-coding-agent";
7
7
  import { ALWAYS_PRESERVED_SHIM_TOOL_NAMES } from "@gsd/pi-ai";
8
8
  import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
9
9
  import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
10
- import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isMilestoneDepthVerified, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
10
+ import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
11
+ import { canonicalToolName } from "../engine-hook-contract.js";
11
12
  import { resolveManifest } from "../unit-context-manifest.js";
12
13
  import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
13
14
  import { loadFile, saveFile, formatContinue } from "../files.js";
14
- import { clearAutoCompletionStopInProgress, clearToolInvocationError, getAutoRuntimeSnapshot, getSourceObservationStore, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError, } from "../auto-runtime-state.js";
15
+ import { clearAutoCompletionStopInProgress, clearToolInvocationError, getAutoRuntimeSnapshot, getSourceObservationStore, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, isInteractiveElicitationInFlight, markToolEnd, markToolStart, recordAutoToolSurfaceSnapshot, recordToolInvocationError, } from "../auto-runtime-state.js";
16
+ import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
15
17
  import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
16
18
  import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
17
19
  import { saveActivityLog } from "../activity-log.js";
18
20
  import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
19
21
  import { parseUnitId } from "../unit-id.js";
20
22
  import { classifyCommand } from "../safety/destructive-guard.js";
23
+ import { confirmDestructiveCommand, consumeDestructiveConfirmation, isDestructiveConfirmGateId, requestDestructiveConfirmation, } from "../safety/destructive-confirmation.js";
21
24
  import { logWarning as safetyLogWarning } from "../workflow-logger.js";
25
+ import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
22
26
  import { installNotifyInterceptor } from "./notify-interceptor.js";
23
27
  import { initNotificationStore } from "../notification-store.js";
24
28
  import { initNotificationWidget } from "../notification-widget.js";
29
+ import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
25
30
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
26
31
  import { extractSubagentAgentClasses } from "./subagent-input.js";
27
- import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
32
+ import { approvalGateIdForUnit, evaluateAskUserQuestionsRound, formatUnansweredConsentQuestionMessage, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool, shouldPauseForQuestion, } from "../consent-question.js";
28
33
  import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
29
34
  import { getGuidedUnitContext } from "../guided-unit-context.js";
30
35
  import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
31
- import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
36
+ import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
37
+ import { hasBrowserContractPrefix } from "../../shared/browser-contract.js";
32
38
  import { filterToolsForProvider } from "../model-router.js";
39
+ import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
33
40
  import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
34
- import { injectSourceContextBlockIntoPayload, supportsSourceObservationsForUnit } from "../source-observations.js";
41
+ import { supportsSourceObservationsForUnit } from "../source-observations.js";
42
+ import { clearPendingAutoStart } from "../pending-auto-start.js";
43
+ import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
44
+ import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
35
45
  let approvalQuestionAbortInFlight = false;
36
46
  async function loadWelcomeScreenModule() {
37
47
  const candidates = [];
@@ -100,7 +110,13 @@ async function installWelcomeHeader(ctx) {
100
110
  /* non-fatal */
101
111
  }
102
112
  }
103
- let deferredApprovalGate = null;
113
+ /**
114
+ * Approval gates whose durable arming is deferred until tool execution /
115
+ * agent end, keyed by basePath. A Map (not a single slot) so concurrent
116
+ * projects in one process cannot lose each other's deferred gate; entries
117
+ * are bounded — cleared on activation, session boundaries, and verification.
118
+ */
119
+ const deferredApprovalGates = new Map();
104
120
  export const MINIMAL_GSD_TOOL_NAMES = [
105
121
  "gsd_exec",
106
122
  "gsd_exec_search",
@@ -134,7 +150,7 @@ function withPreservedShimTools(toolNames) {
134
150
  }
135
151
  /** True for the browser automation tools (browser_navigate, browser_click, ...). */
136
152
  function isBrowserTool(toolName) {
137
- return canonicalToolName(toolName).startsWith("browser_");
153
+ return hasBrowserContractPrefix(canonicalToolName(toolName));
138
154
  }
139
155
  /**
140
156
  * True when any message in the request is driven by a GSD workflow command
@@ -165,15 +181,19 @@ function resolveScopedToolNames(activeToolNames, requestedToolNames) {
165
181
  const resolved = new Set();
166
182
  for (const requested of requestedToolNames) {
167
183
  const scopedMatches = [];
184
+ const aliasFallbacks = [];
168
185
  for (const activeName of activeToolNames) {
169
- if (!activeName.startsWith("mcp__"))
170
- continue;
171
- const toolSeparator = activeName.indexOf("__", "mcp__".length);
172
- if (toolSeparator < 0)
173
- continue;
174
- if (activeName.slice(toolSeparator + 2) === requested) {
186
+ if (mcpToolMatchesBaseName(activeName, requested)) {
175
187
  scopedMatches.push(activeName);
176
188
  }
189
+ else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
190
+ aliasFallbacks.push(activeName);
191
+ }
192
+ }
193
+ // Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
194
+ // Prevents the alias from resurfacing alongside the canonical when both are in the active set.
195
+ if (!exact.has(requested) && scopedMatches.length === 0) {
196
+ scopedMatches.push(...aliasFallbacks);
177
197
  }
178
198
  if (requested.startsWith("browser_") && scopedMatches.length > 0) {
179
199
  for (const match of scopedMatches)
@@ -192,7 +212,7 @@ export function buildMinimalGsdToolSet(activeToolNames) {
192
212
  const minimal = resolveScopedToolNames(activeToolNames, MINIMAL_GSD_TOOL_NAMES);
193
213
  return withPreservedShimTools([...new Set([...preserved, ...minimal])]);
194
214
  }
195
- export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registeredToolNames = activeToolNames) {
215
+ export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registeredToolNames = activeToolNames, warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames) {
196
216
  if (unitType === "run-uat") {
197
217
  return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
198
218
  }
@@ -204,7 +224,20 @@ export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registered
204
224
  ...availableBaseTools,
205
225
  ])];
206
226
  const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], [...MINIMAL_GSD_TOOL_NAMES, ...unitTools]);
207
- return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
227
+ const result = withPreservedShimTools([...new Set([...preserved, ...scoped])]);
228
+ warnIfRequiredWorkflowToolsUnresolved(unitType, result, warnOnUnresolvedRequiredTools);
229
+ return result;
230
+ }
231
+ function hasResolvedWorkflowTool(resolvedToolNames, requiredToolName) {
232
+ return resolvedToolNames.some((name) => name === requiredToolName || mcpToolMatchesBaseName(name, requiredToolName));
233
+ }
234
+ function warnIfRequiredWorkflowToolsUnresolved(unitType, scopedToolNames, shouldWarn) {
235
+ if (!unitType || !shouldWarn)
236
+ return;
237
+ const unresolved = getRequiredWorkflowToolsForUnit(unitType).filter((toolName) => !hasResolvedWorkflowTool(scopedToolNames, toolName));
238
+ if (unresolved.length === 0)
239
+ return;
240
+ safetyLogWarning("bootstrap", `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.`);
208
241
  }
209
242
  export function buildRunUatGsdToolSet(activeToolNames, registeredToolNames = activeToolNames) {
210
243
  const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], [
@@ -214,7 +247,7 @@ export function buildRunUatGsdToolSet(activeToolNames, registeredToolNames = act
214
247
  ...RUN_UAT_BROWSER_TOOL_NAMES,
215
248
  ]);
216
249
  const resolved = [...new Set(scoped)];
217
- const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter((tool) => !resolved.some((name) => name === tool || (name.startsWith("mcp__") && name.endsWith(`__${tool}`))));
250
+ const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter((tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
218
251
  if (unresolved.length > 0) {
219
252
  safetyLogWarning("bootstrap", `buildRunUatGsdToolSet: required run-uat workflow tool(s) not found in active/registered surface: ${unresolved.join(", ")}. Session may lack gsd-workflow MCP connection.`);
220
253
  }
@@ -230,7 +263,7 @@ export function buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNa
230
263
  const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], WORKFLOW_GSD_TOOL_NAMES);
231
264
  return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
232
265
  }
233
- export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages, registeredToolNames = activeToolNames, guidedUnitType) {
266
+ export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages, registeredToolNames = activeToolNames, guidedUnitType, warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames) {
234
267
  for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
235
268
  const currentCustomType = requestCustomMessages?.[index]?.customType;
236
269
  if (currentCustomType === "gsd-run" ||
@@ -238,7 +271,7 @@ export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessa
238
271
  currentCustomType === "gsd-doctor-heal" ||
239
272
  currentCustomType === "gsd-triage") {
240
273
  if (guidedUnitType) {
241
- return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames);
274
+ return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames, warnOnUnresolvedRequiredTools);
242
275
  }
243
276
  return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
244
277
  }
@@ -271,7 +304,18 @@ function applyMinimalGsdToolSurface(pi) {
271
304
  return;
272
305
  const dash = getAutoRuntimeSnapshot();
273
306
  if (dash.active && dash.currentUnit) {
274
- pi.setActiveTools(buildMinimalAutoGsdToolSet(pi.getActiveTools(), dash.currentUnit.type, resolveRegisteredToolNames(pi, pi.getActiveTools())));
307
+ const currentToolNames = pi.getActiveTools();
308
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
309
+ const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
310
+ const scopedToolNames = buildMinimalAutoGsdToolSet(currentToolNames, dash.currentUnit.type, registeredToolNames, hasRegisteredSurface);
311
+ recordAutoToolSurfaceSnapshot({
312
+ source: "runtime-scope",
313
+ unitType: dash.currentUnit.type,
314
+ modelFacingToolNames: scopedToolNames,
315
+ registeredToolNames,
316
+ scopedToolNames,
317
+ });
318
+ pi.setActiveTools(scopedToolNames);
275
319
  return;
276
320
  }
277
321
  if (!isGeneralGsdToolScopingRequested())
@@ -282,10 +326,18 @@ export function scopeGsdWorkflowToolsForDispatch(pi, unitType) {
282
326
  if (isFullGsdToolSurfaceRequested())
283
327
  return null;
284
328
  const current = pi.getActiveTools();
329
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
285
330
  const registeredToolNames = resolveRegisteredToolNames(pi, current);
286
331
  const scoped = unitType
287
- ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
332
+ ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
288
333
  : buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
334
+ recordAutoToolSurfaceSnapshot({
335
+ source: "dispatch-scope",
336
+ unitType,
337
+ modelFacingToolNames: scoped,
338
+ registeredToolNames,
339
+ scopedToolNames: scoped,
340
+ });
289
341
  const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
290
342
  const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
291
343
  if (!toolsChanged && !canScopeSkills) {
@@ -363,12 +415,24 @@ async function applyCompactionThresholdOverride(ctx) {
363
415
  }
364
416
  }
365
417
  function clearDeferredApprovalGate(basePath) {
366
- if (!basePath || deferredApprovalGate?.basePath === basePath) {
367
- deferredApprovalGate = null;
418
+ if (!basePath) {
419
+ deferredApprovalGates.clear();
420
+ }
421
+ else {
422
+ deferredApprovalGates.delete(basePath);
368
423
  }
369
424
  }
370
425
  function deferApprovalGate(gateId, basePath) {
371
- deferredApprovalGate = { gateId, basePath };
426
+ // Verified-on-disk wins (same adapter policy as activation/re-arm): if the
427
+ // workflow MCP child already verified this gate, deferring would block
428
+ // tools for a gate that can never legitimately arm.
429
+ const snapshot = hostWriteGateAdapter.readState(basePath);
430
+ if (isApprovalGateVerifiedInSnapshot(snapshot, gateId))
431
+ return;
432
+ const milestoneId = extractDepthVerificationMilestoneId(gateId);
433
+ if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId))
434
+ return;
435
+ deferredApprovalGates.set(basePath, gateId);
372
436
  }
373
437
  function contextBasePath(ctx) {
374
438
  return typeof ctx?.cwd === "string" ? ctx.cwd : process.cwd();
@@ -418,10 +482,14 @@ function isShellExecutionTool(canonicalName) {
418
482
  canonicalName === "powershell";
419
483
  }
420
484
  function activateDeferredApprovalGate(basePath) {
421
- if (deferredApprovalGate?.basePath !== basePath)
485
+ const gateId = deferredApprovalGates.get(basePath);
486
+ if (gateId === undefined)
422
487
  return;
423
- setPendingGate(deferredApprovalGate.gateId, basePath);
424
- deferredApprovalGate = null;
488
+ deferredApprovalGates.delete(basePath);
489
+ // hostWriteGateAdapter.setPending applies the verified-on-disk-wins merge
490
+ // policy: it refuses to arm (and thereby clobber) a gate the workflow MCP
491
+ // child already verified on disk.
492
+ hostWriteGateAdapter.setPending(gateId, basePath);
425
493
  }
426
494
  function extractGateQuestionId(input) {
427
495
  const questions = input?.questions ?? [];
@@ -430,7 +498,7 @@ function extractGateQuestionId(input) {
430
498
  }
431
499
  function isApprovalGateBlocking(basePath) {
432
500
  return Boolean(getPendingGate(basePath))
433
- || (deferredApprovalGate?.basePath === basePath);
501
+ || deferredApprovalGates.has(basePath);
434
502
  }
435
503
  function isContextDraftSummarySave(toolName, input) {
436
504
  if (toolName !== "gsd_summary_save" && toolName !== "summary_save")
@@ -439,6 +507,25 @@ function isContextDraftSummarySave(toolName, input) {
439
507
  return false;
440
508
  return input.artifact_type === "CONTEXT-DRAFT";
441
509
  }
510
+ /**
511
+ * External engines (claude-code-cli) deliver ask_user_questions results as
512
+ * relayed MCP tool results: the structured round payload arrives in
513
+ * `result.structuredContent`, not in pi-native `event.details`. Without this
514
+ * fallback, applyAskUserQuestionsGateResult sees no response for an answered
515
+ * gate question and lands in the "waiting" branch — leaving a re-armed gate
516
+ * permanently pending and the discuss→auto handoff blocked.
517
+ */
518
+ function resolveAskUserQuestionsGateDetails(event) {
519
+ const hasRoundShape = (value) => !!value && typeof value === "object" &&
520
+ (value.cancelled !== undefined || value.response !== undefined);
521
+ const details = event.details;
522
+ if (hasRoundShape(details))
523
+ return details;
524
+ const structured = event.result?.structuredContent;
525
+ if (hasRoundShape(structured))
526
+ return structured;
527
+ return details ?? {};
528
+ }
442
529
  function selectedAnswerLabel(selected) {
443
530
  if (Array.isArray(selected))
444
531
  return selected.map(String).join(", ");
@@ -518,7 +605,8 @@ function withDepthGateDisplayReason(result, displayReason = "Depth confirmation
518
605
  return { ...result, displayReason };
519
606
  }
520
607
  function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
521
- if (deferredApprovalGate?.basePath !== basePath)
608
+ const deferredGateId = deferredApprovalGates.get(basePath);
609
+ if (deferredGateId === undefined)
522
610
  return { block: false };
523
611
  if (toolName === "ask_user_questions")
524
612
  return { block: false };
@@ -527,7 +615,7 @@ function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
527
615
  return withDepthGateDisplayReason({
528
616
  block: true,
529
617
  reason: [
530
- `HARD BLOCK: Approval question "${deferredApprovalGate.gateId}" has been shown to the user.`,
618
+ `HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
531
619
  `Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
532
620
  `Wait for the user's answer before calling additional tools.`,
533
621
  ].join(" "),
@@ -540,6 +628,7 @@ function initSessionNotifications(ctx) {
540
628
  initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
541
629
  installNotifyInterceptor(ctx);
542
630
  initNotificationWidget(ctx);
631
+ notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
543
632
  }
544
633
  async function prepareWorkflowMcpForHookContext(ctx, basePath) {
545
634
  // Skip MCP auto-prep when running inside an auto-worktree. The worktree
@@ -601,7 +690,7 @@ export function registerHooks(pi, ecosystemHandlers) {
601
690
  catch { /* non-fatal */ }
602
691
  }
603
692
  });
604
- pi.on("session_switch", async (_event, ctx) => {
693
+ pi.on("session_switch", async (event, ctx) => {
605
694
  const basePath = contextBasePath(ctx);
606
695
  const preserveCloseoutSurface = isAutoCompletionStopInProgress();
607
696
  initSessionNotifications(ctx);
@@ -610,6 +699,13 @@ export function registerHooks(pi, ecosystemHandlers) {
610
699
  clearDeferredApprovalGate();
611
700
  await resetAskUserQuestionsTurnCache();
612
701
  clearDiscussionFlowState(basePath);
702
+ // /clear or /new destroys the conversation holding a discuss interview, so
703
+ // its pending discuss→auto handoff can never be answered — clear it. Resume
704
+ // restores the interview transcript, so the entry survives. Auto-mode's own
705
+ // newSession() calls are safe: the handoff consumes the entry on agent_end.
706
+ if (event.reason === "new") {
707
+ clearPendingAutoStart(basePath);
708
+ }
613
709
  await syncServiceTierStatus(ctx);
614
710
  await applyDisabledModelProviderPolicy(ctx);
615
711
  await applyCompactionThresholdOverride(ctx);
@@ -635,11 +731,13 @@ export function registerHooks(pi, ecosystemHandlers) {
635
731
  const beforeAgentBasePath = contextBasePath(ctx);
636
732
  const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
637
733
  if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
638
- markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
734
+ // Host adapter explicitly: the ambient write-gate exports env-sniff the
735
+ // adapter per call and are reserved for the MCP child's import surface.
736
+ hostWriteGateAdapter.markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
639
737
  const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
640
738
  if (milestoneId)
641
- markDepthVerified(milestoneId, beforeAgentBasePath);
642
- clearPendingGate(beforeAgentBasePath);
739
+ hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
740
+ hostWriteGateAdapter.clearPending(beforeAgentBasePath);
643
741
  if (isAutoPaused() && !isAutoActive()) {
644
742
  const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
645
743
  void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
@@ -803,6 +901,20 @@ export function registerHooks(pi, ecosystemHandlers) {
803
901
  pi.on("message_update", async (event, ctx) => {
804
902
  if (approvalQuestionAbortInFlight)
805
903
  return;
904
+ // If the model asked via ask_user_questions, that in-flight elicitation IS
905
+ // the human boundary. Arming the pause/gate here (and emitting the "waiting
906
+ // for your approval - pausing" notice) would tear it down and trigger the
907
+ // foreground self-cancel/re-ask loop. The marker is set only by the
908
+ // claude-code-cli SDK elicitation handler and is ungated, so it is true in
909
+ // foreground; under the native-TUI provider it is always false and this path
910
+ // runs unchanged (#cc-elicitation-self-cancel).
911
+ if (isInteractiveElicitationInFlight())
912
+ return;
913
+ // Prose with "?" can stream before the MCP tool/elicitation starts. When the
914
+ // structured ask_user_questions call is already in the partial message, the
915
+ // tool IS the human boundary — do not arm the text-based approval pause.
916
+ if (messageHasPendingAskUserQuestionsTool(event.message))
917
+ return;
806
918
  const dash = getAutoRuntimeSnapshot();
807
919
  if (dash.active)
808
920
  return;
@@ -826,7 +938,7 @@ export function registerHooks(pi, ecosystemHandlers) {
826
938
  unitId = milestoneId;
827
939
  }
828
940
  }
829
- if (!shouldPauseForUserApprovalQuestion(unitType, [event.message]))
941
+ if (!shouldPauseForQuestion(unitType, [event.message]))
830
942
  return;
831
943
  const gateId = approvalGateIdForUnit(unitType, unitId);
832
944
  if (gateId) {
@@ -840,7 +952,7 @@ export function registerHooks(pi, ecosystemHandlers) {
840
952
  deferApprovalGate(gateId, contextBasePath(ctx));
841
953
  }
842
954
  approvalQuestionAbortInFlight = true;
843
- ctx.ui.notify(`${unitType}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`, "info");
955
+ ctx.ui.notify(`${unitType ?? "The discussion"}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`, "info");
844
956
  // The durable pending gate is activated at agent_end so same-turn
845
957
  // CONTEXT-DRAFT persistence can finish after the text boundary streams.
846
958
  // The tool_call hook below still blocks non-draft tools in this turn.
@@ -866,6 +978,13 @@ export function registerHooks(pi, ecosystemHandlers) {
866
978
  saveActivityLog(ctx, dash.basePath, dash.currentUnit.type, dash.currentUnit.id);
867
979
  }
868
980
  });
981
+ // Engine hook contract (../engine-hook-contract.ts): tool_call is
982
+ // NATIVE_ONLY_TOOL_HOOKS — it never fires under external engines
983
+ // (claude-code-cli pre-executes tools). The guards below (loop guard,
984
+ // pending/deferred gate blocks, queue guard, planning-unit tools policy,
985
+ // worktree write gate, STATE.md single-writer, context-write depth gate)
986
+ // are therefore native-engine enforcement only. The write-gate arming
987
+ // concern has a universal mirror at tool_execution_start below.
869
988
  pi.on("tool_call", async (event, ctx) => {
870
989
  const discussionBasePath = contextBasePath(ctx);
871
990
  const toolName = canonicalToolName(event.toolName);
@@ -1000,6 +1119,11 @@ export function registerHooks(pi, ecosystemHandlers) {
1000
1119
  }
1001
1120
  });
1002
1121
  // ── Safety harness: evidence collection + destructive command blocking ──
1122
+ // Engine hook contract: tool_call is NATIVE_ONLY_TOOL_HOOKS. Evidence
1123
+ // collection here is mirrored universally at tool_execution_start
1124
+ // (safetyRecordToolCall dedupes by toolCallId); the destructive-command
1125
+ // hard gate has NO universal mirror — blocking is impossible once an
1126
+ // external engine has already executed the command.
1003
1127
  pi.on("tool_call", async (event, ctx) => {
1004
1128
  markToolStart(event.toolCallId, event.toolName);
1005
1129
  safetyRecordToolCall(event.toolCallId, event.toolName, event.input);
@@ -1017,24 +1141,45 @@ export function registerHooks(pi, ecosystemHandlers) {
1017
1141
  }
1018
1142
  // Destructive command classification + hard gate in all modes.
1019
1143
  if (isToolCallEventType("bash", event)) {
1020
- const classification = classifyCommand(event.input.command);
1144
+ const command = event.input.command;
1145
+ const classification = classifyCommand(command);
1021
1146
  if (classification.destructive) {
1147
+ const guardBasePath = contextBasePath(ctx);
1148
+ // Escape hatch: if the user already confirmed this exact command via a
1149
+ // destructive_confirm gate, consume the one-shot token and let it run.
1150
+ // Without this, the block below loops forever — the model cannot satisfy
1151
+ // "confirm in the current turn" because nothing ever clears the gate.
1152
+ if (consumeDestructiveConfirmation(command, guardBasePath)) {
1153
+ safetyLogWarning("safety", `destructive command confirmed: ${classification.labels.join(", ")}`, {
1154
+ command: String(command).slice(0, 200),
1155
+ });
1156
+ return;
1157
+ }
1158
+ // Record the command as pending so an affirmative answer to a
1159
+ // destructive_confirm gate (handled in tool_result) can confirm it.
1160
+ requestDestructiveConfirmation(command, guardBasePath);
1022
1161
  const reason = [
1023
1162
  "HARD BLOCK: destructive Bash command requires explicit human confirmation.",
1024
1163
  `Detected: ${classification.labels.join(", ")}`,
1025
- "Run this via ask_user_questions, wait for the user's response,",
1026
- "then issue the command only when confirmed in the current turn.",
1164
+ "Call ask_user_questions with a question id containing \"destructive_confirm\"",
1165
+ "and a first option that affirms the action; wait for the user's response,",
1166
+ "then re-issue this exact command in the same turn to run it once.",
1027
1167
  ].join(" ");
1028
1168
  safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
1029
- command: String(event.input.command).slice(0, 200),
1169
+ command: String(command).slice(0, 200),
1030
1170
  });
1031
1171
  if (ctx) {
1032
- await maybePauseAutoForApprovalGate(ctx, pi, isAutoActive(), "Depth confirmation is waiting for your answer — pausing auto-mode.");
1172
+ await maybePauseAutoForApprovalGate(ctx, pi, isAutoActive(), "Destructive-command confirmation is waiting for your answer — pausing auto-mode.");
1033
1173
  }
1034
1174
  return { block: true, reason };
1035
1175
  }
1036
1176
  }
1037
1177
  });
1178
+ // Engine hook contract: tool_result is NATIVE_ONLY_TOOL_HOOKS — external
1179
+ // engines skip it. Error classification and markToolEnd are mirrored
1180
+ // universally at tool_execution_end; the ask_user_questions gate lifecycle
1181
+ // here is paired with the tool_execution_start arming path, which external
1182
+ // engines do reach.
1038
1183
  pi.on("tool_result", async (event, ctx) => {
1039
1184
  if (isAutoActive() && typeof event.toolCallId === "string") {
1040
1185
  markToolEnd(event.toolCallId);
@@ -1066,78 +1211,91 @@ export function registerHooks(pi, ecosystemHandlers) {
1066
1211
  else if (isAutoActive()) {
1067
1212
  clearToolInvocationError();
1068
1213
  }
1214
+ // Interactive Closeout adapter (ADR-032): auto-mode owns closeout for its
1215
+ // own units; interactive completions get the durable git subset (commit +
1216
+ // Closeout Git Verdict) instead of silently bypassing git.isolation.
1217
+ if (!event.isError && !isAutoActive() && isUnitCloseoutTool(toolName)) {
1218
+ try {
1219
+ runInteractiveUnitCloseout({
1220
+ basePath: resolveWorkflowToolBasePath(ctx, event.input),
1221
+ canonicalToolName: toolName,
1222
+ input: event.input,
1223
+ });
1224
+ }
1225
+ catch (err) {
1226
+ safetyLogWarning("engine", `interactive unit closeout failed: ${err instanceof Error ? err.message : String(err)}`);
1227
+ }
1228
+ }
1069
1229
  if (toolName !== "ask_user_questions")
1070
1230
  return;
1071
1231
  const basePath = contextBasePath(ctx);
1072
1232
  const milestoneId = await getDiscussionMilestoneIdFor(basePath);
1073
- const details = event.details;
1074
- // ── Discussion gate enforcement: handle gate question responses ──
1075
- // If the result is cancelled or has no response, the pending gate stays active
1076
- // so the model is blocked from non-read-only tools until it re-asks.
1077
- // If the user responded at all (even "needs adjustment"), clear the pending gate
1078
- // because the user engaged — the prompt handles the re-ask-after-adjustment flow.
1079
- const questions = event.input?.questions ?? [];
1080
- const currentPendingGate = getPendingGate(basePath);
1081
- if (currentPendingGate) {
1082
- if (details?.cancelled || !details?.response) {
1083
- // Gate stays pending. Direct the agent to the most reliable recovery
1084
- // path re-calling ask_user_questions with the same gate id — without
1085
- // misrepresenting the plain-text path. The plain-text path also works
1086
- // (isExplicitApprovalResponse on the next before_agent_start clears
1087
- // the gate when the user replies with an approval keyword), but the
1088
- // structured re-ask is more deterministic and gives the user a clear UI.
1089
- resetToolCallLoopGuard();
1090
- const interrupted = details?.interrupted === true;
1091
- if (ctx) {
1092
- await maybePauseAutoForApprovalGate(ctx, pi, true, interrupted
1093
- ? "Depth confirmation was interrupted — pausing auto-mode until you respond."
1094
- : "Depth confirmation is waiting for your answer — pausing auto-mode.");
1095
- }
1096
- return {
1097
- content: [{
1098
- type: "text",
1099
- text: [
1100
- `Waiting for depth confirmation on gate "${currentPendingGate}".`,
1101
- interrupted
1102
- ? "The confirmation question was interrupted before a response was recorded."
1103
- : "No user response was received for the confirmation question.",
1104
- "Do not infer approval from earlier or prior messages.",
1105
- "Do not proceed, write files, save artifacts, or call other tools.",
1106
- `Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
1107
- ].join(" "),
1108
- }],
1109
- };
1233
+ const details = resolveAskUserQuestionsGateDetails(event);
1234
+ const questions = event.input?.questions ?? details?.questions ?? [];
1235
+ const gateResult = applyAskUserQuestionsGateResult({
1236
+ basePath,
1237
+ questions,
1238
+ details,
1239
+ fallbackMilestoneId: milestoneId,
1240
+ });
1241
+ if (gateResult.status === "waiting") {
1242
+ resetToolCallLoopGuard();
1243
+ if (ctx) {
1244
+ await maybePauseAutoForApprovalGate(ctx, pi, true, gateResult.interrupted
1245
+ ? "Depth confirmation was interrupted pausing auto-mode until you respond."
1246
+ : "Depth confirmation is waiting for your answer — pausing auto-mode.");
1110
1247
  }
1111
- else {
1112
- const pendingQuestion = questions.find((question) => question?.id === currentPendingGate);
1113
- if (pendingQuestion) {
1114
- const answer = details.response?.answers?.[currentPendingGate];
1115
- if (isDepthConfirmationAnswer(answer?.selected, pendingQuestion.options)) {
1116
- markApprovalGateVerified(currentPendingGate, basePath);
1117
- const milestoneIdFromGate = extractDepthVerificationMilestoneId(currentPendingGate);
1118
- if (milestoneIdFromGate)
1119
- markDepthVerified(milestoneIdFromGate, basePath);
1120
- clearPendingGate(basePath);
1121
- clearDeferredApprovalGate(basePath);
1122
- }
1123
- }
1248
+ return {
1249
+ content: [{
1250
+ type: "text",
1251
+ text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
1252
+ }],
1253
+ };
1254
+ }
1255
+ if (gateResult.status === "verified") {
1256
+ clearDeferredApprovalGate(basePath);
1257
+ }
1258
+ // ── Consent Question policy (consent-question.ts): one home for the
1259
+ // answer lifecycle of every ask_user_questions round. Per-question
1260
+ // verdicts come from the consent-verdict leaf — the same engine
1261
+ // applyAskUserQuestionsGateResult consumed above for gate persistence —
1262
+ // so empty answers on fail-closed kinds never pass as real answers (#528)
1263
+ // and cancellations get one unified handler.
1264
+ const roundOutcome = evaluateAskUserQuestionsRound(questions, details ?? {});
1265
+ if (roundOutcome === "cancelled") {
1266
+ resetToolCallLoopGuard();
1267
+ if (ctx) {
1268
+ await maybePauseAutoForApprovalGate(ctx, pi, true, "ask_user_questions was cancelled before receiving a response — pausing auto-mode until you respond.");
1124
1269
  }
1270
+ return;
1125
1271
  }
1126
- if (details?.cancelled || !details?.response)
1272
+ if (roundOutcome === "waiting") {
1273
+ resetToolCallLoopGuard();
1274
+ if (ctx) {
1275
+ await maybePauseAutoForApprovalGate(ctx, pi, true, "A user question received no answer — pausing auto-mode until you respond.");
1276
+ }
1277
+ return {
1278
+ content: [{
1279
+ type: "text",
1280
+ text: formatUnansweredConsentQuestionMessage(questions),
1281
+ }],
1282
+ };
1283
+ }
1284
+ // Cancelled rounds already returned via roundOutcome === "cancelled".
1285
+ if (!details?.response)
1127
1286
  return;
1287
+ // Destructive-command confirmation: an affirmative answer to a
1288
+ // destructive_confirm gate promotes the pending blocked command to a
1289
+ // one-shot confirmed token, which the bash tool_call guard consumes on the
1290
+ // next attempt. Rejecting/declining leaves the command blocked.
1291
+ // (Depth-verification gate handling now lives in
1292
+ // applyAskUserQuestionsGateResult above; only the destructive-confirm gate
1293
+ // is handled inline here.)
1128
1294
  for (const question of questions) {
1129
- if (typeof question.id === "string" && question.id.includes("depth_verification")) {
1130
- // Only unlock the gate if the user selected the first option (confirmation).
1131
- // Cross-references against the question's defined options to reject free-form "Other" text.
1295
+ if (isDestructiveConfirmGateId(question?.id)) {
1132
1296
  const answer = details.response?.answers?.[question.id];
1133
- const inferredMilestoneId = extractDepthVerificationMilestoneId(question.id) ?? milestoneId;
1134
1297
  if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
1135
- if (currentPendingGate && question.id !== currentPendingGate)
1136
- break;
1137
- markApprovalGateVerified(question.id, basePath);
1138
- markDepthVerified(inferredMilestoneId, basePath);
1139
- clearPendingGate(basePath);
1140
- clearDeferredApprovalGate(basePath);
1298
+ confirmDestructiveCommand(basePath);
1141
1299
  }
1142
1300
  break;
1143
1301
  }
@@ -1146,20 +1304,48 @@ export function registerHooks(pi, ecosystemHandlers) {
1146
1304
  return;
1147
1305
  await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
1148
1306
  });
1307
+ // Engine hook contract: tool_execution_start is UNIVERSAL_TOOL_HOOKS — the
1308
+ // only pre-execution event that fires for every tool call on every engine.
1309
+ // Universal mirrors live here: write-gate arming and evidence collection.
1149
1310
  pi.on("tool_execution_start", async (event, ctx) => {
1150
1311
  const basePath = contextBasePath(ctx);
1151
1312
  const toolName = canonicalToolName(event.toolName);
1152
1313
  if (toolName === "ask_user_questions") {
1153
1314
  const questionId = extractGateQuestionId(event.args);
1154
1315
  if (typeof questionId === "string") {
1155
- setPendingGate(questionId, basePath);
1316
+ // External engines (claude-code-cli) ingest the SDK turn's tool blocks
1317
+ // post-hoc, so this event can fire AFTER the workflow MCP child already
1318
+ // verified this gate and allowed the CONTEXT save. Arming also revokes
1319
+ // verifiedDepthMilestones/verifiedApprovalGates, so an unconditional
1320
+ // re-arm here would wipe the child's verification and leave the
1321
+ // discuss→auto handoff permanently blocked. hostWriteGateAdapter
1322
+ // .setPending applies the verified-on-disk-wins policy and skips the
1323
+ // re-arm in that case. Stale verified state cannot leak into a later
1324
+ // re-discussion: a successful handoff deletes the snapshot via
1325
+ // clearDiscussionFlowState.
1326
+ hostWriteGateAdapter.setPending(questionId, basePath);
1156
1327
  clearDeferredApprovalGate(basePath);
1157
1328
  }
1158
1329
  }
1330
+ // Safety harness: record evidence here, not only in tool_call — see
1331
+ // ../engine-hook-contract.ts for why tool_call never fires under external
1332
+ // engines. recordToolCall dedupes by toolCallId, so native tools (which
1333
+ // hit both events) record once.
1334
+ safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}));
1335
+ const execDash = getAutoRuntimeSnapshot();
1336
+ if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
1337
+ const { milestone: xMid, slice: xSid, task: xTid } = parseUnitId(execDash.currentUnit.id);
1338
+ if (xMid && xSid && xTid) {
1339
+ saveEvidenceToDisk(execDash.basePath, xMid, xSid, xTid);
1340
+ }
1341
+ }
1159
1342
  if (!isAutoActive())
1160
1343
  return;
1161
1344
  markToolStart(event.toolCallId, event.toolName);
1162
1345
  });
1346
+ // Engine hook contract: tool_execution_end is UNIVERSAL_TOOL_HOOKS — fires
1347
+ // for every finalized tool call on every engine, so error classification
1348
+ // and evidence persistence here cover external engines that skip tool_result.
1163
1349
  pi.on("tool_execution_end", async (event) => {
1164
1350
  markToolEnd(event.toolCallId);
1165
1351
  // #2883/#4974: Capture deterministic invocation/policy errors
@@ -1196,61 +1382,10 @@ export function registerHooks(pi, ecosystemHandlers) {
1196
1382
  const payload = event.payload;
1197
1383
  if (!payload || typeof payload !== "object")
1198
1384
  return;
1199
- // ── Context Management ──────────────────────────────────────────────
1200
- // Load preferences once for both masking and truncation.
1201
- try {
1202
- const { loadEffectiveGSDPreferences } = await import("../preferences.js");
1203
- const { createObservationMask, createResponsesInputObservationMask, truncateContextResultMessages, truncateResponsesInputResultItems, } = await import("../context-masker.js");
1204
- const prefs = loadEffectiveGSDPreferences();
1205
- const cmConfig = prefs?.preferences.context_management;
1206
- // Observation masking: replace old tool results with placeholders.
1207
- // Only active during auto-mode when context_management.observation_masking is enabled.
1208
- if (isAutoActive() && cmConfig?.observation_masking !== false) {
1209
- const keepTurns = cmConfig?.observation_mask_turns ?? 8;
1210
- const messages = payload.messages;
1211
- if (Array.isArray(messages)) {
1212
- payload.messages = createObservationMask(keepTurns)(messages);
1213
- }
1214
- const input = payload.input;
1215
- if (Array.isArray(input)) {
1216
- payload.input = createResponsesInputObservationMask(keepTurns)(input);
1217
- }
1218
- }
1219
- // Tool result truncation: cap individual tool result content length.
1220
- // Applies in ALL modes (auto + interactive) to prevent context bloat.
1221
- // In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
1222
- // Creates new objects to avoid mutating shared conversation state.
1223
- const maxChars = cmConfig?.tool_result_max_chars ?? 800;
1224
- const msgs = payload.messages;
1225
- if (Array.isArray(msgs)) {
1226
- payload.messages = truncateContextResultMessages(msgs, maxChars);
1227
- }
1228
- const input = payload.input;
1229
- if (Array.isArray(input)) {
1230
- payload.input = truncateResponsesInputResultItems(input, maxChars);
1231
- }
1232
- }
1233
- catch { /* non-fatal */ }
1234
- try {
1235
- if (isAutoActive()) {
1236
- const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
1237
- if (sourceContextBlock) {
1238
- const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
1239
- Object.assign(payload, nextPayload);
1240
- }
1241
- }
1242
- }
1243
- catch { /* non-fatal */ }
1244
- // ── Service Tier ────────────────────────────────────────────────────
1245
- const modelId = event.model?.id;
1246
- if (!modelId)
1247
- return payload;
1248
- const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
1249
- const tier = getEffectiveServiceTier();
1250
- if (!tier || !supportsServiceTier(modelId))
1251
- return payload;
1252
- payload.service_tier = tier;
1253
- return payload;
1385
+ return applyProviderPayloadPolicy({
1386
+ payload,
1387
+ modelId: event.model?.id,
1388
+ });
1254
1389
  });
1255
1390
  // Capability-aware model routing hook (ADR-004)
1256
1391
  // Extensions can override model selection by returning { modelId: "..." }
@@ -1280,18 +1415,38 @@ export function registerHooks(pi, ecosystemHandlers) {
1280
1415
  return surfaceReduced ? { toolNames: providerCompatible } : undefined;
1281
1416
  }
1282
1417
  const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
1418
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
1283
1419
  const compatibleRegisteredToolNames = filterToolsForProvider(registeredToolNames, event.selectedModelApi, event.selectedModelProvider).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
1284
1420
  const guidedUnit = getGuidedUnitContext();
1285
- const requestScoped = buildRequestScopedGsdToolSet(guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible, event.requestCustomMessages, guidedUnit?.unitType === "run-uat" ? compatibleRegisteredToolNames : registeredToolNames, guidedUnit?.unitType);
1421
+ const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
1422
+ ? compatibleRegisteredToolNames
1423
+ : registeredToolNames;
1424
+ const requestScoped = buildRequestScopedGsdToolSet(guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible, event.requestCustomMessages, requestRegisteredToolNames, guidedUnit?.unitType, hasRegisteredSurface);
1286
1425
  if (requestScoped) {
1426
+ recordAutoToolSurfaceSnapshot({
1427
+ source: "provider-adjustment",
1428
+ unitType: guidedUnit?.unitType,
1429
+ modelFacingToolNames: requestScoped,
1430
+ registeredToolNames: requestRegisteredToolNames,
1431
+ scopedToolNames: requestScoped,
1432
+ });
1287
1433
  return { toolNames: requestScoped };
1288
1434
  }
1289
1435
  const dash = getAutoRuntimeSnapshot();
1290
1436
  if (dash.active && dash.currentUnit) {
1437
+ const registeredForUnit = dash.currentUnit.type === "run-uat"
1438
+ ? compatibleRegisteredToolNames
1439
+ : resolveRegisteredToolNames(pi, event.activeToolNames);
1440
+ const scopedToolNames = buildMinimalAutoGsdToolSet(dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible, dash.currentUnit.type, registeredForUnit, hasRegisteredSurface);
1441
+ recordAutoToolSurfaceSnapshot({
1442
+ source: "provider-adjustment",
1443
+ unitType: dash.currentUnit.type,
1444
+ modelFacingToolNames: scopedToolNames,
1445
+ registeredToolNames: registeredForUnit,
1446
+ scopedToolNames,
1447
+ });
1291
1448
  return {
1292
- toolNames: buildMinimalAutoGsdToolSet(dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible, dash.currentUnit.type, dash.currentUnit.type === "run-uat"
1293
- ? compatibleRegisteredToolNames
1294
- : resolveRegisteredToolNames(pi, event.activeToolNames)),
1449
+ toolNames: scopedToolNames,
1295
1450
  };
1296
1451
  }
1297
1452
  if (isGeneralGsdToolScopingRequested()) {