@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.e8563f58

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 (604) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.js +2 -14
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +5 -4
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  13. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  14. package/dist/resources/extensions/async-jobs/index.js +65 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  16. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  17. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  18. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  19. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  22. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  23. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  24. package/dist/resources/extensions/browser-tools/index.js +69 -12
  25. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  33. package/dist/resources/extensions/gsd/auto/phases.js +8 -3
  34. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
  35. package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
  36. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  37. package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
  38. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  39. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  40. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  41. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  42. package/dist/resources/extensions/gsd/auto-verification.js +9 -28
  43. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  44. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  45. package/dist/resources/extensions/gsd/auto.js +15 -20
  46. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  47. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  48. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  49. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  50. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  51. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  52. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  53. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  54. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  55. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  56. package/dist/resources/extensions/gsd/captures.js +5 -15
  57. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  58. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  59. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  60. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  61. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  62. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  63. package/dist/resources/extensions/gsd/constants.js +0 -2
  64. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  65. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  66. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  67. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  68. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  69. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  70. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  71. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  72. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  73. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  74. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  75. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  76. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  77. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  78. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  79. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  80. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  81. package/dist/resources/extensions/gsd/files.js +33 -19
  82. package/dist/resources/extensions/gsd/git-service.js +1 -0
  83. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  84. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  85. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  86. package/dist/resources/extensions/gsd/guidance.js +158 -0
  87. package/dist/resources/extensions/gsd/guided-flow.js +51 -5
  88. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  89. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  90. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  91. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  92. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  93. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  94. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  95. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  96. package/dist/resources/extensions/gsd/model-router.js +3 -0
  97. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  98. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  99. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  100. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  101. package/dist/resources/extensions/gsd/paths.js +37 -24
  102. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  103. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  104. package/dist/resources/extensions/gsd/preferences.js +14 -0
  105. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  106. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
  110. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  111. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  113. package/dist/resources/extensions/gsd/publication.js +87 -0
  114. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  115. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  116. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  117. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  118. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  119. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  120. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  121. package/dist/resources/extensions/gsd/state.js +6 -20
  122. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  123. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  124. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  125. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  126. package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  129. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  130. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  131. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  132. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  133. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  134. package/dist/resources/extensions/gsd/undo.js +8 -7
  135. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  136. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  137. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  138. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  139. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  140. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  141. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  142. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  143. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  144. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  145. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  146. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  147. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  148. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  149. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  150. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  151. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  152. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  153. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  154. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  155. package/dist/resources/shared/package-manager-detection.js +1 -1
  156. package/dist/resources/shared/package.json +3 -0
  157. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  158. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  159. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  160. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  161. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  162. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  163. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  164. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  165. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  166. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  167. package/dist/update-check.d.ts +2 -0
  168. package/dist/update-check.js +24 -1
  169. package/dist/update-cmd.js +20 -3
  170. package/dist/web/standalone/.next/BUILD_ID +1 -1
  171. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  172. package/dist/web/standalone/.next/build-manifest.json +3 -3
  173. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  174. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  175. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/index.html +1 -1
  228. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  229. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  230. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  235. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  236. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  237. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  238. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  241. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  242. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  243. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  244. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  245. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  246. package/dist/web/standalone/package.json +1 -1
  247. package/dist/worktree-cli.js +3 -6
  248. package/dist/worktree-status-banner.js +7 -11
  249. package/package.json +1 -1
  250. package/packages/cloud-mcp-gateway/package.json +2 -2
  251. package/packages/contracts/dist/rpc.d.ts +1 -0
  252. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  253. package/packages/contracts/dist/rpc.js.map +1 -1
  254. package/packages/contracts/dist/workflow.d.ts +4 -0
  255. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  256. package/packages/contracts/dist/workflow.js.map +1 -1
  257. package/packages/contracts/package.json +1 -1
  258. package/packages/daemon/package.json +4 -4
  259. package/packages/gsd-agent-core/package.json +5 -5
  260. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  261. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  263. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  268. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  278. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  279. package/packages/gsd-agent-modes/package.json +7 -7
  280. package/packages/mcp-server/dist/cli.js +6 -3
  281. package/packages/mcp-server/dist/cli.js.map +1 -1
  282. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  283. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  284. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  285. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  286. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  287. package/packages/mcp-server/dist/server.js +4 -0
  288. package/packages/mcp-server/dist/server.js.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  290. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  291. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  292. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  293. package/packages/mcp-server/package.json +5 -4
  294. package/packages/native/package.json +1 -1
  295. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  296. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  297. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  298. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  299. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  300. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  301. package/packages/pi-agent-core/dist/index.js +3 -0
  302. package/packages/pi-agent-core/dist/index.js.map +1 -1
  303. package/packages/pi-agent-core/package.json +1 -1
  304. package/packages/pi-ai/README.md +1 -0
  305. package/packages/pi-ai/dist/index.d.ts +2 -0
  306. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  307. package/packages/pi-ai/dist/index.js +2 -0
  308. package/packages/pi-ai/dist/index.js.map +1 -1
  309. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  310. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models.generated.js +166 -0
  312. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  313. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  315. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  317. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  319. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  322. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  323. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  324. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  325. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  326. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  327. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  329. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  330. package/packages/pi-ai/package.json +3 -2
  331. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  332. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  334. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  337. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  340. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  342. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  344. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/index.js +1 -1
  348. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  350. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  352. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  353. package/packages/pi-coding-agent/package.json +7 -7
  354. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  355. package/packages/pi-tui/dist/tui.js +9 -0
  356. package/packages/pi-tui/dist/tui.js.map +1 -1
  357. package/packages/pi-tui/package.json +2 -2
  358. package/packages/rpc-client/package.json +2 -2
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  362. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  363. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  364. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  365. package/src/resources/extensions/async-jobs/index.ts +79 -0
  366. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  367. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  368. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  369. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  370. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  371. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  372. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  373. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  374. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  375. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  376. package/src/resources/extensions/browser-tools/index.ts +71 -13
  377. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  378. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  379. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  380. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  383. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  384. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  385. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  387. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  388. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  389. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  390. package/src/resources/extensions/gsd/auto/phases.ts +12 -3
  391. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
  392. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
  393. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  394. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
  395. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  396. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  397. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  398. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  399. package/src/resources/extensions/gsd/auto-verification.ts +8 -26
  400. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  401. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  402. package/src/resources/extensions/gsd/auto.ts +28 -24
  403. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  404. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  405. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  406. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  407. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  409. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  410. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  411. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  412. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  413. package/src/resources/extensions/gsd/captures.ts +5 -16
  414. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  415. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  416. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  417. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  418. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  419. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  420. package/src/resources/extensions/gsd/constants.ts +0 -3
  421. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  422. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  423. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  424. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  425. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  426. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  427. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  428. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  429. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  430. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  431. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  432. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  433. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  434. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  435. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  436. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  437. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  438. package/src/resources/extensions/gsd/files.ts +33 -12
  439. package/src/resources/extensions/gsd/git-service.ts +1 -0
  440. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  441. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  442. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  443. package/src/resources/extensions/gsd/guidance.ts +217 -0
  444. package/src/resources/extensions/gsd/guided-flow.ts +50 -5
  445. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  446. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  447. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  448. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  449. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  450. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  451. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  452. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  453. package/src/resources/extensions/gsd/model-router.ts +3 -0
  454. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  455. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  456. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  457. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  458. package/src/resources/extensions/gsd/paths.ts +42 -22
  459. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  460. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  461. package/src/resources/extensions/gsd/preferences.ts +18 -0
  462. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  463. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  464. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  466. package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
  467. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  468. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  469. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  470. package/src/resources/extensions/gsd/publication.ts +122 -0
  471. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  472. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  473. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  474. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  475. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  476. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  477. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  478. package/src/resources/extensions/gsd/state.ts +9 -21
  479. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  480. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  481. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  482. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  483. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  484. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  485. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  486. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  487. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  488. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  489. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  490. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  491. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  492. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  493. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  494. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  495. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  496. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  497. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  498. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  499. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  500. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  501. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  502. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  503. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  504. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  505. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  506. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  507. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  508. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  509. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  510. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  511. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  512. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  513. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  514. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  515. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  516. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  517. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  518. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  519. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  520. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  521. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  522. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  523. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  524. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  525. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  526. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  527. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  528. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  529. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  530. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  531. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  532. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  533. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  534. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  535. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  536. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  537. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  538. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  539. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  540. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  541. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  542. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  543. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  544. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  545. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  546. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  547. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  548. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  549. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  550. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  551. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  552. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  553. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  554. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  555. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  556. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  557. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  558. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  559. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  560. package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
  561. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  562. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  563. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  564. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  565. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  566. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  567. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  568. package/src/resources/extensions/gsd/undo.ts +9 -8
  569. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  570. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  571. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  572. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  573. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  574. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  575. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  576. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  577. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  578. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  579. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  580. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  581. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  582. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  583. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  584. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  585. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  586. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  587. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  588. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  589. package/src/resources/shared/package-manager-detection.ts +1 -1
  590. package/src/resources/shared/package.json +3 -0
  591. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  592. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  593. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  594. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  595. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  596. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  597. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  598. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  599. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  600. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  601. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  602. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  603. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_buildManifest.js +0 -0
  604. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_ssgManifest.js +0 -0
@@ -7,7 +7,8 @@ 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 { applyAskUserQuestionsGateResult, canonicalToolName, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, 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";
@@ -19,22 +20,28 @@ import { saveActivityLog } from "../activity-log.js";
19
20
  import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
20
21
  import { parseUnitId } from "../unit-id.js";
21
22
  import { classifyCommand } from "../safety/destructive-guard.js";
23
+ import { confirmDestructiveCommand, consumeDestructiveConfirmation, isDestructiveConfirmGateId, requestDestructiveConfirmation, } from "../safety/destructive-confirmation.js";
22
24
  import { logWarning as safetyLogWarning } from "../workflow-logger.js";
25
+ import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
23
26
  import { installNotifyInterceptor } from "./notify-interceptor.js";
24
27
  import { initNotificationStore } from "../notification-store.js";
25
28
  import { initNotificationWidget } from "../notification-widget.js";
26
29
  import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
27
30
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
28
31
  import { extractSubagentAgentClasses } from "./subagent-input.js";
29
- import { approvalGateIdForUnit, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool, shouldPauseForUserApprovalQuestion, } from "../user-input-boundary.js";
32
+ import { approvalGateIdForUnit, evaluateAskUserQuestionsRound, formatUnansweredConsentQuestionMessage, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool, shouldPauseForQuestion, } from "../consent-question.js";
30
33
  import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
31
34
  import { getGuidedUnitContext } from "../guided-unit-context.js";
32
35
  import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
33
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";
34
38
  import { filterToolsForProvider } from "../model-router.js";
35
39
  import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
36
40
  import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
37
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";
38
45
  let approvalQuestionAbortInFlight = false;
39
46
  async function loadWelcomeScreenModule() {
40
47
  const candidates = [];
@@ -103,7 +110,13 @@ async function installWelcomeHeader(ctx) {
103
110
  /* non-fatal */
104
111
  }
105
112
  }
106
- 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();
107
120
  export const MINIMAL_GSD_TOOL_NAMES = [
108
121
  "gsd_exec",
109
122
  "gsd_exec_search",
@@ -137,7 +150,7 @@ function withPreservedShimTools(toolNames) {
137
150
  }
138
151
  /** True for the browser automation tools (browser_navigate, browser_click, ...). */
139
152
  function isBrowserTool(toolName) {
140
- return canonicalToolName(toolName).startsWith("browser_");
153
+ return hasBrowserContractPrefix(canonicalToolName(toolName));
141
154
  }
142
155
  /**
143
156
  * True when any message in the request is driven by a GSD workflow command
@@ -199,7 +212,7 @@ export function buildMinimalGsdToolSet(activeToolNames) {
199
212
  const minimal = resolveScopedToolNames(activeToolNames, MINIMAL_GSD_TOOL_NAMES);
200
213
  return withPreservedShimTools([...new Set([...preserved, ...minimal])]);
201
214
  }
202
- export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registeredToolNames = activeToolNames) {
215
+ export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registeredToolNames = activeToolNames, warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames) {
203
216
  if (unitType === "run-uat") {
204
217
  return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
205
218
  }
@@ -211,7 +224,20 @@ export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registered
211
224
  ...availableBaseTools,
212
225
  ])];
213
226
  const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], [...MINIMAL_GSD_TOOL_NAMES, ...unitTools]);
214
- 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.`);
215
241
  }
216
242
  export function buildRunUatGsdToolSet(activeToolNames, registeredToolNames = activeToolNames) {
217
243
  const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], [
@@ -237,7 +263,7 @@ export function buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNa
237
263
  const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], WORKFLOW_GSD_TOOL_NAMES);
238
264
  return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
239
265
  }
240
- export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages, registeredToolNames = activeToolNames, guidedUnitType) {
266
+ export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages, registeredToolNames = activeToolNames, guidedUnitType, warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames) {
241
267
  for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
242
268
  const currentCustomType = requestCustomMessages?.[index]?.customType;
243
269
  if (currentCustomType === "gsd-run" ||
@@ -245,7 +271,7 @@ export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessa
245
271
  currentCustomType === "gsd-doctor-heal" ||
246
272
  currentCustomType === "gsd-triage") {
247
273
  if (guidedUnitType) {
248
- return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames);
274
+ return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames, warnOnUnresolvedRequiredTools);
249
275
  }
250
276
  return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
251
277
  }
@@ -279,8 +305,9 @@ function applyMinimalGsdToolSurface(pi) {
279
305
  const dash = getAutoRuntimeSnapshot();
280
306
  if (dash.active && dash.currentUnit) {
281
307
  const currentToolNames = pi.getActiveTools();
308
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
282
309
  const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
283
- const scopedToolNames = buildMinimalAutoGsdToolSet(currentToolNames, dash.currentUnit.type, registeredToolNames);
310
+ const scopedToolNames = buildMinimalAutoGsdToolSet(currentToolNames, dash.currentUnit.type, registeredToolNames, hasRegisteredSurface);
284
311
  recordAutoToolSurfaceSnapshot({
285
312
  source: "runtime-scope",
286
313
  unitType: dash.currentUnit.type,
@@ -299,9 +326,10 @@ export function scopeGsdWorkflowToolsForDispatch(pi, unitType) {
299
326
  if (isFullGsdToolSurfaceRequested())
300
327
  return null;
301
328
  const current = pi.getActiveTools();
329
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
302
330
  const registeredToolNames = resolveRegisteredToolNames(pi, current);
303
331
  const scoped = unitType
304
- ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
332
+ ? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
305
333
  : buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
306
334
  recordAutoToolSurfaceSnapshot({
307
335
  source: "dispatch-scope",
@@ -387,12 +415,24 @@ async function applyCompactionThresholdOverride(ctx) {
387
415
  }
388
416
  }
389
417
  function clearDeferredApprovalGate(basePath) {
390
- if (!basePath || deferredApprovalGate?.basePath === basePath) {
391
- deferredApprovalGate = null;
418
+ if (!basePath) {
419
+ deferredApprovalGates.clear();
420
+ }
421
+ else {
422
+ deferredApprovalGates.delete(basePath);
392
423
  }
393
424
  }
394
425
  function deferApprovalGate(gateId, basePath) {
395
- 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);
396
436
  }
397
437
  function contextBasePath(ctx) {
398
438
  return typeof ctx?.cwd === "string" ? ctx.cwd : process.cwd();
@@ -442,10 +482,14 @@ function isShellExecutionTool(canonicalName) {
442
482
  canonicalName === "powershell";
443
483
  }
444
484
  function activateDeferredApprovalGate(basePath) {
445
- if (deferredApprovalGate?.basePath !== basePath)
485
+ const gateId = deferredApprovalGates.get(basePath);
486
+ if (gateId === undefined)
446
487
  return;
447
- setPendingGate(deferredApprovalGate.gateId, basePath);
448
- 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);
449
493
  }
450
494
  function extractGateQuestionId(input) {
451
495
  const questions = input?.questions ?? [];
@@ -454,7 +498,7 @@ function extractGateQuestionId(input) {
454
498
  }
455
499
  function isApprovalGateBlocking(basePath) {
456
500
  return Boolean(getPendingGate(basePath))
457
- || (deferredApprovalGate?.basePath === basePath);
501
+ || deferredApprovalGates.has(basePath);
458
502
  }
459
503
  function isContextDraftSummarySave(toolName, input) {
460
504
  if (toolName !== "gsd_summary_save" && toolName !== "summary_save")
@@ -463,6 +507,25 @@ function isContextDraftSummarySave(toolName, input) {
463
507
  return false;
464
508
  return input.artifact_type === "CONTEXT-DRAFT";
465
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
+ }
466
529
  function selectedAnswerLabel(selected) {
467
530
  if (Array.isArray(selected))
468
531
  return selected.map(String).join(", ");
@@ -542,7 +605,8 @@ function withDepthGateDisplayReason(result, displayReason = "Depth confirmation
542
605
  return { ...result, displayReason };
543
606
  }
544
607
  function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
545
- if (deferredApprovalGate?.basePath !== basePath)
608
+ const deferredGateId = deferredApprovalGates.get(basePath);
609
+ if (deferredGateId === undefined)
546
610
  return { block: false };
547
611
  if (toolName === "ask_user_questions")
548
612
  return { block: false };
@@ -551,7 +615,7 @@ function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
551
615
  return withDepthGateDisplayReason({
552
616
  block: true,
553
617
  reason: [
554
- `HARD BLOCK: Approval question "${deferredApprovalGate.gateId}" has been shown to the user.`,
618
+ `HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
555
619
  `Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
556
620
  `Wait for the user's answer before calling additional tools.`,
557
621
  ].join(" "),
@@ -626,7 +690,7 @@ export function registerHooks(pi, ecosystemHandlers) {
626
690
  catch { /* non-fatal */ }
627
691
  }
628
692
  });
629
- pi.on("session_switch", async (_event, ctx) => {
693
+ pi.on("session_switch", async (event, ctx) => {
630
694
  const basePath = contextBasePath(ctx);
631
695
  const preserveCloseoutSurface = isAutoCompletionStopInProgress();
632
696
  initSessionNotifications(ctx);
@@ -635,6 +699,13 @@ export function registerHooks(pi, ecosystemHandlers) {
635
699
  clearDeferredApprovalGate();
636
700
  await resetAskUserQuestionsTurnCache();
637
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
+ }
638
709
  await syncServiceTierStatus(ctx);
639
710
  await applyDisabledModelProviderPolicy(ctx);
640
711
  await applyCompactionThresholdOverride(ctx);
@@ -660,11 +731,13 @@ export function registerHooks(pi, ecosystemHandlers) {
660
731
  const beforeAgentBasePath = contextBasePath(ctx);
661
732
  const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
662
733
  if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
663
- 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);
664
737
  const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
665
738
  if (milestoneId)
666
- markDepthVerified(milestoneId, beforeAgentBasePath);
667
- clearPendingGate(beforeAgentBasePath);
739
+ hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
740
+ hostWriteGateAdapter.clearPending(beforeAgentBasePath);
668
741
  if (isAutoPaused() && !isAutoActive()) {
669
742
  const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
670
743
  void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
@@ -865,7 +938,7 @@ export function registerHooks(pi, ecosystemHandlers) {
865
938
  unitId = milestoneId;
866
939
  }
867
940
  }
868
- if (!shouldPauseForUserApprovalQuestion(unitType, [event.message]))
941
+ if (!shouldPauseForQuestion(unitType, [event.message]))
869
942
  return;
870
943
  const gateId = approvalGateIdForUnit(unitType, unitId);
871
944
  if (gateId) {
@@ -879,7 +952,7 @@ export function registerHooks(pi, ecosystemHandlers) {
879
952
  deferApprovalGate(gateId, contextBasePath(ctx));
880
953
  }
881
954
  approvalQuestionAbortInFlight = true;
882
- 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");
883
956
  // The durable pending gate is activated at agent_end so same-turn
884
957
  // CONTEXT-DRAFT persistence can finish after the text boundary streams.
885
958
  // The tool_call hook below still blocks non-draft tools in this turn.
@@ -905,6 +978,13 @@ export function registerHooks(pi, ecosystemHandlers) {
905
978
  saveActivityLog(ctx, dash.basePath, dash.currentUnit.type, dash.currentUnit.id);
906
979
  }
907
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.
908
988
  pi.on("tool_call", async (event, ctx) => {
909
989
  const discussionBasePath = contextBasePath(ctx);
910
990
  const toolName = canonicalToolName(event.toolName);
@@ -1039,6 +1119,11 @@ export function registerHooks(pi, ecosystemHandlers) {
1039
1119
  }
1040
1120
  });
1041
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.
1042
1127
  pi.on("tool_call", async (event, ctx) => {
1043
1128
  markToolStart(event.toolCallId, event.toolName);
1044
1129
  safetyRecordToolCall(event.toolCallId, event.toolName, event.input);
@@ -1056,24 +1141,45 @@ export function registerHooks(pi, ecosystemHandlers) {
1056
1141
  }
1057
1142
  // Destructive command classification + hard gate in all modes.
1058
1143
  if (isToolCallEventType("bash", event)) {
1059
- const classification = classifyCommand(event.input.command);
1144
+ const command = event.input.command;
1145
+ const classification = classifyCommand(command);
1060
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);
1061
1161
  const reason = [
1062
1162
  "HARD BLOCK: destructive Bash command requires explicit human confirmation.",
1063
1163
  `Detected: ${classification.labels.join(", ")}`,
1064
- "Run this via ask_user_questions, wait for the user's response,",
1065
- "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.",
1066
1167
  ].join(" ");
1067
1168
  safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
1068
- command: String(event.input.command).slice(0, 200),
1169
+ command: String(command).slice(0, 200),
1069
1170
  });
1070
1171
  if (ctx) {
1071
- 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.");
1072
1173
  }
1073
1174
  return { block: true, reason };
1074
1175
  }
1075
1176
  }
1076
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.
1077
1183
  pi.on("tool_result", async (event, ctx) => {
1078
1184
  if (isAutoActive() && typeof event.toolCallId === "string") {
1079
1185
  markToolEnd(event.toolCallId);
@@ -1105,12 +1211,27 @@ export function registerHooks(pi, ecosystemHandlers) {
1105
1211
  else if (isAutoActive()) {
1106
1212
  clearToolInvocationError();
1107
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
+ }
1108
1229
  if (toolName !== "ask_user_questions")
1109
1230
  return;
1110
1231
  const basePath = contextBasePath(ctx);
1111
1232
  const milestoneId = await getDiscussionMilestoneIdFor(basePath);
1112
- const details = event.details;
1113
- const questions = event.input?.questions ?? [];
1233
+ const details = resolveAskUserQuestionsGateDetails(event);
1234
+ const questions = event.input?.questions ?? details?.questions ?? [];
1114
1235
  const gateResult = applyAskUserQuestionsGateResult({
1115
1236
  basePath,
1116
1237
  questions,
@@ -1134,26 +1255,97 @@ export function registerHooks(pi, ecosystemHandlers) {
1134
1255
  if (gateResult.status === "verified") {
1135
1256
  clearDeferredApprovalGate(basePath);
1136
1257
  }
1137
- if (details?.cancelled || !details?.response)
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.");
1269
+ }
1270
+ return;
1271
+ }
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)
1138
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.)
1294
+ for (const question of questions) {
1295
+ if (isDestructiveConfirmGateId(question?.id)) {
1296
+ const answer = details.response?.answers?.[question.id];
1297
+ if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
1298
+ confirmDestructiveCommand(basePath);
1299
+ }
1300
+ break;
1301
+ }
1302
+ }
1139
1303
  if (!milestoneId)
1140
1304
  return;
1141
1305
  await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
1142
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.
1143
1310
  pi.on("tool_execution_start", async (event, ctx) => {
1144
1311
  const basePath = contextBasePath(ctx);
1145
1312
  const toolName = canonicalToolName(event.toolName);
1146
1313
  if (toolName === "ask_user_questions") {
1147
1314
  const questionId = extractGateQuestionId(event.args);
1148
1315
  if (typeof questionId === "string") {
1149
- 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);
1150
1327
  clearDeferredApprovalGate(basePath);
1151
1328
  }
1152
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
+ }
1153
1342
  if (!isAutoActive())
1154
1343
  return;
1155
1344
  markToolStart(event.toolCallId, event.toolName);
1156
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.
1157
1349
  pi.on("tool_execution_end", async (event) => {
1158
1350
  markToolEnd(event.toolCallId);
1159
1351
  // #2883/#4974: Capture deterministic invocation/policy errors
@@ -1223,12 +1415,13 @@ export function registerHooks(pi, ecosystemHandlers) {
1223
1415
  return surfaceReduced ? { toolNames: providerCompatible } : undefined;
1224
1416
  }
1225
1417
  const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
1418
+ const hasRegisteredSurface = typeof pi.getAllTools === "function";
1226
1419
  const compatibleRegisteredToolNames = filterToolsForProvider(registeredToolNames, event.selectedModelApi, event.selectedModelProvider).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
1227
1420
  const guidedUnit = getGuidedUnitContext();
1228
1421
  const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
1229
1422
  ? compatibleRegisteredToolNames
1230
1423
  : registeredToolNames;
1231
- const requestScoped = buildRequestScopedGsdToolSet(guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible, event.requestCustomMessages, requestRegisteredToolNames, guidedUnit?.unitType);
1424
+ const requestScoped = buildRequestScopedGsdToolSet(guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible, event.requestCustomMessages, requestRegisteredToolNames, guidedUnit?.unitType, hasRegisteredSurface);
1232
1425
  if (requestScoped) {
1233
1426
  recordAutoToolSurfaceSnapshot({
1234
1427
  source: "provider-adjustment",
@@ -1244,7 +1437,7 @@ export function registerHooks(pi, ecosystemHandlers) {
1244
1437
  const registeredForUnit = dash.currentUnit.type === "run-uat"
1245
1438
  ? compatibleRegisteredToolNames
1246
1439
  : resolveRegisteredToolNames(pi, event.activeToolNames);
1247
- const scopedToolNames = buildMinimalAutoGsdToolSet(dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible, dash.currentUnit.type, registeredForUnit);
1440
+ const scopedToolNames = buildMinimalAutoGsdToolSet(dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible, dash.currentUnit.type, registeredForUnit, hasRegisteredSurface);
1248
1441
  recordAutoToolSurfaceSnapshot({
1249
1442
  source: "provider-adjustment",
1250
1443
  unitType: dash.currentUnit.type,