gsd-pi 2.71.0-dev.e17e0ce → 2.72.0-dev.3118184

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 (352) hide show
  1. package/README.md +46 -3
  2. package/dist/cli.js +76 -3
  3. package/dist/mcp-server.js +37 -14
  4. package/dist/onboarding.js +10 -0
  5. package/dist/resources/agents/debugger.md +58 -0
  6. package/dist/resources/agents/doc-writer.md +43 -0
  7. package/dist/resources/agents/git-ops.md +56 -0
  8. package/dist/resources/agents/javascript-pro.md +46 -271
  9. package/dist/resources/agents/planner.md +55 -0
  10. package/dist/resources/agents/refactorer.md +47 -0
  11. package/dist/resources/agents/reviewer.md +48 -0
  12. package/dist/resources/agents/security.md +59 -0
  13. package/dist/resources/agents/tester.md +50 -0
  14. package/dist/resources/agents/typescript-pro.md +41 -235
  15. package/dist/resources/extensions/async-jobs/await-tool.js +7 -4
  16. package/dist/resources/extensions/async-jobs/job-manager.js +28 -3
  17. package/dist/resources/extensions/claude-code-cli/partial-builder.js +40 -12
  18. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +132 -10
  19. package/dist/resources/extensions/gsd/auto/loop.js +84 -1
  20. package/dist/resources/extensions/gsd/auto/phases.js +4 -0
  21. package/dist/resources/extensions/gsd/auto-post-unit.js +6 -0
  22. package/dist/resources/extensions/gsd/auto-prompts.js +88 -33
  23. package/dist/resources/extensions/gsd/auto-recovery.js +11 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +24 -4
  25. package/dist/resources/extensions/gsd/auto.js +29 -19
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
  27. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +9 -11
  28. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +2 -5
  29. package/dist/resources/extensions/gsd/commands-handlers.js +4 -1
  30. package/dist/resources/extensions/gsd/context-injector.js +1 -1
  31. package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -7
  32. package/dist/resources/extensions/gsd/definition-io.js +15 -0
  33. package/dist/resources/extensions/gsd/dispatch-guard.js +4 -0
  34. package/dist/resources/extensions/gsd/doctor-providers.js +23 -0
  35. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +6 -3
  36. package/dist/resources/extensions/gsd/error-classifier.js +4 -1
  37. package/dist/resources/extensions/gsd/gate-registry.js +208 -0
  38. package/dist/resources/extensions/gsd/git-service.js +11 -8
  39. package/dist/resources/extensions/gsd/gitignore.js +12 -6
  40. package/dist/resources/extensions/gsd/gsd-db.js +90 -6
  41. package/dist/resources/extensions/gsd/key-manager.js +2 -0
  42. package/dist/resources/extensions/gsd/milestone-validation-gates.js +11 -12
  43. package/dist/resources/extensions/gsd/notification-overlay.js +26 -12
  44. package/dist/resources/extensions/gsd/notification-store.js +5 -4
  45. package/dist/resources/extensions/gsd/preferences-skills.js +2 -34
  46. package/dist/resources/extensions/gsd/preferences-types.js +15 -0
  47. package/dist/resources/extensions/gsd/preferences.js +16 -3
  48. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  49. package/dist/resources/extensions/gsd/prompt-validation.js +126 -0
  50. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -1
  51. package/dist/resources/extensions/gsd/prompts/discuss.md +122 -13
  52. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  53. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  54. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  55. package/dist/resources/extensions/gsd/shortcut-defs.js +7 -1
  56. package/dist/resources/extensions/gsd/state.js +29 -2
  57. package/dist/resources/extensions/gsd/tools/complete-slice.js +52 -1
  58. package/dist/resources/extensions/gsd/tools/complete-task.js +51 -1
  59. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +4 -1
  60. package/dist/resources/extensions/gsd/workflow-projections.js +7 -0
  61. package/dist/resources/extensions/gsd/worktree-manager.js +30 -3
  62. package/dist/resources/extensions/gsd/write-intercept.js +10 -1
  63. package/dist/resources/extensions/ollama/index.js +17 -10
  64. package/dist/resources/extensions/ollama/ollama-client.js +35 -6
  65. package/dist/resources/extensions/ollama/ollama-discovery.js +32 -6
  66. package/dist/resources/extensions/shared/gsd-phase-state.js +35 -0
  67. package/dist/resources/extensions/subagent/agents.js +8 -0
  68. package/dist/resources/extensions/subagent/index.js +17 -0
  69. package/dist/startup-model-validation.d.ts +0 -1
  70. package/dist/startup-model-validation.js +6 -2
  71. package/dist/web/standalone/.next/BUILD_ID +1 -1
  72. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  73. package/dist/web/standalone/.next/build-manifest.json +2 -2
  74. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  75. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  76. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  78. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  86. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  88. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  99. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  105. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  115. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  120. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  123. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  130. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  131. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  132. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +3 -3
  133. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/index.html +1 -1
  138. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/page.js +2 -2
  145. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  147. package/dist/web/standalone/.next/server/chunks/2331.js +16 -16
  148. package/dist/web/standalone/.next/server/chunks/4741.js +12 -12
  149. package/dist/web/standalone/.next/server/chunks/5822.js +2 -2
  150. package/dist/web/standalone/.next/server/chunks/63.js +8 -8
  151. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  152. package/dist/web/standalone/.next/server/edge-runtime-webpack.js +2 -0
  153. package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -9
  154. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/middleware-manifest.json +29 -2
  156. package/dist/web/standalone/.next/server/middleware.js +4 -12
  157. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  158. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  159. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  160. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  161. package/package.json +1 -1
  162. package/packages/mcp-server/dist/server.d.ts +12 -1
  163. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  164. package/packages/mcp-server/dist/server.js +90 -42
  165. package/packages/mcp-server/dist/server.js.map +1 -1
  166. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  167. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  168. package/packages/mcp-server/src/server.ts +110 -38
  169. package/packages/mcp-server/src/workflow-tools.ts +1 -1
  170. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  171. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  172. package/packages/pi-ai/dist/models.custom.d.ts +105 -0
  173. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -1
  174. package/packages/pi-ai/dist/models.custom.js +97 -0
  175. package/packages/pi-ai/dist/models.custom.js.map +1 -1
  176. package/packages/pi-ai/dist/models.generated.d.ts +648 -140
  177. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  178. package/packages/pi-ai/dist/models.generated.js +867 -370
  179. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  180. package/packages/pi-ai/dist/models.generated.test.d.ts +2 -0
  181. package/packages/pi-ai/dist/models.generated.test.d.ts.map +1 -0
  182. package/packages/pi-ai/dist/models.generated.test.js +334 -0
  183. package/packages/pi-ai/dist/models.generated.test.js.map +1 -0
  184. package/packages/pi-ai/dist/models.test.js +105 -0
  185. package/packages/pi-ai/dist/models.test.js.map +1 -1
  186. package/packages/pi-ai/dist/types.d.ts +1 -1
  187. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  188. package/packages/pi-ai/dist/types.js.map +1 -1
  189. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  190. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +5 -1
  191. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  192. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.d.ts +2 -0
  193. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.d.ts.map +1 -0
  194. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +57 -0
  195. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -0
  196. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  197. package/packages/pi-ai/src/models.custom.ts +98 -0
  198. package/packages/pi-ai/src/models.generated.test.ts +373 -0
  199. package/packages/pi-ai/src/models.generated.ts +867 -370
  200. package/packages/pi-ai/src/models.test.ts +135 -0
  201. package/packages/pi-ai/src/types.ts +1 -0
  202. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +71 -0
  203. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +4 -1
  204. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  206. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts +8 -0
  208. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts.map +1 -0
  209. package/packages/pi-coding-agent/dist/core/model-resolver.test.js +75 -0
  210. package/packages/pi-coding-agent/dist/core/model-resolver.test.js.map +1 -0
  211. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +5 -0
  212. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/retry-handler.js +55 -1
  214. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +57 -0
  216. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  217. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/sdk.js +9 -0
  219. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -0
  221. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
  224. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +87 -12
  227. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -1
  229. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +6 -1
  230. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -1
  231. package/packages/pi-coding-agent/package.json +1 -1
  232. package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
  233. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  234. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +83 -0
  235. package/packages/pi-coding-agent/src/core/retry-handler.ts +60 -1
  236. package/packages/pi-coding-agent/src/core/sdk.ts +10 -0
  237. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +72 -0
  238. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +15 -6
  239. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -12
  240. package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
  241. package/packages/pi-tui/dist/components/__tests__/editor.test.js +12 -0
  242. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
  243. package/packages/pi-tui/dist/components/__tests__/input.test.js +12 -0
  244. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  245. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  246. package/packages/pi-tui/dist/keys.js +27 -0
  247. package/packages/pi-tui/dist/keys.js.map +1 -1
  248. package/packages/pi-tui/src/components/__tests__/editor.test.ts +18 -0
  249. package/packages/pi-tui/src/components/__tests__/input.test.ts +18 -0
  250. package/packages/pi-tui/src/keys.ts +32 -0
  251. package/pkg/package.json +1 -1
  252. package/src/resources/agents/debugger.md +58 -0
  253. package/src/resources/agents/doc-writer.md +43 -0
  254. package/src/resources/agents/git-ops.md +56 -0
  255. package/src/resources/agents/javascript-pro.md +46 -271
  256. package/src/resources/agents/planner.md +55 -0
  257. package/src/resources/agents/refactorer.md +47 -0
  258. package/src/resources/agents/reviewer.md +48 -0
  259. package/src/resources/agents/security.md +59 -0
  260. package/src/resources/agents/tester.md +50 -0
  261. package/src/resources/agents/typescript-pro.md +41 -235
  262. package/src/resources/extensions/async-jobs/await-tool.test.ts +40 -7
  263. package/src/resources/extensions/async-jobs/await-tool.ts +7 -4
  264. package/src/resources/extensions/async-jobs/job-manager.ts +33 -3
  265. package/src/resources/extensions/claude-code-cli/partial-builder.ts +45 -12
  266. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +139 -8
  267. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +91 -2
  268. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +245 -2
  269. package/src/resources/extensions/gsd/auto/loop.ts +89 -1
  270. package/src/resources/extensions/gsd/auto/phases.ts +4 -0
  271. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -0
  272. package/src/resources/extensions/gsd/auto-prompts.ts +111 -33
  273. package/src/resources/extensions/gsd/auto-recovery.ts +10 -0
  274. package/src/resources/extensions/gsd/auto-start.ts +31 -4
  275. package/src/resources/extensions/gsd/auto.ts +29 -20
  276. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
  277. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +8 -10
  278. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +2 -5
  279. package/src/resources/extensions/gsd/commands-handlers.ts +5 -1
  280. package/src/resources/extensions/gsd/context-injector.ts +1 -1
  281. package/src/resources/extensions/gsd/custom-workflow-engine.ts +4 -8
  282. package/src/resources/extensions/gsd/definition-io.ts +18 -0
  283. package/src/resources/extensions/gsd/dispatch-guard.ts +5 -0
  284. package/src/resources/extensions/gsd/doctor-providers.ts +24 -0
  285. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +6 -3
  286. package/src/resources/extensions/gsd/error-classifier.ts +4 -1
  287. package/src/resources/extensions/gsd/gate-registry.ts +251 -0
  288. package/src/resources/extensions/gsd/git-service.ts +11 -8
  289. package/src/resources/extensions/gsd/gitignore.ts +12 -6
  290. package/src/resources/extensions/gsd/gsd-db.ts +105 -6
  291. package/src/resources/extensions/gsd/key-manager.ts +2 -0
  292. package/src/resources/extensions/gsd/milestone-validation-gates.ts +11 -13
  293. package/src/resources/extensions/gsd/notification-overlay.ts +27 -11
  294. package/src/resources/extensions/gsd/notification-store.ts +5 -4
  295. package/src/resources/extensions/gsd/preferences-skills.ts +2 -36
  296. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  297. package/src/resources/extensions/gsd/preferences.ts +19 -6
  298. package/src/resources/extensions/gsd/prompt-loader.ts +6 -1
  299. package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
  300. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -1
  301. package/src/resources/extensions/gsd/prompts/discuss.md +122 -13
  302. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  303. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  304. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  305. package/src/resources/extensions/gsd/shortcut-defs.ts +8 -1
  306. package/src/resources/extensions/gsd/state.ts +33 -2
  307. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +27 -0
  308. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +14 -0
  309. package/src/resources/extensions/gsd/tests/block-db-writes.test.ts +63 -0
  310. package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
  311. package/src/resources/extensions/gsd/tests/definition-io.test.ts +57 -0
  312. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +26 -0
  313. package/src/resources/extensions/gsd/tests/doctor-heal-fixable-warnings.test.ts +14 -0
  314. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +36 -0
  315. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +104 -0
  316. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +16 -0
  317. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +27 -0
  318. package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
  319. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +107 -5
  320. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +8 -6
  321. package/src/resources/extensions/gsd/tests/key-manager.test.ts +63 -0
  322. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +54 -0
  323. package/src/resources/extensions/gsd/tests/plan-milestone-artifact-verification.test.ts +62 -0
  324. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +34 -0
  325. package/src/resources/extensions/gsd/tests/preferences-formatting.test.ts +87 -0
  326. package/src/resources/extensions/gsd/tests/preferences.test.ts +53 -0
  327. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +96 -1
  328. package/src/resources/extensions/gsd/tests/prompt-loader-working-directory.test.ts +19 -0
  329. package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
  330. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  331. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +97 -0
  332. package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +3 -2
  333. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +41 -0
  334. package/src/resources/extensions/gsd/tools/complete-slice.ts +63 -0
  335. package/src/resources/extensions/gsd/tools/complete-task.ts +63 -0
  336. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +4 -1
  337. package/src/resources/extensions/gsd/types.ts +26 -0
  338. package/src/resources/extensions/gsd/workflow-projections.ts +8 -0
  339. package/src/resources/extensions/gsd/worktree-manager.ts +29 -3
  340. package/src/resources/extensions/gsd/write-intercept.ts +10 -1
  341. package/src/resources/extensions/ollama/index.ts +17 -8
  342. package/src/resources/extensions/ollama/ollama-client.ts +35 -6
  343. package/src/resources/extensions/ollama/ollama-discovery.ts +37 -6
  344. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +28 -0
  345. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +54 -0
  346. package/src/resources/extensions/shared/gsd-phase-state.ts +42 -0
  347. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +48 -0
  348. package/src/resources/extensions/subagent/agents.ts +10 -0
  349. package/src/resources/extensions/subagent/index.ts +18 -0
  350. package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
  351. /package/dist/web/standalone/.next/static/{cYPZv_bAhZk2ms-Pz6vsY → NzO79SOz9jHX-VY5-0t2O}/_buildManifest.js +0 -0
  352. /package/dist/web/standalone/.next/static/{cYPZv_bAhZk2ms-Pz6vsY → NzO79SOz9jHX-VY5-0t2O}/_ssgManifest.js +0 -0
@@ -55,46 +55,80 @@ function textContent(text: string): { content: Array<{ type: 'text'; text: strin
55
55
  // gsd_query filesystem reader
56
56
  // ---------------------------------------------------------------------------
57
57
 
58
- async function readProjectState(projectDir: string, _query: string): Promise<Record<string, unknown>> {
58
+ /**
59
+ * Normalized query categories for {@link readProjectState}.
60
+ *
61
+ * Maps user-supplied query strings (or empty) to the set of fields we return.
62
+ * Accepts common synonyms so the MCP client can pass intuitive values.
63
+ */
64
+ const QUERY_FIELDS = {
65
+ all: ['state', 'project', 'requirements', 'milestones'] as const,
66
+ state: ['state'] as const,
67
+ status: ['state'] as const,
68
+ project: ['project'] as const,
69
+ requirements: ['requirements'] as const,
70
+ milestones: ['milestones'] as const,
71
+ } as const;
72
+
73
+ type QueryCategory = keyof typeof QUERY_FIELDS;
74
+ type ProjectStateField = (typeof QUERY_FIELDS)[QueryCategory][number];
75
+
76
+ function normalizeQuery(query: string | undefined): QueryCategory {
77
+ const key = (query ?? 'all').trim().toLowerCase();
78
+ if (key in QUERY_FIELDS) return key as QueryCategory;
79
+ return 'all';
80
+ }
81
+
82
+ async function readProjectState(projectDir: string, query: string | undefined): Promise<Record<string, unknown>> {
59
83
  const gsdDir = join(resolve(projectDir), '.gsd');
60
- const result: Record<string, unknown> = { projectDir: resolve(projectDir) };
84
+ const category = normalizeQuery(query);
85
+ const wanted = new Set<ProjectStateField>(QUERY_FIELDS[category]);
61
86
 
62
- // STATE.md current execution state
63
- try {
64
- result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');
65
- } catch {
66
- result.state = null;
87
+ const result: Record<string, unknown> = {
88
+ projectDir: resolve(projectDir),
89
+ query: category,
90
+ };
91
+
92
+ if (wanted.has('state')) {
93
+ try {
94
+ result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');
95
+ } catch {
96
+ result.state = null;
97
+ }
67
98
  }
68
99
 
69
- // PROJECT.md — project description
70
- try {
71
- result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');
72
- } catch {
73
- result.project = null;
100
+ if (wanted.has('project')) {
101
+ try {
102
+ result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');
103
+ } catch {
104
+ result.project = null;
105
+ }
74
106
  }
75
107
 
76
- // REQUIREMENTS.md — requirement contract
77
- try {
78
- result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');
79
- } catch {
80
- result.requirements = null;
108
+ if (wanted.has('requirements')) {
109
+ try {
110
+ result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');
111
+ } catch {
112
+ result.requirements = null;
113
+ }
81
114
  }
82
115
 
83
- // List milestones with basic metadata
84
- const milestonesDir = join(gsdDir, 'milestones');
85
- try {
86
- const entries = await readdir(milestonesDir, { withFileTypes: true });
87
- const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];
88
- for (const entry of entries) {
89
- if (!entry.isDirectory()) continue;
90
- const mDir = join(milestonesDir, entry.name);
91
- const hasRoadmap = await fileExists(join(mDir, `${entry.name}-ROADMAP.md`));
92
- const hasSummary = await fileExists(join(mDir, `${entry.name}-SUMMARY.md`));
93
- milestones.push({ id: entry.name, hasRoadmap, hasSummary });
116
+ if (wanted.has('milestones')) {
117
+ const milestonesDir = join(gsdDir, 'milestones');
118
+ try {
119
+ const entries = await readdir(milestonesDir, { withFileTypes: true });
120
+ const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];
121
+ for (const entry of entries) {
122
+ if (!entry.isDirectory()) continue;
123
+ const mDir = join(milestonesDir, entry.name);
124
+ const hasRoadmap = await fileExists(join(mDir, `${entry.name}-ROADMAP.md`));
125
+ const hasSummary = await fileExists(join(mDir, `${entry.name}-SUMMARY.md`));
126
+ milestones.push({ id: entry.name, hasRoadmap, hasSummary });
127
+ }
128
+ result.milestones = milestones;
129
+ } catch {
130
+ result.milestones = [];
94
131
  }
95
- result.milestones = milestones;
96
- } catch {
97
- result.milestones = [];
98
132
  }
99
133
 
100
134
  return result;
@@ -128,8 +162,25 @@ interface ElicitRequestFormParams {
128
162
  };
129
163
  }
130
164
 
165
+ /**
166
+ * Handler extra — the second argument passed by McpServer.tool handlers.
167
+ * Contains an AbortSignal scoped to the JSON-RPC request (cancelled when
168
+ * the client cancels the `tools/call`) plus other per-request metadata.
169
+ * Tools that can actually be stopped mid-flight should honour `signal`.
170
+ */
171
+ export interface McpToolExtra {
172
+ signal?: AbortSignal;
173
+ requestId?: string | number;
174
+ sendNotification?: (notification: unknown) => void | Promise<void>;
175
+ }
176
+
131
177
  interface McpServerInstance {
132
- tool(name: string, description: string, params: Record<string, unknown>, handler: (args: Record<string, unknown>) => Promise<unknown>): unknown;
178
+ tool(
179
+ name: string,
180
+ description: string,
181
+ params: Record<string, unknown>,
182
+ handler: (args: Record<string, unknown>, extra?: McpToolExtra) => Promise<unknown>,
183
+ ): unknown;
133
184
  server: {
134
185
  elicitInput(
135
186
  params: AskUserQuestionsElicitRequest | ElicitRequestFormParams,
@@ -302,7 +353,12 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
302
353
  );
303
354
 
304
355
  // -----------------------------------------------------------------------
305
- // gsd_execute — start a new GSD auto-mode session
356
+ // gsd_execute — start a new GSD auto-mode session.
357
+ //
358
+ // If the JSON-RPC request is aborted while the session is starting (or
359
+ // immediately after), we cancel the session so we don't leak a background
360
+ // RpcClient process. Once the session is running the caller should use
361
+ // `gsd_cancel` to stop it via sessionId.
306
362
  // -----------------------------------------------------------------------
307
363
  server.tool(
308
364
  'gsd_execute',
@@ -313,12 +369,20 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
313
369
  model: z.string().optional().describe('Model ID override'),
314
370
  bare: z.boolean().optional().describe('Run in bare mode (skip user config)'),
315
371
  },
316
- async (args: Record<string, unknown>) => {
372
+ async (args: Record<string, unknown>, extra?: McpToolExtra) => {
317
373
  const { projectDir, command, model, bare } = args as {
318
374
  projectDir: string; command?: string; model?: string; bare?: boolean;
319
375
  };
320
376
  try {
321
377
  const sessionId = await sessionManager.startSession(projectDir, { command, model, bare });
378
+
379
+ // If the client aborted while startSession was running, cancel the
380
+ // newly-created session rather than leaving an orphaned process.
381
+ if (extra?.signal?.aborted) {
382
+ await sessionManager.cancelSession(sessionId).catch(() => { /* swallow */ });
383
+ return errorContent('gsd_execute aborted by client before returning');
384
+ }
385
+
322
386
  return jsonContent({ sessionId, status: 'started' });
323
387
  } catch (err) {
324
388
  return errorContent(err instanceof Error ? err.message : String(err));
@@ -411,17 +475,25 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
411
475
  );
412
476
 
413
477
  // -----------------------------------------------------------------------
414
- // gsd_query — read project state from filesystem (no session needed)
478
+ // gsd_query — read project state from filesystem (no session needed).
479
+ //
480
+ // `query` is optional: when omitted the tool returns all fields (STATE.md,
481
+ // PROJECT.md, requirements, milestone listing). Accepted narrow values:
482
+ // "state" / "status", "project", "requirements", "milestones", "all".
483
+ // Unknown values fall back to "all" for forward-compatibility.
415
484
  // -----------------------------------------------------------------------
416
485
  server.tool(
417
486
  'gsd_query',
418
- 'Query GSD project state from the filesystem. Returns STATE.md, PROJECT.md, requirements, and milestone listing. Does not require an active session.',
487
+ 'Query GSD project state from the filesystem. By default returns STATE.md, PROJECT.md, requirements, and milestone listing. Pass `query` to narrow the response (accepted: "state"/"status", "project", "requirements", "milestones", "all"). Does not require an active session.',
419
488
  {
420
489
  projectDir: z.string().describe('Absolute path to the project directory'),
421
- query: z.string().describe('What to query (e.g. "status", "milestones", "requirements")'),
490
+ query: z
491
+ .enum(['all', 'state', 'status', 'project', 'requirements', 'milestones'])
492
+ .optional()
493
+ .describe('Narrow the response to a single field (default: "all")'),
422
494
  },
423
495
  async (args: Record<string, unknown>) => {
424
- const { projectDir, query } = args as { projectDir: string; query: string };
496
+ const { projectDir, query } = args as { projectDir: string; query?: string };
425
497
  try {
426
498
  const state = await readProjectState(projectDir, query);
427
499
  return jsonContent(state);
@@ -787,7 +787,7 @@ const saveGateResultParams = {
787
787
  projectDir: projectDirParam,
788
788
  milestoneId: z.string().describe("Milestone ID (e.g. M001)"),
789
789
  sliceId: z.string().describe("Slice ID (e.g. S01)"),
790
- gateId: z.enum(["Q3", "Q4", "Q5", "Q6", "Q7", "Q8"]).describe("Gate ID"),
790
+ gateId: z.enum(["Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "MV01", "MV02", "MV03", "MV04"]).describe("Gate ID"),
791
791
  taskId: z.string().optional().describe("Task ID for task-scoped gates"),
792
792
  verdict: z.enum(["pass", "flag", "omitted"]).describe("Gate verdict"),
793
793
  rationale: z.string().describe("One-sentence justification"),
@@ -111,6 +111,7 @@ export function getEnvApiKey(provider) {
111
111
  "opencode-go": "OPENCODE_API_KEY",
112
112
  "kimi-coding": "KIMI_API_KEY",
113
113
  "alibaba-coding-plan": "ALIBABA_API_KEY",
114
+ "alibaba-dashscope": "DASHSCOPE_API_KEY",
114
115
  ollama: "OLLAMA_API_KEY",
115
116
  "ollama-cloud": "OLLAMA_API_KEY",
116
117
  "custom-openai": "CUSTOM_OPENAI_API_KEY",
@@ -1 +1 @@
1
- {"version":3,"file":"env-api-keys.js","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"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","sourcesContent":["// NEVER convert to top-level imports - breaks browser/Vite builds (web-ui)\nlet _existsSync: typeof import(\"node:fs\").existsSync | null = null;\nlet _homedir: typeof import(\"node:os\").homedir | null = null;\nlet _join: typeof import(\"node:path\").join | null = null;\n\ntype DynamicImport = (specifier: string) => Promise<unknown>;\n\nconst dynamicImport: DynamicImport = (specifier) => import(specifier);\nconst NODE_FS_SPECIFIER = \"node:\" + \"fs\";\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nconst NODE_PATH_SPECIFIER = \"node:\" + \"path\";\n\n// Eagerly load in Node.js/Bun environment only\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\tdynamicImport(NODE_FS_SPECIFIER).then((m) => {\n\t\t_existsSync = (m as typeof import(\"node:fs\")).existsSync;\n\t});\n\tdynamicImport(NODE_OS_SPECIFIER).then((m) => {\n\t\t_homedir = (m as typeof import(\"node:os\")).homedir;\n\t});\n\tdynamicImport(NODE_PATH_SPECIFIER).then((m) => {\n\t\t_join = (m as typeof import(\"node:path\")).join;\n\t});\n}\n\nimport type { KnownProvider } from \"./types.js\";\n\nlet cachedVertexAdcCredentialsExists: boolean | null = null;\n\nfunction hasVertexAdcCredentials(): boolean {\n\tif (cachedVertexAdcCredentialsExists === null) {\n\t\t// If node modules haven't loaded yet (async import race at startup),\n\t\t// return false WITHOUT caching so the next call retries once they're ready.\n\t\t// Only cache false permanently in a browser environment where fs is never available.\n\t\tif (!_existsSync || !_homedir || !_join) {\n\t\t\tconst isNode = typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun);\n\t\t\tif (!isNode) {\n\t\t\t\t// Definitively in a browser — safe to cache false permanently\n\t\t\t\tcachedVertexAdcCredentialsExists = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)\n\t\tconst gacPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;\n\t\tif (gacPath) {\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(gacPath);\n\t\t} else {\n\t\t\t// Fall back to default ADC path (lazy evaluation)\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(\n\t\t\t\t_join(_homedir(), \".config\", \"gcloud\", \"application_default_credentials.json\"),\n\t\t\t);\n\t\t}\n\t}\n\treturn cachedVertexAdcCredentialsExists;\n}\n\n/**\n * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY.\n *\n * Will not return API keys for providers that require OAuth tokens.\n */\nexport function getEnvApiKey(provider: KnownProvider): string | undefined;\nexport function getEnvApiKey(provider: string): string | undefined;\nexport function getEnvApiKey(provider: any): string | undefined {\n\t// Fall back to environment variables\n\tif (provider === \"github-copilot\") {\n\t\treturn process.env.COPILOT_GITHUB_TOKEN || process.env.GH_TOKEN || process.env.GITHUB_TOKEN;\n\t}\n\n\t// ANTHROPIC_OAUTH_TOKEN takes precedence over ANTHROPIC_API_KEY\n\tif (provider === \"anthropic\") {\n\t\treturn process.env.ANTHROPIC_OAUTH_TOKEN || process.env.ANTHROPIC_API_KEY;\n\t}\n\n\t// Anthropic on Vertex AI uses Application Default Credentials.\n\t// Detected via ANTHROPIC_VERTEX_PROJECT_ID (same env var as Claude Code).\n\tif (provider === \"anthropic-vertex\") {\n\t\tconst hasProject = !!process.env.ANTHROPIC_VERTEX_PROJECT_ID;\n\t\tif (hasProject) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t\t// Fall back to Google Cloud project env vars\n\t\tconst hasGoogleProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT);\n\t\tif (hasGoogleProject && hasVertexAdcCredentials()) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\t// Vertex AI uses Application Default Credentials, not API keys.\n\t// Auth is configured via `gcloud auth application-default login`.\n\tif (provider === \"google-vertex\") {\n\t\tconst hasCredentials = hasVertexAdcCredentials();\n\t\tconst hasProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT);\n\t\tconst hasLocation = !!process.env.GOOGLE_CLOUD_LOCATION;\n\n\t\tif (hasCredentials && hasProject && hasLocation) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tif (provider === \"amazon-bedrock\") {\n\t\t// Amazon Bedrock supports multiple credential sources:\n\t\t// 1. AWS_PROFILE - named profile from ~/.aws/credentials\n\t\t// 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys\n\t\t// 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock API keys (bearer token)\n\t\t// 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles\n\t\t// 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)\n\t\t// 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)\n\t\tif (\n\t\t\tprocess.env.AWS_PROFILE ||\n\t\t\t(process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) ||\n\t\t\tprocess.env.AWS_BEARER_TOKEN_BEDROCK ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_FULL_URI ||\n\t\t\tprocess.env.AWS_WEB_IDENTITY_TOKEN_FILE\n\t\t) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tconst envMap: Record<string, string> = {\n\t\topenai: \"OPENAI_API_KEY\",\n\t\t\"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n\t\tgoogle: \"GEMINI_API_KEY\",\n\t\tgroq: \"GROQ_API_KEY\",\n\t\tcerebras: \"CEREBRAS_API_KEY\",\n\t\txai: \"XAI_API_KEY\",\n\t\topenrouter: \"OPENROUTER_API_KEY\",\n\t\t\"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n\t\tzai: \"ZAI_API_KEY\",\n\t\tmistral: \"MISTRAL_API_KEY\",\n\t\tminimax: \"MINIMAX_API_KEY\",\n\t\t\"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n\t\thuggingface: \"HF_TOKEN\",\n\t\topencode: \"OPENCODE_API_KEY\",\n\t\t\"opencode-go\": \"OPENCODE_API_KEY\",\n\t\t\"kimi-coding\": \"KIMI_API_KEY\",\n\t\t\"alibaba-coding-plan\": \"ALIBABA_API_KEY\",\n\t\tollama: \"OLLAMA_API_KEY\",\n\t\t\"ollama-cloud\": \"OLLAMA_API_KEY\",\n\t\t\"custom-openai\": \"CUSTOM_OPENAI_API_KEY\",\n\t};\n\n\tconst envVar = envMap[provider];\n\treturn envVar ? process.env[envVar] : undefined;\n}\n"]}
1
+ {"version":3,"file":"env-api-keys.js","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"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","sourcesContent":["// NEVER convert to top-level imports - breaks browser/Vite builds (web-ui)\nlet _existsSync: typeof import(\"node:fs\").existsSync | null = null;\nlet _homedir: typeof import(\"node:os\").homedir | null = null;\nlet _join: typeof import(\"node:path\").join | null = null;\n\ntype DynamicImport = (specifier: string) => Promise<unknown>;\n\nconst dynamicImport: DynamicImport = (specifier) => import(specifier);\nconst NODE_FS_SPECIFIER = \"node:\" + \"fs\";\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nconst NODE_PATH_SPECIFIER = \"node:\" + \"path\";\n\n// Eagerly load in Node.js/Bun environment only\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\tdynamicImport(NODE_FS_SPECIFIER).then((m) => {\n\t\t_existsSync = (m as typeof import(\"node:fs\")).existsSync;\n\t});\n\tdynamicImport(NODE_OS_SPECIFIER).then((m) => {\n\t\t_homedir = (m as typeof import(\"node:os\")).homedir;\n\t});\n\tdynamicImport(NODE_PATH_SPECIFIER).then((m) => {\n\t\t_join = (m as typeof import(\"node:path\")).join;\n\t});\n}\n\nimport type { KnownProvider } from \"./types.js\";\n\nlet cachedVertexAdcCredentialsExists: boolean | null = null;\n\nfunction hasVertexAdcCredentials(): boolean {\n\tif (cachedVertexAdcCredentialsExists === null) {\n\t\t// If node modules haven't loaded yet (async import race at startup),\n\t\t// return false WITHOUT caching so the next call retries once they're ready.\n\t\t// Only cache false permanently in a browser environment where fs is never available.\n\t\tif (!_existsSync || !_homedir || !_join) {\n\t\t\tconst isNode = typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun);\n\t\t\tif (!isNode) {\n\t\t\t\t// Definitively in a browser — safe to cache false permanently\n\t\t\t\tcachedVertexAdcCredentialsExists = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)\n\t\tconst gacPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;\n\t\tif (gacPath) {\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(gacPath);\n\t\t} else {\n\t\t\t// Fall back to default ADC path (lazy evaluation)\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(\n\t\t\t\t_join(_homedir(), \".config\", \"gcloud\", \"application_default_credentials.json\"),\n\t\t\t);\n\t\t}\n\t}\n\treturn cachedVertexAdcCredentialsExists;\n}\n\n/**\n * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY.\n *\n * Will not return API keys for providers that require OAuth tokens.\n */\nexport function getEnvApiKey(provider: KnownProvider): string | undefined;\nexport function getEnvApiKey(provider: string): string | undefined;\nexport function getEnvApiKey(provider: any): string | undefined {\n\t// Fall back to environment variables\n\tif (provider === \"github-copilot\") {\n\t\treturn process.env.COPILOT_GITHUB_TOKEN || process.env.GH_TOKEN || process.env.GITHUB_TOKEN;\n\t}\n\n\t// ANTHROPIC_OAUTH_TOKEN takes precedence over ANTHROPIC_API_KEY\n\tif (provider === \"anthropic\") {\n\t\treturn process.env.ANTHROPIC_OAUTH_TOKEN || process.env.ANTHROPIC_API_KEY;\n\t}\n\n\t// Anthropic on Vertex AI uses Application Default Credentials.\n\t// Detected via ANTHROPIC_VERTEX_PROJECT_ID (same env var as Claude Code).\n\tif (provider === \"anthropic-vertex\") {\n\t\tconst hasProject = !!process.env.ANTHROPIC_VERTEX_PROJECT_ID;\n\t\tif (hasProject) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t\t// Fall back to Google Cloud project env vars\n\t\tconst hasGoogleProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT);\n\t\tif (hasGoogleProject && hasVertexAdcCredentials()) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\t// Vertex AI uses Application Default Credentials, not API keys.\n\t// Auth is configured via `gcloud auth application-default login`.\n\tif (provider === \"google-vertex\") {\n\t\tconst hasCredentials = hasVertexAdcCredentials();\n\t\tconst hasProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT);\n\t\tconst hasLocation = !!process.env.GOOGLE_CLOUD_LOCATION;\n\n\t\tif (hasCredentials && hasProject && hasLocation) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tif (provider === \"amazon-bedrock\") {\n\t\t// Amazon Bedrock supports multiple credential sources:\n\t\t// 1. AWS_PROFILE - named profile from ~/.aws/credentials\n\t\t// 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys\n\t\t// 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock API keys (bearer token)\n\t\t// 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles\n\t\t// 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)\n\t\t// 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)\n\t\tif (\n\t\t\tprocess.env.AWS_PROFILE ||\n\t\t\t(process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) ||\n\t\t\tprocess.env.AWS_BEARER_TOKEN_BEDROCK ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_FULL_URI ||\n\t\t\tprocess.env.AWS_WEB_IDENTITY_TOKEN_FILE\n\t\t) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tconst envMap: Record<string, string> = {\n\t\topenai: \"OPENAI_API_KEY\",\n\t\t\"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n\t\tgoogle: \"GEMINI_API_KEY\",\n\t\tgroq: \"GROQ_API_KEY\",\n\t\tcerebras: \"CEREBRAS_API_KEY\",\n\t\txai: \"XAI_API_KEY\",\n\t\topenrouter: \"OPENROUTER_API_KEY\",\n\t\t\"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n\t\tzai: \"ZAI_API_KEY\",\n\t\tmistral: \"MISTRAL_API_KEY\",\n\t\tminimax: \"MINIMAX_API_KEY\",\n\t\t\"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n\t\thuggingface: \"HF_TOKEN\",\n\t\topencode: \"OPENCODE_API_KEY\",\n\t\t\"opencode-go\": \"OPENCODE_API_KEY\",\n\t\t\"kimi-coding\": \"KIMI_API_KEY\",\n\t\t\"alibaba-coding-plan\": \"ALIBABA_API_KEY\",\n\t\t\"alibaba-dashscope\": \"DASHSCOPE_API_KEY\",\n\t\tollama: \"OLLAMA_API_KEY\",\n\t\t\"ollama-cloud\": \"OLLAMA_API_KEY\",\n\t\t\"custom-openai\": \"CUSTOM_OPENAI_API_KEY\",\n\t};\n\n\tconst envVar = envMap[provider];\n\treturn envVar ? process.env[envVar] : undefined;\n}\n"]}
@@ -169,6 +169,111 @@ export declare const CUSTOM_MODELS: {
169
169
  };
170
170
  };
171
171
  };
172
+ readonly "alibaba-dashscope": {
173
+ readonly "qwen3-max": {
174
+ id: string;
175
+ name: string;
176
+ api: "openai-completions";
177
+ provider: string;
178
+ baseUrl: string;
179
+ reasoning: true;
180
+ input: "text"[];
181
+ cost: {
182
+ input: number;
183
+ output: number;
184
+ cacheRead: number;
185
+ cacheWrite: number;
186
+ };
187
+ contextWindow: number;
188
+ maxTokens: number;
189
+ compat: {
190
+ thinkingFormat: "qwen";
191
+ supportsDeveloperRole: false;
192
+ };
193
+ };
194
+ readonly "qwen3.5-plus": {
195
+ id: string;
196
+ name: string;
197
+ api: "openai-completions";
198
+ provider: string;
199
+ baseUrl: string;
200
+ reasoning: true;
201
+ input: "text"[];
202
+ cost: {
203
+ input: number;
204
+ output: number;
205
+ cacheRead: number;
206
+ cacheWrite: number;
207
+ };
208
+ contextWindow: number;
209
+ maxTokens: number;
210
+ compat: {
211
+ thinkingFormat: "qwen";
212
+ supportsDeveloperRole: false;
213
+ };
214
+ };
215
+ readonly "qwen3.5-flash": {
216
+ id: string;
217
+ name: string;
218
+ api: "openai-completions";
219
+ provider: string;
220
+ baseUrl: string;
221
+ reasoning: false;
222
+ input: "text"[];
223
+ cost: {
224
+ input: number;
225
+ output: number;
226
+ cacheRead: number;
227
+ cacheWrite: number;
228
+ };
229
+ contextWindow: number;
230
+ maxTokens: number;
231
+ compat: {
232
+ supportsDeveloperRole: false;
233
+ };
234
+ };
235
+ readonly "qwen3-coder-plus": {
236
+ id: string;
237
+ name: string;
238
+ api: "openai-completions";
239
+ provider: string;
240
+ baseUrl: string;
241
+ reasoning: false;
242
+ input: "text"[];
243
+ cost: {
244
+ input: number;
245
+ output: number;
246
+ cacheRead: number;
247
+ cacheWrite: number;
248
+ };
249
+ contextWindow: number;
250
+ maxTokens: number;
251
+ compat: {
252
+ supportsDeveloperRole: false;
253
+ };
254
+ };
255
+ readonly "qwen3.6-plus": {
256
+ id: string;
257
+ name: string;
258
+ api: "openai-completions";
259
+ provider: string;
260
+ baseUrl: string;
261
+ reasoning: true;
262
+ input: "text"[];
263
+ cost: {
264
+ input: number;
265
+ output: number;
266
+ cacheRead: number;
267
+ cacheWrite: number;
268
+ };
269
+ contextWindow: number;
270
+ maxTokens: number;
271
+ compat: {
272
+ thinkingFormat: "qwen";
273
+ supportsDeveloperRole: false;
274
+ };
275
+ };
276
+ };
172
277
  readonly zai: {
173
278
  readonly "glm-5.1": {
174
279
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"models.custom.d.ts","sourceRoot":"","sources":["../src/models.custom.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqLhB,CAAC"}
1
+ {"version":3,"file":"models.custom.d.ts","sourceRoot":"","sources":["../src/models.custom.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuRhB,CAAC"}
@@ -166,6 +166,103 @@ export const CUSTOM_MODELS = {
166
166
  compat: { thinkingFormat: "zai", supportsDeveloperRole: false },
167
167
  },
168
168
  },
169
+ // ─── Alibaba DashScope ───────────────────────────────────────────────
170
+ // Regular DashScope API for users without the Coding Plan.
171
+ // Uses the international OpenAI-compatible endpoint.
172
+ // Requires DASHSCOPE_API_KEY from: dashscope.console.aliyun.com
173
+ // Pricing: https://www.alibabacloud.com/help/en/model-studio/model-pricing
174
+ "alibaba-dashscope": {
175
+ "qwen3-max": {
176
+ id: "qwen3-max",
177
+ name: "Qwen3 Max",
178
+ api: "openai-completions",
179
+ provider: "alibaba-dashscope",
180
+ baseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
181
+ reasoning: true,
182
+ input: ["text"],
183
+ cost: {
184
+ input: 1.2,
185
+ output: 6,
186
+ cacheRead: 0,
187
+ cacheWrite: 0,
188
+ },
189
+ contextWindow: 1000000,
190
+ maxTokens: 32768,
191
+ compat: { thinkingFormat: "qwen", supportsDeveloperRole: false },
192
+ },
193
+ "qwen3.5-plus": {
194
+ id: "qwen3.5-plus",
195
+ name: "Qwen3.5 Plus",
196
+ api: "openai-completions",
197
+ provider: "alibaba-dashscope",
198
+ baseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
199
+ reasoning: true,
200
+ input: ["text"],
201
+ cost: {
202
+ input: 0.4,
203
+ output: 1.2,
204
+ cacheRead: 0,
205
+ cacheWrite: 0,
206
+ },
207
+ contextWindow: 1000000,
208
+ maxTokens: 65536,
209
+ compat: { thinkingFormat: "qwen", supportsDeveloperRole: false },
210
+ },
211
+ "qwen3.5-flash": {
212
+ id: "qwen3.5-flash",
213
+ name: "Qwen3.5 Flash",
214
+ api: "openai-completions",
215
+ provider: "alibaba-dashscope",
216
+ baseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
217
+ reasoning: false,
218
+ input: ["text"],
219
+ cost: {
220
+ input: 0.1,
221
+ output: 0.4,
222
+ cacheRead: 0,
223
+ cacheWrite: 0,
224
+ },
225
+ contextWindow: 1000000,
226
+ maxTokens: 32768,
227
+ compat: { supportsDeveloperRole: false },
228
+ },
229
+ "qwen3-coder-plus": {
230
+ id: "qwen3-coder-plus",
231
+ name: "Qwen3 Coder Plus",
232
+ api: "openai-completions",
233
+ provider: "alibaba-dashscope",
234
+ baseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
235
+ reasoning: false,
236
+ input: ["text"],
237
+ cost: {
238
+ input: 1.0,
239
+ output: 5.0,
240
+ cacheRead: 0,
241
+ cacheWrite: 0,
242
+ },
243
+ contextWindow: 1000000,
244
+ maxTokens: 65536,
245
+ compat: { supportsDeveloperRole: false },
246
+ },
247
+ "qwen3.6-plus": {
248
+ id: "qwen3.6-plus",
249
+ name: "Qwen3.6 Plus",
250
+ api: "openai-completions",
251
+ provider: "alibaba-dashscope",
252
+ baseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
253
+ reasoning: true,
254
+ input: ["text"],
255
+ cost: {
256
+ input: 0.5,
257
+ output: 3.0,
258
+ cacheRead: 0,
259
+ cacheWrite: 0,
260
+ },
261
+ contextWindow: 1000000,
262
+ maxTokens: 65536,
263
+ compat: { thinkingFormat: "qwen", supportsDeveloperRole: false },
264
+ },
265
+ },
169
266
  // ─── Z.AI (GLM-5.1) ────────────────────────────────────────────────
170
267
  // GLM-5.1 is the latest GLM model from Zhipu AI, not yet in models.dev.
171
268
  // Uses the Z.AI Coding Plan endpoint (OpenAI-compatible).
@@ -1 +1 @@
1
- {"version":3,"file":"models.custom.js","sourceRoot":"","sources":["../src/models.custom.ts"],"names":[],"mappings":"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","sourcesContent":["// Manually-maintained model definitions for providers NOT tracked by models.dev.\n//\n// The auto-generated file (models.generated.ts) is rebuilt from the models.dev\n// third-party catalog. Providers that use proprietary endpoints and are not\n// listed on models.dev must be defined here so they survive regeneration.\n//\n// See: https://github.com/gsd-build/gsd-2/issues/2339\n//\n// To add a custom provider:\n// 1. Add its model definitions below following the existing pattern.\n// 2. Add its API key mapping to env-api-keys.ts.\n// 3. Add its provider name to KnownProvider in types.ts (if not already there).\n\nimport type { Model } from \"./types.js\";\n\nexport const CUSTOM_MODELS = {\n\t// ─── Alibaba Coding Plan ─────────────────────────────────────────────\n\t// Direct Alibaba DashScope Coding Plan endpoint (OpenAI-compatible).\n\t// NOT the same as alibaba/* models on OpenRouter — different endpoint & auth.\n\t// Original PR: #295 | Fixes: #1003, #1055, #1057\n\t\"alibaba-coding-plan\": {\n\t\t\"qwen3.5-plus\": {\n\t\t\tid: \"qwen3.5-plus\",\n\t\t\tname: \"Qwen3.5 Plus\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 983616,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3-max-2026-01-23\": {\n\t\t\tid: \"qwen3-max-2026-01-23\",\n\t\t\tname: \"Qwen3 Max 2026-01-23\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 258048,\n\t\t\tmaxTokens: 32768,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3-coder-next\": {\n\t\t\tid: \"qwen3-coder-next\",\n\t\t\tname: \"Qwen3 Coder Next\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: false,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 204800,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3-coder-plus\": {\n\t\t\tid: \"qwen3-coder-plus\",\n\t\t\tname: \"Qwen3 Coder Plus\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: false,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 997952,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"MiniMax-M2.5\": {\n\t\t\tid: \"MiniMax-M2.5\",\n\t\t\tname: \"MiniMax M2.5\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 196608,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: {\n\t\t\t\tsupportsStore: false,\n\t\t\t\tsupportsDeveloperRole: false,\n\t\t\t\tsupportsReasoningEffort: true,\n\t\t\t\tmaxTokensField: \"max_tokens\",\n\t\t\t},\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"glm-5\": {\n\t\t\tid: \"glm-5\",\n\t\t\tname: \"GLM-5\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 202752,\n\t\t\tmaxTokens: 16384,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"glm-4.7\": {\n\t\t\tid: \"glm-4.7\",\n\t\t\tname: \"GLM-4.7\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 169984,\n\t\t\tmaxTokens: 16384,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"kimi-k2.5\": {\n\t\t\tid: \"kimi-k2.5\",\n\t\t\tname: \"Kimi K2.5\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 258048,\n\t\t\tmaxTokens: 32768,\n\t\t\tcompat: { thinkingFormat: \"zai\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t},\n\n\t// ─── Z.AI (GLM-5.1) ────────────────────────────────────────────────\n\t// GLM-5.1 is the latest GLM model from Zhipu AI, not yet in models.dev.\n\t// Uses the Z.AI Coding Plan endpoint (OpenAI-compatible).\n\t// Ref: https://docs.z.ai/devpack/using5.1\n\t\"zai\": {\n\t\t\"glm-5.1\": {\n\t\t\tid: \"glm-5.1\",\n\t\t\tname: \"GLM-5.1\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"zai\",\n\t\t\tbaseUrl: \"https://api.z.ai/api/coding/paas/v4\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 1,\n\t\t\t\toutput: 3.2,\n\t\t\t\tcacheRead: 0.2,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 204800,\n\t\t\tmaxTokens: 131072,\n\t\t\tcompat: { thinkingFormat: \"zai\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t},\n} as const;\n"]}
1
+ {"version":3,"file":"models.custom.js","sourceRoot":"","sources":["../src/models.custom.ts"],"names":[],"mappings":"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","sourcesContent":["// Manually-maintained model definitions for providers NOT tracked by models.dev.\n//\n// The auto-generated file (models.generated.ts) is rebuilt from the models.dev\n// third-party catalog. Providers that use proprietary endpoints and are not\n// listed on models.dev must be defined here so they survive regeneration.\n//\n// See: https://github.com/gsd-build/gsd-2/issues/2339\n//\n// To add a custom provider:\n// 1. Add its model definitions below following the existing pattern.\n// 2. Add its API key mapping to env-api-keys.ts.\n// 3. Add its provider name to KnownProvider in types.ts (if not already there).\n\nimport type { Model } from \"./types.js\";\n\nexport const CUSTOM_MODELS = {\n\t// ─── Alibaba Coding Plan ─────────────────────────────────────────────\n\t// Direct Alibaba DashScope Coding Plan endpoint (OpenAI-compatible).\n\t// NOT the same as alibaba/* models on OpenRouter — different endpoint & auth.\n\t// Original PR: #295 | Fixes: #1003, #1055, #1057\n\t\"alibaba-coding-plan\": {\n\t\t\"qwen3.5-plus\": {\n\t\t\tid: \"qwen3.5-plus\",\n\t\t\tname: \"Qwen3.5 Plus\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 983616,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3-max-2026-01-23\": {\n\t\t\tid: \"qwen3-max-2026-01-23\",\n\t\t\tname: \"Qwen3 Max 2026-01-23\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 258048,\n\t\t\tmaxTokens: 32768,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3-coder-next\": {\n\t\t\tid: \"qwen3-coder-next\",\n\t\t\tname: \"Qwen3 Coder Next\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: false,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 204800,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3-coder-plus\": {\n\t\t\tid: \"qwen3-coder-plus\",\n\t\t\tname: \"Qwen3 Coder Plus\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: false,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 997952,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"MiniMax-M2.5\": {\n\t\t\tid: \"MiniMax-M2.5\",\n\t\t\tname: \"MiniMax M2.5\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 196608,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: {\n\t\t\t\tsupportsStore: false,\n\t\t\t\tsupportsDeveloperRole: false,\n\t\t\t\tsupportsReasoningEffort: true,\n\t\t\t\tmaxTokensField: \"max_tokens\",\n\t\t\t},\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"glm-5\": {\n\t\t\tid: \"glm-5\",\n\t\t\tname: \"GLM-5\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 202752,\n\t\t\tmaxTokens: 16384,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"glm-4.7\": {\n\t\t\tid: \"glm-4.7\",\n\t\t\tname: \"GLM-4.7\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 169984,\n\t\t\tmaxTokens: 16384,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"kimi-k2.5\": {\n\t\t\tid: \"kimi-k2.5\",\n\t\t\tname: \"Kimi K2.5\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-coding-plan\",\n\t\t\tbaseUrl: \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 258048,\n\t\t\tmaxTokens: 32768,\n\t\t\tcompat: { thinkingFormat: \"zai\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t},\n\n\t// ─── Alibaba DashScope ───────────────────────────────────────────────\n\t// Regular DashScope API for users without the Coding Plan.\n\t// Uses the international OpenAI-compatible endpoint.\n\t// Requires DASHSCOPE_API_KEY from: dashscope.console.aliyun.com\n\t// Pricing: https://www.alibabacloud.com/help/en/model-studio/model-pricing\n\t\"alibaba-dashscope\": {\n\t\t\"qwen3-max\": {\n\t\t\tid: \"qwen3-max\",\n\t\t\tname: \"Qwen3 Max\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-dashscope\",\n\t\t\tbaseUrl: \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 1.2,\n\t\t\t\toutput: 6,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 32768,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3.5-plus\": {\n\t\t\tid: \"qwen3.5-plus\",\n\t\t\tname: \"Qwen3.5 Plus\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-dashscope\",\n\t\t\tbaseUrl: \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0.4,\n\t\t\t\toutput: 1.2,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3.5-flash\": {\n\t\t\tid: \"qwen3.5-flash\",\n\t\t\tname: \"Qwen3.5 Flash\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-dashscope\",\n\t\t\tbaseUrl: \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1\",\n\t\t\treasoning: false,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0.1,\n\t\t\t\toutput: 0.4,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 32768,\n\t\t\tcompat: { supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3-coder-plus\": {\n\t\t\tid: \"qwen3-coder-plus\",\n\t\t\tname: \"Qwen3 Coder Plus\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-dashscope\",\n\t\t\tbaseUrl: \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1\",\n\t\t\treasoning: false,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 1.0,\n\t\t\t\toutput: 5.0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t\t\"qwen3.6-plus\": {\n\t\t\tid: \"qwen3.6-plus\",\n\t\t\tname: \"Qwen3.6 Plus\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"alibaba-dashscope\",\n\t\t\tbaseUrl: \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 0.5,\n\t\t\t\toutput: 3.0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tcompat: { thinkingFormat: \"qwen\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t},\n\n\t// ─── Z.AI (GLM-5.1) ────────────────────────────────────────────────\n\t// GLM-5.1 is the latest GLM model from Zhipu AI, not yet in models.dev.\n\t// Uses the Z.AI Coding Plan endpoint (OpenAI-compatible).\n\t// Ref: https://docs.z.ai/devpack/using5.1\n\t\"zai\": {\n\t\t\"glm-5.1\": {\n\t\t\tid: \"glm-5.1\",\n\t\t\tname: \"GLM-5.1\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"zai\",\n\t\t\tbaseUrl: \"https://api.z.ai/api/coding/paas/v4\",\n\t\t\treasoning: true,\n\t\t\tinput: [\"text\"],\n\t\t\tcost: {\n\t\t\t\tinput: 1,\n\t\t\t\toutput: 3.2,\n\t\t\t\tcacheRead: 0.2,\n\t\t\t\tcacheWrite: 0,\n\t\t\t},\n\t\t\tcontextWindow: 204800,\n\t\t\tmaxTokens: 131072,\n\t\t\tcompat: { thinkingFormat: \"zai\", supportsDeveloperRole: false },\n\t\t} satisfies Model<\"openai-completions\">,\n\t},\n} as const;\n"]}