gsd-pi 2.78.1-dev.84a383f51 → 2.78.1

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 (474) hide show
  1. package/README.md +7 -7
  2. package/dist/cli.js +55 -95
  3. package/dist/headless-query.d.ts +0 -22
  4. package/dist/headless-query.js +4 -24
  5. package/dist/headless.d.ts +0 -10
  6. package/dist/headless.js +1 -16
  7. package/dist/loader.js +10 -7
  8. package/dist/onboarding.d.ts +0 -10
  9. package/dist/onboarding.js +2 -2
  10. package/dist/provider-migrations.d.ts +2 -2
  11. package/dist/provider-migrations.js +2 -5
  12. package/dist/resource-loader.d.ts +2 -5
  13. package/dist/resource-loader.js +5 -28
  14. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
  15. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
  16. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +0 -23
  18. package/dist/resources/extensions/gsd/auto/phases.js +2 -2
  19. package/dist/resources/extensions/gsd/auto/run-unit.js +1 -3
  20. package/dist/resources/extensions/gsd/auto/session.js +0 -3
  21. package/dist/resources/extensions/gsd/auto-recovery.js +4 -43
  22. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  23. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  24. package/dist/resources/extensions/gsd/auto-worktree.js +0 -30
  25. package/dist/resources/extensions/gsd/auto.js +5 -14
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -14
  27. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +5 -7
  28. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  29. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +4 -5
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -94
  31. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +6 -11
  32. package/dist/resources/extensions/gsd/bootstrap/system-context.js +8 -34
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +2 -38
  34. package/dist/resources/extensions/gsd/commands/catalog.js +5 -69
  35. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -22
  36. package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -3
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -10
  38. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -4
  40. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +1 -39
  41. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  42. package/dist/resources/extensions/gsd/forensics.js +2 -2
  43. package/dist/resources/extensions/gsd/git-service.js +5 -12
  44. package/dist/resources/extensions/gsd/gsd-db.js +2 -11
  45. package/dist/resources/extensions/gsd/guided-flow.js +23 -23
  46. package/dist/resources/extensions/gsd/memory-store.js +31 -66
  47. package/dist/resources/extensions/gsd/model-router.js +9 -114
  48. package/dist/resources/extensions/gsd/native-git-bridge.js +1 -7
  49. package/dist/resources/extensions/gsd/preferences-models.js +15 -91
  50. package/dist/resources/extensions/gsd/preferences-types.js +0 -2
  51. package/dist/resources/extensions/gsd/preferences-validation.js +0 -32
  52. package/dist/resources/extensions/gsd/preferences.js +3 -5
  53. package/dist/resources/extensions/gsd/prompt-loader.js +12 -23
  54. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -9
  55. package/dist/resources/extensions/gsd/state.js +0 -42
  56. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
  57. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  58. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
  59. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
  60. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +5 -0
  61. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -18
  62. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  63. package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -3
  64. package/dist/resources/extensions/gsd/worktree-command.js +46 -26
  65. package/dist/resources/extensions/mcp-client/index.js +3 -6
  66. package/dist/resources/extensions/slash-commands/create-extension.js +22 -36
  67. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -9
  68. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  69. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  70. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  71. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  72. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  73. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  74. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  75. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
  76. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  77. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  78. package/dist/rtk-shared.d.ts +0 -3
  79. package/dist/rtk-shared.js +0 -17
  80. package/dist/rtk.d.ts +5 -2
  81. package/dist/rtk.js +20 -3
  82. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  83. package/dist/web/standalone/.next/BUILD_ID +1 -1
  84. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  85. package/dist/web/standalone/.next/build-manifest.json +4 -4
  86. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  87. package/dist/web/standalone/.next/react-loadable-manifest.json +4 -44
  88. package/dist/web/standalone/.next/required-server-files.json +3 -3
  89. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  100. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  116. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  128. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  148. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -4
  164. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  184. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/index.html +1 -1
  194. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  196. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  197. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  199. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/page.js +2 -2
  201. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  203. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  204. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  205. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  207. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware.js +2 -2
  209. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  211. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  212. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  213. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  214. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  215. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  216. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +20 -0
  217. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  218. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  219. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +1 -0
  223. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  224. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  225. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  226. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  227. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  228. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  229. package/dist/web/standalone/package.json +1 -2
  230. package/dist/web/standalone/server.js +1 -1
  231. package/package.json +1 -1
  232. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  233. package/packages/mcp-server/dist/workflow-tools.js +46 -74
  234. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  235. package/packages/mcp-server/src/workflow-tools.test.ts +0 -26
  236. package/packages/mcp-server/src/workflow-tools.ts +58 -93
  237. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  238. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  239. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  240. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -48
  241. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  242. package/packages/pi-ai/dist/types.d.ts +0 -13
  243. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  244. package/packages/pi-ai/dist/types.js.map +1 -1
  245. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/utils/repair-tool-json.js +3 -24
  247. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  248. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -26
  249. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  250. package/packages/pi-ai/src/providers/anthropic-shared.ts +20 -52
  251. package/packages/pi-ai/src/types.ts +0 -13
  252. package/packages/pi-ai/src/utils/repair-tool-json.ts +3 -24
  253. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -32
  254. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  255. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/agent-session.js +0 -6
  257. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/messages.js +0 -4
  260. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -19
  262. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -10
  264. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/model-registry.js +0 -18
  266. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +0 -13
  268. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -20
  270. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -14
  274. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  275. package/packages/pi-coding-agent/src/core/agent-session.ts +0 -7
  276. package/packages/pi-coding-agent/src/core/messages.ts +0 -4
  277. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -32
  278. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -21
  279. package/packages/pi-coding-agent/src/core/system-prompt.ts +15 -33
  280. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -17
  281. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  282. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  283. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +3 -17
  284. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  285. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +3 -20
  286. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  287. package/src/resources/extensions/gsd/auto/loop.ts +2 -24
  288. package/src/resources/extensions/gsd/auto/phases.ts +3 -3
  289. package/src/resources/extensions/gsd/auto/run-unit.ts +1 -3
  290. package/src/resources/extensions/gsd/auto/session.ts +0 -3
  291. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  292. package/src/resources/extensions/gsd/auto-recovery.ts +8 -46
  293. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  294. package/src/resources/extensions/gsd/auto-tool-tracking.ts +4 -2
  295. package/src/resources/extensions/gsd/auto-worktree.ts +0 -38
  296. package/src/resources/extensions/gsd/auto.ts +4 -14
  297. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -15
  298. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +7 -8
  299. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  300. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +9 -10
  301. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +31 -102
  302. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +6 -12
  303. package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -39
  304. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +11 -39
  305. package/src/resources/extensions/gsd/commands/catalog.ts +5 -75
  306. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -22
  307. package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -3
  308. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -15
  309. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  310. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -4
  311. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +1 -39
  312. package/src/resources/extensions/gsd/doctor-types.ts +1 -3
  313. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  314. package/src/resources/extensions/gsd/forensics.ts +2 -2
  315. package/src/resources/extensions/gsd/git-service.ts +5 -13
  316. package/src/resources/extensions/gsd/gsd-db.ts +2 -12
  317. package/src/resources/extensions/gsd/guided-flow.ts +25 -25
  318. package/src/resources/extensions/gsd/memory-store.ts +28 -81
  319. package/src/resources/extensions/gsd/model-router.ts +9 -172
  320. package/src/resources/extensions/gsd/native-git-bridge.ts +1 -7
  321. package/src/resources/extensions/gsd/preferences-models.ts +15 -101
  322. package/src/resources/extensions/gsd/preferences-types.ts +0 -6
  323. package/src/resources/extensions/gsd/preferences-validation.ts +0 -35
  324. package/src/resources/extensions/gsd/preferences.ts +2 -16
  325. package/src/resources/extensions/gsd/prompt-loader.ts +12 -26
  326. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -9
  327. package/src/resources/extensions/gsd/state.ts +0 -42
  328. package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
  329. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1 -178
  330. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -58
  331. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +5 -9
  332. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -21
  333. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  334. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +211 -138
  335. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +59 -142
  336. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +4 -7
  337. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +32 -89
  338. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +22 -0
  339. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +23 -41
  340. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +43 -3
  341. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +3 -5
  342. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +87 -22
  343. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +118 -7
  344. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +47 -0
  345. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +60 -18
  346. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +76 -14
  347. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +75 -0
  348. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +83 -22
  349. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +63 -1
  350. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +1 -26
  351. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -30
  352. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +4 -14
  353. package/src/resources/extensions/gsd/tests/health-widget.test.ts +12 -22
  354. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +1 -64
  355. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -22
  356. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +23 -0
  357. package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -128
  358. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +1 -33
  359. package/src/resources/extensions/gsd/tests/model-router.test.ts +8 -169
  360. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +0 -8
  361. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +43 -32
  362. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +10 -4
  363. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -127
  364. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +0 -16
  365. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -7
  366. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  367. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +19 -168
  368. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +1 -7
  369. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -23
  370. package/src/resources/extensions/gsd/tests/token-profile.test.ts +4 -51
  371. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +16 -7
  372. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +7 -5
  373. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -15
  374. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  375. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +0 -15
  376. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -17
  377. package/src/resources/extensions/gsd/unit-context-manifest.ts +8 -8
  378. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  379. package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -3
  380. package/src/resources/extensions/gsd/workflow-logger.ts +0 -1
  381. package/src/resources/extensions/gsd/worktree-command.ts +44 -31
  382. package/src/resources/extensions/mcp-client/index.ts +3 -6
  383. package/src/resources/extensions/slash-commands/create-extension.ts +24 -38
  384. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -9
  385. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  386. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  387. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  388. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  389. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  390. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  391. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  392. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  393. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  394. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
  395. package/dist/cli-policy.d.ts +0 -13
  396. package/dist/cli-policy.js +0 -17
  397. package/dist/resources/.managed-resources-content-hash +0 -1
  398. package/dist/resources/extensions/gsd/auto-runtime-state.js +0 -31
  399. package/dist/resources/extensions/gsd/milestone-id-reservation.js +0 -36
  400. package/dist/resources/extensions/gsd/worktree-session-state.js +0 -33
  401. package/dist/runtime-checks.d.ts +0 -27
  402. package/dist/runtime-checks.js +0 -38
  403. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  404. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +0 -1
  405. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +0 -1
  406. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +0 -1
  407. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +0 -1
  408. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +0 -1
  409. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +0 -10
  410. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +0 -2
  411. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +0 -20
  412. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  413. package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +0 -1
  414. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  415. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  416. package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +0 -1
  417. package/dist/worktree-status-banner.d.ts +0 -1
  418. package/dist/worktree-status-banner.js +0 -132
  419. package/packages/mcp-server/dist/alias-telemetry.d.ts +0 -8
  420. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +0 -1
  421. package/packages/mcp-server/dist/alias-telemetry.js +0 -30
  422. package/packages/mcp-server/dist/alias-telemetry.js.map +0 -1
  423. package/packages/mcp-server/src/alias-telemetry.test.ts +0 -78
  424. package/packages/mcp-server/src/alias-telemetry.ts +0 -30
  425. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +0 -2
  426. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +0 -1
  427. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +0 -231
  428. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +0 -1
  429. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +0 -289
  430. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +0 -37
  431. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +0 -1
  432. package/packages/pi-coding-agent/dist/core/token-telemetry.js +0 -49
  433. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +0 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +0 -2
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +0 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +0 -133
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +0 -1
  438. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +0 -2
  439. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +0 -1
  440. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +0 -78
  441. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +0 -1
  442. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +0 -2
  443. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +0 -1
  444. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +0 -181
  445. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +0 -1
  446. package/packages/pi-coding-agent/src/core/token-telemetry.ts +0 -77
  447. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +0 -212
  448. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +0 -102
  449. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +0 -200
  450. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +0 -2
  451. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +0 -1
  452. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +0 -161
  453. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +0 -1
  454. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +0 -219
  455. package/src/resources/extensions/gsd/auto-runtime-state.ts +0 -51
  456. package/src/resources/extensions/gsd/milestone-id-reservation.ts +0 -47
  457. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +0 -116
  458. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +0 -100
  459. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +0 -93
  460. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +0 -47
  461. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +0 -63
  462. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +0 -81
  463. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +0 -57
  464. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +0 -145
  465. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +0 -124
  466. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +0 -152
  467. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +0 -50
  468. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -93
  469. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +0 -101
  470. package/src/resources/extensions/gsd/worktree-session-state.ts +0 -35
  471. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +0 -91
  472. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +0 -58
  473. /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_buildManifest.js +0 -0
  474. /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_ssgManifest.js +0 -0
@@ -320,8 +320,11 @@ export function getEligibleModels(
320
320
  // Exact match
321
321
  if (availableModelIds.includes(explicitModel)) return [explicitModel];
322
322
  // Provider-prefix-stripped match
323
- const bareExplicit = bareModelId(explicitModel);
324
- const match = availableModelIds.find(id => bareModelId(id) === bareExplicit);
323
+ const match = availableModelIds.find(id => {
324
+ const bareAvail = id.includes("/") ? id.split("/").pop()! : id;
325
+ const bareExplicit = explicitModel.includes("/") ? explicitModel.split("/").pop()! : explicitModel;
326
+ return bareAvail === bareExplicit;
327
+ });
325
328
  if (match) return [match];
326
329
  }
327
330
 
@@ -427,38 +430,12 @@ export function resolveModelForComplexity(
427
430
 
428
431
  // Downgrade-only: if requested tier >= configured tier, no change
429
432
  if (tierOrdinal(requestedTier) >= tierOrdinal(configuredTier)) {
430
- // If the configured primary is directly available, use it
431
- if (isModelAvailable(configuredPrimary, availableModelIds)) {
432
- return {
433
- modelId: configuredPrimary,
434
- fallbacks: phaseConfig.fallbacks,
435
- tier: requestedTier,
436
- wasDowngraded: false,
437
- reason: `tier ${requestedTier} >= configured ${configuredTier}`,
438
- selectionMethod: "tier-only",
439
- };
440
- }
441
-
442
- // Configured primary is unavailable (e.g. Anthropic model configured but
443
- // running on a non-Anthropic provider). Find the best available model at
444
- // the same capability tier so routing still works cross-provider.
445
- const crossProviderEquivalent = findModelForTier(
446
- configuredTier,
447
- routingConfig,
448
- availableModelIds,
449
- routingConfig.cross_provider !== false,
450
- );
451
-
452
433
  return {
453
- modelId: crossProviderEquivalent ?? configuredPrimary,
454
- fallbacks: crossProviderEquivalent
455
- ? [...phaseConfig.fallbacks.filter(f => f !== crossProviderEquivalent), configuredPrimary]
456
- : phaseConfig.fallbacks,
434
+ modelId: configuredPrimary,
435
+ fallbacks: phaseConfig.fallbacks,
457
436
  tier: requestedTier,
458
437
  wasDowngraded: false,
459
- reason: crossProviderEquivalent
460
- ? `cross-provider ${configuredTier}-tier equivalent`
461
- : `tier ${requestedTier} >= configured ${configuredTier}`,
438
+ reason: `tier ${requestedTier} >= configured ${configuredTier}`,
462
439
  selectionMethod: "tier-only",
463
440
  };
464
441
  }
@@ -542,131 +519,8 @@ export function defaultRoutingConfig(): DynamicRoutingConfig {
542
519
  };
543
520
  }
544
521
 
545
- // ─── Tier-Based Model Resolution (for profile defaults) ─────────────────────
546
-
547
- /**
548
- * Fallback-only canonical model IDs per tier. Returned when the
549
- * available-model list is empty (e.g., preferences are loaded before the
550
- * model registry is populated at bootstrap), or when a non-empty registry has
551
- * no model at the requested tier.
552
- *
553
- * Precedence (resolveModelForTier):
554
- * 1. configured `tier_models[tier]` (via getEligibleModels) — exact/bare match
555
- * 2. cheapest available model whose tier matches `tier`
556
- * 3. CANONICAL_TIER_MODELS[tier] as last-resort fallback
557
- */
558
- const CANONICAL_TIER_MODELS: Record<ComplexityTier, string> = {
559
- light: "claude-haiku-4-5",
560
- standard: "claude-sonnet-4-6",
561
- heavy: "claude-opus-4-6",
562
- };
563
-
564
- export function canonicalModelForTier(tier: ComplexityTier): string {
565
- return CANONICAL_TIER_MODELS[tier];
566
- }
567
-
568
- /**
569
- * Single source of truth for tier-based model selection.
570
- * Returns the cheapest available model whose capability tier matches `tier`,
571
- * honoring `routingConfig.tier_models[tier]` when set. Returns undefined when
572
- * no available model matches the tier.
573
- *
574
- * `crossProvider`: when false, restricts the search to models that share the
575
- * canonical (Anthropic) provider for the tier. When true, any provider is
576
- * eligible.
577
- */
578
- function findModelForTier(
579
- tier: ComplexityTier,
580
- routingConfig: DynamicRoutingConfig,
581
- availableModelIds: string[],
582
- crossProvider: boolean,
583
- ): string | undefined {
584
- const eligible = getEligibleModels(tier, availableModelIds, routingConfig);
585
- if (eligible.length === 0) return undefined;
586
-
587
- if (crossProvider) {
588
- return eligible[0];
589
- }
590
-
591
- // Same-provider only: keep models whose bare ID matches a canonical
592
- // Anthropic ID at this tier (i.e., a claude-* model in the tier map).
593
- const sameProvider = eligible.filter(id => {
594
- const bare = bareModelId(id);
595
- return MODEL_CAPABILITY_TIER[bare] === tier && bare.startsWith("claude-");
596
- });
597
- return sameProvider[0];
598
- }
599
-
600
- /**
601
- * Resolve a concrete model ID for a given capability tier using the
602
- * available model list. Provider-agnostic: picks the best available
603
- * model at the requested tier.
604
- *
605
- * Precedence:
606
- * 1. configured `tier_models[tier]`, if provided and available
607
- * 2. tier-matching model from any provider in `availableModelIds`
608
- * 3. canonical Anthropic ID as a fallback only when nothing else matches
609
- * (or `availableModelIds` is empty, e.g., during early bootstrap)
610
- *
611
- * @param tier The capability tier to resolve
612
- * @param availableModelIds List of available model IDs (REQUIRED for
613
- * provider-agnostic resolution; pass [] only when
614
- * the model registry is genuinely unavailable)
615
- * @param routingConfig Optional routing config, or legacy crossProvider boolean
616
- * @param crossProvider Whether to consider models from other providers
617
- */
618
- export function resolveModelForTier(
619
- tier: ComplexityTier,
620
- availableModelIds: string[],
621
- crossProvider?: boolean,
622
- ): string;
623
- export function resolveModelForTier(
624
- tier: ComplexityTier,
625
- availableModelIds: string[],
626
- routingConfig?: DynamicRoutingConfig,
627
- crossProvider?: boolean,
628
- ): string;
629
- export function resolveModelForTier(
630
- tier: ComplexityTier,
631
- availableModelIds: string[],
632
- routingConfigOrCrossProvider: DynamicRoutingConfig | boolean = defaultRoutingConfig(),
633
- crossProvider?: boolean,
634
- ): string {
635
- const routingConfig = typeof routingConfigOrCrossProvider === "boolean"
636
- ? defaultRoutingConfig()
637
- : { ...defaultRoutingConfig(), ...routingConfigOrCrossProvider };
638
- const allowCrossProvider = typeof routingConfigOrCrossProvider === "boolean"
639
- ? routingConfigOrCrossProvider
640
- : crossProvider ?? routingConfig.cross_provider !== false;
641
-
642
- // No available models known — return canonical fallback
643
- if (availableModelIds.length === 0) {
644
- return canonicalModelForTier(tier);
645
- }
646
-
647
- // Cross-provider tier search
648
- const resolved = findModelForTier(tier, routingConfig, availableModelIds, allowCrossProvider);
649
- return resolved
650
- ? normalizeResolvedTierModelId(resolved, tier, routingConfig)
651
- : canonicalModelForTier(tier);
652
- }
653
-
654
522
  // ─── Internal ────────────────────────────────────────────────────────────────
655
523
 
656
- /**
657
- * Check whether a model ID is present in the available models list.
658
- * Handles bare IDs ("claude-opus-4-6") and provider-prefixed IDs ("anthropic/claude-opus-4-6").
659
- */
660
- function isModelAvailable(modelId: string, availableModelIds: string[]): boolean {
661
- if (availableModelIds.includes(modelId)) return true;
662
- // Strip provider prefix for comparison. Treat trailing-slash IDs ("provider/")
663
- // as no-bare-ID rather than empty-string match (which would erroneously match
664
- // any other "provider/" ID).
665
- const bare = bareModelId(modelId);
666
- if (!bare) return false;
667
- return availableModelIds.some(id => bareModelId(id) === bare);
668
- }
669
-
670
524
  function getModelTier(modelId: string): ComplexityTier {
671
525
  // Strip provider prefix if present
672
526
  const bareId = bareModelId(modelId);
@@ -709,25 +563,8 @@ function getModelCost(modelId: string): number {
709
563
  return 999;
710
564
  }
711
565
 
712
- function normalizeResolvedTierModelId(
713
- modelId: string,
714
- tier: ComplexityTier,
715
- routingConfig: DynamicRoutingConfig,
716
- ): string {
717
- const explicitModel = routingConfig.tier_models?.[tier];
718
- if (explicitModel?.includes("/")) {
719
- return modelId;
720
- }
721
-
722
- const bareId = bareModelId(modelId);
723
- return MODEL_CAPABILITY_TIER[bareId] ? bareId : modelId;
724
- }
725
-
726
566
  function bareModelId(modelId: string): string {
727
- if (!modelId.includes("/")) return modelId;
728
- // .pop() never returns undefined on a non-empty string but ?? guards future
729
- // refactors and avoids the misleading non-null assertion.
730
- return modelId.split("/").pop() ?? modelId;
567
+ return modelId.includes("/") ? modelId.split("/").pop()! : modelId;
731
568
  }
732
569
 
733
570
  // ─── Provider-specific Tool Limits ─────────────────────────────────────────
@@ -11,7 +11,6 @@ import { join } from "node:path";
11
11
  import { GSDError, GSD_GIT_ERROR } from "./errors.js";
12
12
  import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
13
13
  import { getErrorMessage } from "./error-utils.js";
14
- import { isInfrastructureError } from "./auto/infra-errors.js";
15
14
 
16
15
  // Issue #453: keep auto-mode bookkeeping on the stable git CLI path unless a
17
16
  // caller explicitly opts into the native helper.
@@ -847,10 +846,6 @@ export function nativeAddAllWithExclusions(basePath: string, exclusions: readonl
847
846
  });
848
847
  } catch (err: unknown) {
849
848
  const stderr = (err as { stderr?: string })?.stderr ?? "";
850
- const infraCode = isInfrastructureError(err) ?? isInfrastructureError(stderr);
851
- if (infraCode) {
852
- throw err;
853
- }
854
849
  // git exits 1 when pathspec exclusions reference paths already covered
855
850
  // by .gitignore. The staging itself succeeds — only suppress that case.
856
851
  if (stderr.includes("ignored by one of your .gitignore files")) {
@@ -865,8 +860,7 @@ export function nativeAddAllWithExclusions(basePath: string, exclusions: readonl
865
860
  fallbackStageWithSymlinkedDotGsd(basePath);
866
861
  return;
867
862
  }
868
- const stderrDetail = stderr.trim() ? `; stderr: ${stderr.trim()}` : "";
869
- throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}${stderrDetail}`);
863
+ throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}`);
870
864
  }
871
865
  }
872
866
 
@@ -10,8 +10,7 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs";
10
10
  import { homedir } from "node:os";
11
11
  import { join } from "node:path";
12
12
  import type { DynamicRoutingConfig } from "./model-router.js";
13
- import { canonicalModelForTier, defaultRoutingConfig, resolveModelForTier } from "./model-router.js";
14
- import type { ComplexityTier } from "./complexity-classifier.js";
13
+ import { defaultRoutingConfig } from "./model-router.js";
15
14
  import type { TokenProfile, InlineLevel } from "./types.js";
16
15
 
17
16
  import type {
@@ -44,7 +43,7 @@ export function resolveModelForUnit(unitType: string): string | undefined {
44
43
  * - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
45
44
  */
46
45
  export function resolveModelWithFallbacksForUnit(unitType: string): ResolvedModelConfig | undefined {
47
- const prefs = loadEffectiveGSDPreferences(undefined, { availableModelIds: [] });
46
+ const prefs = loadEffectiveGSDPreferences();
48
47
  if (!prefs?.preferences.models) return undefined;
49
48
  const m = prefs.preferences.models as GSDModelConfigV2;
50
49
 
@@ -133,7 +132,7 @@ export function resolveModelWithFallbacksForUnit(unitType: string): ResolvedMode
133
132
  export function resolveDefaultSessionModel(
134
133
  sessionProvider?: string,
135
134
  ): { provider: string; id: string } | undefined {
136
- const prefs = loadEffectiveGSDPreferences(undefined, { availableModelIds: [] });
135
+ const prefs = loadEffectiveGSDPreferences();
137
136
  if (!prefs?.preferences.models) return undefined;
138
137
 
139
138
  const m = prefs.preferences.models as GSDModelConfigV2;
@@ -359,86 +358,22 @@ export function resolveAutoSupervisorConfig(): AutoSupervisorConfig {
359
358
 
360
359
  const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality", "burn-max"]);
361
360
 
362
- /**
363
- * Per-phase tier intentions for each token profile.
364
- * Profiles express capability tiers, not model IDs. Concrete model
365
- * resolution happens at runtime via resolveModelForTier() which is
366
- * provider-agnostic — it picks the best available model at each tier.
367
- */
368
- const PROFILE_TIER_MAP: Record<TokenProfile, Record<string, ComplexityTier>> = {
369
- budget: {
370
- planning: "standard",
371
- research: "light",
372
- execution: "standard",
373
- execution_simple: "light",
374
- completion: "light",
375
- subagent: "light",
376
- },
377
- balanced: {
378
- planning: "standard",
379
- research: "standard",
380
- execution: "standard",
381
- execution_simple: "light",
382
- completion: "light",
383
- subagent: "light",
384
- },
385
- quality: {
386
- planning: "heavy",
387
- research: "standard",
388
- execution: "standard",
389
- execution_simple: "light",
390
- completion: "light",
391
- subagent: "standard",
392
- },
393
- // burn-max intentionally omits a tier map: it never writes model defaults
394
- // (it preserves the user's explicit model selection), so resolveProfileDefaults
395
- // skips model resolution for this profile.
396
- "burn-max": {},
397
- };
398
-
399
361
  /**
400
362
  * Resolve profile defaults for a given token profile tier.
401
363
  * Returns a partial GSDPreferences that is used as the base layer --
402
364
  * explicit user preferences always override these defaults.
403
- *
404
- * Model IDs are resolved from capability tiers, not hardcoded to any
405
- * provider. When available models are known (runtime), the resolver picks
406
- * the best match across all configured providers. When not known (e.g.,
407
- * early startup), falls back to canonical Anthropic model IDs.
408
- *
409
- * @param profile The token profile to resolve
410
- * @param availableModelIds Optional list of available model IDs for cross-provider resolution.
411
- * Undefined means the registry is unavailable.
412
- * @param routingConfig Optional routing config for tier model pins.
413
365
  */
414
- export function resolveProfileDefaults(
415
- profile: TokenProfile,
416
- availableModelIds?: string[],
417
- routingConfig: DynamicRoutingConfig = defaultRoutingConfig(),
418
- ): Partial<GSDPreferences> {
419
- // burn-max never writes model defaults — preserve user-selected models.
420
- // For the other three profiles, derive concrete model IDs from the tier map
421
- // against the available-model list when the registry is provided. If callers
422
- // omit the registry entirely, use canonical fallbacks explicitly.
423
- const tierMap = PROFILE_TIER_MAP[profile];
424
- const resolveTierModel = (tier: ComplexityTier): string => Array.isArray(availableModelIds)
425
- ? resolveModelForTier(tier, availableModelIds, routingConfig)
426
- : canonicalModelForTier(tier);
427
- const models: GSDModelConfigV2 | undefined = profile === "burn-max"
428
- ? undefined
429
- : {
430
- planning: resolveTierModel(tierMap.planning),
431
- research: resolveTierModel(tierMap.research),
432
- execution: resolveTierModel(tierMap.execution),
433
- execution_simple: resolveTierModel(tierMap.execution_simple),
434
- completion: resolveTierModel(tierMap.completion),
435
- subagent: resolveTierModel(tierMap.subagent),
436
- };
437
-
366
+ export function resolveProfileDefaults(profile: TokenProfile): Partial<GSDPreferences> {
438
367
  switch (profile) {
439
368
  case "budget":
440
369
  return {
441
- models,
370
+ models: {
371
+ planning: "claude-sonnet-4-5-20250514",
372
+ execution: "claude-sonnet-4-5-20250514",
373
+ execution_simple: "claude-haiku-4-5-20250414",
374
+ completion: "claude-haiku-4-5-20250414",
375
+ subagent: "claude-haiku-4-5-20250414",
376
+ },
442
377
  phases: {
443
378
  skip_research: true,
444
379
  skip_reassess: true,
@@ -448,7 +383,9 @@ export function resolveProfileDefaults(
448
383
  };
449
384
  case "balanced":
450
385
  return {
451
- models,
386
+ models: {
387
+ subagent: "claude-sonnet-4-5-20250514",
388
+ },
452
389
  phases: {
453
390
  skip_research: true,
454
391
  skip_reassess: true,
@@ -457,7 +394,7 @@ export function resolveProfileDefaults(
457
394
  };
458
395
  case "quality":
459
396
  return {
460
- models,
397
+ models: {},
461
398
  phases: {
462
399
  skip_research: true,
463
400
  skip_slice_research: true,
@@ -483,14 +420,6 @@ export function resolveProfileDefaults(
483
420
  }
484
421
  }
485
422
 
486
- /**
487
- * Get the tier intentions for a profile without resolving to model IDs.
488
- * Useful for display, debugging, and testing.
489
- */
490
- export function getProfileTierMap(profile: TokenProfile): Record<string, ComplexityTier> {
491
- return { ...PROFILE_TIER_MAP[profile] };
492
- }
493
-
494
423
  /**
495
424
  * Resolve the effective token profile from preferences.
496
425
  * Returns "balanced" when no profile is set (D046).
@@ -536,18 +465,3 @@ export function resolveSearchProviderFromPreferences(): GSDPreferences["search_p
536
465
  const prefs = loadEffectiveGSDPreferences();
537
466
  return prefs?.preferences.search_provider;
538
467
  }
539
-
540
- /**
541
- * Resolve provider IDs excluded from model selection/routing.
542
- * Returns a normalized, de-duplicated list.
543
- */
544
- export function resolveDisabledModelProvidersFromPreferences(): string[] {
545
- const prefs = loadEffectiveGSDPreferences();
546
- const raw = prefs?.preferences.disabled_model_providers;
547
- if (!Array.isArray(raw)) return [];
548
- return Array.from(new Set(
549
- raw
550
- .map((provider) => provider.trim())
551
- .filter((provider) => provider.length > 0),
552
- ));
553
- }
@@ -114,7 +114,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
114
114
  "post_unit_hooks",
115
115
  "pre_dispatch_hooks",
116
116
  "dynamic_routing",
117
- "disabled_model_providers",
118
117
  "uok",
119
118
  "token_profile",
120
119
  "phases",
@@ -133,7 +132,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
133
132
  "service_tier",
134
133
  "forensics_dedup",
135
134
  "show_token_cost",
136
- "min_request_interval_ms",
137
135
  "stale_commit_threshold_minutes",
138
136
  "context_management",
139
137
  "experimental",
@@ -322,8 +320,6 @@ export interface GSDPreferences {
322
320
  post_unit_hooks?: PostUnitHookConfig[];
323
321
  pre_dispatch_hooks?: PreDispatchHookConfig[];
324
322
  dynamic_routing?: DynamicRoutingConfig;
325
- /** Provider IDs to exclude from /model and automatic model routing while leaving tool auth intact. */
326
- disabled_model_providers?: string[];
327
323
  /** Unified Orchestration Kernel controls (default-on, with opt-out and emergency legacy fallback). */
328
324
  uok?: UokPreferences;
329
325
  /** Per-model capability overrides. Deep-merged with built-in profiles for capability-aware routing (ADR-004). */
@@ -369,8 +365,6 @@ export interface GSDPreferences {
369
365
  forensics_dedup?: boolean;
370
366
  /** Opt-in: show per-prompt and cumulative session token cost in the footer. Default: false. */
371
367
  show_token_cost?: boolean;
372
- /** Proactive rate limiting: minimum milliseconds between auto-mode LLM requests. Prevents 429s on rate-limited providers. 0 = disabled (default). */
373
- min_request_interval_ms?: number;
374
368
  /**
375
369
  * Minutes without a commit before flagging uncommitted changes as stale.
376
370
  * When the threshold is exceeded and the working tree is dirty, doctor will
@@ -610,27 +610,6 @@ export function validatePreferences(preferences: GSDPreferences): {
610
610
  }
611
611
  }
612
612
 
613
- // ─── Disabled Model Providers ───────────────────────────────────────
614
- if (preferences.disabled_model_providers !== undefined) {
615
- if (Array.isArray(preferences.disabled_model_providers)) {
616
- const allStrings = preferences.disabled_model_providers.every(
617
- (provider: unknown) => typeof provider === "string",
618
- );
619
- if (!allStrings) {
620
- errors.push("disabled_model_providers must be an array of strings");
621
- } else {
622
- const normalized = preferences.disabled_model_providers
623
- .map((provider) => provider.trim())
624
- .filter((provider) => provider.length > 0);
625
- if (normalized.length > 0) {
626
- validated.disabled_model_providers = Array.from(new Set(normalized));
627
- }
628
- }
629
- } else {
630
- errors.push("disabled_model_providers must be an array of strings");
631
- }
632
- }
633
-
634
613
  // ─── Context Management ──────────────────────────────────────────────
635
614
  if (preferences.context_management !== undefined) {
636
615
  if (typeof preferences.context_management === "object" && preferences.context_management !== null) {
@@ -1122,20 +1101,6 @@ export function validatePreferences(preferences: GSDPreferences): {
1122
1101
  }
1123
1102
  }
1124
1103
 
1125
- // ─── Auto-Mode Request Interval ───────────────────────────────────
1126
- if (preferences.min_request_interval_ms !== undefined) {
1127
- if (
1128
- typeof preferences.min_request_interval_ms === "number" &&
1129
- Number.isFinite(preferences.min_request_interval_ms) &&
1130
- preferences.min_request_interval_ms >= 0 &&
1131
- preferences.min_request_interval_ms <= 2_147_483_647
1132
- ) {
1133
- validated.min_request_interval_ms = Math.floor(preferences.min_request_interval_ms);
1134
- } else {
1135
- errors.push("min_request_interval_ms must be a non-negative number <= 2147483647");
1136
- }
1137
- }
1138
-
1139
1104
  // ─── Experimental Features ────────────────────────────────────────
1140
1105
  if (preferences.experimental !== undefined) {
1141
1106
  if (typeof preferences.experimental === "object" && preferences.experimental !== null) {
@@ -89,12 +89,10 @@ export {
89
89
  resolveDynamicRoutingConfig,
90
90
  resolveAutoSupervisorConfig,
91
91
  resolveProfileDefaults,
92
- getProfileTierMap,
93
92
  resolveEffectiveProfile,
94
93
  resolveInlineLevel,
95
94
  resolveContextSelection,
96
95
  resolveSearchProviderFromPreferences,
97
- resolveDisabledModelProvidersFromPreferences,
98
96
  } from "./preferences-models.js";
99
97
 
100
98
  // ─── Path Constants & Getters ───────────────────────────────────────────────
@@ -148,10 +146,7 @@ export function loadProjectGSDPreferences(basePath?: string): LoadedGSDPreferenc
148
146
  ?? loadPreferencesFile(legacyProjectPreferencesPathLowercase(basePath), "project");
149
147
  }
150
148
 
151
- export function loadEffectiveGSDPreferences(
152
- basePath?: string,
153
- opts?: { availableModelIds?: string[] },
154
- ): LoadedGSDPreferences | null {
149
+ export function loadEffectiveGSDPreferences(basePath?: string): LoadedGSDPreferences | null {
155
150
  const globalPreferences = loadGlobalGSDPreferences();
156
151
  const projectPreferences = loadProjectGSDPreferences(basePath);
157
152
 
@@ -180,11 +175,7 @@ export function loadEffectiveGSDPreferences(
180
175
  // Explicit user preferences always override profile defaults.
181
176
  const profile = result.preferences.token_profile as TokenProfile | undefined;
182
177
  if (profile) {
183
- const profileDefaults = _resolveProfileDefaults(
184
- profile,
185
- opts?.availableModelIds,
186
- result.preferences.dynamic_routing,
187
- );
178
+ const profileDefaults = _resolveProfileDefaults(profile);
188
179
  result = {
189
180
  ...result,
190
181
  preferences: mergePreferences(profileDefaults as GSDPreferences, result.preferences),
@@ -389,10 +380,6 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
389
380
  dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
390
381
  ? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) } as DynamicRoutingConfig
391
382
  : undefined,
392
- disabled_model_providers: mergeStringLists(
393
- base.disabled_model_providers,
394
- override.disabled_model_providers,
395
- ),
396
383
  uok: (base.uok || override.uok)
397
384
  ? {
398
385
  enabled: override.uok?.enabled ?? base.uok?.enabled,
@@ -446,7 +433,6 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
446
433
  service_tier: override.service_tier ?? base.service_tier,
447
434
  forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
448
435
  show_token_cost: override.show_token_cost ?? base.show_token_cost,
449
- min_request_interval_ms: override.min_request_interval_ms ?? base.min_request_interval_ms,
450
436
  codebase: (base.codebase || override.codebase)
451
437
  ? {
452
438
  ...(base.codebase ?? {}),
@@ -7,13 +7,14 @@
7
7
  * Templates live at prompts/ relative to this module's directory.
8
8
  * They use {{variableName}} syntax for substitution.
9
9
  *
10
- * Templates are snapshotted shortly after module init via warmCache().
11
- * This keeps import/extension-registration fast while still preventing a
12
- * running session from being invalidated when another `gsd` launch overwrites
13
- * ~/.gsd/agent/ with newer templates via initResources(). Without caching, the
14
- * in-memory extension code (which knows variable set A) can read a newer
15
- * template from disk (which expects variable set B), causing a
16
- * "template declares {{X}} but no value was provided" crash mid-session.
10
+ * All templates are eagerly loaded into cache at module init via warmCache().
11
+ * This prevents a running session from being invalidated when another `gsd`
12
+ * launch overwrites ~/.gsd/agent/ with newer templates via initResources().
13
+ * Without eager caching, the in-memory extension code (which knows variable
14
+ * set A) can read a newer template from disk (which expects variable set B),
15
+ * causing a "template declares {{X}} but no value was provided" crash
16
+ * mid-session especially for late-loading templates like complete-milestone
17
+ * that aren't read until the end of a long auto-mode run.
17
18
  */
18
19
 
19
20
  import { readFileSync, readdirSync, existsSync } from "node:fs";
@@ -81,8 +82,8 @@ export function getTemplatesDir(): string {
81
82
  return templatesDir;
82
83
  }
83
84
 
84
- // Cache all templates from a startup snapshot — a running session uses the
85
- // template versions that were on disk near startup, immune to later overwrites.
85
+ // Cache all templates eagerly at module load — a running session uses the
86
+ // template versions that were on disk at startup, immune to later overwrites.
86
87
  const templateCache = new Map<string, string>();
87
88
 
88
89
  /**
@@ -123,23 +124,8 @@ function warmCache(): void {
123
124
  }
124
125
  }
125
126
 
126
- let warmCacheScheduled = false;
127
-
128
- function scheduleWarmCache(): void {
129
- if (warmCacheScheduled) return;
130
- warmCacheScheduled = true;
131
-
132
- const run = () => {
133
- warmCache();
134
- };
135
-
136
- const timer = setTimeout(run, 1000);
137
- timer.unref?.();
138
- }
139
-
140
- // Snapshot the full prompt/template tree after import so extension startup only
141
- // pays for prompts that are actually needed immediately.
142
- scheduleWarmCache();
127
+ // Snapshot all templates at module load time
128
+ warmCache();
143
129
 
144
130
  /**
145
131
  * Load a prompt template and substitute variables.
@@ -82,7 +82,6 @@ let sliceState: SliceOrchestratorState | null = null;
82
82
 
83
83
  const SLICE_ORCHESTRATOR_STATE_FILE = "slice-orchestrator.json";
84
84
  const TMP_SUFFIX = ".tmp";
85
- export const SLICE_WORKER_AUTO_ARGS = ["headless", "--json", "auto"] as const;
86
85
 
87
86
  interface PersistedSliceWorker {
88
87
  milestoneId: string;
@@ -357,7 +356,7 @@ export function getSliceOrchestratorState(): SliceOrchestratorState | null {
357
356
  /**
358
357
  * Start parallel execution for eligible slices within a milestone.
359
358
  *
360
- * For each eligible slice: create a worktree, spawn `gsd headless --json auto`
359
+ * For each eligible slice: create a worktree, spawn `gsd --mode json --print "/gsd auto"`
361
360
  * with env GSD_SLICE_LOCK=<SID> + GSD_MILESTONE_LOCK=<MID> + GSD_PARALLEL_WORKER=1.
362
361
  */
363
362
  export async function startSliceParallel(
@@ -599,13 +598,8 @@ function resolveGsdBin(): string | null {
599
598
 
600
599
  /**
601
600
  * Spawn a worker process for a slice.
602
- * The worker runs `gsd headless --json auto` in the slice's worktree
601
+ * The worker runs `gsd --mode json --print "/gsd auto"` in the slice's worktree
603
602
  * with GSD_SLICE_LOCK, GSD_MILESTONE_LOCK, and GSD_PARALLEL_WORKER set.
604
- *
605
- * Print-mode slash commands return after the command handler schedules
606
- * auto-mode, so the worker process can exit before doing any LLM work. The
607
- * headless auto entrypoint keeps the process alive until auto-mode reaches a
608
- * terminal notification, matching milestone-level parallel workers.
609
603
  */
610
604
  function spawnSliceWorker(
611
605
  basePath: string,
@@ -622,7 +616,7 @@ function spawnSliceWorker(
622
616
 
623
617
  let child: ChildProcess;
624
618
  try {
625
- child = spawn(process.execPath, [binPath, ...SLICE_WORKER_AUTO_ARGS], {
619
+ child = spawn(process.execPath, [binPath, "--mode", "json", "--print", "/gsd auto"], {
626
620
  cwd: worker.worktreePath,
627
621
  env: {
628
622
  ...process.env,