@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,259 @@
1
+ import { $credentialEnv } from "@vib-rato/utils";
2
+ import type {
3
+ CredentialRankingStrategy,
4
+ UsageFetchContext,
5
+ UsageFetchParams,
6
+ UsageLimit,
7
+ UsageProvider,
8
+ UsageReport,
9
+ } from "../usage";
10
+
11
+ interface BillingUsage {
12
+ monthlyLimit: number;
13
+ used: number;
14
+ billingPeriodEnd: string;
15
+ }
16
+
17
+ interface WeeklyBillingUsage {
18
+ creditUsagePercent: number;
19
+ billingPeriodEnd: string;
20
+ }
21
+
22
+ const DEFAULT_GROK_BUILD_BASE_URL = "https://cli-chat-proxy.grok.com/v1";
23
+ const ALLOWED_GROK_BUILD_HOSTS = new Set(["cli-chat-proxy.grok.com"]);
24
+ const GROK_WEEKLY_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
25
+
26
+ function isRecord(value: unknown): value is Record<string, unknown> {
27
+ return !!value && typeof value === "object";
28
+ }
29
+
30
+ function finiteNumber(value: unknown): number | undefined {
31
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
32
+ }
33
+
34
+ function parseValNumber(value: unknown): number | undefined {
35
+ return isRecord(value) ? finiteNumber(value.val) : undefined;
36
+ }
37
+
38
+ export function parseGrokCliBillingUsage(payload: unknown): BillingUsage {
39
+ if (!isRecord(payload) || !isRecord(payload.config)) {
40
+ throw new Error("invalid Grok CLI billing payload");
41
+ }
42
+ const monthlyLimit = parseValNumber(payload.config.monthlyLimit);
43
+ const used = parseValNumber(payload.config.used);
44
+ const billingPeriodEnd = payload.config.billingPeriodEnd;
45
+ if (
46
+ monthlyLimit === undefined ||
47
+ used === undefined ||
48
+ typeof billingPeriodEnd !== "string" ||
49
+ !Number.isFinite(new Date(billingPeriodEnd).getTime())
50
+ ) {
51
+ throw new Error("invalid Grok CLI billing payload");
52
+ }
53
+ return { monthlyLimit, used, billingPeriodEnd };
54
+ }
55
+
56
+ export function parseGrokCliWeeklyBillingUsage(payload: unknown): WeeklyBillingUsage | undefined {
57
+ if (!isRecord(payload) || !isRecord(payload.config)) return undefined;
58
+ const currentPeriod = isRecord(payload.config.currentPeriod) ? payload.config.currentPeriod : undefined;
59
+ if (currentPeriod?.type !== "USAGE_PERIOD_TYPE_WEEKLY") return undefined;
60
+
61
+ const billingPeriodEnd = payload.config.billingPeriodEnd;
62
+ if (typeof billingPeriodEnd !== "string" || !Number.isFinite(new Date(billingPeriodEnd).getTime())) {
63
+ return undefined;
64
+ }
65
+
66
+ const rawCreditUsagePercent = payload.config.creditUsagePercent;
67
+ const creditUsagePercent = rawCreditUsagePercent === undefined ? 0 : finiteNumber(rawCreditUsagePercent);
68
+ if (creditUsagePercent === undefined) return undefined;
69
+
70
+ return { creditUsagePercent, billingPeriodEnd };
71
+ }
72
+
73
+ function isAllowedGrokCredentialHost(baseUrl: string): boolean {
74
+ try {
75
+ const url = new URL(baseUrl);
76
+ return url.protocol === "https:" && ALLOWED_GROK_BUILD_HOSTS.has(url.hostname.toLowerCase());
77
+ } catch {
78
+ return false;
79
+ }
80
+ }
81
+
82
+ function normalizeGrokBaseUrl(baseUrl?: string): string {
83
+ const normalized = (baseUrl?.trim() || DEFAULT_GROK_BUILD_BASE_URL).replace(/\/+$/, "");
84
+ return isAllowedGrokCredentialHost(normalized) ? normalized : DEFAULT_GROK_BUILD_BASE_URL;
85
+ }
86
+ function isUnsafeGrokBaseUrlOverride(baseUrl?: string): boolean {
87
+ const normalized = baseUrl?.trim().replace(/\/+$/, "");
88
+ return !!normalized && !isAllowedGrokCredentialHost(normalized);
89
+ }
90
+
91
+ function resolveAccessToken(params: UsageFetchParams): string | undefined {
92
+ // Trusted sources only for the env fallback: this token authenticates the
93
+ // billing/usage call, so whatever can set it decides which account is queried
94
+ // with it. `$env` merges the caller's `cwd/.env` into `process.env`, so
95
+ // reading it there would let repository content supply the credential.
96
+ // Stored credentials keep precedence.
97
+ const token = params.credential.accessToken ?? params.credential.apiKey ?? $credentialEnv("GROK_CLI_OAUTH_TOKEN");
98
+ return token?.trim() || undefined;
99
+ }
100
+
101
+ /** Test seam: the usage access token as resolved from a credential plus trusted env. */
102
+ export function resolveGrokAccessTokenForTest(params: UsageFetchParams): string | undefined {
103
+ return resolveAccessToken(params);
104
+ }
105
+
106
+ function buildMonthlyUsageLimit(usage: BillingUsage, nowMs: number): UsageLimit {
107
+ const usedFraction = usage.monthlyLimit > 0 ? usage.used / usage.monthlyLimit : 0;
108
+ const percent = usedFraction * 100;
109
+ const resetsAt = new Date(usage.billingPeriodEnd).getTime();
110
+ return {
111
+ id: "grok-build:7d",
112
+ label: "SuperGrok monthly credits",
113
+ scope: { provider: "grok-build", shared: true, windowId: "7d" },
114
+ window: {
115
+ id: "7d",
116
+ label: "Monthly credits",
117
+ resetsAt,
118
+ },
119
+ amount: {
120
+ unit: "percent",
121
+ used: percent,
122
+ limit: 100,
123
+ remaining: Math.max(0, 100 - percent),
124
+ usedFraction,
125
+ remainingFraction: Math.max(0, 1 - usedFraction),
126
+ },
127
+ status: percent >= 95 ? "exhausted" : percent >= 80 ? "warning" : "ok",
128
+ notes: [
129
+ `${usage.used}/${usage.monthlyLimit} credits used`,
130
+ `resets in ${Math.max(0, Math.round((resetsAt - nowMs) / 3_600_000))}h`,
131
+ ],
132
+ };
133
+ }
134
+
135
+ function buildWeeklyUsageLimit(usage: WeeklyBillingUsage): UsageLimit {
136
+ const percent = Math.min(Math.max(usage.creditUsagePercent, 0), 100);
137
+ const usedFraction = percent / 100;
138
+ const resetsAt = new Date(usage.billingPeriodEnd).getTime();
139
+ return {
140
+ id: "grok-build:weekly",
141
+ label: "SuperGrok weekly credits",
142
+ scope: { provider: "grok-build", shared: true, windowId: "weekly" },
143
+ window: {
144
+ id: "weekly",
145
+ label: "Weekly",
146
+ durationMs: GROK_WEEKLY_WINDOW_MS,
147
+ resetsAt,
148
+ },
149
+ amount: {
150
+ unit: "percent",
151
+ used: percent,
152
+ limit: 100,
153
+ remaining: 100 - percent,
154
+ usedFraction,
155
+ remainingFraction: 1 - usedFraction,
156
+ },
157
+ status: percent >= 95 ? "exhausted" : percent >= 80 ? "warning" : "ok",
158
+ notes: [`${percent}% used`],
159
+ };
160
+ }
161
+
162
+ export const grokCliUsageProvider: UsageProvider = {
163
+ id: "grok-build",
164
+
165
+ supports(params) {
166
+ return params.provider === "grok-build";
167
+ },
168
+
169
+ async fetchUsage(params: UsageFetchParams, ctx: UsageFetchContext): Promise<UsageReport | null> {
170
+ const accessToken = resolveAccessToken(params);
171
+ if (!accessToken) {
172
+ ctx.logger?.warn("Grok Build usage: no access token", { provider: params.provider });
173
+ return null;
174
+ }
175
+
176
+ if (isUnsafeGrokBaseUrlOverride(params.baseUrl)) {
177
+ ctx.logger?.warn("Grok Build usage: ignoring unsafe base URL override for credential safety", {
178
+ provider: params.provider,
179
+ });
180
+ }
181
+ const billingBaseUrl = normalizeGrokBaseUrl(params.baseUrl);
182
+ const response = await ctx.fetch(`${billingBaseUrl}/billing`, {
183
+ headers: {
184
+ Authorization: `Bearer ${accessToken}`,
185
+ "x-xai-token-auth": "xai-grok-cli",
186
+ accept: "application/json",
187
+ },
188
+ signal: params.signal,
189
+ });
190
+ if (!response.ok) {
191
+ ctx.logger?.warn("Grok Build billing request failed", { status: response.status, provider: params.provider });
192
+ return null;
193
+ }
194
+
195
+ const payload = (await response.json()) as unknown;
196
+ let billing: BillingUsage;
197
+ try {
198
+ billing = parseGrokCliBillingUsage(payload);
199
+ } catch (error) {
200
+ ctx.logger?.warn("Grok Build billing parse failed", { error: String(error) });
201
+ return null;
202
+ }
203
+
204
+ const nowMs = Date.now();
205
+ let weekly: WeeklyBillingUsage | undefined;
206
+ try {
207
+ const weeklyResponse = await ctx.fetch(`${billingBaseUrl}/billing?format=credits`, {
208
+ headers: {
209
+ Authorization: `Bearer ${accessToken}`,
210
+ "x-xai-token-auth": "xai-grok-cli",
211
+ accept: "application/json",
212
+ },
213
+ signal: params.signal,
214
+ });
215
+ if (weeklyResponse.ok) {
216
+ weekly = parseGrokCliWeeklyBillingUsage((await weeklyResponse.json()) as unknown);
217
+ }
218
+ } catch (error) {
219
+ if (params.signal?.aborted && billing.monthlyLimit <= 0) throw error;
220
+ ctx.logger?.debug("Grok Build weekly billing request failed", { error: String(error) });
221
+ }
222
+
223
+ const limits: UsageLimit[] = [];
224
+ if (billing.monthlyLimit > 0) {
225
+ limits.push(buildMonthlyUsageLimit(billing, nowMs));
226
+ }
227
+ if (weekly) {
228
+ limits.push(buildWeeklyUsageLimit(weekly));
229
+ }
230
+ if (limits.length === 0) {
231
+ ctx.logger?.warn("Grok Build billing response contained no usable quota", {
232
+ provider: params.provider,
233
+ });
234
+ return null;
235
+ }
236
+
237
+ return {
238
+ provider: "grok-build",
239
+ fetchedAt: nowMs,
240
+ limits,
241
+ metadata: {
242
+ email: params.credential.email,
243
+ accountId: params.credential.accountId,
244
+ subscription: true,
245
+ },
246
+ raw: payload,
247
+ };
248
+ },
249
+ };
250
+
251
+ export const grokCliRankingStrategy: CredentialRankingStrategy = {
252
+ findWindowLimits(report) {
253
+ const weekly = report.limits.find(limit => limit.id === "grok-build:weekly");
254
+ if (weekly) return { secondary: weekly };
255
+ const monthly = report.limits.find(limit => limit.id === "grok-build:7d");
256
+ return { secondary: monthly };
257
+ },
258
+ windowDefaults: { primaryMs: 5 * 60 * 60 * 1000, secondaryMs: 30 * 24 * 60 * 60 * 1000 },
259
+ };
@@ -0,0 +1,285 @@
1
+ import { $credentialEnv } from "@vib-rato/utils";
2
+ import type {
3
+ UsageAmount,
4
+ UsageFetchContext,
5
+ UsageFetchParams,
6
+ UsageLimit,
7
+ UsageProvider,
8
+ UsageReport,
9
+ UsageStatus,
10
+ UsageWindow,
11
+ } from "../usage";
12
+ import { isRecord } from "../utils";
13
+ import { getKimiCommonHeaders } from "../utils/oauth/kimi";
14
+ // (Refresh is the sole responsibility of AuthStorage; no provider-direct refresh here.)
15
+ import { toNumber } from "./shared";
16
+
17
+ const DEFAULT_BASE_URL = "https://api.kimi.com/coding/v1";
18
+ const USAGE_PATH = "usages";
19
+
20
+ interface KimiUsagePayload {
21
+ usage?: unknown;
22
+ limits?: unknown;
23
+ }
24
+
25
+ type KimiUsageRow = {
26
+ label: string;
27
+ used?: number;
28
+ limit?: number;
29
+ remaining?: number;
30
+ resetsAt?: number;
31
+ window?: UsageWindow;
32
+ };
33
+
34
+ /**
35
+ * Usage endpoint base, with the environment override resolved from trusted
36
+ * sources only.
37
+ *
38
+ * The result becomes the usage URL that the request sends
39
+ * `Authorization: Bearer <accessToken>` to, so whatever can set it receives the
40
+ * user's Kimi access token. `$env` merges the caller's `cwd/.env`, so reading it
41
+ * there would let repository content collect that token.
42
+ */
43
+ function normalizeBaseUrl(baseUrl?: string): string {
44
+ const envBase = $credentialEnv("KIMI_CODE_BASE_URL");
45
+ const candidate = baseUrl?.trim() || envBase || DEFAULT_BASE_URL;
46
+ return candidate.replace(/\/+$/, "");
47
+ }
48
+
49
+ /** Test seam: the usage base URL as resolved from a caller value plus trusted env. */
50
+ export function normalizeKimiUsageBaseUrlForTest(baseUrl?: string): string {
51
+ return normalizeBaseUrl(baseUrl);
52
+ }
53
+
54
+ function buildUsageUrl(baseUrl: string): string {
55
+ const normalized = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
56
+ return `${normalized}${USAGE_PATH}`;
57
+ }
58
+
59
+ function parseResetTime(data: Record<string, unknown>, nowMs: number): number | undefined {
60
+ const timeKeys = ["reset_at", "resetAt", "reset_time", "resetTime"] as const;
61
+ for (const key of timeKeys) {
62
+ const value = data[key];
63
+ if (typeof value === "string" && value.trim()) {
64
+ const parsed = Date.parse(value);
65
+ if (Number.isFinite(parsed)) return parsed;
66
+ }
67
+ if (typeof value === "number" && Number.isFinite(value)) {
68
+ return value > 1_000_000_000_000 ? value : value * 1000;
69
+ }
70
+ }
71
+
72
+ const secondsKeys = ["reset_in", "resetIn", "ttl", "window"] as const;
73
+ for (const key of secondsKeys) {
74
+ const seconds = toNumber(data[key]);
75
+ if (seconds !== undefined) return nowMs + seconds * 1000;
76
+ }
77
+
78
+ return undefined;
79
+ }
80
+
81
+ function formatDurationLabel(duration: number, timeUnit: string): string | undefined {
82
+ const upper = timeUnit.toUpperCase();
83
+ if (upper.includes("MINUTE")) {
84
+ if (duration >= 60 && duration % 60 === 0) return `${duration / 60}h limit`;
85
+ return `${duration}m limit`;
86
+ }
87
+ if (upper.includes("HOUR")) return `${duration}h limit`;
88
+ if (upper.includes("DAY")) return `${duration}d limit`;
89
+ if (upper.includes("SECOND")) return `${duration}s limit`;
90
+ return undefined;
91
+ }
92
+
93
+ function buildWindow(windowData: Record<string, unknown>, nowMs: number): UsageWindow | undefined {
94
+ const duration = toNumber(windowData.duration);
95
+ const timeUnit = typeof windowData.timeUnit === "string" ? windowData.timeUnit : "";
96
+ const label = duration !== undefined && timeUnit ? formatDurationLabel(duration, timeUnit) : undefined;
97
+ const resetsAt = parseResetTime(windowData, nowMs);
98
+
99
+ if (duration === undefined && !label && !resetsAt) return undefined;
100
+ let durationMs: number | undefined;
101
+ if (duration !== undefined) {
102
+ if (timeUnit.toUpperCase().includes("MINUTE")) durationMs = duration * 60_000;
103
+ else if (timeUnit.toUpperCase().includes("HOUR")) durationMs = duration * 3_600_000;
104
+ else if (timeUnit.toUpperCase().includes("DAY")) durationMs = duration * 86_400_000;
105
+ else if (timeUnit.toUpperCase().includes("SECOND")) durationMs = duration * 1000;
106
+ }
107
+
108
+ return {
109
+ id: duration !== undefined && timeUnit ? `${duration}${timeUnit.toLowerCase()}` : "default",
110
+ label: label ?? "Usage window",
111
+ durationMs,
112
+ resetsAt,
113
+ };
114
+ }
115
+
116
+ function buildUsageRow(data: Record<string, unknown>, defaultLabel: string, nowMs: number): KimiUsageRow | null {
117
+ const limit = toNumber(data.limit);
118
+ let used = toNumber(data.used);
119
+ const remaining = toNumber(data.remaining);
120
+ if (used === undefined && remaining !== undefined && limit !== undefined) {
121
+ used = limit - remaining;
122
+ }
123
+
124
+ if (used === undefined && limit === undefined) return null;
125
+ const resetsAt = parseResetTime(data, nowMs);
126
+ return {
127
+ label:
128
+ typeof data.name === "string" && data.name
129
+ ? data.name
130
+ : typeof data.title === "string" && data.title
131
+ ? data.title
132
+ : defaultLabel,
133
+ used,
134
+ limit,
135
+ remaining,
136
+ resetsAt,
137
+ };
138
+ }
139
+
140
+ function buildUsageAmount(row: KimiUsageRow): UsageAmount {
141
+ const amount: UsageAmount = { unit: "unknown" };
142
+ if (row.limit !== undefined) amount.limit = row.limit;
143
+ if (row.used !== undefined) amount.used = row.used;
144
+ if (row.remaining !== undefined) amount.remaining = row.remaining;
145
+ if (row.limit !== undefined && row.used !== undefined && row.limit > 0) {
146
+ amount.usedFraction = Math.min(Math.max(row.used / row.limit, 0), 1);
147
+ amount.remainingFraction = Math.min(Math.max((row.limit - row.used) / row.limit, 0), 1);
148
+ amount.remaining = amount.remaining ?? row.limit - row.used;
149
+ }
150
+ return amount;
151
+ }
152
+
153
+ function buildUsageStatus(amount: UsageAmount): UsageStatus {
154
+ if (amount.usedFraction === undefined) return "unknown";
155
+ if (amount.usedFraction >= 1) return "exhausted";
156
+ if (amount.usedFraction >= 0.9) return "warning";
157
+ return "ok";
158
+ }
159
+
160
+ function toUsageLimit(row: KimiUsageRow, provider: string, index: number, accountId?: string): UsageLimit {
161
+ const window: UsageWindow | undefined =
162
+ row.window ??
163
+ (row.resetsAt
164
+ ? {
165
+ id: "default",
166
+ label: "Usage window",
167
+ resetsAt: row.resetsAt,
168
+ }
169
+ : undefined);
170
+
171
+ const amount = buildUsageAmount(row);
172
+ return {
173
+ id: `${provider}:${index}`,
174
+ label: row.label,
175
+ scope: {
176
+ provider,
177
+ accountId,
178
+ windowId: window?.id,
179
+ shared: true,
180
+ },
181
+ window,
182
+ amount,
183
+ status: buildUsageStatus(amount),
184
+ };
185
+ }
186
+
187
+ function parseUsagePayload(payload: unknown, nowMs: number): { rows: KimiUsageRow[]; raw: KimiUsagePayload } | null {
188
+ if (!isRecord(payload)) return null;
189
+ const data = payload as KimiUsagePayload;
190
+ const rows: KimiUsageRow[] = [];
191
+
192
+ if (isRecord(data.usage)) {
193
+ const summary = buildUsageRow(data.usage, "Total quota", nowMs);
194
+ if (summary) rows.push(summary);
195
+ }
196
+
197
+ if (Array.isArray(data.limits)) {
198
+ data.limits.forEach((item, idx) => {
199
+ if (!isRecord(item)) return;
200
+ const detail = isRecord(item.detail) ? item.detail : item;
201
+ const windowData = isRecord(item.window) ? item.window : {};
202
+ const label =
203
+ (typeof item.name === "string" && item.name) ||
204
+ (typeof item.title === "string" && item.title) ||
205
+ (typeof item.scope === "string" && item.scope) ||
206
+ (typeof detail.name === "string" && detail.name) ||
207
+ (typeof detail.title === "string" && detail.title) ||
208
+ formatDurationLabel(toNumber(windowData.duration) ?? 0, String(windowData.timeUnit || "")) ||
209
+ `Limit #${idx + 1}`;
210
+ const row = buildUsageRow(detail, label, nowMs);
211
+ if (row) {
212
+ row.window = buildWindow(windowData, nowMs);
213
+ rows.push(row);
214
+ }
215
+ });
216
+ }
217
+
218
+ return { rows, raw: data };
219
+ }
220
+
221
+ export const kimiUsageProvider: UsageProvider = {
222
+ id: "kimi-code",
223
+ supports(params: UsageFetchParams): boolean {
224
+ return params.provider === "kimi-code" && params.credential.type === "oauth";
225
+ },
226
+ async fetchUsage(params: UsageFetchParams, ctx: UsageFetchContext): Promise<UsageReport | null> {
227
+ if (params.provider !== "kimi-code") return null;
228
+ const { credential } = params;
229
+ if (credential.type !== "oauth") return null;
230
+
231
+ const accessToken = credential.accessToken;
232
+ if (!accessToken) return null;
233
+
234
+ const nowMs = Date.now();
235
+ // AuthStorage refreshes OAuth credentials pre-emptively (60s skew). If the
236
+ // usage probe lands with an expired token, short-circuit rather than POST
237
+ // the broker sentinel back to Kimi — the next cycle will carry a freshly
238
+ // refreshed credential.
239
+ if (credential.expiresAt !== undefined && credential.expiresAt <= nowMs) {
240
+ ctx.logger?.debug("Kimi usage token expired; skipping probe", { provider: params.provider });
241
+ return null;
242
+ }
243
+
244
+ const baseUrl = normalizeBaseUrl(params.baseUrl);
245
+ const url = buildUsageUrl(baseUrl);
246
+ let payload: unknown;
247
+ try {
248
+ const response = await ctx.fetch(url, {
249
+ headers: {
250
+ ...getKimiCommonHeaders(),
251
+ Authorization: `Bearer ${accessToken}`,
252
+ },
253
+ signal: params.signal,
254
+ });
255
+ if (!response.ok) {
256
+ ctx.logger?.warn("Kimi usage request failed", { status: response.status, provider: params.provider });
257
+ return null;
258
+ }
259
+ payload = await response.json();
260
+ } catch (error) {
261
+ ctx.logger?.warn("Kimi usage request error", { provider: params.provider, error: String(error) });
262
+ return null;
263
+ }
264
+
265
+ const parsed = parseUsagePayload(payload, nowMs);
266
+ if (!parsed || parsed.rows.length === 0) {
267
+ ctx.logger?.warn("Kimi usage response invalid", { provider: params.provider });
268
+ return null;
269
+ }
270
+
271
+ const limits = parsed.rows.map((row, index) => toUsageLimit(row, params.provider, index, credential.accountId));
272
+
273
+ const report: UsageReport = {
274
+ provider: params.provider,
275
+ fetchedAt: nowMs,
276
+ limits,
277
+ metadata: {
278
+ endpoint: url,
279
+ },
280
+ raw: parsed.raw,
281
+ };
282
+
283
+ return report;
284
+ },
285
+ };
@@ -0,0 +1,31 @@
1
+ import type { UsageFetchContext, UsageFetchParams, UsageProvider, UsageReport } from "../usage";
2
+
3
+ /**
4
+ * MiniMax Coding Plan usage provider.
5
+ *
6
+ * MiniMax Coding Plan is a subscription-based service with a 5-hour rolling window
7
+ * quota system. The quota resets automatically based on a rolling window.
8
+ *
9
+ * Currently, MiniMax does not expose a usage/quota API endpoint for the Coding Plan.
10
+ * Usage is tracked via the web dashboard at https://platform.minimax.io/user-center/payment/coding-plan
11
+ *
12
+ * This provider exists to register support for the minimax-code provider in the
13
+ * usage system. When MiniMax adds a usage API, this can be implemented.
14
+ */
15
+ async function fetchMiniMaxCodeUsage(params: UsageFetchParams, _ctx: UsageFetchContext): Promise<UsageReport | null> {
16
+ if (params.provider !== "minimax-code" && params.provider !== "minimax-code-cn") {
17
+ return null;
18
+ }
19
+
20
+ // MiniMax Coding Plan does not currently expose a usage API
21
+ // Users can check their usage via the web dashboard
22
+ return null;
23
+ }
24
+
25
+ export const minimaxCodeUsageProvider: UsageProvider = {
26
+ id: "minimax-code",
27
+ fetchUsage: fetchMiniMaxCodeUsage,
28
+ supports: (params: UsageFetchParams) =>
29
+ (params.provider === "minimax-code" || params.provider === "minimax-code-cn") &&
30
+ params.credential.type === "api_key",
31
+ };