@vib-rato/ai 0.16.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 (525) hide show
  1. package/CHANGELOG.md +3354 -0
  2. package/README.md +1194 -0
  3. package/dist/types/adapter-internals/provider-safety-stop.d.ts +45 -0
  4. package/dist/types/api-registry.d.ts +30 -0
  5. package/dist/types/auth-broker/client.d.ts +80 -0
  6. package/dist/types/auth-broker/index.d.ts +5 -0
  7. package/dist/types/auth-broker/redact.d.ts +7 -0
  8. package/dist/types/auth-broker/refresher.d.ts +25 -0
  9. package/dist/types/auth-broker/remote-store.d.ts +153 -0
  10. package/dist/types/auth-broker/server.d.ts +32 -0
  11. package/dist/types/auth-broker/types.d.ts +132 -0
  12. package/dist/types/auth-broker/wire-schemas.d.ts +555 -0
  13. package/dist/types/auth-gateway/http.d.ts +40 -0
  14. package/dist/types/auth-gateway/index.d.ts +3 -0
  15. package/dist/types/auth-gateway/server.d.ts +70 -0
  16. package/dist/types/auth-gateway/types.d.ts +129 -0
  17. package/dist/types/auth-storage.d.ts +1074 -0
  18. package/dist/types/cli.d.ts +2 -0
  19. package/dist/types/codex-tools.d.ts +4 -0
  20. package/dist/types/context-cap-policy.d.ts +68 -0
  21. package/dist/types/core.d.ts +35 -0
  22. package/dist/types/index.d.ts +55 -0
  23. package/dist/types/model-cache.d.ts +24 -0
  24. package/dist/types/model-manager.d.ts +77 -0
  25. package/dist/types/model-pricing.d.ts +3 -0
  26. package/dist/types/model-retirements.d.ts +6 -0
  27. package/dist/types/model-thinking.d.ts +100 -0
  28. package/dist/types/models.d.ts +21 -0
  29. package/dist/types/openai-completions-compat.d.ts +34 -0
  30. package/dist/types/provider-details.d.ts +24 -0
  31. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  32. package/dist/types/provider-models/descriptors.d.ts +48 -0
  33. package/dist/types/provider-models/google.d.ts +20 -0
  34. package/dist/types/provider-models/index.d.ts +5 -0
  35. package/dist/types/provider-models/ollama.d.ts +7 -0
  36. package/dist/types/provider-models/openai-compat.d.ts +293 -0
  37. package/dist/types/provider-models/special.d.ts +29 -0
  38. package/dist/types/providers/amazon-bedrock.d.ts +60 -0
  39. package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
  40. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  41. package/dist/types/providers/anthropic.d.ts +280 -0
  42. package/dist/types/providers/aws-credential-config.d.ts +19 -0
  43. package/dist/types/providers/aws-credentials.d.ts +43 -0
  44. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  45. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  46. package/dist/types/providers/azure-openai-responses.d.ts +22 -0
  47. package/dist/types/providers/composer-discipline.d.ts +32 -0
  48. package/dist/types/providers/cursor/client-version.d.ts +10 -0
  49. package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
  50. package/dist/types/providers/cursor/gen/agent_pb.d.ts +16769 -0
  51. package/dist/types/providers/cursor-pi-args.d.ts +119 -0
  52. package/dist/types/providers/cursor.d.ts +72 -0
  53. package/dist/types/providers/dashscope-token-plan-headers.d.ts +57 -0
  54. package/dist/types/providers/error-message.d.ts +27 -0
  55. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  56. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  57. package/dist/types/providers/google-auth.d.ts +26 -0
  58. package/dist/types/providers/google-gemini-cli.d.ts +75 -0
  59. package/dist/types/providers/google-gemini-headers.d.ts +43 -0
  60. package/dist/types/providers/google-shared.d.ts +183 -0
  61. package/dist/types/providers/google-types.d.ts +138 -0
  62. package/dist/types/providers/google-vertex.d.ts +11 -0
  63. package/dist/types/providers/google.d.ts +4 -0
  64. package/dist/types/providers/grammar.d.ts +1 -0
  65. package/dist/types/providers/kimi.d.ts +27 -0
  66. package/dist/types/providers/kiro-api-key.d.ts +50 -0
  67. package/dist/types/providers/kiro-codewhisperer.d.ts +11 -0
  68. package/dist/types/providers/mock.d.ts +189 -0
  69. package/dist/types/providers/ollama.d.ts +41 -0
  70. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  71. package/dist/types/providers/openai-bounded-rate-limits.d.ts +3 -0
  72. package/dist/types/providers/openai-chat-server-schema.d.ts +1733 -0
  73. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  74. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  75. package/dist/types/providers/openai-codex/request-transformer.d.ts +50 -0
  76. package/dist/types/providers/openai-codex/response-handler.d.ts +18 -0
  77. package/dist/types/providers/openai-codex-responses.d.ts +71 -0
  78. package/dist/types/providers/openai-completions-compat.d.ts +6 -0
  79. package/dist/types/providers/openai-completions.d.ts +35 -0
  80. package/dist/types/providers/openai-opencodex-responses.d.ts +10 -0
  81. package/dist/types/providers/openai-request-transform.d.ts +4 -0
  82. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  83. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  84. package/dist/types/providers/openai-responses-shared.d.ts +106 -0
  85. package/dist/types/providers/openai-responses.d.ts +37 -0
  86. package/dist/types/providers/pi-native-client.d.ts +29 -0
  87. package/dist/types/providers/pi-native-server.d.ts +60 -0
  88. package/dist/types/providers/register-builtins.d.ts +59 -0
  89. package/dist/types/providers/synthetic.d.ts +26 -0
  90. package/dist/types/providers/transform-messages.d.ts +33 -0
  91. package/dist/types/providers/vision-guard.d.ts +8 -0
  92. package/dist/types/rate-limit-utils.d.ts +19 -0
  93. package/dist/types/stream.d.ts +45 -0
  94. package/dist/types/types.d.ts +1073 -0
  95. package/dist/types/usage/claude.d.ts +3 -0
  96. package/dist/types/usage/gemini.d.ts +2 -0
  97. package/dist/types/usage/github-copilot.d.ts +7 -0
  98. package/dist/types/usage/google-antigravity.d.ts +2 -0
  99. package/dist/types/usage/grok-cli.d.ts +17 -0
  100. package/dist/types/usage/kimi.d.ts +4 -0
  101. package/dist/types/usage/minimax-code.d.ts +2 -0
  102. package/dist/types/usage/openai-codex.d.ts +3 -0
  103. package/dist/types/usage/shared.d.ts +1 -0
  104. package/dist/types/usage/zai.d.ts +2 -0
  105. package/dist/types/usage.d.ts +264 -0
  106. package/dist/types/utils/abort.d.ts +19 -0
  107. package/dist/types/utils/anthropic-auth.d.ts +39 -0
  108. package/dist/types/utils/block-symbols.d.ts +6 -0
  109. package/dist/types/utils/discovery/antigravity.d.ts +67 -0
  110. package/dist/types/utils/discovery/codex.d.ts +38 -0
  111. package/dist/types/utils/discovery/cursor.d.ts +49 -0
  112. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  113. package/dist/types/utils/discovery/index.d.ts +4 -0
  114. package/dist/types/utils/discovery/openai-compatible.d.ts +81 -0
  115. package/dist/types/utils/event-stream.d.ts +41 -0
  116. package/dist/types/utils/fallback-transport.d.ts +110 -0
  117. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  118. package/dist/types/utils/foundry.d.ts +11 -0
  119. package/dist/types/utils/h2-fetch.d.ts +22 -0
  120. package/dist/types/utils/http-inspector.d.ts +59 -0
  121. package/dist/types/utils/idle-iterator.d.ts +122 -0
  122. package/dist/types/utils/json-parse.d.ts +98 -0
  123. package/dist/types/utils/oauth/alibaba-token-plan.d.ts +19 -0
  124. package/dist/types/utils/oauth/anthropic.d.ts +41 -0
  125. package/dist/types/utils/oauth/api-key-login.d.ts +38 -0
  126. package/dist/types/utils/oauth/api-key-validation.d.ts +39 -0
  127. package/dist/types/utils/oauth/bizrouter.d.ts +1 -0
  128. package/dist/types/utils/oauth/callback-server.d.ts +80 -0
  129. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  130. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  131. package/dist/types/utils/oauth/commandcode.d.ts +1 -0
  132. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  133. package/dist/types/utils/oauth/deepinfra.d.ts +1 -0
  134. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  135. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  136. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  137. package/dist/types/utils/oauth/fugu.d.ts +1 -0
  138. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  139. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  140. package/dist/types/utils/oauth/glm-zcode.d.ts +71 -0
  141. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  142. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  143. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  144. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  145. package/dist/types/utils/oauth/index.d.ts +39 -0
  146. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  147. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  148. package/dist/types/utils/oauth/kimi.d.ts +17 -0
  149. package/dist/types/utils/oauth/kiro.d.ts +71 -0
  150. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  151. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  152. package/dist/types/utils/oauth/mara.d.ts +1 -0
  153. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  154. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  155. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  156. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  157. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  158. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  159. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  160. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  161. package/dist/types/utils/oauth/opengateway.d.ts +1 -0
  162. package/dist/types/utils/oauth/openrouter.d.ts +1 -0
  163. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  164. package/dist/types/utils/oauth/perplexity.d.ts +4 -0
  165. package/dist/types/utils/oauth/pkce.d.ts +8 -0
  166. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  167. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  168. package/dist/types/utils/oauth/sglang.d.ts +16 -0
  169. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  170. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  171. package/dist/types/utils/oauth/together.d.ts +1 -0
  172. package/dist/types/utils/oauth/types.d.ts +56 -0
  173. package/dist/types/utils/oauth/venice.d.ts +18 -0
  174. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  175. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  176. package/dist/types/utils/oauth/xai.d.ts +30 -0
  177. package/dist/types/utils/oauth/xiaomi.d.ts +25 -0
  178. package/dist/types/utils/oauth/zai.d.ts +18 -0
  179. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  180. package/dist/types/utils/overflow.d.ts +14 -0
  181. package/dist/types/utils/parse-bind.d.ts +26 -0
  182. package/dist/types/utils/provider-response.d.ts +6 -0
  183. package/dist/types/utils/provider-safety-stop.d.ts +8 -0
  184. package/dist/types/utils/proxy.d.ts +7 -0
  185. package/dist/types/utils/retry-after.d.ts +3 -0
  186. package/dist/types/utils/retry-budget.d.ts +1 -0
  187. package/dist/types/utils/retry.d.ts +29 -0
  188. package/dist/types/utils/schema/adapt.d.ts +24 -0
  189. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  190. package/dist/types/utils/schema/dereference.d.ts +11 -0
  191. package/dist/types/utils/schema/draft.d.ts +10 -0
  192. package/dist/types/utils/schema/equality.d.ts +4 -0
  193. package/dist/types/utils/schema/fields.d.ts +49 -0
  194. package/dist/types/utils/schema/index.d.ts +14 -0
  195. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  196. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  197. package/dist/types/utils/schema/normalize.d.ts +93 -0
  198. package/dist/types/utils/schema/root-combinator.d.ts +12 -0
  199. package/dist/types/utils/schema/spill.d.ts +8 -0
  200. package/dist/types/utils/schema/stamps.d.ts +25 -0
  201. package/dist/types/utils/schema/types.d.ts +4 -0
  202. package/dist/types/utils/schema/wire.d.ts +54 -0
  203. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  204. package/dist/types/utils/sse-debug.d.ts +10 -0
  205. package/dist/types/utils/tool-call-healing.d.ts +80 -0
  206. package/dist/types/utils/tool-choice-capability.d.ts +57 -0
  207. package/dist/types/utils/tool-choice.d.ts +50 -0
  208. package/dist/types/utils/validation.d.ts +17 -0
  209. package/dist/types/utils.d.ts +117 -0
  210. package/package.json +152 -0
  211. package/src/adapter-internals/provider-safety-stop.d.ts +45 -0
  212. package/src/adapter-internals/provider-safety-stop.ts +156 -0
  213. package/src/api-registry.d.ts +30 -0
  214. package/src/api-registry.ts +96 -0
  215. package/src/auth-broker/client.ts +444 -0
  216. package/src/auth-broker/index.ts +5 -0
  217. package/src/auth-broker/redact.ts +39 -0
  218. package/src/auth-broker/refresher.ts +130 -0
  219. package/src/auth-broker/remote-store.ts +1576 -0
  220. package/src/auth-broker/server.ts +764 -0
  221. package/src/auth-broker/types.ts +164 -0
  222. package/src/auth-broker/wire-schemas.ts +261 -0
  223. package/src/auth-gateway/http.ts +198 -0
  224. package/src/auth-gateway/index.ts +3 -0
  225. package/src/auth-gateway/server.ts +1315 -0
  226. package/src/auth-gateway/types.ts +160 -0
  227. package/src/auth-storage.ts +7312 -0
  228. package/src/cli.ts +269 -0
  229. package/src/codex-tools.d.ts +4 -0
  230. package/src/codex-tools.ts +24 -0
  231. package/src/context-cap-policy.d.ts +68 -0
  232. package/src/context-cap-policy.ts +123 -0
  233. package/src/core.ts +44 -0
  234. package/src/index.ts +61 -0
  235. package/src/model-cache.ts +236 -0
  236. package/src/model-manager.ts +744 -0
  237. package/src/model-pricing.d.ts +3 -0
  238. package/src/model-pricing.ts +68 -0
  239. package/src/model-retirements.d.ts +6 -0
  240. package/src/model-retirements.ts +19 -0
  241. package/src/model-thinking.d.ts +100 -0
  242. package/src/model-thinking.ts +1054 -0
  243. package/src/models.d.ts +21 -0
  244. package/src/models.json +94672 -0
  245. package/src/models.json.d.ts +9 -0
  246. package/src/models.ts +126 -0
  247. package/src/openai-completions-compat.d.ts +34 -0
  248. package/src/openai-completions-compat.ts +383 -0
  249. package/src/prompts/composer-bash-policy-recovery.md +1 -0
  250. package/src/prompts/cursor-composer-bash-policy-recovery.md +1 -0
  251. package/src/prompts/cursor-composer-edit-discipline.md +7 -0
  252. package/src/prompts/turn-aborted-guidance.md +4 -0
  253. package/src/provider-details.ts +90 -0
  254. package/src/provider-models/bundled-references.ts +38 -0
  255. package/src/provider-models/descriptors.ts +392 -0
  256. package/src/provider-models/google.ts +92 -0
  257. package/src/provider-models/index.ts +5 -0
  258. package/src/provider-models/ollama.ts +159 -0
  259. package/src/provider-models/openai-compat.ts +2920 -0
  260. package/src/provider-models/special.ts +185 -0
  261. package/src/providers/amazon-bedrock.d.ts +60 -0
  262. package/src/providers/amazon-bedrock.ts +939 -0
  263. package/src/providers/anthropic-messages-server-schema.ts +229 -0
  264. package/src/providers/anthropic-messages-server.ts +839 -0
  265. package/src/providers/anthropic.d.ts +280 -0
  266. package/src/providers/anthropic.ts +4421 -0
  267. package/src/providers/aws-credential-config.d.ts +19 -0
  268. package/src/providers/aws-credential-config.ts +179 -0
  269. package/src/providers/aws-credentials.d.ts +43 -0
  270. package/src/providers/aws-credentials.ts +457 -0
  271. package/src/providers/aws-eventstream.d.ts +38 -0
  272. package/src/providers/aws-eventstream.ts +185 -0
  273. package/src/providers/aws-sigv4.d.ts +55 -0
  274. package/src/providers/aws-sigv4.ts +218 -0
  275. package/src/providers/azure-openai-responses.d.ts +22 -0
  276. package/src/providers/azure-openai-responses.ts +447 -0
  277. package/src/providers/composer-discipline.d.ts +32 -0
  278. package/src/providers/composer-discipline.ts +95 -0
  279. package/src/providers/cursor/client-version.d.ts +10 -0
  280. package/src/providers/cursor/client-version.ts +10 -0
  281. package/src/providers/cursor/exec-modern.d.ts +98 -0
  282. package/src/providers/cursor/exec-modern.ts +497 -0
  283. package/src/providers/cursor/gen/agent_pb.d.ts +16769 -0
  284. package/src/providers/cursor/gen/agent_pb.ts +19780 -0
  285. package/src/providers/cursor/proto/agent.proto +4533 -0
  286. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  287. package/src/providers/cursor/proto/buf.yaml +17 -0
  288. package/src/providers/cursor-pi-args.d.ts +119 -0
  289. package/src/providers/cursor-pi-args.ts +187 -0
  290. package/src/providers/cursor.d.ts +72 -0
  291. package/src/providers/cursor.ts +3396 -0
  292. package/src/providers/dashscope-token-plan-headers.d.ts +57 -0
  293. package/src/providers/dashscope-token-plan-headers.ts +84 -0
  294. package/src/providers/error-message.d.ts +27 -0
  295. package/src/providers/error-message.ts +21 -0
  296. package/src/providers/github-copilot-headers.d.ts +40 -0
  297. package/src/providers/github-copilot-headers.ts +140 -0
  298. package/src/providers/gitlab-duo.d.ts +27 -0
  299. package/src/providers/gitlab-duo.ts +393 -0
  300. package/src/providers/google-auth.d.ts +26 -0
  301. package/src/providers/google-auth.ts +262 -0
  302. package/src/providers/google-gemini-cli.d.ts +75 -0
  303. package/src/providers/google-gemini-cli.ts +969 -0
  304. package/src/providers/google-gemini-headers.d.ts +43 -0
  305. package/src/providers/google-gemini-headers.ts +100 -0
  306. package/src/providers/google-shared.d.ts +183 -0
  307. package/src/providers/google-shared.ts +1105 -0
  308. package/src/providers/google-types.d.ts +138 -0
  309. package/src/providers/google-types.ts +167 -0
  310. package/src/providers/google-vertex.d.ts +11 -0
  311. package/src/providers/google-vertex.ts +124 -0
  312. package/src/providers/google.d.ts +4 -0
  313. package/src/providers/google.ts +41 -0
  314. package/src/providers/grammar.d.ts +1 -0
  315. package/src/providers/grammar.ts +70 -0
  316. package/src/providers/kimi.d.ts +27 -0
  317. package/src/providers/kimi.ts +52 -0
  318. package/src/providers/kiro-api-key.d.ts +50 -0
  319. package/src/providers/kiro-api-key.ts +786 -0
  320. package/src/providers/kiro-codewhisperer.d.ts +11 -0
  321. package/src/providers/kiro-codewhisperer.ts +600 -0
  322. package/src/providers/mock.ts +526 -0
  323. package/src/providers/ollama.d.ts +41 -0
  324. package/src/providers/ollama.ts +645 -0
  325. package/src/providers/openai-anthropic-shim.d.ts +31 -0
  326. package/src/providers/openai-anthropic-shim.ts +156 -0
  327. package/src/providers/openai-bounded-rate-limits.d.ts +3 -0
  328. package/src/providers/openai-bounded-rate-limits.ts +57 -0
  329. package/src/providers/openai-chat-server-schema.ts +254 -0
  330. package/src/providers/openai-chat-server.ts +724 -0
  331. package/src/providers/openai-codex/constants.d.ts +26 -0
  332. package/src/providers/openai-codex/constants.ts +43 -0
  333. package/src/providers/openai-codex/request-transformer.d.ts +50 -0
  334. package/src/providers/openai-codex/request-transformer.ts +219 -0
  335. package/src/providers/openai-codex/response-handler.d.ts +18 -0
  336. package/src/providers/openai-codex/response-handler.ts +111 -0
  337. package/src/providers/openai-codex-responses.d.ts +71 -0
  338. package/src/providers/openai-codex-responses.ts +3288 -0
  339. package/src/providers/openai-completions-compat.d.ts +6 -0
  340. package/src/providers/openai-completions-compat.ts +6 -0
  341. package/src/providers/openai-completions.d.ts +35 -0
  342. package/src/providers/openai-completions.ts +2294 -0
  343. package/src/providers/openai-opencodex-responses.ts +174 -0
  344. package/src/providers/openai-request-transform.d.ts +4 -0
  345. package/src/providers/openai-request-transform.ts +136 -0
  346. package/src/providers/openai-responses-server-schema.ts +290 -0
  347. package/src/providers/openai-responses-server.ts +1268 -0
  348. package/src/providers/openai-responses-shared.d.ts +106 -0
  349. package/src/providers/openai-responses-shared.ts +1253 -0
  350. package/src/providers/openai-responses.d.ts +37 -0
  351. package/src/providers/openai-responses.ts +989 -0
  352. package/src/providers/pi-native-client.d.ts +29 -0
  353. package/src/providers/pi-native-client.ts +243 -0
  354. package/src/providers/pi-native-server.ts +488 -0
  355. package/src/providers/register-builtins.d.ts +59 -0
  356. package/src/providers/register-builtins.ts +544 -0
  357. package/src/providers/synthetic.d.ts +26 -0
  358. package/src/providers/synthetic.ts +50 -0
  359. package/src/providers/transform-messages.d.ts +33 -0
  360. package/src/providers/transform-messages.ts +408 -0
  361. package/src/providers/vision-guard.d.ts +8 -0
  362. package/src/providers/vision-guard.ts +31 -0
  363. package/src/rate-limit-utils.d.ts +19 -0
  364. package/src/rate-limit-utils.ts +102 -0
  365. package/src/stream.d.ts +45 -0
  366. package/src/stream.ts +1306 -0
  367. package/src/types.d.ts +1073 -0
  368. package/src/types.ts +1305 -0
  369. package/src/usage/claude.ts +449 -0
  370. package/src/usage/gemini.ts +250 -0
  371. package/src/usage/github-copilot.ts +421 -0
  372. package/src/usage/google-antigravity.ts +201 -0
  373. package/src/usage/grok-cli.ts +259 -0
  374. package/src/usage/kimi.ts +285 -0
  375. package/src/usage/minimax-code.ts +31 -0
  376. package/src/usage/openai-codex.ts +503 -0
  377. package/src/usage/shared.ts +10 -0
  378. package/src/usage/zai.ts +247 -0
  379. package/src/usage.ts +190 -0
  380. package/src/utils/abort.d.ts +19 -0
  381. package/src/utils/abort.ts +51 -0
  382. package/src/utils/anthropic-auth.ts +95 -0
  383. package/src/utils/block-symbols.d.ts +6 -0
  384. package/src/utils/block-symbols.ts +11 -0
  385. package/src/utils/discovery/antigravity.ts +275 -0
  386. package/src/utils/discovery/codex.ts +362 -0
  387. package/src/utils/discovery/cursor.ts +388 -0
  388. package/src/utils/discovery/gemini.ts +248 -0
  389. package/src/utils/discovery/index.ts +4 -0
  390. package/src/utils/discovery/openai-compatible.ts +379 -0
  391. package/src/utils/event-stream.d.ts +41 -0
  392. package/src/utils/event-stream.ts +269 -0
  393. package/src/utils/fallback-transport.d.ts +110 -0
  394. package/src/utils/fallback-transport.ts +411 -0
  395. package/src/utils/fireworks-model-id.d.ts +10 -0
  396. package/src/utils/fireworks-model-id.ts +30 -0
  397. package/src/utils/foundry.d.ts +11 -0
  398. package/src/utils/foundry.ts +18 -0
  399. package/src/utils/h2-fetch.ts +60 -0
  400. package/src/utils/http-inspector.d.ts +59 -0
  401. package/src/utils/http-inspector.ts +380 -0
  402. package/src/utils/idle-iterator.d.ts +122 -0
  403. package/src/utils/idle-iterator.ts +410 -0
  404. package/src/utils/json-parse.d.ts +98 -0
  405. package/src/utils/json-parse.ts +607 -0
  406. package/src/utils/oauth/alibaba-token-plan.ts +60 -0
  407. package/src/utils/oauth/anthropic.ts +233 -0
  408. package/src/utils/oauth/api-key-login.ts +98 -0
  409. package/src/utils/oauth/api-key-validation.ts +344 -0
  410. package/src/utils/oauth/bizrouter.ts +15 -0
  411. package/src/utils/oauth/callback-server.d.ts +80 -0
  412. package/src/utils/oauth/callback-server.ts +359 -0
  413. package/src/utils/oauth/cerebras.ts +16 -0
  414. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  415. package/src/utils/oauth/commandcode.ts +17 -0
  416. package/src/utils/oauth/cursor.ts +157 -0
  417. package/src/utils/oauth/deepinfra.ts +15 -0
  418. package/src/utils/oauth/deepseek.ts +53 -0
  419. package/src/utils/oauth/firepass.ts +24 -0
  420. package/src/utils/oauth/fireworks.ts +15 -0
  421. package/src/utils/oauth/fugu.ts +15 -0
  422. package/src/utils/oauth/github-copilot.d.ts +38 -0
  423. package/src/utils/oauth/github-copilot.ts +362 -0
  424. package/src/utils/oauth/gitlab-duo.ts +123 -0
  425. package/src/utils/oauth/glm-zcode.d.ts +71 -0
  426. package/src/utils/oauth/glm-zcode.ts +433 -0
  427. package/src/utils/oauth/google-antigravity.ts +200 -0
  428. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  429. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  430. package/src/utils/oauth/huggingface.ts +62 -0
  431. package/src/utils/oauth/index.ts +558 -0
  432. package/src/utils/oauth/kagi.ts +47 -0
  433. package/src/utils/oauth/kilo.ts +87 -0
  434. package/src/utils/oauth/kimi.d.ts +17 -0
  435. package/src/utils/oauth/kimi.ts +275 -0
  436. package/src/utils/oauth/kiro.ts +448 -0
  437. package/src/utils/oauth/litellm.ts +47 -0
  438. package/src/utils/oauth/lm-studio.ts +38 -0
  439. package/src/utils/oauth/mara.ts +16 -0
  440. package/src/utils/oauth/minimax-code.ts +78 -0
  441. package/src/utils/oauth/moonshot.ts +16 -0
  442. package/src/utils/oauth/nanogpt.ts +15 -0
  443. package/src/utils/oauth/nvidia.ts +70 -0
  444. package/src/utils/oauth/oauth.html +199 -0
  445. package/src/utils/oauth/ollama-cloud.ts +28 -0
  446. package/src/utils/oauth/ollama.ts +47 -0
  447. package/src/utils/oauth/openai-codex.ts +299 -0
  448. package/src/utils/oauth/opencode.ts +49 -0
  449. package/src/utils/oauth/opengateway.ts +15 -0
  450. package/src/utils/oauth/openrouter.ts +16 -0
  451. package/src/utils/oauth/parallel.ts +46 -0
  452. package/src/utils/oauth/perplexity.ts +225 -0
  453. package/src/utils/oauth/pkce.ts +18 -0
  454. package/src/utils/oauth/qianfan.ts +58 -0
  455. package/src/utils/oauth/qwen-portal.ts +60 -0
  456. package/src/utils/oauth/sglang.ts +42 -0
  457. package/src/utils/oauth/synthetic.ts +15 -0
  458. package/src/utils/oauth/tavily.ts +46 -0
  459. package/src/utils/oauth/together.ts +16 -0
  460. package/src/utils/oauth/types.d.ts +56 -0
  461. package/src/utils/oauth/types.ts +122 -0
  462. package/src/utils/oauth/venice.ts +59 -0
  463. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  464. package/src/utils/oauth/vllm.ts +42 -0
  465. package/src/utils/oauth/xai.ts +246 -0
  466. package/src/utils/oauth/xiaomi.ts +199 -0
  467. package/src/utils/oauth/zai.ts +60 -0
  468. package/src/utils/oauth/zenmux.ts +15 -0
  469. package/src/utils/overflow.ts +275 -0
  470. package/src/utils/parse-bind.ts +81 -0
  471. package/src/utils/provider-response.d.ts +6 -0
  472. package/src/utils/provider-response.ts +30 -0
  473. package/src/utils/provider-safety-stop.ts +8 -0
  474. package/src/utils/proxy.d.ts +7 -0
  475. package/src/utils/proxy.ts +652 -0
  476. package/src/utils/retry-after.d.ts +3 -0
  477. package/src/utils/retry-after.ts +110 -0
  478. package/src/utils/retry-budget.d.ts +1 -0
  479. package/src/utils/retry-budget.ts +4 -0
  480. package/src/utils/retry.d.ts +29 -0
  481. package/src/utils/retry.ts +67 -0
  482. package/src/utils/schema/CONSTRAINTS.md +164 -0
  483. package/src/utils/schema/adapt.d.ts +24 -0
  484. package/src/utils/schema/adapt.ts +36 -0
  485. package/src/utils/schema/compatibility.d.ts +30 -0
  486. package/src/utils/schema/compatibility.ts +435 -0
  487. package/src/utils/schema/dereference.d.ts +11 -0
  488. package/src/utils/schema/dereference.ts +98 -0
  489. package/src/utils/schema/draft.d.ts +10 -0
  490. package/src/utils/schema/draft.ts +341 -0
  491. package/src/utils/schema/equality.d.ts +4 -0
  492. package/src/utils/schema/equality.ts +97 -0
  493. package/src/utils/schema/fields.d.ts +49 -0
  494. package/src/utils/schema/fields.ts +190 -0
  495. package/src/utils/schema/index.d.ts +14 -0
  496. package/src/utils/schema/index.ts +14 -0
  497. package/src/utils/schema/json-schema-validator.d.ts +12 -0
  498. package/src/utils/schema/json-schema-validator.ts +577 -0
  499. package/src/utils/schema/meta-validator.d.ts +2 -0
  500. package/src/utils/schema/meta-validator.ts +167 -0
  501. package/src/utils/schema/normalize.d.ts +93 -0
  502. package/src/utils/schema/normalize.ts +1588 -0
  503. package/src/utils/schema/root-combinator.d.ts +12 -0
  504. package/src/utils/schema/root-combinator.ts +143 -0
  505. package/src/utils/schema/spill.d.ts +8 -0
  506. package/src/utils/schema/spill.ts +43 -0
  507. package/src/utils/schema/stamps.d.ts +25 -0
  508. package/src/utils/schema/stamps.ts +97 -0
  509. package/src/utils/schema/types.d.ts +4 -0
  510. package/src/utils/schema/types.ts +11 -0
  511. package/src/utils/schema/wire.d.ts +54 -0
  512. package/src/utils/schema/wire.ts +213 -0
  513. package/src/utils/schema/zod-decontaminate.d.ts +31 -0
  514. package/src/utils/schema/zod-decontaminate.ts +331 -0
  515. package/src/utils/sse-debug.d.ts +10 -0
  516. package/src/utils/sse-debug.ts +289 -0
  517. package/src/utils/tool-call-healing.d.ts +80 -0
  518. package/src/utils/tool-call-healing.ts +298 -0
  519. package/src/utils/tool-choice-capability.d.ts +57 -0
  520. package/src/utils/tool-choice-capability.ts +633 -0
  521. package/src/utils/tool-choice.d.ts +50 -0
  522. package/src/utils/tool-choice.ts +99 -0
  523. package/src/utils/validation.ts +1080 -0
  524. package/src/utils.d.ts +117 -0
  525. package/src/utils.ts +523 -0
@@ -0,0 +1,448 @@
1
+ /**
2
+ * Kiro (Amazon Q Developer / CodeWhisperer) OAuth flow via AWS SSO OIDC.
3
+ *
4
+ * Implements the device-code authorization flow and token refresh using the
5
+ * published AWS SSO OIDC service model (botocore sso-oidc/2019-06-10).
6
+ *
7
+ * Clean-room: derived from the published Amazon SSO OIDC service model shapes
8
+ * and AWS public documentation, not from any third-party reference.
9
+ */
10
+ import { scheduler } from "node:timers/promises";
11
+ import type { OAuthCredentials } from "./types";
12
+
13
+ // ─────────────────────────────────────────────────────────────────────────────
14
+ // Published SSO OIDC endpoints and constants
15
+ // ─────────────────────────────────────────────────────────────────────────────
16
+
17
+ /** Builder ID start URL for device authorization. */
18
+ const BUILDER_ID_START_URL = "https://view.awsapps.com/start";
19
+
20
+ /** Default AWS region for SSO OIDC. */
21
+ const DEFAULT_REGION = "us-east-1";
22
+
23
+ /** Client registration metadata for the Vibrato application. */
24
+ const CLIENT_NAME = "vib-rato";
25
+ const CLIENT_TYPE = "public";
26
+
27
+ /**
28
+ * Scopes requested for CodeWhisperer / Amazon Q access. These are the published
29
+ * scopes from the AWS SSO OIDC model for the CodeWhisperer service.
30
+ */
31
+ const CODEWHISPERER_SCOPES = [
32
+ "codewhisperer:completions",
33
+ "codewhisperer:analysis",
34
+ "codewhisperer:conversations",
35
+ "codewhisperer:transformations",
36
+ "codewhisperer:taskassist",
37
+ "sso:account:access",
38
+ ];
39
+
40
+ // ─────────────────────────────────────────────────────────────────────────────
41
+ // Wire types (matching published SSO OIDC service model)
42
+ // ─────────────────────────────────────────────────────────────────────────────
43
+
44
+ interface RegisterClientResponse {
45
+ clientId: string;
46
+ clientSecret: string;
47
+ clientIdIssuedAt: number;
48
+ clientSecretExpiresAt: number;
49
+ authorizationEndpoint?: string;
50
+ tokenEndpoint?: string;
51
+ }
52
+
53
+ interface StartDeviceAuthorizationResponse {
54
+ deviceCode: string;
55
+ userCode: string;
56
+ verificationUri: string;
57
+ verificationUriComplete?: string;
58
+ interval: number;
59
+ expiresIn: number;
60
+ }
61
+
62
+ interface CreateTokenSuccess {
63
+ accessToken: string;
64
+ tokenType: string;
65
+ expiresIn: number;
66
+ refreshToken?: string;
67
+ }
68
+
69
+ interface CreateTokenError {
70
+ error: string;
71
+ error_description?: string;
72
+ error_uri?: string;
73
+ }
74
+
75
+ // ─────────────────────────────────────────────────────────────────────────────
76
+ // Typed SSO OIDC error names from the published service model
77
+ // ─────────────────────────────────────────────────────────────────────────────
78
+
79
+ const SSO_OIDC_FATAL_ERRORS = new Set([
80
+ "access_denied_exception",
81
+ "expired_token_exception",
82
+ "internal_server_exception",
83
+ "invalid_client_exception",
84
+ "invalid_client_metadata_exception",
85
+ "invalid_grant_exception",
86
+ "invalid_redirect_uri_exception",
87
+ "invalid_request_exception",
88
+ "invalid_request_region_exception",
89
+ "invalid_scope_exception",
90
+ "unauthorized_client_exception",
91
+ "unsupported_grant_type_exception",
92
+ ]);
93
+
94
+ // ─────────────────────────────────────────────────────────────────────────────
95
+ // Registration cache (client registration is reusable until expiry)
96
+ // ─────────────────────────────────────────────────────────────────────────────
97
+
98
+ interface ClientRegistration {
99
+ clientId: string;
100
+ clientSecret: string;
101
+ expiresAt: number; // epoch ms
102
+ }
103
+
104
+ let cachedRegistration: ClientRegistration | undefined;
105
+
106
+ /**
107
+ * Register a public SSO OIDC client. Registration responses include an expiry
108
+ * timestamp (`clientSecretExpiresAt`); we cache until then to avoid re-registering
109
+ * on every login attempt.
110
+ *
111
+ * The SSO OIDC `RegisterClient` endpoint is public (no authentication required).
112
+ */
113
+ export async function registerClient(
114
+ region: string,
115
+ startUrl: string,
116
+ signal?: AbortSignal,
117
+ ): Promise<ClientRegistration> {
118
+ if (cachedRegistration && Date.now() < cachedRegistration.expiresAt - 60_000) {
119
+ return cachedRegistration;
120
+ }
121
+
122
+ const url = ssoOidcEndpoint(region, "/client/register");
123
+ const body = {
124
+ clientName: CLIENT_NAME,
125
+ clientType: CLIENT_TYPE,
126
+ scopes: CODEWHISPERER_SCOPES,
127
+ grantTypes: ["urn:ietf:params:oauth:grant-type:device_code", "refresh_token"],
128
+ redirectUris: [],
129
+ issuerUrl: startUrl,
130
+ };
131
+
132
+ const response = await fetchOidc(url, {
133
+ method: "POST",
134
+ headers: { "Content-Type": "application/json" },
135
+ body: JSON.stringify(body),
136
+ signal,
137
+ });
138
+
139
+ const data = (await response.json()) as RegisterClientResponse;
140
+ if (!data.clientId || !data.clientSecret) {
141
+ throw new Error("SSO OIDC RegisterClient: missing clientId or clientSecret");
142
+ }
143
+
144
+ cachedRegistration = {
145
+ clientId: data.clientId,
146
+ clientSecret: data.clientSecret,
147
+ // `clientSecretExpiresAt` is epoch seconds in the published model
148
+ expiresAt: data.clientSecretExpiresAt * 1000,
149
+ };
150
+ return cachedRegistration;
151
+ }
152
+
153
+ /** Drop cached client registration — used by tests. */
154
+ export function clearClientRegistrationCache(): void {
155
+ cachedRegistration = undefined;
156
+ }
157
+
158
+ // ─────────────────────────────────────────────────────────────────────────────
159
+ // Device authorization flow
160
+ // ─────────────────────────────────────────────────────────────────────────────
161
+
162
+ /**
163
+ * Start device authorization. The SSO OIDC `StartDeviceAuthorization` endpoint
164
+ * is public (requires registered clientId/clientSecret, not SigV4).
165
+ */
166
+ export async function startDeviceAuthorization(
167
+ region: string,
168
+ startUrl: string,
169
+ registration: ClientRegistration,
170
+ signal?: AbortSignal,
171
+ ): Promise<StartDeviceAuthorizationResponse> {
172
+ const url = ssoOidcEndpoint(region, "/device_authorization");
173
+ const body = {
174
+ clientId: registration.clientId,
175
+ clientSecret: registration.clientSecret,
176
+ startUrl,
177
+ };
178
+
179
+ const response = await fetchOidc(url, {
180
+ method: "POST",
181
+ headers: { "Content-Type": "application/json" },
182
+ body: JSON.stringify(body),
183
+ signal,
184
+ });
185
+
186
+ const data = (await response.json()) as StartDeviceAuthorizationResponse;
187
+ if (!data.deviceCode || !data.userCode || !data.verificationUri) {
188
+ throw new Error("SSO OIDC StartDeviceAuthorization: missing required fields");
189
+ }
190
+ return data;
191
+ }
192
+
193
+ /**
194
+ * Poll `CreateToken` until the user completes authorization or the device code
195
+ * expires. Handles `authorization_pending` (continue polling) and `slow_down`
196
+ * (increase interval) per the published SSO OIDC model.
197
+ */
198
+ export async function pollForToken(
199
+ region: string,
200
+ registration: ClientRegistration,
201
+ deviceCode: string,
202
+ intervalSeconds: number,
203
+ expiresInSeconds: number,
204
+ signal?: AbortSignal,
205
+ ): Promise<CreateTokenSuccess> {
206
+ const url = ssoOidcEndpoint(region, "/token");
207
+ const deadline = Date.now() + expiresInSeconds * 1000;
208
+ let currentInterval = Math.max(intervalSeconds, 1) * 1000;
209
+
210
+ while (Date.now() < deadline) {
211
+ if (signal?.aborted) throw new Error("Login cancelled");
212
+
213
+ const remainingMs = deadline - Date.now();
214
+ const waitMs = Math.min(currentInterval, remainingMs);
215
+ try {
216
+ await scheduler.wait(waitMs, { signal });
217
+ } catch {
218
+ throw new Error("Login cancelled");
219
+ }
220
+
221
+ if (signal?.aborted) throw new Error("Login cancelled");
222
+
223
+ const body = {
224
+ clientId: registration.clientId,
225
+ clientSecret: registration.clientSecret,
226
+ grantType: "urn:ietf:params:oauth:grant-type:device_code",
227
+ deviceCode,
228
+ };
229
+
230
+ const response = await fetchOidc(url, {
231
+ method: "POST",
232
+ headers: { "Content-Type": "application/json" },
233
+ body: JSON.stringify(body),
234
+ signal,
235
+ });
236
+
237
+ const data = (await response.json()) as CreateTokenSuccess | CreateTokenError;
238
+
239
+ if ("accessToken" in data && typeof data.accessToken === "string") {
240
+ return data;
241
+ }
242
+
243
+ if ("error" in data) {
244
+ const errorCode = data.error;
245
+ if (errorCode === "authorization_pending") continue;
246
+ if (errorCode === "slow_down") {
247
+ currentInterval = Math.ceil(currentInterval * 1.5);
248
+ continue;
249
+ }
250
+ if (SSO_OIDC_FATAL_ERRORS.has(errorCode)) {
251
+ const desc = data.error_description ? `: ${data.error_description}` : "";
252
+ throw new Error(`SSO OIDC token error: ${errorCode}${desc}`);
253
+ }
254
+ // Unknown error — fail closed
255
+ const desc = data.error_description ? `: ${data.error_description}` : "";
256
+ throw new Error(`SSO OIDC unrecognized token error: ${errorCode}${desc}`);
257
+ }
258
+
259
+ throw new Error("SSO OIDC CreateToken: unrecognized response shape");
260
+ }
261
+
262
+ throw new Error("SSO OIDC device authorization timed out");
263
+ }
264
+
265
+ // ─────────────────────────────────────────────────────────────────────────────
266
+ // Token refresh
267
+ // ─────────────────────────────────────────────────────────────────────────────
268
+
269
+ /**
270
+ * Refresh an expired access token using the stored refresh token via
271
+ * `CreateToken` with `grantType: "refresh_token"`.
272
+ *
273
+ * Rotation is published behavior: the response includes a new `refreshToken`.
274
+ * If the server does not return a new one, the old refresh token is retained.
275
+ */
276
+ export async function refreshKiroToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {
277
+ const region = DEFAULT_REGION;
278
+
279
+ // We need client registration to refresh. If we have a cached one, use it;
280
+ // otherwise re-register.
281
+ const registration = cachedRegistration ?? (await registerClient(region, BUILDER_ID_START_URL));
282
+
283
+ const url = ssoOidcEndpoint(region, "/token");
284
+ const body = {
285
+ clientId: registration.clientId,
286
+ clientSecret: registration.clientSecret,
287
+ grantType: "refresh_token",
288
+ refreshToken: credentials.refresh,
289
+ };
290
+
291
+ const response = await fetchOidc(url, {
292
+ method: "POST",
293
+ headers: { "Content-Type": "application/json" },
294
+ body: JSON.stringify(body),
295
+ });
296
+
297
+ const data = (await response.json()) as CreateTokenSuccess | CreateTokenError;
298
+
299
+ if ("accessToken" in data && typeof data.accessToken === "string") {
300
+ const expiresAt = Date.now() + data.expiresIn * 1000;
301
+ return {
302
+ access: data.accessToken,
303
+ refresh: data.refreshToken ?? credentials.refresh,
304
+ expires: expiresAt,
305
+ enterpriseUrl: credentials.enterpriseUrl,
306
+ projectId: credentials.projectId,
307
+ email: credentials.email,
308
+ accountId: credentials.accountId,
309
+ };
310
+ }
311
+
312
+ if ("error" in data) {
313
+ const errorCode = data.error;
314
+ const desc = data.error_description ? `: ${data.error_description}` : "";
315
+ if (errorCode === "invalid_grant_exception" || errorCode === "invalid_grant") {
316
+ throw new Error(
317
+ `Kiro refresh token is invalid or expired. Run 'vib auth-broker login kiro' to re-authenticate. (${errorCode}${desc})`,
318
+ );
319
+ }
320
+ if (errorCode === "expired_token_exception") {
321
+ throw new Error(
322
+ `Kiro client registration has expired. Run 'vib auth-broker login kiro' to re-authenticate. (${errorCode}${desc})`,
323
+ );
324
+ }
325
+ throw new Error(`Kiro token refresh failed: ${errorCode}${desc}`);
326
+ }
327
+
328
+ throw new Error("Kiro token refresh: unrecognized response");
329
+ }
330
+
331
+ // ─────────────────────────────────────────────────────────────────────────────
332
+ // Full login flow (device code)
333
+ // ─────────────────────────────────────────────────────────────────────────────
334
+
335
+ export interface KiroLoginOptions {
336
+ onAuth: (url: string, instructions?: string) => void;
337
+ onPrompt: (prompt: { message: string; placeholder?: string; allowEmpty?: boolean }) => Promise<string>;
338
+ onProgress?: (message: string) => void;
339
+ signal?: AbortSignal;
340
+ /** Override for tests. */
341
+ fetchImpl?: typeof globalThis.fetch;
342
+ }
343
+
344
+ export async function loginKiro(options: KiroLoginOptions): Promise<OAuthCredentials> {
345
+ const region = DEFAULT_REGION;
346
+ const startUrl = BUILDER_ID_START_URL;
347
+
348
+ if (options.signal?.aborted) throw new Error("Login cancelled");
349
+
350
+ options.onProgress?.("Registering client with AWS SSO OIDC...");
351
+ const registration = await registerClient(region, startUrl, options.signal);
352
+
353
+ if (options.signal?.aborted) throw new Error("Login cancelled");
354
+
355
+ options.onProgress?.("Requesting device authorization...");
356
+ const deviceAuth = await startDeviceAuthorization(region, startUrl, registration, options.signal);
357
+
358
+ const verificationUrl = deviceAuth.verificationUriComplete ?? deviceAuth.verificationUri;
359
+ options.onAuth(verificationUrl, `Enter code: ${deviceAuth.userCode}`);
360
+
361
+ options.onProgress?.("Waiting for authorization...");
362
+ const token = await pollForToken(
363
+ region,
364
+ registration,
365
+ deviceAuth.deviceCode,
366
+ deviceAuth.interval,
367
+ deviceAuth.expiresIn,
368
+ options.signal,
369
+ );
370
+
371
+ const expiresAt = Date.now() + token.expiresIn * 1000;
372
+ return {
373
+ access: token.accessToken,
374
+ refresh: token.refreshToken ?? "",
375
+ expires: expiresAt,
376
+ };
377
+ }
378
+
379
+ // ─────────────────────────────────────────────────────────────────────────────
380
+ // SSO cache import (reuse existing ~/.aws/sso/cache/*.json pattern)
381
+ // ─────────────────────────────────────────────────────────────────────────────
382
+
383
+ import * as fs from "node:fs";
384
+ import * as path from "node:path";
385
+ import { getTrustedHomeDir } from "@vib-rato/utils";
386
+
387
+ interface SsoCachedAccessToken {
388
+ accessToken: string;
389
+ expiresAt?: number;
390
+ startUrl?: string;
391
+ region?: string;
392
+ }
393
+
394
+ /**
395
+ * Attempt to import a cached SSO access token from `~/.aws/sso/cache/`.
396
+ * Returns the token if a valid (non-expired) one exists, otherwise undefined.
397
+ *
398
+ * This reuses the documented AWS CLI SSO cache location, not any third-party
399
+ * credential store.
400
+ */
401
+ export function importSsoCacheToken(): OAuthCredentials | undefined {
402
+ const homeDir = getTrustedHomeDir();
403
+ const cacheDir = path.join(homeDir, ".aws", "sso", "cache");
404
+
405
+ let files: string[];
406
+ try {
407
+ files = fs.readdirSync(cacheDir).filter(f => f.endsWith(".json"));
408
+ } catch {
409
+ return undefined;
410
+ }
411
+
412
+ for (const file of files) {
413
+ try {
414
+ const raw = fs.readFileSync(path.join(cacheDir, file), "utf8");
415
+ const cached = JSON.parse(raw) as SsoCachedAccessToken;
416
+ if (!cached.accessToken) continue;
417
+ if (cached.expiresAt && cached.expiresAt * 1000 < Date.now()) continue;
418
+ return {
419
+ access: cached.accessToken,
420
+ refresh: "",
421
+ expires: cached.expiresAt ? cached.expiresAt * 1000 : Date.now() + 3600_000,
422
+ };
423
+ } catch {}
424
+ }
425
+ return undefined;
426
+ }
427
+
428
+ // ─────────────────────────────────────────────────────────────────────────────
429
+ // Helpers
430
+ // ─────────────────────────────────────────────────────────────────────────────
431
+
432
+ function ssoOidcEndpoint(region: string, pathSuffix: string): string {
433
+ return `https://oidc.${region}.amazonaws.com${pathSuffix}`;
434
+ }
435
+
436
+ async function fetchOidc(url: string, init: RequestInit & { signal?: AbortSignal }): Promise<Response> {
437
+ const response = await fetch(url, init);
438
+ if (!response.ok) {
439
+ let errorBody = "";
440
+ try {
441
+ errorBody = await response.text();
442
+ } catch {}
443
+ throw new Error(
444
+ `SSO OIDC request to ${url} failed: ${response.status} ${response.statusText}: ${errorBody.slice(0, 500)}`,
445
+ );
446
+ }
447
+ return response;
448
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * LiteLLM login flow.
3
+ *
4
+ * LiteLLM is an OpenAI-compatible proxy that routes requests to many upstream providers.
5
+ *
6
+ * This is not OAuth - it's a simple API key flow:
7
+ * 1. Open browser to LiteLLM docs/dashboard
8
+ * 2. User copies their LiteLLM API key
9
+ * 3. User pastes the API key into the CLI
10
+ */
11
+
12
+ import type { OAuthController } from "./types";
13
+
14
+ const AUTH_URL = "https://docs.litellm.ai/docs/proxy/deploy";
15
+
16
+ /**
17
+ * Login to LiteLLM.
18
+ *
19
+ * Opens browser to LiteLLM setup docs, prompts user to paste their API key.
20
+ * Returns the API key directly (not OAuthCredentials - this isn't OAuth).
21
+ */
22
+ export async function loginLiteLLM(options: OAuthController): Promise<string> {
23
+ if (!options.onPrompt) {
24
+ throw new Error("LiteLLM login requires onPrompt callback");
25
+ }
26
+
27
+ options.onAuth?.({
28
+ url: AUTH_URL,
29
+ instructions: "Run LiteLLM proxy (default http://localhost:4000/v1), then copy your master key or virtual key",
30
+ });
31
+
32
+ const apiKey = await options.onPrompt({
33
+ message: "Paste your LiteLLM API key (master key or virtual key)",
34
+ placeholder: "sk-...",
35
+ });
36
+
37
+ if (options.signal?.aborted) {
38
+ throw new Error("Login cancelled");
39
+ }
40
+
41
+ const trimmed = apiKey.trim();
42
+ if (!trimmed) {
43
+ throw new Error("API key is required");
44
+ }
45
+
46
+ return trimmed;
47
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * LM Studio login flow.
3
+ *
4
+ * LM Studio provides an OpenAI-compatible API at a local base URL.
5
+ * It usually runs unauthenticated but can be configured to require a bearer token.
6
+ *
7
+ * This flow stores an API-key-style credential used by `/login` and auth storage.
8
+ */
9
+
10
+ import type { OAuthController, OAuthProvider } from "./types";
11
+
12
+ const PROVIDER_ID: OAuthProvider = "lm-studio";
13
+ export const DEFAULT_LOCAL_TOKEN = "lm-studio-local";
14
+
15
+ /**
16
+ * Login to LM Studio.
17
+ *
18
+ * Opens LM Studio API docs, prompts for an optional token,
19
+ * and returns a stored key value.
20
+ */
21
+ export async function loginLmStudio(options: OAuthController): Promise<string> {
22
+ if (!options.onPrompt) {
23
+ throw new Error(`${PROVIDER_ID} login requires onPrompt callback`);
24
+ }
25
+
26
+ const apiKey = await options.onPrompt({
27
+ message: "Optional: Paste LM Studio API key (to customize endpoint URL, set LM_STUDIO_BASE_URL env var)",
28
+ placeholder: DEFAULT_LOCAL_TOKEN,
29
+ allowEmpty: true,
30
+ });
31
+
32
+ if (options.signal?.aborted) {
33
+ throw new Error("Login cancelled");
34
+ }
35
+
36
+ const trimmed = apiKey.trim();
37
+ return trimmed || DEFAULT_LOCAL_TOKEN;
38
+ }
@@ -0,0 +1,16 @@
1
+ /** Mara Cloud login flow (API key paste, validated via chat completions). */
2
+ import { createApiKeyLogin } from "./api-key-login";
3
+
4
+ export const loginMara = createApiKeyLogin({
5
+ providerLabel: "Mara Cloud",
6
+ authUrl: "https://cloud.mara.com/apis",
7
+ instructions: "Create or copy your Mara Cloud API key",
8
+ promptMessage: "Paste your Mara Cloud API key",
9
+ placeholder: "<your-mara-api-key>",
10
+ validation: {
11
+ kind: "chat-completions",
12
+ provider: "Mara Cloud",
13
+ baseUrl: "https://api.cloud.mara.com/v1",
14
+ model: "DeepSeek-V3.1",
15
+ },
16
+ });
@@ -0,0 +1,78 @@
1
+ /**
2
+ * MiniMax Coding Plan login flow.
3
+ *
4
+ * MiniMax Coding Plan is a subscription service that provides access to
5
+ * MiniMax models (M2, M2.1) through an OpenAI-compatible API.
6
+ *
7
+ * This is not OAuth - it's a simple API key flow:
8
+ * 1. Open browser to https://platform.minimax.io/subscribe/coding-plan
9
+ * 2. User subscribes and copies their API key
10
+ * 3. User pastes the API key back into the CLI
11
+ *
12
+ * International: https://api.minimax.io/v1
13
+ * China: https://api.minimaxi.com/v1
14
+ */
15
+
16
+ import { validateOpenAICompatibleApiKey } from "./api-key-validation";
17
+ import type { OAuthController } from "./types";
18
+
19
+ const AUTH_URL = "https://platform.minimax.io/subscribe/coding-plan";
20
+ const API_BASE_URL_INTL = "https://api.minimax.io/v1";
21
+ const API_BASE_URL_CN = "https://api.minimaxi.com/v1";
22
+ const VALIDATION_MODEL = "MiniMax-M2";
23
+
24
+ /**
25
+ * Login to MiniMax Coding Plan (international).
26
+ *
27
+ * Opens browser to subscription page, prompts user to paste their API key.
28
+ * Returns the API key directly (not OAuthCredentials - this isn't OAuth).
29
+ */
30
+ export async function loginMiniMaxCode(options: OAuthController): Promise<string> {
31
+ return loginMiniMaxCodeWithBaseUrl(options, API_BASE_URL_INTL, "MiniMax Coding Plan");
32
+ }
33
+
34
+ async function loginMiniMaxCodeWithBaseUrl(
35
+ options: OAuthController,
36
+ baseUrl: string,
37
+ providerName: string,
38
+ ): Promise<string> {
39
+ if (!options.onPrompt) {
40
+ throw new Error("MiniMax Coding Plan login requires onPrompt callback");
41
+ }
42
+ // Open browser to subscription page
43
+ options.onAuth?.({
44
+ url: AUTH_URL,
45
+ instructions: "Subscribe to Coding Plan and copy your API key",
46
+ });
47
+ // Prompt user to paste their API key
48
+ const apiKey = await options.onPrompt({
49
+ message: "Paste your MiniMax Coding Plan API key",
50
+ placeholder: "sk-...",
51
+ });
52
+ if (options.signal?.aborted) {
53
+ throw new Error("Login cancelled");
54
+ }
55
+ const trimmed = apiKey.trim();
56
+ if (!trimmed) {
57
+ throw new Error("API key is required");
58
+ }
59
+
60
+ options.onProgress?.("Validating API key...");
61
+ await validateOpenAICompatibleApiKey({
62
+ provider: providerName,
63
+ apiKey: trimmed,
64
+ baseUrl,
65
+ model: VALIDATION_MODEL,
66
+ signal: options.signal,
67
+ });
68
+ return trimmed;
69
+ }
70
+
71
+ /**
72
+ * Login to MiniMax Coding Plan (China).
73
+ *
74
+ * Same flow as international but uses China endpoint.
75
+ */
76
+ export async function loginMiniMaxCodeCn(options: OAuthController): Promise<string> {
77
+ return loginMiniMaxCodeWithBaseUrl(options, API_BASE_URL_CN, "MiniMax Coding Plan (China)");
78
+ }
@@ -0,0 +1,16 @@
1
+ /** Moonshot login flow (API key paste against https://api.moonshot.ai/v1). */
2
+ import { createApiKeyLogin } from "./api-key-login";
3
+
4
+ export const loginMoonshot = createApiKeyLogin({
5
+ providerLabel: "Moonshot",
6
+ authUrl: "https://platform.moonshot.ai/console/api-keys",
7
+ instructions: "Copy your API key from the Moonshot dashboard",
8
+ promptMessage: "Paste your Moonshot API key",
9
+ placeholder: "sk-...",
10
+ validation: {
11
+ kind: "chat-completions",
12
+ provider: "moonshot",
13
+ baseUrl: "https://api.moonshot.ai/v1",
14
+ model: "kimi-k2.5",
15
+ },
16
+ });
@@ -0,0 +1,15 @@
1
+ /** NanoGPT login flow (API key paste, validated via /models). */
2
+ import { createApiKeyLogin } from "./api-key-login";
3
+
4
+ export const loginNanoGPT = createApiKeyLogin({
5
+ providerLabel: "NanoGPT",
6
+ authUrl: "https://nano-gpt.com/api",
7
+ instructions: "Create or copy your NanoGPT API key",
8
+ promptMessage: "Paste your NanoGPT API key",
9
+ placeholder: "sk-...",
10
+ validation: {
11
+ kind: "models-endpoint",
12
+ provider: "NanoGPT",
13
+ modelsUrl: "https://nano-gpt.com/api/v1/models",
14
+ },
15
+ });