@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
@@ -42,9 +42,14 @@ export { nextMilestoneIdReserved } from "./milestone-id-reservation.js";
42
42
  import { parkMilestone, discardMilestone } from "./milestone-actions.js";
43
43
  import { buildCloseoutMenuActions, buildIdleMenuSummary, getPrimaryCloseoutRecommendation, handleCloseoutChoice, loadCloseoutContext, } from "./closeout-wizard.js";
44
44
  import { buildRequirementsBacklogDiscussContext, countUnmappedActiveRequirements, showRequirementsBacklogReview, } from "./requirements-backlog.js";
45
- import { selectAndApplyModel } from "./auto-model-selection.js";
45
+ import { selectAndApplyModel, getRegisteredToolSnapshot } from "./auto-model-selection.js";
46
46
  import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
47
- import { supportsStructuredQuestions } from "./workflow-mcp.js";
47
+ import { detectWorkflowMcpLaunchConfig, resolveWorkflowMcpProjectRoot, supportsStructuredQuestions, } from "./workflow-mcp.js";
48
+ import { usesWorkflowMcpTransport } from "./question-transport.js";
49
+ import { getCachedWorkflowMcpProbe, probeAndCacheWorkflowMcp, warmWorkflowMcpProbeInBackground, workflowMcpProbeAdvertisesSurface, WORKFLOW_MCP_PROBE_TIMEOUT_MS, } from "./workflow-mcp-readiness-cache.js";
50
+ import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
51
+ import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
52
+ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
48
53
  import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
49
54
  import { runPreparation, formatCodebaseBrief, formatPriorContextBrief, } from "./preparation.js";
50
55
  import { verifyExpectedArtifact } from "./auto-recovery.js";
@@ -369,6 +374,67 @@ async function dispatchNextDeepProjectSetupStage(entry) {
369
374
  export function resolveGuidedDispatchProjectRoot(basePath) {
370
375
  return basePath ?? process.cwd();
371
376
  }
377
+ /**
378
+ * Wait until the workflow MCP server is reachable and advertising its tool
379
+ * surface. Returns failure details when timed out, or null when ready (or MCP
380
+ * is not the transport). Called inside dispatchWorkflow() so every guided-flow
381
+ * dispatch path is gated automatically.
382
+ */
383
+ const MCP_READINESS_TIMEOUT_MS = 15_000;
384
+ const MCP_READINESS_POLL_MS = 200;
385
+ async function awaitWorkflowMcpReadiness(pi, ctx, basePath, options = {}) {
386
+ const provider = ctx.model?.provider;
387
+ const authMode = provider ? ctx.modelRegistry.getProviderAuthMode(provider) : undefined;
388
+ if (!usesWorkflowMcpTransport(authMode, ctx.model?.baseUrl))
389
+ return null;
390
+ const projectRoot = resolveWorkflowMcpProjectRoot(basePath);
391
+ const launch = detectWorkflowMcpLaunchConfig(projectRoot);
392
+ if (!launch)
393
+ return null;
394
+ const requiredTools = options.unitType
395
+ ? getRequiredWorkflowToolsForUnit(options.unitType).filter(isWorkflowToolSurfaceName)
396
+ : [];
397
+ const coversExpectedSurface = (tools) => requiredTools.length > 0
398
+ ? probeCoversRequiredWorkflowTools(tools, requiredTools)
399
+ : workflowMcpProbeAdvertisesSurface(tools);
400
+ const serverPrefix = `mcp__${launch.name}__`;
401
+ const systemPrompt = () => typeof ctx.getSystemPrompt === "function" ? ctx.getSystemPrompt() : "";
402
+ const systemPromptCoversExpectedSurface = () => {
403
+ const prompt = systemPrompt();
404
+ return requiredTools.length > 0
405
+ ? requiredTools.every((tool) => prompt.includes(`${serverPrefix}${tool}`))
406
+ : prompt.includes(serverPrefix);
407
+ };
408
+ const sessionAlreadyReady = () => coversExpectedSurface(getRegisteredToolSnapshot(pi)) ||
409
+ systemPromptCoversExpectedSurface();
410
+ if (sessionAlreadyReady())
411
+ return null;
412
+ if (coversExpectedSurface(getCachedWorkflowMcpProbe(projectRoot)?.tools ?? [])) {
413
+ return null;
414
+ }
415
+ const probe = options.probe ?? probeAndCacheWorkflowMcp;
416
+ const probeTimeoutMs = options.probeTimeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS;
417
+ ctx.ui.setStatus("gsd-step", `Waiting for ${launch.name} MCP server…`);
418
+ let lastError;
419
+ const deadline = Date.now() + (options.timeoutMs ?? MCP_READINESS_TIMEOUT_MS);
420
+ const pollMs = options.pollMs ?? MCP_READINESS_POLL_MS;
421
+ while (Date.now() < deadline) {
422
+ if (sessionAlreadyReady()) {
423
+ ctx.ui.setStatus("gsd-step", "");
424
+ return null;
425
+ }
426
+ const result = await probe(projectRoot, { timeoutMs: probeTimeoutMs });
427
+ if (result.ok && coversExpectedSurface(result.tools)) {
428
+ ctx.ui.setStatus("gsd-step", "");
429
+ return null;
430
+ }
431
+ lastError = result.error;
432
+ await new Promise((r) => setTimeout(r, pollMs));
433
+ }
434
+ ctx.ui.setStatus("gsd-step", "");
435
+ return lastError ? { server: launch.name, error: lastError } : { server: launch.name };
436
+ }
437
+ export const _awaitWorkflowMcpReadinessForTest = awaitWorkflowMcpReadiness;
372
438
  /**
373
439
  * Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
374
440
  * This is the only way the wizard triggers work — everything else is the LLM's job.
@@ -418,6 +484,25 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
418
484
  ctx.ui.notify(compatibilityError, "error");
419
485
  return;
420
486
  }
487
+ // ── Live MCP readiness gate ────────────────────────────────────────
488
+ // Units with required workflow tools must not dispatch until the MCP
489
+ // surface covers that exact contract; otherwise the model can race into
490
+ // "No such tool available" before recovery sees a clean readiness error.
491
+ warmWorkflowMcpProbeInBackground(projectRoot);
492
+ const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
493
+ const strictBlocking = requiredWorkflowTools.length > 0
494
+ && (process.env.GSD_GUIDED_MCP_BLOCKING ?? "").trim() !== "0";
495
+ if (strictBlocking) {
496
+ // If the workflow MCP server is configured but still connecting, wait
497
+ // for it instead of dispatching into a child session that will abort.
498
+ const readinessFailure = await awaitWorkflowMcpReadiness(pi, ctx, projectRoot, { unitType });
499
+ if (readinessFailure) {
500
+ const detail = readinessFailure.error ? ` ${readinessFailure.error}` : "";
501
+ ctx.ui.notify(`GSD workflow server "${readinessFailure.server}" did not connect in time.${detail} ` +
502
+ `Run \`/gsd mcp check ${readinessFailure.server}\` for details.`, "warning");
503
+ return;
504
+ }
505
+ }
421
506
  }
422
507
  // Scope tools for guided workflow turns (#2949, token-consumption savings).
423
508
  // Providers with grammar-based constrained decoding (xAI/Grok) return
@@ -1300,6 +1385,7 @@ async function handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneT
1300
1385
  }
1301
1386
  export async function showSmartEntry(ctx, pi, basePath, options) {
1302
1387
  const stepMode = options?.step ?? true;
1388
+ warmWorkflowMcpProbeInBackground(basePath);
1303
1389
  // ── Clear stale milestone ID reservations from previous cancelled sessions ──
1304
1390
  // Reservations only need to survive within a single /gsd interaction.
1305
1391
  // Without this, each cancelled session permanently bumps the next ID. (#2488)
@@ -1,7 +1,7 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Always-on ambient health signal rendered below the editor.
3
3
  import { runProviderChecks, summariseProviderIssues } from "./doctor-providers.js";
4
- import { runEnvironmentChecks } from "./doctor-environment.js";
4
+ import { runEnvironmentChecks, runEnvironmentChecksAsync } from "./doctor-environment.js";
5
5
  import { loadEffectiveGSDPreferences } from "./preferences.js";
6
6
  import { nativeIsRepo, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeCommitSubject } from "./native-git-bridge.js";
7
7
  import { loadLedgerFromDisk, getProjectTotals } from "./metrics.js";
@@ -9,7 +9,28 @@ import { projectRoot } from "./commands/context.js";
9
9
  import { buildHealthLines, detectHealthWidgetProjectState, } from "./health-widget-core.js";
10
10
  export const HEALTH_WIDGET_ACTIVE_HINTS = " /gsd auto to run · /gsd status to inspect · /gsd report for snapshots · /gsd notifications for history · /gsd help";
11
11
  // ── Data loader ────────────────────────────────────────────────────────────────
12
- function loadHealthWidgetData(basePath) {
12
+ // Last-commit lookup is subprocess-backed (native-git-bridge → git spawns),
13
+ // so it is treated like the other expensive checks: skipped on first paint,
14
+ // run only by the background refresh.
15
+ function loadLastCommitInfo(basePath) {
16
+ try {
17
+ if (nativeIsRepo(basePath)) {
18
+ const branch = nativeGetCurrentBranch(basePath);
19
+ const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
20
+ if (epoch > 0) {
21
+ return { epoch, message: nativeCommitSubject(basePath, branch || "HEAD") || null };
22
+ }
23
+ }
24
+ }
25
+ catch { /* non-fatal */ }
26
+ return { epoch: null, message: null };
27
+ }
28
+ function loadHealthWidgetData(basePath, options) {
29
+ // `includeChecks` gates the expensive subprocess-backed checks (provider +
30
+ // environment doctor: `lsof`, `docker`, `node --version`, ...). The initial
31
+ // synchronous render passes `false` so first paint is never blocked on them;
32
+ // the async refresh (off the first-paint path) runs the full suite.
33
+ const includeChecks = options?.includeChecks ?? true;
13
34
  let budgetCeiling;
14
35
  let budgetSpent = 0;
15
36
  let providerIssue = null;
@@ -28,13 +49,57 @@ function loadHealthWidgetData(basePath) {
28
49
  }
29
50
  }
30
51
  catch { /* non-fatal */ }
52
+ if (includeChecks) {
53
+ try {
54
+ const providerResults = runProviderChecks();
55
+ providerIssue = summariseProviderIssues(providerResults);
56
+ }
57
+ catch { /* non-fatal */ }
58
+ try {
59
+ const envResults = runEnvironmentChecks(basePath);
60
+ for (const r of envResults) {
61
+ if (r.status === "error")
62
+ environmentErrorCount++;
63
+ else if (r.status === "warning")
64
+ environmentWarningCount++;
65
+ }
66
+ }
67
+ catch { /* non-fatal */ }
68
+ }
69
+ // ── Last commit info ── (git spawns — gated like the other expensive checks)
70
+ if (includeChecks) {
71
+ const commit = loadLastCommitInfo(basePath);
72
+ lastCommitEpoch = commit.epoch;
73
+ lastCommitMessage = commit.message;
74
+ }
75
+ return {
76
+ projectState,
77
+ budgetCeiling,
78
+ budgetSpent,
79
+ providerIssue,
80
+ environmentErrorCount,
81
+ environmentWarningCount,
82
+ lastCommitEpoch,
83
+ lastCommitMessage,
84
+ lastRefreshed: Date.now(),
85
+ };
86
+ }
87
+ // Non-blocking variant used by the widget's background refresh: the cheap fields
88
+ // come from the synchronous snapshot, then provider + environment checks are
89
+ // layered in off the event-loop critical path (env checks run concurrently via
90
+ // runEnvironmentChecksAsync). Keeps the always-on widget from stalling the UI on
91
+ // its initial enrichment or its 60s refresh.
92
+ async function loadHealthWidgetDataAsync(basePath) {
93
+ const data = loadHealthWidgetData(basePath, { includeChecks: false });
94
+ let providerIssue = data.providerIssue;
95
+ let environmentErrorCount = 0;
96
+ let environmentWarningCount = 0;
31
97
  try {
32
- const providerResults = runProviderChecks();
33
- providerIssue = summariseProviderIssues(providerResults);
98
+ providerIssue = summariseProviderIssues(runProviderChecks());
34
99
  }
35
100
  catch { /* non-fatal */ }
36
101
  try {
37
- const envResults = runEnvironmentChecks(basePath);
102
+ const envResults = await runEnvironmentChecksAsync(basePath);
38
103
  for (const r of envResults) {
39
104
  if (r.status === "error")
40
105
  environmentErrorCount++;
@@ -43,27 +108,14 @@ function loadHealthWidgetData(basePath) {
43
108
  }
44
109
  }
45
110
  catch { /* non-fatal */ }
46
- // ── Last commit info ──
47
- try {
48
- if (nativeIsRepo(basePath)) {
49
- const branch = nativeGetCurrentBranch(basePath);
50
- const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
51
- if (epoch > 0) {
52
- lastCommitEpoch = epoch;
53
- lastCommitMessage = nativeCommitSubject(basePath, branch || "HEAD") || null;
54
- }
55
- }
56
- }
57
- catch { /* non-fatal */ }
111
+ const commit = loadLastCommitInfo(basePath);
58
112
  return {
59
- projectState,
60
- budgetCeiling,
61
- budgetSpent,
113
+ ...data,
62
114
  providerIssue,
63
115
  environmentErrorCount,
64
116
  environmentWarningCount,
65
- lastCommitEpoch,
66
- lastCommitMessage,
117
+ lastCommitEpoch: commit.epoch,
118
+ lastCommitMessage: commit.message,
67
119
  lastRefreshed: Date.now(),
68
120
  };
69
121
  }
@@ -77,8 +129,13 @@ export function initHealthWidget(ctx) {
77
129
  if (!ctx.hasUI)
78
130
  return;
79
131
  const basePath = projectRoot();
80
- // String-array fallback — used in RPC mode (factory is a no-op there)
81
- const initialData = loadHealthWidgetData(basePath);
132
+ // String-array fallback — used in RPC mode (factory is a no-op there).
133
+ // Skip the expensive provider/environment doctor checks here: this runs
134
+ // synchronously on the interactive-startup path, where running them would
135
+ // block first paint by ~0.9s (lsof/docker probes, otherwise run again
136
+ // immediately by the factory below). The factory's async refresh fills in
137
+ // real health once the screen is up.
138
+ const initialData = loadHealthWidgetData(basePath, { includeChecks: false });
82
139
  ctx.ui.setWidget("gsd-health", buildHealthLines(initialData), { placement: "belowEditor" });
83
140
  // Factory-based widget for TUI mode — replaces the string-array above
84
141
  ctx.ui.setWidget("gsd-health", (_tui, _theme) => {
@@ -91,7 +148,7 @@ export function initHealthWidget(ctx) {
91
148
  return;
92
149
  refreshInFlight = true;
93
150
  try {
94
- data = loadHealthWidgetData(basePath);
151
+ data = await loadHealthWidgetDataAsync(basePath);
95
152
  cachedLines = undefined;
96
153
  if (!isDisposed)
97
154
  _tui.requestRender();
@@ -101,9 +158,11 @@ export function initHealthWidget(ctx) {
101
158
  refreshInFlight = false;
102
159
  }
103
160
  };
104
- // Fire first enrichment immediately. requestRender() inside is a no-op
105
- // if the widget has not yet rendered, so this is safe before factory return.
106
- void refresh();
161
+ // Fire the first full enrichment off the first-paint path. setTimeout(0)
162
+ // yields to the initial render + input loop, so the expensive doctor checks
163
+ // (provider + environment) never delay the moment the user sees the UI.
164
+ // requestRender() inside refresh repaints the widget once data is ready.
165
+ setTimeout(() => { void refresh(); }, 0);
107
166
  const refreshTimer = setInterval(() => {
108
167
  void refresh();
109
168
  }, REFRESH_INTERVAL_MS);
@@ -0,0 +1,10 @@
1
+ // mcp-bridge.ts — stable runtime seam for MCP server consumption (phase 1).
2
+ export { loadWriteGateSnapshot, shouldBlockPendingGateInSnapshot, shouldBlockQueueExecutionInSnapshot, } from "./bootstrap/write-gate.js";
3
+ export { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
4
+ export { _getAdapter, checkpointDatabase, closeDatabase, getAllMilestones, getDb, getGateResults, getMilestoneSlices, getPendingGates, getSliceTasks, insertDecision, insertMilestone, insertSlice, openDatabase, upsertMilestonePlanning, } from "./gsd-db.js";
5
+ export { invalidateStateCache, isReusableGhostMilestone } from "./state.js";
6
+ export { loadEffectiveGSDPreferences } from "./preferences.js";
7
+ export { saveDecisionToDb, saveRequirementToDb, updateRequirementInDb, } from "./db-writer.js";
8
+ export { rebuildState } from "./doctor.js";
9
+ export { queryJournal } from "./journal.js";
10
+ export { claimReservedId, findMilestoneIds, getReservedMilestoneIds, milestoneIdSort, nextMilestoneId, } from "./milestone-ids.js";
@@ -3,7 +3,7 @@
3
3
  // Phase 4 companion to memory-store.ts. Edges live in the `memory_relations`
4
4
  // table and are created by (a) explicit LINK actions emitted by the memory
5
5
  // extractor, or (b) future `/gsd memory link` CLI commands. All writes go
6
- // through the single-writer gate in `gsd-db.ts`.
6
+ // through typed writer wrappers re-exported by `gsd-db.ts`.
7
7
  import { _getAdapter, deleteMemoryRelationsFor, insertMemoryRelationRow, isDbAvailable, } from "./gsd-db.js";
8
8
  export const VALID_RELATIONS = [
9
9
  "related_to",
@@ -43,8 +43,8 @@ export function evaluateAllCompleteSettlement(input) {
43
43
  reason: "merge-pending",
44
44
  action: "pause",
45
45
  message: `Milestone ${milestoneId} is complete, but its worktree branch has not been merged to main. ` +
46
- `Retry with \`/gsd dispatch complete-milestone ${milestoneId}\` or merge manually.`,
47
- nextAction: `Retry \`/gsd dispatch complete-milestone ${milestoneId}\` or merge manually.`,
46
+ `Retry with \`/gsd dispatch complete-milestone ${milestoneId}\` to finish the system-owned merge.`,
47
+ nextAction: `Retry \`/gsd dispatch complete-milestone ${milestoneId}\`.`,
48
48
  milestoneId,
49
49
  };
50
50
  }
@@ -2,31 +2,36 @@
2
2
  // Cross-platform desktop notifications for auto-mode events.
3
3
  import { execFileSync } from "node:child_process";
4
4
  import { loadEffectiveGSDPreferences } from "./preferences.js";
5
- import { sendRemoteNotification } from "../remote-questions/notify.js";
5
+ import { sendRemoteNotification as _sendRemoteNotification } from "../remote-questions/notify.js";
6
+ /** Swappable dispatcher for remote notifications — exported so tests can mock it. */
7
+ export const remoteNotificationDispatcher = {
8
+ send: _sendRemoteNotification,
9
+ };
6
10
  /**
7
11
  * Send a native desktop notification. Non-blocking, non-fatal.
8
12
  * macOS: osascript, Linux: notify-send, Windows: skipped.
9
13
  */
10
- export function sendDesktopNotification(title, message, level = "info", kind = "complete", projectName) {
14
+ export function sendDesktopNotification(title, message, level = "info", kind = "complete", projectName, deps = {}) {
11
15
  // When a projectName is provided and the title is the default "GSD",
12
16
  // replace it with a project-qualified title for multi-project clarity.
13
17
  if (projectName && title === "GSD") {
14
18
  title = formatNotificationTitle(projectName);
15
19
  }
16
- const loaded = loadEffectiveGSDPreferences()?.preferences;
20
+ const loadedPreferences = loadEffectiveGSDPreferences()?.preferences;
21
+ const notifications = deps.notifications ?? loadedPreferences?.notifications;
17
22
  // Remote notifications fire independently of desktop preferences.
18
23
  // sendRemoteNotification handles "not configured" gracefully (early return).
19
- void sendRemoteNotification(title, message).catch(() => { });
20
- if (!shouldSendDesktopNotification(kind, loaded?.notifications))
24
+ void remoteNotificationDispatcher.send(title, message).catch(() => { });
25
+ if (!shouldSendDesktopNotification(kind, notifications))
21
26
  return;
22
27
  // cmux delivery and desktop delivery are independent — if cmux import or
23
28
  // delivery fails, we must still attempt the native desktop notification.
24
29
  const runCmux = async () => {
25
30
  try {
26
31
  const { CmuxClient, emitOsc777Notification, resolveCmuxConfig } = await import("../cmux/index.js");
27
- const cmux = resolveCmuxConfig(loaded);
32
+ const cmux = resolveCmuxConfig(loadedPreferences);
28
33
  if (cmux.notifications) {
29
- const delivered = CmuxClient.fromPreferences(loaded).notify(title, message);
34
+ const delivered = CmuxClient.fromPreferences(loadedPreferences).notify(title, message);
30
35
  if (delivered)
31
36
  return true;
32
37
  emitOsc777Notification(title, message);
@@ -74,8 +74,9 @@ function resolveWinningPhase(models, chain) {
74
74
  * - Legacy: `planning: claude-opus-4-6`
75
75
  * - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
76
76
  */
77
- export function resolveModelWithFallbacksForUnit(unitType) {
78
- const prefs = loadEffectiveGSDPreferences(undefined, { availableModelIds: [] });
77
+ export function resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds) {
78
+ const loadOpts = availableModelIds !== undefined ? { availableModelIds } : undefined;
79
+ const prefs = loadEffectiveGSDPreferences(basePath, loadOpts);
79
80
  const chain = phaseChainForUnit(unitType);
80
81
  if (!chain)
81
82
  return undefined;
@@ -119,8 +120,9 @@ export function resolveModelWithFallbacksForUnit(unitType) {
119
120
  * floor. Session level, defaults, the floor, and capability clamping are NOT
120
121
  * applied here.
121
122
  */
122
- export function resolveThinkingLevelForUnit(unitType) {
123
- const prefs = loadEffectiveGSDPreferences(undefined, { availableModelIds: [] })?.preferences;
123
+ export function resolveThinkingLevelForUnit(unitType, basePath, availableModelIds) {
124
+ const loadOpts = availableModelIds !== undefined ? { availableModelIds } : undefined;
125
+ const prefs = loadEffectiveGSDPreferences(basePath, loadOpts)?.preferences;
124
126
  if (!prefs)
125
127
  return undefined;
126
128
  const chain = phaseChainForUnit(unitType);
@@ -162,8 +164,9 @@ export function resolveThinkingLevelForUnit(unitType) {
162
164
  * Returns `{ provider, id }` or `undefined` if no model preference is
163
165
  * configured.
164
166
  */
165
- export function resolveDefaultSessionModel(sessionProvider, basePath) {
166
- const prefs = loadEffectiveGSDPreferences(basePath, { availableModelIds: [] });
167
+ export function resolveDefaultSessionModel(sessionProvider, basePath, availableModelIds) {
168
+ const loadOpts = availableModelIds !== undefined ? { availableModelIds } : undefined;
169
+ const prefs = loadEffectiveGSDPreferences(basePath, loadOpts);
167
170
  const models = prefs?.preferences?.models;
168
171
  if (!models)
169
172
  return undefined;
@@ -377,7 +380,9 @@ export function resolveAutoSupervisorConfig() {
377
380
  };
378
381
  }
379
382
  // ─── Token Profile Resolution ─────────────────────────────────────────────
380
- const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
383
+ export const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
384
+ /** D046: balanced is the implicit profile when `token_profile` is omitted. */
385
+ export const DEFAULT_TOKEN_PROFILE = "balanced";
381
386
  /**
382
387
  * Per-phase tier intentions for each token profile.
383
388
  * Profiles express capability tiers, not model IDs. Concrete model
@@ -421,8 +426,11 @@ const PROFILE_TIER_MAP = {
421
426
  *
422
427
  * Model IDs are resolved from capability tiers, not hardcoded to any
423
428
  * provider. When available models are known (runtime), the resolver picks
424
- * the best match across all configured providers. When not known (e.g.,
425
- * early startup), falls back to canonical Anthropic model IDs.
429
+ * the best match on the anchor provider (session / auto-start model). Callers
430
+ * scope the available-model list via `modelIdsForProfileResolution` so token
431
+ * profiles do not hop to a cheaper provider (e.g. Gemini Flash) when the user
432
+ * is working on OpenAI or Anthropic. When not known (e.g., early startup),
433
+ * falls back to canonical Anthropic model IDs.
426
434
  *
427
435
  * @param profile The token profile to resolve
428
436
  * @param availableModelIds Optional list of available model IDs for cross-provider resolution.
@@ -16,7 +16,7 @@ import { gsdRoot } from "./paths.js";
16
16
  import { parse as parseYaml } from "yaml";
17
17
  import { normalizeStringArray } from "../shared/format-utils.js";
18
18
  import { logWarning } from "./workflow-logger.js";
19
- import { resolveProfileDefaults as _resolveProfileDefaults } from "./preferences-models.js";
19
+ import { DEFAULT_TOKEN_PROFILE, resolveProfileDefaults as _resolveProfileDefaults, VALID_TOKEN_PROFILES, resolveDisabledModelProvidersFromPreferences, } from "./preferences-models.js";
20
20
  import { nativeHasCommittedHead, nativeIsRepo } from "./native-git-bridge.js";
21
21
  import { KNOWN_PREFERENCE_KEYS, MODE_DEFAULTS, formatSkillRef, } from "./preferences-types.js";
22
22
  import { validatePreferences } from "./preferences-validation.js";
@@ -67,6 +67,74 @@ export function getLegacyGlobalGSDPreferencesPath() {
67
67
  export function getProjectGSDPreferencesPath(basePath) {
68
68
  return projectPreferencesPath(basePath);
69
69
  }
70
+ /** Format registry models the same way tier resolution and prefs persistence use. */
71
+ export function availableModelIdsFromRegistry(registry) {
72
+ return registry.getAvailable().map((m) => `${m.provider}/${m.id}`);
73
+ }
74
+ /**
75
+ * Keep only provider-qualified model IDs for a single provider (case-insensitive).
76
+ * Bare IDs are excluded — tier resolution requires provider/model form.
77
+ */
78
+ export function restrictModelIdsToProvider(modelIds, provider) {
79
+ const normalized = provider.trim().toLowerCase();
80
+ if (!normalized)
81
+ return modelIds;
82
+ return modelIds.filter((id) => {
83
+ const slash = id.indexOf("/");
84
+ if (slash <= 0)
85
+ return false;
86
+ return id.slice(0, slash).toLowerCase() === normalized;
87
+ });
88
+ }
89
+ /**
90
+ * Model IDs for token-profile tier resolution. When an anchor provider is known
91
+ * (session model / auto-start snapshot), stay on that provider instead of picking
92
+ * the globally cheapest tier match across every logged-in provider (e.g. Gemini
93
+ * Flash beating GPT mini on cost).
94
+ */
95
+ export function modelIdsForProfileResolution(registry, anchorProvider, disabledProviders) {
96
+ let all = availableModelIdsFromRegistry(registry);
97
+ if (disabledProviders?.length) {
98
+ const blocked = new Set(disabledProviders.map((p) => p.trim().toLowerCase()).filter((p) => p.length > 0));
99
+ all = all.filter((id) => {
100
+ const slash = id.indexOf("/");
101
+ if (slash <= 0)
102
+ return true;
103
+ return !blocked.has(id.slice(0, slash).toLowerCase());
104
+ });
105
+ }
106
+ if (all.length === 0)
107
+ return undefined;
108
+ if (!anchorProvider?.trim())
109
+ return all;
110
+ // Stay on the anchor provider — do not fall back to the full registry when the
111
+ // scoped list is empty (that reintroduces cross-provider cost picks like Gemini).
112
+ return restrictModelIdsToProvider(all, anchorProvider);
113
+ }
114
+ /** Provider anchor for token-profile tier resolution (auto-start model wins). */
115
+ export function resolveProfileAnchorProvider(sessionProvider, autoModeStartProvider) {
116
+ const start = autoModeStartProvider?.trim();
117
+ if (start)
118
+ return start;
119
+ const session = sessionProvider?.trim();
120
+ return session || undefined;
121
+ }
122
+ /**
123
+ * Load effective preferences with token-profile tiers resolved against models
124
+ * the user can actually call (from the live registry), not canonical Anthropic
125
+ * fallbacks.
126
+ */
127
+ export function loadEffectiveGSDPreferencesWithRegistry(registry, basePath, anchorProvider) {
128
+ if (!registry) {
129
+ return loadEffectiveGSDPreferences(basePath);
130
+ }
131
+ const disabledProviders = resolveDisabledModelProvidersFromPreferences();
132
+ const availableModelIds = modelIdsForProfileResolution(registry, anchorProvider, disabledProviders);
133
+ if (!availableModelIds) {
134
+ return loadEffectiveGSDPreferences(basePath);
135
+ }
136
+ return loadEffectiveGSDPreferences(basePath, { availableModelIds });
137
+ }
70
138
  /**
71
139
  * Normalize a value loaded from disk (or passed from another component) into
72
140
  * a plain, mutable bare preferences object.
@@ -138,12 +206,24 @@ export function loadEffectiveGSDPreferences(basePath, opts) {
138
206
  // Apply token-profile defaults as the lowest-priority layer so that
139
207
  // `token_profile: budget` sets models and phase-skips automatically.
140
208
  // Explicit user preferences always override profile defaults.
141
- const profile = result.preferences.token_profile;
142
- if (profile) {
143
- const profileDefaults = _resolveProfileDefaults(profile, opts?.availableModelIds, result.preferences.dynamic_routing);
209
+ const explicitProfile = result.preferences.token_profile;
210
+ let profileForDefaults;
211
+ if (explicitProfile) {
212
+ if (VALID_TOKEN_PROFILES.has(explicitProfile)) {
213
+ profileForDefaults = explicitProfile;
214
+ }
215
+ }
216
+ else {
217
+ profileForDefaults = DEFAULT_TOKEN_PROFILE;
218
+ }
219
+ if (profileForDefaults) {
220
+ const profileDefaults = _resolveProfileDefaults(profileForDefaults, opts?.availableModelIds, result.preferences.dynamic_routing);
221
+ const defaultsToApply = explicitProfile
222
+ ? profileDefaults
223
+ : withoutProfilePhaseDefaults(profileDefaults);
144
224
  result = {
145
225
  ...result,
146
- preferences: mergePreferences(profileDefaults, result.preferences),
226
+ preferences: mergePreferences(defaultsToApply, result.preferences),
147
227
  };
148
228
  }
149
229
  // Apply mode defaults as the lowest-priority layer
@@ -156,6 +236,12 @@ export function loadEffectiveGSDPreferences(basePath, opts) {
156
236
  result = stripInheritedPlanningDepth(result, projectHasPlanningDepth);
157
237
  return result;
158
238
  }
239
+ function withoutProfilePhaseDefaults(defaults) {
240
+ if (defaults.phases === undefined)
241
+ return defaults;
242
+ const { phases: _phases, ...rest } = defaults;
243
+ return rest;
244
+ }
159
245
  function mergePreferenceMetadata(primary, secondary) {
160
246
  const mergedWarnings = [
161
247
  ...(primary.warnings ?? []),
@@ -12,6 +12,10 @@ If any inlined plan, summary, verification command, or prior artifact names an a
12
12
 
13
13
  All slices are complete. Verify the integrated work, persist milestone completion, refresh project state, and write the final record future milestones will rely on.
14
14
 
15
+ ### Closeout messaging (auto-mode)
16
+
17
+ You write closeout artifacts; **GSD auto-mode** decides when the milestone is actually **done**. Never say "Milestone {{milestoneId}} is complete" or "Milestone {{milestoneId}} complete." in this unit — not even after `gsd_complete_milestone` succeeds. GSD announces completion only after post-unit verification passes.
18
+
15
19
  Preloaded context includes roadmap, requirements, decisions, project context, and compact slice-summary excerpts. Slice summaries are excerpts, not full files: use them first, then selectively read full SUMMARY.md files listed under "On-demand Slice Summaries" only when section headings indicate needed evidence for LEARNINGS, Decision Re-evaluation, deviations, limitations, or cross-slice narrative.
16
20
 
17
21
  Start with what the excerpts give you. Read full files when the section heads signal richer context you need.
@@ -31,7 +35,9 @@ Subagents report only; they do not write user source. Fold any findings into Dec
31
35
 
32
36
  ## Steps
33
37
 
34
- 1. **Duplicate completion guard:** Call `gsd_milestone_status` for `{{milestoneId}}` before any durable writes. If the returned milestone **status is `complete`**, this is a stale or duplicate closeout turn: do NOT mutate requirements, do NOT refresh the project document, do NOT write LEARNINGS, and do NOT persist milestone completion again. Say: "Milestone {{milestoneId}} is already complete." and stop.
38
+ 1. **Duplicate completion guard:** Call `gsd_milestone_status` for `{{milestoneId}}` before any durable writes. If the returned milestone **status is `complete`**:
39
+ - **Verification-retry turn** (prompt begins with `VERIFICATION FAILED`): do NOT stop or declare completion. Repair the closeout evidence in the failure context. Skip step 13 if the milestone is already complete in the DB.
40
+ - **Otherwise** (stale duplicate closeout): do NOT mutate requirements, do NOT refresh the project document, do NOT write LEARNINGS, and do NOT persist milestone completion again. Say: "Milestone {{milestoneId}} closeout already recorded." and stop.
35
41
  2. Use the **Milestone Summary** output template from the inlined context above
36
42
  3. {{skillActivation}}
37
43
  4. **Verify code changes exist.** Compare milestone work against the integration branch (`main`, `master`, or recorded branch), using merge-base as older revision and `HEAD` as newer. If the diff lists non-`.gsd/` files, pass. If `HEAD` equals the integration branch/merge-base, treat it as a self-diff retry: inspect milestone-scoped commit evidence (`GSD-Unit: {{milestoneId}}` or production `GSD-Task: Sxx/Tyy` trailers touching `.gsd/milestones/{{milestoneId}}/`) and verify those commits touched non-`.gsd/` files. Record **verification failure** only when neither source shows implementation files.
@@ -84,7 +90,7 @@ Subagents report only; they do not write user source. Fold any findings into Dec
84
90
  - `deviations` (string) — Deviations from the original plan
85
91
 
86
92
  14. Do not commit manually — the system auto-commits your changes after this unit completes.
87
- - After `gsd_complete_milestone` succeeds, emit only one closeout line: "Milestone {{milestoneId}} complete." Do not add a second final-status block, repeat the tool result, or restate the closeout summary.
93
+ - After `gsd_complete_milestone` succeeds, emit only one closeout line: "Milestone {{milestoneId}} closeout submitted." Do not say the milestone is complete, do not add a second final-status block, repeat the tool result, or restate the closeout summary.
88
94
 
89
95
  **Important:** Do NOT skip code-change, success-criteria, or definition-of-done verification (steps 4-6). The summary must reflect verified outcomes. Verification failures block completion; there is no override. If a verification tool fails, errors, or returns unexpected output, treat it as failure.
90
96
 
@@ -12,6 +12,10 @@ If any inlined plan, summary, verification command, or prior artifact names an a
12
12
 
13
13
  You are the closer: verify assembled task work delivers the slice goal, then compress it into a downstream-ready summary and UAT.
14
14
 
15
+ ### Closeout messaging (auto-mode)
16
+
17
+ You write closeout artifacts; **GSD auto-mode** decides when the slice is actually **done**. Never say "Slice {{sliceId}} complete" in this unit — not even after `gsd_slice_complete` succeeds. GSD announces completion only after post-unit verification passes.
18
+
15
19
  {{inlinedContext}}
16
20
 
17
21
  {{gatesToClose}}
@@ -38,7 +42,7 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
38
42
  10. Prepare `gsd_slice_complete` content with camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`.
39
43
  11. Draft concrete UAT with preconditions, steps, expected outcomes, edge cases, and UAT Type. Declare the type as a bullet under a `## UAT Type` heading, exactly like `- UAT mode: browser-executable`.
40
44
  **Web apps:** when inlined Web App UAT guidance is present, declare `browser-executable` or `runtime-executable` (not `artifact-driven`) for localhost/browser/screenshot steps; include dev-server preconditions and name Playwright specs when they exist.
41
- 12. Review the inlined task-summary excerpts for DECISIONS.md/KNOWLEDGE.md-worthy decisions and gotchas. Read full `*-SUMMARY.md` only if needed. Capture with `capture_thought`; do not append knowledge files.
45
+ 12. Review the inlined task-summary excerpts for DECISIONS.md/KNOWLEDGE.md-worthy decisions and gotchas. Read full `*-SUMMARY.md` only if needed. Capture with `gsd_capture_thought` (MCP-scoped `mcp__...__gsd_capture_thought`), not bare `capture_thought`; do not append knowledge files.
42
46
  13. When verification passes, call `gsd_slice_complete`. The DB-backed tool is the canonical write path. Do **not** manually write `{{sliceSummaryPath}}`. Do **not** manually write `{{sliceUatPath}}`. Do not edit roadmap checkboxes.
43
47
  14. Do not run git commands.
44
48
  15. If the current project state needs refresh, call `gsd_summary_save` with `artifact_type: "PROJECT"` and the full updated project markdown as `content`; omit `milestone_id`. Do not write or edit `.gsd/PROJECT.md` directly.
@@ -49,4 +53,4 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
49
53
 
50
54
  **You MUST call `gsd_slice_complete` with summary and UAT content only after verification passes.**
51
55
 
52
- When done, say: "Slice {{sliceId}} complete." Say this exactly once — if you already said it in a prior message, do not repeat it.
56
+ When done, say: "Slice {{sliceId}} closeout submitted." Do not say the slice is complete. Say this exactly once — if you already said it in a prior message, do not repeat it.
@@ -52,6 +52,7 @@ You execute. The inlined task plan is authoritative. Verify referenced files and
52
52
 
53
53
  - If task sections exist for Failure Modes (Q5), Load Profile (Q6), Negative Tests (Q7), or Observability Impact, implement and verify them.
54
54
  - Verify must-haves with concrete commands or observable behavior.
55
+ - Run verification commands through `gsd_exec` / Context Mode evidence when workflow MCP tools are presented. Use `gsd_exec_search` before rerunning noisy checks, and `gsd_resume` after compaction or resume. Do not call direct `bash` for final verification evidence in this unit.
55
56
  - Run slice-level verification from the slice plan. Final tasks need all checks passing; intermediate tasks should record partial passes.
56
57
  - Populate `## Verification Evidence` with `formatEvidenceTable` rows: command, exit code, verdict, duration. If no checks were found, say so.
57
58
  - For UI/browser/DOM/user-visible web changes, exercise the real flow and record explicit checks.
@@ -62,9 +63,13 @@ Keep about **{{verificationBudget}}** for verification and summary. If context i
62
63
 
63
64
  ## Completion Contract
64
65
 
66
+ ### Closeout messaging (auto-mode)
67
+
68
+ You write task closeout artifacts; **GSD auto-mode** decides when the task is actually **done**. Never say "Task {{taskId}} complete" in this unit — not even after `gsd_task_complete` succeeds. GSD announces completion only after post-unit verification passes.
69
+
65
70
  - If the plan is fundamentally invalid, set `blocker_discovered: true` in the summary and explain.
66
71
  - For downstream-impacting ambiguity that cannot be resolved from code, plans, or decisions, include an `escalation` object with question, options, recommendation, rationale, and `continueWithDefault`.
67
- - Capture meaningful architecture/pattern/observability decisions with `capture_thought`; capture non-obvious gotchas or conventions only when they save future investigation.
72
+ - Capture meaningful architecture/pattern/observability decisions with `gsd_capture_thought` (or MCP-scoped `mcp__...__gsd_capture_thought`) when workflow MCP tools are presented; capture non-obvious gotchas or conventions only when they save future investigation.
68
73
  - Use the inlined Task Summary template below. Read `{{taskSummaryTemplatePath}}` only if the inlined template is absent or visibly truncated.
69
74
  - Call `gsd_task_complete` with camelCase fields `milestoneId`, `sliceId`, `taskId`, `oneLiner`, `narrative`, `verification`, and `verificationEvidence`. Include `blockerDiscovered: true` when a stale-path safety failure or other plan-invalidating blocker prevents execution.
70
75
  - The DB-backed tool is the canonical write path. Do **not** manually write `{{taskSummaryPath}}` or edit PLAN.md checkboxes; the tool renders the summary and updates state.
@@ -76,4 +81,4 @@ Keep about **{{verificationBudget}}** for verification and summary. If context i
76
81
 
77
82
  **You MUST call `gsd_task_complete` before finishing, including when the stale-path safety rule stops execution.**
78
83
 
79
- When done, say: "Task {{taskId}} complete." Say this exactly once — if you already said it in a prior message, do not repeat it.
84
+ When done, say: "Task {{taskId}} closeout submitted." Do not say the task is complete. Say this exactly once — if you already said it in a prior message, do not repeat it.