@opengsd/gsd-pi 1.2.0-dev.0b870afa → 1.2.0-dev.23d85b63

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 (579) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +14 -19
  4. package/dist/headless-events.d.ts +16 -1
  5. package/dist/headless-events.js +19 -2
  6. package/dist/headless.js +8 -1
  7. package/dist/loader.js +6 -4
  8. package/dist/onboarding.js +9 -4
  9. package/dist/provider-migrations.d.ts +23 -0
  10. package/dist/provider-migrations.js +41 -0
  11. package/dist/register-agent-bundles.d.ts +11 -2
  12. package/dist/register-agent-bundles.js +18 -4
  13. package/dist/resource-loader.d.ts +10 -5
  14. package/dist/resource-loader.js +121 -6
  15. package/dist/resources/.managed-resources-content-hash +1 -1
  16. package/dist/resources/extensions/ask-user-questions.js +3 -2
  17. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  18. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  19. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  20. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
  22. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  23. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  24. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  25. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  26. package/dist/resources/extensions/gsd/auto/orchestrator.js +119 -18
  27. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  28. package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
  29. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  34. package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
  40. package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
  41. package/dist/resources/extensions/gsd/auto-start.js +28 -7
  42. package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
  43. package/dist/resources/extensions/gsd/auto.js +83 -19
  44. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  46. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
  47. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
  48. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
  49. package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
  50. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
  51. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  52. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  56. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  57. package/dist/resources/extensions/gsd/db/queries.js +30 -0
  58. package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
  59. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  60. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  61. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  62. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  63. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  64. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  65. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
  66. package/dist/resources/extensions/gsd/gsd-db.js +15 -20
  67. package/dist/resources/extensions/gsd/guided-flow.js +88 -2
  68. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  69. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  70. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  71. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  72. package/dist/resources/extensions/gsd/notifications.js +12 -7
  73. package/dist/resources/extensions/gsd/preferences-models.js +17 -9
  74. package/dist/resources/extensions/gsd/preferences.js +91 -5
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
  81. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  83. package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
  84. package/dist/resources/extensions/gsd/session-lock.js +4 -3
  85. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  86. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -6
  87. package/dist/resources/extensions/gsd/state.js +6 -2
  88. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  89. package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
  91. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  92. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  93. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  94. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  95. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  96. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +101 -2
  98. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  99. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  100. package/dist/resources/extensions/gsd/worktree.js +8 -1
  101. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  102. package/dist/resources/extensions/search-the-web/index.js +41 -9
  103. package/dist/resources/extensions/search-the-web/native-search.js +18 -4
  104. package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
  105. package/dist/resources/extensions/subagent/index.js +20 -15
  106. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  107. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  108. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  109. package/dist/runtime-checks.d.ts +10 -0
  110. package/dist/runtime-checks.js +27 -0
  111. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  112. package/dist/web/standalone/.next/BUILD_ID +1 -1
  113. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  114. package/dist/web/standalone/.next/build-manifest.json +2 -2
  115. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  116. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/index.html +1 -1
  167. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  175. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  178. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  179. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  180. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  181. package/package.json +4 -4
  182. package/packages/cloud-mcp-gateway/package.json +2 -2
  183. package/packages/contracts/package.json +1 -1
  184. package/packages/daemon/package.json +4 -4
  185. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  186. package/packages/gsd-agent-core/dist/sdk.js +12 -6
  187. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  188. package/packages/gsd-agent-core/package.json +5 -5
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  212. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  214. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  218. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  219. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  220. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  228. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -0
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +85 -19
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  264. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  277. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  278. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
  280. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
  291. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  292. package/packages/gsd-agent-modes/package.json +7 -7
  293. package/packages/mcp-server/README.md +12 -3
  294. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  295. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  296. package/packages/mcp-server/dist/cli-runner.js +137 -0
  297. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  298. package/packages/mcp-server/dist/cli.js +2 -58
  299. package/packages/mcp-server/dist/cli.js.map +1 -1
  300. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  301. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/pid-registry.js +459 -0
  303. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  304. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  305. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  306. package/packages/mcp-server/dist/probe-mode.js +10 -0
  307. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  308. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  309. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  310. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  311. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  312. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  313. package/packages/mcp-server/dist/workflow-tools.js +62 -43
  314. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  315. package/packages/mcp-server/package.json +5 -5
  316. package/packages/native/package.json +1 -1
  317. package/packages/pi-agent-core/dist/agent-loop.js +52 -2
  318. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  319. package/packages/pi-agent-core/package.json +1 -1
  320. package/packages/pi-ai/package.json +1 -1
  321. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  322. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  325. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  328. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  330. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  332. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  334. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  336. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  340. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  341. package/packages/pi-coding-agent/package.json +8 -8
  342. package/packages/pi-tui/README.md +15 -0
  343. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  344. package/packages/pi-tui/dist/autocomplete.js +6 -1
  345. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  346. package/packages/pi-tui/dist/components/input.js +1 -1
  347. package/packages/pi-tui/dist/components/input.js.map +1 -1
  348. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/components/loader.js +1 -0
  350. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  351. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/components/select-list.js +8 -2
  353. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  354. package/packages/pi-tui/dist/index.d.ts +2 -2
  355. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  356. package/packages/pi-tui/dist/index.js +2 -2
  357. package/packages/pi-tui/dist/index.js.map +1 -1
  358. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  359. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/terminal-image.js +54 -2
  361. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  362. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  363. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  364. package/packages/pi-tui/dist/terminal.js +70 -25
  365. package/packages/pi-tui/dist/terminal.js.map +1 -1
  366. package/packages/pi-tui/dist/tui.d.ts +15 -0
  367. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/tui.js +106 -21
  369. package/packages/pi-tui/dist/tui.js.map +1 -1
  370. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/utils.js +110 -36
  372. package/packages/pi-tui/dist/utils.js.map +1 -1
  373. package/packages/pi-tui/package.json +2 -2
  374. package/packages/rpc-client/package.json +2 -2
  375. package/pkg/dist/theme/theme.d.ts.map +1 -1
  376. package/pkg/dist/theme/theme.js +45 -17
  377. package/pkg/dist/theme/theme.js.map +1 -1
  378. package/pkg/package.json +1 -1
  379. package/src/resources/extensions/ask-user-questions.ts +7 -2
  380. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  383. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  384. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  385. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
  387. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  388. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  389. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  390. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  391. package/src/resources/extensions/gsd/auto/orchestrator.ts +140 -18
  392. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  393. package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
  394. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
  395. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  396. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  397. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  398. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  399. package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
  400. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
  402. package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
  404. package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
  405. package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
  406. package/src/resources/extensions/gsd/auto-start.ts +44 -7
  407. package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
  408. package/src/resources/extensions/gsd/auto.ts +118 -18
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
  410. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  411. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
  412. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
  413. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
  414. package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
  415. package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
  416. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
  417. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  418. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
  419. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  420. package/src/resources/extensions/gsd/config-overlay.ts +22 -9
  421. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  422. package/src/resources/extensions/gsd/db/queries.ts +29 -0
  423. package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
  424. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  425. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  426. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  427. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  428. package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
  429. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  430. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
  431. package/src/resources/extensions/gsd/gsd-db.ts +15 -19
  432. package/src/resources/extensions/gsd/guided-flow.ts +128 -2
  433. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  434. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  435. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  436. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  437. package/src/resources/extensions/gsd/notifications.ts +13 -6
  438. package/src/resources/extensions/gsd/preferences-models.ts +26 -8
  439. package/src/resources/extensions/gsd/preferences.ts +111 -5
  440. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  441. package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  442. package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
  443. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  448. package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
  449. package/src/resources/extensions/gsd/session-lock.ts +8 -7
  450. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  451. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
  452. package/src/resources/extensions/gsd/state.ts +7 -1
  453. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  456. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
  457. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  458. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  459. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
  460. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
  461. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
  462. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +97 -4
  464. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  465. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  466. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  467. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  468. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  469. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  470. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  471. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  472. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  474. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  475. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  476. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
  477. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  478. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  479. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  480. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
  481. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  482. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  483. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  484. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  485. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  486. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  487. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  488. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
  489. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
  490. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
  491. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
  492. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  493. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  494. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
  495. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  497. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  498. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  499. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  500. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  503. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  504. package/src/resources/extensions/gsd/tests/model-router.test.ts +139 -0
  505. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  506. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
  507. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  508. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
  509. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  510. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
  511. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  512. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
  513. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  514. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  515. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  516. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  517. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
  518. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
  519. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  520. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  521. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  522. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  523. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  524. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  525. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  526. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
  527. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
  528. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  529. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  530. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  531. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  532. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
  533. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  534. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  535. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  536. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  537. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  538. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  539. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  540. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  541. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  542. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  543. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  544. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  545. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  546. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  547. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +36 -0
  548. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  550. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  551. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  552. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  553. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  554. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  555. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  556. package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
  557. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  558. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  559. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  560. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/worktree-manager.ts +97 -2
  564. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  565. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  566. package/src/resources/extensions/gsd/worktree.ts +7 -1
  567. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  568. package/src/resources/extensions/search-the-web/index.ts +45 -9
  569. package/src/resources/extensions/search-the-web/native-search.ts +16 -4
  570. package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
  571. package/src/resources/extensions/subagent/index.ts +20 -15
  572. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  573. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  574. package/src/resources/skills/create-skill/SKILL.md +3 -0
  575. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  576. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  577. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  578. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
  579. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_ssgManifest.js +0 -0
@@ -0,0 +1,347 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Auto-loop finalize phase — post-unit verification and UAT pause.
3
+ import { clearCurrentPhase } from "../../shared/gsd-phase-state.js";
4
+ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
5
+ import { writeUnitRuntimeRecord } from "../unit-runtime.js";
6
+ import { buildManualValidationGuidance } from "../worktree-manager.js";
7
+ import { relSliceFile } from "../paths.js";
8
+ import { detectRootWriteLeak, formatRootWriteLeakMessage, } from "../root-write-leak-guard.js";
9
+ import { drainLogs, drainAndSummarize, formatForNotification, hasAnyIssues, } from "../workflow-logger.js";
10
+ import { debugLog } from "../debug-logger.js";
11
+ import { buildPhaseHandoffOutcome, setAutoOutcomeWidget } from "../auto-dashboard.js";
12
+ import { applyVerificationRetryPolicy, rememberRetryDispatch, isIsolatedWorktreeSession, } from "./phase-helpers.js";
13
+ import { _runMilestoneMergeOnceWithStashRestore } from "./closeout.js";
14
+ import { MAX_FINALIZE_TIMEOUTS } from "./types.js";
15
+ export async function failClosedOnFinalizeTimeout(ic, iterData, loopState, stage, startedAt) {
16
+ const { ctx, pi, s, deps } = ic;
17
+ const now = Date.now();
18
+ const unitType = iterData.unitType;
19
+ const unitId = iterData.unitId;
20
+ const timeoutMs = stage === "pre" ? FINALIZE_PRE_TIMEOUT_MS : FINALIZE_POST_TIMEOUT_MS;
21
+ const progressKind = stage === "pre" ? "finalize-pre-timeout" : "finalize-post-timeout";
22
+ writeUnitRuntimeRecord(s.basePath, unitType, unitId, startedAt, {
23
+ phase: "finalize-timeout",
24
+ timeoutAt: now,
25
+ lastProgressAt: now,
26
+ lastProgressKind: progressKind,
27
+ });
28
+ deps.emitJournalEvent({
29
+ ts: new Date(now).toISOString(),
30
+ flowId: ic.flowId,
31
+ seq: ic.nextSeq(),
32
+ eventType: "unit-end",
33
+ data: {
34
+ unitType,
35
+ unitId,
36
+ status: "timed-out-finalize",
37
+ artifactVerified: false,
38
+ finalizeStage: stage,
39
+ },
40
+ });
41
+ loopState.consecutiveFinalizeTimeouts++;
42
+ debugLog("autoLoop", {
43
+ phase: progressKind,
44
+ iteration: ic.iteration,
45
+ unitType,
46
+ unitId,
47
+ consecutiveTimeouts: loopState.consecutiveFinalizeTimeouts,
48
+ });
49
+ ctx.ui.notify(`${stage === "pre" ? "postUnitPreVerification" : "postUnitPostVerification"} timed out after ${timeoutMs / 1000}s for ${unitType} ${unitId} (${loopState.consecutiveFinalizeTimeouts}/${MAX_FINALIZE_TIMEOUTS}) — pausing auto-mode for recovery.`, "warning");
50
+ await deps.pauseAuto(ctx, pi);
51
+ s.clearCurrentUnit();
52
+ clearCurrentPhase();
53
+ drainLogs();
54
+ return { action: "break", reason: progressKind };
55
+ }
56
+ /**
57
+ * Phase 5: Post-unit finalize — pre/post verification, UAT pause, step-wizard.
58
+ * Returns break/continue/next to control the outer loop.
59
+ */
60
+ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
61
+ const { ctx, pi, s, deps } = ic;
62
+ const { pauseAfterUatDispatch } = iterData;
63
+ debugLog("autoLoop", { phase: "finalize", iteration: ic.iteration });
64
+ // Clear unit timeout (unit completed)
65
+ deps.clearUnitTimeout();
66
+ // Post-unit context for pre/post verification
67
+ const postUnitCtx = {
68
+ s,
69
+ ctx,
70
+ pi,
71
+ buildSnapshotOpts: deps.buildSnapshotOpts,
72
+ lockBase: deps.lockBase,
73
+ stopAuto: deps.stopAuto,
74
+ pauseAuto: deps.pauseAuto,
75
+ updateProgressWidget: deps.updateProgressWidget,
76
+ };
77
+ // Pre-verification processing (commit, doctor, state rebuild, etc.)
78
+ // Timeout guard: if postUnitPreVerification hangs (e.g., safety harness
79
+ // deadlock, browser teardown hang, worktree sync stall), force-continue
80
+ // after timeout so the auto-loop is not permanently frozen (#3757).
81
+ //
82
+ // On timeout, null out s.currentUnit so the timed-out task's late async
83
+ // mutations are harmless — postUnitPreVerification guards all side effects
84
+ // behind `if (s.currentUnit)`. The next iteration sets a fresh currentUnit.
85
+ // Sidecar items use lightweight pre-verification opts
86
+ const preVerificationOpts = sidecarItem
87
+ ? sidecarItem.kind === "hook"
88
+ ? { skipSettleDelay: true, skipWorktreeSync: true, agentEndMessages: s.lastUnitAgentEndMessages ?? undefined }
89
+ : { skipSettleDelay: true, agentEndMessages: s.lastUnitAgentEndMessages ?? undefined }
90
+ : { agentEndMessages: s.lastUnitAgentEndMessages ?? undefined };
91
+ const preUnitSnapshot = s.currentUnit
92
+ ? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
93
+ : null;
94
+ const clearFinalizingUnit = () => {
95
+ if (preUnitSnapshot &&
96
+ s.currentUnit?.type === preUnitSnapshot.type &&
97
+ s.currentUnit?.id === preUnitSnapshot.id &&
98
+ s.currentUnit?.startedAt === preUnitSnapshot.startedAt) {
99
+ s.clearCurrentUnit();
100
+ }
101
+ s.rootWriteBaseline = null;
102
+ };
103
+ clearCurrentPhase();
104
+ const preResultGuard = await withTimeout(deps.postUnitPreVerification(postUnitCtx, preVerificationOpts), FINALIZE_PRE_TIMEOUT_MS, "postUnitPreVerification");
105
+ if (preResultGuard.timedOut) {
106
+ return failClosedOnFinalizeTimeout(ic, iterData, loopState, "pre", preUnitSnapshot?.startedAt ?? Date.now());
107
+ }
108
+ const preResult = preResultGuard.value;
109
+ if (preResult === "dispatched") {
110
+ const dispatchedReason = s.lastGitActionFailure
111
+ ? "git-closeout-failure"
112
+ : "pre-verification-dispatched";
113
+ debugLog("autoLoop", {
114
+ phase: "exit",
115
+ reason: dispatchedReason,
116
+ gitError: s.lastGitActionFailure ?? undefined,
117
+ });
118
+ clearFinalizingUnit();
119
+ return { action: "break", reason: dispatchedReason };
120
+ }
121
+ if (preResult === "retry") {
122
+ if (sidecarItem) {
123
+ // Sidecar artifact retries are skipped — just continue
124
+ debugLog("autoLoop", { phase: "sidecar-artifact-retry-skipped", iteration: ic.iteration });
125
+ }
126
+ else {
127
+ // s.pendingVerificationRetry was set by postUnitPreVerification.
128
+ // Emit a dedicated journal event so forensics can distinguish bounded
129
+ // verification retries from genuine stuck-loop dispatch repetitions (#4540).
130
+ const retryInfo = s.pendingVerificationRetry;
131
+ deps.emitJournalEvent({
132
+ ts: new Date().toISOString(),
133
+ flowId: ic.flowId,
134
+ seq: ic.nextSeq(),
135
+ eventType: "artifact-verification-retry",
136
+ data: {
137
+ unitType: preUnitSnapshot?.type,
138
+ unitId: retryInfo?.unitId,
139
+ attempt: retryInfo?.attempt,
140
+ },
141
+ });
142
+ const retryPolicyResult = await applyVerificationRetryPolicy(ic, preUnitSnapshot?.type, "artifact-verification-retry");
143
+ if (retryPolicyResult) {
144
+ clearFinalizingUnit();
145
+ return retryPolicyResult;
146
+ }
147
+ // Continue the loop — next iteration will inject the retry context into the prompt.
148
+ rememberRetryDispatch(s, preUnitSnapshot, iterData);
149
+ debugLog("autoLoop", { phase: "artifact-verification-retry", iteration: ic.iteration });
150
+ clearFinalizingUnit();
151
+ return { action: "continue" };
152
+ }
153
+ }
154
+ if (pauseAfterUatDispatch) {
155
+ const pauseMid = iterData.mid;
156
+ const pauseSliceId = pauseMid && iterData.unitId.startsWith(`${pauseMid}/`)
157
+ ? iterData.unitId.slice(pauseMid.length + 1)
158
+ : undefined;
159
+ const guidance = pauseMid
160
+ ? buildManualValidationGuidance(s.basePath, pauseMid, {
161
+ uatPath: pauseSliceId
162
+ ? relSliceFile(s.basePath, pauseMid, pauseSliceId, "UAT")
163
+ : undefined,
164
+ })
165
+ : null;
166
+ const pauseMessage = guidance
167
+ ? `UAT requires human execution. Auto-mode will pause after this unit writes the result file.\n\n${guidance}`
168
+ : "UAT requires human execution. Auto-mode will pause after this unit writes the result file.";
169
+ ctx.ui.notify(pauseMessage, "info");
170
+ await deps.pauseAuto(ctx, pi);
171
+ debugLog("autoLoop", { phase: "exit", reason: "uat-pause" });
172
+ clearFinalizingUnit();
173
+ return { action: "break", reason: "uat-pause" };
174
+ }
175
+ // Verification gate
176
+ // Hook sidecar items skip verification entirely.
177
+ // Non-hook sidecar items run verification but skip retries (just continue).
178
+ const skipVerification = sidecarItem?.kind === "hook";
179
+ if (!skipVerification) {
180
+ const verificationResult = await deps.runPostUnitVerification({ s, ctx, pi }, deps.pauseAuto);
181
+ if (verificationResult === "pause") {
182
+ debugLog("autoLoop", { phase: "exit", reason: "verification-pause" });
183
+ clearFinalizingUnit();
184
+ return { action: "break", reason: "verification-pause" };
185
+ }
186
+ if (verificationResult === "retry") {
187
+ if (sidecarItem) {
188
+ // Sidecar verification retries are skipped — just continue
189
+ debugLog("autoLoop", { phase: "sidecar-verification-retry-skipped", iteration: ic.iteration });
190
+ }
191
+ else {
192
+ // s.pendingVerificationRetry was set by runPostUnitVerification.
193
+ const retryPolicyResult = await applyVerificationRetryPolicy(ic, iterData.unitType, "verification-retry");
194
+ if (retryPolicyResult) {
195
+ clearFinalizingUnit();
196
+ return retryPolicyResult;
197
+ }
198
+ // Continue the loop — next iteration will inject the retry context into the prompt.
199
+ rememberRetryDispatch(s, preUnitSnapshot, iterData);
200
+ debugLog("autoLoop", { phase: "verification-retry", iteration: ic.iteration });
201
+ clearFinalizingUnit();
202
+ return { action: "continue" };
203
+ }
204
+ }
205
+ }
206
+ // Post-verification processing (DB dual-write, hooks, triage, quick-tasks)
207
+ // Timeout guard: if postUnitPostVerification hangs (e.g., module import
208
+ // deadlock, SQLite transaction hang), force-continue after timeout so the
209
+ // auto-loop is not permanently frozen (#2344).
210
+ const postResultGuard = await withTimeout(deps.postUnitPostVerification(postUnitCtx), FINALIZE_POST_TIMEOUT_MS, "postUnitPostVerification");
211
+ if (postResultGuard.timedOut) {
212
+ return failClosedOnFinalizeTimeout(ic, iterData, loopState, "post", preUnitSnapshot?.startedAt ?? Date.now());
213
+ }
214
+ const postResult = postResultGuard.value;
215
+ if (postResult === "retry") {
216
+ if (sidecarItem) {
217
+ debugLog("autoLoop", { phase: "sidecar-pre-execution-retry-skipped", iteration: ic.iteration });
218
+ }
219
+ else {
220
+ const retryInfo = s.pendingVerificationRetry;
221
+ deps.emitJournalEvent({
222
+ ts: new Date().toISOString(),
223
+ flowId: ic.flowId,
224
+ seq: ic.nextSeq(),
225
+ eventType: "pre-execution-retry",
226
+ data: {
227
+ unitType: preUnitSnapshot?.type,
228
+ unitId: retryInfo?.unitId,
229
+ attempt: retryInfo?.attempt,
230
+ },
231
+ });
232
+ const retryPolicyResult = await applyVerificationRetryPolicy(ic, preUnitSnapshot?.type, "pre-execution-retry");
233
+ if (retryPolicyResult) {
234
+ clearFinalizingUnit();
235
+ return retryPolicyResult;
236
+ }
237
+ rememberRetryDispatch(s, preUnitSnapshot, iterData);
238
+ debugLog("autoLoop", {
239
+ phase: "pre-execution-retry",
240
+ iteration: ic.iteration,
241
+ unitType: preUnitSnapshot?.type,
242
+ unitId: retryInfo?.unitId,
243
+ attempt: retryInfo?.attempt,
244
+ });
245
+ clearFinalizingUnit();
246
+ return { action: "continue" };
247
+ }
248
+ }
249
+ if (postResult === "stopped") {
250
+ debugLog("autoLoop", {
251
+ phase: "exit",
252
+ reason: "post-verification-stopped",
253
+ });
254
+ clearFinalizingUnit();
255
+ return { action: "break", reason: "post-verification-stopped" };
256
+ }
257
+ if (postResult === "step-wizard") {
258
+ // Step mode — exit the loop (caller handles wizard)
259
+ debugLog("autoLoop", { phase: "exit", reason: "step-wizard" });
260
+ clearFinalizingUnit();
261
+ return { action: "break", reason: "step-wizard" };
262
+ }
263
+ if (preUnitSnapshot && isIsolatedWorktreeSession(s)) {
264
+ const leak = detectRootWriteLeak({
265
+ rootPath: s.originalBasePath,
266
+ worktreePath: s.basePath,
267
+ unitType: preUnitSnapshot.type,
268
+ unitId: preUnitSnapshot.id,
269
+ before: s.rootWriteBaseline,
270
+ });
271
+ s.rootWriteBaseline = null;
272
+ if (leak) {
273
+ const message = formatRootWriteLeakMessage(leak);
274
+ debugLog("autoLoop", {
275
+ phase: "root-write-leak",
276
+ unitType: preUnitSnapshot.type,
277
+ unitId: preUnitSnapshot.id,
278
+ rootPath: leak.rootPath,
279
+ worktreePath: leak.worktreePath,
280
+ files: leak.files.map((file) => ({ path: file.path, status: file.status })),
281
+ });
282
+ ctx.ui.notify(message, "error");
283
+ await deps.stopAuto(ctx, pi, "Root-write leak during isolated auto-mode", {
284
+ preserveCompletedMilestoneBranch: true,
285
+ });
286
+ clearFinalizingUnit();
287
+ return { action: "break", reason: "root-write-leak" };
288
+ }
289
+ }
290
+ else {
291
+ s.rootWriteBaseline = null;
292
+ }
293
+ if (preUnitSnapshot?.type === "complete-milestone" && s.currentMilestoneId) {
294
+ const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId, {
295
+ preserveCloseoutTranscript: true,
296
+ });
297
+ if (stop) {
298
+ clearFinalizingUnit();
299
+ return stop;
300
+ }
301
+ }
302
+ // Both pre and post verification completed without timeout — reset counter
303
+ loopState.consecutiveFinalizeTimeouts = 0;
304
+ if (preUnitSnapshot) {
305
+ writeUnitRuntimeRecord(s.basePath, preUnitSnapshot.type, preUnitSnapshot.id, preUnitSnapshot.startedAt, {
306
+ phase: "finalized",
307
+ lastProgressAt: Date.now(),
308
+ lastProgressKind: "finalize-success",
309
+ });
310
+ if (!preUnitSnapshot.type.startsWith("hook/") &&
311
+ preUnitSnapshot.type !== "custom-step" &&
312
+ preUnitSnapshot.type !== "complete-milestone") {
313
+ setAutoOutcomeWidget(ctx, {
314
+ ...buildPhaseHandoffOutcome({
315
+ unitType: preUnitSnapshot.type,
316
+ unitId: preUnitSnapshot.id,
317
+ agentEndMessages: s.lastUnitAgentEndMessages,
318
+ }),
319
+ startedAt: s.autoStartTime,
320
+ });
321
+ }
322
+ }
323
+ clearFinalizingUnit();
324
+ // Surface accumulated workflow-logger issues for this unit to the user.
325
+ // Warnings/errors logged during the unit are buffered in the logger and
326
+ // drained here so the user sees a single consolidated post-unit alert.
327
+ if (hasAnyIssues()) {
328
+ const { logs } = drainAndSummarize();
329
+ if (logs.length > 0) {
330
+ const severity = logs.some((e) => e.severity === "error") ? "error" : "warning";
331
+ ctx.ui.notify(formatForNotification(logs), severity);
332
+ }
333
+ }
334
+ if (preUnitSnapshot?.type === "complete-milestone" && s.currentMilestoneId) {
335
+ // cleanupAfterLoopExit skips gsd-progress when preserveCompletionSurface is true, so clear stale controls here.
336
+ ctx.ui.setStatus?.("gsd-step", undefined);
337
+ ctx.ui.setWidget?.("gsd-progress", undefined);
338
+ await deps.stopAuto(ctx, pi, `Milestone ${s.currentMilestoneId} complete`, {
339
+ completionWidget: {
340
+ milestoneId: s.currentMilestoneId,
341
+ milestoneTitle: iterData.midTitle,
342
+ },
343
+ });
344
+ return { action: "break", reason: "milestone-complete" };
345
+ }
346
+ return { action: "next", data: undefined };
347
+ }
@@ -13,7 +13,9 @@ import { mkdirSync, writeFileSync } from "node:fs";
13
13
  import { join } from "node:path";
14
14
  import { MAX_LOOP_ITERATIONS, } from "./types.js";
15
15
  import { _clearCurrentResolve } from "./resolve.js";
16
- import { runGuards, runFinalize } from "./phases.js";
16
+ import { runGuards } from "./phases.js";
17
+ import { runFinalize } from "./finalize.js";
18
+ import { resetSessionTimeoutState } from "./unit-phase.js";
17
19
  import { STUCK_WINDOW_SIZE } from "./dispatch-history.js";
18
20
  import { debugLog } from "../debug-logger.js";
19
21
  import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterMs, COOLDOWN_FALLBACK_WAIT_MS, MAX_COOLDOWN_RETRIES } from "./infra-errors.js";
@@ -274,6 +276,7 @@ function closeOutCrashedUnit(s, iterData, err) {
274
276
  */
275
277
  export async function autoLoop(ctx, pi, s, deps, options) {
276
278
  debugLog("autoLoop", { phase: "enter" });
279
+ resetSessionTimeoutState();
277
280
  let iteration = 0;
278
281
  const dispatchContract = options?.dispatchContract ?? "legacy-direct";
279
282
  const unitDispatchDeps = createExecutionGraphUnitDispatchDeps();
@@ -0,0 +1,56 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Recover missing milestone lease state for resumed isolated workers.
3
+ import { debugLog } from "../debug-logger.js";
4
+ import { claimMilestoneLease } from "../db/milestone-leases.js";
5
+ export function hasHeldMilestoneLease(session, milestoneId) {
6
+ return (Boolean(milestoneId) &&
7
+ session.currentMilestoneId === milestoneId &&
8
+ typeof session.milestoneLeaseToken === "number");
9
+ }
10
+ export function reclaimMissingMilestoneLease(session, milestoneId, isolationMode, phase) {
11
+ if (isolationMode === "none")
12
+ return;
13
+ if (!session.workerId || !milestoneId)
14
+ return;
15
+ if (hasHeldMilestoneLease(session, milestoneId))
16
+ return;
17
+ // Note: we intentionally do NOT bail just because the session already holds a
18
+ // lease for a *different* milestone. When dispatch advances to a new
19
+ // milestone the session's stale `currentMilestoneId`/token are for the prior
20
+ // one, and the active milestone's lease must still be claimed — otherwise
21
+ // worktree safety sees `held: false` and fails dispatch (#760). Claiming is
22
+ // safe: claimMilestoneLease refuses to steal a lease another worker holds.
23
+ try {
24
+ const claim = claimMilestoneLease(session.workerId, milestoneId);
25
+ if (claim.ok) {
26
+ session.currentMilestoneId = milestoneId;
27
+ session.milestoneLeaseToken = claim.token;
28
+ debugLog("worktreeSafety", {
29
+ phase: "lease-reclaimed",
30
+ source: phase,
31
+ milestoneId,
32
+ workerId: session.workerId,
33
+ token: claim.token,
34
+ });
35
+ }
36
+ else {
37
+ debugLog("worktreeSafety", {
38
+ phase: "lease-reclaim-blocked",
39
+ source: phase,
40
+ milestoneId,
41
+ workerId: session.workerId,
42
+ holderWorkerId: claim.byWorker,
43
+ expiresAt: claim.expiresAt,
44
+ });
45
+ }
46
+ }
47
+ catch (err) {
48
+ debugLog("worktreeSafety", {
49
+ phase: "lease-reclaim-failed",
50
+ source: phase,
51
+ milestoneId,
52
+ workerId: session.workerId,
53
+ error: err instanceof Error ? err.message : String(err),
54
+ });
55
+ }
56
+ }
@@ -25,7 +25,7 @@ import { checkResourcesStale, autoWorktreeBranch, mergeMilestoneToMain } from ".
25
25
  import { getSessionLockStatus } from "../session-lock.js";
26
26
  import { resolveUokFlags } from "../uok/flags.js";
27
27
  import { emitJournalEvent as _emitJournalEvent } from "../journal.js";
28
- import { loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode } from "../preferences.js";
28
+ import { loadEffectiveGSDPreferences, loadEffectiveGSDPreferencesWithRegistry, getIsolationMode, resolveEffectiveUnitIsolationMode, resolveProfileAnchorProvider } from "../preferences.js";
29
29
  import { detectWorktreeName, getMainBranch, resolveProjectRoot, resolveWorktreeProjectRoot, } from "../worktree.js";
30
30
  import { getPriorSliceCompletionBlocker } from "../dispatch-guard.js";
31
31
  import { GitServiceImpl } from "../git-service.js";
@@ -47,9 +47,20 @@ import { buildDispatchKey, createDispatchHistory, STUCK_WINDOW_SIZE, } from "./d
47
47
  import { existsSync, readFileSync } from "node:fs";
48
48
  import { join } from "node:path";
49
49
  import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
50
+ import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
50
51
  function now() {
51
52
  return Date.now();
52
53
  }
54
+ /**
55
+ * Optional override for the post-settlement markdown projection rebuild
56
+ * (mergePendingCompleteMilestone). Production leaves this null so the real
57
+ * rebuild runs; tests inject a throwing function to deterministically exercise
58
+ * the best-effort failure path (orchestrator.ts:637), which is otherwise only
59
+ * reachable by driving advance() through a full merge-pending milestone
60
+ * settlement and then contriving a projection-rebuild fault.
61
+ * @internal
62
+ */
63
+ let _projectionRebuildFn = null;
53
64
  function noRemainingUnitsOutcome(stateSnapshot) {
54
65
  if (stateSnapshot.phase === "complete") {
55
66
  return {
@@ -113,7 +124,7 @@ export async function decideOrchestratorDispatch(ctx, pi, dispatchBasePath, sess
113
124
  const active = state.activeMilestone;
114
125
  const activeSession = input.session ?? session;
115
126
  const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
116
- const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
127
+ const prefs = loadEffectiveGSDPreferencesWithRegistry(ctx.modelRegistry, activeDispatchBasePath, resolveProfileAnchorProvider(ctx.model?.provider, session?.autoModeStartModel?.provider))?.preferences;
117
128
  if (!active) {
118
129
  if (state.phase !== "pre-planning")
119
130
  return null;
@@ -127,6 +138,7 @@ export async function decideOrchestratorDispatch(ctx, pi, dispatchBasePath, sess
127
138
  }
128
139
  if (active && activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
129
140
  activeSession.currentMilestoneId = active.id;
141
+ activeSession.milestoneLeaseToken = null;
130
142
  }
131
143
  const dispatchMid = active?.id ?? activeSession?.currentMilestoneId ?? "";
132
144
  const dispatchMidTitle = active?.title ?? "";
@@ -384,7 +396,7 @@ export class AutoOrchestrator {
384
396
  // ── UokGateAdapter (folded) ──────────────────────────────────────────────
385
397
  async emitUokGate(input) {
386
398
  const activeBasePath = this.getLiveDispatchBasePath();
387
- const prefs = loadEffectiveGSDPreferences(activeBasePath)?.preferences;
399
+ const prefs = loadEffectiveGSDPreferencesWithRegistry(this.ctx.modelRegistry, activeBasePath, resolveProfileAnchorProvider(this.ctx.model?.provider, this.s.autoModeStartModel?.provider))?.preferences;
388
400
  const uokFlags = resolveUokFlags(prefs);
389
401
  if (!uokFlags.gates)
390
402
  return;
@@ -476,6 +488,37 @@ export class AutoOrchestrator {
476
488
  },
477
489
  };
478
490
  }
491
+ async mergePendingCompleteMilestone(milestoneId) {
492
+ const result = this.buildLifecycle().exitMilestone(milestoneId, { merge: true }, this.ctx.ui);
493
+ if (!result.ok) {
494
+ const detail = result.cause instanceof Error
495
+ ? result.cause.message
496
+ : result.reason;
497
+ return {
498
+ ok: false,
499
+ reason: `Milestone ${milestoneId} is complete, but the system-owned merge failed: ${detail}`,
500
+ };
501
+ }
502
+ this.s.milestoneMergedInPhases = true;
503
+ this.s.milestoneSettlement = { ok: true, reason: "settled" };
504
+ try {
505
+ const projectRoot = this.s.originalBasePath || this.s.canonicalProjectRoot || this.runtimeBasePath;
506
+ // Test seam: when _projectionRebuildFn is injected, route the rebuild
507
+ // through it so the best-effort failure path (:637) is deterministically
508
+ // reachable. Production leaves it null → real rebuildMarkdownProjectionsFromDb.
509
+ if (_projectionRebuildFn) {
510
+ await _projectionRebuildFn(projectRoot);
511
+ }
512
+ else {
513
+ const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
514
+ await rebuildMarkdownProjectionsFromDb(projectRoot);
515
+ }
516
+ }
517
+ catch (err) {
518
+ logWarning("engine", `markdown projection rebuild after settlement merge failed: ${err instanceof Error ? err.message : String(err)}`);
519
+ }
520
+ return { ok: true };
521
+ }
479
522
  clearPendingDispatch() {
480
523
  this.s.pendingOrchestrationDispatch = null;
481
524
  }
@@ -536,9 +579,6 @@ export class AutoOrchestrator {
536
579
  reason: `No Unit manifest is registered for ${unitType}`,
537
580
  };
538
581
  }
539
- if (isolationMode !== "worktree") {
540
- return { ok: true, reason: "not-required" };
541
- }
542
582
  const writeScope = manifest.tools.mode === "all" || manifest.tools.mode === "docs"
543
583
  ? "source-writing"
544
584
  : "planning-only";
@@ -546,7 +586,21 @@ export class AutoOrchestrator {
546
586
  const activeBasePath = this.getLiveDispatchBasePath();
547
587
  const snapshot = await deriveState(activeBasePath);
548
588
  const milestoneId = snapshot.activeMilestone?.id ?? null;
549
- const expectedBranch = milestoneId ? autoWorktreeBranch(milestoneId) : null;
589
+ const buildExpectedBranch = (mode) => mode !== "none" && milestoneId ? autoWorktreeBranch(milestoneId) : null;
590
+ // The milestone lease coordinates concurrent workers on an isolated
591
+ // milestone worktree/branch. `none` mode has no per-milestone isolation
592
+ // and does not reliably claim a lease, so requiring one there would
593
+ // falsely fail dispatch; enforce it only in isolated modes.
594
+ const buildLease = (mode) => milestoneId && this.s.workerId
595
+ ? {
596
+ required: writeScope === "source-writing" && mode !== "none",
597
+ held: hasHeldMilestoneLease(this.s, milestoneId),
598
+ owner: this.s.workerId,
599
+ }
600
+ : undefined;
601
+ if (writeScope === "source-writing") {
602
+ reclaimMissingMilestoneLease(this.s, milestoneId, isolationMode, "orchestrator");
603
+ }
550
604
  let result = safety.validateUnitRoot({
551
605
  unitType,
552
606
  unitId,
@@ -555,7 +609,8 @@ export class AutoOrchestrator {
555
609
  unitRoot: activeBasePath,
556
610
  milestoneId,
557
611
  isolationMode,
558
- expectedBranch,
612
+ expectedBranch: buildExpectedBranch(isolationMode),
613
+ lease: buildLease(isolationMode),
559
614
  });
560
615
  if (!result.ok) {
561
616
  const repaired = await repairAutoWorktreeSafetyFailure({
@@ -573,16 +628,20 @@ export class AutoOrchestrator {
573
628
  this.rebuildScope(this.s.basePath, this.s.currentMilestoneId);
574
629
  return { ok: true };
575
630
  },
576
- revalidate: () => safety.validateUnitRoot({
577
- unitType,
578
- unitId,
579
- writeScope,
580
- projectRoot: this.runtimeBasePath,
581
- unitRoot: this.getLiveDispatchBasePath(),
582
- milestoneId,
583
- isolationMode: this.getEffectiveUnitIsolationMode(this.runtimeBasePath),
584
- expectedBranch,
585
- }),
631
+ revalidate: () => {
632
+ const revalidatedMode = this.getEffectiveUnitIsolationMode(this.runtimeBasePath);
633
+ return safety.validateUnitRoot({
634
+ unitType,
635
+ unitId,
636
+ writeScope,
637
+ projectRoot: this.runtimeBasePath,
638
+ unitRoot: this.getLiveDispatchBasePath(),
639
+ milestoneId,
640
+ isolationMode: revalidatedMode,
641
+ expectedBranch: buildExpectedBranch(revalidatedMode),
642
+ lease: buildLease(revalidatedMode),
643
+ });
644
+ },
586
645
  });
587
646
  result = repaired.result;
588
647
  if (result.ok) {
@@ -775,6 +834,35 @@ export class AutoOrchestrator {
775
834
  if (!decision) {
776
835
  const settlementBlock = this.evaluateNoRemainingUnitsSettlement(reconciliation.stateSnapshot);
777
836
  if (settlementBlock) {
837
+ const settlement = this.s.milestoneSettlement;
838
+ if (settlement && !settlement.ok && settlement.reason === "merge-pending") {
839
+ const merged = await this.mergePendingCompleteMilestone(settlement.milestoneId);
840
+ if (merged.ok) {
841
+ const terminalOutcome = noRemainingUnitsOutcome(reconciliation.stateSnapshot);
842
+ const stopped = {
843
+ kind: "stopped",
844
+ reason: terminalOutcome.displayReason,
845
+ stateSnapshot: reconciliation.stateSnapshot,
846
+ terminalOutcome,
847
+ };
848
+ this.status.phase = "stopped";
849
+ this.status.activeUnit = undefined;
850
+ this.lastAdvanceKey = null;
851
+ this.dispatchHistory.clearOnRecovery();
852
+ this.bumpTransition();
853
+ this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
854
+ this.postAdvanceRecord(stopped);
855
+ return stopped;
856
+ }
857
+ settlementBlock.reason = merged.reason;
858
+ settlementBlock.terminalOutcome = {
859
+ code: "settlement-blocked",
860
+ displayReason: merged.reason,
861
+ nextAction: `Fix the merge failure, then retry \`/gsd dispatch complete-milestone ${settlement.milestoneId}\`.`,
862
+ milestoneId: settlement.milestoneId,
863
+ allMilestonesComplete: false,
864
+ };
865
+ }
778
866
  this.status.phase = "paused";
779
867
  this.status.activeUnit = undefined;
780
868
  this.lastAdvanceKey = null;
@@ -1155,3 +1243,16 @@ export function resolveLiveOrchestratorBasePath(input) {
1155
1243
  export function createAutoOrchestrator(context) {
1156
1244
  return new AutoOrchestrator(context);
1157
1245
  }
1246
+ /**
1247
+ * Inject an override for the post-settlement markdown projection rebuild,
1248
+ * returning a function that restores the default (real rebuild) behavior. Used
1249
+ * by tests to deterministically exercise the best-effort rebuild-failure path
1250
+ * (orchestrator.ts:637) — otherwise only reachable by driving advance() through
1251
+ * a full merge-pending milestone settlement and then contriving a projection
1252
+ * fault. No production caller.
1253
+ * @internal
1254
+ */
1255
+ export function _setProjectionRebuildFnForTests(fn) {
1256
+ _projectionRebuildFn = fn;
1257
+ return () => { _projectionRebuildFn = null; };
1258
+ }