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
@@ -228,8 +228,11 @@ export function getEligibleModels(tier, availableModelIds, routingConfig) {
228
228
  if (availableModelIds.includes(explicitModel))
229
229
  return [explicitModel];
230
230
  // Provider-prefix-stripped match
231
- const bareExplicit = bareModelId(explicitModel);
232
- const match = availableModelIds.find(id => bareModelId(id) === bareExplicit);
231
+ const match = availableModelIds.find(id => {
232
+ const bareAvail = id.includes("/") ? id.split("/").pop() : id;
233
+ const bareExplicit = explicitModel.includes("/") ? explicitModel.split("/").pop() : explicitModel;
234
+ return bareAvail === bareExplicit;
235
+ });
233
236
  if (match)
234
237
  return [match];
235
238
  }
@@ -320,31 +323,12 @@ export function resolveModelForComplexity(classification, phaseConfig, routingCo
320
323
  }
321
324
  // Downgrade-only: if requested tier >= configured tier, no change
322
325
  if (tierOrdinal(requestedTier) >= tierOrdinal(configuredTier)) {
323
- // If the configured primary is directly available, use it
324
- if (isModelAvailable(configuredPrimary, availableModelIds)) {
325
- return {
326
- modelId: configuredPrimary,
327
- fallbacks: phaseConfig.fallbacks,
328
- tier: requestedTier,
329
- wasDowngraded: false,
330
- reason: `tier ${requestedTier} >= configured ${configuredTier}`,
331
- selectionMethod: "tier-only",
332
- };
333
- }
334
- // Configured primary is unavailable (e.g. Anthropic model configured but
335
- // running on a non-Anthropic provider). Find the best available model at
336
- // the same capability tier so routing still works cross-provider.
337
- const crossProviderEquivalent = findModelForTier(configuredTier, routingConfig, availableModelIds, routingConfig.cross_provider !== false);
338
326
  return {
339
- modelId: crossProviderEquivalent ?? configuredPrimary,
340
- fallbacks: crossProviderEquivalent
341
- ? [...phaseConfig.fallbacks.filter(f => f !== crossProviderEquivalent), configuredPrimary]
342
- : phaseConfig.fallbacks,
327
+ modelId: configuredPrimary,
328
+ fallbacks: phaseConfig.fallbacks,
343
329
  tier: requestedTier,
344
330
  wasDowngraded: false,
345
- reason: crossProviderEquivalent
346
- ? `cross-provider ${configuredTier}-tier equivalent`
347
- : `tier ${requestedTier} >= configured ${configuredTier}`,
331
+ reason: `tier ${requestedTier} >= configured ${configuredTier}`,
348
332
  selectionMethod: "tier-only",
349
333
  };
350
334
  }
@@ -420,84 +404,7 @@ export function defaultRoutingConfig() {
420
404
  hooks: true,
421
405
  };
422
406
  }
423
- // ─── Tier-Based Model Resolution (for profile defaults) ─────────────────────
424
- /**
425
- * Fallback-only canonical model IDs per tier. Returned when the
426
- * available-model list is empty (e.g., preferences are loaded before the
427
- * model registry is populated at bootstrap), or when a non-empty registry has
428
- * no model at the requested tier.
429
- *
430
- * Precedence (resolveModelForTier):
431
- * 1. configured `tier_models[tier]` (via getEligibleModels) — exact/bare match
432
- * 2. cheapest available model whose tier matches `tier`
433
- * 3. CANONICAL_TIER_MODELS[tier] as last-resort fallback
434
- */
435
- const CANONICAL_TIER_MODELS = {
436
- light: "claude-haiku-4-5",
437
- standard: "claude-sonnet-4-6",
438
- heavy: "claude-opus-4-6",
439
- };
440
- export function canonicalModelForTier(tier) {
441
- return CANONICAL_TIER_MODELS[tier];
442
- }
443
- /**
444
- * Single source of truth for tier-based model selection.
445
- * Returns the cheapest available model whose capability tier matches `tier`,
446
- * honoring `routingConfig.tier_models[tier]` when set. Returns undefined when
447
- * no available model matches the tier.
448
- *
449
- * `crossProvider`: when false, restricts the search to models that share the
450
- * canonical (Anthropic) provider for the tier. When true, any provider is
451
- * eligible.
452
- */
453
- function findModelForTier(tier, routingConfig, availableModelIds, crossProvider) {
454
- const eligible = getEligibleModels(tier, availableModelIds, routingConfig);
455
- if (eligible.length === 0)
456
- return undefined;
457
- if (crossProvider) {
458
- return eligible[0];
459
- }
460
- // Same-provider only: keep models whose bare ID matches a canonical
461
- // Anthropic ID at this tier (i.e., a claude-* model in the tier map).
462
- const sameProvider = eligible.filter(id => {
463
- const bare = bareModelId(id);
464
- return MODEL_CAPABILITY_TIER[bare] === tier && bare.startsWith("claude-");
465
- });
466
- return sameProvider[0];
467
- }
468
- export function resolveModelForTier(tier, availableModelIds, routingConfigOrCrossProvider = defaultRoutingConfig(), crossProvider) {
469
- const routingConfig = typeof routingConfigOrCrossProvider === "boolean"
470
- ? defaultRoutingConfig()
471
- : { ...defaultRoutingConfig(), ...routingConfigOrCrossProvider };
472
- const allowCrossProvider = typeof routingConfigOrCrossProvider === "boolean"
473
- ? routingConfigOrCrossProvider
474
- : crossProvider ?? routingConfig.cross_provider !== false;
475
- // No available models known — return canonical fallback
476
- if (availableModelIds.length === 0) {
477
- return canonicalModelForTier(tier);
478
- }
479
- // Cross-provider tier search
480
- const resolved = findModelForTier(tier, routingConfig, availableModelIds, allowCrossProvider);
481
- return resolved
482
- ? normalizeResolvedTierModelId(resolved, tier, routingConfig)
483
- : canonicalModelForTier(tier);
484
- }
485
407
  // ─── Internal ────────────────────────────────────────────────────────────────
486
- /**
487
- * Check whether a model ID is present in the available models list.
488
- * Handles bare IDs ("claude-opus-4-6") and provider-prefixed IDs ("anthropic/claude-opus-4-6").
489
- */
490
- function isModelAvailable(modelId, availableModelIds) {
491
- if (availableModelIds.includes(modelId))
492
- return true;
493
- // Strip provider prefix for comparison. Treat trailing-slash IDs ("provider/")
494
- // as no-bare-ID rather than empty-string match (which would erroneously match
495
- // any other "provider/" ID).
496
- const bare = bareModelId(modelId);
497
- if (!bare)
498
- return false;
499
- return availableModelIds.some(id => bareModelId(id) === bare);
500
- }
501
408
  function getModelTier(modelId) {
502
409
  // Strip provider prefix if present
503
410
  const bareId = bareModelId(modelId);
@@ -536,20 +443,8 @@ function getModelCost(modelId) {
536
443
  // Unknown cost — assume expensive to avoid routing to unknown cheap models
537
444
  return 999;
538
445
  }
539
- function normalizeResolvedTierModelId(modelId, tier, routingConfig) {
540
- const explicitModel = routingConfig.tier_models?.[tier];
541
- if (explicitModel?.includes("/")) {
542
- return modelId;
543
- }
544
- const bareId = bareModelId(modelId);
545
- return MODEL_CAPABILITY_TIER[bareId] ? bareId : modelId;
546
- }
547
446
  function bareModelId(modelId) {
548
- if (!modelId.includes("/"))
549
- return modelId;
550
- // .pop() never returns undefined on a non-empty string but ?? guards future
551
- // refactors and avoids the misleading non-null assertion.
552
- return modelId.split("/").pop() ?? modelId;
447
+ return modelId.includes("/") ? modelId.split("/").pop() : modelId;
553
448
  }
554
449
  // ─── Provider-specific Tool Limits ─────────────────────────────────────────
555
450
  /**
@@ -10,7 +10,6 @@ import { join } from "node:path";
10
10
  import { GSDError, GSD_GIT_ERROR } from "./errors.js";
11
11
  import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
12
12
  import { getErrorMessage } from "./error-utils.js";
13
- import { isInfrastructureError } from "./auto/infra-errors.js";
14
13
  // Issue #453: keep auto-mode bookkeeping on the stable git CLI path unless a
15
14
  // caller explicitly opts into the native helper.
16
15
  const NATIVE_GSD_GIT_ENABLED = process.env.GSD_ENABLE_NATIVE_GSD_GIT === "1";
@@ -696,10 +695,6 @@ export function nativeAddAllWithExclusions(basePath, exclusions) {
696
695
  }
697
696
  catch (err) {
698
697
  const stderr = err?.stderr ?? "";
699
- const infraCode = isInfrastructureError(err) ?? isInfrastructureError(stderr);
700
- if (infraCode) {
701
- throw err;
702
- }
703
698
  // git exits 1 when pathspec exclusions reference paths already covered
704
699
  // by .gitignore. The staging itself succeeds — only suppress that case.
705
700
  if (stderr.includes("ignored by one of your .gitignore files")) {
@@ -714,8 +709,7 @@ export function nativeAddAllWithExclusions(basePath, exclusions) {
714
709
  fallbackStageWithSymlinkedDotGsd(basePath);
715
710
  return;
716
711
  }
717
- const stderrDetail = stderr.trim() ? `; stderr: ${stderr.trim()}` : "";
718
- throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}${stderrDetail}`);
712
+ throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}`);
719
713
  }
720
714
  }
721
715
  /**
@@ -8,7 +8,7 @@
8
8
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
9
9
  import { homedir } from "node:os";
10
10
  import { join } from "node:path";
11
- import { canonicalModelForTier, defaultRoutingConfig, resolveModelForTier } from "./model-router.js";
11
+ import { defaultRoutingConfig } from "./model-router.js";
12
12
  import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
13
13
  /**
14
14
  * Resolve which model ID to use for a given auto-mode unit type.
@@ -27,7 +27,7 @@ export function resolveModelForUnit(unitType) {
27
27
  * - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
28
28
  */
29
29
  export function resolveModelWithFallbacksForUnit(unitType) {
30
- const prefs = loadEffectiveGSDPreferences(undefined, { availableModelIds: [] });
30
+ const prefs = loadEffectiveGSDPreferences();
31
31
  if (!prefs?.preferences.models)
32
32
  return undefined;
33
33
  const m = prefs.preferences.models;
@@ -110,7 +110,7 @@ export function resolveModelWithFallbacksForUnit(unitType) {
110
110
  * configured.
111
111
  */
112
112
  export function resolveDefaultSessionModel(sessionProvider) {
113
- const prefs = loadEffectiveGSDPreferences(undefined, { availableModelIds: [] });
113
+ const prefs = loadEffectiveGSDPreferences();
114
114
  if (!prefs?.preferences.models)
115
115
  return undefined;
116
116
  const m = prefs.preferences.models;
@@ -323,80 +323,22 @@ export function resolveAutoSupervisorConfig() {
323
323
  }
324
324
  // ─── Token Profile Resolution ─────────────────────────────────────────────
325
325
  const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
326
- /**
327
- * Per-phase tier intentions for each token profile.
328
- * Profiles express capability tiers, not model IDs. Concrete model
329
- * resolution happens at runtime via resolveModelForTier() which is
330
- * provider-agnostic — it picks the best available model at each tier.
331
- */
332
- const PROFILE_TIER_MAP = {
333
- budget: {
334
- planning: "standard",
335
- research: "light",
336
- execution: "standard",
337
- execution_simple: "light",
338
- completion: "light",
339
- subagent: "light",
340
- },
341
- balanced: {
342
- planning: "standard",
343
- research: "standard",
344
- execution: "standard",
345
- execution_simple: "light",
346
- completion: "light",
347
- subagent: "light",
348
- },
349
- quality: {
350
- planning: "heavy",
351
- research: "standard",
352
- execution: "standard",
353
- execution_simple: "light",
354
- completion: "light",
355
- subagent: "standard",
356
- },
357
- // burn-max intentionally omits a tier map: it never writes model defaults
358
- // (it preserves the user's explicit model selection), so resolveProfileDefaults
359
- // skips model resolution for this profile.
360
- "burn-max": {},
361
- };
362
326
  /**
363
327
  * Resolve profile defaults for a given token profile tier.
364
328
  * Returns a partial GSDPreferences that is used as the base layer --
365
329
  * explicit user preferences always override these defaults.
366
- *
367
- * Model IDs are resolved from capability tiers, not hardcoded to any
368
- * provider. When available models are known (runtime), the resolver picks
369
- * the best match across all configured providers. When not known (e.g.,
370
- * early startup), falls back to canonical Anthropic model IDs.
371
- *
372
- * @param profile The token profile to resolve
373
- * @param availableModelIds Optional list of available model IDs for cross-provider resolution.
374
- * Undefined means the registry is unavailable.
375
- * @param routingConfig Optional routing config for tier model pins.
376
330
  */
377
- export function resolveProfileDefaults(profile, availableModelIds, routingConfig = defaultRoutingConfig()) {
378
- // burn-max never writes model defaults — preserve user-selected models.
379
- // For the other three profiles, derive concrete model IDs from the tier map
380
- // against the available-model list when the registry is provided. If callers
381
- // omit the registry entirely, use canonical fallbacks explicitly.
382
- const tierMap = PROFILE_TIER_MAP[profile];
383
- const resolveTierModel = (tier) => Array.isArray(availableModelIds)
384
- ? resolveModelForTier(tier, availableModelIds, routingConfig)
385
- : canonicalModelForTier(tier);
386
- const models = profile === "burn-max"
387
- ? undefined
388
- : {
389
- planning: resolveTierModel(tierMap.planning),
390
- research: resolveTierModel(tierMap.research),
391
- execution: resolveTierModel(tierMap.execution),
392
- execution_simple: resolveTierModel(tierMap.execution_simple),
393
- completion: resolveTierModel(tierMap.completion),
394
- subagent: resolveTierModel(tierMap.subagent),
395
- };
331
+ export function resolveProfileDefaults(profile) {
396
332
  switch (profile) {
397
333
  case "budget":
398
334
  return {
399
- models,
335
+ models: {
336
+ planning: "claude-sonnet-4-5-20250514",
337
+ execution: "claude-sonnet-4-5-20250514",
338
+ execution_simple: "claude-haiku-4-5-20250414",
339
+ completion: "claude-haiku-4-5-20250414",
340
+ subagent: "claude-haiku-4-5-20250414",
341
+ },
400
342
  phases: {
401
343
  skip_research: true,
402
344
  skip_reassess: true,
@@ -406,7 +348,9 @@ export function resolveProfileDefaults(profile, availableModelIds, routingConfig
406
348
  };
407
349
  case "balanced":
408
350
  return {
409
- models,
351
+ models: {
352
+ subagent: "claude-sonnet-4-5-20250514",
353
+ },
410
354
  phases: {
411
355
  skip_research: true,
412
356
  skip_reassess: true,
@@ -415,7 +359,7 @@ export function resolveProfileDefaults(profile, availableModelIds, routingConfig
415
359
  };
416
360
  case "quality":
417
361
  return {
418
- models,
362
+ models: {},
419
363
  phases: {
420
364
  skip_research: true,
421
365
  skip_slice_research: true,
@@ -440,13 +384,6 @@ export function resolveProfileDefaults(profile, availableModelIds, routingConfig
440
384
  };
441
385
  }
442
386
  }
443
- /**
444
- * Get the tier intentions for a profile without resolving to model IDs.
445
- * Useful for display, debugging, and testing.
446
- */
447
- export function getProfileTierMap(profile) {
448
- return { ...PROFILE_TIER_MAP[profile] };
449
- }
450
387
  /**
451
388
  * Resolve the effective token profile from preferences.
452
389
  * Returns "balanced" when no profile is set (D046).
@@ -491,16 +428,3 @@ export function resolveSearchProviderFromPreferences() {
491
428
  const prefs = loadEffectiveGSDPreferences();
492
429
  return prefs?.preferences.search_provider;
493
430
  }
494
- /**
495
- * Resolve provider IDs excluded from model selection/routing.
496
- * Returns a normalized, de-duplicated list.
497
- */
498
- export function resolveDisabledModelProvidersFromPreferences() {
499
- const prefs = loadEffectiveGSDPreferences();
500
- const raw = prefs?.preferences.disabled_model_providers;
501
- if (!Array.isArray(raw))
502
- return [];
503
- return Array.from(new Set(raw
504
- .map((provider) => provider.trim())
505
- .filter((provider) => provider.length > 0)));
506
- }
@@ -61,7 +61,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
61
61
  "post_unit_hooks",
62
62
  "pre_dispatch_hooks",
63
63
  "dynamic_routing",
64
- "disabled_model_providers",
65
64
  "uok",
66
65
  "token_profile",
67
66
  "phases",
@@ -80,7 +79,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
80
79
  "service_tier",
81
80
  "forensics_dedup",
82
81
  "show_token_cost",
83
- "min_request_interval_ms",
84
82
  "stale_commit_threshold_minutes",
85
83
  "context_management",
86
84
  "experimental",
@@ -620,26 +620,6 @@ export function validatePreferences(preferences) {
620
620
  errors.push("dynamic_routing must be an object");
621
621
  }
622
622
  }
623
- // ─── Disabled Model Providers ───────────────────────────────────────
624
- if (preferences.disabled_model_providers !== undefined) {
625
- if (Array.isArray(preferences.disabled_model_providers)) {
626
- const allStrings = preferences.disabled_model_providers.every((provider) => typeof provider === "string");
627
- if (!allStrings) {
628
- errors.push("disabled_model_providers must be an array of strings");
629
- }
630
- else {
631
- const normalized = preferences.disabled_model_providers
632
- .map((provider) => provider.trim())
633
- .filter((provider) => provider.length > 0);
634
- if (normalized.length > 0) {
635
- validated.disabled_model_providers = Array.from(new Set(normalized));
636
- }
637
- }
638
- }
639
- else {
640
- errors.push("disabled_model_providers must be an array of strings");
641
- }
642
- }
643
623
  // ─── Context Management ──────────────────────────────────────────────
644
624
  if (preferences.context_management !== undefined) {
645
625
  if (typeof preferences.context_management === "object" && preferences.context_management !== null) {
@@ -1173,18 +1153,6 @@ export function validatePreferences(preferences) {
1173
1153
  errors.push("show_token_cost must be a boolean");
1174
1154
  }
1175
1155
  }
1176
- // ─── Auto-Mode Request Interval ───────────────────────────────────
1177
- if (preferences.min_request_interval_ms !== undefined) {
1178
- if (typeof preferences.min_request_interval_ms === "number" &&
1179
- Number.isFinite(preferences.min_request_interval_ms) &&
1180
- preferences.min_request_interval_ms >= 0 &&
1181
- preferences.min_request_interval_ms <= 2_147_483_647) {
1182
- validated.min_request_interval_ms = Math.floor(preferences.min_request_interval_ms);
1183
- }
1184
- else {
1185
- errors.push("min_request_interval_ms must be a non-negative number <= 2147483647");
1186
- }
1187
- }
1188
1156
  // ─── Experimental Features ────────────────────────────────────────
1189
1157
  if (preferences.experimental !== undefined) {
1190
1158
  if (typeof preferences.experimental === "object" && preferences.experimental !== null) {
@@ -35,7 +35,7 @@ export function resolveSkillStalenessDays(basePath) {
35
35
  return prefs?.preferences.skill_staleness_days ?? 60;
36
36
  }
37
37
  // ─── Re-exports: models ─────────────────────────────────────────────────────
38
- export { resolveModelForUnit, resolveModelWithFallbacksForUnit, getNextFallbackModel, isTransientNetworkError, validateModelId, updatePreferencesModels, resolveDynamicRoutingConfig, resolveAutoSupervisorConfig, resolveProfileDefaults, getProfileTierMap, resolveEffectiveProfile, resolveInlineLevel, resolveContextSelection, resolveSearchProviderFromPreferences, resolveDisabledModelProvidersFromPreferences, } from "./preferences-models.js";
38
+ export { resolveModelForUnit, resolveModelWithFallbacksForUnit, getNextFallbackModel, isTransientNetworkError, validateModelId, updatePreferencesModels, resolveDynamicRoutingConfig, resolveAutoSupervisorConfig, resolveProfileDefaults, resolveEffectiveProfile, resolveInlineLevel, resolveContextSelection, resolveSearchProviderFromPreferences, } from "./preferences-models.js";
39
39
  // ─── Path Constants & Getters ───────────────────────────────────────────────
40
40
  function gsdHome() {
41
41
  return process.env.GSD_HOME || join(homedir(), ".gsd");
@@ -76,7 +76,7 @@ export function loadProjectGSDPreferences(basePath) {
76
76
  return loadPreferencesFile(projectPreferencesPath(basePath), "project")
77
77
  ?? loadPreferencesFile(legacyProjectPreferencesPathLowercase(basePath), "project");
78
78
  }
79
- export function loadEffectiveGSDPreferences(basePath, opts) {
79
+ export function loadEffectiveGSDPreferences(basePath) {
80
80
  const globalPreferences = loadGlobalGSDPreferences();
81
81
  const projectPreferences = loadProjectGSDPreferences(basePath);
82
82
  if (!globalPreferences && !projectPreferences)
@@ -105,7 +105,7 @@ export function loadEffectiveGSDPreferences(basePath, opts) {
105
105
  // Explicit user preferences always override profile defaults.
106
106
  const profile = result.preferences.token_profile;
107
107
  if (profile) {
108
- const profileDefaults = _resolveProfileDefaults(profile, opts?.availableModelIds, result.preferences.dynamic_routing);
108
+ const profileDefaults = _resolveProfileDefaults(profile);
109
109
  result = {
110
110
  ...result,
111
111
  preferences: mergePreferences(profileDefaults, result.preferences),
@@ -293,7 +293,6 @@ function mergePreferences(base, override) {
293
293
  dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
294
294
  ? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) }
295
295
  : undefined,
296
- disabled_model_providers: mergeStringLists(base.disabled_model_providers, override.disabled_model_providers),
297
296
  uok: (base.uok || override.uok)
298
297
  ? {
299
298
  enabled: override.uok?.enabled ?? base.uok?.enabled,
@@ -347,7 +346,6 @@ function mergePreferences(base, override) {
347
346
  service_tier: override.service_tier ?? base.service_tier,
348
347
  forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
349
348
  show_token_cost: override.show_token_cost ?? base.show_token_cost,
350
- min_request_interval_ms: override.min_request_interval_ms ?? base.min_request_interval_ms,
351
349
  codebase: (base.codebase || override.codebase)
352
350
  ? {
353
351
  ...(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
  import { readFileSync, readdirSync, existsSync } from "node:fs";
19
20
  import { GSDError, GSD_PARSE_ERROR } from "./errors.js";
@@ -68,8 +69,8 @@ const templatesDir = join(__extensionDir, "templates");
68
69
  export function getTemplatesDir() {
69
70
  return templatesDir;
70
71
  }
71
- // Cache all templates from a startup snapshot — a running session uses the
72
- // template versions that were on disk near startup, immune to later overwrites.
72
+ // Cache all templates eagerly at module load — a running session uses the
73
+ // template versions that were on disk at startup, immune to later overwrites.
73
74
  const templateCache = new Map();
74
75
  /**
75
76
  * Eagerly read all .md files from prompts/ and templates/ into cache.
@@ -111,20 +112,8 @@ function warmCache() {
111
112
  }
112
113
  }
113
114
  }
114
- let warmCacheScheduled = false;
115
- function scheduleWarmCache() {
116
- if (warmCacheScheduled)
117
- return;
118
- warmCacheScheduled = true;
119
- const run = () => {
120
- warmCache();
121
- };
122
- const timer = setTimeout(run, 1000);
123
- timer.unref?.();
124
- }
125
- // Snapshot the full prompt/template tree after import so extension startup only
126
- // pays for prompts that are actually needed immediately.
127
- scheduleWarmCache();
115
+ // Snapshot all templates at module load time
116
+ warmCache();
128
117
  /**
129
118
  * Load a prompt template and substitute variables.
130
119
  *
@@ -32,7 +32,6 @@ let sliceState = null;
32
32
  // on next session start. (Issue #4980 HIGH-8)
33
33
  const SLICE_ORCHESTRATOR_STATE_FILE = "slice-orchestrator.json";
34
34
  const TMP_SUFFIX = ".tmp";
35
- export const SLICE_WORKER_AUTO_ARGS = ["headless", "--json", "auto"];
36
35
  function sliceStateFilePath(basePath) {
37
36
  return join(gsdRoot(basePath), SLICE_ORCHESTRATOR_STATE_FILE);
38
37
  }
@@ -273,7 +272,7 @@ export function getSliceOrchestratorState() {
273
272
  /**
274
273
  * Start parallel execution for eligible slices within a milestone.
275
274
  *
276
- * For each eligible slice: create a worktree, spawn `gsd headless --json auto`
275
+ * For each eligible slice: create a worktree, spawn `gsd --mode json --print "/gsd auto"`
277
276
  * with env GSD_SLICE_LOCK=<SID> + GSD_MILESTONE_LOCK=<MID> + GSD_PARALLEL_WORKER=1.
278
277
  */
279
278
  export async function startSliceParallel(basePath, milestoneId, eligibleSlices, opts = {}) {
@@ -483,13 +482,8 @@ function resolveGsdBin() {
483
482
  }
484
483
  /**
485
484
  * Spawn a worker process for a slice.
486
- * The worker runs `gsd headless --json auto` in the slice's worktree
485
+ * The worker runs `gsd --mode json --print "/gsd auto"` in the slice's worktree
487
486
  * with GSD_SLICE_LOCK, GSD_MILESTONE_LOCK, and GSD_PARALLEL_WORKER set.
488
- *
489
- * Print-mode slash commands return after the command handler schedules
490
- * auto-mode, so the worker process can exit before doing any LLM work. The
491
- * headless auto entrypoint keeps the process alive until auto-mode reaches a
492
- * terminal notification, matching milestone-level parallel workers.
493
487
  */
494
488
  function spawnSliceWorker(basePath, milestoneId, sliceId) {
495
489
  if (!sliceState)
@@ -504,7 +498,7 @@ function spawnSliceWorker(basePath, milestoneId, sliceId) {
504
498
  return false;
505
499
  let child;
506
500
  try {
507
- child = spawn(process.execPath, [binPath, ...SLICE_WORKER_AUTO_ARGS], {
501
+ child = spawn(process.execPath, [binPath, "--mode", "json", "--print", "/gsd auto"], {
508
502
  cwd: worker.worktreePath,
509
503
  env: {
510
504
  ...process.env,
@@ -60,48 +60,6 @@ export function isGhostMilestone(basePath, mid) {
60
60
  const summary = resolveMilestoneFile(basePath, mid, "SUMMARY");
61
61
  return !context && !draft && !roadmap && !summary;
62
62
  }
63
- /**
64
- * A "reusable ghost" milestone is an orphaned filesystem stub that is safe
65
- * to reclaim as the next milestone ID.
66
- *
67
- * Stricter than `isGhostMilestone`: returns true ONLY when ALL of the
68
- * following hold:
69
- * 1. No DB row exists for `mid` (any status, including "queued") — a DB row
70
- * means the milestone was intentionally registered by
71
- * `gsd_milestone_generate_id` and may have an in-flight discuss flow.
72
- * Reusing it would collide with that flow. (#4996 race window)
73
- * 2. No worktree directory exists at `gsdRoot/worktrees/{mid}` — a worktree
74
- * means the milestone is legitimately in-flight.
75
- * 3. No content files exist (CONTEXT, CONTEXT-DRAFT, ROADMAP, SUMMARY) —
76
- * any content means the discuss flow already ran.
77
- *
78
- * The looser `isGhostMilestone` also classifies queued-row-without-content as
79
- * a ghost to help state queries filter phantoms. `isReusableGhostMilestone`
80
- * intentionally does NOT reclaim those — a queued row is sufficient proof of
81
- * a live in-flight ID reservation.
82
- *
83
- * Used by `nextMilestoneIdReserved` and both MCP ID-generator tools to fill
84
- * gaps left by phantom directories before resorting to max+1.
85
- */
86
- export function isReusableGhostMilestone(basePath, mid) {
87
- // Condition 1: no DB row (any status).
88
- if (!isDbAvailable())
89
- return false;
90
- const dbRow = getMilestone(mid);
91
- if (dbRow != null)
92
- return false;
93
- // Condition 2: no worktree.
94
- const root = gsdRoot(basePath);
95
- const wtPath = join(root, 'worktrees', mid);
96
- if (existsSync(wtPath))
97
- return false;
98
- // Condition 3: no content files.
99
- const context = resolveMilestoneFile(basePath, mid, "CONTEXT");
100
- const draft = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
101
- const roadmap = resolveMilestoneFile(basePath, mid, "ROADMAP");
102
- const summary = resolveMilestoneFile(basePath, mid, "SUMMARY");
103
- return !context && !draft && !roadmap && !summary;
104
- }
105
63
  // ─── Query Functions ───────────────────────────────────────────────────────
106
64
  /**
107
65
  * Check if all tasks in a slice plan are done.
@@ -39,7 +39,6 @@ dynamic_routing:
39
39
  budget_pressure:
40
40
  cross_provider:
41
41
  hooks:
42
- disabled_model_providers: []
43
42
  uok:
44
43
  enabled: true
45
44
  legacy_fallback: