@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
@@ -25,7 +25,7 @@ import { clearActivityLogState } from "./activity-log.js";
25
25
  import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
26
26
  import { writeLock, clearLock, clearStaleWorkerLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
27
27
  import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
28
- import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode, } from "./preferences.js";
28
+ import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, loadEffectiveGSDPreferencesWithRegistry, resolveProfileAnchorProvider, getIsolationMode, resolveEffectiveUnitIsolationMode, } from "./preferences.js";
29
29
  import { playNotificationBell, sendDesktopNotification } from "./notifications.js";
30
30
  import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, } from "./auto-budget.js";
31
31
  import { markToolStart as _markToolStart, markToolEnd as _markToolEnd, getOldestInFlightToolAgeMs as _getOldestInFlightToolAgeMs, clearInFlightTools, isToolInvocationError, isQueuedUserMessageSkip, isDeterministicPolicyError, } from "./auto-tool-tracking.js";
@@ -507,11 +507,27 @@ export function _setAutoActiveForTest(active) {
507
507
  */
508
508
  export function _warnIfWorktreeMissingForTest(worktreePath, milestoneId) {
509
509
  if (worktreePath && !existsSync(worktreePath)) {
510
- logWarning("session", `Worktree was expected at ${worktreePath} but is missing. Continuing in project-root mode. To restart with a fresh worktree, run /gsd-debug or recreate the milestone.`, { file: "auto.ts", milestoneId });
510
+ logWarning("session", `Worktree was expected at ${worktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`, { file: "auto.ts", milestoneId });
511
511
  return true;
512
512
  }
513
513
  return false;
514
514
  }
515
+ export function anchorProcessCwdForAutoResume(basePath, fallbackPaths = []) {
516
+ const candidates = [basePath, ...fallbackPaths].filter((candidate, index, all) => Boolean(candidate) && all.indexOf(candidate) === index);
517
+ for (const candidate of candidates) {
518
+ if (!existsSync(candidate))
519
+ continue;
520
+ try {
521
+ process.chdir(candidate);
522
+ return true;
523
+ }
524
+ catch (err) {
525
+ logWarning("session", `resume cwd anchor failed for ${candidate}: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts", basePath: candidate });
526
+ }
527
+ }
528
+ logWarning("session", `resume cwd anchor failed: no usable directory among ${candidates.join(", ")}`, { file: "auto.ts" });
529
+ return false;
530
+ }
515
531
  export function isAutoPaused() {
516
532
  return s.paused;
517
533
  }
@@ -751,6 +767,42 @@ function pauseAutoUnitIdentityMatches(expected) {
751
767
  s.currentUnit.id === expected.id &&
752
768
  s.currentUnit.startedAt === expected.startedAt;
753
769
  }
770
+ function shouldPreserveCoordinationForPause(errorContext) {
771
+ return errorContext?.category === "provider" && errorContext.isTransient === true;
772
+ }
773
+ function resolvePauseLifecyclePresentation(errorContext) {
774
+ const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
775
+ const modeLabel = s.stepMode ? "Step" : "Auto";
776
+ const defaultPresentation = {
777
+ status: "paused",
778
+ title: `${modeLabel}-mode paused`,
779
+ detail: errorContext?.message ?? "Paused by user request.",
780
+ nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
781
+ commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
782
+ notifyLevel: "info",
783
+ notifyPrefix: `${modeLabel}-mode paused`,
784
+ };
785
+ const message = errorContext?.message ?? "";
786
+ if (message.includes("completed closeout dispatch history") ||
787
+ message.includes("completed complete-milestone dispatch history")) {
788
+ const milestoneMatch = message.match(/Milestone (M\d+[A-Z0-9-]*)/);
789
+ const milestoneId = milestoneMatch?.[1] ?? "this milestone";
790
+ return {
791
+ status: "blocked",
792
+ title: `${modeLabel}-mode blocked`,
793
+ detail: message,
794
+ nextAction: `Run \`/gsd dispatch complete-milestone ${milestoneId}\` to finish closeout, then ${resumeCmd}.`,
795
+ commands: [
796
+ `/gsd dispatch complete-milestone ${milestoneId}`,
797
+ `/gsd status ${milestoneId}`,
798
+ resumeCmd,
799
+ ],
800
+ notifyLevel: "warning",
801
+ notifyPrefix: `${modeLabel}-mode blocked`,
802
+ };
803
+ }
804
+ return defaultPresentation;
805
+ }
754
806
  function setLifecycleOutcome(ctx, input) {
755
807
  if (!ctx?.hasUI)
756
808
  return;
@@ -783,11 +835,15 @@ function setTerminalCloseoutOutcome(ctx, input) {
783
835
  invalidate() { },
784
836
  }));
785
837
  ctx.ui.setStatus?.("gsd-step", undefined);
838
+ ctx.ui?.setGsdProgress?.(undefined);
786
839
  ctx.ui.setWidget?.("gsd-progress", undefined);
840
+ const detail = input.allMilestonesComplete && input.milestoneTitle
841
+ ? `${input.milestoneTitle}. All milestones complete`
842
+ : `${titleLine}${input.reason ?? "Milestone closeout finished."}`;
787
843
  setLifecycleOutcome(ctx, {
788
844
  status: "complete",
789
845
  title,
790
- detail: `${titleLine}${input.reason ?? "Milestone closeout finished."}`,
846
+ detail,
791
847
  nextAction,
792
848
  commands: TERMINAL_CLOSEOUT_COMMANDS,
793
849
  unitLabel: input.milestoneId ? `complete-milestone ${input.milestoneId}` : null,
@@ -1502,6 +1558,10 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
1502
1558
  });
1503
1559
  return;
1504
1560
  }
1561
+ anchorProcessCwdForAutoResume(s.basePath || s.originalBasePath || "", [
1562
+ s.originalBasePath,
1563
+ lockBase(),
1564
+ ].filter((path) => Boolean(path)));
1505
1565
  s.active = false;
1506
1566
  s.paused = true;
1507
1567
  clearUnitTimeout();
@@ -1585,7 +1645,7 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
1585
1645
  releaseSessionLock(lockBase());
1586
1646
  clearLock(lockBase());
1587
1647
  }
1588
- if (s.workerId) {
1648
+ if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
1589
1649
  try {
1590
1650
  if (s.currentMilestoneId && s.milestoneLeaseToken) {
1591
1651
  releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
@@ -1611,21 +1671,21 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
1611
1671
  s.pendingVerificationRetry = null;
1612
1672
  ctx?.ui.setStatus("gsd-auto", "paused");
1613
1673
  ctx?.ui.setWidget("gsd-progress", undefined);
1614
- const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
1674
+ const lifecycle = resolvePauseLifecyclePresentation(_errorContext);
1615
1675
  setLifecycleOutcome(ctx, {
1616
- status: "paused",
1617
- title: `${s.stepMode ? "Step" : "Auto"}-mode paused`,
1618
- detail: _errorContext?.message ?? "Paused by user request.",
1619
- nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
1620
- commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
1676
+ status: lifecycle.status,
1677
+ title: lifecycle.title,
1678
+ detail: lifecycle.detail,
1679
+ nextAction: lifecycle.nextAction,
1680
+ commands: lifecycle.commands,
1621
1681
  unitLabel: pausedUnitLabel,
1622
1682
  });
1623
1683
  if (ctx)
1624
1684
  initHealthWidget(ctx);
1625
1685
  const pauseMessage = _errorContext?.message
1626
- ? `${s.stepMode ? "Step" : "Auto"}-mode paused: ${_errorContext.message}`
1627
- : `${s.stepMode ? "Step" : "Auto"}-mode paused (Escape). Type to interact, or ${resumeCmd} to resume.`;
1628
- ctx?.ui.notify(pauseMessage, "info");
1686
+ ? `${lifecycle.notifyPrefix}: ${_errorContext.message}`
1687
+ : `${lifecycle.notifyPrefix} (Escape). Type to interact, or ${lifecycle.commands[0] ?? (s.stepMode ? "/gsd next" : "/gsd auto")} to resume.`;
1688
+ ctx?.ui.notify(pauseMessage, lifecycle.notifyLevel);
1629
1689
  }
1630
1690
  /**
1631
1691
  * Build a WorktreeLifecycle Module wrapping the current session.
@@ -1688,7 +1748,7 @@ function ensureOrchestrationModule(ctx, pi, basePath) {
1688
1748
  * Build the LoopDeps object from auto.ts private scope.
1689
1749
  * This bundles all private functions that autoLoop needs without exporting them.
1690
1750
  */
1691
- function buildLoopDeps(pi) {
1751
+ function buildLoopDeps(pi, ctx) {
1692
1752
  // Initialize the unified rule registry with converted dispatch rules.
1693
1753
  // Must happen before LoopDeps is assembled so facade functions
1694
1754
  // (resolveDispatch, runPreDispatchHooks, etc.) delegate to the registry.
@@ -1711,7 +1771,7 @@ function buildLoopDeps(pi) {
1711
1771
  invalidateAllCaches,
1712
1772
  deriveState,
1713
1773
  rebuildState,
1714
- loadEffectiveGSDPreferences,
1774
+ loadEffectiveGSDPreferences: () => loadEffectiveGSDPreferencesWithRegistry(ctx.modelRegistry, s.basePath || undefined, resolveProfileAnchorProvider(ctx.model?.provider, s.autoModeStartModel?.provider)),
1715
1775
  // Pre-dispatch health gate
1716
1776
  preDispatchHealthGate,
1717
1777
  // Worktree state projection (ADR-016 — single Module Interface)
@@ -1944,7 +2004,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1944
2004
  {
1945
2005
  const persistedWorktreePath = meta.worktreePath ?? null;
1946
2006
  if (persistedWorktreePath && !existsSync(persistedWorktreePath)) {
1947
- logWarning("session", `Worktree was expected at ${persistedWorktreePath} but is missing. Continuing in project-root mode. To restart with a fresh worktree, run /gsd-debug or recreate the milestone.`, { file: "auto.ts", milestoneId: meta.milestoneId ?? "" });
2007
+ logWarning("session", `Worktree was expected at ${persistedWorktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`, { file: "auto.ts", milestoneId: meta.milestoneId ?? "" });
1948
2008
  }
1949
2009
  const rawForScope = (persistedWorktreePath && existsSync(persistedWorktreePath))
1950
2010
  ? persistedWorktreePath
@@ -2026,10 +2086,14 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
2026
2086
  // worktree directory safely falls back to the project root.
2027
2087
  const resumeWorktreePath = freshStartAssessment.pausedSession?.worktreePath ?? null;
2028
2088
  if (resumeWorktreePath && !existsSync(resumeWorktreePath)) {
2029
- logWarning("session", `Worktree was expected at ${resumeWorktreePath} but is missing. Continuing in project-root mode. To restart with a fresh worktree, run /gsd-debug or recreate the milestone.`, { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" });
2089
+ logWarning("session", `Worktree was expected at ${resumeWorktreePath} but is missing. Resuming from project root; /gsd next will recreate the worktree when isolation is enabled.`, { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" });
2030
2090
  }
2031
2091
  // ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
2032
2092
  buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
2093
+ anchorProcessCwdForAutoResume(s.basePath || base, [
2094
+ base,
2095
+ s.originalBasePath || base,
2096
+ ]);
2033
2097
  // Rebuild scope now that s.basePath reflects the actual worktree (or project root).
2034
2098
  rebuildScope(s.basePath, s.currentMilestoneId);
2035
2099
  // Ensure the workflow-logger audit log is pinned to the project root
@@ -2069,7 +2133,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
2069
2133
  // s.basePath may have been updated to a worktree path by enterMilestone.
2070
2134
  rebuildScope(s.basePath, s.currentMilestoneId);
2071
2135
  }
2072
- const loopDeps = buildLoopDeps(pi);
2136
+ const loopDeps = buildLoopDeps(pi, ctx);
2073
2137
  ensureOrchestrationModule(ctx, pi, s.basePath || base);
2074
2138
  registerSigtermHandler(lockBase());
2075
2139
  setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
@@ -2158,7 +2222,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
2158
2222
  // Build scope after bootstrap has populated s.basePath / s.originalBasePath /
2159
2223
  // s.currentMilestoneId (including worktree setup inside bootstrapAutoSession).
2160
2224
  rebuildScope(s.basePath, s.currentMilestoneId);
2161
- const loopDeps = buildLoopDeps(pi);
2225
+ const loopDeps = buildLoopDeps(pi, ctx);
2162
2226
  ensureOrchestrationModule(ctx, pi, s.basePath || base);
2163
2227
  captureProjectRootEnv(s.originalBasePath || s.basePath);
2164
2228
  registerAutoWorkerForSession(s);
@@ -531,11 +531,13 @@ export async function handleAgentEnd(pi, event, ctx) {
531
531
  });
532
532
  return;
533
533
  }
534
- // Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli)
534
+ // Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli, google-antigravity)
535
535
  // which use per-user quotas with shorter windows (#2922).
536
536
  if (cls.kind === "rate-limit") {
537
537
  const currentProvider = ctx.model?.provider;
538
- if (currentProvider === "openai-codex" || currentProvider === "google-gemini-cli") {
538
+ if (currentProvider === "openai-codex"
539
+ || currentProvider === "google-gemini-cli"
540
+ || currentProvider === "google-antigravity") {
539
541
  cls.retryAfterMs = Math.min(cls.retryAfterMs, 30_000);
540
542
  }
541
543
  const dash = getAutoDashboardData();
@@ -5,7 +5,7 @@ import { homedir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
7
7
  import { logWarning } from "../workflow-logger.js";
8
- import { openWorkflowDatabase } from "../db-workspace.js";
8
+ import { getWorkflowDatabaseStatus, openWorkflowDatabase, } from "../db-workspace.js";
9
9
  import { getAutoWorktreePath } from "../auto-worktree.js";
10
10
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
11
11
  import { worktreesDirs } from "../worktree-placement.js";
@@ -61,16 +61,46 @@ export function resolveWorkflowToolBasePath(ctx, scope) {
61
61
  return cwd;
62
62
  }
63
63
  export { resolveProjectRootDbPath } from "../db-workspace.js";
64
+ function sqliteProviderHint(status, nodeVersion) {
65
+ if (status.provider)
66
+ return `Provider: ${status.provider}.`;
67
+ const major = Number.parseInt(nodeVersion.split(".")[0] ?? "", 10);
68
+ if (Number.isFinite(major) && major < 22) {
69
+ return (`No SQLite provider available. Upgrade Node to >= 22.0.0 (current: v${nodeVersion}), ` +
70
+ "use the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
71
+ }
72
+ return ("No SQLite provider available. Use a Node build with node:sqlite enabled, " +
73
+ "run the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
74
+ }
75
+ function dbOpenPhaseHint(status) {
76
+ if (status.lastPhase === "open")
77
+ return "The database file could not be opened";
78
+ if (status.lastPhase === "initSchema")
79
+ return "The database schema could not be initialized";
80
+ if (status.lastPhase === "vacuum-recovery")
81
+ return "Corruption recovery (VACUUM) failed";
82
+ if (status.attempted)
83
+ return "The database could not be opened";
84
+ return "The database provider could not be loaded";
85
+ }
86
+ export function formatWorkflowDatabaseOpenFailure(result, status, nodeVersion = process.versions.node) {
87
+ if (result.reason === "missing-gsd-dir") {
88
+ return `ensureDbOpen failed — no .gsd directory found at ${result.location.projectGsd}`;
89
+ }
90
+ if (result.reason === "missing-database") {
91
+ return `ensureDbOpen failed — no GSD database found at ${result.location.projectDb}`;
92
+ }
93
+ const resolvedStatus = status ?? getWorkflowDatabaseStatus();
94
+ const detail = result.error?.message ?? resolvedStatus.lastError?.message ?? "";
95
+ const detailSuffix = detail ? ` (${detail})` : "";
96
+ return (`ensureDbOpen failed for ${result.location.projectDb}: ` +
97
+ `${dbOpenPhaseHint(resolvedStatus)}${detailSuffix}. ${sqliteProviderHint(resolvedStatus, nodeVersion)}`);
98
+ }
64
99
  export async function ensureDbOpen(basePath = safeWorkspaceCwd()) {
65
100
  const result = openWorkflowDatabase(basePath);
66
101
  if (result.ok)
67
102
  return true;
68
- if (result.reason === "missing-gsd-dir") {
69
- logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
70
- }
71
- else {
72
- logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
73
- }
103
+ logWarning("bootstrap", formatWorkflowDatabaseOpenFailure(result));
74
104
  return false;
75
105
  }
76
106
  export function registerDynamicTools(pi) {
@@ -12,7 +12,7 @@ import { registerScheduleWakeupTool } from "./schedule-wakeup-tool.js";
12
12
  import { registerHooks } from "./register-hooks.js";
13
13
  import { registerShortcuts } from "./register-shortcuts.js";
14
14
  import { writeCrashLog } from "./crash-log.js";
15
- import { logWarning } from "../workflow-logger.js";
15
+ import { logWarning, isGsdExtensionStderrEnabled } from "../workflow-logger.js";
16
16
  import { UNIT_TOOL_CONTRACTS } from "../unit-tool-contracts.js";
17
17
  // Static import so cmux event listeners are registered synchronously during
18
18
  // extension bootstrap. Prior implementation used `void import().then()` which
@@ -37,6 +37,8 @@ export const CRITICAL_GSD_WORKFLOW_TOOL_NAMES = [...new Set(Object.values(UNIT_T
37
37
  /** Write to stderr without ever re-throwing — stderr can EPIPE too, which would
38
38
  * re-enter this handler and re-loop. */
39
39
  function safeStderr(msg) {
40
+ if (!isGsdExtensionStderrEnabled())
41
+ return;
40
42
  try {
41
43
  process.stderr.write(msg);
42
44
  }
@@ -7,7 +7,7 @@ import { isToolCallEventType } from "@gsd/pi-coding-agent";
7
7
  import { ALWAYS_PRESERVED_SHIM_TOOL_NAMES } from "@gsd/pi-ai";
8
8
  import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
9
9
  import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
10
- import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
10
+ import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeBash, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
11
11
  import { canonicalToolName } from "../engine-hook-contract.js";
12
12
  import { resolveManifest } from "../unit-context-manifest.js";
13
13
  import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
@@ -21,7 +21,7 @@ import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecor
21
21
  import { parseUnitId } from "../unit-id.js";
22
22
  import { classifyCommand } from "../safety/destructive-guard.js";
23
23
  import { confirmDestructiveCommand, consumeDestructiveConfirmation, isDestructiveConfirmGateId, requestDestructiveConfirmation, } from "../safety/destructive-confirmation.js";
24
- import { logWarning as safetyLogWarning } from "../workflow-logger.js";
24
+ import { logWarning as safetyLogWarning, setStderrLoggingEnabled } from "../workflow-logger.js";
25
25
  import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
26
26
  import { installNotifyInterceptor } from "./notify-interceptor.js";
27
27
  import { initNotificationStore } from "../notification-store.js";
@@ -110,6 +110,15 @@ async function installWelcomeHeader(ctx) {
110
110
  /* non-fatal */
111
111
  }
112
112
  }
113
+ /** Suppress the startup welcome banner without restoring the built-in pi header. */
114
+ function suppressWelcomeHeader(ctx) {
115
+ if (!ctx.hasUI || typeof ctx.ui?.setHeader !== "function")
116
+ return;
117
+ ctx.ui.setHeader(() => ({
118
+ render() { return []; },
119
+ invalidate() { },
120
+ }));
121
+ }
113
122
  /**
114
123
  * Approval gates whose durable arming is deferred until tool execution /
115
124
  * agent end, keyed by basePath. A Map (not a single slot) so concurrent
@@ -629,6 +638,9 @@ function initSessionNotifications(ctx) {
629
638
  installNotifyInterceptor(ctx);
630
639
  initNotificationWidget(ctx);
631
640
  notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
641
+ if (ctx.hasUI) {
642
+ setStderrLoggingEnabled(false);
643
+ }
632
644
  }
633
645
  async function prepareWorkflowMcpForHookContext(ctx, basePath) {
634
646
  // Skip MCP auto-prep when running inside an auto-worktree. The worktree
@@ -671,7 +683,15 @@ export function registerHooks(pi, ecosystemHandlers) {
671
683
  }
672
684
  catch { /* non-fatal */ }
673
685
  if (!preserveCloseoutSurface) {
674
- await installWelcomeHeader(ctx);
686
+ // Per-unit newSession() during auto/step runs fires session_start again.
687
+ // Keep the welcome banner startup-only — do not overwrite the empty header
688
+ // that updateProgressWidget installs once work begins.
689
+ if (isAutoActive() || isAutoPaused()) {
690
+ suppressWelcomeHeader(ctx);
691
+ }
692
+ else {
693
+ await installWelcomeHeader(ctx);
694
+ }
675
695
  }
676
696
  await loadToolApiKeysForSession();
677
697
  if (isAutoActive() || preserveCloseoutSurface) {
@@ -818,6 +838,10 @@ export function registerHooks(pi, ecosystemHandlers) {
818
838
  pi.on("message_end", async (event) => {
819
839
  const { suppressTerminalDeletedWorktreeMessageEnd } = await import("./agent-end-recovery.js");
820
840
  suppressTerminalDeletedWorktreeMessageEnd(event);
841
+ if (isAutoActive()) {
842
+ const { sanitizePrematureCloseoutMessageEnd } = await import("../auto-closeout-messaging.js");
843
+ sanitizePrematureCloseoutMessageEnd(event);
844
+ }
821
845
  });
822
846
  // Squash-merge quick-task branch back to the original branch after the
823
847
  // agent turn completes (#2668). cleanupQuickBranch is a no-op when no
@@ -1094,6 +1118,11 @@ export function registerHooks(pi, ecosystemHandlers) {
1094
1118
  if (wtGuard.block)
1095
1119
  return wtGuard;
1096
1120
  }
1121
+ if (isToolCallEventType("bash", event)) {
1122
+ const wtBashGuard = shouldBlockWorktreeBash(event.input.command, dash.basePath ?? discussionBasePath, isAutoActive(), dash.currentUnit?.type);
1123
+ if (wtBashGuard.block)
1124
+ return wtBashGuard;
1125
+ }
1097
1126
  // ── Single-writer engine: block direct writes to STATE.md ──────────
1098
1127
  // Covers write, edit, and bash tools to prevent bypass vectors.
1099
1128
  if (isToolCallEventType("write", event)) {
@@ -10,6 +10,7 @@ import { compileSubagentPermissionContract } from "../unit-context-manifest.js";
10
10
  import { logWarning } from "../workflow-logger.js";
11
11
  import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
12
12
  import { worktreesDirs } from "../worktree-placement.js";
13
+ import { bashReferencesProjectRootOutsideWorktree } from "../worktree-shell-guard.js";
13
14
  import { evaluateGateAnswer } from "../consent-verdict.js";
14
15
  /**
15
16
  * Regex matching milestone CONTEXT.md file names in both legacy M001
@@ -1116,6 +1117,30 @@ function isPathContained(target, container) {
1116
1117
  return true;
1117
1118
  return target.startsWith(container.endsWith(sep) ? container : container + sep);
1118
1119
  }
1120
+ function formatWorktreeIsolationBlockReason(tool, displayTarget, isAutoLive, effectiveBasePath) {
1121
+ if (isGsdWorktreePath(effectiveBasePath)) {
1122
+ return [
1123
+ `HARD BLOCK: ${tool} target "${displayTarget}" is outside the active milestone worktree`,
1124
+ `while \`git.isolation: worktree\` is configured. Source edits must stay inside`,
1125
+ `\`.gsd-worktrees/<MID>/\` (or \`.gsd/\` planning artifacts) so the auto-mode commit`,
1126
+ `pipeline captures them. Writing to the project root leaks changes that block milestone merge.`,
1127
+ `Use a relative path under the worktree cwd or an absolute path inside the worktree directory.`,
1128
+ ...(isAutoLive ? [] : [
1129
+ "This guard also applies to subagent children spawned from the worktree — do not",
1130
+ "`cd` to the project root or reference its paths in shell commands.",
1131
+ ]),
1132
+ ].join(" ");
1133
+ }
1134
+ return [
1135
+ `HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
1136
+ `not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
1137
+ `Code edits at the project root would be lost — only the auto-mode commit pipeline`,
1138
+ `(auto-post-unit) commits work, and it never runs outside the loop.`,
1139
+ `Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
1140
+ `then write inside it. To disable this guard for self-hosting development, set`,
1141
+ `GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
1142
+ ].join(" ");
1143
+ }
1119
1144
  /**
1120
1145
  * Block planning-write tool calls that would land code at the project root
1121
1146
  * while `git.isolation: worktree` is in effect and auto-mode hasn't created
@@ -1133,10 +1158,9 @@ function isPathContained(target, container) {
1133
1158
  * 5. Target is inside `<projectRoot>/.gsd/worktrees/` (a real worktree).
1134
1159
  * 6. Target is inside `<projectRoot>/.gsd/` and isn't masquerading as a
1135
1160
  * worktrees sibling (rejects the `.gsd/worktrees-extra/…` prefix trick).
1136
- * 7. Auto is live AND `effectiveBasePath` is itself a `.gsd/worktrees/…` path.
1137
1161
  *
1138
- * Otherwise: block with a message that points the agent at `/gsd` to start
1139
- * auto-mode.
1162
+ * Otherwise: block with a message that points the agent at the active worktree
1163
+ * or `/gsd` to start auto-mode.
1140
1164
  */
1141
1165
  export function shouldBlockWorktreeWrite(toolName, targetPath, effectiveBasePath, isAutoLive, currentUnitType) {
1142
1166
  const tool = canonicalToolName(toolName);
@@ -1180,24 +1204,40 @@ export function shouldBlockWorktreeWrite(toolName, targetPath, effectiveBasePath
1180
1204
  return { block: false };
1181
1205
  // fall through: looks like worktrees<something> sibling — block
1182
1206
  }
1183
- // Auto is live and the caller is operating inside a worktree path —
1184
- // host tool's write happens in worktree context; let it through.
1185
- if (isAutoLive && isGsdWorktreePath(effectiveBasePath))
1186
- return { block: false };
1187
1207
  // Block. Provide enough context that the agent can self-correct.
1188
1208
  const displayTarget = isPathContained(realTarget, realRoot)
1189
1209
  ? relative(realRoot, realTarget) || "."
1190
1210
  : realTarget;
1191
1211
  return {
1192
1212
  block: true,
1193
- reason: [
1194
- `HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
1195
- `not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
1196
- `Code edits at the project root would be lost — only the auto-mode commit pipeline`,
1197
- `(auto-post-unit) commits work, and it never runs outside the loop.`,
1198
- `Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
1199
- `then write inside it. To disable this guard for self-hosting development, set`,
1200
- `GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
1201
- ].join(" "),
1213
+ reason: formatWorktreeIsolationBlockReason(tool, displayTarget, isAutoLive, effectiveBasePath),
1214
+ };
1215
+ }
1216
+ /**
1217
+ * Block bash commands that reference the project root while executing inside an
1218
+ * active milestone worktree under `git.isolation: worktree`.
1219
+ *
1220
+ * Mirrors the gsd_exec sandbox rule so native bash cannot bypass write/edit gates.
1221
+ */
1222
+ export function shouldBlockWorktreeBash(command, effectiveBasePath, isAutoLive, currentUnitType) {
1223
+ if (process.env.GSD_DISABLE_WORKTREE_WRITE_GUARD === "1")
1224
+ return { block: false };
1225
+ if (getIsolationMode(effectiveBasePath) !== "worktree")
1226
+ return { block: false };
1227
+ if (currentUnitType && WORKTREE_GATE_BOOTSTRAP_UNITS.has(currentUnitType))
1228
+ return { block: false };
1229
+ // Block whenever the effective cwd is inside a milestone worktree — not only
1230
+ // during live auto-mode. Reactive-execute subagents run as fresh pi children
1231
+ // without an auto session, but still inherit the worktree cwd and must not
1232
+ // shell out to the project root (the native bash bypass that caused root-write leaks).
1233
+ if (!isGsdWorktreePath(effectiveBasePath))
1234
+ return { block: false };
1235
+ if (!command.trim())
1236
+ return { block: false };
1237
+ if (!bashReferencesProjectRootOutsideWorktree(command, effectiveBasePath))
1238
+ return { block: false };
1239
+ return {
1240
+ block: true,
1241
+ reason: formatWorktreeIsolationBlockReason("bash", "project root path reference in shell command", isAutoLive, effectiveBasePath),
1202
1242
  };
1203
1243
  }
@@ -13,7 +13,7 @@ import { isClosedStatus } from "./status-guards.js";
13
13
  import { findUnmergedCompletedMilestones, } from "./unmerged-milestone-guard.js";
14
14
  import { appendRequirementsBacklogToSummary } from "./requirements-backlog.js";
15
15
  import { nativeBranchList, nativeIsRepo } from "./native-git-bridge.js";
16
- import { allWorktreesDirs } from "./worktree-manager.js";
16
+ import { allWorktreesDirs, isMilestoneWorktreeResidueCandidate, pruneEphemeralGhostWorktreeDirectories, } from "./worktree-manager.js";
17
17
  const MILESTONE_MERGE_CLOSEOUT_COMMANDS = [
18
18
  "/gsd status for overview",
19
19
  "/gsd visualize to inspect",
@@ -28,9 +28,13 @@ function listMilestoneWorktreeIds(basePath) {
28
28
  for (const entry of readdirSync(wtDir)) {
29
29
  if (!MILESTONE_ID_RE.test(entry))
30
30
  continue;
31
+ const fullPath = join(wtDir, entry);
31
32
  try {
32
- if (statSync(join(wtDir, entry)).isDirectory())
33
- ids.add(entry);
33
+ if (!statSync(fullPath).isDirectory())
34
+ continue;
35
+ if (!isMilestoneWorktreeResidueCandidate(basePath, fullPath))
36
+ continue;
37
+ ids.add(entry);
34
38
  }
35
39
  catch {
36
40
  // skip unreadable entries
@@ -70,6 +74,7 @@ function isStrandedMilestoneId(milestoneId) {
70
74
  export function detectIdleMilestoneResidueHint(basePath) {
71
75
  if (!nativeIsRepo(basePath))
72
76
  return null;
77
+ pruneEphemeralGhostWorktreeDirectories(basePath);
73
78
  const gsdDir = join(basePath, ".gsd");
74
79
  const dbPath = join(gsdDir, "gsd.db");
75
80
  if (!existsSync(gsdDir) || !existsSync(dbPath)) {
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { computeProgressScore, formatProgressLine } from "../../progress-score.js";
3
- import { getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath } from "../../preferences.js";
3
+ import { getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath, modelIdsForProfileResolution, resolveProfileAnchorProvider, resolveDisabledModelProvidersFromPreferences } from "../../preferences.js";
4
4
  import { ensurePreferencesFile, handlePrefs, handlePrefsMode, handlePrefsWizard, handleLanguage } from "../../commands-prefs-wizard.js";
5
5
  import { runEnvironmentChecks } from "../../doctor-environment.js";
6
6
  import { deriveState } from "../../state.js";
@@ -257,7 +257,10 @@ export async function handleSetup(args, ctx, pi) {
257
257
  return;
258
258
  }
259
259
  if (args === "model") {
260
- await handleModel("", ctx, pi);
260
+ // Default model picker: persist settings.json default only — do not pin the
261
+ // session override that /gsd model uses, or PREFERENCES.md per-phase models
262
+ // are ignored for the rest of this session (#model-prefs-precedence).
263
+ await handleModel("", ctx, pi, { pinSession: false });
261
264
  return;
262
265
  }
263
266
  if (args === "keys") {
@@ -361,7 +364,7 @@ async function resolveRequestedModel(query, ctx) {
361
364
  return undefined;
362
365
  return selectModelByProvider(`Multiple models match "${query}"`, partialMatches, ctx, ctx.model);
363
366
  }
364
- async function handleModel(trimmedArgs, ctx, pi) {
367
+ async function handleModel(trimmedArgs, ctx, pi, options) {
365
368
  const availableModels = ctx.modelRegistry.getAvailable();
366
369
  if (availableModels.length === 0) {
367
370
  ctx.ui.notify("No available models found. Check provider auth and model discovery.", "warning");
@@ -395,15 +398,18 @@ async function handleModel(trimmedArgs, ctx, pi) {
395
398
  }
396
399
  // /gsd model is an explicit per-session pin for GSD dispatches.
397
400
  // This is captured at auto bootstrap so it survives internal session
398
- // switches during /gsd auto and /gsd next runs.
401
+ // switches during /gsd auto and /gsd next runs. /gsd setup model skips
402
+ // this pin so PREFERENCES.md per-phase models keep precedence.
403
+ const pinSession = options?.pinSession !== false;
399
404
  const sessionId = ctx.sessionManager?.getSessionId?.();
400
- if (sessionId) {
405
+ if (pinSession && sessionId) {
401
406
  setSessionModelOverride(sessionId, {
402
407
  provider: targetModel.provider,
403
408
  id: targetModel.id,
404
409
  });
405
410
  }
406
- ctx.ui.notify(`Model: ${targetModel.provider}/${targetModel.id}`, "info");
411
+ const pinNote = pinSession ? "" : " (default updated; per-phase prefs still apply in auto)";
412
+ ctx.ui.notify(`Model: ${targetModel.provider}/${targetModel.id}${pinNote}`, "info");
407
413
  }
408
414
  export async function handleCoreCommand(trimmed, ctx, pi) {
409
415
  if (trimmed === "help" || trimmed === "h" || trimmed === "?" || trimmed.startsWith("help ")) {
@@ -470,7 +476,15 @@ export async function handleCoreCommand(trimmed, ctx, pi) {
470
476
  }
471
477
  if (trimmed === "show-config") {
472
478
  const { GSDConfigOverlay, formatConfigText } = await import("../../config-overlay.js");
473
- const result = await ctx.ui.custom((tui, theme, _kb, done) => new GSDConfigOverlay(tui, theme, () => done(true)), {
479
+ const basePath = projectRoot();
480
+ const anchorProvider = resolveProfileAnchorProvider(ctx.model?.provider);
481
+ const disabledProviders = resolveDisabledModelProvidersFromPreferences();
482
+ const availableModelIds = modelIdsForProfileResolution(ctx.modelRegistry, anchorProvider, disabledProviders);
483
+ const configOptions = {
484
+ basePath,
485
+ ...(availableModelIds && availableModelIds.length > 0 ? { availableModelIds } : {}),
486
+ };
487
+ const result = await ctx.ui.custom((tui, theme, _kb, done) => new GSDConfigOverlay(tui, theme, () => done(true), configOptions), {
474
488
  overlay: true,
475
489
  overlayOptions: {
476
490
  width: "65%",
@@ -480,7 +494,7 @@ export async function handleCoreCommand(trimmed, ctx, pi) {
480
494
  },
481
495
  });
482
496
  if (result === undefined) {
483
- ctx.ui.notify(formatConfigText(), "info");
497
+ ctx.ui.notify(formatConfigText(configOptions), "info");
484
498
  }
485
499
  return true;
486
500
  }
@@ -50,7 +50,7 @@ export async function handleOpsCommand(trimmed, ctx, pi) {
50
50
  ["execute-task", "execute"],
51
51
  ["complete-slice", "complete"],
52
52
  ["validate-milestone", "validate-milestone"],
53
- ["complete-milestone", "complete"],
53
+ ["complete-milestone", "complete-milestone"],
54
54
  ]);
55
55
  const aliasPhase = directDispatchAlias.get(trimmed);
56
56
  if (aliasPhase) {
@@ -230,7 +230,7 @@ Examples:
230
230
  if (trimmed === "dispatch" || trimmed.startsWith("dispatch ")) {
231
231
  const phase = trimmed.replace(/^dispatch\s*/, "").trim();
232
232
  if (!phase) {
233
- ctx.ui.notify("Usage: /gsd dispatch <phase> (research|plan|execute|complete|validate|reassess|uat|replan)", "warning");
233
+ ctx.ui.notify("Usage: /gsd dispatch <phase> (research|plan|execute|complete|complete-milestone|validate|reassess|uat|replan)", "warning");
234
234
  return true;
235
235
  }
236
236
  const basePath = projectRoot();
@@ -59,7 +59,7 @@ export function formatMcpStatusReport(servers) {
59
59
  : s.connected
60
60
  ? `connected — ${s.toolCount} tools`
61
61
  : s.available
62
- ? `available — ${s.toolCount} tools`
62
+ ? `probe available — ${s.toolCount} tools`
63
63
  : "disconnected";
64
64
  const warningText = s.envWarnings?.length ? ` — ${s.envWarnings.length} warning(s)` : "";
65
65
  lines.push(` ${icon} ${s.name} (${s.transport}) — ${status}${warningText}`);
@@ -83,7 +83,7 @@ export function formatMcpServerDetail(server) {
83
83
  lines.push(` Error: ${server.error}`);
84
84
  }
85
85
  else if (server.connected || server.available) {
86
- lines.push(` Status: ${server.connected ? "connected" : "available"}`);
86
+ lines.push(` Status: ${server.connected ? "connected" : "probe available"}`);
87
87
  lines.push(` Tools: ${server.toolCount}`);
88
88
  if (server.tools.length > 0) {
89
89
  lines.push("");