@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,607 @@
1
+ import * as crypto from "node:crypto";
2
+ import { parse as partialParse } from "partial-json";
3
+
4
+ const QUOTE = 0x22;
5
+ const BACKSLASH = 0x5c;
6
+ const U = 0x75;
7
+
8
+ // Valid chars after `\`: " \ / b f n r t u
9
+ const VALID_ESCAPE_CHAR = new Uint8Array(128);
10
+ for (const ch of '"\\/bfnrtu') VALID_ESCAPE_CHAR[ch.charCodeAt(0)] = 1;
11
+
12
+ const CONTROL_ESCAPES: readonly string[] = (() => {
13
+ const e: string[] = [];
14
+ e[0x08] = "\\b";
15
+ e[0x09] = "\\t";
16
+ e[0x0a] = "\\n";
17
+ e[0x0c] = "\\f";
18
+ e[0x0d] = "\\r";
19
+ for (let cp = 0; cp <= 0x1f; cp++) {
20
+ e[cp] ??= `\\u${cp.toString(16).padStart(4, "0")}`;
21
+ }
22
+ return e;
23
+ })();
24
+
25
+ function isHexDigit(cp: number): boolean {
26
+ return (cp >= 0x30 && cp <= 0x39) || ((cp | 0x20) >= 0x61 && (cp | 0x20) <= 0x66);
27
+ }
28
+
29
+ const MAX_UNICODE_ESCAPE_POSITIONS = 32;
30
+ const MAX_UNICODE_ESCAPE_DEPTH = 64;
31
+ const UNICODE_ESCAPE_EVIDENCE_KEY_SLOT = Symbol.for("@vib-rato/ai.unicode-escape-evidence-key.v1");
32
+ const unicodeEscapeEvidenceGlobal = globalThis as unknown as Record<PropertyKey, unknown>;
33
+ const existingUnicodeEscapeEvidenceKey = unicodeEscapeEvidenceGlobal[UNICODE_ESCAPE_EVIDENCE_KEY_SLOT];
34
+ const UNICODE_ESCAPE_EVIDENCE_KEY = Buffer.isBuffer(existingUnicodeEscapeEvidenceKey)
35
+ ? existingUnicodeEscapeEvidenceKey
36
+ : crypto.randomBytes(32);
37
+ if (!Buffer.isBuffer(existingUnicodeEscapeEvidenceKey)) {
38
+ Object.defineProperty(unicodeEscapeEvidenceGlobal, UNICODE_ESCAPE_EVIDENCE_KEY_SLOT, {
39
+ value: UNICODE_ESCAPE_EVIDENCE_KEY,
40
+ writable: false,
41
+ configurable: false,
42
+ enumerable: false,
43
+ });
44
+ }
45
+
46
+ export interface UnicodeEscapePositionEvidence {
47
+ /** UTF-16 offset of the escape's leading backslash in the raw JSON. */
48
+ readonly offset: number;
49
+ /** Process-keyed tag of the encoded scalar; never the recoverable character. */
50
+ readonly scalarTag: string;
51
+ /** Process-keyed tag of the unambiguous array-index-free path; never raw field names. */
52
+ readonly pathTag: string;
53
+ /** Escapes in object keys are structural and can never be display-safe. */
54
+ readonly location: "key" | "value";
55
+ /** Ordinal of this string among values sharing the array-index-free path. */
56
+ readonly valueOrdinal: number;
57
+ /** UTF-16 offset of the decoded scalar inside that string value. */
58
+ readonly valueOffset: number;
59
+ }
60
+
61
+ export interface UnicodeEscapeEvidence {
62
+ readonly positions: readonly UnicodeEscapePositionEvidence[];
63
+ /** Total qualifying escapes observed, including positions omitted by the cap. */
64
+ readonly totalPositions: number;
65
+ /** More qualifying escapes existed than the bounded evidence can carry. */
66
+ readonly truncated: boolean;
67
+ /** The raw JSON could not be mapped exactly and unambiguously; validation must fail closed. */
68
+ readonly malformed: boolean;
69
+ /** Process-local HMAC binding the complete collector-produced envelope. */
70
+ readonly integrity: string;
71
+ }
72
+
73
+ interface UnicodeEscapeEvidenceTarget {
74
+ escapedNonAsciiArguments?: boolean;
75
+ escapedUnicodeArgumentEvidence?: UnicodeEscapeEvidence;
76
+ }
77
+
78
+ /** Stable, payload-free identity for an unambiguous array-index-free argument path. */
79
+ export function unicodeEscapePathTag(path: readonly string[]): string {
80
+ const hash = crypto.createHmac("sha256", UNICODE_ESCAPE_EVIDENCE_KEY);
81
+ const length = Buffer.allocUnsafe(4);
82
+ length.writeUInt32BE(path.length);
83
+ hash.update(length);
84
+ for (const segment of path) {
85
+ length.writeUInt32BE(Buffer.byteLength(segment));
86
+ hash.update(length);
87
+ hash.update(segment);
88
+ }
89
+ return hash.digest("hex");
90
+ }
91
+
92
+ /** Process-keyed scalar identity used without retaining recoverable argument text. */
93
+ export function unicodeEscapeScalarTag(codePoint: number): string {
94
+ return crypto.createHmac("sha256", UNICODE_ESCAPE_EVIDENCE_KEY).update(`scalar:v1:${codePoint}`).digest("hex");
95
+ }
96
+
97
+ function unicodeEscapeEvidenceIntegrity(evidence: Omit<UnicodeEscapeEvidence, "integrity">): string {
98
+ const hmac = crypto.createHmac("sha256", UNICODE_ESCAPE_EVIDENCE_KEY);
99
+ hmac.update(`v1:${evidence.totalPositions}:${evidence.truncated ? 1 : 0}:${evidence.malformed ? 1 : 0}`);
100
+ for (const position of evidence.positions) {
101
+ hmac.update(
102
+ `|${position.offset}:${position.location}:${position.valueOrdinal}:${position.valueOffset}:${position.scalarTag}:`,
103
+ );
104
+ hmac.update(position.pathTag);
105
+ }
106
+ return hmac.digest("hex");
107
+ }
108
+
109
+ function createUnicodeEscapeEvidence(
110
+ positions: readonly UnicodeEscapePositionEvidence[],
111
+ totalPositions: number,
112
+ truncated: boolean,
113
+ malformed: boolean,
114
+ ): UnicodeEscapeEvidence {
115
+ const evidence = { positions, totalPositions, truncated, malformed };
116
+ return { ...evidence, integrity: unicodeEscapeEvidenceIntegrity(evidence) };
117
+ }
118
+
119
+ /** Verify that an evidence envelope is complete and was produced in this process. */
120
+ export function verifyUnicodeEscapeEvidence(evidence: UnicodeEscapeEvidence): boolean {
121
+ if (
122
+ !Array.isArray(evidence.positions) ||
123
+ evidence.positions.length > MAX_UNICODE_ESCAPE_POSITIONS ||
124
+ !Number.isSafeInteger(evidence.totalPositions) ||
125
+ evidence.totalPositions < evidence.positions.length ||
126
+ (!evidence.truncated && evidence.totalPositions !== evidence.positions.length) ||
127
+ typeof evidence.integrity !== "string" ||
128
+ !/^[0-9a-f]{64}$/.test(evidence.integrity)
129
+ ) {
130
+ return false;
131
+ }
132
+ try {
133
+ const expected = unicodeEscapeEvidenceIntegrity(evidence);
134
+ return crypto.timingSafeEqual(Buffer.from(evidence.integrity, "hex"), Buffer.from(expected, "hex"));
135
+ } catch {
136
+ return false;
137
+ }
138
+ }
139
+
140
+ function isSuspiciousEscapedScalar(codePoint: number): boolean {
141
+ return (codePoint >= 0x20 && codePoint < 0x7f) || codePoint >= 0x80;
142
+ }
143
+
144
+ export function repairJson(json: string): string {
145
+ const len = json.length;
146
+ const parts: string[] = [];
147
+ let lastEmit = 0;
148
+ let inString = false;
149
+ let i = 0;
150
+
151
+ while (i < len) {
152
+ if (!inString) {
153
+ // Fast scan: skip to next quote.
154
+ while (i < len && json.charCodeAt(i) !== QUOTE) i++;
155
+ if (i >= len) break;
156
+ inString = true;
157
+ i++;
158
+ continue;
159
+ }
160
+
161
+ // Fast scan inside string: advance past chars that need no handling.
162
+ while (i < len) {
163
+ const cp = json.charCodeAt(i);
164
+ if (cp < 0x20 || cp === QUOTE || cp === BACKSLASH) break;
165
+ i++;
166
+ }
167
+ if (i >= len) break;
168
+
169
+ const cp = json.charCodeAt(i);
170
+
171
+ if (cp === QUOTE) {
172
+ inString = false;
173
+ i++;
174
+ continue;
175
+ }
176
+
177
+ if (cp === BACKSLASH) {
178
+ // Need at least one char after the backslash; treat EOI as invalid escape.
179
+ if (i + 1 >= len) {
180
+ parts.push(json.slice(lastEmit, i), "\\\\");
181
+ lastEmit = i + 1;
182
+ i++;
183
+ continue;
184
+ }
185
+
186
+ const nextCp = json.charCodeAt(i + 1);
187
+
188
+ if (nextCp === U) {
189
+ // Need full \uXXXX, all four digits, all hex.
190
+ if (
191
+ i + 5 < len &&
192
+ isHexDigit(json.charCodeAt(i + 2)) &&
193
+ isHexDigit(json.charCodeAt(i + 3)) &&
194
+ isHexDigit(json.charCodeAt(i + 4)) &&
195
+ isHexDigit(json.charCodeAt(i + 5))
196
+ ) {
197
+ i += 6;
198
+ continue;
199
+ }
200
+ // Truncated or non-hex \u — escape the backslash, re-process the rest.
201
+ parts.push(json.slice(lastEmit, i), "\\\\");
202
+ lastEmit = i + 1;
203
+ i++;
204
+ continue;
205
+ }
206
+
207
+ if (nextCp < 128 && VALID_ESCAPE_CHAR[nextCp] === 1) {
208
+ i += 2;
209
+ continue;
210
+ }
211
+
212
+ parts.push(json.slice(lastEmit, i), "\\\\");
213
+ lastEmit = i + 1;
214
+ i++;
215
+ continue;
216
+ }
217
+
218
+ // Control character (cp < 0x20).
219
+ parts.push(json.slice(lastEmit, i), CONTROL_ESCAPES[cp]);
220
+ lastEmit = i + 1;
221
+ i++;
222
+ }
223
+
224
+ if (!parts.length) return json;
225
+ if (lastEmit < len) parts.push(json.slice(lastEmit));
226
+ return parts.join("");
227
+ }
228
+
229
+ /**
230
+ * First unnecessary `\uXXXX` escape in a JSON document, or `undefined` when the
231
+ * document contains none.
232
+ *
233
+ * "Unnecessary" means the escape encodes a printable character JSON can carry
234
+ * literally, including ASCII. ASCII must remain observable because one mistyped
235
+ * nibble can move a non-ASCII escape into ASCII (`\u00b7` → `\u0077`). Control
236
+ * characters (< U+0020), DEL, and unpaired surrogates are excluded. A `\\uXXXX`
237
+ * sequence is a literal backslash followed by `u` — the
238
+ * intended source syntax when the model is writing code or a nested JSON
239
+ * document — and is skipped, which is why this scans the raw text with the same
240
+ * string/escape state machine as {@link repairJson} instead of using a regex.
241
+ *
242
+ * Models that spell text as hand-written hex instead of literal characters
243
+ * mistype the digits, and every mistyped nibble silently decodes to a different
244
+ * but perfectly valid character (`\uc7a5` vs `\uc7a4`). The resulting arguments
245
+ * parse cleanly and cannot be repaired after the fact, so the escape itself is
246
+ * the only observable evidence that the payload is untrustworthy.
247
+ */
248
+ export function findUnnecessaryUnicodeEscape(json: string): string | undefined {
249
+ const len = json.length;
250
+ let inString = false;
251
+ let i = 0;
252
+
253
+ const hexAt = (start: number): number | undefined => {
254
+ if (start + 3 >= len) return undefined;
255
+ for (let k = start; k <= start + 3; k++) if (!isHexDigit(json.charCodeAt(k))) return undefined;
256
+ return Number.parseInt(json.slice(start, start + 4), 16);
257
+ };
258
+
259
+ while (i < len) {
260
+ if (!inString) {
261
+ const open = json.indexOf('"', i);
262
+ if (open === -1) return undefined;
263
+ inString = true;
264
+ i = open + 1;
265
+ continue;
266
+ }
267
+
268
+ // Jump straight to the next quote or backslash. A per-character walk costs
269
+ // ~40ms on a 1MB literal-UTF-8 payload (a large `write`), and every byte in
270
+ // between is by definition uninteresting.
271
+ const nextQuote = json.indexOf('"', i);
272
+ const nextBackslash = json.indexOf("\\", i);
273
+ if (nextQuote === -1 && nextBackslash === -1) return undefined;
274
+ i = nextBackslash === -1 || (nextQuote !== -1 && nextQuote < nextBackslash) ? nextQuote : nextBackslash;
275
+
276
+ if (json.charCodeAt(i) === QUOTE) {
277
+ inString = false;
278
+ i++;
279
+ continue;
280
+ }
281
+ if (json.charCodeAt(i + 1) !== U) {
282
+ // Any other escape (including `\\`) consumes its own second character,
283
+ // so a literal `\uXXXX` in the decoded value is never misread as one.
284
+ i += 2;
285
+ continue;
286
+ }
287
+
288
+ const first = hexAt(i + 2);
289
+ if (first === undefined) {
290
+ i += 2;
291
+ continue;
292
+ }
293
+ if (first >= 0xd800 && first <= 0xdbff) {
294
+ // High surrogate: only a completed pair denotes a real character.
295
+ const low = json.charCodeAt(i + 6) === BACKSLASH && json.charCodeAt(i + 7) === U ? hexAt(i + 8) : undefined;
296
+ if (low !== undefined && low >= 0xdc00 && low <= 0xdfff) {
297
+ return json.slice(i, i + 12);
298
+ }
299
+ i += 6;
300
+ continue;
301
+ }
302
+ if (isSuspiciousEscapedScalar(first) && !(first >= 0xdc00 && first <= 0xdfff)) {
303
+ return json.slice(i, i + 6);
304
+ }
305
+ i += 6;
306
+ }
307
+ return undefined;
308
+ }
309
+
310
+ /**
311
+ * Bounded raw-position/scalar evidence for every suspicious `\uXXXX` escape.
312
+ *
313
+ * Scalars and paths are carried only as process-keyed HMAC tags, so terminal
314
+ * validation can match them against decoded arguments without retaining
315
+ * recoverable characters, keys, or values in messages, diagnostics, or durable
316
+ * session artifacts. Array indices are
317
+ * intentionally omitted to preserve `questions.question`-style field matching.
318
+ */
319
+ export function collectUnicodeEscapeEvidence(json: string): UnicodeEscapeEvidence | undefined {
320
+ const firstEscape = findUnnecessaryUnicodeEscape(json);
321
+ if (firstEscape === undefined) return undefined;
322
+
323
+ try {
324
+ JSON.parse(json);
325
+ } catch {
326
+ return createUnicodeEscapeEvidence([], 0, false, true);
327
+ }
328
+
329
+ const positions: UnicodeEscapePositionEvidence[] = [];
330
+ let totalPositions = 0;
331
+ let truncated = false;
332
+ let i = 0;
333
+ const path: string[] = [];
334
+ const valueOrdinals = new Map<string, number>();
335
+
336
+ const push = (
337
+ offset: number,
338
+ codePoint: number,
339
+ pathTag: string,
340
+ location: "key" | "value",
341
+ valueOrdinal: number,
342
+ valueOffset: number,
343
+ ): void => {
344
+ if (!isSuspiciousEscapedScalar(codePoint)) return;
345
+ totalPositions++;
346
+ if (positions.length >= MAX_UNICODE_ESCAPE_POSITIONS) {
347
+ truncated = true;
348
+ return;
349
+ }
350
+ positions.push({
351
+ offset,
352
+ scalarTag: unicodeEscapeScalarTag(codePoint),
353
+ pathTag,
354
+ location,
355
+ valueOrdinal,
356
+ valueOffset,
357
+ });
358
+ };
359
+ const whitespace = (): void => {
360
+ while (i < json.length) {
361
+ const cp = json.charCodeAt(i);
362
+ if (cp !== 0x20 && cp !== 0x09 && cp !== 0x0a && cp !== 0x0d) break;
363
+ i++;
364
+ }
365
+ };
366
+ const string = (location: "key" | "value"): string => {
367
+ const start = i;
368
+ const pathTag = unicodeEscapePathTag(path);
369
+ const valueOrdinal = location === "value" ? (valueOrdinals.get(pathTag) ?? 0) : 0;
370
+ if (location === "value") valueOrdinals.set(pathTag, valueOrdinal + 1);
371
+ let decodedOffset = 0;
372
+ i++;
373
+ while (i < json.length) {
374
+ const cp = json.charCodeAt(i);
375
+ if (cp === QUOTE) {
376
+ i++;
377
+ return JSON.parse(json.slice(start, i)) as string;
378
+ }
379
+ if (cp !== BACKSLASH) {
380
+ i++;
381
+ decodedOffset++;
382
+ continue;
383
+ }
384
+ if (json.charCodeAt(i + 1) !== U) {
385
+ i += 2;
386
+ decodedOffset++;
387
+ continue;
388
+ }
389
+ const offset = i;
390
+ const first = Number.parseInt(json.slice(i + 2, i + 6), 16);
391
+ if (first >= 0xd800 && first <= 0xdbff) {
392
+ const low = Number.parseInt(json.slice(i + 8, i + 12), 16);
393
+ if (
394
+ json.charCodeAt(i + 6) === BACKSLASH &&
395
+ json.charCodeAt(i + 7) === U &&
396
+ low >= 0xdc00 &&
397
+ low <= 0xdfff
398
+ ) {
399
+ push(
400
+ offset,
401
+ 0x10000 + ((first - 0xd800) << 10) + (low - 0xdc00),
402
+ pathTag,
403
+ location,
404
+ valueOrdinal,
405
+ decodedOffset,
406
+ );
407
+ i += 12;
408
+ decodedOffset += 2;
409
+ continue;
410
+ }
411
+ } else if (!(first >= 0xdc00 && first <= 0xdfff)) {
412
+ push(offset, first, pathTag, location, valueOrdinal, decodedOffset);
413
+ }
414
+ i += 6;
415
+ decodedOffset++;
416
+ }
417
+ throw new Error("validated JSON string ended unexpectedly");
418
+ };
419
+ const value = (depth: number): void => {
420
+ if (depth > MAX_UNICODE_ESCAPE_DEPTH) throw new Error("Unicode escape evidence nesting exceeded");
421
+ whitespace();
422
+ const cp = json.charCodeAt(i);
423
+ if (cp === QUOTE) {
424
+ string("value");
425
+ return;
426
+ }
427
+ if (cp === 0x7b) {
428
+ i++;
429
+ const keys = new Set<string>();
430
+ whitespace();
431
+ if (json.charCodeAt(i) === 0x7d) {
432
+ i++;
433
+ return;
434
+ }
435
+ while (i < json.length) {
436
+ whitespace();
437
+ const key = string("key");
438
+ if (keys.has(key)) throw new Error("Duplicate JSON object key");
439
+ keys.add(key);
440
+ whitespace();
441
+ i++;
442
+ path.push(key);
443
+ value(depth + 1);
444
+ path.pop();
445
+ whitespace();
446
+ if (json.charCodeAt(i) === 0x7d) {
447
+ i++;
448
+ return;
449
+ }
450
+ i++;
451
+ }
452
+ return;
453
+ }
454
+ if (cp === 0x5b) {
455
+ i++;
456
+ whitespace();
457
+ if (json.charCodeAt(i) === 0x5d) {
458
+ i++;
459
+ return;
460
+ }
461
+ while (i < json.length) {
462
+ value(depth + 1);
463
+ whitespace();
464
+ if (json.charCodeAt(i) === 0x5d) {
465
+ i++;
466
+ return;
467
+ }
468
+ i++;
469
+ }
470
+ return;
471
+ }
472
+ while (i < json.length) {
473
+ const delimiter = json.charCodeAt(i);
474
+ if (delimiter === 0x2c || delimiter === 0x5d || delimiter === 0x7d) return;
475
+ i++;
476
+ }
477
+ };
478
+
479
+ try {
480
+ value(0);
481
+ } catch {
482
+ return createUnicodeEscapeEvidence([], 0, false, true);
483
+ }
484
+ return createUnicodeEscapeEvidence(positions, totalPositions, truncated, false);
485
+ }
486
+
487
+ function hasUnpairedUnicodeSurrogate(value: unknown): boolean {
488
+ const pending: unknown[] = [value];
489
+ while (pending.length > 0) {
490
+ const current = pending.pop();
491
+ if (typeof current === "string") {
492
+ if (!current.isWellFormed()) return true;
493
+ continue;
494
+ }
495
+ if (typeof current !== "object" || current === null) continue;
496
+ if (Array.isArray(current)) {
497
+ for (const child of current) pending.push(child);
498
+ continue;
499
+ }
500
+ for (const [key, child] of Object.entries(current)) {
501
+ if (!key.isWellFormed()) return true;
502
+ pending.push(child);
503
+ }
504
+ }
505
+ return false;
506
+ }
507
+
508
+ /**
509
+ * Return evidence only when decoded tool arguments are unsafe to execute.
510
+ *
511
+ * Valid JSON escapes and literal UTF-8 have the same canonical decoded value,
512
+ * including a valid scalar whose hex digits differ from what a caller intended:
513
+ * runtime syntax validation cannot infer author intent after decoding.
514
+ * Malformed escape-bearing JSON, duplicate/deep suspicious escape evidence, and
515
+ * unpaired UTF-16 surrogates keep the fail-closed path.
516
+ */
517
+ export function collectUnsafeUnicodeEscapeEvidence(json: string): UnicodeEscapeEvidence | undefined {
518
+ const hasUnicodeEscape = json.includes("\\u");
519
+ if (!hasUnicodeEscape && json.isWellFormed()) return undefined;
520
+ const evidence = hasUnicodeEscape ? collectUnicodeEscapeEvidence(json) : undefined;
521
+ if (evidence?.malformed) return evidence;
522
+ try {
523
+ if (hasUnpairedUnicodeSurrogate(JSON.parse(json))) {
524
+ return createUnicodeEscapeEvidence([], 0, false, true);
525
+ }
526
+ } catch {
527
+ return createUnicodeEscapeEvidence([], 0, false, true);
528
+ }
529
+ return undefined;
530
+ }
531
+
532
+ /** Attach unsafe raw evidence while preserving the existing call-level guard flag. */
533
+ export function captureUnicodeEscapeEvidence(target: UnicodeEscapeEvidenceTarget, json: string): boolean {
534
+ const evidence = collectUnsafeUnicodeEscapeEvidence(json);
535
+ if (!evidence) return false;
536
+ attachUnicodeEscapeEvidence(target, evidence);
537
+ return true;
538
+ }
539
+
540
+ /** Attach evidence as transient, non-enumerable metadata excluded from serialization. */
541
+ export function attachUnicodeEscapeEvidence(
542
+ target: UnicodeEscapeEvidenceTarget,
543
+ evidence: UnicodeEscapeEvidence,
544
+ ): void {
545
+ target.escapedNonAsciiArguments = true;
546
+ Object.defineProperty(target, "escapedUnicodeArgumentEvidence", {
547
+ value: evidence,
548
+ writable: true,
549
+ configurable: true,
550
+ enumerable: false,
551
+ });
552
+ }
553
+
554
+ export function parseJsonWithRepair<T>(json: string): T {
555
+ try {
556
+ return JSON.parse(json) as T;
557
+ } catch (error) {
558
+ const repairedJson = repairJson(json);
559
+ if (repairedJson !== json) {
560
+ return JSON.parse(repairedJson) as T;
561
+ }
562
+ throw error;
563
+ }
564
+ }
565
+
566
+ /**
567
+ * Attempts to parse potentially incomplete JSON during streaming.
568
+ * Always returns a valid object, even if the JSON is incomplete.
569
+ *
570
+ * @param partialJson The partial JSON string from streaming
571
+ * @returns Parsed object or empty object if parsing fails
572
+ */
573
+ export function parseStreamingJson<T = Record<string, unknown>>(partialJson: string | undefined): T {
574
+ partialJson = partialJson?.trimStart();
575
+ if (!partialJson) {
576
+ return {} as T;
577
+ }
578
+ try {
579
+ return JSON.parse(partialJson) as T;
580
+ } catch {
581
+ partialJson = repairJson(partialJson);
582
+ try {
583
+ return (partialParse(partialJson) ?? {}) as T;
584
+ } catch {
585
+ // If all parsing fails, return empty object
586
+ return {} as T;
587
+ }
588
+ }
589
+ }
590
+
591
+ /**
592
+ * Whether a string is a complete, well-formed JSON document (strict parse, no
593
+ * repair). Used to distinguish a tool-call argument blob that finished cleanly
594
+ * from one that was cut off mid-stream (truncation). An empty / whitespace-only
595
+ * string is treated as complete: a tool invoked with no arguments legitimately
596
+ * streams an empty buffer and must not be flagged as truncated.
597
+ */
598
+ export function isCompleteJson(text: string | undefined): boolean {
599
+ const trimmed = text?.trim();
600
+ if (!trimmed) return true;
601
+ try {
602
+ JSON.parse(trimmed);
603
+ return true;
604
+ } catch {
605
+ return false;
606
+ }
607
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Alibaba Token Plan login flow.
3
+ *
4
+ * Alibaba Token Plan provides OpenAI-compatible models via
5
+ * https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1.
6
+ *
7
+ * This is not OAuth - it's a simple API key flow:
8
+ * 1. Open browser to Alibaba Cloud Model Studio console
9
+ * 2. User copies their API key
10
+ * 3. User pastes the API key into the CLI
11
+ */
12
+
13
+ import { validateOpenAICompatibleApiKey } from "./api-key-validation";
14
+ import type { OAuthController } from "./types";
15
+
16
+ const AUTH_URL = "https://modelstudio.console.alibabacloud.com/";
17
+ const API_BASE_URL = "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1";
18
+ const VALIDATION_MODEL = "deepseek-v4-pro";
19
+
20
+ /**
21
+ * Login to Alibaba Token Plan.
22
+ *
23
+ * Opens browser to API keys page, prompts user to paste their API key.
24
+ * Returns the API key directly (not OAuthCredentials - this isn't OAuth).
25
+ */
26
+ export async function loginAlibabaTokenPlan(options: OAuthController): Promise<string> {
27
+ if (!options.onPrompt) {
28
+ throw new Error("Alibaba Token Plan login requires onPrompt callback");
29
+ }
30
+
31
+ options.onAuth?.({
32
+ url: AUTH_URL,
33
+ instructions: "Copy your API key from the Alibaba Cloud Model Studio console",
34
+ });
35
+
36
+ const apiKey = await options.onPrompt({
37
+ message: "Paste your Alibaba Token Plan API key",
38
+ placeholder: "sk-...",
39
+ });
40
+
41
+ if (options.signal?.aborted) {
42
+ throw new Error("Login cancelled");
43
+ }
44
+
45
+ const trimmed = apiKey.trim();
46
+ if (!trimmed) {
47
+ throw new Error("API key is required");
48
+ }
49
+
50
+ options.onProgress?.("Validating API key...");
51
+ await validateOpenAICompatibleApiKey({
52
+ provider: "Alibaba Token Plan",
53
+ apiKey: trimmed,
54
+ baseUrl: API_BASE_URL,
55
+ model: VALIDATION_MODEL,
56
+ signal: options.signal,
57
+ });
58
+
59
+ return trimmed;
60
+ }