swayrouter 1.0.0

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 (643) hide show
  1. package/.env.example +43 -0
  2. package/CHANGELOG.md +132 -0
  3. package/LICENSE +30 -0
  4. package/README.id.md +633 -0
  5. package/README.md +628 -0
  6. package/cli/cli.js +388 -0
  7. package/cli/package.json +4 -0
  8. package/cli/src/cli/commands/xaiVideo.js +280 -0
  9. package/cli/src/cli/tray/SwayAvatar.svg +20 -0
  10. package/cli/src/cli/tray/autostart.js +351 -0
  11. package/cli/src/cli/tray/icon.ico +0 -0
  12. package/cli/src/cli/tray/icon.png +0 -0
  13. package/cli/src/cli/tray/tray.js +258 -0
  14. package/cli/src/cli/tray/tray.ps1 +129 -0
  15. package/cli/src/cli/tray/trayHost.js +157 -0
  16. package/cli/src/cli/tray/trayWin.js +83 -0
  17. package/cli/src/cli/utils/display.js +123 -0
  18. package/cli/src/cli/utils/input.js +138 -0
  19. package/cli/src/runtime/discover.js +153 -0
  20. package/cli/src/runtime/lifecycle.js +333 -0
  21. package/cli/src/runtime/runMenu.js +250 -0
  22. package/cli/src/runtime/uiAdapters.js +12 -0
  23. package/cli/src/runtime/update.js +130 -0
  24. package/dashboard/dist/assets/CliTools-Ch3gKuNw.js +24 -0
  25. package/dashboard/dist/assets/Combo-BBCldjWi.js +1 -0
  26. package/dashboard/dist/assets/ConsoleLog-wywAYcPT.js +6 -0
  27. package/dashboard/dist/assets/Dashboard-DxzyF41b.js +1 -0
  28. package/dashboard/dist/assets/Header-C_9Su9BF.js +1 -0
  29. package/dashboard/dist/assets/Keys-D0ufgcsc.js +1 -0
  30. package/dashboard/dist/assets/Login-BeKpipS_.js +1 -0
  31. package/dashboard/dist/assets/ManageApiKey-CVXsmW2B.js +1 -0
  32. package/dashboard/dist/assets/OAuthCallback-D_UZYcF6.js +1 -0
  33. package/dashboard/dist/assets/Provider-BU7JfTqm.js +4 -0
  34. package/dashboard/dist/assets/ProviderModelAccordion-BAifkfVR.js +1 -0
  35. package/dashboard/dist/assets/Proxy-CU15VJ--.js +1 -0
  36. package/dashboard/dist/assets/QuotaMonitor-HzGK7bcc.js +1 -0
  37. package/dashboard/dist/assets/Settings-Dt4y2dC0.js +1 -0
  38. package/dashboard/dist/assets/Setup-DSDUwU7N.js +1 -0
  39. package/dashboard/dist/assets/StatusBadge-1nAOyHU2.js +1 -0
  40. package/dashboard/dist/assets/SwayChat-Bup7up6D.js +10 -0
  41. package/dashboard/dist/assets/Usage-eWnrPQ_v.js +4 -0
  42. package/dashboard/dist/assets/accordion-DOOPDDgt.js +1 -0
  43. package/dashboard/dist/assets/admin-extras-api-CCdu5TFM.js +1 -0
  44. package/dashboard/dist/assets/api-keys-api-ifAC2Ok3.js +1 -0
  45. package/dashboard/dist/assets/card-CC0Omjcv.js +1 -0
  46. package/dashboard/dist/assets/chatStudio-C0zPz_Z_.js +2 -0
  47. package/dashboard/dist/assets/checkbox-7SZBrmbN.js +1 -0
  48. package/dashboard/dist/assets/connections-api-_N54UD3S.js +1 -0
  49. package/dashboard/dist/assets/copy-button-qBvM6H9z.js +1 -0
  50. package/dashboard/dist/assets/currency-api-SV9CBf5e.js +1 -0
  51. package/dashboard/dist/assets/flip-button-BGgkjtl0.js +1 -0
  52. package/dashboard/dist/assets/frame-cUiti6Lq.js +1 -0
  53. package/dashboard/dist/assets/icons-vendor-CUx7SB5V.js +541 -0
  54. package/dashboard/dist/assets/index-B6j-9zHy.js +10 -0
  55. package/dashboard/dist/assets/index-C-_l0yYz.css +1 -0
  56. package/dashboard/dist/assets/live-mode-CHShLY4E.js +1 -0
  57. package/dashboard/dist/assets/markdown-vendor-BY8e1gQ8.js +29 -0
  58. package/dashboard/dist/assets/motion-vendor-g5fpGzmJ.js +9 -0
  59. package/dashboard/dist/assets/oauth-callback-CqYQzyd7.js +1 -0
  60. package/dashboard/dist/assets/query-vendor-DVevaSVS.js +1 -0
  61. package/dashboard/dist/assets/react-vendor-xnYrwzsL.js +61 -0
  62. package/dashboard/dist/assets/ripple-button-l8aMiVVG.js +1 -0
  63. package/dashboard/dist/assets/segmented-CqmEnQjZ.js +1 -0
  64. package/dashboard/dist/assets/select-D8pUtMXp.js +1 -0
  65. package/dashboard/dist/assets/skeleton-7uJDiIXe.js +1 -0
  66. package/dashboard/dist/assets/table-D0M60Tu1.js +1 -0
  67. package/dashboard/dist/assets/tabs-C6YkuulG.js +1 -0
  68. package/dashboard/dist/assets/tunnel-api-DDPsBaDV.js +1 -0
  69. package/dashboard/dist/assets/ui-vendor-BuM9f2NY.js +17 -0
  70. package/dashboard/dist/image2/SwayAvatar.svg +20 -0
  71. package/dashboard/dist/index.html +32 -0
  72. package/dashboard/dist/logo/avatar.svg +1 -0
  73. package/dashboard/dist/logo/sway.svg +20 -0
  74. package/dashboard/dist/logo/swaychat.svg +20 -0
  75. package/dashboard/dist/providers/SwayCustom.svg +19 -0
  76. package/dashboard/dist/providers/alicode.svg +12 -0
  77. package/dashboard/dist/providers/anthropic.svg +11 -0
  78. package/dashboard/dist/providers/antigravity.svg +3 -0
  79. package/dashboard/dist/providers/azure.svg +5 -0
  80. package/dashboard/dist/providers/baidu.svg +3 -0
  81. package/dashboard/dist/providers/blackbox.svg +5 -0
  82. package/dashboard/dist/providers/byteplus.svg +3 -0
  83. package/dashboard/dist/providers/cerebras.svg +4 -0
  84. package/dashboard/dist/providers/chutes.svg +4 -0
  85. package/dashboard/dist/providers/claude.svg +3 -0
  86. package/dashboard/dist/providers/cline.svg +11 -0
  87. package/dashboard/dist/providers/cloudflare-ai.svg +4 -0
  88. package/dashboard/dist/providers/codebuddy.svg +11 -0
  89. package/dashboard/dist/providers/codex.svg +10 -0
  90. package/dashboard/dist/providers/commandcode.svg +3 -0
  91. package/dashboard/dist/providers/cursor.svg +3 -0
  92. package/dashboard/dist/providers/deepseek.svg +10 -0
  93. package/dashboard/dist/providers/featherless.svg +3 -0
  94. package/dashboard/dist/providers/fireworks.svg +3 -0
  95. package/dashboard/dist/providers/gemini.svg +3 -0
  96. package/dashboard/dist/providers/geminicli.svg +11 -0
  97. package/dashboard/dist/providers/github.svg +3 -0
  98. package/dashboard/dist/providers/grok.svg +3 -0
  99. package/dashboard/dist/providers/groq.svg +3 -0
  100. package/dashboard/dist/providers/hermesagent.svg +1 -0
  101. package/dashboard/dist/providers/kilocode.svg +15 -0
  102. package/dashboard/dist/providers/kimchi.svg +3 -0
  103. package/dashboard/dist/providers/kimi.svg +4 -0
  104. package/dashboard/dist/providers/kiro.svg +10 -0
  105. package/dashboard/dist/providers/meta.svg +3 -0
  106. package/dashboard/dist/providers/mimo.svg +10 -0
  107. package/dashboard/dist/providers/minimax.svg +3 -0
  108. package/dashboard/dist/providers/mistral.svg +3 -0
  109. package/dashboard/dist/providers/morph.svg +3 -0
  110. package/dashboard/dist/providers/nebius.svg +4 -0
  111. package/dashboard/dist/providers/nvidia.svg +3 -0
  112. package/dashboard/dist/providers/ollama.svg +3 -0
  113. package/dashboard/dist/providers/omp.svg +5 -0
  114. package/dashboard/dist/providers/openai.svg +3 -0
  115. package/dashboard/dist/providers/opencode.svg +3 -0
  116. package/dashboard/dist/providers/openrouter.svg +3 -0
  117. package/dashboard/dist/providers/perplexity.svg +3 -0
  118. package/dashboard/dist/providers/poolside.svg +36 -0
  119. package/dashboard/dist/providers/qoder.svg +11 -0
  120. package/dashboard/dist/providers/sumopod.svg +3 -0
  121. package/dashboard/dist/providers/tencent.svg +5 -0
  122. package/dashboard/dist/providers/together.svg +12 -0
  123. package/dashboard/dist/providers/trae.svg +3 -0
  124. package/dashboard/dist/providers/venice.svg +4 -0
  125. package/dashboard/dist/providers/vercel.svg +3 -0
  126. package/dashboard/dist/providers/vertex.svg +17 -0
  127. package/dashboard/dist/providers/windsurf.svg +10 -0
  128. package/dashboard/dist/providers/zai.svg +3 -0
  129. package/dashboard/tsconfig.json +13 -0
  130. package/package.json +87 -0
  131. package/src/config/appConstants.js +153 -0
  132. package/src/config/defaultThinkingSignature.js +7 -0
  133. package/src/config/errorConfig.js +117 -0
  134. package/src/config/grokCli.js +9 -0
  135. package/src/config/kiroConstants.js +235 -0
  136. package/src/config/mediaConfig.js +20 -0
  137. package/src/config/ollamaModels.js +18 -0
  138. package/src/config/providerModels.js +109 -0
  139. package/src/config/providers.js +17 -0
  140. package/src/config/runtimeConfig.js +84 -0
  141. package/src/dashboardGuard.js +254 -0
  142. package/src/executors/antigravity.js +389 -0
  143. package/src/executors/azure.js +49 -0
  144. package/src/executors/base.js +225 -0
  145. package/src/executors/codebuddy-cn.js +23 -0
  146. package/src/executors/codebuddy-intl.js +60 -0
  147. package/src/executors/codex.js +436 -0
  148. package/src/executors/commandcode.js +83 -0
  149. package/src/executors/cursor.js +1075 -0
  150. package/src/executors/default.js +294 -0
  151. package/src/executors/gemini-cli.js +88 -0
  152. package/src/executors/github.js +393 -0
  153. package/src/executors/grok-cli.js +510 -0
  154. package/src/executors/grok-web.js +342 -0
  155. package/src/executors/index.js +86 -0
  156. package/src/executors/kimchi.js +116 -0
  157. package/src/executors/kiro.js +1155 -0
  158. package/src/executors/ollama-local.js +14 -0
  159. package/src/executors/opencode-go.js +47 -0
  160. package/src/executors/opencode.js +31 -0
  161. package/src/executors/qoder.js +433 -0
  162. package/src/executors/trae.js +318 -0
  163. package/src/executors/vertex.js +151 -0
  164. package/src/executors/windsurf.js +555 -0
  165. package/src/executors/xiaomi-tokenplan.js +16 -0
  166. package/src/handlers/chatCore/nonStreamingHandler.js +370 -0
  167. package/src/handlers/chatCore/requestDetail.js +130 -0
  168. package/src/handlers/chatCore/sseToJsonHandler.js +318 -0
  169. package/src/handlers/chatCore/streamingHandler.js +250 -0
  170. package/src/handlers/chatCore.js +652 -0
  171. package/src/lib/auth/dashboardSession.js +83 -0
  172. package/src/lib/auth/loginLimiter.js +99 -0
  173. package/src/lib/cache/ttlCache.js +153 -0
  174. package/src/lib/consoleLogBuffer.js +127 -0
  175. package/src/lib/dataDir.js +45 -0
  176. package/src/lib/db/adapters/betterSqliteAdapter.js +36 -0
  177. package/src/lib/db/adapters/bunSqliteAdapter.js +47 -0
  178. package/src/lib/db/adapters/nodeSqliteAdapter.js +65 -0
  179. package/src/lib/db/adapters/runtimeHelpers.js +23 -0
  180. package/src/lib/db/adapters/sqljsAdapter.js +103 -0
  181. package/src/lib/db/backup.js +75 -0
  182. package/src/lib/db/driver.js +110 -0
  183. package/src/lib/db/helpers/jsonCol.js +18 -0
  184. package/src/lib/db/helpers/kvStore.js +48 -0
  185. package/src/lib/db/helpers/metaStore.js +32 -0
  186. package/src/lib/db/index.js +473 -0
  187. package/src/lib/db/migrate.js +267 -0
  188. package/src/lib/db/migrations/001-initial.js +12 -0
  189. package/src/lib/db/migrations/002-prune-headroom-pxpipe-settings.js +32 -0
  190. package/src/lib/db/migrations/004-request-details-trace-id.js +12 -0
  191. package/src/lib/db/migrations/005-request-details-payload-capture.js +11 -0
  192. package/src/lib/db/migrations/007-headroom-readd-settings.js +35 -0
  193. package/src/lib/db/migrations/008-account-model-locks.js +22 -0
  194. package/src/lib/db/migrations/009-warp-pool-lifecycle.js +5 -0
  195. package/src/lib/db/migrations/010-api-key-file-permissions.js +7 -0
  196. package/src/lib/db/migrations/011-remove-upstream-user-agent-profile.js +41 -0
  197. package/src/lib/db/migrations/012-remove-headroom-settings.js +33 -0
  198. package/src/lib/db/migrations/013-default-fill-first-routing.js +20 -0
  199. package/src/lib/db/migrations/014-normalize-fill-first-routing.js +37 -0
  200. package/src/lib/db/migrations/015-remove-ip-ban-tables.js +8 -0
  201. package/src/lib/db/migrations/016-prune-legacy-codebuddy-intl-models.js +25 -0
  202. package/src/lib/db/migrations/index.js +20 -0
  203. package/src/lib/db/nineRouterMigration.js +785 -0
  204. package/src/lib/db/paths.js +23 -0
  205. package/src/lib/db/repos/accountModelLocksRepo.js +74 -0
  206. package/src/lib/db/repos/aliasRepo.js +108 -0
  207. package/src/lib/db/repos/apiKeysRepo.js +204 -0
  208. package/src/lib/db/repos/combosRepo.js +85 -0
  209. package/src/lib/db/repos/connectionsRepo.js +522 -0
  210. package/src/lib/db/repos/disabledModelsRepo.js +63 -0
  211. package/src/lib/db/repos/nodesRepo.js +127 -0
  212. package/src/lib/db/repos/pricingRepo.js +108 -0
  213. package/src/lib/db/repos/proxyPoolsRepo.js +104 -0
  214. package/src/lib/db/repos/requestDetailsRepo.js +345 -0
  215. package/src/lib/db/repos/settingsRepo.js +135 -0
  216. package/src/lib/db/repos/usageRepo.js +1335 -0
  217. package/src/lib/db/schema.js +179 -0
  218. package/src/lib/db/version.js +32 -0
  219. package/src/lib/db/writeBehind.js +174 -0
  220. package/src/lib/disabledModelsDb.js +3 -0
  221. package/src/lib/env.ts +175 -0
  222. package/src/lib/errors/publicError.js +18 -0
  223. package/src/lib/grokBuildConfig.js +243 -0
  224. package/src/lib/guardRequest.js +51 -0
  225. package/src/lib/localDb.js +21 -0
  226. package/src/lib/mcp/stdioSseBridge.js +174 -0
  227. package/src/lib/network/connectionProxy.js +200 -0
  228. package/src/lib/network/proxyTest.js +158 -0
  229. package/src/lib/network/proxyUrl.js +76 -0
  230. package/src/lib/network/relay.js +71 -0
  231. package/src/lib/oauth/constants/oauth.js +152 -0
  232. package/src/lib/oauth/constants/xai.js +43 -0
  233. package/src/lib/oauth/kiroExternalIdp.js +167 -0
  234. package/src/lib/oauth/providerHelpers.js +90 -0
  235. package/src/lib/oauth/providers/_shared.js +12 -0
  236. package/src/lib/oauth/providers/antigravity.js +126 -0
  237. package/src/lib/oauth/providers/claude.js +60 -0
  238. package/src/lib/oauth/providers/cline.js +62 -0
  239. package/src/lib/oauth/providers/clinepass.js +62 -0
  240. package/src/lib/oauth/providers/codebuddy-cn.js +75 -0
  241. package/src/lib/oauth/providers/codebuddy-intl.js +73 -0
  242. package/src/lib/oauth/providers/codex.js +72 -0
  243. package/src/lib/oauth/providers/cursor.js +18 -0
  244. package/src/lib/oauth/providers/gemini-cli.js +84 -0
  245. package/src/lib/oauth/providers/github.js +96 -0
  246. package/src/lib/oauth/providers/grok-cli.js +123 -0
  247. package/src/lib/oauth/providers/index.js +233 -0
  248. package/src/lib/oauth/providers/kilocode.js +60 -0
  249. package/src/lib/oauth/providers/kimchi.js +79 -0
  250. package/src/lib/oauth/providers/kimi.js +79 -0
  251. package/src/lib/oauth/providers/kiro.js +147 -0
  252. package/src/lib/oauth/providers/qoder.js +90 -0
  253. package/src/lib/oauth/providers/trae.js +244 -0
  254. package/src/lib/oauth/providers/windsurf.js +123 -0
  255. package/src/lib/oauth/providers/xai.js +95 -0
  256. package/src/lib/oauth/providers.js +16 -0
  257. package/src/lib/oauth/services/cursor.js +132 -0
  258. package/src/lib/oauth/services/kiro.js +351 -0
  259. package/src/lib/oauth/services/oauth.js +135 -0
  260. package/src/lib/oauth/services/qoder.js +151 -0
  261. package/src/lib/oauth/services/xai.js +204 -0
  262. package/src/lib/oauth/utils/ideDetect.js +55 -0
  263. package/src/lib/oauth/utils/pkce.js +25 -0
  264. package/src/lib/oauth/utils/server.js +732 -0
  265. package/src/lib/oauth/utils/ui.js +43 -0
  266. package/src/lib/providerNormalization.js +40 -0
  267. package/src/lib/qoder/constants.js +1 -0
  268. package/src/lib/requestDetailsDb.js +3 -0
  269. package/src/lib/resourceProfile.ts +124 -0
  270. package/src/lib/runtimeSecrets.ts +130 -0
  271. package/src/lib/security/payloadCapture.js +87 -0
  272. package/src/lib/tunnel/cloudflare/cloudflared.js +436 -0
  273. package/src/lib/tunnel/cloudflare/config.js +8 -0
  274. package/src/lib/tunnel/cloudflare/healthCheck.js +37 -0
  275. package/src/lib/tunnel/cloudflare/manager.js +149 -0
  276. package/src/lib/tunnel/cloudflare/pid.js +31 -0
  277. package/src/lib/tunnel/cloudflare/publicUrl.js +41 -0
  278. package/src/lib/tunnel/cloudflare/requirements.js +12 -0
  279. package/src/lib/tunnel/index.js +26 -0
  280. package/src/lib/tunnel/shared/dnsResolver.js +16 -0
  281. package/src/lib/tunnel/shared/internetCheck.js +30 -0
  282. package/src/lib/tunnel/shared/state.js +45 -0
  283. package/src/lib/tunnel/shared/watchdogConfig.js +6 -0
  284. package/src/lib/update/installer.js +52 -0
  285. package/src/lib/update/version.js +116 -0
  286. package/src/lib/usageDb.js +6 -0
  287. package/src/lib/usageRefresh.js +88 -0
  288. package/src/lifecycle/appLifecycle.ts +99 -0
  289. package/src/models.js +36 -0
  290. package/src/next/headers.js +12 -0
  291. package/src/next/server.js +74 -0
  292. package/src/observability/metrics.js +439 -0
  293. package/src/observability/tracing.js +107 -0
  294. package/src/open-sse-index.js +70 -0
  295. package/src/providers/capabilities.js +299 -0
  296. package/src/providers/display.ts +142 -0
  297. package/src/providers/index.js +27 -0
  298. package/src/providers/models/helpers.js +19 -0
  299. package/src/providers/models/namePatterns.js +27 -0
  300. package/src/providers/models/schema.js +32 -0
  301. package/src/providers/pricing.js +248 -0
  302. package/src/providers/registry/agentrouter.js +52 -0
  303. package/src/providers/registry/alicode-intl.js +32 -0
  304. package/src/providers/registry/alicode.js +33 -0
  305. package/src/providers/registry/alims-intl.js +30 -0
  306. package/src/providers/registry/anthropic.js +29 -0
  307. package/src/providers/registry/antigravity.js +139 -0
  308. package/src/providers/registry/azure.js +23 -0
  309. package/src/providers/registry/baidu.js +35 -0
  310. package/src/providers/registry/blackbox.js +41 -0
  311. package/src/providers/registry/byteplus.js +36 -0
  312. package/src/providers/registry/cerebras.js +33 -0
  313. package/src/providers/registry/chutes.js +26 -0
  314. package/src/providers/registry/claude.js +80 -0
  315. package/src/providers/registry/cline.js +53 -0
  316. package/src/providers/registry/clinepass.js +62 -0
  317. package/src/providers/registry/cloudflare-ai.js +84 -0
  318. package/src/providers/registry/codebuddy-cn.js +95 -0
  319. package/src/providers/registry/codebuddy-intl.js +91 -0
  320. package/src/providers/registry/codex.js +145 -0
  321. package/src/providers/registry/commandcode.js +45 -0
  322. package/src/providers/registry/cursor.js +61 -0
  323. package/src/providers/registry/deepseek.js +55 -0
  324. package/src/providers/registry/featherless.js +36 -0
  325. package/src/providers/registry/fireworks.js +34 -0
  326. package/src/providers/registry/gemini-cli.js +59 -0
  327. package/src/providers/registry/gemini.js +76 -0
  328. package/src/providers/registry/github.js +131 -0
  329. package/src/providers/registry/glm-cn.js +35 -0
  330. package/src/providers/registry/glm.js +58 -0
  331. package/src/providers/registry/grok-cli.js +87 -0
  332. package/src/providers/registry/grok-web.js +41 -0
  333. package/src/providers/registry/groq.js +38 -0
  334. package/src/providers/registry/index.js +77 -0
  335. package/src/providers/registry/kilo-gateway.js +34 -0
  336. package/src/providers/registry/kilocode.js +48 -0
  337. package/src/providers/registry/kimchi.js +49 -0
  338. package/src/providers/registry/kimi.js +82 -0
  339. package/src/providers/registry/kiro.js +132 -0
  340. package/src/providers/registry/meta.js +34 -0
  341. package/src/providers/registry/minimax-cn.js +90 -0
  342. package/src/providers/registry/minimax.js +90 -0
  343. package/src/providers/registry/mistral.js +36 -0
  344. package/src/providers/registry/morph.js +31 -0
  345. package/src/providers/registry/nebius.js +26 -0
  346. package/src/providers/registry/nvidia.js +55 -0
  347. package/src/providers/registry/ollama-local.js +18 -0
  348. package/src/providers/registry/ollama.js +38 -0
  349. package/src/providers/registry/openai.js +114 -0
  350. package/src/providers/registry/opencode-go.js +41 -0
  351. package/src/providers/registry/opencode.js +26 -0
  352. package/src/providers/registry/openrouter.js +36 -0
  353. package/src/providers/registry/perplexity.js +56 -0
  354. package/src/providers/registry/poolside.js +30 -0
  355. package/src/providers/registry/qoder.js +58 -0
  356. package/src/providers/registry/sumopod.js +84 -0
  357. package/src/providers/registry/tencent.js +29 -0
  358. package/src/providers/registry/together.js +38 -0
  359. package/src/providers/registry/trae.js +71 -0
  360. package/src/providers/registry/venice.js +69 -0
  361. package/src/providers/registry/vercel-ai-gateway.js +37 -0
  362. package/src/providers/registry/vertex-partner.js +31 -0
  363. package/src/providers/registry/vertex.js +33 -0
  364. package/src/providers/registry/windsurf.js +129 -0
  365. package/src/providers/registry/xai.js +46 -0
  366. package/src/providers/registry/xiaomi-mimo.js +66 -0
  367. package/src/providers/registry/xiaomi-tokenplan.js +58 -0
  368. package/src/providers/registryEntry.js +3 -0
  369. package/src/providers/schema.js +33 -0
  370. package/src/providers/shared.js +114 -0
  371. package/src/providers/thinkingLevels.js +49 -0
  372. package/src/routes/api/auth/login/route.js +82 -0
  373. package/src/routes/api/auth/logout/route.js +9 -0
  374. package/src/routes/api/auth/reset-password/route.js +12 -0
  375. package/src/routes/api/auth/status/route.js +33 -0
  376. package/src/routes/api/auth/verify-password/route.js +39 -0
  377. package/src/routes/api/chat/tools/curl/route.js +100 -0
  378. package/src/routes/api/chat/tools/router/route.js +215 -0
  379. package/src/routes/api/chat/tools/search/route.js +362 -0
  380. package/src/routes/api/chat/tools/shell/route.js +228 -0
  381. package/src/routes/api/cli-tools/all-statuses/route.js +37 -0
  382. package/src/routes/api/cli-tools/claude-settings/route.js +261 -0
  383. package/src/routes/api/cli-tools/codex-settings/route.js +220 -0
  384. package/src/routes/api/cli-tools/cowork-mcp-registry/route.js +80 -0
  385. package/src/routes/api/cli-tools/cowork-mcp-tools/route.js +96 -0
  386. package/src/routes/api/cli-tools/cowork-settings/route.js +380 -0
  387. package/src/routes/api/cli-tools/grok-build-settings/route.js +152 -0
  388. package/src/routes/api/cli-tools/hermes-settings/route.js +169 -0
  389. package/src/routes/api/cli-tools/kilo-settings/route.js +131 -0
  390. package/src/routes/api/cli-tools/model-mappings/route.js +43 -0
  391. package/src/routes/api/cli-tools/omp-settings/route.js +266 -0
  392. package/src/routes/api/cli-tools/opencode-settings/route.js +243 -0
  393. package/src/routes/api/combos/[id]/route.js +73 -0
  394. package/src/routes/api/combos/route.js +43 -0
  395. package/src/routes/api/health/live/route.js +7 -0
  396. package/src/routes/api/health/ready/route.js +19 -0
  397. package/src/routes/api/health/route.js +17 -0
  398. package/src/routes/api/inflight/stream/route.js +24 -0
  399. package/src/routes/api/init/route.js +3 -0
  400. package/src/routes/api/keys/[id]/route.js +71 -0
  401. package/src/routes/api/keys/route.js +41 -0
  402. package/src/routes/api/logs/route.js +19 -0
  403. package/src/routes/api/mcp/[plugin]/message/route.js +23 -0
  404. package/src/routes/api/mcp/[plugin]/sse/route.js +35 -0
  405. package/src/routes/api/models/availability/route.js +104 -0
  406. package/src/routes/api/models/custom/route.js +58 -0
  407. package/src/routes/api/models/disabled/route.js +47 -0
  408. package/src/routes/api/models/route.js +64 -0
  409. package/src/routes/api/models/test/ping.js +236 -0
  410. package/src/routes/api/models/test/route.js +14 -0
  411. package/src/routes/api/oauth/[provider]/[action]/route.js +491 -0
  412. package/src/routes/api/oauth/codex/bulk-import/route.js +105 -0
  413. package/src/routes/api/oauth/codex/import-token/route.js +82 -0
  414. package/src/routes/api/oauth/cursor/auto-import/route.js +250 -0
  415. package/src/routes/api/oauth/cursor/import/route.js +86 -0
  416. package/src/routes/api/oauth/kiro/api-key/route.js +60 -0
  417. package/src/routes/api/oauth/kiro/auto-import/route.js +120 -0
  418. package/src/routes/api/oauth/kiro/import/route.js +72 -0
  419. package/src/routes/api/oauth/kiro/import-cli-proxy/route.js +42 -0
  420. package/src/routes/api/oauth/kiro/social-authorize/route.js +40 -0
  421. package/src/routes/api/oauth/kiro/social-exchange/route.js +62 -0
  422. package/src/routes/api/pricing/route.js +96 -0
  423. package/src/routes/api/provider-nodes/[id]/route.js +106 -0
  424. package/src/routes/api/provider-nodes/route.js +110 -0
  425. package/src/routes/api/provider-nodes/validate/route.js +197 -0
  426. package/src/routes/api/providers/[id]/models/route.js +716 -0
  427. package/src/routes/api/providers/[id]/route.js +195 -0
  428. package/src/routes/api/providers/[id]/test/route.js +27 -0
  429. package/src/routes/api/providers/[id]/test/testUtils.js +912 -0
  430. package/src/routes/api/providers/[id]/test-models/route.js +211 -0
  431. package/src/routes/api/providers/catalog/route.js +58 -0
  432. package/src/routes/api/providers/client/route.js +133 -0
  433. package/src/routes/api/providers/counts/route.js +43 -0
  434. package/src/routes/api/providers/kilo/free-models/route.js +58 -0
  435. package/src/routes/api/providers/route.js +361 -0
  436. package/src/routes/api/providers/suggested-models/filters.js +24 -0
  437. package/src/routes/api/providers/suggested-models/route.js +34 -0
  438. package/src/routes/api/providers/test-batch/route.js +145 -0
  439. package/src/routes/api/providers/validate/route.js +633 -0
  440. package/src/routes/api/proxy-pools/[id]/route.js +129 -0
  441. package/src/routes/api/proxy-pools/[id]/test/route.js +64 -0
  442. package/src/routes/api/proxy-pools/cloudflare-deploy/route.js +183 -0
  443. package/src/routes/api/proxy-pools/route.js +85 -0
  444. package/src/routes/api/proxy-pools/vercel-deploy/route.js +181 -0
  445. package/src/routes/api/settings/currency/route.js +29 -0
  446. package/src/routes/api/settings/database/path/route.js +8 -0
  447. package/src/routes/api/settings/database/route.js +89 -0
  448. package/src/routes/api/settings/migrate-9router/route.js +81 -0
  449. package/src/routes/api/settings/require-login/route.js +14 -0
  450. package/src/routes/api/settings/route.js +186 -0
  451. package/src/routes/api/shutdown/route.js +25 -0
  452. package/src/routes/api/tags/route.js +17 -0
  453. package/src/routes/api/translator/console-logs/route.js +28 -0
  454. package/src/routes/api/translator/console-logs/stream/route.js +95 -0
  455. package/src/routes/api/tunnel/disable/route.js +18 -0
  456. package/src/routes/api/tunnel/enable/route.js +32 -0
  457. package/src/routes/api/tunnel/status/route.js +23 -0
  458. package/src/routes/api/update/route.js +42 -0
  459. package/src/routes/api/usage/[connectionId]/codex-reset-credits/route.js +169 -0
  460. package/src/routes/api/usage/[connectionId]/route.js +222 -0
  461. package/src/routes/api/usage/chart/route.js +27 -0
  462. package/src/routes/api/usage/history/route.js +94 -0
  463. package/src/routes/api/usage/logs/route.js +14 -0
  464. package/src/routes/api/usage/providers/route.js +36 -0
  465. package/src/routes/api/usage/request-details/route.js +61 -0
  466. package/src/routes/api/usage/request-logs/route.js +15 -0
  467. package/src/routes/api/usage/stats/route.js +23 -0
  468. package/src/routes/api/usage/stream/route.js +78 -0
  469. package/src/routes/api/v1/api/chat/route.js +36 -0
  470. package/src/routes/api/v1/chat/completions/route.js +28 -0
  471. package/src/routes/api/v1/images/edits/route.js +70 -0
  472. package/src/routes/api/v1/images/generations/route.js +50 -0
  473. package/src/routes/api/v1/images/imageValidation.js +45 -0
  474. package/src/routes/api/v1/messages/count_tokens/route.js +87 -0
  475. package/src/routes/api/v1/messages/route.js +26 -0
  476. package/src/routes/api/v1/models/route.js +440 -0
  477. package/src/routes/api/v1/responses/compact/route.js +34 -0
  478. package/src/routes/api/v1/responses/route.js +26 -0
  479. package/src/routes/api/v1/route.js +1 -0
  480. package/src/routes/api/version/route.js +11 -0
  481. package/src/routes/table.js +1141 -0
  482. package/src/rtk/applyFilter.js +13 -0
  483. package/src/rtk/autodetect.js +104 -0
  484. package/src/rtk/caveman.js +6 -0
  485. package/src/rtk/cavemanPrompts.js +107 -0
  486. package/src/rtk/constants.js +51 -0
  487. package/src/rtk/filters/buildOutput.js +120 -0
  488. package/src/rtk/filters/dedupLog.js +43 -0
  489. package/src/rtk/filters/find.js +47 -0
  490. package/src/rtk/filters/gitDiff.js +90 -0
  491. package/src/rtk/filters/gitLog.js +88 -0
  492. package/src/rtk/filters/gitStatus.js +101 -0
  493. package/src/rtk/filters/grep.js +45 -0
  494. package/src/rtk/filters/ls.js +73 -0
  495. package/src/rtk/filters/readNumbered.js +22 -0
  496. package/src/rtk/filters/searchList.js +49 -0
  497. package/src/rtk/filters/smartTruncate.js +13 -0
  498. package/src/rtk/filters/tree.js +28 -0
  499. package/src/rtk/index.js +143 -0
  500. package/src/rtk/ponytail.js +6 -0
  501. package/src/rtk/ponytailPrompt.js +49 -0
  502. package/src/rtk/systemInject.js +89 -0
  503. package/src/server.ts +474 -0
  504. package/src/services/accountFallback.js +241 -0
  505. package/src/services/accountPool.js +389 -0
  506. package/src/services/capacityAdapter.js +140 -0
  507. package/src/services/cliModelMapping.js +84 -0
  508. package/src/services/clinepassModels.js +60 -0
  509. package/src/services/codebuddyModels.js +250 -0
  510. package/src/services/combo.js +482 -0
  511. package/src/services/copilotModels.js +126 -0
  512. package/src/services/currencyRate.js +56 -0
  513. package/src/services/cursorModels.js +197 -0
  514. package/src/services/grokCliModels.js +130 -0
  515. package/src/services/kimchiModels.js +175 -0
  516. package/src/services/kiroModels.js +246 -0
  517. package/src/services/model.js +83 -0
  518. package/src/services/oauthCredentialManager.js +153 -0
  519. package/src/services/projectId.js +240 -0
  520. package/src/services/provider.js +145 -0
  521. package/src/services/qoderModels.js +274 -0
  522. package/src/services/tokenRefresh/dedup.js +70 -0
  523. package/src/services/tokenRefresh/providers.js +626 -0
  524. package/src/services/tokenRefresh.js +274 -0
  525. package/src/services/usage/claude.js +134 -0
  526. package/src/services/usage/codebuddy-cn.js +212 -0
  527. package/src/services/usage/codex.js +193 -0
  528. package/src/services/usage/deepseek.js +103 -0
  529. package/src/services/usage/github.js +94 -0
  530. package/src/services/usage/google.js +218 -0
  531. package/src/services/usage/grok-cli.js +368 -0
  532. package/src/services/usage/grokCliQuotaFrame.js +170 -0
  533. package/src/services/usage/kimi.js +185 -0
  534. package/src/services/usage/kiro.js +172 -0
  535. package/src/services/usage/minimax.js +215 -0
  536. package/src/services/usage/misc.js +264 -0
  537. package/src/services/usage/shared.js +59 -0
  538. package/src/services/usage.js +56 -0
  539. package/src/shared/clineAuth.js +37 -0
  540. package/src/shared/constants/config.js +80 -0
  541. package/src/shared/constants/coworkPlugins.js +69 -0
  542. package/src/shared/constants/models.js +41 -0
  543. package/src/shared/constants/providers.js +128 -0
  544. package/src/shared/constants/providersDisplay.js +1 -0
  545. package/src/shared/qoder/constants.js +50 -0
  546. package/src/shared/qoder/cosy.js +134 -0
  547. package/src/shared/qoder/encoding.js +36 -0
  548. package/src/shared/services/initializeApp.js +226 -0
  549. package/src/shared/services/quotaAutoPing.js +310 -0
  550. package/src/shared/utils/apiKey.js +65 -0
  551. package/src/shared/utils/clineAuth.js +1 -0
  552. package/src/shared/utils/index.js +3 -0
  553. package/src/shared/utils/machineId.js +60 -0
  554. package/src/shared/utils/ssrfGuard.js +280 -0
  555. package/src/sse/handlers/chat.js +426 -0
  556. package/src/sse/oauthLease.js +32 -0
  557. package/src/sse/recovery.js +235 -0
  558. package/src/sse/services/auth.js +489 -0
  559. package/src/sse/services/backgroundTokenRefresh.js +173 -0
  560. package/src/sse/services/model.js +129 -0
  561. package/src/sse/services/requestCancellation.js +4 -0
  562. package/src/sse/services/tokenRefresh.js +264 -0
  563. package/src/sse/utils/logger.js +142 -0
  564. package/src/staticServe.ts +95 -0
  565. package/src/transformer/streamToJsonConverter.js +87 -0
  566. package/src/translator/canonical.js +81 -0
  567. package/src/translator/concerns/chunk.js +9 -0
  568. package/src/translator/concerns/compatFallback.js +147 -0
  569. package/src/translator/concerns/finishReason.js +59 -0
  570. package/src/translator/concerns/image.js +105 -0
  571. package/src/translator/concerns/json.js +4 -0
  572. package/src/translator/concerns/kiroConversation.js +428 -0
  573. package/src/translator/concerns/message.js +5 -0
  574. package/src/translator/concerns/modality.js +134 -0
  575. package/src/translator/concerns/paramSupport.js +97 -0
  576. package/src/translator/concerns/prefetch.js +86 -0
  577. package/src/translator/concerns/reasoning.js +18 -0
  578. package/src/translator/concerns/thinking.js +40 -0
  579. package/src/translator/concerns/thinkingUnified.js +319 -0
  580. package/src/translator/concerns/toolCall.js +134 -0
  581. package/src/translator/concerns/usage.js +61 -0
  582. package/src/translator/detection.js +42 -0
  583. package/src/translator/formats/claude.js +323 -0
  584. package/src/translator/formats/gemini.js +366 -0
  585. package/src/translator/formats/maxTokens.js +19 -0
  586. package/src/translator/formats/openai.js +116 -0
  587. package/src/translator/formats/responsesApi.js +117 -0
  588. package/src/translator/formats.js +28 -0
  589. package/src/translator/index.js +237 -0
  590. package/src/translator/request/antigravity-to-openai.js +217 -0
  591. package/src/translator/request/claude-to-kiro.js +288 -0
  592. package/src/translator/request/claude-to-openai.js +199 -0
  593. package/src/translator/request/gemini-to-openai.js +142 -0
  594. package/src/translator/request/openai-responses.js +373 -0
  595. package/src/translator/request/openai-to-claude.js +260 -0
  596. package/src/translator/request/openai-to-commandcode.js +161 -0
  597. package/src/translator/request/openai-to-cursor.js +175 -0
  598. package/src/translator/request/openai-to-gemini.js +422 -0
  599. package/src/translator/request/openai-to-kiro.js +360 -0
  600. package/src/translator/request/openai-to-ollama.js +152 -0
  601. package/src/translator/request/openai-to-vertex.js +36 -0
  602. package/src/translator/response/claude-to-openai.js +185 -0
  603. package/src/translator/response/commandcode-to-openai.js +164 -0
  604. package/src/translator/response/cursor-to-openai.js +18 -0
  605. package/src/translator/response/gemini-to-openai.js +127 -0
  606. package/src/translator/response/kiro-to-claude.js +230 -0
  607. package/src/translator/response/kiro-to-openai.js +136 -0
  608. package/src/translator/response/ollama-to-openai.js +106 -0
  609. package/src/translator/response/openai-responses.js +534 -0
  610. package/src/translator/response/openai-to-antigravity.js +107 -0
  611. package/src/translator/response/openai-to-claude.js +231 -0
  612. package/src/translator/schema/blocks.js +40 -0
  613. package/src/translator/schema/defaults.js +3 -0
  614. package/src/translator/schema/finishReasons.js +22 -0
  615. package/src/translator/schema/index.js +7 -0
  616. package/src/translator/schema/roles.js +12 -0
  617. package/src/transport/requestBoundary.ts +223 -0
  618. package/src/transport/routerAdmission.ts +380 -0
  619. package/src/types/provider.ts +59 -0
  620. package/src/utils/bypassHandler.js +272 -0
  621. package/src/utils/claudeCloaking.js +10 -0
  622. package/src/utils/claudeSignature.js +35 -0
  623. package/src/utils/clientDetector.js +183 -0
  624. package/src/utils/cursorChecksum.js +104 -0
  625. package/src/utils/cursorProtobuf.js +801 -0
  626. package/src/utils/debugLog.js +12 -0
  627. package/src/utils/error.js +120 -0
  628. package/src/utils/inflight.js +127 -0
  629. package/src/utils/kiroSessionReplay.js +139 -0
  630. package/src/utils/ollamaTransform.js +83 -0
  631. package/src/utils/proxyFetch.js +308 -0
  632. package/src/utils/reasoningContentInjector.js +71 -0
  633. package/src/utils/requestLogger.js +272 -0
  634. package/src/utils/responsesStreamHelpers.js +46 -0
  635. package/src/utils/sessionManager.js +205 -0
  636. package/src/utils/sse.js +13 -0
  637. package/src/utils/sseConstants.js +21 -0
  638. package/src/utils/stream.js +511 -0
  639. package/src/utils/streamHandler.js +256 -0
  640. package/src/utils/streamHelpers.js +113 -0
  641. package/src/utils/toolDeduper.js +44 -0
  642. package/src/utils/usageTracking.js +329 -0
  643. package/tsconfig.json +45 -0
@@ -0,0 +1,153 @@
1
+ import { platform, arch, hostname } from "os";
2
+ import { PROVIDERS, PROVIDER_OAUTH } from "./providers.js";
3
+ import { ANTIGRAVITY_IDE_USER_AGENT } from "../providers/shared.js";
4
+ import { createRequire } from "module";
5
+
6
+ export const GEMINI_CLI_VERSION = PROVIDERS["gemini-cli"]?.cliVersion;
7
+ export const GEMINI_CLI_API_CLIENT = PROVIDERS["gemini-cli"]?.apiClient;
8
+
9
+ function geminiCLIArch() {
10
+ const a = arch();
11
+ if (a === "ia32") return "x86";
12
+ return a;
13
+ }
14
+
15
+ export function geminiCLIUserAgent(model = "unknown") {
16
+ return `GeminiCLI/${GEMINI_CLI_VERSION}/${model || "unknown"} (${platform()}; ${geminiCLIArch()}; terminal)`;
17
+ }
18
+
19
+ const _ghCopilot = PROVIDERS.github?.copilot || {};
20
+ export const GITHUB_COPILOT = {
21
+ VSCODE_VERSION: _ghCopilot.vscodeVersion,
22
+ COPILOT_CHAT_VERSION: _ghCopilot.chatVersion,
23
+ USER_AGENT: _ghCopilot.userAgent,
24
+ API_VERSION: _ghCopilot.apiVersion,
25
+ };
26
+
27
+ export const IDE_TYPE = {
28
+ UNSPECIFIED: 0,
29
+ JETSKI: 10,
30
+ ANTIGRAVITY: 9,
31
+ PLUGINS: 7
32
+ };
33
+
34
+ export const PLATFORM = {
35
+ UNSPECIFIED: 0,
36
+ DARWIN_AMD64: 1,
37
+ DARWIN_ARM64: 2,
38
+ LINUX_AMD64: 3,
39
+ LINUX_ARM64: 4,
40
+ WINDOWS_AMD64: 5
41
+ };
42
+
43
+ export const PLUGIN_TYPE = {
44
+ UNSPECIFIED: 0,
45
+ CLOUD_CODE: 1,
46
+ GEMINI: 2
47
+ };
48
+
49
+ export function getPlatformEnum() {
50
+ const os = platform();
51
+ const architecture = arch();
52
+ if (os === "darwin") return architecture === "arm64" ? PLATFORM.DARWIN_ARM64 : PLATFORM.DARWIN_AMD64;
53
+ if (os === "linux") return architecture === "arm64" ? PLATFORM.LINUX_ARM64 : PLATFORM.LINUX_AMD64;
54
+ if (os === "win32") return PLATFORM.WINDOWS_AMD64;
55
+ return PLATFORM.UNSPECIFIED;
56
+ }
57
+
58
+ export function getPlatformUserAgent() {
59
+ return ANTIGRAVITY_IDE_USER_AGENT;
60
+ }
61
+
62
+ export const CLIENT_METADATA = {
63
+ ideType: IDE_TYPE.ANTIGRAVITY,
64
+ platform: getPlatformEnum(),
65
+ pluginType: PLUGIN_TYPE.GEMINI
66
+ };
67
+
68
+ export const INTERNAL_REQUEST_HEADER = { name: "x-request-source", value: "local" };
69
+
70
+ export const ANTIGRAVITY_HEADERS = {
71
+ "User-Agent": ANTIGRAVITY_IDE_USER_AGENT
72
+ };
73
+
74
+ export const CLOUD_CODE_API = {
75
+ "gemini-cli": {
76
+ loadCodeAssist: "https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist",
77
+ onboardUser: "https://cloudcode-pa.googleapis.com/v1internal:onboardUser",
78
+ },
79
+
80
+ antigravity: {
81
+ loadCodeAssist: "https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist",
82
+ onboardUser: "https://cloudcode-pa.googleapis.com/v1internal:onboardUser",
83
+ },
84
+ };
85
+
86
+ export const LOAD_CODE_ASSIST_HEADERS = {
87
+ "Content-Type": "application/json",
88
+ "User-Agent": "google-api-nodejs-client/9.15.1",
89
+ "X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
90
+ "Client-Metadata": JSON.stringify({ ideType: IDE_TYPE.ANTIGRAVITY, platform: getPlatformEnum(), pluginType: PLUGIN_TYPE.GEMINI }),
91
+ };
92
+
93
+ export const ANTIGRAVITY_LOAD_CODE_ASSIST_HEADERS = {
94
+ "Content-Type": "application/json",
95
+ "User-Agent": ANTIGRAVITY_IDE_USER_AGENT,
96
+ };
97
+
98
+ export const LOAD_CODE_ASSIST_METADATA = {
99
+ ideType: IDE_TYPE.ANTIGRAVITY,
100
+ platform: getPlatformEnum(),
101
+ pluginType: PLUGIN_TYPE.GEMINI,
102
+ };
103
+
104
+ export const REFRESH_LEAD_MS = Object.fromEntries(
105
+ Object.entries(PROVIDER_OAUTH).filter(([, o]) => o.refreshLeadMs).map(([id, o]) => [id, o.refreshLeadMs])
106
+ );
107
+
108
+ export const OAUTH_ENDPOINTS = {
109
+ google: { token: "https://oauth2.googleapis.com/token", auth: "https://accounts.google.com/o/oauth2/auth" },
110
+ openai: { token: PROVIDER_OAUTH["codex"]?.tokenUrl, auth: PROVIDER_OAUTH["codex"]?.authorizeUrl },
111
+ anthropic: { token: PROVIDER_OAUTH["claude"]?.tokenUrl, auth: "https://api.anthropic.com/v1/oauth/authorize" },
112
+ github: { token: PROVIDER_OAUTH["github"]?.tokenUrl, auth: PROVIDER_OAUTH["github"]?.authorizeUrl, deviceCode: PROVIDER_OAUTH["github"]?.deviceCodeUrl },
113
+ };
114
+
115
+ let _appVersion;
116
+ function getAppPackageVersion() {
117
+ if (_appVersion) return _appVersion;
118
+ try {
119
+ const require = createRequire(import.meta.url);
120
+ _appVersion = require("../../package.json").version || "0.0.0";
121
+ } catch {
122
+ _appVersion = process.env.npm_package_version || "0.0.0";
123
+ }
124
+ return _appVersion;
125
+ }
126
+
127
+ export function buildKimiHeaders(deviceId) {
128
+ const osName = platform();
129
+ const architecture = arch();
130
+ let deviceModel = `${osName} ${architecture}`;
131
+ if (osName === "darwin") deviceModel = `macOS ${architecture}`;
132
+ else if (osName === "win32") deviceModel = `Windows ${architecture}`;
133
+ else if (osName === "linux") deviceModel = `Linux ${architecture}`;
134
+
135
+ let deviceName = "unknown";
136
+ try {
137
+ deviceName = hostname() || "unknown";
138
+ } catch {
139
+ deviceName = "unknown";
140
+ }
141
+
142
+ const resolvedId = (typeof deviceId === "string" && deviceId.trim())
143
+ ? deviceId.trim()
144
+ : `kimi-${Date.now()}`;
145
+
146
+ return {
147
+ "X-Msh-Platform": "swayrouter",
148
+ "X-Msh-Version": getAppPackageVersion(),
149
+ "X-Msh-Device-Name": deviceName,
150
+ "X-Msh-Device-Model": deviceModel,
151
+ "X-Msh-Device-Id": resolvedId,
152
+ };
153
+ }
@@ -0,0 +1,7 @@
1
+ export const DEFAULT_THINKING_CLAUDE_SIGNATURE = "EpwGCkYIChgCKkCzVUuRrg7CcglSUWEef4rH6o35g9UYS8ZPe0/VomQTBsFx6sttYNj5l8GqgW6ejuHyYqpFToxIbZl0bw17l5dJEgzCnqDO0Z8fRlMrNgsaDLS1cnCjC53KBqE0CCIwAADQdo1eO+7qPAmo8J4WR3JPmr92S97kmvr5K1iPMiOpkZNj8mEXW8uzBoOJs/9ZKoMFiqHJ3UObwaJDqFOW70E9oCwDoc6jesaWVAEdN5vWfKMpIkjFJjECdjIdkxyJNJ8Ib8yXVal3qwE7uThoPRqSZDdHB5mmwPEjWE/90cSYCbtX2YsJki1265CabBb8/QEkODXg4kgRrL+c8e8rRXz/dr1RswvaPuzEdGKHRNi9UooNUeOK4/ebx1KkP9YZttyohN9GWqlts36kOoW0Cfie/ABDgF9g534BPth/sstxDM6d79QlRmh6NxizyTF74DXJI34u0M4tTRchqE5pAq85SgdJaa+dix1yJPMji8m6nZkwJbscJb9rdc2MKyKWjz8QL2+rTSSuZ2F1k1qSsW0xNcI7qLcI12Vncfn/VqY6YOIZy/saZBR0ezXvN6g+UYbuIdyVg7AyIFZt3nbrO7/kmOEb2VKzygwklHGEIJHfFgMpH3JSrAzbZIowVHOF7VaJ+KXRFDCFin7hHTOiOsdg+1ij1mML9Z/x/9CP4b7OUcaQm1llDZPSHc6rZMNL3DdB+fW5YfmNgKU35S+7AMtA10nVILzDAk1UV4T2K9Do09JlI6rjOs9UuULlIN2Z0eE8YTlANR6uQcw7lMcdfqYE8tke4rDKc2dDiaS5vVe45VewICNpdXGN11yw8QqH7p27CR1HtN30e0tHXOR3bIwWk/Yb6O5fTaKG6Ri8e5ZCPvdD9HqepVi188nM0iTjJqL58F3ni04ECIhcbyaQWnuTes1Kw4CMwiZDLQkk8Hgz7HkUOf1btQTF/0nhD7ry0n0hAEg2PaDM3V6TjOjf4hEldRmeqERcQF1PfgKb6ZM12rlIIfUqKACczWJSzTV158+47HX36o0cgux6nFlv/DE+sEiRVxgB";
2
+
3
+ export const DEFAULT_THINKING_AG_SIGNATURE = "EuwGCukGAXLI2nxwZIq54WWSoL/YN0P3TsDZ7zRnLi8g0S4aVr2HUGxvaHKySuY6HAVzcE0GPGjXrytLIldxthSvfxgUlJh6Qa9Z+Oj5QZBlYdg6HaJ6yuY5R7waE6rdwBsRf7Ft2j3DJ9rMi9qhWFqApewYtPhls3VHtuvND3l8Rm09+lbAXQs6KKWEWrxNLKTBkfpMgXhRERc/TQRMZu1twAablm6/Zk1tsYRvfWKLsNbeKF+CCojJdXJKvnR/8Ouuoa+Y2Ti20hcW7aZIIjZDFYPU//k6Ybmhg69J/imbFai2ckhfLaisqdDkdoIiBJScTOUvYqP6AE9d4MsydSC+UlhIMk4hoP76R8vUSCZRMkjOaDXstf/QoVZKbt94wyRZgAJ1G0BqI8L5ow86kLpA4wJEtxsRGymOE4bKUvApveBakYDNM9APkf+LbtbzWSseGjoZcSlycF9iN8Q2XNYKRrHbv3Lr5Y8JjdH/5y/6SHkNehTEZugaeGnSPSyCTWto1kQgHpxdWmhkLfJGNUGLmue7Mesj4TSms4J33mRpYVhNB/J333FCqIP0hr/E7BkkjEn7yZ4X7SQlh+xKPurapsnHRwiKmtsilmEFrnTE9iQr+pMr6M29qqFNv1tr5yumbaJw8JW9sB15tNsRv+dW6BjNanbsKz7HCgKUBc8tGy+7YuhXzAfViyRefcjK7eZW0Fbyt7AbybJTKz78W8NH7ye6LAwzOebXpeZ4D43fNIt8bKh26qgduSQv/7o+pAflkuqHZ99YWgHQ8h8OkZFi3eOiSYjsjhdZ/czWOdoPI/OnqIldzMPF5YlrKBLFX8VhRKVmqgsmWf5PHGulHhMkVlS+XG2UIseGy69ARa93D78Gsa+1n1kJr7EEB7Rh+27vUMxVYLdz1yMSvE5nalTAlg/ZeG8+XQ0cHuAI3KbQpHW2Q++RdXfm5JzD5WdJZUU+Zn8t8UUn85BH4RxZLeE0qJikgSsKoYVBc6YhiMjhPgkR95ReimY4Z0xCJdRo1gjexOFeODZMpQF6Yxnoic7IrdgsFA3iePTbFnPp3IAM1fAThWhXJUn3QInUOTd5o1qmTmn6REbL15g/JQNl+dqUoPkhleeb2V3kjqp1okmO3wMZbPknR3S1LZNmlS72/iBQUm+n2b/RCn4PjmM2";
4
+
5
+ export const DEFAULT_THINKING_VERTEX_SIGNATURE = "CloBjz1rX5+yg1ILh/Ag+suum5k1f/9m/hI0XDQ33lsQIYnOHLn9KZwN0C7E4jgep5MzZvz5Se1Z1xxYrA1+Iz0Il4tabBhaDfMKNa5dGdEA3KnikfjfIpMlPaAKaQGPPWtf2hodPdBgguiZqDn+Qz2LwGEqHVJ16LVBUpeSx7UnYBLSwio8cyNy0jPijOh5QXKLTeHVdO2tKKcCCrtG2JCW3dOSrW2qA8eyAg40iQUnMNECjbcjkqB1+zrab7jX9ILwg7L9OgqYAQGPPWtfT4nzaPzSkXePAa920abYxPs3fg/RHDlg8PUVFLa+ko6qOjt7nXJTMxN0cpCwUCFX7eHHcMnA6vApyA/rXvJiAABkHZ3HilAktXRtxr/thHU0H8/4H5gT3kzoQcq9aMznrKomd3ct0mFi0ioSKnOEfoY1Mrfj00p/ZWm0tT7Wrjcm3BQXZ+T9Vrb94k+6CjtcEBrGCq8BAY89a1/vTMczqwB1NP3HCCuBdnds2vDXkj6XAYaXjsjmik8tGqwMKHz8R9RAWsx6SO6pkGEpXXpRzAaUx6c+aofsL/z1xOcN7ArCAa6uEeQKEgNngZuCP05p4+9P95epVmgOjFa4KfsPnyg+NKUkEFmpPSDrIRyMT+xERlclVcCI98/u7i8a9+vTbgzl8TRFYryClNH37K1ye5i6kqSGDUcMyiEasjke5BxbUh3i6wqMAgGPPWtfk+A+iY38QAldu117FEkTIkzbYOIt67lk9c6Ou3Y3Ct8TFHFw5QwGfSFc0YWjeTFHdm9UdV5jPK35p6VfhiRSva3w2+JLIHb4jvv5HutZPOJ3yQTt/+hUDj80oMNMbwnxNZvCEdzKS+D9vwmTACAm5H0ZetBSH2gPJXnhhuQo9AegS3wIWVR2a5k643Vx9r4u4pOvij4476lxKswIHvqsjL4jnTzRCvd44G6dn7vD0ENGb1K/i+dMRQMcOBaOxPN0ynk9bKxXWRDbZ+Rhakfr+y74z+6eYCdRPVqO9I7s+riilFuRIfaQ+U6/vuVKGIWEVKCfZZi0z6H5Xgz1xmse0u0AsittDlIKxwEBjz1rX783A0vehvUeabRia+/pX46IsN5efTAxFEBUeUce3jLuXIghkMV2b8KNhUs2G0aZldDDewRQbkluQabBMDT82N5I7reJP0VZgLIKccCL5DoGv1J7YWM2npLMIgZ6aP8aSlT3PFFJ0IXbUZUrzduczmIm6nzAJf9zxmq1aIFYw8YrgW8RjUdy0UvUmRoBEShSGUrvsyaRTl7J//KJW5utIPunFMu53GPWLidCFHzM1QA3Cj1+4zv5UXajP/V92RQayWbzCvYBAY89a1+yzoVSWukUGH7kX71Tg9dx7HA7OyKYwnYaqekG98zJfcUM/3KoiiiotW5t4xYu//ksEl36bSWvUHsRnxGByg+3WYdnZqKg0AtdRB/EXbI5PsjvS5ko96bkjSuFkY3TjHGwAM2B94K6/t6OTE/NBbxCsY9sT4d+1sbFv/iyfmfCnfvJaSzGmC9CDWKy4iqQ/vBNWps9j1JXk0p5uPAYC2BaMkxl5xoTVZqI3zAuRtQF5JLmPPy+PdqOgFxMKcLGNhwp7dbhIFLF68vCYQ9CL0NnK2d3CFk1UFVYxsi1TsolR1xahe/Rxt5HZDz/z65nevrQ";
6
+
7
+ export const DEFAULT_THINKING_GEMINI_CLI_SIGNATURE = "CiQBjz1rX/AlslZWMe5RgBt4Tv9j4+YNZTTez+JH2/+5oAlICygKXgGPPWtf7/Sux9eLYap/bmYAdPqFThLXj+l7o0DLu/hdgU98MA9ZrlRDNHXx+T0tuY8AcnjPZbiDyOq2bE11Fjhsk6p5axqayaapC/Pt9GczcgIQf1z15WTxCeKWAPYKYQGPPWtfDYj0nlNFNoTlU39RC91Z16xFKJ2MLEmkm+NvimsoOJ6be3g2BssNPtJ/9BKDXRA5cVs17tBeeW72lH8TMB5999udtxHM2SiUsnWsrHlfVuGSCpNQQ+5REw8HNvEKkgEBjz1rXzBNWrqZGbjun55K+vgYPBhJO2qZ67uRWXUA5/qcU12U/mbi5XoA3swoxYE8LEXfZvFFC9WG/W28QNCA0Qd4Trk/WkWiAwZmB8a84Fs14rkv3wqyxwFavPkJorqurAfd2XzGiFy0sB0ITCOPYi1HzDGV5WfXk6b9k+jT66/RuzGa8EcSOWo/QtC3Bkhgowo4AY89a1/f/tw8A02zjIoK7JVDAbf8W4UfmbApJJhwXIiGtu1M0JItObx7g2reYqT+HHL2Q/R4VDc=";
@@ -0,0 +1,117 @@
1
+ export const ERROR_TYPES = {
2
+ 400: { type: "invalid_request_error", code: "bad_request" },
3
+ 401: { type: "authentication_error", code: "invalid_api_key" },
4
+ 402: { type: "billing_error", code: "payment_required" },
5
+ 403: { type: "permission_error", code: "insufficient_quota" },
6
+ 404: { type: "invalid_request_error", code: "model_not_found" },
7
+ 406: { type: "invalid_request_error", code: "model_not_supported" },
8
+ 429: { type: "rate_limit_error", code: "rate_limit_exceeded" },
9
+ 500: { type: "server_error", code: "internal_server_error" },
10
+ 502: { type: "server_error", code: "bad_gateway" },
11
+ 503: { type: "server_error", code: "service_unavailable" },
12
+ 504: { type: "server_error", code: "gateway_timeout" }
13
+ };
14
+
15
+ export const DEFAULT_ERROR_MESSAGES = {
16
+ 400: "Bad request",
17
+ 401: "Invalid API key provided",
18
+ 402: "Payment required",
19
+ 403: "You exceeded your current quota",
20
+ 404: "Model not found",
21
+ 406: "Model not supported",
22
+ 429: "Rate limit exceeded",
23
+ 500: "Internal server error",
24
+ 502: "Bad gateway - upstream provider error",
25
+ 503: "Service temporarily unavailable",
26
+ 504: "Gateway timeout"
27
+ };
28
+
29
+ export const BACKOFF_CONFIG = {
30
+ base: 2000,
31
+ max: 5 * 60 * 1000,
32
+ maxLevel: 15
33
+ };
34
+
35
+ export const TRANSIENT_COOLDOWN_MS = 30 * 1000;
36
+
37
+ export const MAX_RATE_LIMIT_COOLDOWN_MS = 30 * 60 * 1000;
38
+
39
+ const COOLDOWN = {
40
+ long: 2 * 60 * 1000,
41
+ short: 5 * 1000,
42
+ };
43
+
44
+ export const ERROR_TIERS = {
45
+ T1: "T1",
46
+ T2: "T2",
47
+ T3: "T3",
48
+ };
49
+
50
+ const T1_BACKOFF_BASE = 30 * 1000;
51
+ const T1_BACKOFF_CAP = 5 * 60 * 1000;
52
+
53
+ const T3_DEPRIORITIZE_MS = 10 * 60 * 1000;
54
+
55
+ const JITTER_FRACTION = 0.25;
56
+
57
+ export const ERROR_RULES = [
58
+
59
+ { text: "no credentials", cooldownMs: COOLDOWN.long },
60
+ { text: "request not allowed", cooldownMs: COOLDOWN.short },
61
+ { text: "improperly formed request", cooldownMs: COOLDOWN.long },
62
+ { text: "rate limit", backoff: true },
63
+ { text: "too many requests", backoff: true },
64
+ { text: "quota exceeded", backoff: true },
65
+ { text: "capacity", backoff: true },
66
+ { text: "overloaded", backoff: true },
67
+
68
+ { status: 401, cooldownMs: COOLDOWN.long },
69
+ { status: 402, cooldownMs: COOLDOWN.long },
70
+ { status: 403, cooldownMs: COOLDOWN.long },
71
+ { status: 404, cooldownMs: COOLDOWN.long },
72
+ { status: 429, backoff: true },
73
+ ];
74
+
75
+ export const COOLDOWN_MS = {
76
+ unauthorized: COOLDOWN.long,
77
+ paymentRequired: COOLDOWN.long,
78
+ notFound: COOLDOWN.long,
79
+ transient: TRANSIENT_COOLDOWN_MS,
80
+ requestNotAllowed: COOLDOWN.short,
81
+ };
82
+
83
+ export function classifyError(status, errorText, retryCount = 0, opts = {}) {
84
+ const lowerError = errorText
85
+ ? (typeof errorText === "string" ? errorText : JSON.stringify(errorText)).toLowerCase()
86
+ : "";
87
+ const rng = typeof opts.rng === "function" ? opts.rng : null;
88
+
89
+ const t1Texts = ["rate limit", "too many requests", "quota exceeded", "capacity", "overloaded"];
90
+ if (t1Texts.some((t) => lowerError.includes(t)) || Number(status) === 429) {
91
+ const exp = T1_BACKOFF_BASE * Math.pow(2, retryCount);
92
+ const base = Math.min(exp, T1_BACKOFF_CAP);
93
+ const jitter = rng ? Math.floor(rng() * base * JITTER_FRACTION) : 0;
94
+ return { tier: ERROR_TIERS.T1, action: "cooldown", cooldownMs: base + jitter };
95
+ }
96
+
97
+ const t3Texts = ["no credentials", "request not allowed", "improperly formed request"];
98
+ const t3ByText = t3Texts.some((t) => lowerError.includes(t));
99
+ const t3ByStatus = [401, 402, 403, 404, 406].includes(Number(status));
100
+ if (t3ByStatus || t3ByText) {
101
+ const jitter = rng ? Math.floor(rng() * COOLDOWN.long * JITTER_FRACTION) : 0;
102
+ return {
103
+ tier: ERROR_TIERS.T3,
104
+ action: "deprioritize",
105
+ cooldownMs: COOLDOWN.long + jitter,
106
+ deprioitizeUntil: Date.now() + COOLDOWN.long + jitter + T3_DEPRIORITIZE_MS,
107
+ };
108
+ }
109
+
110
+ const jitter = rng ? Math.floor(rng() * COOLDOWN.short * JITTER_FRACTION) : 0;
111
+ return { tier: ERROR_TIERS.T2, action: "retry-same", cooldownMs: COOLDOWN.short + jitter };
112
+ }
113
+
114
+ export function isDeprioitized(deprioitizeUntil) {
115
+ if (!deprioitizeUntil) return false;
116
+ return deprioitizeUntil > Date.now();
117
+ }
@@ -0,0 +1,9 @@
1
+ export const GROK_CLI_VERSION = "0.2.99";
2
+ export const GROK_CLI_MODEL = "grok-build";
3
+ export const GROK_CLI_BASE_URL = "https://cli-chat-proxy.grok.com/v1";
4
+ export const GROK_CLI_CLIENT_IDENTIFIER = "grok-shell";
5
+ export const GROK_CLI_USER_AGENT = `grok-shell/${GROK_CLI_VERSION} (linux; x86_64)`;
6
+
7
+ export function supportsGrokCliReasoningEffort(model) {
8
+ return /^grok-4(?:\.\d+)?(?:$|-)/.test(String(model || ""));
9
+ }
@@ -0,0 +1,235 @@
1
+ import { extractThinking, parseSuffix } from "../translator/concerns/thinkingUnified.js";
2
+ import { effortToBudget } from "../translator/concerns/thinking.js";
3
+
4
+ export const KIRO_AGENTIC_SUFFIX = "-agentic";
5
+ export const KIRO_THINKING_SUFFIX = "-thinking";
6
+ export const KIRO_TOOL_NAME_MAX_LENGTH = 64;
7
+ export const KIRO_TOOL_DESCRIPTION_MAX_LENGTH = 10237;
8
+ export const KIRO_TOOL_ID_MAX_LENGTH = 64;
9
+ export const KIRO_CODEWHISPERER_TARGET =
10
+ "AmazonCodeWhispererStreamingService.GenerateAssistantResponse";
11
+ export const KIRO_ENDPOINT_FALLBACK_STATUSES = new Set([401, 403, 404]);
12
+
13
+ export const KIRO_DEFAULT_PROFILE_ARNS = {
14
+ "builder-id": "arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX",
15
+ social: "arn:aws:codewhisperer:us-east-1:699475941385:profile/EHGA3GRVQMUK",
16
+ };
17
+
18
+ export const KIRO_DEFAULT_PROFILE_ARN = KIRO_DEFAULT_PROFILE_ARNS["builder-id"];
19
+
20
+ export function resolveDefaultProfileArn(authMethod) {
21
+ const social = authMethod === "google" || authMethod === "github";
22
+ return social ? KIRO_DEFAULT_PROFILE_ARNS.social : KIRO_DEFAULT_PROFILE_ARNS["builder-id"];
23
+ }
24
+
25
+ export const KIRO_THINKING_BUDGET_DEFAULT = 16000;
26
+
27
+ export function resolveKiroModelIntent(model) {
28
+ const { cleanModel, override } = parseSuffix(model);
29
+ return {
30
+ model: cleanModel,
31
+ ...resolveKiroModel(cleanModel),
32
+ thinkingOverride: override,
33
+ };
34
+ }
35
+
36
+ export function applyKiroThinkingOverride(body, override) {
37
+ if (!override) return body;
38
+
39
+ const next = { ...body };
40
+ if (override.mode === "budget") {
41
+ delete next.output_config;
42
+ delete next.reasoning_effort;
43
+ delete next.reasoning;
44
+ next.thinking = { type: "enabled", budget_tokens: override.budget };
45
+ return next;
46
+ }
47
+
48
+ next.output_config = {
49
+ ...(body.output_config || {}),
50
+ effort: override.mode === "level" ? override.level : override.mode,
51
+ };
52
+ return next;
53
+ }
54
+
55
+ export function resolveKiroThinkingBudget(body, headers, model) {
56
+ const cfg = extractThinking(body);
57
+ if (cfg) {
58
+ if (cfg.mode === "none") return null;
59
+ if (cfg.mode === "level" && cfg.level === "disabled") return null;
60
+ if (cfg.mode === "budget") return cfg.budget;
61
+ if (cfg.mode === "level") return effortToBudget(cfg.level) ?? KIRO_THINKING_BUDGET_DEFAULT;
62
+ return KIRO_THINKING_BUDGET_DEFAULT;
63
+ }
64
+
65
+ if (headers) {
66
+ const beta = pickHeader(headers, "anthropic-beta");
67
+ if (typeof beta === "string" && beta.toLowerCase().includes("interleaved-thinking")) {
68
+ return KIRO_THINKING_BUDGET_DEFAULT;
69
+ }
70
+ }
71
+
72
+ if (containsThinkingModeTag(body)) return KIRO_THINKING_BUDGET_DEFAULT;
73
+
74
+ if (typeof model === "string" && model) {
75
+ const m = model.toLowerCase();
76
+ if (m.includes("thinking") || m.includes("-reason")) return KIRO_THINKING_BUDGET_DEFAULT;
77
+ }
78
+
79
+ return null;
80
+ }
81
+
82
+ export function extractKiroEffortLevel(body) {
83
+ const effort =
84
+ body?.output_config?.effort ??
85
+ body?.reasoning_effort ??
86
+ (typeof body?.reasoning === "object" ? body.reasoning?.effort : null);
87
+ if (typeof effort !== "string") return null;
88
+ const normalized = effort.toLowerCase();
89
+ if (normalized === "none" || normalized === "off" || normalized === "disabled") return null;
90
+ if (normalized === "xhigh" || normalized === "max") return "high";
91
+ if (["low", "medium", "high"].includes(normalized)) return normalized;
92
+ return null;
93
+ }
94
+
95
+ function extractKiroGptEffortLevel(body) {
96
+ const effort =
97
+ body?.output_config?.effort ??
98
+ body?.reasoning_effort ??
99
+ (typeof body?.reasoning === "object" ? body.reasoning?.effort : null);
100
+ if (typeof effort !== "string") return null;
101
+ const normalized = effort.toLowerCase();
102
+ if (normalized === "max") return "xhigh";
103
+
104
+ if (["low", "medium", "high", "xhigh"].includes(normalized)) {
105
+ return normalized;
106
+ }
107
+ return null;
108
+ }
109
+
110
+ export function buildKiroAdditionalModelRequestFields(body, effortPath = "output_config") {
111
+ const effort = effortPath === "reasoning"
112
+ ? extractKiroGptEffortLevel(body)
113
+ : extractKiroEffortLevel(body);
114
+ if (!effort) return undefined;
115
+ if (effortPath === "reasoning") {
116
+
117
+ return { reasoning: { effort } };
118
+ }
119
+
120
+ return {
121
+ thinking: { type: "adaptive", display: "summarized" },
122
+ output_config: { effort },
123
+ };
124
+ }
125
+
126
+ export function resolveKiroEffortPath(model) {
127
+ if (typeof model !== "string") return null;
128
+ const normalized = model.toLowerCase().replace(/-/g, ".");
129
+ if (/(?:^|[/.])gpt[/.]5[/.]6(?:[/.]|$)/.test(normalized)) {
130
+ return "reasoning";
131
+ }
132
+ if (!normalized.includes("claude")) return null;
133
+ const match = normalized.match(/(?:^|[/.])claude(?:[/.][a-z]+)*[/.](\d+)(?:[/.](\d+))?(?:[/.]|$)/);
134
+ if (!match) return null;
135
+ const [, majorText, minorText] = match;
136
+ const major = Number(majorText);
137
+ const minor = minorText === undefined ? null : Number(minorText);
138
+ const dateSuffixMinor = minor !== null && minor >= 1000;
139
+
140
+ return major < 4 || (major === 4 && (minor === null || minor <= 5 || dateSuffixMinor))
141
+ ? null
142
+ : "output_config";
143
+ }
144
+
145
+ export function supportsKiroAdditionalModelRequestFields(model) {
146
+ return resolveKiroEffortPath(model) !== null;
147
+ }
148
+
149
+ export function usesKiroNativeGptEffort(body, model) {
150
+ return resolveKiroEffortPath(model) === "reasoning"
151
+ && extractKiroGptEffortLevel(body) !== null;
152
+ }
153
+
154
+ export function buildKiroAdditionalModelRequestFieldsForModel(body, model) {
155
+ const effortPath = resolveKiroEffortPath(model);
156
+ if (!effortPath) return undefined;
157
+ return buildKiroAdditionalModelRequestFields(body, effortPath);
158
+ }
159
+
160
+ export function isThinkingEnabled(body, headers, model) {
161
+ return resolveKiroThinkingBudget(body, headers, model) !== null;
162
+ }
163
+
164
+ export function isAgenticModel(model) {
165
+ return typeof model === "string" && model.endsWith(KIRO_AGENTIC_SUFFIX);
166
+ }
167
+
168
+ export function stripAgenticSuffix(model) {
169
+ if (!isAgenticModel(model)) return model;
170
+ return model.slice(0, -KIRO_AGENTIC_SUFFIX.length);
171
+ }
172
+
173
+ export function isThinkingModel(model) {
174
+ return typeof model === "string" && model.endsWith(KIRO_THINKING_SUFFIX);
175
+ }
176
+
177
+ export function stripThinkingSuffix(model) {
178
+ if (!isThinkingModel(model)) return model;
179
+ return model.slice(0, -KIRO_THINKING_SUFFIX.length);
180
+ }
181
+
182
+ export function resolveKiroModel(model) {
183
+ let upstream = model;
184
+ let agentic = false;
185
+ let thinking = false;
186
+ if (isAgenticModel(upstream)) {
187
+ agentic = true;
188
+ upstream = stripAgenticSuffix(upstream);
189
+ }
190
+ if (isThinkingModel(upstream)) {
191
+ thinking = true;
192
+ upstream = stripThinkingSuffix(upstream);
193
+ }
194
+ return { upstream, agentic, thinking };
195
+ }
196
+
197
+ function pickHeader(headers, name) {
198
+ if (!headers) return undefined;
199
+ if (typeof headers.get === "function") {
200
+ return headers.get(name);
201
+ }
202
+ const lower = name.toLowerCase();
203
+ for (const key of Object.keys(headers)) {
204
+ if (key.toLowerCase() === lower) {
205
+ return headers[key];
206
+ }
207
+ }
208
+ return undefined;
209
+ }
210
+
211
+ function containsThinkingModeTag(body) {
212
+ const messages = Array.isArray(body?.messages) ? body.messages : [];
213
+ for (const msg of messages) {
214
+ if (!msg) continue;
215
+ if (msg.role !== "system" && msg.role !== "user") continue;
216
+ const content = msg.content;
217
+ if (typeof content === "string") {
218
+ if (containsTagInText(content)) return true;
219
+ } else if (Array.isArray(content)) {
220
+ for (const part of content) {
221
+ const text = part?.text;
222
+ if (typeof text === "string" && containsTagInText(text)) return true;
223
+ }
224
+ }
225
+ }
226
+ if (typeof body?.system === "string" && containsTagInText(body.system)) return true;
227
+ return false;
228
+ }
229
+
230
+ function containsTagInText(text) {
231
+ if (!text) return false;
232
+ if (!text.includes("<thinking_mode>")) return false;
233
+ return text.includes("<thinking_mode>enabled</thinking_mode>")
234
+ || text.includes("<thinking_mode>interleaved</thinking_mode>");
235
+ }
@@ -0,0 +1,20 @@
1
+ export const MAX_IMAGE_BYTES = 10 * 1024 * 1024;
2
+
3
+ export const FETCH_TIMEOUT_MS = 10000;
4
+
5
+ export const IMAGE_SIGNATURES = [
6
+ { sig: [0x89, 0x50, 0x4e, 0x47], offset: 0, mime: "image/png" },
7
+ { sig: [0xff, 0xd8, 0xff], offset: 0, mime: "image/jpeg" },
8
+ { sig: [0x47, 0x49, 0x46, 0x38], offset: 0, mime: "image/gif" },
9
+ { sig: [0x52, 0x49, 0x46, 0x46], offset: 0, mime: "image/webp", verifyWebp: true },
10
+ { sig: [0x42, 0x4d], offset: 0, mime: "image/bmp" },
11
+ ];
12
+
13
+ export const BLOCKED_HOSTS = new Set([
14
+ "localhost",
15
+ "127.0.0.1",
16
+ "0.0.0.0",
17
+ "::1",
18
+ "169.254.169.254",
19
+ "metadata.google.internal",
20
+ ]);
@@ -0,0 +1,18 @@
1
+ export const ollamaModels = {
2
+ models: [
3
+ {
4
+ name: "llama3.2",
5
+ modified_at: "2025-12-26T00:00:00Z",
6
+ size: 2000000000,
7
+ digest: "abc123def456",
8
+ details: { format: "gguf", family: "llama", parameter_size: "3B", quantization_level: "Q4_K_M" }
9
+ },
10
+ {
11
+ name: "qwen2.5",
12
+ modified_at: "2025-12-26T00:00:00Z",
13
+ size: 4000000000,
14
+ digest: "def456abc123",
15
+ details: { format: "gguf", family: "qwen", parameter_size: "7B", quantization_level: "Q4_K_M" }
16
+ }
17
+ ]
18
+ };
@@ -0,0 +1,109 @@
1
+ import { PROVIDERS } from "./providers.js";
2
+ import REGISTRY from "../providers/registry/index.js";
3
+
4
+ import { PROVIDER_MODELS } from "../providers/index.js";
5
+ import { modelQuotaFamily, modelStrip, modelTargetFormat, normalizeModelId } from "../providers/models/schema.js";
6
+ import { CODEX_REVIEW_SUFFIX } from "../providers/models/helpers.js";
7
+ export { PROVIDER_MODELS };
8
+
9
+ export function getProviderModels(aliasOrId) {
10
+ return PROVIDER_MODELS[aliasOrId] || [];
11
+ }
12
+
13
+ export function getDefaultModel(aliasOrId) {
14
+ const models = PROVIDER_MODELS[aliasOrId];
15
+ return models?.[0]?.id || null;
16
+ }
17
+
18
+ const DOT_VERSION_PROVIDERS = new Set(["kr", "kiro"]);
19
+
20
+ function findModel(models, modelId, aliasOrId) {
21
+ if (!models) return undefined;
22
+
23
+ const candidates = typeof modelId === "string"
24
+ ? [
25
+ modelId,
26
+ modelId.replace(/^clinepass\//, "cline-pass/"),
27
+ modelId.replace(/^cline-pass\//, "clinepass/"),
28
+ modelId.replace(/^(?:clinepass|cline-pass)\//, ""),
29
+ ...(aliasOrId === "clinepass" && !/^(?:clinepass|cline-pass)\//.test(modelId)
30
+ ? [`cline-pass/${modelId}`, `clinepass/${modelId}`]
31
+ : []),
32
+ ]
33
+ : [modelId];
34
+ const found = models.find((m) => candidates.includes(m.id));
35
+ if (found) return found;
36
+
37
+ if (!DOT_VERSION_PROVIDERS.has(aliasOrId)) return undefined;
38
+ const normalizedCandidates = candidates.map((candidate) => normalizeModelId(candidate));
39
+ return models.find((m) => normalizedCandidates.includes(m.id));
40
+ }
41
+
42
+ export function isValidModel(aliasOrId, modelId, passthroughProviders = new Set()) {
43
+ if (passthroughProviders.has(aliasOrId)) return true;
44
+ const models = PROVIDER_MODELS[aliasOrId];
45
+ if (!models) return false;
46
+ return !!findModel(models, modelId, aliasOrId);
47
+ }
48
+
49
+ export function findModelName(aliasOrId, modelId) {
50
+ const models = PROVIDER_MODELS[aliasOrId];
51
+ if (!models) return modelId;
52
+ const found = findModel(models, modelId, aliasOrId);
53
+ return found?.name || modelId;
54
+ }
55
+
56
+ export function getModelTargetFormat(aliasOrId, modelId) {
57
+ const models = PROVIDER_MODELS[aliasOrId];
58
+ if (!models) return null;
59
+ return modelTargetFormat(findModel(models, modelId, aliasOrId));
60
+ }
61
+
62
+ export function getModelType(aliasOrId, modelId) {
63
+ const models = PROVIDER_MODELS[aliasOrId];
64
+ if (!models) return null;
65
+ const found = findModel(models, modelId, aliasOrId);
66
+ return found?.kind || found?.type || null;
67
+ }
68
+
69
+ export function getModelUpstreamId(aliasOrId, modelId) {
70
+
71
+ const sufMatch = typeof modelId === "string" ? modelId.match(/\([^()]+\)\s*$/) : null;
72
+ const suffix = sufMatch ? sufMatch[0] : "";
73
+ const baseId = suffix ? modelId.slice(0, sufMatch.index).trim() : modelId;
74
+ const models = PROVIDER_MODELS[aliasOrId];
75
+ const found = findModel(models, baseId, aliasOrId);
76
+ const resolvedId = found?.upstreamModelId || found?.id;
77
+ if (resolvedId) {
78
+ const presetMatch = resolvedId.match(/\([^()]+\)\s*$/);
79
+ const presetSuffix = presetMatch?.[0] || "";
80
+ const resolvedBase = presetSuffix ? resolvedId.slice(0, presetMatch.index).trim() : resolvedId;
81
+ return resolvedBase + (suffix || presetSuffix);
82
+ }
83
+ if (aliasOrId === "cx" && typeof baseId === "string" && baseId.endsWith(CODEX_REVIEW_SUFFIX)) {
84
+ return baseId.slice(0, -CODEX_REVIEW_SUFFIX.length) + suffix;
85
+ }
86
+ return baseId + suffix;
87
+ }
88
+
89
+ export function getModelQuotaFamily(aliasOrId, modelId) {
90
+ const models = PROVIDER_MODELS[aliasOrId];
91
+ return modelQuotaFamily(findModel(models, modelId, aliasOrId));
92
+ }
93
+
94
+ export const OAUTH_ALIASES = Object.fromEntries(
95
+ REGISTRY.filter(r => r.alias && r.alias !== r.id).map(r => [r.id, r.alias])
96
+ );
97
+
98
+ export const PROVIDER_ID_TO_ALIAS = Object.fromEntries(
99
+ Object.keys(PROVIDERS).map(id => [id, OAUTH_ALIASES[id] || id])
100
+ );
101
+
102
+ export function getModelsByProviderId(providerId) {
103
+ const alias = PROVIDER_ID_TO_ALIAS[providerId] || providerId;
104
+ return PROVIDER_MODELS[alias] || [];
105
+ }
106
+
107
+ export function getModelStrip(alias, modelId) {
108
+ return modelStrip(findModel(PROVIDER_MODELS[alias], modelId, alias));
109
+ }