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,158 @@
1
+ import http from "node:http";
2
+ import https from "node:https";
3
+ import { Readable } from "node:stream";
4
+ import { ProxyAgent, fetch as undiciFetch } from "undici";
5
+ import { SocksProxyAgent } from "socks-proxy-agent";
6
+ import {
7
+ isSocksProxyUrl,
8
+ normalizeProxyUrl,
9
+ safeProxyError,
10
+ } from "./proxyUrl.js";
11
+
12
+ function isSocksProxy(proxyUrl, proxyType) {
13
+ return isSocksProxyUrl(proxyUrl, proxyType);
14
+ }
15
+
16
+ function createProxyDispatcher(proxyUrl, proxyType) {
17
+ return isSocksProxy(proxyUrl, proxyType)
18
+ ? new SocksProxyAgent(proxyUrl)
19
+ : new ProxyAgent({ uri: proxyUrl });
20
+ }
21
+
22
+ async function fetchThroughSocks(url, options, proxyUrl) {
23
+ const agent = new SocksProxyAgent(proxyUrl);
24
+ const target = new URL(url);
25
+ const transport = target.protocol === "http:" ? http : https;
26
+ const requestOptions = {
27
+ method: options.method || "GET",
28
+ headers: options.headers,
29
+ agent,
30
+ };
31
+ return new Promise((resolve, reject) => {
32
+ const request = transport.request(target, requestOptions, (response) => {
33
+ response.resume();
34
+ response.once("end", () => resolve({
35
+ ok: response.statusCode >= 200 && response.statusCode < 400,
36
+ status: response.statusCode || 0,
37
+ statusText: response.statusMessage || "",
38
+ url,
39
+ }));
40
+ });
41
+ request.once("error", reject);
42
+ if (options.signal) {
43
+ const abort = () => request.destroy(new Error("Proxy test aborted"));
44
+ if (options.signal.aborted) abort();
45
+ else options.signal.addEventListener("abort", abort, { once: true });
46
+ }
47
+ request.end();
48
+ });
49
+ }
50
+
51
+ function normalizeString(value) {
52
+ if (value === undefined || value === null) return "";
53
+ return String(value).trim();
54
+ }
55
+
56
+ const DEFAULT_TEST_URL = "https://www.google.com/generate_204";
57
+ const DEFAULT_TIMEOUT_MS = 8000;
58
+
59
+ function getErrorMessage(err) {
60
+ if (!err) return "Unknown error";
61
+ const base = err?.message || String(err);
62
+ const causeCode = err?.cause?.code || err?.code;
63
+ const causeMessage = err?.cause?.message;
64
+
65
+ if (causeMessage && causeMessage !== base) {
66
+ return causeCode ? `${base}: ${causeMessage} (${causeCode})` : `${base}: ${causeMessage}`;
67
+ }
68
+
69
+ if (causeCode && !base.includes(causeCode)) {
70
+ return `${base} (${causeCode})`;
71
+ }
72
+
73
+ return base;
74
+ }
75
+
76
+ export async function testProxyUrl({ proxyUrl, proxyType, testUrl, timeoutMs } = {}) {
77
+ const rawProxyUrl = normalizeString(proxyUrl);
78
+ if (!rawProxyUrl) {
79
+ return { ok: false, status: 400, error: "proxyUrl is required" };
80
+ }
81
+
82
+ let normalizedProxyUrl;
83
+ try {
84
+ normalizedProxyUrl = normalizeProxyUrl(rawProxyUrl, proxyType);
85
+ } catch (err) {
86
+ return {
87
+ ok: false,
88
+ status: 400,
89
+ error: `Invalid proxy URL: ${safeProxyError(err)}`,
90
+ };
91
+ }
92
+
93
+ const normalizedTestUrl = normalizeString(testUrl) || DEFAULT_TEST_URL;
94
+ const timeoutMsRaw = Number(timeoutMs);
95
+ const normalizedTimeoutMs =
96
+ Number.isFinite(timeoutMsRaw) && timeoutMsRaw > 0
97
+ ? Math.min(timeoutMsRaw, 30000)
98
+ : DEFAULT_TIMEOUT_MS;
99
+
100
+ let dispatcher;
101
+
102
+ try {
103
+ try {
104
+ dispatcher = createProxyDispatcher(normalizedProxyUrl, proxyType);
105
+ } catch (err) {
106
+ return {
107
+ ok: false,
108
+ status: 400,
109
+ error: `Invalid proxy URL: ${safeProxyError(err)}`,
110
+ };
111
+ }
112
+
113
+ const controller = new AbortController();
114
+ const startedAt = Date.now();
115
+ const timer = setTimeout(() => controller.abort(), normalizedTimeoutMs);
116
+
117
+ try {
118
+ const requestOptions = {
119
+ method: "GET",
120
+ signal: controller.signal,
121
+ headers: {
122
+ "User-Agent": "SwayRouter",
123
+ },
124
+ };
125
+ const res = isSocksProxy(normalizedProxyUrl, proxyType)
126
+ ? await fetchThroughSocks(normalizedTestUrl, requestOptions, normalizedProxyUrl)
127
+ : await undiciFetch(normalizedTestUrl, { ...requestOptions, dispatcher });
128
+
129
+ try {
130
+ await res.body?.cancel?.();
131
+ } catch {
132
+
133
+ }
134
+
135
+ return {
136
+ ok: res.ok,
137
+ status: res.status,
138
+ statusText: res.statusText,
139
+ url: normalizedTestUrl,
140
+ elapsedMs: Date.now() - startedAt,
141
+ };
142
+ } catch (err) {
143
+ const message =
144
+ err?.name === "AbortError"
145
+ ? "Proxy test timed out"
146
+ : safeProxyError(getErrorMessage(err));
147
+ return { ok: false, status: 500, error: message };
148
+ } finally {
149
+ clearTimeout(timer);
150
+ }
151
+ } finally {
152
+ try {
153
+ await dispatcher?.close?.();
154
+ } catch {
155
+
156
+ }
157
+ }
158
+ }
@@ -0,0 +1,76 @@
1
+ const DEFAULT_PROXY_SCHEME = "http:";
2
+ const PROXY_SCHEMES = new Set(["http:", "https:", "socks5:", "socks5h:"]);
3
+
4
+ function normalizeString(value) {
5
+ if (value === undefined || value === null) return "";
6
+ return String(value).trim();
7
+ }
8
+
9
+ function defaultSchemeForType(proxyType) {
10
+ const type = normalizeString(proxyType).toLowerCase();
11
+ if (type === "https") return "https:";
12
+ if (type === "socks5" || type === "socks5h") return `${type}:`;
13
+ return DEFAULT_PROXY_SCHEME;
14
+ }
15
+
16
+ export function normalizeProxyUrl(value, proxyType) {
17
+ const input = normalizeString(value);
18
+ if (!input) return null;
19
+ if ([...input].some((char) => {
20
+ const code = char.charCodeAt(0);
21
+ return code < 0x20 || code === 0x7f || char === "`" || char === "$";
22
+ })) {
23
+ throw new TypeError("Proxy URL contains invalid characters");
24
+ }
25
+
26
+ const explicitScheme = /^[a-z][a-z\d+.-]*:\/\//i.test(input);
27
+ const schemeWithoutAuthority = /^(?:https?|socks5h?):(?!\/\/)/i.test(input);
28
+ if (schemeWithoutAuthority) {
29
+ throw new TypeError("Proxy URL must include a host");
30
+ }
31
+
32
+ const candidate = explicitScheme
33
+ ? input
34
+ : `${defaultSchemeForType(proxyType)}//${input}`;
35
+
36
+ let parsed;
37
+ try {
38
+ parsed = new URL(candidate);
39
+ } catch {
40
+ throw new TypeError("Proxy URL is invalid");
41
+ }
42
+
43
+ if (!PROXY_SCHEMES.has(parsed.protocol) || !parsed.hostname) {
44
+ throw new TypeError("Proxy URL must use http, https, socks5, or socks5h");
45
+ }
46
+
47
+ const type = normalizeString(proxyType).toLowerCase();
48
+ const typeIsSocks = type === "socks5" || type === "socks5h";
49
+ const urlIsSocks = parsed.protocol === "socks5:" || parsed.protocol === "socks5h:";
50
+ if (typeIsSocks !== urlIsSocks && explicitScheme) {
51
+ throw new TypeError(`Proxy type ${type || "http"} does not match URL scheme ${parsed.protocol.slice(0, -1)}`);
52
+ }
53
+
54
+ return parsed.href;
55
+ }
56
+
57
+ export function isSocksProxyUrl(proxyUrl, proxyType) {
58
+ try {
59
+ const protocol = new URL(proxyUrl).protocol;
60
+ if (protocol === "socks5:" || protocol === "socks5h:") return true;
61
+ if (protocol === "http:" || protocol === "https:") return false;
62
+ } catch {
63
+
64
+ }
65
+
66
+ const type = normalizeString(proxyType).toLowerCase();
67
+ return type === "socks5" || type === "socks5h";
68
+ }
69
+
70
+ export function safeProxyError(error) {
71
+ const message = error?.message || String(error);
72
+ return message.replace(
73
+ /((?:https?|socks5h?|socks4a?):\/\/)[^/\s@]+@/gi,
74
+ "$1[redacted]@",
75
+ );
76
+ }
@@ -0,0 +1,71 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { fetch as undiciFetch } from "undici";
3
+
4
+ export const SUPPORTED_PROXY_TYPES = new Set([
5
+ "http",
6
+ "https",
7
+ "socks5",
8
+ "socks5h",
9
+ "vercel",
10
+ "cloudflare",
11
+ ]);
12
+
13
+ export const RELAY_PROXY_TYPES = new Set(["vercel", "cloudflare"]);
14
+
15
+ export function isSupportedProxyType(type) {
16
+ return SUPPORTED_PROXY_TYPES.has(String(type || "").trim().toLowerCase());
17
+ }
18
+
19
+ export function isRelayProxyType(type) {
20
+ return RELAY_PROXY_TYPES.has(String(type || "").trim().toLowerCase());
21
+ }
22
+
23
+ export function createRelayToken() {
24
+ return randomBytes(32).toString("base64url");
25
+ }
26
+
27
+ export function normalizeRelayProjectName(value, fallback = `relay-${Date.now().toString(36)}`) {
28
+ const name = String(value || fallback).trim().toLowerCase();
29
+ if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(name)) {
30
+ throw new TypeError("Project name must use lowercase letters, numbers, and hyphens (max 63 characters)");
31
+ }
32
+ return name;
33
+ }
34
+
35
+ export function publicProxyPool(pool) {
36
+ if (!pool || typeof pool !== "object") return pool;
37
+ const { relayToken: _relayToken, ...safePool } = pool;
38
+ return safePool;
39
+ }
40
+
41
+ export async function testRelayEndpoint(relayUrl, relayToken, timeoutMs = 15000) {
42
+ const controller = new AbortController();
43
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
44
+ const startedAt = Date.now();
45
+ try {
46
+ const response = await undiciFetch(relayUrl, {
47
+ method: "GET",
48
+ headers: {
49
+ ...(relayToken ? { "x-sway-relay-token": relayToken } : {}),
50
+ "x-relay-target": "https://www.google.com",
51
+ "x-relay-path": "/generate_204",
52
+ },
53
+ signal: controller.signal,
54
+ });
55
+ await response.body?.cancel();
56
+ return {
57
+ ok: response.ok,
58
+ status: response.status,
59
+ elapsedMs: Date.now() - startedAt,
60
+ };
61
+ } catch (error) {
62
+ return {
63
+ ok: false,
64
+ status: 0,
65
+ elapsedMs: Date.now() - startedAt,
66
+ error: error?.name === "AbortError" ? "Relay test timed out" : "Relay request failed",
67
+ };
68
+ } finally {
69
+ clearTimeout(timer);
70
+ }
71
+ }
@@ -0,0 +1,152 @@
1
+ import { platform, arch } from "os";
2
+ import { ANTIGRAVITY_OAUTH_CLIENT, GOOGLE_OAUTH_CLIENT } from "../../../providers/shared.js";
3
+ import { PROVIDER_OAUTH, PROVIDERS as REGISTRY_PROVIDERS } from "../../../providers/index.js";
4
+
5
+ function getOAuthPlatformEnum() {
6
+ const os = platform();
7
+ const architecture = arch();
8
+ if (os === "darwin") return architecture === "arm64" ? 2 : 1;
9
+ if (os === "linux") return architecture === "arm64" ? 4 : 3;
10
+ if (os === "win32") return 5;
11
+ return 0;
12
+ }
13
+
14
+ export const CLAUDE_CONFIG = { ...PROVIDER_OAUTH["claude"] };
15
+
16
+ export const CODEX_CONFIG = { ...PROVIDER_OAUTH["codex"] };
17
+
18
+ export const GEMINI_CONFIG = { ...GOOGLE_OAUTH_CLIENT, ...PROVIDER_OAUTH["gemini-cli"] };
19
+
20
+ export const QODER_CONFIG = { ...PROVIDER_OAUTH["qoder"] };
21
+
22
+ export const ANTIGRAVITY_CONFIG = {
23
+ ...ANTIGRAVITY_OAUTH_CLIENT,
24
+ ...PROVIDER_OAUTH["antigravity"],
25
+ loadCodeAssistClientMetadata: JSON.stringify({ ideType: 9, platform: getOAuthPlatformEnum(), pluginType: 2 }),
26
+ };
27
+
28
+ export function getOAuthClientMetadata() {
29
+ return { ideType: 9, platform: getOAuthPlatformEnum(), pluginType: 2 };
30
+ }
31
+
32
+ export const OPENAI_CONFIG = { ...PROVIDER_OAUTH["openai"] };
33
+
34
+ export const GITHUB_CONFIG = { ...PROVIDER_OAUTH["github"] };
35
+
36
+ export const KIRO_CONFIG = { ...PROVIDER_OAUTH["kiro"] };
37
+
38
+ export const AWS_REGION_PATTERN = /^[a-z]{2}-[a-z]+-\d{1,2}$/;
39
+
40
+ export function assertValidAwsRegion(region) {
41
+ if (typeof region !== "string" || !AWS_REGION_PATTERN.test(region)) {
42
+ throw new Error("Invalid region");
43
+ }
44
+ return region;
45
+ }
46
+
47
+ export const CURSOR_CONFIG = {
48
+ ...PROVIDER_OAUTH["cursor"],
49
+ tokenStoragePaths: {
50
+ linux: "~/.config/Cursor/User/globalStorage/state.vscdb",
51
+ macos: "/Users/<user>/Library/Application Support/Cursor/User/globalStorage/state.vscdb",
52
+ windows: "%APPDATA%\\Cursor\\User\\globalStorage\\state.vscdb",
53
+ },
54
+ };
55
+
56
+ export const KIMI_CONFIG = {
57
+ ...PROVIDER_OAUTH["kimi"],
58
+ clientId:
59
+ process.env.KIMI_CODING_OAUTH_CLIENT_ID ||
60
+ process.env.KIMI_OAUTH_CLIENT_ID ||
61
+ REGISTRY_PROVIDERS["kimi"]?.clientId ||
62
+ PROVIDER_OAUTH["kimi"]?.clientId,
63
+ };
64
+
65
+ export const KIMI_CODING_CONFIG = KIMI_CONFIG;
66
+
67
+ export const KILOCODE_CONFIG = { ...PROVIDER_OAUTH["kilocode"] };
68
+
69
+ export const CLINE_CONFIG = { ...PROVIDER_OAUTH["cline"] };
70
+
71
+ export const CLINEPASS_CONFIG = { ...PROVIDER_OAUTH["clinepass"] };
72
+
73
+ export const CODEBUDDY_CONFIG = { ...PROVIDER_OAUTH["codebuddy-cn"] };
74
+
75
+ export const CODEBUDDY_INTL_CONFIG = { ...PROVIDER_OAUTH["codebuddy-intl"] };
76
+
77
+ export const KIMCHI_CONFIG = { ...PROVIDER_OAUTH["kimchi"] };
78
+
79
+ export const GROK_CLI_CONFIG = { ...PROVIDER_OAUTH["grok-cli"] };
80
+
81
+ export const TRAE_CONFIG = {
82
+ clientId: "ono9krqynydwx5",
83
+ clientSecret: "-",
84
+ loginGuidanceUrls: [
85
+ "https://api.marscode.com/cloudide/api/v3/trae/GetLoginGuidance",
86
+ "https://api.trae.ai/cloudide/api/v3/trae/GetLoginGuidance",
87
+ "https://www.trae.ai/cloudide/api/v3/trae/GetLoginGuidance",
88
+ ],
89
+ apiOrigins: [
90
+ "https://api.marscode.com",
91
+ "https://api.trae.ai",
92
+ "https://www.trae.ai",
93
+ "https://www.marscode.com",
94
+ ],
95
+ exchangeTokenPath: "/cloudide/api/v3/trae/oauth/ExchangeToken",
96
+ getUserInfoPath: "/cloudide/api/v3/trae/GetUserInfo",
97
+ authorizationPath: "/authorization",
98
+ callbackPath: "/callback",
99
+ minAppVersion: "3.5.54",
100
+ defaultAppVersion: "3.5.54",
101
+ defaultAppType: "stable",
102
+ defaultPluginVersion: "local",
103
+
104
+ defaultDeviceId: "0",
105
+ userAgent: "Trae/1.0.0 antigravity-cockpit-tools",
106
+ webUrl: "https://www.trae.ai",
107
+ authScheme: "Cloud-IDE-JWT",
108
+ tokenLifetimeDays: 14,
109
+ oauthTimeoutMs: 600_000,
110
+ };
111
+
112
+ export const WINDSURF_CONFIG = {
113
+ clientId: "3GUryQ7ldAeKEuD2obYnppsnmj58eP5u",
114
+ authBaseUrl: "https://www.windsurf.com",
115
+ signInPath: "/windsurf/signin",
116
+ registerApiBaseUrl: "https://register.windsurf.com",
117
+ registerPath: "/exa.seat_management_pb.SeatManagementService/RegisterUser",
118
+ oneTimeAuthPath: "/exa.seat_management_pb.SeatManagementService/GetOneTimeAuthToken",
119
+ currentUserPath: "/exa.seat_management_pb.SeatManagementService/GetCurrentUser",
120
+ planStatusPath: "/exa.seat_management_pb.SeatManagementService/GetPlanStatus",
121
+ userStatusPath: "/exa.seat_management_pb.SeatManagementService/GetUserStatus",
122
+ defaultApiServerUrl: "https://server.codeium.com",
123
+ firebaseApiKey: "AIzaSyDsOl-1XpT5err0Tcn0TFFod1H8gVGIycY", // gitleaks:allow -- public Firebase web client key
124
+ callbackPath: "/windsurf-auth-callback",
125
+ userAgent: "antigravity-cockpit-tools",
126
+ oauthTimeoutMs: 600_000,
127
+ };
128
+
129
+ export const OAUTH_TIMEOUT = 300000;
130
+
131
+ export const PROVIDERS = {
132
+ CLAUDE: "claude",
133
+ CODEX: "codex",
134
+ GEMINI: "gemini-cli",
135
+ QODER: "qoder",
136
+ ANTIGRAVITY: "antigravity",
137
+ OPENAI: "openai",
138
+ GITHUB: "github",
139
+ KIRO: "kiro",
140
+ CURSOR: "cursor",
141
+ KIMI: "kimi",
142
+ KIMI_CODING: "kimi",
143
+ KILOCODE: "kilocode",
144
+ CLINE: "cline",
145
+ CLINEPASS: "clinepass",
146
+ CODEBUDDY: "codebuddy-cn",
147
+ CODEBUDDY_INTL: "codebuddy-intl",
148
+ KIMCHI: "kimchi",
149
+ GROK_CLI: "grok-cli",
150
+ TRAE: "trae",
151
+ WINDSURF: "windsurf",
152
+ };
@@ -0,0 +1,43 @@
1
+ import { PROVIDERS } from "../../../providers/index.js";
2
+
3
+ export const XAI_CLIENT_ID = PROVIDERS["xai"]?.clientId;
4
+
5
+ export const XAI_ISSUER = "https://auth.x.ai";
6
+ export const XAI_AUTH_ENDPOINT_PATH = "/oauth2/authorize";
7
+ export const XAI_TOKEN_ENDPOINT_PATH = "/oauth2/token";
8
+ export const XAI_DISCOVERY_PATH = "/.well-known/openid-configuration";
9
+
10
+ export const XAI_SCOPE = "openid profile email offline_access grok-cli:access api:access";
11
+
12
+ export const XAI_API_BASE = "https://api.x.ai/v1";
13
+
14
+ export const XAI_LOOPBACK_PORT = 56121;
15
+ export const XAI_CALLBACK_PATH = "/callback";
16
+ export const XAI_REDIRECT_URI = `http://127.0.0.1:${XAI_LOOPBACK_PORT}${XAI_CALLBACK_PATH}`;
17
+
18
+ export const XAI_PKCE_VERIFIER_BYTES = 96;
19
+
20
+ export const XAI_REFRESH_LEAD_SECONDS = 5 * 60;
21
+
22
+ export const XAI_USER_AGENT = "grok-cli/swayrouter";
23
+
24
+ export const XAI_CONFIG = {
25
+ clientId: XAI_CLIENT_ID,
26
+ issuer: XAI_ISSUER,
27
+ authEndpointPath: XAI_AUTH_ENDPOINT_PATH,
28
+ tokenEndpointPath: XAI_TOKEN_ENDPOINT_PATH,
29
+ discoveryPath: XAI_DISCOVERY_PATH,
30
+
31
+ authorizeUrl: `${XAI_ISSUER}${XAI_AUTH_ENDPOINT_PATH}`,
32
+ tokenUrl: `${XAI_ISSUER}${XAI_TOKEN_ENDPOINT_PATH}`,
33
+ discoveryUrl: `${XAI_ISSUER}${XAI_DISCOVERY_PATH}`,
34
+ scope: XAI_SCOPE,
35
+ apiBaseUrl: XAI_API_BASE,
36
+ redirectUri: XAI_REDIRECT_URI,
37
+ loopbackPort: XAI_LOOPBACK_PORT,
38
+ callbackPath: XAI_CALLBACK_PATH,
39
+ pkceVerifierBytes: XAI_PKCE_VERIFIER_BYTES,
40
+ refreshLeadSeconds: XAI_REFRESH_LEAD_SECONDS,
41
+ userAgent: XAI_USER_AGENT,
42
+ codeChallengeMethod: "S256",
43
+ };
@@ -0,0 +1,167 @@
1
+ const MICROSOFT_TOKEN_ENDPOINT_HOSTS = new Set([
2
+ "login.microsoftonline.com",
3
+ "login.microsoft.com",
4
+ "login.windows.net",
5
+ ]);
6
+
7
+ const DEFAULT_REGION = "us-east-1";
8
+ const DEFAULT_EXPIRES_IN = 3600;
9
+
10
+ function normalizeString(value) {
11
+ return typeof value === "string" ? value.trim() : "";
12
+ }
13
+
14
+ function firstInputValue(input, ...keys) {
15
+ for (const key of keys) {
16
+ if (input[key]) return input[key];
17
+ }
18
+ return undefined;
19
+ }
20
+
21
+ export function validateMicrosoftTokenEndpoint(rawEndpoint) {
22
+ const tokenEndpoint = normalizeString(rawEndpoint);
23
+ if (!tokenEndpoint) throw new Error("token_endpoint is required");
24
+
25
+ let parsed;
26
+ try {
27
+ parsed = new URL(tokenEndpoint);
28
+ } catch {
29
+ throw new Error("token_endpoint must be a valid URL");
30
+ }
31
+
32
+ if (parsed.protocol !== "https:") {
33
+ throw new Error("token_endpoint must use https");
34
+ }
35
+
36
+ const host = parsed.hostname.toLowerCase();
37
+ if (!MICROSOFT_TOKEN_ENDPOINT_HOSTS.has(host)) {
38
+ throw new Error("token_endpoint must be a Microsoft login endpoint");
39
+ }
40
+
41
+ return parsed.toString();
42
+ }
43
+
44
+ export function normalizeScope(scopes) {
45
+ if (Array.isArray(scopes)) {
46
+ return scopes.map(normalizeString).filter(Boolean).join(" ");
47
+ }
48
+ return normalizeString(scopes);
49
+ }
50
+
51
+ export function decodeJwtPayload(jwt) {
52
+ try {
53
+ if (!jwt || typeof jwt !== "string") return null;
54
+ const parts = jwt.split(".");
55
+ if (parts.length !== 3) return null;
56
+ const base64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
57
+ const padding = (4 - (base64.length % 4)) % 4;
58
+ return JSON.parse(Buffer.from(`${base64}${"=".repeat(padding)}`, "base64").toString("utf8"));
59
+ } catch {
60
+ return null;
61
+ }
62
+ }
63
+
64
+ function resolveExpiresAt(input) {
65
+ const explicit = firstInputValue(input, "expired", "expires_at", "expiresAt");
66
+ if (explicit) {
67
+ const ms = new Date(explicit).getTime();
68
+ if (Number.isFinite(ms)) return new Date(ms).toISOString();
69
+ }
70
+
71
+ const expiresIn = Number(firstInputValue(input, "expires_in", "expiresIn") || 0);
72
+ if (Number.isFinite(expiresIn) && expiresIn > 0) {
73
+ return new Date(Date.now() + expiresIn * 1000).toISOString();
74
+ }
75
+
76
+ const payload = decodeJwtPayload(firstInputValue(input, "access_token", "accessToken"));
77
+ if (payload?.exp) {
78
+ return new Date(payload.exp * 1000).toISOString();
79
+ }
80
+
81
+ return new Date(Date.now() + DEFAULT_EXPIRES_IN * 1000).toISOString();
82
+ }
83
+
84
+ export function normalizeKiroExternalIdpAuth(rawAuth) {
85
+ let input = rawAuth;
86
+ if (typeof input === "string") {
87
+ try {
88
+ input = JSON.parse(input);
89
+ } catch {
90
+ throw new Error("CLIProxyAPI auth JSON is invalid");
91
+ }
92
+ }
93
+
94
+ if (!input || typeof input !== "object") {
95
+ throw new Error("CLIProxyAPI auth JSON is required");
96
+ }
97
+
98
+ const authMethod = normalizeString(firstInputValue(input, "auth_method", "authMethod"));
99
+ if (authMethod && authMethod !== "external_idp") {
100
+ throw new Error("Only external_idp Kiro auth is supported by this importer");
101
+ }
102
+
103
+ const accessToken = normalizeString(firstInputValue(input, "access_token", "accessToken"));
104
+ const refreshToken = normalizeString(firstInputValue(input, "refresh_token", "refreshToken"));
105
+ const clientId = normalizeString(firstInputValue(input, "client_id", "clientId"));
106
+ const tokenEndpoint = validateMicrosoftTokenEndpoint(firstInputValue(input, "token_endpoint", "tokenEndpoint"));
107
+ const profileArn = normalizeString(firstInputValue(input, "profile_arn", "profileArn"));
108
+ const region = normalizeString(input.region) || DEFAULT_REGION;
109
+ const scope = normalizeScope(firstInputValue(input, "scopes", "scope"));
110
+
111
+ if (!accessToken) throw new Error("access_token is required");
112
+ if (!refreshToken) throw new Error("refresh_token is required");
113
+ if (!clientId) throw new Error("client_id is required");
114
+ if (!scope) throw new Error("scopes is required");
115
+ if (!profileArn) throw new Error("profile_arn is required");
116
+
117
+ const payload = decodeJwtPayload(accessToken);
118
+ const email = firstInputValue(input, "email")
119
+ || payload?.email
120
+ || payload?.preferred_username
121
+ || payload?.upn
122
+ || payload?.sub
123
+ || null;
124
+
125
+ return {
126
+ accessToken,
127
+ refreshToken,
128
+ expiresAt: resolveExpiresAt(input),
129
+ email,
130
+ providerSpecificData: {
131
+ profileArn,
132
+ region,
133
+ authMethod: "external_idp",
134
+ provider: "CLIProxyAPI",
135
+ clientId,
136
+ tokenEndpoint,
137
+ scope,
138
+ },
139
+ };
140
+ }
141
+
142
+ export function buildExternalIdpRefreshParams(refreshToken, providerSpecificData = {}) {
143
+ const clientId = normalizeString(firstInputValue(providerSpecificData, "clientId", "client_id"));
144
+ const tokenEndpoint = validateMicrosoftTokenEndpoint(firstInputValue(providerSpecificData, "tokenEndpoint", "token_endpoint"));
145
+ const scope = normalizeScope(firstInputValue(providerSpecificData, "scope", "scopes"));
146
+
147
+ if (!refreshToken) throw new Error("refresh token is required");
148
+ if (!clientId) throw new Error("clientId is required for external_idp refresh");
149
+ if (!scope) throw new Error("scope is required for external_idp refresh");
150
+
151
+ return {
152
+ tokenEndpoint,
153
+ body: new URLSearchParams({
154
+ grant_type: "refresh_token",
155
+ client_id: clientId,
156
+ refresh_token: refreshToken,
157
+ scope,
158
+ }),
159
+ providerSpecificData: {
160
+ ...providerSpecificData,
161
+ authMethod: "external_idp",
162
+ clientId,
163
+ tokenEndpoint,
164
+ scope,
165
+ },
166
+ };
167
+ }