gsd-pi 2.74.0-dev.16f2f3b → 2.74.0-dev.20f79a8

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 (246) hide show
  1. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -3
  2. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
  3. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +45 -4
  4. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  5. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  6. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  7. package/dist/web/standalone/.next/BUILD_ID +1 -1
  8. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  9. package/dist/web/standalone/.next/build-manifest.json +2 -2
  10. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  11. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  12. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  20. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  28. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  29. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  30. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  31. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  32. package/dist/web/standalone/.next/server/app/index.html +1 -1
  33. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  40. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  41. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  42. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  43. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  44. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  45. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  46. package/package.json +1 -1
  47. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  48. package/packages/pi-ai/dist/index.d.ts +1 -9
  49. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  50. package/packages/pi-ai/dist/index.js +1 -9
  51. package/packages/pi-ai/dist/index.js.map +1 -1
  52. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  53. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  54. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  55. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  56. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  57. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  58. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  59. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  60. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  61. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  62. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  63. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  64. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  65. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  66. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  67. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  68. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  69. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  70. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  71. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  72. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  73. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  74. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  75. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  76. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  77. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  78. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  79. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  80. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  81. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  82. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  83. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  84. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  85. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  86. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  87. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  88. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  89. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  90. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  91. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  92. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  93. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  94. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  95. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  96. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  97. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  98. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  99. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  100. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  101. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  102. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  103. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  104. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  105. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  106. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  107. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  108. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  109. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  110. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  111. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  112. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  113. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  114. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  115. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  116. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  117. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  118. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  119. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  120. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  121. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  122. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  123. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  124. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  125. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  126. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  127. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  128. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  129. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  130. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  131. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  132. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  133. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  134. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  135. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  136. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  137. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  138. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  139. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  140. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  141. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  142. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  143. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  144. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  145. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  146. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  147. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  148. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  149. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  150. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  151. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  152. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  153. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  154. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  155. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  156. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  157. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  158. package/packages/pi-ai/dist/models/index.js +80 -0
  159. package/packages/pi-ai/dist/models/index.js.map +1 -0
  160. package/packages/pi-ai/dist/models.d.ts +1 -36
  161. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  162. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  163. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  164. package/packages/pi-ai/dist/models.js +3 -112
  165. package/packages/pi-ai/dist/models.js.map +1 -1
  166. package/packages/pi-ai/dist/models.test.js +6 -5
  167. package/packages/pi-ai/dist/models.test.js.map +1 -1
  168. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  169. package/packages/pi-ai/src/index.ts +1 -9
  170. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  171. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  172. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  173. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  174. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  175. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  176. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  177. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  178. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  179. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  180. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  181. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  182. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  183. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  184. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  185. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  186. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  187. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  188. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  189. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  190. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  191. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  192. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  193. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  194. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  195. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  196. package/packages/pi-ai/src/models/index.ts +106 -0
  197. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  198. package/packages/pi-ai/src/models.test.ts +6 -5
  199. package/packages/pi-ai/src/models.ts +3 -153
  200. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  201. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  203. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +214 -0
  205. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  206. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  207. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  208. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +18 -8
  209. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  210. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  211. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  212. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
  213. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  214. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  215. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  216. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  217. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  218. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +115 -4
  219. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  221. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +6 -4
  222. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  223. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  224. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +273 -0
  225. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +20 -9
  226. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
  227. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  228. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +176 -40
  229. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +6 -4
  230. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  231. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -3
  232. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
  233. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +56 -3
  234. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  235. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  236. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  237. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  238. package/src/resources/extensions/gsd/types.ts +13 -0
  239. package/src/resources/extensions/gsd/workflow-logger.ts +2 -1
  240. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  241. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  242. package/packages/pi-ai/dist/models.generated.js +0 -14343
  243. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  244. package/packages/pi-ai/src/models.generated.ts +0 -14345
  245. /package/dist/web/standalone/.next/static/{C7qugsXHwdw4-b4ROHvOE → ZDXqgjuglsRoazETSKw1J}/_buildManifest.js +0 -0
  246. /package/dist/web/standalone/.next/static/{C7qugsXHwdw4-b4ROHvOE → ZDXqgjuglsRoazETSKw1J}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env tsx
2
2
 
3
- import { writeFileSync } from "fs";
3
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
4
4
  import { join, dirname } from "path";
5
5
  import { fileURLToPath } from "url";
6
6
  import { Api, KnownProvider, Model } from "../src/types.js";
@@ -1470,61 +1470,95 @@ async function generateModels() {
1470
1470
  }
1471
1471
  }
1472
1472
 
1473
- // Generate TypeScript file
1474
- let output = `// This file is auto-generated by scripts/generate-models.ts
1475
- // Do not edit manually - run 'npm run generate-models' to update
1476
-
1477
- import type { Model } from "./types.js";
1478
-
1479
- export const MODELS = {
1480
- `;
1481
-
1482
- // Generate provider sections (sorted for deterministic output)
1483
- const sortedProviderIds = Object.keys(providers).sort();
1484
- for (const providerId of sortedProviderIds) {
1485
- const models = providers[providerId];
1486
- output += `\t${JSON.stringify(providerId)}: {\n`;
1473
+ const toConstName = (providerId: string): string => {
1474
+ const normalized = providerId
1475
+ .replace(/[^a-zA-Z0-9]+/g, "_")
1476
+ .replace(/_+/g, "_")
1477
+ .replace(/^_|_$/g, "")
1478
+ .toUpperCase();
1479
+ const safePrefix = /^[0-9]/.test(normalized) ? `_${normalized}` : normalized;
1480
+ return `${safePrefix}_MODELS`;
1481
+ };
1487
1482
 
1483
+ const renderModelEntries = (models: Record<string, Model<any>>): string => {
1484
+ let output = "{\n";
1488
1485
  const sortedModelIds = Object.keys(models).sort();
1489
1486
  for (const modelId of sortedModelIds) {
1490
1487
  const model = models[modelId];
1491
- output += `\t\t"${model.id}": {\n`;
1492
- output += `\t\t\tid: "${model.id}",\n`;
1493
- output += `\t\t\tname: "${model.name}",\n`;
1494
- output += `\t\t\tapi: "${model.api}",\n`;
1495
- output += `\t\t\tprovider: "${model.provider}",\n`;
1488
+ output += `\t"${model.id}": {\n`;
1489
+ output += `\t\tid: "${model.id}",\n`;
1490
+ output += `\t\tname: "${model.name}",\n`;
1491
+ output += `\t\tapi: "${model.api}",\n`;
1492
+ output += `\t\tprovider: "${model.provider}",\n`;
1496
1493
  if (model.baseUrl !== undefined) {
1497
- output += `\t\t\tbaseUrl: "${model.baseUrl}",\n`;
1494
+ output += `\t\tbaseUrl: "${model.baseUrl}",\n`;
1498
1495
  }
1499
1496
  if (model.headers) {
1500
- output += `\t\t\theaders: ${JSON.stringify(model.headers)},\n`;
1497
+ output += `\t\theaders: ${JSON.stringify(model.headers)},\n`;
1501
1498
  }
1502
1499
  if (model.compat) {
1503
- output += ` compat: ${JSON.stringify(model.compat)},
1504
- `;
1500
+ output += `\t\tcompat: ${JSON.stringify(model.compat)},\n`;
1505
1501
  }
1506
- output += `\t\t\treasoning: ${model.reasoning},\n`;
1507
- output += `\t\t\tinput: [${model.input.map(i => `"${i}"`).join(", ")}],\n`;
1508
- output += `\t\t\tcost: {\n`;
1509
- output += `\t\t\t\tinput: ${model.cost.input},\n`;
1510
- output += `\t\t\t\toutput: ${model.cost.output},\n`;
1511
- output += `\t\t\t\tcacheRead: ${model.cost.cacheRead},\n`;
1512
- output += `\t\t\t\tcacheWrite: ${model.cost.cacheWrite},\n`;
1513
- output += `\t\t\t},\n`;
1514
- output += `\t\t\tcontextWindow: ${model.contextWindow},\n`;
1515
- output += `\t\t\tmaxTokens: ${model.maxTokens},\n`;
1516
- output += `\t\t} satisfies Model<"${model.api}">,\n`;
1502
+ output += `\t\treasoning: ${model.reasoning},\n`;
1503
+ output += `\t\tinput: [${model.input.map(i => `"${i}"`).join(", ")}],\n`;
1504
+ output += `\t\tcost: {\n`;
1505
+ output += `\t\t\tinput: ${model.cost.input},\n`;
1506
+ output += `\t\t\toutput: ${model.cost.output},\n`;
1507
+ output += `\t\t\tcacheRead: ${model.cost.cacheRead},\n`;
1508
+ output += `\t\t\tcacheWrite: ${model.cost.cacheWrite},\n`;
1509
+ output += `\t\t},\n`;
1510
+ output += `\t\tcontextWindow: ${model.contextWindow},\n`;
1511
+ output += `\t\tmaxTokens: ${model.maxTokens},\n`;
1512
+ output += `\t} satisfies Model<"${model.api}">,\n`;
1517
1513
  }
1514
+ output += "}";
1515
+ return output;
1516
+ };
1518
1517
 
1519
- output += `\t},\n`;
1518
+ const sortedProviderIds = Object.keys(providers).sort();
1519
+ const generatedDir = join(packageRoot, "src/models/generated");
1520
+ rmSync(generatedDir, { recursive: true, force: true });
1521
+ mkdirSync(generatedDir, { recursive: true });
1522
+
1523
+ for (const providerId of sortedProviderIds) {
1524
+ const providerModels = providers[providerId];
1525
+ const constName = toConstName(providerId);
1526
+ const providerOutput = `// This file is auto-generated by scripts/generate-models.ts
1527
+ // Do not edit manually - run 'npm run generate-models' to update
1528
+
1529
+ import type { Model } from "../../types.js";
1530
+
1531
+ export const ${constName} = ${renderModelEntries(providerModels)} as const satisfies Record<string, Model<any>>;
1532
+ `;
1533
+ writeFileSync(join(generatedDir, `${providerId}.ts`), providerOutput);
1534
+ console.log(`Generated src/models/generated/${providerId}.ts`);
1520
1535
  }
1521
1536
 
1522
- output += `} as const;
1537
+ let indexOutput = `// This file is auto-generated by scripts/generate-models.ts
1538
+ // Do not edit manually - run 'npm run generate-models' to update
1539
+
1523
1540
  `;
1524
1541
 
1525
- // Write file
1526
- writeFileSync(join(packageRoot, "src/models.generated.ts"), output);
1527
- console.log("Generated src/models.generated.ts");
1542
+ for (const providerId of sortedProviderIds) {
1543
+ const constName = toConstName(providerId);
1544
+ indexOutput += `import { ${constName} } from "./${providerId}.js";\n`;
1545
+ }
1546
+
1547
+ indexOutput += `\nexport const MODELS = {\n`;
1548
+ for (const providerId of sortedProviderIds) {
1549
+ const constName = toConstName(providerId);
1550
+ indexOutput += `\t${JSON.stringify(providerId)}: ${constName},\n`;
1551
+ }
1552
+ indexOutput += `} as const;\n`;
1553
+
1554
+ writeFileSync(join(generatedDir, "index.ts"), indexOutput);
1555
+ console.log("Generated src/models/generated/index.ts");
1556
+
1557
+ const legacyGeneratedPath = join(packageRoot, "src/models.generated.ts");
1558
+ if (existsSync(legacyGeneratedPath)) {
1559
+ rmSync(legacyGeneratedPath);
1560
+ console.log("Removed legacy src/models.generated.ts");
1561
+ }
1528
1562
 
1529
1563
  // Print statistics
1530
1564
  const totalModels = allModels.length;
@@ -3,19 +3,11 @@ export { Type } from "@sinclair/typebox";
3
3
 
4
4
  export * from "./api-registry.js";
5
5
  export * from "./env-api-keys.js";
6
- export * from "./models.js";
7
- export * from "./providers/anthropic.js";
6
+ export * from "./models/index.js";
8
7
  export {
9
8
  mapThinkingLevelToEffort,
10
9
  supportsAdaptiveThinking,
11
10
  } from "./providers/anthropic-shared.js";
12
- export * from "./providers/azure-openai-responses.js";
13
- export * from "./providers/google.js";
14
- export * from "./providers/google-gemini-cli.js";
15
- export * from "./providers/google-vertex.js";
16
- export * from "./providers/mistral.js";
17
- export * from "./providers/openai-completions.js";
18
- export * from "./providers/openai-responses.js";
19
11
  export * from "./providers/provider-capabilities.js";
20
12
  export * from "./providers/register-builtins.js";
21
13
  export type { ProviderSwitchReport } from "./providers/transform-messages.js";
@@ -0,0 +1,40 @@
1
+ import type { Api, Model, ModelCapabilities } from "../types.js";
2
+
3
+ type CapabilityPatch = { match: (m: Model<Api>) => boolean; caps: ModelCapabilities };
4
+
5
+ export const CAPABILITY_PATCHES: CapabilityPatch[] = [
6
+ // GPT-5.x supports xhigh thinking and OpenAI service tiers
7
+ {
8
+ match: (m) => m.id.includes("gpt-5.2") || m.id.includes("gpt-5.3") || m.id.includes("gpt-5.4"),
9
+ caps: { supportsXhigh: true, supportsServiceTier: true },
10
+ },
11
+ // Anthropic Opus 4.6 supports xhigh thinking
12
+ {
13
+ match: (m) => m.api === "anthropic-messages" && (m.id.includes("opus-4-6") || m.id.includes("opus-4.6")),
14
+ caps: { supportsXhigh: true },
15
+ },
16
+ ];
17
+
18
+ /**
19
+ * Apply capability patches to a list of models.
20
+ *
21
+ * Models constructed outside the static pi-ai registry (custom models from
22
+ * models.json, extension-registered models, discovered models) do not pass
23
+ * through the module-init patch loop. Call this function after assembling
24
+ * any model list to ensure capabilities are set correctly.
25
+ *
26
+ * Explicit `capabilities` already set on a model take precedence over patches.
27
+ */
28
+ export function applyCapabilityPatches(models: Model<Api>[]): Model<Api>[] {
29
+ return models.map((model) => {
30
+ for (const patch of CAPABILITY_PATCHES) {
31
+ if (patch.match(model)) {
32
+ return {
33
+ ...model,
34
+ capabilities: { ...patch.caps, ...model.capabilities },
35
+ };
36
+ }
37
+ }
38
+ return model;
39
+ });
40
+ }
@@ -1,8 +1,8 @@
1
1
  // Manually-maintained model definitions for providers NOT tracked by models.dev.
2
2
  //
3
- // The auto-generated file (models.generated.ts) is rebuilt from the models.dev
4
- // third-party catalog. Providers that use proprietary endpoints and are not
5
- // listed on models.dev must be defined here so they survive regeneration.
3
+ // The auto-generated files under models/generated/*.ts are rebuilt from the
4
+ // models.dev third-party catalog. Providers that use proprietary endpoints and
5
+ // are not listed on models.dev must be defined here so they survive regeneration.
6
6
  //
7
7
  // See: https://github.com/gsd-build/gsd-2/issues/2339
8
8
  //
@@ -11,7 +11,7 @@
11
11
  // 2. Add its API key mapping to env-api-keys.ts.
12
12
  // 3. Add its provider name to KnownProvider in types.ts (if not already there).
13
13
 
14
- import type { Model } from "./types.js";
14
+ import type { Model } from "../types.js";
15
15
 
16
16
  export const CUSTOM_MODELS = {
17
17
  // ─── Alibaba Coding Plan ─────────────────────────────────────────────