@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,71 @@
1
+ /**
2
+ * GLM ZCode OAuth flow (UNOFFICIAL, opt-in).
3
+ *
4
+ * Replicates how the ZCode desktop app turns a Z.AI login into usable GLM model
5
+ * access. This is NOT an official Z.AI OAuth client: it reuses ZCode's authorize
6
+ * page, broker, and a custom-protocol redirect. It may break at any time and may
7
+ * violate ZCode/Z.AI Terms of Service. Endpoints/client id are overridable via
8
+ * `ZCODE_OAUTH_*` environment variables.
9
+ *
10
+ * Verified end-to-end against the ZCode host bundle (`resolveZaiApiKey` /
11
+ * `resolveBizApiKey`) and live traffic:
12
+ * 1. Authorize: GET {authorize}?redirect_uri=zcode://oauth/callback&response_type=code&client_id=...&state=...
13
+ * (custom-protocol redirect → a CLI cannot catch it, so the user pastes the code/redirect URL)
14
+ * 2. Broker: POST {broker} { provider:"zai", code, redirect_uri, state }
15
+ * → { data: { token: <ZCode JWT>, zai: { access_token: <upstream Z.AI token> } } }
16
+ * 3. Business: POST {z/login} { token: <upstream Z.AI token> } → { data: { access_token: <business token> } }
17
+ * 4. Provision: with the business token, GET getCustomerInfo → default org/project,
18
+ * GET/POST .../api_keys (find/create a key named "zcode-api-key"),
19
+ * GET .../api_keys/copy/{id} → secretKey ⇒ a real Z.AI API key "{id}.{secret}".
20
+ *
21
+ * Credential mapping:
22
+ * - `access` = the provisioned **Z.AI API key** ("{id}.{secret}"). Model requests go to
23
+ * `https://api.z.ai/api/anthropic/v1/messages` with `Authorization: Bearer <key>`
24
+ * (exactly like a dashboard key) — NO zcode.z.ai gateway, NO captcha.
25
+ * - `refresh` = the upstream Z.AI OAuth access token (used to re-provision the key).
26
+ * The API key is long-lived, so `expires` is set far in the future.
27
+ *
28
+ * This provider must NEVER force `isOAuth=true`: the key is a plain Z.AI API key, and
29
+ * api.z.ai is not api.anthropic.com, so the Anthropic path already emits a plain bearer.
30
+ */
31
+ import { OAuthCallbackFlow } from "./callback-server";
32
+ import type { OAuthController, OAuthCredentials } from "./types";
33
+ export declare const GLM_ZCODE_REFRESH_SKEW_MS: number;
34
+ /** Default endpoints / client id. Override via the matching `ZCODE_OAUTH_*` env vars. */
35
+ export declare const GLM_ZCODE_OAUTH_AUTHORIZE_URL = "https://chat.z.ai/api/oauth/authorize";
36
+ export declare const GLM_ZCODE_OAUTH_CLIENT_ID = "client_P8X5CMWmlaRO9gyO-KSqtg";
37
+ export declare const GLM_ZCODE_OAUTH_REDIRECT_URI = "zcode://oauth/callback";
38
+ export declare const GLM_ZCODE_OAUTH_BROKER_TOKEN_URL = "https://zcode.z.ai/api/v1/oauth/token";
39
+ export declare const GLM_ZCODE_ZAI_LOGIN_URL = "https://api.z.ai/api/auth/z/login";
40
+ export declare const GLM_ZCODE_USERINFO_URL = "https://chat.z.ai/api/oauth/userinfo";
41
+ /** Z.AI business API base (customer/org/project/api-key management). */
42
+ export declare const GLM_ZCODE_ZAI_API_BASE = "https://api.z.ai";
43
+ /** Model API base — the provisioned key is used here, exactly like a dashboard key. */
44
+ export declare const GLM_ZCODE_ANTHROPIC_BASE_URL = "https://api.z.ai/api/anthropic";
45
+ type FetchImpl = typeof globalThis.fetch;
46
+ /** Configured whenever a client id is available; the real ZCode client id ships as default. */
47
+ export declare function isGlmZcodeOAuthConfigured(): boolean;
48
+ export interface GlmZcodeOAuthFlowOptions {
49
+ fetch?: FetchImpl;
50
+ }
51
+ export declare class GlmZcodeOAuthFlow extends OAuthCallbackFlow {
52
+ #private;
53
+ constructor(ctrl: OAuthController, options?: GlmZcodeOAuthFlowOptions);
54
+ generateAuthUrl(state: string, redirectUri: string): Promise<{
55
+ url: string;
56
+ instructions?: string;
57
+ }>;
58
+ exchangeToken(code: string, state: string, redirectUri: string): Promise<OAuthCredentials>;
59
+ }
60
+ export declare function loginGlmZcode(ctrl: OAuthController, options?: GlmZcodeOAuthFlowOptions): Promise<OAuthCredentials>;
61
+ export interface GlmZcodeRefreshOptions {
62
+ signal?: AbortSignal;
63
+ fetch?: FetchImpl;
64
+ }
65
+ /**
66
+ * Re-provision the Z.AI API key from the stored upstream token. The key itself is
67
+ * long-lived, so this is rarely needed; if the upstream token has expired it fails
68
+ * loudly and the user must re-login.
69
+ */
70
+ export declare function refreshGlmZcodeToken(credentials: OAuthCredentials, options?: AbortSignal | GlmZcodeRefreshOptions): Promise<OAuthCredentials>;
71
+ export {};
@@ -0,0 +1,433 @@
1
+ /**
2
+ * GLM ZCode OAuth flow (UNOFFICIAL, opt-in).
3
+ *
4
+ * Replicates how the ZCode desktop app turns a Z.AI login into usable GLM model
5
+ * access. This is NOT an official Z.AI OAuth client: it reuses ZCode's authorize
6
+ * page, broker, and a custom-protocol redirect. It may break at any time and may
7
+ * violate ZCode/Z.AI Terms of Service. Endpoints/client id are overridable via
8
+ * `ZCODE_OAUTH_*` environment variables.
9
+ *
10
+ * Verified end-to-end against the ZCode host bundle (`resolveZaiApiKey` /
11
+ * `resolveBizApiKey`) and live traffic:
12
+ * 1. Authorize: GET {authorize}?redirect_uri=zcode://oauth/callback&response_type=code&client_id=...&state=...
13
+ * (custom-protocol redirect → a CLI cannot catch it, so the user pastes the code/redirect URL)
14
+ * 2. Broker: POST {broker} { provider:"zai", code, redirect_uri, state }
15
+ * → { data: { token: <ZCode JWT>, zai: { access_token: <upstream Z.AI token> } } }
16
+ * 3. Business: POST {z/login} { token: <upstream Z.AI token> } → { data: { access_token: <business token> } }
17
+ * 4. Provision: with the business token, GET getCustomerInfo → default org/project,
18
+ * GET/POST .../api_keys (find/create a key named "zcode-api-key"),
19
+ * GET .../api_keys/copy/{id} → secretKey ⇒ a real Z.AI API key "{id}.{secret}".
20
+ *
21
+ * Credential mapping:
22
+ * - `access` = the provisioned **Z.AI API key** ("{id}.{secret}"). Model requests go to
23
+ * `https://api.z.ai/api/anthropic/v1/messages` with `Authorization: Bearer <key>`
24
+ * (exactly like a dashboard key) — NO zcode.z.ai gateway, NO captcha.
25
+ * - `refresh` = the upstream Z.AI OAuth access token (used to re-provision the key).
26
+ * The API key is long-lived, so `expires` is set far in the future.
27
+ *
28
+ * This provider must NEVER force `isOAuth=true`: the key is a plain Z.AI API key, and
29
+ * api.z.ai is not api.anthropic.com, so the Anthropic path already emits a plain bearer.
30
+ */
31
+ import { OAuthCallbackFlow, type OAuthCallbackFlowOptions, parseCallbackInput } from "./callback-server";
32
+ import type { OAuthController, OAuthCredentials } from "./types";
33
+
34
+ const TOKEN_REQUEST_TIMEOUT_MS = 30_000;
35
+ export const GLM_ZCODE_REFRESH_SKEW_MS = 2 * 60 * 1000;
36
+ /** Provisioned API keys are long-lived; pin expiry far out so AuthStorage never force-refreshes. */
37
+ const GLM_ZCODE_API_KEY_TTL_MS = 10 * 365 * 24 * 60 * 60 * 1000;
38
+ /** Name ZCode gives the API key it auto-provisions (host bundle constant `FI`). */
39
+ const GLM_ZCODE_API_KEY_NAME = "zcode-api-key";
40
+
41
+ /** Default endpoints / client id. Override via the matching `ZCODE_OAUTH_*` env vars. */
42
+ export const GLM_ZCODE_OAUTH_AUTHORIZE_URL = "https://chat.z.ai/api/oauth/authorize";
43
+ export const GLM_ZCODE_OAUTH_CLIENT_ID = "client_P8X5CMWmlaRO9gyO-KSqtg";
44
+ export const GLM_ZCODE_OAUTH_REDIRECT_URI = "zcode://oauth/callback";
45
+ export const GLM_ZCODE_OAUTH_BROKER_TOKEN_URL = "https://zcode.z.ai/api/v1/oauth/token";
46
+ export const GLM_ZCODE_ZAI_LOGIN_URL = "https://api.z.ai/api/auth/z/login";
47
+ export const GLM_ZCODE_USERINFO_URL = "https://chat.z.ai/api/oauth/userinfo";
48
+ /** Z.AI business API base (customer/org/project/api-key management). */
49
+ export const GLM_ZCODE_ZAI_API_BASE = "https://api.z.ai";
50
+ /** Model API base — the provisioned key is used here, exactly like a dashboard key. */
51
+ export const GLM_ZCODE_ANTHROPIC_BASE_URL = "https://api.z.ai/api/anthropic";
52
+
53
+ type FetchImpl = typeof globalThis.fetch;
54
+
55
+ function envOr(name: string, fallback: string): string {
56
+ const value = process.env[name];
57
+ return value && value.trim().length > 0 ? value.trim() : fallback;
58
+ }
59
+
60
+ function resolveAuthorizeUrl(): string {
61
+ return envOr("ZCODE_OAUTH_AUTHORIZE_URL", GLM_ZCODE_OAUTH_AUTHORIZE_URL);
62
+ }
63
+ function resolveClientId(): string {
64
+ return envOr("ZCODE_OAUTH_CLIENT_ID", GLM_ZCODE_OAUTH_CLIENT_ID);
65
+ }
66
+ function resolveRedirectUri(): string {
67
+ return envOr("ZCODE_OAUTH_REDIRECT_URI", GLM_ZCODE_OAUTH_REDIRECT_URI);
68
+ }
69
+ function resolveBrokerTokenUrl(): string {
70
+ return envOr("ZCODE_OAUTH_BROKER_TOKEN_URL", GLM_ZCODE_OAUTH_BROKER_TOKEN_URL);
71
+ }
72
+ function resolveZaiLoginUrl(): string {
73
+ return envOr("ZCODE_OAUTH_ZAI_LOGIN_URL", GLM_ZCODE_ZAI_LOGIN_URL);
74
+ }
75
+ function resolveUserinfoUrl(): string {
76
+ return envOr("ZCODE_OAUTH_USERINFO_URL", GLM_ZCODE_USERINFO_URL);
77
+ }
78
+ function resolveZaiApiBase(): string {
79
+ return envOr("ZCODE_OAUTH_ZAI_API_BASE", GLM_ZCODE_ZAI_API_BASE).replace(/\/+$/, "");
80
+ }
81
+
82
+ /** Configured whenever a client id is available; the real ZCode client id ships as default. */
83
+ export function isGlmZcodeOAuthConfigured(): boolean {
84
+ return resolveClientId().length > 0;
85
+ }
86
+
87
+ /** Mask token-like substrings so broker/upstream/business tokens never leak into errors. */
88
+ function redactSecrets(text: string): string {
89
+ return text
90
+ .replace(/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g, "[redacted-jwt]")
91
+ .replace(/[A-Za-z0-9_-]{40,}/g, "[redacted]");
92
+ }
93
+
94
+ function validateHttpsEndpoint(rawUrl: string, label: string): string {
95
+ let parsed: URL;
96
+ try {
97
+ parsed = new URL(rawUrl);
98
+ } catch {
99
+ throw new Error(`GLM ZCode ${label} endpoint is not a valid URL`);
100
+ }
101
+ if (parsed.protocol !== "https:") {
102
+ throw new Error(`GLM ZCode ${label} endpoint must use https`);
103
+ }
104
+ return parsed.toString().replace(/\/+$/, "");
105
+ }
106
+
107
+ function requestSignal(signal: AbortSignal | undefined): AbortSignal {
108
+ const timeoutSignal = AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS);
109
+ return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
110
+ }
111
+
112
+ function isRecord(value: unknown): value is Record<string, unknown> {
113
+ return typeof value === "object" && value !== null;
114
+ }
115
+
116
+ async function postJson(
117
+ fetchImpl: FetchImpl,
118
+ url: string,
119
+ body: Record<string, unknown>,
120
+ label: string,
121
+ signal: AbortSignal | undefined,
122
+ bearer?: string,
123
+ ): Promise<unknown> {
124
+ const headers: Record<string, string> = { Accept: "application/json", "Content-Type": "application/json" };
125
+ if (bearer) headers.Authorization = `Bearer ${bearer}`;
126
+ const response = await fetchImpl(url, {
127
+ method: "POST",
128
+ headers,
129
+ body: JSON.stringify(body),
130
+ signal: requestSignal(signal),
131
+ });
132
+ if (!response.ok) {
133
+ throw new Error(`GLM ZCode ${label} request failed: ${response.status} ${redactSecrets(await response.text())}`);
134
+ }
135
+ return response.json();
136
+ }
137
+
138
+ async function getJson(
139
+ fetchImpl: FetchImpl,
140
+ url: string,
141
+ bearer: string,
142
+ label: string,
143
+ signal: AbortSignal | undefined,
144
+ ): Promise<unknown> {
145
+ const response = await fetchImpl(url, {
146
+ headers: { Accept: "application/json", Authorization: `Bearer ${bearer}` },
147
+ signal: requestSignal(signal),
148
+ });
149
+ if (!response.ok) {
150
+ throw new Error(`GLM ZCode ${label} request failed: ${response.status} ${redactSecrets(await response.text())}`);
151
+ }
152
+ return response.json();
153
+ }
154
+
155
+ interface JwtPayload {
156
+ sub?: unknown;
157
+ email?: unknown;
158
+ [key: string]: unknown;
159
+ }
160
+ function decodeJwtPayload(token: string): JwtPayload | undefined {
161
+ const parts = token.split(".");
162
+ const payload = parts[1];
163
+ if (parts.length !== 3 || !payload) return undefined;
164
+ try {
165
+ return JSON.parse(Buffer.from(payload, "base64url").toString("utf8")) as JwtPayload;
166
+ } catch {
167
+ return undefined;
168
+ }
169
+ }
170
+
171
+ interface Identity {
172
+ email?: string;
173
+ accountId?: string;
174
+ }
175
+
176
+ function parseBrokerResponse(payload: unknown): { upstreamZaiAccess: string; zcodeToken: string } {
177
+ const data = isRecord(payload) && isRecord(payload.data) ? payload.data : undefined;
178
+ const zcodeToken = data && typeof data.token === "string" ? data.token : undefined;
179
+ const zai = data && isRecord(data.zai) ? data.zai : undefined;
180
+ const upstreamZaiAccess = zai && typeof zai.access_token === "string" ? zai.access_token : undefined;
181
+ if (!zcodeToken || !upstreamZaiAccess) {
182
+ throw new Error("GLM ZCode broker response missing data.token or data.zai.access_token");
183
+ }
184
+ return { upstreamZaiAccess, zcodeToken };
185
+ }
186
+
187
+ async function resolveBusinessToken(
188
+ fetchImpl: FetchImpl,
189
+ upstreamZaiAccess: string,
190
+ signal: AbortSignal | undefined,
191
+ ): Promise<string> {
192
+ const zaiLoginUrl = validateHttpsEndpoint(resolveZaiLoginUrl(), "z/login");
193
+ const payload = await postJson(fetchImpl, `${zaiLoginUrl}`, { token: upstreamZaiAccess }, "z/login", signal);
194
+ const data = isRecord(payload) && isRecord(payload.data) ? payload.data : undefined;
195
+ const access = data && typeof data.access_token === "string" ? data.access_token : undefined;
196
+ if (!access) throw new Error("GLM ZCode z/login response missing data.access_token");
197
+ return access;
198
+ }
199
+
200
+ interface OrgProject {
201
+ organizationId: string;
202
+ projectId: string;
203
+ email?: string;
204
+ accountId?: string;
205
+ }
206
+
207
+ function pickDefaultOrgProject(customerInfo: unknown): OrgProject {
208
+ const data = isRecord(customerInfo) && isRecord(customerInfo.data) ? customerInfo.data : customerInfo;
209
+ const root = isRecord(data) ? data : {};
210
+ const orgs = Array.isArray(root.organizations) ? root.organizations : [];
211
+ const org = (orgs.find(o => isRecord(o) && o.isDefault) ?? orgs[0]) as Record<string, unknown> | undefined;
212
+ const organizationId = org && typeof org.organizationId === "string" ? org.organizationId : undefined;
213
+ const projects = org && Array.isArray(org.projects) ? org.projects : [];
214
+ const proj = (projects.find(p => isRecord(p) && p.isDefault) ?? projects[0]) as Record<string, unknown> | undefined;
215
+ const projectId = proj && typeof proj.projectId === "string" ? proj.projectId : undefined;
216
+ if (!organizationId || !projectId) {
217
+ throw new Error("GLM ZCode getCustomerInfo response missing default organization/project");
218
+ }
219
+ const email = typeof root.email === "string" && root.email.length > 0 ? root.email.toLowerCase() : undefined;
220
+ const accountId = typeof root.id === "string" ? root.id : typeof root.id === "number" ? String(root.id) : undefined;
221
+ return { organizationId, projectId, email, accountId };
222
+ }
223
+
224
+ /**
225
+ * Provision (or reuse) a Z.AI API key named "zcode-api-key" using the business token,
226
+ * mirroring ZCode's `resolveBizApiKey`. Returns "{apiKeyId}.{secretKey}".
227
+ */
228
+ async function provisionZaiApiKey(
229
+ fetchImpl: FetchImpl,
230
+ businessToken: string,
231
+ signal: AbortSignal | undefined,
232
+ ): Promise<{ apiKey: string; identity: Identity }> {
233
+ const apiBase = resolveZaiApiBase();
234
+ const customerInfo = await getJson(
235
+ fetchImpl,
236
+ `${apiBase}/api/biz/customer/getCustomerInfo`,
237
+ businessToken,
238
+ "getCustomerInfo",
239
+ signal,
240
+ );
241
+ const { organizationId, projectId, email, accountId } = pickDefaultOrgProject(customerInfo);
242
+ const keysUrl = `${apiBase}/api/biz/v1/organization/${organizationId}/projects/${projectId}/api_keys`;
243
+
244
+ const listPayload = await getJson(fetchImpl, keysUrl, businessToken, "api_keys.list", signal);
245
+ const listData = isRecord(listPayload) && Array.isArray(listPayload.data) ? listPayload.data : [];
246
+ let entry = listData.find(k => isRecord(k) && k.name === GLM_ZCODE_API_KEY_NAME) as
247
+ | Record<string, unknown>
248
+ | undefined;
249
+
250
+ if (!entry) {
251
+ const created = await postJson(
252
+ fetchImpl,
253
+ keysUrl,
254
+ { name: GLM_ZCODE_API_KEY_NAME },
255
+ "api_keys.create",
256
+ signal,
257
+ businessToken,
258
+ );
259
+ entry = (isRecord(created) && isRecord(created.data) ? created.data : created) as Record<string, unknown>;
260
+ }
261
+
262
+ const apiKeyId =
263
+ typeof entry.apiKey === "string" ? entry.apiKey.trim() : typeof entry.id === "string" ? entry.id : "";
264
+ if (!apiKeyId) throw new Error("GLM ZCode api_keys response missing apiKey id");
265
+
266
+ const copyPayload = await getJson(
267
+ fetchImpl,
268
+ `${keysUrl}/copy/${encodeURIComponent(apiKeyId)}`,
269
+ businessToken,
270
+ "api_keys.copy",
271
+ signal,
272
+ );
273
+ const copyData = isRecord(copyPayload) && isRecord(copyPayload.data) ? copyPayload.data : copyPayload;
274
+ const secretKey = isRecord(copyData) && typeof copyData.secretKey === "string" ? copyData.secretKey.trim() : "";
275
+ if (!secretKey) throw new Error("GLM ZCode api_keys copy response missing secretKey");
276
+
277
+ return { apiKey: `${apiKeyId}.${secretKey}`, identity: { email, accountId } };
278
+ }
279
+
280
+ async function resolveIdentity(
281
+ fetchImpl: FetchImpl,
282
+ upstreamZaiAccess: string,
283
+ fallback: Identity,
284
+ jwtCandidates: readonly string[],
285
+ signal: AbortSignal | undefined,
286
+ ): Promise<Identity> {
287
+ if (fallback.email || fallback.accountId) return fallback;
288
+ try {
289
+ const userinfoUrl = validateHttpsEndpoint(resolveUserinfoUrl(), "userinfo");
290
+ const response = await fetchImpl(userinfoUrl, {
291
+ headers: { Accept: "application/json", Authorization: `Bearer ${upstreamZaiAccess}` },
292
+ signal: requestSignal(signal),
293
+ });
294
+ if (response.ok) {
295
+ const payload = (await response.json()) as unknown;
296
+ const data = isRecord(payload) && isRecord(payload.data) ? payload.data : isRecord(payload) ? payload : {};
297
+ const email = typeof data.email === "string" && data.email.length > 0 ? data.email.toLowerCase() : undefined;
298
+ const accountId =
299
+ (typeof data.id === "string" && data.id) || (typeof data.sub === "string" && data.sub) || undefined;
300
+ if (email || accountId) return { email, accountId: accountId || undefined };
301
+ }
302
+ } catch {
303
+ // fall through
304
+ }
305
+ for (const token of jwtCandidates) {
306
+ const p = decodeJwtPayload(token);
307
+ const accountId = p && typeof p.sub === "string" ? p.sub : undefined;
308
+ const email = p && typeof p.email === "string" ? p.email.toLowerCase() : undefined;
309
+ if (accountId || email) return { accountId, email };
310
+ }
311
+ return {};
312
+ }
313
+
314
+ function credentialsFromApiKey(apiKey: string, upstreamZaiAccess: string, identity: Identity): OAuthCredentials {
315
+ return {
316
+ access: apiKey,
317
+ refresh: upstreamZaiAccess,
318
+ expires: Date.now() + GLM_ZCODE_API_KEY_TTL_MS,
319
+ email: identity.email,
320
+ accountId: identity.accountId,
321
+ };
322
+ }
323
+
324
+ async function provisionFromUpstream(
325
+ fetchImpl: FetchImpl,
326
+ upstreamZaiAccess: string,
327
+ zcodeTokenForIdentity: string | undefined,
328
+ signal: AbortSignal | undefined,
329
+ ): Promise<OAuthCredentials> {
330
+ const businessToken = await resolveBusinessToken(fetchImpl, upstreamZaiAccess, signal);
331
+ const { apiKey, identity: keyIdentity } = await provisionZaiApiKey(fetchImpl, businessToken, signal);
332
+ const identity = await resolveIdentity(
333
+ fetchImpl,
334
+ upstreamZaiAccess,
335
+ keyIdentity,
336
+ [zcodeTokenForIdentity ?? "", businessToken].filter(Boolean),
337
+ signal,
338
+ );
339
+ return credentialsFromApiKey(apiKey, upstreamZaiAccess, identity);
340
+ }
341
+
342
+ async function exchangeGlmZcodeCode(
343
+ fetchImpl: FetchImpl,
344
+ input: { code: string; state: string; redirectUri: string },
345
+ signal: AbortSignal | undefined,
346
+ ): Promise<OAuthCredentials> {
347
+ const parsed = parseCallbackInput(input.code);
348
+ const code = parsed.code ?? input.code;
349
+ const brokerUrl = validateHttpsEndpoint(resolveBrokerTokenUrl(), "broker");
350
+ const brokerPayload = await postJson(
351
+ fetchImpl,
352
+ brokerUrl,
353
+ { provider: "zai", code, redirect_uri: input.redirectUri, state: input.state },
354
+ "broker",
355
+ signal,
356
+ );
357
+ const { upstreamZaiAccess, zcodeToken } = parseBrokerResponse(brokerPayload);
358
+ return provisionFromUpstream(fetchImpl, upstreamZaiAccess, zcodeToken, signal);
359
+ }
360
+
361
+ export interface GlmZcodeOAuthFlowOptions {
362
+ fetch?: FetchImpl;
363
+ }
364
+
365
+ export class GlmZcodeOAuthFlow extends OAuthCallbackFlow {
366
+ #fetch: FetchImpl;
367
+
368
+ constructor(ctrl: OAuthController, options: GlmZcodeOAuthFlowOptions = {}) {
369
+ super(ctrl, {
370
+ preferredPort: 0,
371
+ callbackPath: "/callback",
372
+ callbackHostname: "127.0.0.1",
373
+ callbackBindHostname: "127.0.0.1",
374
+ redirectUri: resolveRedirectUri(),
375
+ } satisfies OAuthCallbackFlowOptions);
376
+ this.#fetch = options.fetch ?? ctrl.fetch ?? globalThis.fetch;
377
+ }
378
+
379
+ async generateAuthUrl(state: string, redirectUri: string): Promise<{ url: string; instructions?: string }> {
380
+ const authorizeUrl = validateHttpsEndpoint(resolveAuthorizeUrl(), "authorize");
381
+ const params = new URLSearchParams({
382
+ redirect_uri: redirectUri,
383
+ response_type: "code",
384
+ client_id: resolveClientId(),
385
+ state,
386
+ });
387
+ return {
388
+ url: `${authorizeUrl}?${params.toString()}`,
389
+ instructions:
390
+ "Complete Z.AI login in your browser. This is an UNOFFICIAL ZCode-based login — use at your own risk; it may stop working or violate ZCode/Z.AI Terms of Service. Because this CLI cannot receive the zcode:// redirect, paste the final redirect URL or authorization code when prompted.",
391
+ };
392
+ }
393
+
394
+ async exchangeToken(code: string, state: string, redirectUri: string): Promise<OAuthCredentials> {
395
+ return exchangeGlmZcodeCode(this.#fetch, { code, state, redirectUri }, this.ctrl.signal);
396
+ }
397
+ }
398
+
399
+ export async function loginGlmZcode(
400
+ ctrl: OAuthController,
401
+ options?: GlmZcodeOAuthFlowOptions,
402
+ ): Promise<OAuthCredentials> {
403
+ return new GlmZcodeOAuthFlow(ctrl, options).login();
404
+ }
405
+
406
+ export interface GlmZcodeRefreshOptions {
407
+ signal?: AbortSignal;
408
+ fetch?: FetchImpl;
409
+ }
410
+
411
+ /**
412
+ * Re-provision the Z.AI API key from the stored upstream token. The key itself is
413
+ * long-lived, so this is rarely needed; if the upstream token has expired it fails
414
+ * loudly and the user must re-login.
415
+ */
416
+ export async function refreshGlmZcodeToken(
417
+ credentials: OAuthCredentials,
418
+ options: AbortSignal | GlmZcodeRefreshOptions = {},
419
+ ): Promise<OAuthCredentials> {
420
+ const { signal, fetch: fetchImpl } =
421
+ options instanceof AbortSignal ? { signal: options, fetch: undefined } : options;
422
+ const upstream = credentials.refresh;
423
+ if (!upstream) {
424
+ throw new Error("glm-zcode credentials require re-login (`/login glm-zcode`); no stored upstream Z.AI token");
425
+ }
426
+ try {
427
+ return await provisionFromUpstream(fetchImpl ?? globalThis.fetch, upstream, undefined, signal);
428
+ } catch (error) {
429
+ throw new Error(
430
+ `glm-zcode credentials require re-login (\`/login glm-zcode\`); re-provisioning the Z.AI API key failed (${redactSecrets(String(error))})`,
431
+ );
432
+ }
433
+ }