@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
@@ -33,14 +33,27 @@ import { pauseAuto } from "./auto.js";
33
33
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
34
34
  import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
35
35
 
36
+ export function parseDirectDispatchPhase(raw: string): { phase: string; milestoneId?: string } {
37
+ const tokens = raw.trim().split(/\s+/).filter(Boolean);
38
+ if (tokens.length === 0) return { phase: "" };
39
+ const phase = tokens[0].toLowerCase();
40
+ const milestoneToken = tokens.find((token, index) => index > 0 && /^M\d/i.test(token));
41
+ return {
42
+ phase,
43
+ milestoneId: milestoneToken?.replace(/[.,;:!?]+$/, ""),
44
+ };
45
+ }
46
+
36
47
  export async function dispatchDirectPhase(
37
48
  ctx: ExtensionCommandContext,
38
49
  pi: ExtensionAPI,
39
50
  phase: string,
40
51
  base: string,
52
+ opts: { milestoneId?: string } = {},
41
53
  ): Promise<void> {
54
+ const parsed = parseDirectDispatchPhase(phase);
42
55
  const state = await deriveState(base);
43
- const mid = state.activeMilestone?.id;
56
+ const mid = opts.milestoneId ?? parsed.milestoneId ?? state.activeMilestone?.id;
44
57
  const midTitle = state.activeMilestone?.title ?? "";
45
58
 
46
59
  if (!mid) {
@@ -56,7 +69,7 @@ export async function dispatchDirectPhase(
56
69
  // though the milestone's actual code lives in the worktree.
57
70
  const dispatchBase = resolveCanonicalMilestoneRoot(base, mid);
58
71
 
59
- const normalized = phase.toLowerCase();
72
+ const normalized = parsed.phase;
60
73
  let unitType: string;
61
74
  let unitId: string;
62
75
  let prompt: string;
@@ -12,7 +12,7 @@
12
12
  * without modifying orchestration code.
13
13
  */
14
14
 
15
- import type { GSDState } from "./types.js";
15
+ import type { GSDState, TaskIO } from "./types.js";
16
16
  import type { GSDPreferences } from "./preferences.js";
17
17
  import type { MinimalModelRegistry } from "./context-budget.js";
18
18
  import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
@@ -179,6 +179,26 @@ type ResearchProjectPromptBuilder = typeof buildResearchProjectPrompt;
179
179
  let reassessmentChecker: ReassessmentChecker = checkNeedsReassessment;
180
180
  let researchProjectPromptBuilder: ResearchProjectPromptBuilder = buildResearchProjectPrompt;
181
181
 
182
+ /**
183
+ * Optional override for the reactive graph derivation step inside the
184
+ * "executing → reactive-execute" rule. Production leaves this null so the rule
185
+ * uses the real loadSliceTaskIO + deriveTaskGraph; tests inject a throwing
186
+ * function to deterministically exercise the best-effort failure path
187
+ * (auto-dispatch.ts:1494). The catch is otherwise unreachable because every
188
+ * operation it wraps (loadSliceTaskIO, deriveTaskGraph, saveReactiveState) is
189
+ * internally defensive.
190
+ * @internal
191
+ */
192
+ let _reactiveGraphDeriveFn: ((basePath: string, mid: string, sid: string) => Promise<TaskIO[]>) | null = null;
193
+
194
+ export function setReactiveGraphDeriveFnForTest(
195
+ fn: ((basePath: string, mid: string, sid: string) => Promise<TaskIO[]>) | null,
196
+ ): () => void {
197
+ const previous = _reactiveGraphDeriveFn;
198
+ _reactiveGraphDeriveFn = fn;
199
+ return () => { _reactiveGraphDeriveFn = previous; };
200
+ }
201
+
182
202
  function shouldBypassMilestoneDepthGateInAuto(prefs: GSDPreferences | undefined): boolean {
183
203
  return isAutoActive() && prefs?.planning_depth !== "deep";
184
204
  }
@@ -1421,7 +1441,9 @@ export const DISPATCH_RULES: DispatchRule[] = [
1421
1441
  graphMetrics,
1422
1442
  } = await import("./reactive-graph.js");
1423
1443
 
1424
- const taskIO = await loadSliceTaskIO(basePath, mid, sid);
1444
+ const taskIO = _reactiveGraphDeriveFn
1445
+ ? await _reactiveGraphDeriveFn(basePath, mid, sid)
1446
+ : await loadSliceTaskIO(basePath, mid, sid);
1425
1447
  if (taskIO.length < 2) return null; // single task, no point
1426
1448
 
1427
1449
  const graph = deriveTaskGraph(taskIO);
@@ -17,6 +17,7 @@ import { unitPhaseLabel } from "./auto-dashboard.js";
17
17
  import { getSessionModelOverride } from "./session-model-override.js";
18
18
  import { logWarning } from "./workflow-logger.js";
19
19
  import { resolveUokFlags } from "./uok/flags.js";
20
+ import { modelIdsForProfileResolution, resolveProfileAnchorProvider, resolveDisabledModelProvidersFromPreferences } from "./preferences.js";
20
21
  import { applyModelPolicyFilter } from "./uok/model-policy.js";
21
22
  import { isModelBlocked, isModelTemporarilyUnavailable } from "./blocked-models.js";
22
23
  import { getRequiredWorkflowToolsForAutoUnit, isWorkflowMcpSurfaceTool } from "./workflow-mcp.js";
@@ -404,8 +405,10 @@ export function resolvePreferredModelConfig(
404
405
  unitType: string,
405
406
  autoModeStartModel: { provider: string; id: string; flatRateCtx?: FlatRateContext } | null,
406
407
  isAutoMode = true,
408
+ basePath?: string,
409
+ availableModelIds?: string[],
407
410
  ): PreferredModelConfig | undefined {
408
- const explicitConfig = resolveModelWithFallbacksForUnit(unitType);
411
+ const explicitConfig = resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds);
409
412
  if (explicitConfig) {
410
413
  return {
411
414
  ...explicitConfig,
@@ -475,8 +478,14 @@ export async function selectAndApplyModel(
475
478
  // With no explicit level, fall back to the auto-start session level and raise
476
479
  // the code-writing floor — preserving prior behavior exactly. Recomputed per
477
480
  // dispatch so neither the floor nor a phase override leaks to other units.
481
+ const anchorProvider = resolveProfileAnchorProvider(ctx.model?.provider, autoModeStartModel?.provider);
482
+ const profileResolutionIds = modelIdsForProfileResolution(
483
+ ctx.modelRegistry,
484
+ anchorProvider,
485
+ resolveDisabledModelProvidersFromPreferences(),
486
+ );
478
487
  const explicitThinkingLevel =
479
- resolveThinkingLevelForUnit(unitType) as ReturnType<ExtensionAPI["getThinkingLevel"]> | undefined;
488
+ resolveThinkingLevelForUnit(unitType, basePath, profileResolutionIds) as ReturnType<ExtensionAPI["getThinkingLevel"]> | undefined;
480
489
  const desiredThinkingLevel = explicitThinkingLevel
481
490
  ?? floorThinkingLevelForUnit(unitType, autoModeStartThinkingLevel);
482
491
  if (explicitThinkingLevel) {
@@ -520,7 +529,13 @@ export async function selectAndApplyModel(
520
529
  }
521
530
  const modelConfig = effectiveSessionModelOverride
522
531
  ? undefined
523
- : resolvePreferredModelConfig(unitType, autoModeStartModel, isAutoMode);
532
+ : resolvePreferredModelConfig(
533
+ unitType,
534
+ autoModeStartModel,
535
+ isAutoMode,
536
+ basePath,
537
+ profileResolutionIds,
538
+ );
524
539
  let routing: { tier: string; modelDowngraded: boolean } | null = null;
525
540
  let appliedModel: Model<Api> | null = null;
526
541
 
@@ -1068,16 +1083,16 @@ export function resolveModelId<T extends { id: string; provider: string }>(
1068
1083
  *
1069
1084
  * Order rationale:
1070
1085
  * - openai-codex before github-copilot: ChatGPT-native for shared GPT IDs
1071
- * - google-gemini-cli before github-copilot: first-party Gemini CLI
1086
+ * - google-antigravity before google-gemini-cli: Antigravity replaced Gemini CLI for individuals
1072
1087
  * - anthropic before github-copilot: first-party Claude API/OAuth over Copilot
1073
1088
  * - github-copilot before openai/google: Copilot OAuth over platform API keys
1074
1089
  */
1075
1090
  export const BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE = [
1076
1091
  "openai-codex",
1092
+ "google-antigravity",
1077
1093
  "google-gemini-cli",
1078
1094
  "anthropic",
1079
1095
  "github-copilot",
1080
- "google-antigravity",
1081
1096
  ] as const;
1082
1097
 
1083
1098
  /**
@@ -2100,9 +2100,6 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
2100
2100
  return "dispatched";
2101
2101
  }
2102
2102
  if (getUnitCostSpikeAction(unitCostUsd, rollingAvgUsd, resolveUnitCostSpikeMultiplier(prefs)) === "pause") {
2103
- s.pendingVerificationRetry = null;
2104
- s.verificationRetryCount.delete(retryKey);
2105
- s.verificationRetryFailureHashes.delete(retryKey);
2106
2103
  const advancedPastUnit = await hasArtifactCostGuardAdvancedPastUnit(
2107
2104
  s,
2108
2105
  ctx,
@@ -2111,6 +2108,9 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
2111
2108
  prefs,
2112
2109
  );
2113
2110
  if (advancedPastUnit) {
2111
+ s.pendingVerificationRetry = null;
2112
+ s.verificationRetryCount.delete(retryKey);
2113
+ s.verificationRetryFailureHashes.delete(retryKey);
2114
2114
  debugLog("postUnit", {
2115
2115
  phase: "artifact-cost-spike-continue-after-advance",
2116
2116
  unitType: s.currentUnit.type,
@@ -2131,14 +2131,21 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
2131
2131
  unitCostUsd,
2132
2132
  rollingAvgUsd,
2133
2133
  );
2134
+ if (parallelBlocker) {
2135
+ s.pendingVerificationRetry = null;
2136
+ s.verificationRetryCount.delete(retryKey);
2137
+ s.verificationRetryFailureHashes.delete(retryKey);
2138
+ ctx.ui.notify(
2139
+ `Unit ${s.currentUnit.id} cost spike detected (${unitCostUsd.toFixed(2)} vs avg ${rollingAvgUsd.toFixed(2)}) — wrote parallel blocker and pausing auto-mode.`,
2140
+ "error",
2141
+ );
2142
+ await pauseAuto(ctx, pi);
2143
+ return "dispatched";
2144
+ }
2134
2145
  ctx.ui.notify(
2135
- parallelBlocker
2136
- ? `Unit ${s.currentUnit.id} cost spike detected (${unitCostUsd.toFixed(2)} vs avg ${rollingAvgUsd.toFixed(2)}) — wrote parallel blocker and pausing auto-mode.`
2137
- : `Unit ${s.currentUnit.id} cost spike detected (${unitCostUsd.toFixed(2)} vs avg ${rollingAvgUsd.toFixed(2)}) — pausing auto-mode.`,
2138
- "error",
2146
+ `Unit ${s.currentUnit.id} cost spike detected (${unitCostUsd.toFixed(2)} vs avg ${rollingAvgUsd.toFixed(2)}) during artifact verification retry; keeping verification failure as the authoritative blocker.`,
2147
+ "warning",
2139
2148
  );
2140
- await pauseAuto(ctx, pi);
2141
- return "dispatched";
2142
2149
  }
2143
2150
  const attempt = (s.verificationRetryCount.get(retryKey) ?? 0) + 1;
2144
2151
  const failureDetails = describeArtifactVerificationFailure(
@@ -3891,7 +3891,11 @@ export async function buildReactiveExecutePrompt(
3891
3891
  const taskPrompt = [
3892
3892
  `## UNIT: Execute Task ${tid} ("${tTitle}")`,
3893
3893
  "",
3894
- "Work only in the repository root.",
3894
+ "## Working Directory",
3895
+ "",
3896
+ `Your working directory is \`${base}\`. All file reads, writes, and shell commands MUST operate relative to this directory. Do NOT \`cd\` to any other directory.`,
3897
+ `If any inlined plan names an absolute path outside \`${base}\`, treat it as stale — use the equivalent path under \`${base}\` before reading, writing, or executing.`,
3898
+ "",
3895
3899
  "Implement from the inlined task plan below. Verify changes, then call `gsd_task_complete`.",
3896
3900
  "Do not run git commands.",
3897
3901
  "",
@@ -83,6 +83,53 @@ export {
83
83
  } from "./milestone-summary-classifier.js";
84
84
  export { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
85
85
 
86
+ /**
87
+ * Optional override for the legacy roadmap parser used by verifyExpectedArtifact.
88
+ * Production leaves this null so the real parseLegacyRoadmap runs; tests inject
89
+ * a throwing function to deterministically exercise the parse-failure catches
90
+ * (auto-recovery.ts:515 plan-milestone and :622 complete-slice). Those catches
91
+ * are otherwise unreachable because parseLegacyRoadmap is internally defensive
92
+ * against every malformed input.
93
+ * @internal
94
+ */
95
+ let _roadmapParserFn: ((content: string) => { slices: Array<{ id: string; done: boolean; depends?: string[] }> }) | null = null;
96
+
97
+ /**
98
+ * Inject an override for the legacy roadmap parser, returning a function that
99
+ * restores the default (real parser) behavior. No production caller.
100
+ * @internal
101
+ */
102
+ export function _setRoadmapParserFnForTests(
103
+ fn: ((content: string) => { slices: Array<{ id: string; done: boolean; depends?: string[] }> }) | null,
104
+ ): () => void {
105
+ const previous = _roadmapParserFn;
106
+ _roadmapParserFn = fn;
107
+ return () => { _roadmapParserFn = previous; };
108
+ }
109
+
110
+ function parseRoadmapForRecovery(content: string): ReturnType<NonNullable<typeof _roadmapParserFn>> {
111
+ if (_roadmapParserFn) return _roadmapParserFn(content);
112
+ return parseLegacyRoadmap(content) as unknown as ReturnType<NonNullable<typeof _roadmapParserFn>>;
113
+ }
114
+
115
+ /**
116
+ * Optional override for the detached GitHub milestone finalize invoked after DB
117
+ * closeout in refreshRecoveryDbForArtifact. Production leaves this null so the
118
+ * real finalizeMilestoneGitHubSync runs; tests inject a throwing function to
119
+ * deterministically exercise the best-effort catch (auto-recovery.ts:232),
120
+ * which otherwise needs a real GitHub remote + network failure.
121
+ * @internal
122
+ */
123
+ let _githubFinalizeFn: ((basePath: string, mid: string) => void | Promise<void>) | null = null;
124
+
125
+ export function _setGithubFinalizeFnForTests(
126
+ fn: ((basePath: string, mid: string) => void | Promise<void>) | null,
127
+ ): () => void {
128
+ const previous = _githubFinalizeFn;
129
+ _githubFinalizeFn = fn;
130
+ return () => { _githubFinalizeFn = previous; };
131
+ }
132
+
86
133
  // ─── Artifact Resolution & Verification ───────────────────────────────────────
87
134
 
88
135
  export function diagnoseWorktreeIntegrityFailure(basePath: string): string | null {
@@ -197,11 +244,18 @@ export function refreshRecoveryDbForArtifact(
197
244
  }
198
245
 
199
246
  updateMilestoneStatus(mid, "complete", new Date().toISOString());
200
- void import("../github-sync/sync.js")
201
- .then(({ finalizeMilestoneGitHubSync }) => finalizeMilestoneGitHubSync(basePath, mid))
202
- .catch((err) => {
203
- logWarning("recovery", `GitHub milestone finalize failed after DB closeout: ${getErrorMessage(err)}`);
204
- });
247
+ // Detached GitHub sync — best-effort. Test seam: when
248
+ // _githubFinalizeFn is injected, route through it so the catch
249
+ // (:232) is deterministically reachable (otherwise it needs a real
250
+ // GitHub remote + network failure). Production leaves it null. The
251
+ // seam is wrapped so a synchronous throw becomes a rejected promise,
252
+ // matching the real import-then-call deferred semantics.
253
+ const finalizePromise = _githubFinalizeFn
254
+ ? new Promise<void>((resolve) => { resolve(_githubFinalizeFn!(basePath, mid)); })
255
+ : import("../github-sync/sync.js").then(({ finalizeMilestoneGitHubSync }) => finalizeMilestoneGitHubSync(basePath, mid));
256
+ void finalizePromise.catch((err) => {
257
+ logWarning("recovery", `GitHub milestone finalize failed after DB closeout: ${getErrorMessage(err)}`);
258
+ });
205
259
  return { ok: true };
206
260
  }
207
261
 
@@ -446,7 +500,7 @@ export function verifyExpectedArtifact(
446
500
  return false;
447
501
  }
448
502
  try {
449
- const roadmap = parseLegacyRoadmap(readFileSync(roadmapFile, "utf-8"));
503
+ const roadmap = parseRoadmapForRecovery(readFileSync(roadmapFile, "utf-8"));
450
504
  const milestoneResearchFile = resolveExpectedArtifactPath("research-milestone", mid, base);
451
505
  const hasMilestoneResearch = !!milestoneResearchFile && existsSync(milestoneResearchFile);
452
506
  for (const slice of roadmap.slices) {
@@ -506,7 +560,7 @@ export function verifyExpectedArtifact(
506
560
 
507
561
  if (unitType === "plan-milestone") {
508
562
  try {
509
- const roadmap = parseLegacyRoadmap(readFileSync(absPath, "utf-8"));
563
+ const roadmap = parseRoadmapForRecovery(readFileSync(absPath, "utf-8"));
510
564
  if (roadmap.slices.length === 0) {
511
565
  logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${absPath}`);
512
566
  return false;
@@ -615,7 +669,7 @@ export function verifyExpectedArtifact(
615
669
  if (roadmapFile && existsSync(roadmapFile)) {
616
670
  try {
617
671
  const roadmapContent = readFileSync(roadmapFile, "utf-8");
618
- const roadmap = parseLegacyRoadmap(roadmapContent);
672
+ const roadmap = parseRoadmapForRecovery(roadmapContent);
619
673
  const slice = roadmap.slices.find((s) => s.id === sid);
620
674
  if (slice && !slice.done) return false;
621
675
  } catch (e) {
@@ -21,6 +21,10 @@ import { loadFile, getManifestStatus } from "./files.js";
21
21
  import type { InterruptedSessionAssessment } from "./interrupted-session.js";
22
22
  import {
23
23
  loadEffectiveGSDPreferences,
24
+ loadEffectiveGSDPreferencesWithRegistry,
25
+ modelIdsForProfileResolution,
26
+ resolveProfileAnchorProvider,
27
+ resolveDisabledModelProvidersFromPreferences,
24
28
  resolveSkillDiscoveryMode,
25
29
  getIsolationMode,
26
30
  } from "./preferences.js";
@@ -1012,9 +1016,14 @@ export async function bootstrapAutoSession(
1012
1016
  // run /login" before pausing and resetting to claude-code/claude-sonnet-4-6.
1013
1017
  const manualSessionOverride = getSessionModelOverride(ctx.sessionManager.getSessionId());
1014
1018
  const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
1019
+ const profileModelIds = modelIdsForProfileResolution(
1020
+ ctx.modelRegistry,
1021
+ resolveProfileAnchorProvider(ctx.model?.provider),
1022
+ resolveDisabledModelProvidersFromPreferences(),
1023
+ );
1015
1024
  const preferredModel = sessionProviderIsCustom
1016
1025
  ? null
1017
- : resolveDefaultSessionModel(ctx.model?.provider, base);
1026
+ : resolveDefaultSessionModel(ctx.model?.provider, base, profileModelIds);
1018
1027
  // Validate the preferred model against the live registry + provider auth so
1019
1028
  // an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
1020
1029
  // start-model snapshot. Without this, every subsequent unit would try to
@@ -1271,11 +1280,29 @@ export async function bootstrapAutoSession(
1271
1280
  }
1272
1281
  }
1273
1282
 
1274
- const blockingStrandedRecoveryAction = state.activeMilestone
1275
- ? strandedRecoveryActions.find(
1283
+ const requestedMilestoneLock = process.env.GSD_MILESTONE_LOCK?.trim() || null;
1284
+ const lockedActiveMilestone =
1285
+ requestedMilestoneLock && state.activeMilestone?.id === requestedMilestoneLock;
1286
+ let blockingStrandedRecoveryAction: OrphanAuditAction | null;
1287
+ if (lockedActiveMilestone) {
1288
+ // Parallel worker or explicit `/gsd auto Mxxx`: sibling milestones'
1289
+ // stranded work must not block this milestone's resumption, and the
1290
+ // downstream `strandedRecoveryAction` (used for currentMilestoneId,
1291
+ // setActiveMilestoneId, and adoptStrandedMilestone) must be scoped to
1292
+ // the locked milestone only. Falling back to the first sibling action
1293
+ // would mis-target adoption (#742).
1294
+ const lockMatch = strandedRecoveryActions.find(
1295
+ (action) => action.milestoneId === requestedMilestoneLock,
1296
+ ) ?? null;
1297
+ blockingStrandedRecoveryAction = lockMatch;
1298
+ strandedRecoveryAction = lockMatch;
1299
+ } else if (state.activeMilestone) {
1300
+ blockingStrandedRecoveryAction = strandedRecoveryActions.find(
1276
1301
  (action) => action.milestoneId !== state.activeMilestone?.id,
1277
- ) ?? strandedRecoveryAction
1278
- : strandedRecoveryAction;
1302
+ ) ?? strandedRecoveryAction;
1303
+ } else {
1304
+ blockingStrandedRecoveryAction = strandedRecoveryAction;
1305
+ }
1279
1306
 
1280
1307
  if (blockingStrandedRecoveryAction) {
1281
1308
  if (!state.activeMilestone) {
@@ -1297,6 +1324,8 @@ export async function bootstrapAutoSession(
1297
1324
  formatStrandedWorkRecoveryMessage(strandedRecoveryAction),
1298
1325
  "info",
1299
1326
  );
1327
+ } else if (lockedActiveMilestone) {
1328
+ strandedRecoveryAction = null;
1300
1329
  }
1301
1330
 
1302
1331
  if (
@@ -1436,7 +1465,11 @@ export async function bootstrapAutoSession(
1436
1465
  }
1437
1466
  }
1438
1467
 
1439
- const effectivePrefs = loadEffectiveGSDPreferences(base)?.preferences;
1468
+ const effectivePrefs = loadEffectiveGSDPreferencesWithRegistry(
1469
+ ctx.modelRegistry,
1470
+ base,
1471
+ resolveProfileAnchorProvider(ctx.model?.provider, startModelSnapshot?.provider),
1472
+ )?.preferences;
1440
1473
  const { shouldRunDeepProjectSetup } = await import("./auto-dispatch.js");
1441
1474
  const deepProjectStagePending = shouldRunDeepProjectSetup(
1442
1475
  state,
@@ -1788,7 +1821,11 @@ export async function bootstrapAutoSession(
1788
1821
  // FlatRateContext used by selectAndApplyModel so user-declared
1789
1822
  // flat-rate providers and externalCli auto-detection are respected.
1790
1823
  const { isFlatRateProvider, buildFlatRateContext } = await import("./auto-model-selection.js");
1791
- const bannerPrefs = loadEffectiveGSDPreferences(base)?.preferences;
1824
+ const bannerPrefs = loadEffectiveGSDPreferencesWithRegistry(
1825
+ ctx.modelRegistry,
1826
+ base,
1827
+ resolveProfileAnchorProvider(ctx.model?.provider, s.autoModeStartModel?.provider),
1828
+ )?.preferences;
1792
1829
  const effectiveProvider = s.autoModeStartModel?.provider ?? ctx.model?.provider;
1793
1830
  const effectivelyEnabled = routingConfig.enabled
1794
1831
  && (routingConfig.allow_flat_rate_providers
@@ -242,6 +242,17 @@ function stripGsdDisplayPrefix(value: string | undefined | null, id: string): st
242
242
  /** Active workspace registry — replaces the legacy `originalBase` singleton. */
243
243
  let activeWorkspace: GsdWorkspace | null = null;
244
244
 
245
+ /**
246
+ * Optional override for the shelter restore copy step (milestone merge #2505).
247
+ * Production leaves this null so restoreShelter uses the real cpSync; tests
248
+ * inject a throwing function to deterministically exercise the best-effort
249
+ * failure path (auto-worktree.ts:1809) and the shelter-retention guarantee,
250
+ * which is otherwise unreachable because shelter and restore run synchronously
251
+ * in one mergeMilestoneToMain call (the filesystem cannot change between them).
252
+ * @internal
253
+ */
254
+ let _restoreEntryFn: ((src: string, dest: string) => void) | null = null;
255
+
245
256
  function setActiveWorkspace(ws: GsdWorkspace | null): void {
246
257
  activeWorkspace = ws;
247
258
  }
@@ -972,6 +983,14 @@ function _resolveIntegrationBranchForReuse(
972
983
  }
973
984
  }
974
985
 
986
+ function safeCwd(fallback: string): string {
987
+ try {
988
+ return process.cwd();
989
+ } catch {
990
+ return fallback;
991
+ }
992
+ }
993
+
975
994
  /**
976
995
  * When reusing an existing milestone branch, fast-forward it onto the
977
996
  * integration branch when that's safe (branch is a strict ancestor of
@@ -1155,7 +1174,7 @@ export function teardownAutoWorktree(
1155
1174
 
1156
1175
  const branch = autoWorktreeBranch(milestoneId);
1157
1176
  const { preserveBranch = false, preserveWorktree = false } = opts;
1158
- const previousCwd = process.cwd();
1177
+ const previousCwd = safeCwd(originalBasePath);
1159
1178
 
1160
1179
  // Wrap the entire teardown body in a single try/finally so activeWorkspace
1161
1180
  // is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
@@ -1250,7 +1269,7 @@ export function teardownAutoWorktree(
1250
1269
  * still works after process restart when module state has been reset.
1251
1270
  */
1252
1271
  export function isInAutoWorktree(basePath: string): boolean {
1253
- const targetPath = isGsdWorktreePath(basePath) ? basePath : process.cwd();
1272
+ const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
1254
1273
  if (!isGsdWorktreePath(targetPath)) return false;
1255
1274
 
1256
1275
  const storedBase = getAutoWorktreeOriginalBase();
@@ -1386,6 +1405,22 @@ export function _resetAutoWorktreeOriginalBaseForTests(): void {
1386
1405
  setActiveWorkspace(null);
1387
1406
  }
1388
1407
 
1408
+ /**
1409
+ * Inject an override for the shelter restore copy step, returning a function
1410
+ * that restores the default (real cpSync) behavior. Used by tests to
1411
+ * deterministically exercise the best-effort restore-failure path
1412
+ * (auto-worktree.ts:1809) and the #2505 shelter-retention guarantee — which is
1413
+ * otherwise unreachable because shelter + restore run synchronously in one
1414
+ * mergeMilestoneToMain call. No production caller.
1415
+ * @internal
1416
+ */
1417
+ export function _setRestoreEntryFnForTests(
1418
+ fn: ((src: string, dest: string) => void) | null,
1419
+ ): () => void {
1420
+ _restoreEntryFn = fn;
1421
+ return () => { _restoreEntryFn = null; };
1422
+ }
1423
+
1389
1424
  export function getActiveAutoWorktreeContext(): {
1390
1425
  originalBase: string;
1391
1426
  worktreeName: string;
@@ -1795,7 +1830,15 @@ export function mergeMilestoneToMain(
1795
1830
  }
1796
1831
  try {
1797
1832
  mkdirSync(milestonesDir, { recursive: true });
1798
- cpSync(src, join(milestonesDir, dirName), { recursive: true, force: true });
1833
+ // Test seam: when _restoreEntryFn is injected, route the copy through it
1834
+ // so the best-effort failure path (and shelter-retention guarantee) can
1835
+ // be exercised deterministically. Production leaves it null → real cpSync.
1836
+ const dest = join(milestonesDir, dirName);
1837
+ if (_restoreEntryFn) {
1838
+ _restoreEntryFn(src, dest);
1839
+ } else {
1840
+ cpSync(src, dest, { recursive: true, force: true });
1841
+ }
1799
1842
  } catch (err) { /* best-effort */
1800
1843
  restoreFailed = true;
1801
1844
  logError("worktree", `shelter restore failed (${dirName}): ${err instanceof Error ? err.message : String(err)}`);
@@ -2229,6 +2272,11 @@ export function mergeMilestoneToMain(
2229
2272
  process.chdir(originalBasePath_);
2230
2273
  } catch (err) {
2231
2274
  logWarning("worktree", `chdir to project root after merge failed: ${err instanceof Error ? err.message : String(err)}`);
2275
+ debugLog("mergeMilestoneToMain", {
2276
+ phase: "post-merge-chdir-failed",
2277
+ target: originalBasePath_,
2278
+ error: err instanceof Error ? err.message : String(err),
2279
+ });
2232
2280
  }
2233
2281
  };
2234
2282