@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
@@ -2,11 +2,10 @@
2
2
  // File Purpose: Declarative auto-mode dispatch rules and dispatch resolver.
3
3
  import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
4
4
  import { getUatBrowserToolSupportError } from "./uat-policy.js";
5
- import { isDbAvailable, getMilestoneSlices, getPendingGatesForTurn, markPendingGatesOmittedForTurn, getMilestone, insertArtifact, insertAssessment, setSliceSketchFlag, transaction, getAssessment, } from "./gsd-db.js";
5
+ import { isDbAvailable, getMilestoneSlices, getMilestoneSliceSummaries, getClosedSliceIds, getPendingGatesForTurn, markPendingGatesOmittedForTurn, getMilestone, insertArtifact, insertAssessment, setSliceSketchFlag, transaction, getAssessment, } from "./gsd-db.js";
6
6
  import { isClosedStatus } from "./status-guards.js";
7
7
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
8
8
  import { gsdRoot, resolveGsdPathContract, resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveSlicePath, resolveTaskFile, relTaskFile, relSliceFile, buildMilestoneFileName, buildSliceFileName, buildTaskFileName, gsdProjectionRoot, } from "./paths.js";
9
- import { parseRoadmap } from "./parsers-legacy.js";
10
9
  import { validateArtifact } from "./schemas/validate.js";
11
10
  import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
12
11
  import { logWarning, logError } from "./workflow-logger.js";
@@ -19,10 +18,14 @@ import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
19
18
  import { getMilestonePipelineVariant } from "./milestone-scope-classifier.js";
20
19
  import { EXECUTION_ENTRY_PHASES, hasFinalizedMilestoneContext } from "./uok/plan-v2.js";
21
20
  import { isAutoActive } from "./auto.js";
22
- import { markDepthVerified } from "./bootstrap/write-gate.js";
21
+ // Host adapter explicitly: auto-dispatch runs in the extension host, and the
22
+ // ambient write-gate exports env-sniff the adapter per call (they are reserved
23
+ // for the workflow MCP child's dynamic-import surface).
24
+ import { hostWriteGateAdapter } from "./bootstrap/write-gate.js";
23
25
  import { ensureWorkflowPreferencesCaptured } from "./planning-depth.js";
24
26
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
25
- import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, } from "./workflow-mcp.js";
27
+ import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, resolveWorkflowMcpProjectRoot, } from "./workflow-mcp.js";
28
+ import { prepareBrowserDaemonForUat } from "./browser-daemon-auto-prep.js";
26
29
  import { PROJECT_RESEARCH_INFLIGHT_MARKER, } from "./project-research-policy.js";
27
30
  import { isWorkflowPrefsCaptured, resolveDeepProjectSetupState, } from "./deep-project-setup-policy.js";
28
31
  import { annotateBackgroundable } from "./delegation-policy.js";
@@ -289,30 +292,13 @@ function persistSliceAssessmentBackfill(assessmentRelPath, mid, sliceId, content
289
292
  });
290
293
  }
291
294
  function backfillMissingAssessmentsFromSummaries(basePath, mid) {
292
- const completedSliceIds = new Set();
293
- if (isDbAvailable()) {
294
- for (const slice of getMilestoneSlices(mid)) {
295
- if (slice.status === "complete" || slice.status === "done") {
296
- completedSliceIds.add(slice.id);
297
- }
298
- }
299
- }
300
- else {
301
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
302
- if (!roadmapFile)
303
- return;
304
- try {
305
- const roadmap = parseRoadmap(readFileSync(roadmapFile, "utf-8"));
306
- for (const slice of roadmap.slices) {
307
- if (slice.done)
308
- completedSliceIds.add(slice.id);
309
- }
310
- }
311
- catch {
312
- return;
313
- }
314
- }
315
- for (const sliceId of completedSliceIds) {
295
+ // DB-authoritative (ADR-017): no markdown fallback. Without DB rows there
296
+ // is nothing to backfill.
297
+ if (!isDbAvailable())
298
+ return;
299
+ // Canonical closed vocabulary (complete/done/skipped/closed) — a skipped or
300
+ // closed slice with a SUMMARY gets the same assessment backfill treatment.
301
+ for (const sliceId of getClosedSliceIds(mid)) {
316
302
  const summaryPath = resolveSliceFile(basePath, mid, sliceId, "SUMMARY");
317
303
  if (!summaryPath || !existsSync(summaryPath))
318
304
  continue;
@@ -488,7 +474,7 @@ export const DISPATCH_RULES = [
488
474
  // deadlock. Deep planning is still user-driven even inside auto-mode,
489
475
  // so it must wait for explicit approval instead of taking this bypass.
490
476
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
491
- markDepthVerified(mid, basePath);
477
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
492
478
  }
493
479
  return {
494
480
  action: "dispatch",
@@ -540,6 +526,16 @@ export const DISPATCH_RULES = [
540
526
  if (browserToolError) {
541
527
  return { action: "stop", reason: browserToolError, level: "warning" };
542
528
  }
529
+ const browserDaemonError = prepareBrowserDaemonForUat({
530
+ uatType,
531
+ sessionProvider,
532
+ sessionAuthMode,
533
+ sessionBaseUrl,
534
+ projectRoot: resolveWorkflowMcpProjectRoot(basePath),
535
+ });
536
+ if (browserDaemonError) {
537
+ return { action: "stop", reason: browserDaemonError, level: "warning" };
538
+ }
543
539
  // Cap run-uat dispatch attempts to prevent infinite replay (#3624).
544
540
  // Check before incrementing so an exhausted counter cannot create a
545
541
  // no-progress skip loop that starves later dispatch rules.
@@ -569,24 +565,11 @@ export const DISPATCH_RULES = [
569
565
  // Only applies when UAT dispatch is enabled
570
566
  if (!prefs?.uat_dispatch)
571
567
  return null;
572
- // DB-first: prefer closed slices from DB; fall back to ROADMAP on disk.
573
- let closedSliceIds;
574
- if (isDbAvailable()) {
575
- closedSliceIds = getMilestoneSlices(mid)
576
- .filter(s => isClosedStatus(s.status))
577
- .map(s => s.id);
578
- }
579
- else {
580
- // Filesystem fallback for degraded / unmigrated projects.
581
- // `slice.done` in the parsed ROADMAP is the disk-level closed signal.
582
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
583
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
584
- if (!roadmapContent)
585
- return null;
586
- const roadmap = parseRoadmap(roadmapContent);
587
- closedSliceIds = roadmap.slices.filter(s => s.done).map(s => s.id);
588
- }
589
- for (const sliceId of closedSliceIds) {
568
+ // DB-authoritative (ADR-017): closed slices come from the DB only; the
569
+ // ROADMAP projection is never parsed for gate decisions.
570
+ if (!isDbAvailable())
571
+ return null;
572
+ for (const sliceId of getClosedSliceIds(mid)) {
590
573
  const result = await readUatGateVerdict(basePath, mid, sliceId);
591
574
  if (!result)
592
575
  continue;
@@ -641,7 +624,7 @@ export const DISPATCH_RULES = [
641
624
  // H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
642
625
  // pre-verify deep planning's user-facing milestone approval gate.
643
626
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
644
- markDepthVerified(mid, basePath);
627
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
645
628
  }
646
629
  return {
647
630
  action: "dispatch",
@@ -823,7 +806,7 @@ export const DISPATCH_RULES = [
823
806
  // H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
824
807
  // pre-verify deep planning's user-facing milestone approval gate.
825
808
  if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
826
- markDepthVerified(mid, basePath);
809
+ hostWriteGateAdapter.markDepthVerified(mid, basePath);
827
810
  }
828
811
  return {
829
812
  action: "dispatch",
@@ -905,18 +888,18 @@ export const DISPATCH_RULES = [
905
888
  // behavior.
906
889
  if (await getMilestonePipelineVariant(mid) === "trivial")
907
890
  return null;
908
- // Load roadmap to find all slices
909
- const roadmapFile = resolveExistingExpectedArtifact("plan-milestone", mid, basePath) ??
910
- resolveMilestoneFile(basePath, mid, "ROADMAP");
911
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
912
- if (!roadmapContent)
891
+ // DB-authoritative slice list (ADR-017): the ROADMAP projection is
892
+ // never parsed for dispatch decisions. No DB / no rows → skip this rule.
893
+ if (!isDbAvailable())
894
+ return null;
895
+ const dbSlices = getMilestoneSliceSummaries(mid);
896
+ if (dbSlices.length === 0)
913
897
  return null;
914
- const roadmap = parseRoadmap(roadmapContent);
915
898
  // Find slices that need research (no RESEARCH file, dependencies done)
916
899
  const milestoneResearchFile = resolveExistingExpectedArtifact("research-milestone", mid, basePath) ??
917
900
  resolveMilestoneFile(basePath, mid, "RESEARCH");
918
901
  const researchReadySlices = [];
919
- for (const slice of roadmap.slices) {
902
+ for (const slice of dbSlices) {
920
903
  if (slice.done)
921
904
  continue;
922
905
  // Skip S01 when milestone research exists
@@ -926,7 +909,7 @@ export const DISPATCH_RULES = [
926
909
  if (resolveExistingExpectedArtifact("research-slice", `${mid}/${slice.id}`, basePath))
927
910
  continue;
928
911
  // Skip if dependencies aren't done (check for SUMMARY files)
929
- const depsComplete = (slice.depends ?? []).every((depId) => !!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath));
912
+ const depsComplete = slice.depends.every((depId) => !!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath));
930
913
  if (!depsComplete)
931
914
  continue;
932
915
  researchReadySlices.push({ id: slice.id, title: slice.title });
@@ -13,7 +13,7 @@ import { getSessionModelOverride } from "./session-model-override.js";
13
13
  import { logWarning } from "./workflow-logger.js";
14
14
  import { resolveUokFlags } from "./uok/flags.js";
15
15
  import { applyModelPolicyFilter } from "./uok/model-policy.js";
16
- import { isModelBlocked } from "./blocked-models.js";
16
+ import { isModelBlocked, isModelTemporarilyUnavailable } from "./blocked-models.js";
17
17
  import { getRequiredWorkflowToolsForAutoUnit, isWorkflowMcpSurfaceTool } from "./workflow-mcp.js";
18
18
  /**
19
19
  * Thrown when the model-policy gate rejects every candidate model for a unit
@@ -218,6 +218,10 @@ function buildModelPolicyBlockReasons(policyDenyReasons, availableModels, routin
218
218
  reason: `configured model(s) did not resolve against policy-eligible registry [${eligibleSummary}]`,
219
219
  }];
220
220
  }
221
+ function isModelUnavailable(basePath, provider, id) {
222
+ return isModelBlocked(basePath, provider, id) ||
223
+ isModelTemporarilyUnavailable(basePath, provider, id);
224
+ }
221
225
  function restoreToolBaseline(pi) {
222
226
  const key = pi;
223
227
  const baseline = TOOL_BASELINE.get(key);
@@ -657,8 +661,8 @@ autoModeStartThinkingLevel) {
657
661
  // (issue #4513). The block is persisted in .gsd/runtime/blocked-models.json
658
662
  // so it survives /gsd auto restarts — without this, the same dead model
659
663
  // gets reselected after every restart.
660
- if (isModelBlocked(basePath, model.provider, model.id)) {
661
- ctx.ui.notify(`Skipping blocked model ${model.provider}/${model.id} (provider rejected it for this account).`, "warning");
664
+ if (isModelUnavailable(basePath, model.provider, model.id)) {
665
+ ctx.ui.notify(`Skipping unavailable model ${model.provider}/${model.id}.`, "warning");
662
666
  continue;
663
667
  }
664
668
  // Warn if the ID is ambiguous across providers
@@ -724,7 +728,7 @@ autoModeStartThinkingLevel) {
724
728
  const key = `${model.provider.toLowerCase()}/${model.id.toLowerCase()}`;
725
729
  if (!policyAllowedModelKeys.has(key))
726
730
  continue;
727
- if (isModelBlocked(basePath, model.provider, model.id))
731
+ if (isModelUnavailable(basePath, model.provider, model.id))
728
732
  continue;
729
733
  const ok = await pi.setModel(model, { persist: false });
730
734
  if (!ok)
@@ -746,16 +750,16 @@ autoModeStartThinkingLevel) {
746
750
  // No model preference for this unit type — re-apply the model captured
747
751
  // at auto-mode start to prevent bleed from shared global settings.json (#650).
748
752
  const availableModels = buildModelPolicyCandidates(ctx, autoModeStartModel, effectiveSessionModelOverride);
749
- const startBlocked = isModelBlocked(basePath, autoModeStartModel.provider, autoModeStartModel.id);
753
+ const startBlocked = isModelUnavailable(basePath, autoModeStartModel.provider, autoModeStartModel.id);
750
754
  if (startBlocked) {
751
- ctx.ui.notify(`Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is blocked for this account. Using current session model instead.`, "warning");
755
+ ctx.ui.notify(`Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is unavailable. Using current session model instead.`, "warning");
752
756
  }
753
757
  else {
754
758
  const startModel = availableModels.find(m => m.provider === autoModeStartModel.provider && m.id === autoModeStartModel.id);
755
759
  if (startModel) {
756
760
  const ok = await pi.setModel(startModel, { persist: false });
757
761
  if (!ok) {
758
- const byId = availableModels.find(m => m.id === autoModeStartModel.id && !isModelBlocked(basePath, m.provider, m.id));
762
+ const byId = availableModels.find(m => m.id === autoModeStartModel.id && !isModelUnavailable(basePath, m.provider, m.id));
759
763
  if (byId) {
760
764
  const fallbackOk = await pi.setModel(byId, { persist: false });
761
765
  if (fallbackOk) {
@@ -839,15 +843,34 @@ export function resolveModelId(modelId, availableModels, currentProvider) {
839
843
  if (providerMatch)
840
844
  return providerMatch;
841
845
  }
842
- // Prefer "anthropic" as the canonical provider for Anthropic models.
843
- // Transport-specific tiebreaker (ADR-012): intentionally keys on provider,
844
- // not api we want the plain Anthropic transport when multiple are available.
845
- const anthropicMatch = candidates.find(m => m.provider === "anthropic");
846
- if (anthropicMatch)
847
- return anthropicMatch;
846
+ // Subscription/OAuth routes beat pay-per-token API when the same model ID
847
+ // exists on multiple providers. Order matters — first match wins.
848
+ for (const provider of BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE) {
849
+ const match = candidates.find(m => m.provider === provider);
850
+ if (match)
851
+ return match;
852
+ }
848
853
  // Fall back to first non-extension candidate, or any candidate
849
854
  return candidates.find(m => !EXTENSION_PROVIDERS.has(m.provider)) ?? candidates[0];
850
855
  }
856
+ /**
857
+ * When a bare model ID exists on multiple providers, prefer subscription/OAuth
858
+ * routes over pay-per-token API keys. Matches PROVIDER_ROUTES in doctor-providers
859
+ * but applies when *both* sides are authenticated.
860
+ *
861
+ * Order rationale:
862
+ * - openai-codex before github-copilot: ChatGPT-native for shared GPT IDs
863
+ * - google-gemini-cli before github-copilot: first-party Gemini CLI
864
+ * - anthropic before github-copilot: first-party Claude API/OAuth over Copilot
865
+ * - github-copilot before openai/google: Copilot OAuth over platform API keys
866
+ */
867
+ export const BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE = [
868
+ "openai-codex",
869
+ "google-gemini-cli",
870
+ "anthropic",
871
+ "github-copilot",
872
+ "google-antigravity",
873
+ ];
851
874
  /**
852
875
  * Flat-rate providers charge the same per request regardless of model.
853
876
  * Dynamic routing provides no cost benefit — it only degrades quality (#3453).
@@ -16,7 +16,7 @@ import { deriveState } from "./state.js";
16
16
  import { logWarning, logError } from "./workflow-logger.js";
17
17
  import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
18
18
  import { loadPrompt } from "./prompt-loader.js";
19
- import { isAwaitingUserInput } from "./user-input-boundary.js";
19
+ import { isAwaitingUserInput } from "./consent-question.js";
20
20
  import { resolveMilestonePath, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveMilestoneFile, resolveTasksDir, buildTaskFileName, } from "./paths.js";
21
21
  import { invalidateAllCaches } from "./cache.js";
22
22
  import { rebuildState } from "./doctor.js";
@@ -30,8 +30,7 @@ import { createWorkspace, scopeMilestone } from "./workspace.js";
30
30
  import { normalizeWorktreePathForCompare } from "./worktree-root.js";
31
31
  import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
32
32
  import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
33
- import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
34
- import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
33
+ import { renderPlanCheckboxes, renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "./markdown-renderer.js";
35
34
  import { consumeSignal } from "./session-status-io.js";
36
35
  import { checkPostUnitHooks, consumeHookFailure, isRetryPending, consumeRetryTrigger, consumeGateBlock, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
37
36
  import { hasPendingCaptures, loadPendingCaptures, revertExecutorResolvedCaptures } from "./captures.js";
@@ -39,7 +38,7 @@ import { debugLog } from "./debug-logger.js";
39
38
  import { runSafely } from "./auto-utils.js";
40
39
  import { isMilestoneCloseoutSettled, runMilestoneCloseoutGitHub, } from "./milestone-closeout.js";
41
40
  import { getEvidence, clearEvidenceFromDisk, isExecutionToolName } from "./safety/evidence-collector.js";
42
- import { validateFileChanges } from "./safety/file-change-validator.js";
41
+ import { validateFileChanges, effectiveFileChangeAllowlist } from "./safety/file-change-validator.js";
43
42
  import { crossReferenceEvidence } from "./safety/evidence-cross-ref.js";
44
43
  import { validateContent } from "./safety/content-validator.js";
45
44
  import { resolveSafetyHarnessConfig } from "./safety/safety-harness.js";
@@ -55,11 +54,12 @@ import { writeTurnGitTransaction } from "./uok/gitops.js";
55
54
  import { isClosedStatus } from "./status-guards.js";
56
55
  import { detectAbandonMilestone } from "./abandon-detect.js";
57
56
  import { getPendingGate } from "./bootstrap/write-gate.js";
58
- import { isDeterministicPolicyError } from "./auto-tool-tracking.js";
57
+ import { isDeterministicPolicyError, isToolUnavailableError } from "./auto-tool-tracking.js";
59
58
  import { formatConnectedStepStack, formatPostUnitStatusCard } from "./auto-status-message.js";
60
59
  import { clearProjectResearchInflightMarker, finalizeProjectResearchTimeout, } from "./project-research-policy.js";
61
60
  import { validateArtifact } from "./schemas/validate.js";
62
61
  import { verificationRetryKey } from "./auto/verification-retry-policy.js";
62
+ import { saveCustomVerifyRetryCounts } from "./auto/custom-verify-retry-store.js";
63
63
  import { getLedger } from "./metrics.js";
64
64
  import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
65
65
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
@@ -507,9 +507,10 @@ export function _hasExecutionToolCallsInSessionForTest(entries) {
507
507
  if (e?.type === "toolCall" && isExecutionToolName(e?.name ?? e?.toolName)) {
508
508
  return true;
509
509
  }
510
- if (e?.type !== "message")
511
- continue;
512
- const msg = e?.message;
510
+ // Accept both session-manager entries ({type: "message", message}) and
511
+ // bare agent-end messages ({role, content}) — the auto loop passes the
512
+ // latter via opts.agentEndMessages.
513
+ const msg = e?.type === "message" ? e?.message : e;
513
514
  if (!msg || msg.role !== "assistant" || !Array.isArray(msg.content))
514
515
  continue;
515
516
  for (const block of msg.content) {
@@ -721,7 +722,7 @@ export const USER_DRIVEN_DEEP_UNITS = new Set([
721
722
  "discuss-milestone",
722
723
  "research-decision",
723
724
  ]);
724
- export { isAwaitingUserInput } from "./user-input-boundary.js";
725
+ export { isAwaitingUserInput } from "./consent-question.js";
725
726
  function artifactValidationKind(unitType) {
726
727
  if (unitType === "discuss-project")
727
728
  return "project";
@@ -799,11 +800,13 @@ async function repairCompleteSliceRoadmapProjection(unitType, unitId, basePath)
799
800
  if (!summaryPath || !existsSync(summaryPath) || !uatPath || !existsSync(uatPath)) {
800
801
  return false;
801
802
  }
803
+ // Stale-render detection (ADR-017): the DB already says the slice is closed;
804
+ // this only checks whether the rendered ROADMAP projection reflects it, to
805
+ // decide whether a repair re-render is needed.
802
806
  const roadmapPath = resolveMilestoneFile(artifactBase, mid, "ROADMAP");
803
807
  if (roadmapPath && existsSync(roadmapPath)) {
804
808
  try {
805
- const roadmap = parseLegacyRoadmap(readFileSync(roadmapPath, "utf-8"));
806
- if (roadmap.slices.find((roadmapSlice) => roadmapSlice.id === sid)?.done) {
809
+ if (roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sid)) {
807
810
  return false;
808
811
  }
809
812
  }
@@ -1289,6 +1292,7 @@ export async function postUnitPreVerification(pctx, opts) {
1289
1292
  const safetyConfig = resolveSafetyHarnessConfig(prefs?.safety_harness);
1290
1293
  if (safetyConfig.enabled) {
1291
1294
  const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
1295
+ const fileChangeAllowlist = effectiveFileChangeAllowlist(safetyConfig.file_change_allowlist, prefs?.git?.manage_gitignore);
1292
1296
  // File change validation (execute-task only, after unit execution)
1293
1297
  if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid) {
1294
1298
  try {
@@ -1303,7 +1307,7 @@ export async function postUnitPreVerification(pctx, opts) {
1303
1307
  const plannedFiles = getPlannedKeyFiles(sliceTaskRows.map((taskRow) => ({
1304
1308
  files: taskRow.files,
1305
1309
  })));
1306
- const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, safetyConfig.file_change_allowlist);
1310
+ const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, fileChangeAllowlist);
1307
1311
  if (audit && audit.violations.length > 0) {
1308
1312
  const warnings = audit.violations.filter(v => v.severity === "warning");
1309
1313
  for (const v of warnings) {
@@ -1319,7 +1323,7 @@ export async function postUnitPreVerification(pctx, opts) {
1319
1323
  if (taskRow) {
1320
1324
  const expectedOutput = taskRow.expected_output ?? [];
1321
1325
  const plannedFiles = taskRow.files ?? [];
1322
- const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, safetyConfig.file_change_allowlist);
1326
+ const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, fileChangeAllowlist);
1323
1327
  if (audit && audit.violations.length > 0) {
1324
1328
  const warnings = audit.violations.filter(v => v.severity === "warning");
1325
1329
  for (const v of warnings) {
@@ -1699,7 +1703,16 @@ export async function postUnitPreVerification(pctx, opts) {
1699
1703
  ctx.ui.notify(`Artifact missing for ${s.currentUnit.type} ${s.currentUnit.id} — DB unavailable, skipping retry.${dbSkipDiag ? ` Expected: ${dbSkipDiag}` : ""}`, "error");
1700
1704
  }
1701
1705
  else if (!triggerArtifactVerified) {
1702
- if (s.lastToolInvocationError) {
1706
+ if (s.lastToolInvocationError && isToolUnavailableError(s.lastToolInvocationError)) {
1707
+ // Tool-unavailable is the one transient invocation error: the
1708
+ // workflow MCP server registers its surface asynchronously, so a
1709
+ // Unit's first call can race the registration. Fall through to the
1710
+ // bounded verification retry instead of pausing.
1711
+ debugLog("postUnit", { phase: "tool-unavailable-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError });
1712
+ ctx.ui.notify(`Tool unavailable for ${s.currentUnit.type}: ${s.lastToolInvocationError}. The tool surface may still be registering — retrying.`, "warning");
1713
+ s.lastToolInvocationError = null;
1714
+ }
1715
+ else if (s.lastToolInvocationError) {
1703
1716
  const isUserSkip = /queued user message/i.test(s.lastToolInvocationError);
1704
1717
  const errMsg = isUserSkip
1705
1718
  ? `Tool skipped for ${s.currentUnit.type}: ${s.lastToolInvocationError}. Queued user message interrupted the turn — pausing auto-mode.`
@@ -1787,12 +1800,14 @@ export async function postUnitPreVerification(pctx, opts) {
1787
1800
  }
1788
1801
  }
1789
1802
  s.exhaustedVerificationUnits.add(retryKey);
1803
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
1790
1804
  debugLog("postUnit", { phase: "artifact-verify-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
1791
1805
  ctx.ui.notify(`${failureDetails} Pausing auto-mode after ${MAX_ARTIFACT_VERIFICATION_RETRIES} retries.`, "error");
1792
1806
  await pauseAuto(ctx, pi);
1793
1807
  return "dispatched";
1794
1808
  }
1795
1809
  s.verificationRetryCount.set(retryKey, attempt);
1810
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
1796
1811
  s.pendingVerificationRetry = {
1797
1812
  unitId: s.currentUnit.id,
1798
1813
  failureContext: `${failureDetails} (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
@@ -1812,6 +1827,8 @@ export async function postUnitPreVerification(pctx, opts) {
1812
1827
  }
1813
1828
  s.verificationRetryCount.delete(retryKey);
1814
1829
  s.verificationRetryFailureHashes.delete(retryKey);
1830
+ s.exhaustedVerificationUnits.delete(retryKey);
1831
+ saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
1815
1832
  if (s.currentUnit.type === "complete-milestone") {
1816
1833
  const { milestone: mid } = parseUnitId(s.currentUnit.id);
1817
1834
  if (mid) {
@@ -21,7 +21,7 @@ import { getPendingGatesForTurn } from "./gsd-db.js";
21
21
  import { assertGateCoverage, getGatesForTurn, } from "./gate-registry.js";
22
22
  import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
23
23
  import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
24
- import { composeContextModeInstructions, composeContractedUnitContext, composeInlinedContext, composeUnitContext, } from "./unit-context-composer.js";
24
+ import { composeContextModeInstructions, composeContractedUnitContext, composeInlinedContext, composeToolSurfaceInstructions, composeUnitContext, } from "./unit-context-composer.js";
25
25
  import { resolveManifest } from "./unit-context-manifest.js";
26
26
  import { compileUnitContextContract } from "./tool-contract.js";
27
27
  import { readCompactionSnapshot } from "./compaction-snapshot.js";
@@ -33,7 +33,7 @@ import { debugLog } from "./debug-logger.js";
33
33
  import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
34
34
  import { findMilestoneIds } from "./milestone-ids.js";
35
35
  import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
36
- import { resolveEffectiveUatType, shouldDispatchUatForContent } from "./uat-policy.js";
36
+ import { classifyUatContentForRun, shouldDispatchUatForContent, } from "./uat-policy.js";
37
37
  import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
38
38
  export { buildSkillActivationBlock, buildSkillDiscoveryVars };
39
39
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
@@ -224,12 +224,14 @@ function renderContextModeBlockForPrompt(unitType, base, renderMode = "standalon
224
224
  return `${contextMode}\n\n## Context Snapshot\nSource: \`.gsd/last-snapshot.md\`\n\n${snapshot.trimEnd()}`;
225
225
  }
226
226
  function prependContextModeToBlock(unitType, base, block, renderMode = "standalone") {
227
+ const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
227
228
  const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
228
- if (!contextMode)
229
+ const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
230
+ if (!guidance)
229
231
  return block;
230
232
  if (!block.trim())
231
- return contextMode;
232
- return `${contextMode}\n\n${block}`;
233
+ return guidance;
234
+ return `${guidance}\n\n${block}`;
233
235
  }
234
236
  function requireUnitPromptContextContract(unitType) {
235
237
  const result = compileUnitContextContract(unitType);
@@ -841,7 +843,7 @@ export async function inlineDecisionsFromDb(base, milestoneId, scope, level) {
841
843
  }
842
844
  /**
843
845
  * Inline requirements with optional milestone and slice scoping from the DB.
844
- * Falls back to filesystem via inlineGsdRootFile when DB unavailable or empty.
846
+ * Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
845
847
  */
846
848
  export async function inlineRequirementsFromDb(base, milestoneId, sliceId, level) {
847
849
  const inlineLevel = level ?? resolveInlineLevel();
@@ -849,14 +851,28 @@ export async function inlineRequirementsFromDb(base, milestoneId, sliceId, level
849
851
  const { isDbAvailable } = await import("./gsd-db.js");
850
852
  if (isDbAvailable()) {
851
853
  const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
852
- const requirements = queryRequirements({ milestoneId, sliceId });
854
+ let requirements = queryRequirements({ milestoneId, sliceId });
855
+ let broadenedScope = false;
856
+ if (requirements.length === 0 && sliceId) {
857
+ requirements = queryRequirements({ milestoneId });
858
+ broadenedScope = true;
859
+ }
860
+ if (requirements.length === 0 && milestoneId) {
861
+ requirements = queryRequirements({ status: "active" });
862
+ broadenedScope = true;
863
+ }
853
864
  if (requirements.length > 0) {
854
- // Use compact format for non-full levels to save ~40% tokens
855
- const formatted = inlineLevel !== "full"
865
+ // Use compact format for non-full levels, milestone-scoped calls, and
866
+ // any cascade stage that broadened past the originally requested scope —
867
+ // a slice-scoped "full" call that fell through to the project-wide
868
+ // active fallback must not format those rows as full requirements.
869
+ const useCompact = inlineLevel !== "full" || !sliceId || broadenedScope;
870
+ const formatted = useCompact
856
871
  ? formatRequirementsCompact(requirements)
857
872
  : formatRequirementsForPrompt(requirements);
858
873
  return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
859
874
  }
875
+ return null;
860
876
  }
861
877
  }
862
878
  catch (err) {
@@ -1265,6 +1281,32 @@ export async function checkNeedsReassessment(base, mid, state) {
1265
1281
  * - No UAT file exists for the slice
1266
1282
  * - UAT result file already exists (idempotent — already ran)
1267
1283
  */
1284
+ /**
1285
+ * Resolve the effective UAT mode for the dispatch gate the same way
1286
+ * `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
1287
+ * supplemental context, so a `browser-executable` UAT whose slice references a
1288
+ * self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
1289
+ * playwright test`) is promoted to `runtime-executable` for the gate too.
1290
+ *
1291
+ * Without this, `checkNeedsRunUat` returns `browser-executable` while the
1292
+ * prompt instructs runtime-only execution, causing the dispatch gate to
1293
+ * require browser tools / warm up the browser daemon (or stop dispatch when
1294
+ * browser MCP is unavailable) for UAT runs that never touch the browser. See
1295
+ * cursor[bot] review on PR #696 for the M007/S01 regression.
1296
+ */
1297
+ async function resolveRunUatEffectiveType(base, mid, sliceId, uatContent) {
1298
+ let summaryContent = "";
1299
+ try {
1300
+ const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
1301
+ if (summaryPath) {
1302
+ summaryContent = (await loadFile(summaryPath)) ?? "";
1303
+ }
1304
+ }
1305
+ catch (err) {
1306
+ logWarning("prompt", `resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`);
1307
+ }
1308
+ return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
1309
+ }
1268
1310
  export async function checkNeedsRunUat(base, mid, state, prefs) {
1269
1311
  // DB primary path — fall through to file-based when DB has no data for this milestone
1270
1312
  try {
@@ -1297,7 +1339,8 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
1297
1339
  }
1298
1340
  if (!shouldDispatchUatForContent(uatContent, prefs))
1299
1341
  continue;
1300
- return { sliceId: sid, uatType: resolveEffectiveUatType(uatContent) };
1342
+ const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
1343
+ return { sliceId: sid, uatType };
1301
1344
  }
1302
1345
  return null;
1303
1346
  }
@@ -1338,7 +1381,8 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
1338
1381
  }
1339
1382
  if (!shouldDispatchUatForContent(uatContentFb, prefs))
1340
1383
  continue;
1341
- return { sliceId: uatSid, uatType: resolveEffectiveUatType(uatContentFb) };
1384
+ const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
1385
+ return { sliceId: uatSid, uatType };
1342
1386
  }
1343
1387
  return null;
1344
1388
  }
@@ -2146,6 +2190,9 @@ export async function buildPlanSlicePrompt(mid, _midTitle, sid, sTitle, base, le
2146
2190
  `Either (a) add an earlier task that creates X on disk before the task that needs it, ` +
2147
2191
  `or (b) if this task IS the one that creates X, move X from inputs to expected_output. ` +
2148
2192
  `Do NOT put X in a task's expected_output if that task only reads or verifies X — only tasks that actually write X to disk should list it in expected_output.\n` +
2193
+ `- **"[file] X: ... GSD planning artifacts are projections preloaded as context / written by workflow tools"**: ` +
2194
+ `Remove X from the task's inputs, files, and expectedOutput entirely. Planning artifacts (anything under .gsd/, .planning/, or .audits/, or names like M001-CONTEXT.md / S01-PLAN.md) are preloaded as context and written by workflow tools — ` +
2195
+ `do NOT add a task that creates X and do NOT move X to expectedOutput.\n` +
2149
2196
  `- **"[file] X: Task T_early reads X but it's created by task T_late (sequence violation)"**: ` +
2150
2197
  `Either (a) reorder tasks so T_late (the creator) runs before T_early (the reader), ` +
2151
2198
  `or (b) if T_late doesn't actually create X (it only reads/tests it), remove X from T_late's expected_output entirely.\n` +
@@ -3094,10 +3141,25 @@ export async function buildRunUatPrompt(mid, sliceId, uatPath, uatContent, base)
3094
3141
  const rawInlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${composedBody}`;
3095
3142
  const cappedInlinedContext = capPreamble(rawInlinedContext);
3096
3143
  trackPromptContext(contextTelemetry, "cap", cappedInlinedContext.length < rawInlinedContext.length ? "skipped" : "inline", null, cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget");
3097
- const inlinedContext = prependContextModeToBlock("run-uat", base, cappedInlinedContext);
3144
+ const uatPolicy = classifyUatContentForRun(uatContent, cappedInlinedContext);
3145
+ const uatType = uatPolicy.effectiveType;
3146
+ const runtimeHarnessOverride = uatPolicy.declaredType === "browser-executable" && uatType === "runtime-executable"
3147
+ ? [
3148
+ "## Runtime harness override",
3149
+ "",
3150
+ "This UAT declares `browser-executable` but the slice references a self-contained verification command (`npm run test:uat`, `search-uat.mjs`, or similar).",
3151
+ "Run **only** that command via `gsd_uat_exec` with `uat-runtime-check` intent.",
3152
+ "Do **not** call `uat-service-start`, do **not** run `npm run start`, `npm run test:server`, or any separate server command.",
3153
+ "Do **not** use `browser_navigate` or other `browser_*` tools — the harness already exercises the browser.",
3154
+ "When the harness exits 0, save **PASS** with `uatType: \"runtime-executable\"` (the effective mode above, not the UAT file header) and **runtime** check modes only.",
3155
+ "",
3156
+ ].join("\n")
3157
+ : "";
3158
+ const inlinedContext = prependContextModeToBlock("run-uat", base, runtimeHarnessOverride
3159
+ ? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
3160
+ : cappedInlinedContext);
3098
3161
  emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
3099
3162
  const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
3100
- const uatType = resolveEffectiveUatType(uatContent);
3101
3163
  const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
3102
3164
  return loadPrompt("run-uat", {
3103
3165
  workingDirectory: base,
@@ -3338,18 +3400,18 @@ opts) {
3338
3400
  }
3339
3401
  const inlinedTemplates = inlineTemplate("task-summary", "Task Summary");
3340
3402
  trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates);
3341
- const prompt = loadPrompt("reactive-execute", {
3403
+ const prompt = prependContextModeToBlock("reactive-execute", base, loadPrompt("reactive-execute", {
3342
3404
  workingDirectory: base,
3343
3405
  milestoneId: mid,
3344
3406
  milestoneTitle: midTitle,
3345
3407
  sliceId: sid,
3346
3408
  sliceTitle: sTitle,
3347
- graphContext: prependContextModeToBlock("reactive-execute", base, graphContext),
3409
+ graphContext,
3348
3410
  readyTaskCount: String(readyTaskIds.length),
3349
3411
  readyTaskList: readyTaskListLines.join("\n"),
3350
3412
  subagentPrompts: subagentSections.join("\n\n---\n\n"),
3351
3413
  inlinedTemplates,
3352
- });
3414
+ }));
3353
3415
  emitPromptContextTelemetry("reactive-execute", contextTelemetry, prompt);
3354
3416
  return prompt;
3355
3417
  }
@@ -3489,17 +3551,17 @@ export async function buildGateEvaluatePrompt(mid, midTitle, sid, sTitle, base,
3489
3551
  "```",
3490
3552
  ].join("\n"));
3491
3553
  }
3492
- return loadPrompt("gate-evaluate", {
3554
+ return prependContextModeToBlock("gate-evaluate", base, loadPrompt("gate-evaluate", {
3493
3555
  workingDirectory: base,
3494
3556
  milestoneId: mid,
3495
3557
  milestoneTitle: midTitle,
3496
3558
  sliceId: sid,
3497
3559
  sliceTitle: sTitle,
3498
- slicePlanContent: prependContextModeToBlock("gate-evaluate", base, planContent),
3560
+ slicePlanContent: planContent,
3499
3561
  gateCount: String(pending.length),
3500
3562
  gateList: gateListLines.join("\n"),
3501
3563
  subagentPrompts: subagentSections.join("\n\n---\n\n"),
3502
- });
3564
+ }));
3503
3565
  }
3504
3566
  export async function buildRewriteDocsPrompt(mid, midTitle, activeSlice, base, overrides) {
3505
3567
  const sid = activeSlice?.id;