@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.6ccd27b3

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