@opengsd/gsd-pi 1.2.0-dev.fb12b103 → 1.2.0-dev.fbdca60b

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 (580) 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.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  16. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  17. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  18. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  19. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  20. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  22. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  24. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  25. package/dist/resources/extensions/gsd/auto/orchestrator.js +167 -64
  26. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  27. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  28. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  29. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  34. package/dist/resources/extensions/gsd/auto-dispatch.js +39 -58
  35. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -7
  36. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  37. package/dist/resources/extensions/gsd/auto-prompts.js +66 -9
  38. package/dist/resources/extensions/gsd/auto-start.js +26 -8
  39. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  40. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  41. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  42. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  43. package/dist/resources/extensions/gsd/auto.js +52 -2
  44. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  45. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  46. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  47. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -45
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  50. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  51. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  52. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  53. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  56. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  57. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  58. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  59. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  60. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  61. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  62. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  63. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  64. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  65. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  66. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  67. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  68. package/dist/resources/extensions/gsd/files.js +33 -19
  69. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  70. package/dist/resources/extensions/gsd/gsd-db.js +17 -21
  71. package/dist/resources/extensions/gsd/guidance.js +60 -0
  72. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  73. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  74. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  75. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  76. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  77. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  78. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  79. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  80. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  81. package/dist/resources/extensions/gsd/notifications.js +12 -7
  82. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  83. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  84. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  86. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  89. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  92. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  93. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  94. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  95. package/dist/resources/extensions/gsd/prompts/run-uat.md +8 -4
  96. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  97. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  99. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  100. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  101. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  102. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  103. package/dist/resources/extensions/gsd/state.js +11 -2
  104. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  105. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  106. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  107. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  108. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  109. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  110. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  111. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  112. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  113. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  114. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  115. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  116. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  117. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  118. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  119. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  120. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  121. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  122. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  123. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  124. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  125. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  126. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  127. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  128. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  129. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  130. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  131. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  132. package/dist/resources/extensions/gsd/worktree.js +8 -1
  133. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  134. package/dist/resources/extensions/shared/gsd-browser-cli.js +21 -2
  135. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  136. package/dist/resources/shared/package-manager-detection.js +1 -1
  137. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  138. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  139. package/dist/runtime-checks.d.ts +10 -0
  140. package/dist/runtime-checks.js +27 -0
  141. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  142. package/dist/update-check.d.ts +2 -0
  143. package/dist/update-check.js +24 -1
  144. package/dist/update-cmd.js +20 -3
  145. package/dist/web/standalone/.next/BUILD_ID +1 -1
  146. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  147. package/dist/web/standalone/.next/build-manifest.json +2 -2
  148. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  149. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  158. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  207. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  208. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  211. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  212. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  213. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  214. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  215. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  216. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  217. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  218. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  219. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  220. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  221. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  222. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  223. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  224. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  225. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  226. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  227. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  228. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  229. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  230. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  231. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  232. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  233. package/package.json +3 -3
  234. package/packages/cloud-mcp-gateway/package.json +2 -2
  235. package/packages/contracts/package.json +1 -1
  236. package/packages/daemon/package.json +4 -4
  237. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  238. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  239. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  240. package/packages/gsd-agent-core/package.json +5 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +50 -6
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  252. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +17 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  260. package/packages/gsd-agent-modes/package.json +7 -7
  261. package/packages/mcp-server/README.md +12 -3
  262. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  263. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  264. package/packages/mcp-server/dist/cli-runner.js +137 -0
  265. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  266. package/packages/mcp-server/dist/cli.js +2 -53
  267. package/packages/mcp-server/dist/cli.js.map +1 -1
  268. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  269. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  270. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  271. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  272. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  273. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/pid-registry.js +459 -0
  275. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  276. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  277. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/probe-mode.js +10 -0
  279. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  280. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  281. package/packages/mcp-server/dist/server.js +4 -0
  282. package/packages/mcp-server/dist/server.js.map +1 -1
  283. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  284. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  285. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  286. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  287. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  288. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  290. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  291. package/packages/mcp-server/package.json +5 -4
  292. package/packages/native/package.json +1 -1
  293. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  294. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  295. package/packages/pi-agent-core/package.json +1 -1
  296. package/packages/pi-ai/README.md +1 -0
  297. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  298. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  299. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  300. package/packages/pi-ai/dist/index.d.ts +2 -0
  301. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/index.js +2 -0
  303. package/packages/pi-ai/dist/index.js.map +1 -1
  304. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  305. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models.generated.js +468 -269
  307. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  308. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  309. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  310. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  311. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  312. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  314. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  315. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  317. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  318. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  319. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  320. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  321. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  322. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  323. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  324. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  325. package/packages/pi-ai/package.json +3 -2
  326. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  327. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  329. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  332. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  333. package/packages/pi-coding-agent/package.json +7 -7
  334. package/packages/pi-tui/README.md +15 -0
  335. package/packages/pi-tui/dist/index.d.ts +2 -2
  336. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  337. package/packages/pi-tui/dist/index.js +2 -2
  338. package/packages/pi-tui/dist/index.js.map +1 -1
  339. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  340. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  341. package/packages/pi-tui/dist/terminal-image.js +54 -2
  342. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  343. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  344. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  345. package/packages/pi-tui/dist/terminal.js +70 -25
  346. package/packages/pi-tui/dist/terminal.js.map +1 -1
  347. package/packages/pi-tui/dist/tui.d.ts +15 -0
  348. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/tui.js +106 -21
  350. package/packages/pi-tui/dist/tui.js.map +1 -1
  351. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/utils.js +110 -36
  353. package/packages/pi-tui/dist/utils.js.map +1 -1
  354. package/packages/pi-tui/package.json +2 -2
  355. package/packages/rpc-client/package.json +2 -2
  356. package/pkg/dist/theme/theme.d.ts.map +1 -1
  357. package/pkg/dist/theme/theme.js +45 -17
  358. package/pkg/dist/theme/theme.js.map +1 -1
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/ask-user-questions.ts +7 -2
  362. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +11 -0
  363. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  364. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  365. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  366. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  367. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  368. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  369. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  370. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  371. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  372. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  373. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  374. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  375. package/src/resources/extensions/gsd/auto/orchestrator.ts +186 -66
  376. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  377. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  378. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  379. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  380. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  381. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  382. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  383. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  384. package/src/resources/extensions/gsd/auto-dispatch.ts +37 -62
  385. package/src/resources/extensions/gsd/auto-model-selection.ts +16 -7
  386. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  387. package/src/resources/extensions/gsd/auto-prompts.ts +78 -9
  388. package/src/resources/extensions/gsd/auto-start.ts +27 -11
  389. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  390. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  391. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  392. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  393. package/src/resources/extensions/gsd/auto.ts +64 -2
  394. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  395. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  396. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  397. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  398. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +118 -50
  399. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  400. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  401. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  402. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  403. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  404. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  405. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  406. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  407. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  408. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  409. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  410. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  411. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  412. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  413. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  414. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  415. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  416. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  417. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  418. package/src/resources/extensions/gsd/files.ts +33 -12
  419. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  420. package/src/resources/extensions/gsd/gsd-db.ts +19 -22
  421. package/src/resources/extensions/gsd/guidance.ts +78 -0
  422. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  423. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  424. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  425. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  426. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  427. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  428. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  429. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  430. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  431. package/src/resources/extensions/gsd/notifications.ts +13 -6
  432. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  433. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  434. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  435. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  436. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  437. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  442. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  443. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +8 -4
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  448. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  449. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  450. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  451. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  452. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  453. package/src/resources/extensions/gsd/state.ts +12 -1
  454. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  457. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +75 -1
  458. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +257 -18
  459. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  460. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  461. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  462. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  463. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  464. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  465. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  466. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  468. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  469. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  470. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  471. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  472. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  473. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  474. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  475. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  476. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  477. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  478. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  479. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  480. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  481. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  482. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  483. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
  484. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  485. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  486. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  487. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  488. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  489. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  490. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  491. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  492. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  493. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  494. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  495. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  496. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  498. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  499. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  500. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  501. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  503. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  504. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  505. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  506. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  507. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  508. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  509. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  510. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  511. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  512. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  513. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  514. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  515. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  516. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  517. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  518. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  519. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  520. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  521. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  522. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  523. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  524. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  525. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  526. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  527. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  528. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  529. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  530. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  531. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  532. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  533. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  534. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  535. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  536. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  537. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  538. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  539. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  540. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  541. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  542. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  543. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  544. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  545. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  546. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  547. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  548. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  549. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  550. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  551. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  552. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  553. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  554. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  555. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  556. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  557. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  558. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  559. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  560. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  564. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  565. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  566. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  567. package/src/resources/extensions/gsd/worktree.ts +7 -1
  568. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  569. package/src/resources/extensions/shared/gsd-browser-cli.ts +23 -2
  570. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  571. package/src/resources/shared/package-manager-detection.ts +1 -1
  572. package/src/resources/skills/create-skill/SKILL.md +3 -0
  573. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  574. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  575. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  576. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  577. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  578. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  579. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
@@ -2,7 +2,7 @@
2
2
  import { logWarning } from "../workflow-logger.js";
3
3
  import { checkDeepProjectSetupAfterTurn, checkAutoStartAfterDiscuss, maybeHandleReadyPhraseWithoutFiles, maybeHandleEmptyIntentTurn, resetEmptyTurnCounter, } from "../guided-flow.js";
4
4
  import { clearPathCache } from "../paths.js";
5
- import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, isAutoCompletionStopInProgress, pauseAuto, setCurrentDispatchedModelId, } from "../auto.js";
5
+ import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, isAutoCompletionStopInProgress, pauseAuto, setCurrentDispatchedModelId, setCurrentUnitModelForRecovery, } from "../auto.js";
6
6
  import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
7
7
  import { pauseAutoForProviderError } from "../provider-error-pause.js";
8
8
  import { isSessionSwitchAbortGraceActive, isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled, } from "../auto/resolve.js";
@@ -13,7 +13,7 @@ import { clearDiscussionFlowState } from "./write-gate.js";
13
13
  import { clearGuidedUnitContext } from "../guided-unit-context.js";
14
14
  import { resumeAutoAfterProviderDelay } from "./provider-error-resume.js";
15
15
  import { classifyError, createRetryState, resetRetryState, isTransient, } from "../error-classifier.js";
16
- import { blockModel, isModelBlocked } from "../blocked-models.js";
16
+ import { blockModel, blockModelUntil, isModelBlocked, isModelTemporarilyUnavailable } from "../blocked-models.js";
17
17
  import { getProjectGSDPreferencesPath } from "../preferences.js";
18
18
  import { resolveProviderErrorGuidance } from "../provider-error-guidance.js";
19
19
  import { formatGuidance } from "../guidance.js";
@@ -96,9 +96,12 @@ async function tryProviderModelFallback(params) {
96
96
  if (!nextModelId)
97
97
  break;
98
98
  const candidate = resolveModelId(nextModelId, availableModels, rejectedProvider);
99
- if (candidate && !isModelBlocked(basePath, candidate.provider, candidate.id)) {
99
+ if (candidate &&
100
+ !isModelBlocked(basePath, candidate.provider, candidate.id) &&
101
+ !isModelTemporarilyUnavailable(basePath, candidate.provider, candidate.id)) {
100
102
  const ok = await pi.setModel(candidate, { persist: false });
101
103
  if (ok) {
104
+ setCurrentUnitModelForRecovery(candidate);
102
105
  setCurrentDispatchedModelId({ provider: candidate.provider, id: candidate.id });
103
106
  switchedNotify(`${candidate.provider}/${candidate.id}`);
104
107
  pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
@@ -111,11 +114,13 @@ async function tryProviderModelFallback(params) {
111
114
  const sessionModel = getAutoModeStartModel();
112
115
  if (sessionModel &&
113
116
  !(sessionModel.provider === rejectedProvider && sessionModel.id === rejectedId) &&
114
- !isModelBlocked(basePath, sessionModel.provider, sessionModel.id)) {
117
+ !isModelBlocked(basePath, sessionModel.provider, sessionModel.id) &&
118
+ !isModelTemporarilyUnavailable(basePath, sessionModel.provider, sessionModel.id)) {
115
119
  const startModel = availableModels.find((m) => m.provider === sessionModel.provider && m.id === sessionModel.id);
116
120
  if (startModel) {
117
121
  const ok = await pi.setModel(startModel, { persist: false });
118
122
  if (ok) {
123
+ setCurrentUnitModelForRecovery(startModel);
119
124
  setCurrentDispatchedModelId({ provider: startModel.provider, id: startModel.id });
120
125
  switchedNotify(`${startModel.provider}/${startModel.id}`);
121
126
  pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
@@ -533,6 +538,10 @@ export async function handleAgentEnd(pi, event, ctx) {
533
538
  if (currentProvider === "openai-codex" || currentProvider === "google-gemini-cli") {
534
539
  cls.retryAfterMs = Math.min(cls.retryAfterMs, 30_000);
535
540
  }
541
+ const dash = getAutoDashboardData();
542
+ if (dash.basePath && ctx.model?.provider && ctx.model?.id) {
543
+ blockModelUntil(dash.basePath, ctx.model.provider, ctx.model.id, Date.now() + cls.retryAfterMs, rawErrorMsg || displayMsg || "rate limit");
544
+ }
536
545
  }
537
546
  // ── 2. Decide & Act ──────────────────────────────────────────────────
538
547
  // --- Network errors: same-model retry with backoff ---
@@ -572,9 +581,14 @@ export async function handleAgentEnd(pi, event, ctx) {
572
581
  retryState.networkRetryCount = 0;
573
582
  retryState.currentRetryModelId = undefined;
574
583
  const modelToSet = resolveModelId(nextModelId, availableModels, ctx.model?.provider);
575
- if (modelToSet) {
584
+ const modelUnavailable = dash.basePath && modelToSet
585
+ ? isModelBlocked(dash.basePath, modelToSet.provider, modelToSet.id) ||
586
+ isModelTemporarilyUnavailable(dash.basePath, modelToSet.provider, modelToSet.id)
587
+ : false;
588
+ if (modelToSet && !modelUnavailable) {
576
589
  const ok = await pi.setModel(modelToSet, { persist: false });
577
590
  if (ok) {
591
+ setCurrentUnitModelForRecovery(modelToSet);
578
592
  setCurrentDispatchedModelId({ provider: modelToSet.provider, id: modelToSet.id });
579
593
  ctx.ui.notify(`Model error${errorDetail}. Switched to fallback: ${nextModelId} and resuming.`, "warning");
580
594
  pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
@@ -587,11 +601,17 @@ export async function handleAgentEnd(pi, event, ctx) {
587
601
  // Try restoring session model
588
602
  const sessionModel = getAutoModeStartModel();
589
603
  if (sessionModel) {
590
- if (ctx.model?.id !== sessionModel.id || ctx.model?.provider !== sessionModel.provider) {
604
+ const dash = getAutoDashboardData();
605
+ const sessionModelUnavailable = dash.basePath
606
+ ? isModelBlocked(dash.basePath, sessionModel.provider, sessionModel.id) ||
607
+ isModelTemporarilyUnavailable(dash.basePath, sessionModel.provider, sessionModel.id)
608
+ : false;
609
+ if (!sessionModelUnavailable && (ctx.model?.id !== sessionModel.id || ctx.model?.provider !== sessionModel.provider)) {
591
610
  const startModel = ctx.modelRegistry.getAvailable().find((m) => m.provider === sessionModel.provider && m.id === sessionModel.id);
592
611
  if (startModel) {
593
612
  const ok = await pi.setModel(startModel, { persist: false });
594
613
  if (ok) {
614
+ setCurrentUnitModelForRecovery(startModel);
595
615
  setCurrentDispatchedModelId({ provider: startModel.provider, id: startModel.id });
596
616
  retryState.networkRetryCount = 0;
597
617
  retryState.currentRetryModelId = undefined;
@@ -5,7 +5,7 @@ import { homedir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
7
7
  import { logWarning } from "../workflow-logger.js";
8
- import { openWorkflowDatabase } from "../db-workspace.js";
8
+ import { getWorkflowDatabaseStatus, openWorkflowDatabase, } from "../db-workspace.js";
9
9
  import { getAutoWorktreePath } from "../auto-worktree.js";
10
10
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
11
11
  import { worktreesDirs } from "../worktree-placement.js";
@@ -61,16 +61,46 @@ export function resolveWorkflowToolBasePath(ctx, scope) {
61
61
  return cwd;
62
62
  }
63
63
  export { resolveProjectRootDbPath } from "../db-workspace.js";
64
+ function sqliteProviderHint(status, nodeVersion) {
65
+ if (status.provider)
66
+ return `Provider: ${status.provider}.`;
67
+ const major = Number.parseInt(nodeVersion.split(".")[0] ?? "", 10);
68
+ if (Number.isFinite(major) && major < 22) {
69
+ return (`No SQLite provider available. Upgrade Node to >= 22.0.0 (current: v${nodeVersion}), ` +
70
+ "use the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
71
+ }
72
+ return ("No SQLite provider available. Use a Node build with node:sqlite enabled, " +
73
+ "run the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
74
+ }
75
+ function dbOpenPhaseHint(status) {
76
+ if (status.lastPhase === "open")
77
+ return "The database file could not be opened";
78
+ if (status.lastPhase === "initSchema")
79
+ return "The database schema could not be initialized";
80
+ if (status.lastPhase === "vacuum-recovery")
81
+ return "Corruption recovery (VACUUM) failed";
82
+ if (status.attempted)
83
+ return "The database could not be opened";
84
+ return "The database provider could not be loaded";
85
+ }
86
+ export function formatWorkflowDatabaseOpenFailure(result, status, nodeVersion = process.versions.node) {
87
+ if (result.reason === "missing-gsd-dir") {
88
+ return `ensureDbOpen failed — no .gsd directory found at ${result.location.projectGsd}`;
89
+ }
90
+ if (result.reason === "missing-database") {
91
+ return `ensureDbOpen failed — no GSD database found at ${result.location.projectDb}`;
92
+ }
93
+ const resolvedStatus = status ?? getWorkflowDatabaseStatus();
94
+ const detail = result.error?.message ?? resolvedStatus.lastError?.message ?? "";
95
+ const detailSuffix = detail ? ` (${detail})` : "";
96
+ return (`ensureDbOpen failed for ${result.location.projectDb}: ` +
97
+ `${dbOpenPhaseHint(resolvedStatus)}${detailSuffix}. ${sqliteProviderHint(resolvedStatus, nodeVersion)}`);
98
+ }
64
99
  export async function ensureDbOpen(basePath = safeWorkspaceCwd()) {
65
100
  const result = openWorkflowDatabase(basePath);
66
101
  if (result.ok)
67
102
  return true;
68
- if (result.reason === "missing-gsd-dir") {
69
- logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
70
- }
71
- else {
72
- logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
73
- }
103
+ logWarning("bootstrap", formatWorkflowDatabaseOpenFailure(result));
74
104
  return false;
75
105
  }
76
106
  export function registerDynamicTools(pi) {
@@ -114,8 +114,8 @@ export function registerExecTools(pi) {
114
114
  ],
115
115
  parameters: Type.Object({
116
116
  query: Type.Optional(Type.String({ description: "Substring matched against id and purpose (case-insensitive)." })),
117
- runtime: Type.Optional(Type.Union([Type.Literal("bash"), Type.Literal("node"), Type.Literal("python")], {
118
- description: "Restrict to one runtime.",
117
+ runtime: Type.Optional(Type.String({
118
+ description: "Restrict to one runtime: bash, node, or python.",
119
119
  })),
120
120
  failing_only: Type.Optional(Type.Boolean({ description: "Only non-zero exit codes and timeouts." })),
121
121
  limit: Type.Optional(Type.Number({ description: "Max results (default 20, cap 200)", minimum: 1, maximum: 200 })),
@@ -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, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, refreshWriteGateStateFromDisk, 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";
@@ -28,7 +29,7 @@ import { initNotificationWidget } from "../notification-widget.js";
28
29
  import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
29
30
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
30
31
  import { extractSubagentAgentClasses } from "./subagent-input.js";
31
- import { approvalGateIdForUnit, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool, shouldPauseForUserApprovalQuestion, } from "../user-input-boundary.js";
32
+ import { approvalGateIdForUnit, evaluateAskUserQuestionsRound, formatUnansweredConsentQuestionMessage, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool, shouldPauseForQuestion, } from "../consent-question.js";
32
33
  import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
33
34
  import { getGuidedUnitContext } from "../guided-unit-context.js";
34
35
  import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
@@ -109,7 +110,13 @@ async function installWelcomeHeader(ctx) {
109
110
  /* non-fatal */
110
111
  }
111
112
  }
112
- 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();
113
120
  export const MINIMAL_GSD_TOOL_NAMES = [
114
121
  "gsd_exec",
115
122
  "gsd_exec_search",
@@ -408,12 +415,24 @@ async function applyCompactionThresholdOverride(ctx) {
408
415
  }
409
416
  }
410
417
  function clearDeferredApprovalGate(basePath) {
411
- if (!basePath || deferredApprovalGate?.basePath === basePath) {
412
- deferredApprovalGate = null;
418
+ if (!basePath) {
419
+ deferredApprovalGates.clear();
420
+ }
421
+ else {
422
+ deferredApprovalGates.delete(basePath);
413
423
  }
414
424
  }
415
425
  function deferApprovalGate(gateId, basePath) {
416
- 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);
417
436
  }
418
437
  function contextBasePath(ctx) {
419
438
  return typeof ctx?.cwd === "string" ? ctx.cwd : process.cwd();
@@ -463,17 +482,14 @@ function isShellExecutionTool(canonicalName) {
463
482
  canonicalName === "powershell";
464
483
  }
465
484
  function activateDeferredApprovalGate(basePath) {
466
- if (deferredApprovalGate?.basePath !== basePath)
467
- return;
468
- const gateId = deferredApprovalGate.gateId;
469
- deferredApprovalGate = null;
470
- const snapshot = refreshWriteGateStateFromDisk(basePath);
471
- const milestoneId = extractDepthVerificationMilestoneId(gateId);
472
- if (isApprovalGateVerifiedInSnapshot(snapshot, gateId))
485
+ const gateId = deferredApprovalGates.get(basePath);
486
+ if (gateId === undefined)
473
487
  return;
474
- if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId))
475
- return;
476
- setPendingGate(gateId, basePath);
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);
477
493
  }
478
494
  function extractGateQuestionId(input) {
479
495
  const questions = input?.questions ?? [];
@@ -482,7 +498,7 @@ function extractGateQuestionId(input) {
482
498
  }
483
499
  function isApprovalGateBlocking(basePath) {
484
500
  return Boolean(getPendingGate(basePath))
485
- || (deferredApprovalGate?.basePath === basePath);
501
+ || deferredApprovalGates.has(basePath);
486
502
  }
487
503
  function isContextDraftSummarySave(toolName, input) {
488
504
  if (toolName !== "gsd_summary_save" && toolName !== "summary_save")
@@ -589,7 +605,8 @@ function withDepthGateDisplayReason(result, displayReason = "Depth confirmation
589
605
  return { ...result, displayReason };
590
606
  }
591
607
  function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
592
- if (deferredApprovalGate?.basePath !== basePath)
608
+ const deferredGateId = deferredApprovalGates.get(basePath);
609
+ if (deferredGateId === undefined)
593
610
  return { block: false };
594
611
  if (toolName === "ask_user_questions")
595
612
  return { block: false };
@@ -598,7 +615,7 @@ function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
598
615
  return withDepthGateDisplayReason({
599
616
  block: true,
600
617
  reason: [
601
- `HARD BLOCK: Approval question "${deferredApprovalGate.gateId}" has been shown to the user.`,
618
+ `HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
602
619
  `Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
603
620
  `Wait for the user's answer before calling additional tools.`,
604
621
  ].join(" "),
@@ -714,11 +731,13 @@ export function registerHooks(pi, ecosystemHandlers) {
714
731
  const beforeAgentBasePath = contextBasePath(ctx);
715
732
  const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
716
733
  if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
717
- 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);
718
737
  const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
719
738
  if (milestoneId)
720
- markDepthVerified(milestoneId, beforeAgentBasePath);
721
- clearPendingGate(beforeAgentBasePath);
739
+ hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
740
+ hostWriteGateAdapter.clearPending(beforeAgentBasePath);
722
741
  if (isAutoPaused() && !isAutoActive()) {
723
742
  const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
724
743
  void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
@@ -919,7 +938,7 @@ export function registerHooks(pi, ecosystemHandlers) {
919
938
  unitId = milestoneId;
920
939
  }
921
940
  }
922
- if (!shouldPauseForUserApprovalQuestion(unitType, [event.message]))
941
+ if (!shouldPauseForQuestion(unitType, [event.message]))
923
942
  return;
924
943
  const gateId = approvalGateIdForUnit(unitType, unitId);
925
944
  if (gateId) {
@@ -933,7 +952,7 @@ export function registerHooks(pi, ecosystemHandlers) {
933
952
  deferApprovalGate(gateId, contextBasePath(ctx));
934
953
  }
935
954
  approvalQuestionAbortInFlight = true;
936
- 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");
937
956
  // The durable pending gate is activated at agent_end so same-turn
938
957
  // CONTEXT-DRAFT persistence can finish after the text boundary streams.
939
958
  // The tool_call hook below still blocks non-draft tools in this turn.
@@ -959,6 +978,13 @@ export function registerHooks(pi, ecosystemHandlers) {
959
978
  saveActivityLog(ctx, dash.basePath, dash.currentUnit.type, dash.currentUnit.id);
960
979
  }
961
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.
962
988
  pi.on("tool_call", async (event, ctx) => {
963
989
  const discussionBasePath = contextBasePath(ctx);
964
990
  const toolName = canonicalToolName(event.toolName);
@@ -1093,6 +1119,11 @@ export function registerHooks(pi, ecosystemHandlers) {
1093
1119
  }
1094
1120
  });
1095
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.
1096
1127
  pi.on("tool_call", async (event, ctx) => {
1097
1128
  markToolStart(event.toolCallId, event.toolName);
1098
1129
  safetyRecordToolCall(event.toolCallId, event.toolName, event.input);
@@ -1144,6 +1175,11 @@ export function registerHooks(pi, ecosystemHandlers) {
1144
1175
  }
1145
1176
  }
1146
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.
1147
1183
  pi.on("tool_result", async (event, ctx) => {
1148
1184
  if (isAutoActive() && typeof event.toolCallId === "string") {
1149
1185
  markToolEnd(event.toolCallId);
@@ -1219,7 +1255,34 @@ export function registerHooks(pi, ecosystemHandlers) {
1219
1255
  if (gateResult.status === "verified") {
1220
1256
  clearDeferredApprovalGate(basePath);
1221
1257
  }
1222
- 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)
1223
1286
  return;
1224
1287
  // Destructive-command confirmation: an affirmative answer to a
1225
1288
  // destructive_confirm gate promotes the pending blocked command to a
@@ -1241,6 +1304,9 @@ export function registerHooks(pi, ecosystemHandlers) {
1241
1304
  return;
1242
1305
  await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
1243
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.
1244
1310
  pi.on("tool_execution_start", async (event, ctx) => {
1245
1311
  const basePath = contextBasePath(ctx);
1246
1312
  const toolName = canonicalToolName(event.toolName);
@@ -1249,29 +1315,22 @@ export function registerHooks(pi, ecosystemHandlers) {
1249
1315
  if (typeof questionId === "string") {
1250
1316
  // External engines (claude-code-cli) ingest the SDK turn's tool blocks
1251
1317
  // post-hoc, so this event can fire AFTER the workflow MCP child already
1252
- // verified this gate and allowed the CONTEXT save. setPendingGate also
1253
- // revokes verifiedDepthMilestones/verifiedApprovalGates, so an
1254
- // unconditional re-arm here wipes the child's verification and leaves
1255
- // the discuss→auto handoff permanently blocked. Skip the re-arm when
1256
- // the snapshot already records this exact gate as verified — mirrors
1257
- // activateDeferredApprovalGate's guard. Stale verified state cannot
1258
- // leak into a later re-discussion: a successful handoff deletes the
1259
- // snapshot via clearDiscussionFlowState.
1260
- const snapshot = refreshWriteGateStateFromDisk(basePath);
1261
- const gateMilestoneId = extractDepthVerificationMilestoneId(questionId);
1262
- const alreadyVerified = isApprovalGateVerifiedInSnapshot(snapshot, questionId) ||
1263
- isMilestoneDepthVerifiedInSnapshot(snapshot, gateMilestoneId);
1264
- if (!alreadyVerified) {
1265
- setPendingGate(questionId, basePath);
1266
- }
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);
1267
1327
  clearDeferredApprovalGate(basePath);
1268
1328
  }
1269
1329
  }
1270
- // Safety harness: record evidence here, not only in tool_call. External
1271
- // engines (claude-code-cli) pre-execute tools, so the agent loop skips
1272
- // beforeToolCall/tool_call for them tool_execution_start is the only
1273
- // event that fires for every tool call. recordToolCall dedupes by
1274
- // toolCallId, so native tools (which hit both events) record once.
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.
1275
1334
  safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}));
1276
1335
  const execDash = getAutoRuntimeSnapshot();
1277
1336
  if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
@@ -1284,6 +1343,9 @@ export function registerHooks(pi, ecosystemHandlers) {
1284
1343
  return;
1285
1344
  markToolStart(event.toolCallId, event.toolName);
1286
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.
1287
1349
  pi.on("tool_execution_end", async (event) => {
1288
1350
  markToolEnd(event.toolCallId);
1289
1351
  // #2883/#4974: Capture deterministic invocation/policy errors