@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75

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 (726) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli.js +2 -19
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +14 -34
  8. package/dist/loader.js +6 -4
  9. package/dist/mcp-server.js +2 -1
  10. package/dist/models-resolver.d.ts +3 -13
  11. package/dist/models-resolver.js +3 -22
  12. package/dist/register-agent-bundles.d.ts +11 -2
  13. package/dist/register-agent-bundles.js +18 -4
  14. package/dist/resource-loader.d.ts +10 -5
  15. package/dist/resource-loader.js +123 -20
  16. package/dist/resources/.managed-resources-content-hash +1 -1
  17. package/dist/resources/GSD-WORKFLOW.md +5 -4
  18. package/dist/resources/extensions/ask-user-questions.js +3 -2
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  20. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  21. package/dist/resources/extensions/async-jobs/index.js +65 -0
  22. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  23. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  24. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  25. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  26. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  27. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  28. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  29. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  30. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  31. package/dist/resources/extensions/browser-tools/index.js +69 -12
  32. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
  33. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  34. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  35. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  36. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  37. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  38. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  39. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  40. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  41. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  42. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  43. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  44. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  45. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  46. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  47. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  48. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  49. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  50. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  51. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  52. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  53. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  54. package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
  55. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  56. package/dist/resources/extensions/gsd/auto-start.js +41 -18
  57. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  58. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  59. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  60. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  61. package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
  62. package/dist/resources/extensions/gsd/auto.js +56 -15
  63. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  64. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  65. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  66. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  67. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  68. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
  69. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
  70. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  71. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  72. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  73. package/dist/resources/extensions/gsd/captures.js +4 -6
  74. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  75. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  76. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  77. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  78. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  79. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  80. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  81. package/dist/resources/extensions/gsd/constants.js +0 -2
  82. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  83. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  84. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  85. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  86. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  87. package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
  88. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  89. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  90. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  91. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  92. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  93. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  94. package/dist/resources/extensions/gsd/files.js +33 -19
  95. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  96. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  97. package/dist/resources/extensions/gsd/guidance.js +158 -0
  98. package/dist/resources/extensions/gsd/guided-flow.js +110 -6
  99. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  100. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  101. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  102. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  103. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  104. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  105. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  106. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  107. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  108. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  109. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  110. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  111. package/dist/resources/extensions/gsd/notifications.js +12 -7
  112. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  113. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  114. package/dist/resources/extensions/gsd/paths.js +27 -0
  115. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  116. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  117. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  118. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  119. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  120. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  122. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  124. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  125. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  126. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  127. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  128. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  129. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  130. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  131. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  132. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  133. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  134. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  135. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  136. package/dist/resources/extensions/gsd/publication.js +87 -0
  137. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  138. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  139. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  140. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  141. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  142. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  143. package/dist/resources/extensions/gsd/state.js +12 -22
  144. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  145. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  146. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  147. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  148. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  149. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  150. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  151. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  152. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  153. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  156. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  157. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  158. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  159. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  160. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  165. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  166. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  167. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  168. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  169. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  170. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  171. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  172. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  173. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  174. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  175. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  176. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  177. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  178. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  179. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  180. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  182. package/dist/resources/extensions/gsd/worktree.js +8 -1
  183. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  184. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  185. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  186. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  187. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  188. package/dist/resources/shared/package-manager-detection.js +1 -1
  189. package/dist/resources/shared/package.json +3 -0
  190. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  191. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  192. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  193. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  194. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  195. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  196. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  197. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  198. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  199. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  200. package/dist/runtime-checks.d.ts +10 -0
  201. package/dist/runtime-checks.js +27 -0
  202. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  203. package/dist/update-check.d.ts +2 -0
  204. package/dist/update-check.js +24 -1
  205. package/dist/update-cmd.js +20 -3
  206. package/dist/web/standalone/.next/BUILD_ID +1 -1
  207. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  208. package/dist/web/standalone/.next/build-manifest.json +3 -3
  209. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  210. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  224. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  225. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  226. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  227. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/index.html +1 -1
  230. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  236. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  237. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  238. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  239. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  242. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  243. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  244. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  245. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  246. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  247. package/dist/web/standalone/package.json +1 -1
  248. package/dist/worktree-cli.js +3 -6
  249. package/dist/worktree-status-banner.js +7 -15
  250. package/package.json +3 -3
  251. package/packages/cloud-mcp-gateway/package.json +2 -2
  252. package/packages/contracts/dist/rpc.d.ts +1 -0
  253. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  254. package/packages/contracts/dist/rpc.js.map +1 -1
  255. package/packages/contracts/dist/workflow.d.ts +4 -0
  256. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  257. package/packages/contracts/dist/workflow.js.map +1 -1
  258. package/packages/contracts/package.json +1 -1
  259. package/packages/daemon/package.json +4 -4
  260. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  261. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  262. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  263. package/packages/gsd-agent-core/package.json +5 -5
  264. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  265. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  266. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  268. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  271. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  275. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  278. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  280. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  291. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  297. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  298. package/packages/gsd-agent-modes/package.json +7 -7
  299. package/packages/mcp-server/README.md +12 -3
  300. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  301. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/cli-runner.js +137 -0
  303. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  304. package/packages/mcp-server/dist/cli.js +2 -50
  305. package/packages/mcp-server/dist/cli.js.map +1 -1
  306. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  310. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  311. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  312. package/packages/mcp-server/dist/pid-registry.js +452 -0
  313. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  314. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  315. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  316. package/packages/mcp-server/dist/probe-mode.js +10 -0
  317. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  318. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  319. package/packages/mcp-server/dist/server.js +4 -0
  320. package/packages/mcp-server/dist/server.js.map +1 -1
  321. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  322. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  323. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  324. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  325. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  326. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  327. package/packages/mcp-server/dist/workflow-tools.js +178 -82
  328. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  329. package/packages/mcp-server/package.json +5 -4
  330. package/packages/native/package.json +1 -1
  331. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  332. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  333. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  334. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  335. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  336. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  337. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  338. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  339. package/packages/pi-agent-core/dist/index.js +3 -0
  340. package/packages/pi-agent-core/dist/index.js.map +1 -1
  341. package/packages/pi-agent-core/package.json +1 -1
  342. package/packages/pi-ai/README.md +1 -0
  343. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  344. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  345. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  346. package/packages/pi-ai/dist/index.d.ts +2 -0
  347. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  348. package/packages/pi-ai/dist/index.js +2 -0
  349. package/packages/pi-ai/dist/index.js.map +1 -1
  350. package/packages/pi-ai/dist/models.generated.d.ts +35 -125
  351. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  352. package/packages/pi-ai/dist/models.generated.js +46 -120
  353. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  354. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  355. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  356. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  357. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  358. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  359. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  360. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  361. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  362. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  363. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  364. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  365. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  366. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  367. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  368. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  369. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  370. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  371. package/packages/pi-ai/package.json +3 -2
  372. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  373. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  375. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  378. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  380. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  382. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  384. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  386. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  388. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  389. package/packages/pi-coding-agent/dist/index.js +1 -1
  390. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  392. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  393. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  395. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  396. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  397. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  398. package/packages/pi-coding-agent/package.json +7 -7
  399. package/packages/pi-tui/dist/index.d.ts +1 -1
  400. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  401. package/packages/pi-tui/dist/index.js +1 -1
  402. package/packages/pi-tui/dist/index.js.map +1 -1
  403. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  404. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  405. package/packages/pi-tui/dist/terminal-image.js +54 -2
  406. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  407. package/packages/pi-tui/dist/tui.d.ts +8 -0
  408. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  409. package/packages/pi-tui/dist/tui.js +72 -18
  410. package/packages/pi-tui/dist/tui.js.map +1 -1
  411. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  412. package/packages/pi-tui/dist/utils.js +110 -36
  413. package/packages/pi-tui/dist/utils.js.map +1 -1
  414. package/packages/pi-tui/package.json +2 -2
  415. package/packages/rpc-client/package.json +2 -2
  416. package/pkg/dist/theme/theme.d.ts.map +1 -1
  417. package/pkg/dist/theme/theme.js +45 -17
  418. package/pkg/dist/theme/theme.js.map +1 -1
  419. package/pkg/package.json +1 -1
  420. package/src/resources/GSD-WORKFLOW.md +5 -4
  421. package/src/resources/extensions/ask-user-questions.ts +7 -2
  422. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  423. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  424. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  425. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  426. package/src/resources/extensions/async-jobs/index.ts +79 -0
  427. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  428. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  429. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  430. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  431. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  432. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  433. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  434. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  435. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  436. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  437. package/src/resources/extensions/browser-tools/index.ts +71 -13
  438. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  439. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  440. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  441. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
  442. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  443. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  444. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  445. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  446. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  447. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  448. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  449. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  450. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  451. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  452. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  453. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  454. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  455. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  456. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  457. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  458. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  459. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  460. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  461. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  462. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  463. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  464. package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
  465. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  466. package/src/resources/extensions/gsd/auto-start.ts +42 -21
  467. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  468. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  469. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  470. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  471. package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
  472. package/src/resources/extensions/gsd/auto.ts +72 -17
  473. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  474. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  475. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  476. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  477. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  478. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
  479. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
  480. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  481. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  482. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  483. package/src/resources/extensions/gsd/captures.ts +4 -6
  484. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  485. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  486. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  487. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  488. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  489. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  490. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  491. package/src/resources/extensions/gsd/constants.ts +0 -3
  492. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  493. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  494. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  495. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  496. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  497. package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
  498. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  499. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  500. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  501. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  502. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  503. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  504. package/src/resources/extensions/gsd/files.ts +33 -12
  505. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  506. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  507. package/src/resources/extensions/gsd/guidance.ts +217 -0
  508. package/src/resources/extensions/gsd/guided-flow.ts +161 -26
  509. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  510. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  511. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  512. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  513. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  514. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  515. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  516. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  517. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  518. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  519. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  520. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  521. package/src/resources/extensions/gsd/notifications.ts +13 -6
  522. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  523. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  524. package/src/resources/extensions/gsd/paths.ts +33 -0
  525. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  526. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  527. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  528. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  529. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  530. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  531. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  532. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  533. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  534. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  535. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  536. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  537. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  538. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  539. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  540. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  541. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  542. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  543. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  544. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  545. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  546. package/src/resources/extensions/gsd/publication.ts +122 -0
  547. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  548. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  549. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  550. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  551. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  552. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  553. package/src/resources/extensions/gsd/state.ts +16 -22
  554. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  555. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  556. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  557. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  558. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  559. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  560. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  561. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  562. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  563. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  564. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  565. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  566. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  567. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  568. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  569. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  570. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  571. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  572. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  573. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  574. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  575. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  576. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  577. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  578. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  579. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  580. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  581. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  582. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  583. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  584. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  585. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  586. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  587. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  588. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  589. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  590. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  591. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  592. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  593. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  594. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  595. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  596. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  597. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  598. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
  599. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  600. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  601. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  602. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  603. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  605. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  606. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  607. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  608. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  609. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  610. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  611. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  612. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  613. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  614. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  615. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  616. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  617. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  618. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  619. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  620. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  621. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  622. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  623. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  624. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  625. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  626. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  627. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  628. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  629. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  630. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  631. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
  632. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  633. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  634. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  635. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  636. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  637. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  638. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  639. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  640. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  641. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  642. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  643. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  644. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  645. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  646. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  647. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  648. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  649. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  650. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  651. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  652. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
  653. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  654. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  655. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  656. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  657. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  658. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  659. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  660. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  661. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  662. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  663. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  664. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  665. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  666. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  667. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  668. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  669. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  670. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  671. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  672. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  673. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  674. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  675. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  676. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  677. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  678. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  679. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  680. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  681. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  682. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  683. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  684. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  685. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  686. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  687. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  688. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  689. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  690. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  691. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  692. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  693. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  694. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  695. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  696. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  697. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  698. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  699. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  700. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  701. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  702. package/src/resources/extensions/gsd/worktree.ts +7 -1
  703. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  704. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  705. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  706. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  707. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  708. package/src/resources/shared/package-manager-detection.ts +1 -1
  709. package/src/resources/shared/package.json +3 -0
  710. package/src/resources/skills/create-skill/SKILL.md +3 -0
  711. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  712. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  713. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  714. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  715. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  716. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  717. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  718. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  719. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  720. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  721. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  722. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  723. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  724. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  725. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
  726. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
@@ -22,7 +22,7 @@ type BlockedAdvanceResult = Extract<AutoAdvanceResult, { kind: "blocked" }>;
22
22
  import { debugCount, debugLog, debugTime } from "../debug-logger.js";
23
23
  import { reconcileBeforeDispatch } from "../state-reconciliation.js";
24
24
  import { isLegalEdge, IllegalPhaseTransitionError } from "../state-transition-matrix.js";
25
- import { resolveDispatch } from "../auto-dispatch.js";
25
+ import { hasPendingDeepStage, resolveDispatch } from "../auto-dispatch.js";
26
26
  import { classifyFailure } from "../recovery-classification.js";
27
27
  import { verifyExpectedArtifact, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
28
28
  import { invalidateAllCaches } from "../cache.js";
@@ -64,24 +64,22 @@ import {
64
64
  import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
65
65
  import { getErrorMessage } from "../error-utils.js";
66
66
  import { logWarning } from "../workflow-logger.js";
67
+ import { normalizeRealPath } from "../paths.js";
68
+ import {
69
+ buildDispatchKey,
70
+ createDispatchHistory,
71
+ STUCK_WINDOW_SIZE,
72
+ type DispatchHistory,
73
+ } from "./dispatch-history.js";
67
74
  import { existsSync, readFileSync } from "node:fs";
68
75
  import { join } from "node:path";
69
76
  import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
77
+ import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
70
78
 
71
79
  function now(): number {
72
80
  return Date.now();
73
81
  }
74
82
 
75
- /**
76
- * Size of the dispatch-decision ring buffer used by the Auto Orchestration
77
- * module's stuck-loop detector. When the same `${unitType}:${unitId}` key
78
- * fills the window, advance() blocks with `action: "stop"`.
79
- *
80
- * Mirrors the legacy `STUCK_WINDOW_SIZE` in auto/phases.ts so behaviour is
81
- * preserved across the eventual cutover (issue #5791).
82
- */
83
- export const STUCK_WINDOW_SIZE = 6;
84
-
85
83
  function noRemainingUnitsOutcome(stateSnapshot: GSDState): AutoTerminalOutcome {
86
84
  if (stateSnapshot.phase === "complete") {
87
85
  return {
@@ -196,14 +194,26 @@ export async function decideOrchestratorDispatch(
196
194
  ): Promise<DispatchDecision> {
197
195
  const state = input.stateSnapshot;
198
196
  const active = state.activeMilestone;
199
- if (!active) return null;
200
-
201
197
  const activeSession = input.session ?? session;
202
198
  const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
203
- if (activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
199
+ const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
200
+ if (!active) {
201
+ if (state.phase !== "pre-planning") return null;
202
+ if (!hasPendingDeepStage(prefs, activeDispatchBasePath)) {
203
+ return {
204
+ kind: "blocked",
205
+ reason: state.nextAction || "No active milestone. Run /gsd unpark <id> or create a new milestone.",
206
+ action: "stop",
207
+ };
208
+ }
209
+ }
210
+
211
+ if (active && activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
204
212
  activeSession.currentMilestoneId = active.id;
213
+ activeSession.milestoneLeaseToken = null;
205
214
  }
206
- const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
215
+ const dispatchMid = active?.id ?? activeSession?.currentMilestoneId ?? "";
216
+ const dispatchMidTitle = active?.title ?? "";
207
217
 
208
218
  // Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
209
219
  // (#5789). Prefer caller-supplied values when present so test harnesses and
@@ -235,8 +245,15 @@ export async function decideOrchestratorDispatch(
235
245
  ? "true"
236
246
  : "false");
237
247
 
248
+ // Only replay a milestone-scoped verification retry when a milestone is
249
+ // active. Pre-PR (#712 fix), `!active` returned null before reaching this
250
+ // block, so the retry was preserved for a future tick. The new
251
+ // pre-planning + deep-pending fall-through must keep that contract:
252
+ // otherwise a stale execute-task / complete-slice / complete-milestone
253
+ // retry whose target milestone has since been parked would preempt
254
+ // project-level deep rules like `discuss-project`.
238
255
  const pendingRetry = session?.pendingVerificationRetryDispatch;
239
- if (session && pendingRetry) {
256
+ if (session && pendingRetry && active) {
240
257
  session.pendingVerificationRetryDispatch = null;
241
258
  const alreadyClosedReason = getAlreadyClosedDispatchReason(
242
259
  pendingRetry.unitType,
@@ -258,8 +275,8 @@ export async function decideOrchestratorDispatch(
258
275
 
259
276
  const action = await resolveDispatch({
260
277
  basePath: activeDispatchBasePath,
261
- mid: active.id,
262
- midTitle: active.title,
278
+ mid: dispatchMid,
279
+ midTitle: dispatchMidTitle,
263
280
  state,
264
281
  prefs,
265
282
  session: activeSession,
@@ -303,8 +320,8 @@ export async function decideOrchestratorDispatch(
303
320
  prompt: action.prompt,
304
321
  pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
305
322
  state,
306
- mid: active.id,
307
- midTitle: active.title,
323
+ mid: dispatchMid,
324
+ midTitle: dispatchMidTitle,
308
325
  };
309
326
  session.pendingOrchestrationDispatch = pending;
310
327
  }
@@ -330,7 +347,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
330
347
  private seq = 0;
331
348
  private lastAdvanceKey: string | null = null;
332
349
  private lastFinalizedUnitKey: string | null = null;
333
- private dispatchKeyWindow: string[] = [];
350
+ // Dispatch History module (#482): the dispatch-decision window with
351
+ // cross-session DB rehydration and full detect-stuck rules.
352
+ private readonly dispatchHistory: DispatchHistory;
334
353
  // ADR-030 Phase Transition Invariant: the prior advance's reconciled Phase,
335
354
  // the "from" endpoint of the edge check. In-memory; reset on start/resume/stop
336
355
  // so the first advance of a session has no edge to assert.
@@ -347,6 +366,16 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
347
366
  this.runtimeBasePath = context.runtimeBasePath;
348
367
  this.s = context.session;
349
368
  this.flowId = `auto-orchestrator-${Date.now()}`;
369
+ this.dispatchHistory = createDispatchHistory({
370
+ windowSize: STUCK_WINDOW_SIZE,
371
+ // Same stable scope the auto-loop uses for stuck-state persistence so
372
+ // rehydration reads the rows the dispatch ledger wrote for this project.
373
+ resolveScopeId: () =>
374
+ normalizeRealPath(
375
+ this.s.scope?.workspace.projectRoot ??
376
+ (this.s.originalBasePath || this.s.basePath || this.runtimeBasePath),
377
+ ) || null,
378
+ });
350
379
  }
351
380
 
352
381
  // ── Live base-path resolution (was the wiring factory's getLiveDispatchBasePath) ──
@@ -582,6 +611,37 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
582
611
  };
583
612
  }
584
613
 
614
+ private async mergePendingCompleteMilestone(milestoneId: string): Promise<{ ok: true } | { ok: false; reason: string }> {
615
+ const result = this.buildLifecycle().exitMilestone(
616
+ milestoneId,
617
+ { merge: true },
618
+ this.ctx.ui,
619
+ );
620
+ if (!result.ok) {
621
+ const detail = result.cause instanceof Error
622
+ ? result.cause.message
623
+ : result.reason;
624
+ return {
625
+ ok: false,
626
+ reason: `Milestone ${milestoneId} is complete, but the system-owned merge failed: ${detail}`,
627
+ };
628
+ }
629
+
630
+ this.s.milestoneMergedInPhases = true;
631
+ this.s.milestoneSettlement = { ok: true, reason: "settled" };
632
+ try {
633
+ const projectRoot = this.s.originalBasePath || this.s.canonicalProjectRoot || this.runtimeBasePath;
634
+ const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
635
+ await rebuildMarkdownProjectionsFromDb(projectRoot);
636
+ } catch (err) {
637
+ logWarning(
638
+ "engine",
639
+ `markdown projection rebuild after settlement merge failed: ${err instanceof Error ? err.message : String(err)}`,
640
+ );
641
+ }
642
+ return { ok: true };
643
+ }
644
+
585
645
  private clearPendingDispatch(): void {
586
646
  this.s.pendingOrchestrationDispatch = null;
587
647
  }
@@ -661,9 +721,6 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
661
721
  reason: `No Unit manifest is registered for ${unitType}`,
662
722
  };
663
723
  }
664
- if (isolationMode !== "worktree") {
665
- return { ok: true, reason: "not-required" };
666
- }
667
724
  const writeScope =
668
725
  manifest.tools.mode === "all" || manifest.tools.mode === "docs"
669
726
  ? "source-writing"
@@ -672,7 +729,23 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
672
729
  const activeBasePath = this.getLiveDispatchBasePath();
673
730
  const snapshot = await deriveState(activeBasePath);
674
731
  const milestoneId = snapshot.activeMilestone?.id ?? null;
675
- const expectedBranch = milestoneId ? autoWorktreeBranch(milestoneId) : null;
732
+ const buildExpectedBranch = (mode: ReturnType<typeof getIsolationMode>) =>
733
+ mode !== "none" && milestoneId ? autoWorktreeBranch(milestoneId) : null;
734
+ // The milestone lease coordinates concurrent workers on an isolated
735
+ // milestone worktree/branch. `none` mode has no per-milestone isolation
736
+ // and does not reliably claim a lease, so requiring one there would
737
+ // falsely fail dispatch; enforce it only in isolated modes.
738
+ const buildLease = (mode: ReturnType<typeof getIsolationMode>) =>
739
+ milestoneId && this.s.workerId
740
+ ? {
741
+ required: writeScope === "source-writing" && mode !== "none",
742
+ held: hasHeldMilestoneLease(this.s, milestoneId),
743
+ owner: this.s.workerId,
744
+ }
745
+ : undefined;
746
+ if (writeScope === "source-writing") {
747
+ reclaimMissingMilestoneLease(this.s, milestoneId, isolationMode, "orchestrator");
748
+ }
676
749
  let result = safety.validateUnitRoot({
677
750
  unitType,
678
751
  unitId,
@@ -681,7 +754,8 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
681
754
  unitRoot: activeBasePath,
682
755
  milestoneId,
683
756
  isolationMode,
684
- expectedBranch,
757
+ expectedBranch: buildExpectedBranch(isolationMode),
758
+ lease: buildLease(isolationMode),
685
759
  });
686
760
  if (!result.ok) {
687
761
  const repaired = await repairAutoWorktreeSafetyFailure({
@@ -698,16 +772,20 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
698
772
  this.rebuildScope(this.s.basePath, this.s.currentMilestoneId);
699
773
  return { ok: true };
700
774
  },
701
- revalidate: () => safety.validateUnitRoot({
702
- unitType,
703
- unitId,
704
- writeScope,
705
- projectRoot: this.runtimeBasePath,
706
- unitRoot: this.getLiveDispatchBasePath(),
707
- milestoneId,
708
- isolationMode: this.getEffectiveUnitIsolationMode(this.runtimeBasePath),
709
- expectedBranch,
710
- }),
775
+ revalidate: () => {
776
+ const revalidatedMode = this.getEffectiveUnitIsolationMode(this.runtimeBasePath);
777
+ return safety.validateUnitRoot({
778
+ unitType,
779
+ unitId,
780
+ writeScope,
781
+ projectRoot: this.runtimeBasePath,
782
+ unitRoot: this.getLiveDispatchBasePath(),
783
+ milestoneId,
784
+ isolationMode: revalidatedMode,
785
+ expectedBranch: buildExpectedBranch(revalidatedMode),
786
+ lease: buildLease(revalidatedMode),
787
+ });
788
+ },
711
789
  });
712
790
  result = repaired.result;
713
791
  if (result.ok) {
@@ -765,7 +843,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
765
843
  * skipped result) instead of stopping.
766
844
  */
767
845
  private tryStuckArtifactRecovery(unitType: string, unitId: string): boolean {
768
- const key = `${unitType}:${unitId}`;
846
+ const key = buildDispatchKey(unitType, unitId);
769
847
  if (this.lastStuckRecoveryKey === key) return false; // already tried this episode
770
848
  const basePath = this.getLiveDispatchBasePath();
771
849
  if (!verifyExpectedArtifact(unitType, unitId, basePath)) return false;
@@ -777,7 +855,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
777
855
  if (!refreshed.ok && refreshed.fatal) return false;
778
856
  this.lastStuckRecoveryKey = key;
779
857
  invalidateAllCaches();
780
- this.dispatchKeyWindow = [];
858
+ this.dispatchHistory.clearOnRecovery();
781
859
  this.lastAdvanceKey = null;
782
860
  this.lastFinalizedUnitKey = null;
783
861
  return true;
@@ -808,7 +886,12 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
808
886
  public async start(_sessionContext: AutoSessionContext): Promise<AutoAdvanceResult> {
809
887
  this.lastAdvanceKey = null;
810
888
  this.lastFinalizedUnitKey = null;
811
- this.dispatchKeyWindow = [];
889
+ // #482: the DB dispatch ledger is the source of truth across sessions.
890
+ // Discard any in-memory window and rebuild it from the ledger so a unit
891
+ // that was re-dispatched in previous sessions is detected as stuck here
892
+ // instead of silently re-dispatching forever.
893
+ this.dispatchHistory.clearOnRecovery();
894
+ this.dispatchHistory.rehydrate();
812
895
  this.lastStuckRecoveryKey = null;
813
896
  this.lastDerivedPhase = null;
814
897
  this.status.phase = "running";
@@ -910,10 +993,39 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
910
993
  if (!decision) {
911
994
  const settlementBlock = this.evaluateNoRemainingUnitsSettlement(reconciliation.stateSnapshot);
912
995
  if (settlementBlock) {
996
+ const settlement = this.s.milestoneSettlement;
997
+ if (settlement && !settlement.ok && settlement.reason === "merge-pending") {
998
+ const merged = await this.mergePendingCompleteMilestone(settlement.milestoneId);
999
+ if (merged.ok) {
1000
+ const terminalOutcome = noRemainingUnitsOutcome(reconciliation.stateSnapshot);
1001
+ const stopped: AutoAdvanceResult = {
1002
+ kind: "stopped",
1003
+ reason: terminalOutcome.displayReason,
1004
+ stateSnapshot: reconciliation.stateSnapshot,
1005
+ terminalOutcome,
1006
+ };
1007
+ this.status.phase = "stopped";
1008
+ this.status.activeUnit = undefined;
1009
+ this.lastAdvanceKey = null;
1010
+ this.dispatchHistory.clearOnRecovery();
1011
+ this.bumpTransition();
1012
+ this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
1013
+ this.postAdvanceRecord(stopped);
1014
+ return stopped;
1015
+ }
1016
+ settlementBlock.reason = merged.reason;
1017
+ settlementBlock.terminalOutcome = {
1018
+ code: "settlement-blocked",
1019
+ displayReason: merged.reason,
1020
+ nextAction: `Fix the merge failure, then retry \`/gsd dispatch complete-milestone ${settlement.milestoneId}\`.`,
1021
+ milestoneId: settlement.milestoneId,
1022
+ allMilestonesComplete: false,
1023
+ };
1024
+ }
913
1025
  this.status.phase = "paused";
914
1026
  this.status.activeUnit = undefined;
915
1027
  this.lastAdvanceKey = null;
916
- this.dispatchKeyWindow = [];
1028
+ this.dispatchHistory.clearOnRecovery();
917
1029
  this.bumpTransition();
918
1030
  this.journalTransition({ name: "advance-blocked", reason: settlementBlock.reason });
919
1031
  this.postAdvanceRecord(settlementBlock);
@@ -929,7 +1041,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
929
1041
  this.status.phase = "stopped";
930
1042
  this.status.activeUnit = undefined;
931
1043
  this.lastAdvanceKey = null;
932
- this.dispatchKeyWindow = [];
1044
+ this.dispatchHistory.clearOnRecovery();
933
1045
  this.bumpTransition();
934
1046
  this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
935
1047
  this.postAdvanceRecord(stopped);
@@ -979,18 +1091,13 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
979
1091
  return blocked;
980
1092
  }
981
1093
 
982
- const nextKey = `${decision.unitType}:${decision.unitId}`;
983
-
984
- // Record every dispatch decision in the ring buffer before pre-flight
1094
+ // Record every dispatch decision in the history window before pre-flight
985
1095
  // checks so the stuck-loop detector observes the full decision history
986
1096
  // (including decisions that idempotency would otherwise short-circuit).
987
- // The ring is capped at STUCK_WINDOW_SIZE and evicts oldest-first.
988
- this.dispatchKeyWindow.push(nextKey);
989
- if (this.dispatchKeyWindow.length > STUCK_WINDOW_SIZE) {
990
- this.dispatchKeyWindow.shift();
991
- }
1097
+ // The window is capped at STUCK_WINDOW_SIZE and evicts oldest-first.
1098
+ const nextKey = this.dispatchHistory.recordDispatch(decision.unitType, decision.unitId);
992
1099
 
993
- const matchingCount = this.dispatchKeyWindow.filter((k) => k === nextKey).length;
1100
+ const matchingCount = this.dispatchHistory.countMatching(nextKey);
994
1101
  if (this.lastFinalizedUnitKey === nextKey) {
995
1102
  // #442: the unit re-dispatched immediately after finalizing may have
996
1103
  // actually completed on disk with a stale DB. Verify + recover before
@@ -1023,23 +1130,32 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1023
1130
  // checks coexist: idempotency for the common immediate-repeat case,
1024
1131
  // stuck-loop for the saturated-window case.
1025
1132
  if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
1133
+ // Unit already active — benign no-op. Return skipped so the loop re-polls
1134
+ // without cancelling the in-flight unit (blocked+pause would force-cancel it).
1026
1135
  this.clearPendingDispatch();
1027
- const blocked: AutoAdvanceResult = { kind: "blocked", reason: "idempotent advance: unit already active", action: "pause" };
1136
+ const skipped: AutoAdvanceResult = { kind: "skipped", reason: "idempotent advance: unit already active" };
1028
1137
  this.journalTransition({
1029
- name: "advance-blocked",
1030
- reason: blocked.reason,
1138
+ name: "advance-skipped",
1139
+ reason: skipped.reason,
1031
1140
  unitType: decision.unitType,
1032
1141
  unitId: decision.unitId,
1033
1142
  });
1034
- this.postAdvanceRecord(blocked);
1035
- return blocked;
1143
+ this.postAdvanceRecord(skipped);
1144
+ return skipped;
1036
1145
  }
1037
1146
 
1038
- // Stuck-loop detection: when the ring is saturated with copies of
1039
- // `nextKey` (count >= STUCK_WINDOW_SIZE), the orchestrator has been
1040
- // picking the same unit across the whole window and must hard-stop with
1041
- // a diagnosable reason.
1042
- if (matchingCount >= STUCK_WINDOW_SIZE) {
1147
+ // Stuck-loop detection: when the window is saturated with copies of
1148
+ // `nextKey` (count >= STUCK_WINDOW_SIZE), consult the Dispatch History
1149
+ // module's full detect-stuck rule set for the verdict instead of the old
1150
+ // bare saturation count. This keeps the saturation threshold (the window
1151
+ // deliberately records benign idempotent repeats, so earlier-firing
1152
+ // rules would false-positive on pause/resume re-advances) while gaining
1153
+ // retry-budget suppression and diagnosable rule reasons. A saturated
1154
+ // window with no verdict means the dispatch ledger says we are inside
1155
+ // the unit's retry-backoff budget — let the retry proceed.
1156
+ const stuckVerdict =
1157
+ matchingCount >= STUCK_WINDOW_SIZE ? this.dispatchHistory.detectStuck() : null;
1158
+ if (stuckVerdict) {
1043
1159
  // #442: before declaring a stuck loop, verify the unit didn't actually
1044
1160
  // complete on disk (stale DB) and recover if so — legacy graduated
1045
1161
  // stuck-recovery parity. Otherwise hard-stop with a diagnosable reason.
@@ -1050,7 +1166,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1050
1166
  this.clearPendingDispatch();
1051
1167
  const blocked: AutoAdvanceResult = {
1052
1168
  kind: "blocked",
1053
- reason: `stuck-loop: ${nextKey} picked ${matchingCount} times`,
1169
+ reason: `stuck-loop: ${stuckVerdict.reason}`,
1054
1170
  action: "stop",
1055
1171
  };
1056
1172
  this.journalTransition({
@@ -1144,7 +1260,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1144
1260
  if (result.kind === "stopped") {
1145
1261
  this.lastAdvanceKey = null;
1146
1262
  this.lastFinalizedUnitKey = null;
1147
- this.dispatchKeyWindow = [];
1263
+ this.dispatchHistory.clearOnRecovery();
1148
1264
  this.status.activeUnit = undefined;
1149
1265
  }
1150
1266
  this.bumpTransition();
@@ -1173,8 +1289,14 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1173
1289
  public async resume(): Promise<AutoAdvanceResult> {
1174
1290
  this.lastAdvanceKey = null;
1175
1291
  this.lastFinalizedUnitKey = null;
1176
- // Preserve dispatchKeyWindow across resume so stuck-loop detection
1177
- // accumulates across pause/resume cycles rather than resetting each time.
1292
+ // Preserve the dispatch-history window across an in-process resume so
1293
+ // stuck-loop detection accumulates across pause/resume cycles rather than
1294
+ // resetting each time (#572 regression). When the window is empty (fresh
1295
+ // orchestrator resuming a prior session), rehydrate it from the DB
1296
+ // dispatch ledger so cross-session re-dispatch loops are detected (#482).
1297
+ if (this.dispatchHistory.getRecentWindow().length === 0) {
1298
+ this.dispatchHistory.rehydrate();
1299
+ }
1178
1300
  this.lastStuckRecoveryKey = null;
1179
1301
  // ADR-030: drop the prior "from" — the first advance after resume has no
1180
1302
  // edge to assert (avoids a false illegal-edge across the pause boundary).
@@ -1196,10 +1318,10 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1196
1318
  this.lastAdvanceKey = null;
1197
1319
  this.lastFinalizedUnitKey = null;
1198
1320
  this.lastDerivedPhase = null;
1199
- // Preserve dispatchKeyWindow on pause so stuck-loop detection accumulates
1200
- // across pause/resume cycles. Only clear on a hard stop.
1321
+ // Preserve the dispatch-history window on pause so stuck-loop detection
1322
+ // accumulates across pause/resume cycles. Only clear on a hard stop.
1201
1323
  if (reason !== "pause") {
1202
- this.dispatchKeyWindow = [];
1324
+ this.dispatchHistory.clearOnRecovery();
1203
1325
  }
1204
1326
  this.lastStuckRecoveryKey = null;
1205
1327
  this.bumpTransition();
@@ -1213,9 +1335,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1213
1335
  }
1214
1336
 
1215
1337
  public async completeActiveUnit(unit: { unitType: string; unitId: string }): Promise<void> {
1216
- const unitKey = `${unit.unitType}:${unit.unitId}`;
1338
+ const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
1217
1339
  const activeUnitKey = this.status.activeUnit
1218
- ? `${this.status.activeUnit.unitType}:${this.status.activeUnit.unitId}`
1340
+ ? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
1219
1341
  : null;
1220
1342
  if (activeUnitKey !== unitKey) return;
1221
1343
 
@@ -1233,9 +1355,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
1233
1355
  }
1234
1356
 
1235
1357
  public async retryActiveUnit(unit: { unitType: string; unitId: string }): Promise<void> {
1236
- const unitKey = `${unit.unitType}:${unit.unitId}`;
1358
+ const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
1237
1359
  const activeUnitKey = this.status.activeUnit
1238
- ? `${this.status.activeUnit.unitType}:${this.status.activeUnit.unitId}`
1360
+ ? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
1239
1361
  : null;
1240
1362
  if (activeUnitKey !== unitKey && this.lastFinalizedUnitKey !== unitKey) return;
1241
1363
 
@@ -0,0 +1,199 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Shared helpers used across auto-loop phase modules.
3
+
4
+ import { setRuntimeKv } from "../db/runtime-kv.js";
5
+ import { debugLog } from "../debug-logger.js";
6
+ import { normalizeRealPath } from "../paths.js";
7
+ import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "../worktree-root.js";
8
+ import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
9
+ import type { AutoSession } from "./session.js";
10
+ import type { IterationContext, IterationData, LoopState, PhaseResult } from "./types.js";
11
+ import type { Phase } from "../types.js";
12
+
13
+ const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
14
+
15
+ /** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
16
+ export function isSamePathLocal(a: string, b: string): boolean {
17
+ return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
18
+ }
19
+
20
+ export function isIsolatedWorktreeSession(s: AutoSession): boolean {
21
+ return Boolean(s.originalBasePath)
22
+ && Boolean(s.basePath)
23
+ && !isSamePathLocal(s.originalBasePath, s.basePath);
24
+ }
25
+
26
+ export function persistStuckRecoveryAttempts(s: AutoSession, loopState: LoopState): void {
27
+ const scopeId = normalizeRealPath(
28
+ s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath),
29
+ );
30
+ if (!scopeId) return;
31
+ try {
32
+ setRuntimeKv("global", scopeId, STUCK_RECOVERY_ATTEMPTS_KEY, loopState.stuckRecoveryAttempts);
33
+ } catch (err) {
34
+ debugLog("autoLoop", {
35
+ phase: "save-stuck-state-failed",
36
+ error: err instanceof Error ? err.message : String(err),
37
+ });
38
+ }
39
+ }
40
+
41
+ export async function applyVerificationRetryPolicy(
42
+ ic: IterationContext,
43
+ unitType: string | undefined,
44
+ phase: "artifact-verification-retry" | "verification-retry" | "pre-execution-retry",
45
+ ): Promise<PhaseResult | null> {
46
+ const { ctx, pi, s, deps } = ic;
47
+ const retryInfo = s.pendingVerificationRetry;
48
+ const key = unitType && retryInfo
49
+ ? verificationRetryKey(unitType, retryInfo.unitId)
50
+ : undefined;
51
+ const decision = decideVerificationRetry({
52
+ unitType,
53
+ retryInfo,
54
+ previousFailureHash: key ? s.verificationRetryFailureHashes.get(key) : undefined,
55
+ });
56
+
57
+ if (decision.action === "pause") {
58
+ s.pendingVerificationRetry = null;
59
+ debugLog("autoLoop", {
60
+ phase: `${phase}-paused`,
61
+ reason: decision.reason,
62
+ unitType,
63
+ unitId: retryInfo?.unitId,
64
+ failureHash: decision.failureHash,
65
+ });
66
+ ctx.ui.notify(
67
+ decision.reason === "duplicate-failure-context"
68
+ ? `Verification retry for ${unitType ?? "unit"} ${retryInfo?.unitId ?? "unknown"} produced the same failure context. Pausing auto-mode instead of re-dispatching.`
69
+ : "Verification retry requested without retry context. Pausing auto-mode instead of re-dispatching.",
70
+ "warning",
71
+ );
72
+ await deps.pauseAuto(ctx, pi);
73
+ return { action: "break", reason: decision.reason };
74
+ }
75
+
76
+ s.verificationRetryFailureHashes.set(decision.key, decision.failureHash);
77
+ debugLog("autoLoop", {
78
+ phase: `${phase}-backoff`,
79
+ iteration: ic.iteration,
80
+ unitType,
81
+ unitId: retryInfo?.unitId,
82
+ attempt: retryInfo?.attempt,
83
+ delayMs: decision.delayMs,
84
+ baseDelayMs: decision.baseDelayMs,
85
+ failureHash: decision.failureHash,
86
+ });
87
+ await new Promise<void>((resolve) => setTimeout(resolve, decision.delayMs));
88
+ return null;
89
+ }
90
+
91
+ export function rememberRetryDispatch(
92
+ s: AutoSession,
93
+ unit: { type: string; id: string } | null,
94
+ iterData: IterationData,
95
+ ): void {
96
+ if (!unit) return;
97
+ s.pendingVerificationRetryDispatch = {
98
+ unitType: unit.type,
99
+ unitId: unit.id,
100
+ prompt: iterData.prompt,
101
+ pauseAfterUatDispatch: iterData.pauseAfterUatDispatch,
102
+ state: iterData.state,
103
+ mid: iterData.mid,
104
+ midTitle: iterData.midTitle,
105
+ };
106
+ }
107
+
108
+ /**
109
+ * Resolve the base path for milestone reports.
110
+ * Prefers originalBasePath (project root) over basePath (which may be a worktree).
111
+ */
112
+ export function _resolveReportBasePath(s: Pick<AutoSession, "originalBasePath" | "basePath">): string {
113
+ return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
114
+ }
115
+
116
+ /**
117
+ * Resolve the authoritative project base for dispatch guards.
118
+ * Prior-milestone completion lives at the project root, even when the active
119
+ * unit is running inside an auto worktree.
120
+ */
121
+ export function _resolveDispatchGuardBasePath(
122
+ s: Pick<AutoSession, "originalBasePath" | "basePath">,
123
+ ): string {
124
+ return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
125
+ }
126
+
127
+ const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
128
+ "executing",
129
+ "summarizing",
130
+ "validating-milestone",
131
+ "completing-milestone",
132
+ ]);
133
+
134
+ export function shouldRunPlanV2Gate(phase: Phase): boolean {
135
+ return PLAN_V2_GATE_PHASES.has(phase);
136
+ }
137
+
138
+ export function _resolveCurrentUnitStartedAtForTest(
139
+ currentUnit: { startedAt: number } | null | undefined,
140
+ ): number | undefined {
141
+ return currentUnit?.startedAt;
142
+ }
143
+
144
+ export async function emitCancelledUnitEnd(
145
+ ic: IterationContext,
146
+ unitType: string,
147
+ unitId: string,
148
+ unitStartSeq: number,
149
+ errorContext?: { message: string; category: string; stopReason?: string; isTransient?: boolean; retryAfterMs?: number },
150
+ ): Promise<void> {
151
+ ic.deps.emitJournalEvent({
152
+ ts: new Date().toISOString(),
153
+ flowId: ic.flowId,
154
+ seq: ic.nextSeq(),
155
+ eventType: "unit-end",
156
+ data: {
157
+ unitType,
158
+ unitId,
159
+ status: "cancelled",
160
+ artifactVerified: false,
161
+ ...(errorContext ? { errorContext } : {}),
162
+ },
163
+ causedBy: { flowId: ic.flowId, seq: unitStartSeq },
164
+ });
165
+ }
166
+
167
+ export function _buildCancelledUnitStopReason(
168
+ unitType: string,
169
+ unitId: string,
170
+ errorContext?: { message: string; category: string },
171
+ ): {
172
+ notifyMessage: string;
173
+ stopReason: string;
174
+ loopReason: "session-failed" | "unit-aborted";
175
+ } {
176
+ const cancellationMessage = errorContext?.message ?? "unknown";
177
+ const isSessionCreationFailure = errorContext?.category === "session-failed";
178
+
179
+ if (isSessionCreationFailure) {
180
+ return {
181
+ notifyMessage: `Session creation failed for ${unitType} ${unitId}: ${cancellationMessage}. Stopping auto-mode.`,
182
+ stopReason: `Session creation failed: ${cancellationMessage}`,
183
+ loopReason: "session-failed",
184
+ };
185
+ }
186
+
187
+ return {
188
+ notifyMessage: `Unit ${unitType} ${unitId} aborted after dispatch: ${cancellationMessage}. Stopping auto-mode.`,
189
+ stopReason: `Unit aborted: ${cancellationMessage}`,
190
+ loopReason: "unit-aborted",
191
+ };
192
+ }
193
+
194
+ export function _isPauseOriginCancelledResult(
195
+ isPaused: boolean,
196
+ errorContext?: { message: string; category: string },
197
+ ): boolean {
198
+ return isPaused && !errorContext;
199
+ }