gsd-pi 2.78.0 → 2.78.1-dev.9d08d820b

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 (548) hide show
  1. package/README.md +59 -23
  2. package/dist/bundled-resource-path.d.ts +7 -0
  3. package/dist/bundled-resource-path.js +34 -2
  4. package/dist/claude-cli-check.js +104 -33
  5. package/dist/cli-policy.d.ts +13 -0
  6. package/dist/cli-policy.js +17 -0
  7. package/dist/cli.js +95 -55
  8. package/dist/headless-query.d.ts +22 -0
  9. package/dist/headless-query.js +43 -8
  10. package/dist/headless.d.ts +10 -0
  11. package/dist/headless.js +16 -1
  12. package/dist/loader.js +9 -13
  13. package/dist/onboarding.d.ts +10 -0
  14. package/dist/onboarding.js +2 -2
  15. package/dist/provider-migrations.d.ts +2 -2
  16. package/dist/provider-migrations.js +5 -2
  17. package/dist/resource-loader.d.ts +5 -2
  18. package/dist/resource-loader.js +30 -13
  19. package/dist/resources/.managed-resources-content-hash +1 -0
  20. package/dist/resources/extensions/claude-code-cli/readiness.js +128 -32
  21. package/dist/resources/extensions/gsd/auto/loop.js +23 -0
  22. package/dist/resources/extensions/gsd/auto/phases.js +5 -13
  23. package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
  24. package/dist/resources/extensions/gsd/auto/session.js +5 -6
  25. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -2
  26. package/dist/resources/extensions/gsd/auto-dispatch.js +18 -6
  27. package/dist/resources/extensions/gsd/auto-prompts.js +63 -2
  28. package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
  29. package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
  30. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  31. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +60 -13
  33. package/dist/resources/extensions/gsd/auto.js +14 -5
  34. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
  35. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
  36. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  37. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
  38. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +100 -31
  39. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
  40. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +22 -0
  41. package/dist/resources/extensions/gsd/bootstrap/system-context.js +34 -8
  42. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
  43. package/dist/resources/extensions/gsd/commands/catalog.js +69 -5
  44. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
  45. package/dist/resources/extensions/gsd/commands-config.js +3 -2
  46. package/dist/resources/extensions/gsd/commands-extensions.js +46 -3
  47. package/dist/resources/extensions/gsd/commands-handlers.js +3 -2
  48. package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
  49. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
  50. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  51. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  52. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  53. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
  54. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  55. package/dist/resources/extensions/gsd/forensics.js +10 -8
  56. package/dist/resources/extensions/gsd/git-service.js +12 -5
  57. package/dist/resources/extensions/gsd/gsd-db.js +11 -2
  58. package/dist/resources/extensions/gsd/guided-flow.js +25 -24
  59. package/dist/resources/extensions/gsd/home-dir.js +16 -0
  60. package/dist/resources/extensions/gsd/key-manager.js +2 -1
  61. package/dist/resources/extensions/gsd/memory-store.js +66 -31
  62. package/dist/resources/extensions/gsd/migrate/command.js +3 -2
  63. package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
  64. package/dist/resources/extensions/gsd/model-router.js +114 -9
  65. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
  66. package/dist/resources/extensions/gsd/preferences-models.js +91 -15
  67. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  68. package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
  69. package/dist/resources/extensions/gsd/preferences.js +5 -3
  70. package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
  71. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
  72. package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -0
  73. package/dist/resources/extensions/gsd/prompts/plan-slice.md +10 -0
  74. package/dist/resources/extensions/gsd/prompts/refine-slice.md +10 -0
  75. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
  76. package/dist/resources/extensions/gsd/state.js +42 -0
  77. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  78. package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
  79. package/dist/resources/extensions/gsd/unit-context-manifest.js +29 -4
  80. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  81. package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
  82. package/dist/resources/extensions/gsd/worktree-command.js +26 -46
  83. package/dist/resources/extensions/gsd/worktree-manager.js +20 -1
  84. package/dist/resources/extensions/gsd/worktree-resolver.js +4 -13
  85. package/dist/resources/extensions/gsd/worktree-root.js +124 -0
  86. package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
  87. package/dist/resources/extensions/gsd/worktree.js +4 -115
  88. package/dist/resources/extensions/mcp-client/index.js +6 -3
  89. package/dist/resources/extensions/ollama/index.js +15 -2
  90. package/dist/resources/extensions/ollama/model-capabilities.js +31 -0
  91. package/dist/resources/extensions/ollama/ollama-client.js +40 -4
  92. package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
  93. package/dist/resources/extensions/subagent/index.js +324 -178
  94. package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
  95. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  96. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  97. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  98. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  99. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  100. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  101. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  102. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  103. package/dist/rtk-shared.d.ts +3 -0
  104. package/dist/rtk-shared.js +17 -0
  105. package/dist/rtk.d.ts +2 -5
  106. package/dist/rtk.js +3 -20
  107. package/dist/runtime-checks.d.ts +27 -0
  108. package/dist/runtime-checks.js +38 -0
  109. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  110. package/dist/web/standalone/.next/BUILD_ID +1 -1
  111. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  112. package/dist/web/standalone/.next/build-manifest.json +4 -4
  113. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  114. package/dist/web/standalone/.next/react-loadable-manifest.json +44 -4
  115. package/dist/web/standalone/.next/required-server-files.json +3 -3
  116. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  117. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  127. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  143. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  155. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  175. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  185. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/events/route.js +4 -2
  191. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  207. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  209. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  211. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/index.html +1 -1
  221. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  222. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  223. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  224. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  225. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  226. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  227. package/dist/web/standalone/.next/server/app/page.js +2 -2
  228. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  230. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  231. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  232. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  234. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/middleware.js +2 -2
  236. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  238. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  239. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  240. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  241. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  242. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
  249. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
  250. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
  251. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  253. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  254. package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +1 -0
  258. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  259. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  260. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  261. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  262. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  263. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  264. package/dist/web/standalone/package.json +2 -1
  265. package/dist/web/standalone/server.js +1 -1
  266. package/dist/worktree-cli.d.ts +1 -0
  267. package/dist/worktree-cli.js +9 -3
  268. package/dist/worktree-status-banner.d.ts +1 -0
  269. package/dist/worktree-status-banner.js +132 -0
  270. package/package.json +1 -3
  271. package/packages/daemon/package.json +2 -2
  272. package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
  273. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/alias-telemetry.js +30 -0
  275. package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
  276. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  277. package/packages/mcp-server/dist/workflow-tools.js +74 -46
  278. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  279. package/packages/mcp-server/package.json +2 -2
  280. package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
  281. package/packages/mcp-server/src/alias-telemetry.ts +30 -0
  282. package/packages/mcp-server/src/workflow-tools.test.ts +78 -0
  283. package/packages/mcp-server/src/workflow-tools.ts +93 -58
  284. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  285. package/packages/native/package.json +1 -1
  286. package/packages/native/tsconfig.tsbuildinfo +1 -1
  287. package/packages/pi-agent-core/package.json +1 -1
  288. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  289. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
  290. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
  291. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
  292. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
  293. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  294. package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
  295. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  296. package/packages/pi-ai/dist/types.d.ts +13 -0
  297. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  298. package/packages/pi-ai/dist/types.js.map +1 -1
  299. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  300. package/packages/pi-ai/dist/utils/repair-tool-json.js +24 -3
  301. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  302. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +26 -0
  303. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  304. package/packages/pi-ai/package.json +1 -1
  305. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
  306. package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
  307. package/packages/pi-ai/src/types.ts +13 -0
  308. package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
  309. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
  310. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  311. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/agent-session.js +6 -0
  313. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/messages.js +4 -0
  316. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  318. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +10 -0
  320. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
  322. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
  324. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
  326. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
  328. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
  329. package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
  330. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
  340. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
  341. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
  342. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
  343. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
  344. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
  345. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
  346. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
  347. package/packages/pi-coding-agent/package.json +1 -1
  348. package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
  349. package/packages/pi-coding-agent/src/core/messages.ts +4 -0
  350. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
  351. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
  352. package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
  353. package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
  354. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
  355. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
  356. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  357. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
  358. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
  359. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  360. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
  361. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  362. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
  363. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
  364. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
  365. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
  366. package/packages/pi-tui/package.json +1 -1
  367. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
  368. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
  369. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  370. package/packages/rpc-client/package.json +1 -1
  371. package/pkg/package.json +1 -1
  372. package/src/resources/extensions/claude-code-cli/readiness.ts +130 -30
  373. package/src/resources/extensions/gsd/auto/loop.ts +24 -2
  374. package/src/resources/extensions/gsd/auto/phases.ts +6 -14
  375. package/src/resources/extensions/gsd/auto/run-unit.ts +3 -1
  376. package/src/resources/extensions/gsd/auto/session.ts +5 -6
  377. package/src/resources/extensions/gsd/auto/types.ts +1 -0
  378. package/src/resources/extensions/gsd/auto-dashboard.ts +3 -2
  379. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -6
  380. package/src/resources/extensions/gsd/auto-prompts.ts +60 -2
  381. package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
  382. package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
  383. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  384. package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
  385. package/src/resources/extensions/gsd/auto-worktree.ts +82 -12
  386. package/src/resources/extensions/gsd/auto.ts +14 -4
  387. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
  388. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
  389. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  390. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
  391. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +108 -31
  392. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
  393. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +20 -0
  394. package/src/resources/extensions/gsd/bootstrap/system-context.ts +39 -8
  395. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
  396. package/src/resources/extensions/gsd/commands/catalog.ts +75 -5
  397. package/src/resources/extensions/gsd/commands/handlers/core.ts +22 -1
  398. package/src/resources/extensions/gsd/commands-config.ts +3 -2
  399. package/src/resources/extensions/gsd/commands-extensions.ts +43 -3
  400. package/src/resources/extensions/gsd/commands-handlers.ts +3 -2
  401. package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
  402. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
  403. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  404. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  405. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  406. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
  407. package/src/resources/extensions/gsd/doctor-types.ts +3 -1
  408. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  409. package/src/resources/extensions/gsd/forensics.ts +12 -7
  410. package/src/resources/extensions/gsd/git-service.ts +13 -5
  411. package/src/resources/extensions/gsd/gsd-db.ts +12 -2
  412. package/src/resources/extensions/gsd/guided-flow.ts +27 -26
  413. package/src/resources/extensions/gsd/home-dir.ts +19 -0
  414. package/src/resources/extensions/gsd/journal.ts +4 -1
  415. package/src/resources/extensions/gsd/key-manager.ts +2 -1
  416. package/src/resources/extensions/gsd/memory-store.ts +81 -28
  417. package/src/resources/extensions/gsd/migrate/command.ts +3 -2
  418. package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
  419. package/src/resources/extensions/gsd/model-router.ts +172 -9
  420. package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
  421. package/src/resources/extensions/gsd/preferences-models.ts +101 -15
  422. package/src/resources/extensions/gsd/preferences-types.ts +6 -0
  423. package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
  424. package/src/resources/extensions/gsd/preferences.ts +16 -2
  425. package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
  426. package/src/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
  427. package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -0
  428. package/src/resources/extensions/gsd/prompts/plan-slice.md +10 -0
  429. package/src/resources/extensions/gsd/prompts/refine-slice.md +10 -0
  430. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
  431. package/src/resources/extensions/gsd/state.ts +42 -0
  432. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  433. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +178 -1
  434. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
  435. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +24 -5
  436. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
  437. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  438. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +138 -211
  439. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
  440. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
  441. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
  442. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
  443. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
  444. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
  445. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
  446. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
  447. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
  448. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
  449. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
  450. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
  451. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
  452. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
  453. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
  454. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
  455. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
  456. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
  457. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
  458. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
  459. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
  460. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
  461. package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
  462. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
  463. package/src/resources/extensions/gsd/tests/home-dir.test.ts +52 -0
  464. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
  465. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
  466. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +72 -1
  467. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
  468. package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
  469. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
  470. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
  471. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
  472. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +18 -1
  473. package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
  474. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
  475. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
  476. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
  477. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
  478. package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
  479. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
  480. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
  481. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  482. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
  483. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
  484. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
  485. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
  486. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +17 -1
  487. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
  488. package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
  489. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
  490. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +38 -3
  491. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
  492. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
  493. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  494. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +34 -33
  495. package/src/resources/extensions/gsd/tests/worktree.test.ts +8 -0
  496. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +131 -1
  497. package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
  498. package/src/resources/extensions/gsd/unit-context-manifest.ts +44 -12
  499. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  500. package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
  501. package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
  502. package/src/resources/extensions/gsd/worktree-command.ts +31 -44
  503. package/src/resources/extensions/gsd/worktree-manager.ts +40 -1
  504. package/src/resources/extensions/gsd/worktree-resolver.ts +4 -14
  505. package/src/resources/extensions/gsd/worktree-root.ts +144 -0
  506. package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
  507. package/src/resources/extensions/gsd/worktree.ts +8 -119
  508. package/src/resources/extensions/mcp-client/index.ts +6 -3
  509. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
  510. package/src/resources/extensions/ollama/index.ts +16 -2
  511. package/src/resources/extensions/ollama/model-capabilities.ts +34 -0
  512. package/src/resources/extensions/ollama/ollama-client.ts +41 -4
  513. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +96 -0
  514. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
  515. package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
  516. package/src/resources/extensions/subagent/index.ts +165 -7
  517. package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
  518. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  519. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  520. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  521. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  522. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  523. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  524. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  525. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  526. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  527. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
  528. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  529. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
  530. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
  531. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
  532. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
  533. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
  534. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
  535. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
  536. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  537. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
  538. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
  539. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
  540. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  541. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
  544. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
  545. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
  546. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
  547. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → -Ukk6_YxRd4GY4iUOnRUE}/_buildManifest.js +0 -0
  548. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → -Ukk6_YxRd4GY4iUOnRUE}/_ssgManifest.js +0 -0
@@ -15,6 +15,7 @@ import { resolve, join, dirname } from "node:path";
15
15
  import { gsdRoot } from "../paths.js";
16
16
  import { fileURLToPath } from "node:url";
17
17
  import { showNextAction } from "../../shared/tui.js";
18
+ import { getHomeDir } from "../home-dir.js";
18
19
  import {
19
20
  validatePlanningDirectory,
20
21
  parsePlanningDirectory,
@@ -85,9 +86,9 @@ export async function handleMigrate(
85
86
  // Default to cwd when no args given; expand ~ to HOME
86
87
  let rawPath = args.trim() || ".";
87
88
  if (rawPath.startsWith("~/")) {
88
- rawPath = join(process.env.HOME ?? "~", rawPath.slice(2));
89
+ rawPath = join(getHomeDir(), rawPath.slice(2));
89
90
  } else if (rawPath === "~") {
90
- rawPath = process.env.HOME ?? "~";
91
+ rawPath = getHomeDir();
91
92
  }
92
93
 
93
94
  let sourcePath = resolve(process.cwd(), rawPath);
@@ -0,0 +1,47 @@
1
+ import { isDbAvailable, getAllMilestones } from "./gsd-db.js";
2
+ import {
3
+ getReservedMilestoneIds,
4
+ milestoneIdSort,
5
+ nextMilestoneId,
6
+ reserveMilestoneId,
7
+ } from "./milestone-ids.js";
8
+ import { isReusableGhostMilestone } from "./state.js";
9
+
10
+ function getDatabaseMilestoneIds(): string[] {
11
+ if (!isDbAvailable()) return [];
12
+ return getAllMilestones().map((milestone) => milestone.id);
13
+ }
14
+
15
+ /**
16
+ * Generate the next milestone ID, accounting for DB rows and in-process
17
+ * reservations, and reserve it.
18
+ */
19
+ export function nextMilestoneIdReserved(
20
+ existingIds: string[],
21
+ uniqueEnabled: boolean,
22
+ basePath?: string,
23
+ ): string {
24
+ const reservedIds = getReservedMilestoneIds();
25
+ const allIds = [
26
+ ...new Set([
27
+ ...existingIds,
28
+ ...reservedIds,
29
+ ...getDatabaseMilestoneIds(),
30
+ ]),
31
+ ];
32
+
33
+ if (basePath) {
34
+ const sorted = [...allIds].sort(milestoneIdSort);
35
+ for (const candidate of sorted) {
36
+ if (reservedIds.has(candidate)) continue;
37
+ if (isReusableGhostMilestone(basePath, candidate)) {
38
+ reserveMilestoneId(candidate);
39
+ return candidate;
40
+ }
41
+ }
42
+ }
43
+
44
+ const id = nextMilestoneId(allIds, uniqueEnabled);
45
+ reserveMilestoneId(id);
46
+ return id;
47
+ }
@@ -320,11 +320,8 @@ export function getEligibleModels(
320
320
  // Exact match
321
321
  if (availableModelIds.includes(explicitModel)) return [explicitModel];
322
322
  // Provider-prefix-stripped match
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
- });
323
+ const bareExplicit = bareModelId(explicitModel);
324
+ const match = availableModelIds.find(id => bareModelId(id) === bareExplicit);
328
325
  if (match) return [match];
329
326
  }
330
327
 
@@ -430,12 +427,38 @@ export function resolveModelForComplexity(
430
427
 
431
428
  // Downgrade-only: if requested tier >= configured tier, no change
432
429
  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
+
433
452
  return {
434
- modelId: configuredPrimary,
435
- fallbacks: phaseConfig.fallbacks,
453
+ modelId: crossProviderEquivalent ?? configuredPrimary,
454
+ fallbacks: crossProviderEquivalent
455
+ ? [...phaseConfig.fallbacks.filter(f => f !== crossProviderEquivalent), configuredPrimary]
456
+ : phaseConfig.fallbacks,
436
457
  tier: requestedTier,
437
458
  wasDowngraded: false,
438
- reason: `tier ${requestedTier} >= configured ${configuredTier}`,
459
+ reason: crossProviderEquivalent
460
+ ? `cross-provider ${configuredTier}-tier equivalent`
461
+ : `tier ${requestedTier} >= configured ${configuredTier}`,
439
462
  selectionMethod: "tier-only",
440
463
  };
441
464
  }
@@ -519,8 +542,131 @@ export function defaultRoutingConfig(): DynamicRoutingConfig {
519
542
  };
520
543
  }
521
544
 
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
+
522
654
  // ─── Internal ────────────────────────────────────────────────────────────────
523
655
 
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
+
524
670
  function getModelTier(modelId: string): ComplexityTier {
525
671
  // Strip provider prefix if present
526
672
  const bareId = bareModelId(modelId);
@@ -563,8 +709,25 @@ function getModelCost(modelId: string): number {
563
709
  return 999;
564
710
  }
565
711
 
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
+
566
726
  function bareModelId(modelId: string): string {
567
- return modelId.includes("/") ? modelId.split("/").pop()! : modelId;
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;
568
731
  }
569
732
 
570
733
  // ─── Provider-specific Tool Limits ─────────────────────────────────────────
@@ -11,6 +11,7 @@ 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";
14
15
 
15
16
  // Issue #453: keep auto-mode bookkeeping on the stable git CLI path unless a
16
17
  // caller explicitly opts into the native helper.
@@ -846,6 +847,10 @@ export function nativeAddAllWithExclusions(basePath: string, exclusions: readonl
846
847
  });
847
848
  } catch (err: unknown) {
848
849
  const stderr = (err as { stderr?: string })?.stderr ?? "";
850
+ const infraCode = isInfrastructureError(err) ?? isInfrastructureError(stderr);
851
+ if (infraCode) {
852
+ throw err;
853
+ }
849
854
  // git exits 1 when pathspec exclusions reference paths already covered
850
855
  // by .gitignore. The staging itself succeeds — only suppress that case.
851
856
  if (stderr.includes("ignored by one of your .gitignore files")) {
@@ -860,7 +865,8 @@ export function nativeAddAllWithExclusions(basePath: string, exclusions: readonl
860
865
  fallbackStageWithSymlinkedDotGsd(basePath);
861
866
  return;
862
867
  }
863
- throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}`);
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}`);
864
870
  }
865
871
  }
866
872
 
@@ -10,7 +10,8 @@ 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 { defaultRoutingConfig } from "./model-router.js";
13
+ import { canonicalModelForTier, defaultRoutingConfig, resolveModelForTier } from "./model-router.js";
14
+ import type { ComplexityTier } from "./complexity-classifier.js";
14
15
  import type { TokenProfile, InlineLevel } from "./types.js";
15
16
 
16
17
  import type {
@@ -43,7 +44,7 @@ export function resolveModelForUnit(unitType: string): string | undefined {
43
44
  * - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
44
45
  */
45
46
  export function resolveModelWithFallbacksForUnit(unitType: string): ResolvedModelConfig | undefined {
46
- const prefs = loadEffectiveGSDPreferences();
47
+ const prefs = loadEffectiveGSDPreferences(undefined, { availableModelIds: [] });
47
48
  if (!prefs?.preferences.models) return undefined;
48
49
  const m = prefs.preferences.models as GSDModelConfigV2;
49
50
 
@@ -132,7 +133,7 @@ export function resolveModelWithFallbacksForUnit(unitType: string): ResolvedMode
132
133
  export function resolveDefaultSessionModel(
133
134
  sessionProvider?: string,
134
135
  ): { provider: string; id: string } | undefined {
135
- const prefs = loadEffectiveGSDPreferences();
136
+ const prefs = loadEffectiveGSDPreferences(undefined, { availableModelIds: [] });
136
137
  if (!prefs?.preferences.models) return undefined;
137
138
 
138
139
  const m = prefs.preferences.models as GSDModelConfigV2;
@@ -358,22 +359,86 @@ export function resolveAutoSupervisorConfig(): AutoSupervisorConfig {
358
359
 
359
360
  const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality", "burn-max"]);
360
361
 
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
+
361
399
  /**
362
400
  * Resolve profile defaults for a given token profile tier.
363
401
  * Returns a partial GSDPreferences that is used as the base layer --
364
402
  * 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.
365
413
  */
366
- export function resolveProfileDefaults(profile: TokenProfile): Partial<GSDPreferences> {
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
+
367
438
  switch (profile) {
368
439
  case "budget":
369
440
  return {
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
- },
441
+ models,
377
442
  phases: {
378
443
  skip_research: true,
379
444
  skip_reassess: true,
@@ -383,9 +448,7 @@ export function resolveProfileDefaults(profile: TokenProfile): Partial<GSDPrefer
383
448
  };
384
449
  case "balanced":
385
450
  return {
386
- models: {
387
- subagent: "claude-sonnet-4-5-20250514",
388
- },
451
+ models,
389
452
  phases: {
390
453
  skip_research: true,
391
454
  skip_reassess: true,
@@ -394,7 +457,7 @@ export function resolveProfileDefaults(profile: TokenProfile): Partial<GSDPrefer
394
457
  };
395
458
  case "quality":
396
459
  return {
397
- models: {},
460
+ models,
398
461
  phases: {
399
462
  skip_research: true,
400
463
  skip_slice_research: true,
@@ -420,6 +483,14 @@ export function resolveProfileDefaults(profile: TokenProfile): Partial<GSDPrefer
420
483
  }
421
484
  }
422
485
 
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
+
423
494
  /**
424
495
  * Resolve the effective token profile from preferences.
425
496
  * Returns "balanced" when no profile is set (D046).
@@ -465,3 +536,18 @@ export function resolveSearchProviderFromPreferences(): GSDPreferences["search_p
465
536
  const prefs = loadEffectiveGSDPreferences();
466
537
  return prefs?.preferences.search_provider;
467
538
  }
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,6 +114,7 @@ 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",
117
118
  "uok",
118
119
  "token_profile",
119
120
  "phases",
@@ -132,6 +133,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
132
133
  "service_tier",
133
134
  "forensics_dedup",
134
135
  "show_token_cost",
136
+ "min_request_interval_ms",
135
137
  "stale_commit_threshold_minutes",
136
138
  "context_management",
137
139
  "experimental",
@@ -320,6 +322,8 @@ export interface GSDPreferences {
320
322
  post_unit_hooks?: PostUnitHookConfig[];
321
323
  pre_dispatch_hooks?: PreDispatchHookConfig[];
322
324
  dynamic_routing?: DynamicRoutingConfig;
325
+ /** Provider IDs to exclude from /model and automatic model routing while leaving tool auth intact. */
326
+ disabled_model_providers?: string[];
323
327
  /** Unified Orchestration Kernel controls (default-on, with opt-out and emergency legacy fallback). */
324
328
  uok?: UokPreferences;
325
329
  /** Per-model capability overrides. Deep-merged with built-in profiles for capability-aware routing (ADR-004). */
@@ -365,6 +369,8 @@ export interface GSDPreferences {
365
369
  forensics_dedup?: boolean;
366
370
  /** Opt-in: show per-prompt and cumulative session token cost in the footer. Default: false. */
367
371
  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;
368
374
  /**
369
375
  * Minutes without a commit before flagging uncommitted changes as stale.
370
376
  * When the threshold is exceeded and the working tree is dirty, doctor will
@@ -610,6 +610,27 @@ 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
+
613
634
  // ─── Context Management ──────────────────────────────────────────────
614
635
  if (preferences.context_management !== undefined) {
615
636
  if (typeof preferences.context_management === "object" && preferences.context_management !== null) {
@@ -1101,6 +1122,20 @@ export function validatePreferences(preferences: GSDPreferences): {
1101
1122
  }
1102
1123
  }
1103
1124
 
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
+
1104
1139
  // ─── Experimental Features ────────────────────────────────────────
1105
1140
  if (preferences.experimental !== undefined) {
1106
1141
  if (typeof preferences.experimental === "object" && preferences.experimental !== null) {
@@ -89,10 +89,12 @@ export {
89
89
  resolveDynamicRoutingConfig,
90
90
  resolveAutoSupervisorConfig,
91
91
  resolveProfileDefaults,
92
+ getProfileTierMap,
92
93
  resolveEffectiveProfile,
93
94
  resolveInlineLevel,
94
95
  resolveContextSelection,
95
96
  resolveSearchProviderFromPreferences,
97
+ resolveDisabledModelProvidersFromPreferences,
96
98
  } from "./preferences-models.js";
97
99
 
98
100
  // ─── Path Constants & Getters ───────────────────────────────────────────────
@@ -146,7 +148,10 @@ export function loadProjectGSDPreferences(basePath?: string): LoadedGSDPreferenc
146
148
  ?? loadPreferencesFile(legacyProjectPreferencesPathLowercase(basePath), "project");
147
149
  }
148
150
 
149
- export function loadEffectiveGSDPreferences(basePath?: string): LoadedGSDPreferences | null {
151
+ export function loadEffectiveGSDPreferences(
152
+ basePath?: string,
153
+ opts?: { availableModelIds?: string[] },
154
+ ): LoadedGSDPreferences | null {
150
155
  const globalPreferences = loadGlobalGSDPreferences();
151
156
  const projectPreferences = loadProjectGSDPreferences(basePath);
152
157
 
@@ -175,7 +180,11 @@ export function loadEffectiveGSDPreferences(basePath?: string): LoadedGSDPrefere
175
180
  // Explicit user preferences always override profile defaults.
176
181
  const profile = result.preferences.token_profile as TokenProfile | undefined;
177
182
  if (profile) {
178
- const profileDefaults = _resolveProfileDefaults(profile);
183
+ const profileDefaults = _resolveProfileDefaults(
184
+ profile,
185
+ opts?.availableModelIds,
186
+ result.preferences.dynamic_routing,
187
+ );
179
188
  result = {
180
189
  ...result,
181
190
  preferences: mergePreferences(profileDefaults as GSDPreferences, result.preferences),
@@ -380,6 +389,10 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
380
389
  dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
381
390
  ? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) } as DynamicRoutingConfig
382
391
  : undefined,
392
+ disabled_model_providers: mergeStringLists(
393
+ base.disabled_model_providers,
394
+ override.disabled_model_providers,
395
+ ),
383
396
  uok: (base.uok || override.uok)
384
397
  ? {
385
398
  enabled: override.uok?.enabled ?? base.uok?.enabled,
@@ -433,6 +446,7 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
433
446
  service_tier: override.service_tier ?? base.service_tier,
434
447
  forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
435
448
  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,
436
450
  codebase: (base.codebase || override.codebase)
437
451
  ? {
438
452
  ...(base.codebase ?? {}),