@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,410 @@
1
+ import { $env } from "@vib-rato/utils";
2
+ import { STREAM_FIRST_EVENT_TIMEOUT_PROVIDER_CODE } from "./fallback-transport";
3
+
4
+ const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 120_000;
5
+ const DEFAULT_STREAM_FIRST_EVENT_TIMEOUT_MS = 100_000;
6
+ const ALIBABA_TOKEN_PLAN_FIRST_EVENT_TIMEOUT_MS = 600_000;
7
+ const KIMI_CODE_FIRST_EVENT_TIMEOUT_MS = 300_000;
8
+ // Local LM Studio models can spend several minutes loading weights and filling
9
+ // the prompt before emitting their first SSE event. Keep the shared default
10
+ // for other OpenAI-compatible providers, but avoid aborting legitimate local
11
+ // inference during that startup window.
12
+ const LM_STUDIO_FIRST_EVENT_TIMEOUT_MS = 300_000;
13
+ // Ollama Cloud is a hosted proxy where queueing/cold-start plus long prefill
14
+ // (thinking-mode requests over 1M-context sessions) routinely exceeds 120s before
15
+ // the first streamed token; 300s matches kimi-code's floor for long-reasoning silence.
16
+ const OLLAMA_CLOUD_FIRST_EVENT_TIMEOUT_MS = 300_000;
17
+
18
+ const ANTHROPIC_STREAM_IDLE_TIMEOUT_MS = 300_000;
19
+
20
+ export function getProviderStreamIdleTimeoutFallbackMs(provider: string): number | undefined {
21
+ if (provider === "anthropic" || provider === "xai" || provider === "grok-build") {
22
+ return ANTHROPIC_STREAM_IDLE_TIMEOUT_MS;
23
+ }
24
+ return undefined;
25
+ }
26
+
27
+ // Grok models behind OpenAI-compatible hosts keep the model id (or an
28
+ // `x-ai/`-prefixed OpenRouter id) even when `provider` is openrouter, kilo,
29
+ // litellm, zenmux, venice, and similar. The long-reasoning silence that
30
+ // motivates the 300s floor is a property of the model, not the account
31
+ // used to reach it, so the floor keys on the model when the provider alone
32
+ // does not already grant it (#4797).
33
+ const GROK_MODEL_ID_PATTERN = /(?:^|[/._-])grok(?:[/._-]|$)/i;
34
+
35
+ export function isGrokModelId(modelId: string | undefined): boolean {
36
+ if (!modelId) return false;
37
+ return GROK_MODEL_ID_PATTERN.test(modelId);
38
+ }
39
+
40
+ export function getProviderFirstEventTimeoutFallbackMs(provider: string): number | undefined {
41
+ if (provider === "alibaba-token-plan") return ALIBABA_TOKEN_PLAN_FIRST_EVENT_TIMEOUT_MS;
42
+ if (provider === "lm-studio") return LM_STUDIO_FIRST_EVENT_TIMEOUT_MS;
43
+ if (provider === "ollama-cloud") return OLLAMA_CLOUD_FIRST_EVENT_TIMEOUT_MS;
44
+ return provider === "kimi-code" ? KIMI_CODE_FIRST_EVENT_TIMEOUT_MS : undefined;
45
+ }
46
+
47
+ function normalizeIdleTimeoutMs(value: string | undefined, fallback: number): number | undefined {
48
+ if (value === undefined) return fallback;
49
+ const parsed = Number(value);
50
+ if (!Number.isFinite(parsed)) return fallback;
51
+ if (parsed <= 0) return undefined;
52
+ return Math.trunc(parsed);
53
+ }
54
+
55
+ /**
56
+ * Returns the idle timeout used for provider streaming transports.
57
+ *
58
+ * `VIB_OPENAI_STREAM_IDLE_TIMEOUT_MS` is honored first; `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` is a backward-compatible alias.
59
+ * Set `PI_STREAM_IDLE_TIMEOUT_MS=0` to disable the watchdog.
60
+ *
61
+ * Providers that legitimately stream much slower than the global default can pass
62
+ * `fallbackMs` to widen the floor used when neither env var nor caller option is set.
63
+ * Caller options still take precedence; env overrides still trump the fallback.
64
+ */
65
+ export function getStreamIdleTimeoutMs(fallbackMs: number = DEFAULT_STREAM_IDLE_TIMEOUT_MS): number | undefined {
66
+ return normalizeIdleTimeoutMs(
67
+ $env.VIB_OPENAI_STREAM_IDLE_TIMEOUT_MS ?? $env.PI_STREAM_IDLE_TIMEOUT_MS ?? $env.PI_OPENAI_STREAM_IDLE_TIMEOUT_MS,
68
+ fallbackMs,
69
+ );
70
+ }
71
+
72
+ /**
73
+ * Returns the idle timeout used for OpenAI-family streaming transports.
74
+ *
75
+ * Honors `VIB_OPENAI_STREAM_IDLE_TIMEOUT_MS` first (`PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` is the legacy alias). Set `=0` to disable.
76
+ * When `provider` is given, long-reasoning hosts (xAI Grok and Grok Build) use that floor instead of the 120s default.
77
+ * Grok models reached through other OpenAI-compatible hosts (`openrouter/x-ai/grok-*`, kilo, litellm, …) get the
78
+ * same floor keyed on the model id, because long-reasoning silence is a property of the model (#4797).
79
+ */
80
+ export function getOpenAIStreamIdleTimeoutMs(provider?: string, modelId?: string): number | undefined {
81
+ return normalizeIdleTimeoutMs(
82
+ $env.VIB_OPENAI_STREAM_IDLE_TIMEOUT_MS ?? $env.PI_STREAM_IDLE_TIMEOUT_MS ?? $env.PI_OPENAI_STREAM_IDLE_TIMEOUT_MS,
83
+ getProviderStreamIdleTimeoutFallbackMs(provider ?? "") ??
84
+ (isGrokModelId(modelId) ? ANTHROPIC_STREAM_IDLE_TIMEOUT_MS : undefined) ??
85
+ DEFAULT_STREAM_IDLE_TIMEOUT_MS,
86
+ );
87
+ }
88
+
89
+ /**
90
+ * Returns the timeout used while waiting for the first stream event.
91
+ * The first token can legitimately take longer than later inter-event gaps,
92
+ * so the default never undershoots the steady-state idle timeout.
93
+ *
94
+ * Set `PI_STREAM_FIRST_EVENT_TIMEOUT_MS=0` to disable the watchdog.
95
+ *
96
+ * Providers whose first response can legitimately take longer (heavy reasoning,
97
+ * slow cold-start proxies) can pass `fallbackMs` to widen the floor used when
98
+ * neither env var nor caller option is set. Caller options still take precedence;
99
+ * env overrides still trump the fallback.
100
+ */
101
+ export function getStreamFirstEventTimeoutMs(
102
+ idleTimeoutMs?: number,
103
+ fallbackMs: number = DEFAULT_STREAM_FIRST_EVENT_TIMEOUT_MS,
104
+ ): number | undefined {
105
+ const fallback = idleTimeoutMs === undefined ? fallbackMs : Math.max(fallbackMs, idleTimeoutMs);
106
+ return normalizeIdleTimeoutMs($env.PI_STREAM_FIRST_EVENT_TIMEOUT_MS, fallback);
107
+ }
108
+
109
+ /**
110
+ * Resolves the OpenAI SDK client `timeout` so stalled-before-headers requests are
111
+ * bounded by the same first-event window the transport watchdog uses after
112
+ * `create()` returns. Without this, providers that only arm
113
+ * `iterateWithIdleTimeout` post-setup can wait the full SDK default (10 minutes
114
+ * per attempt) before any provider-owned watchdog exists.
115
+ *
116
+ * - Explicit `0` disables the request timeout (the SDK treats `timeout: 0` as an
117
+ * immediate failure, so callers that disable the first-event watchdog must not
118
+ * pass a timeout).
119
+ * - Providers with a first-event fallback (Alibaba, Kimi) honor an explicit
120
+ * nonzero override as-is, even when shorter than the fallback.
121
+ * - Other providers floor an explicit override at the env/default first-event
122
+ * window so a short post-connect first-event budget cannot kill legitimate
123
+ * slow setup.
124
+ */
125
+ export function resolveOpenAISdkRequestTimeoutMs(
126
+ provider: string,
127
+ streamFirstEventTimeoutOverride?: number,
128
+ modelId?: string,
129
+ ): number | undefined {
130
+ const providerFirstEventFallbackMs = getProviderFirstEventTimeoutFallbackMs(provider);
131
+ const envSdkTimeoutMs = getStreamFirstEventTimeoutMs(
132
+ getOpenAIStreamIdleTimeoutMs(provider, modelId),
133
+ providerFirstEventFallbackMs,
134
+ );
135
+ if (streamFirstEventTimeoutOverride === 0) return undefined;
136
+ if (streamFirstEventTimeoutOverride !== undefined) {
137
+ return providerFirstEventFallbackMs !== undefined
138
+ ? streamFirstEventTimeoutOverride
139
+ : Math.max(envSdkTimeoutMs ?? 0, streamFirstEventTimeoutOverride);
140
+ }
141
+ return envSdkTimeoutMs;
142
+ }
143
+
144
+ /**
145
+ * Resolves the Anthropic SDK client `timeout` so stalled-before-headers requests
146
+ * are bounded. The Anthropic first-event watchdog deliberately arms only once
147
+ * response headers have arrived (setup latency must not consume the first-event
148
+ * budget), which left the connect/headers phase governed solely by the SDK
149
+ * default of 10 minutes per attempt — multiplied by SDK-internal retries, a
150
+ * connection that silently died right after a completed tool call could spin
151
+ * with no user-visible error for the better part of an hour.
152
+ *
153
+ * - Explicit `0` disables the request timeout, matching a disabled first-event
154
+ * watchdog.
155
+ * - An explicit nonzero override is floored at the env/default first-event
156
+ * window (which itself never undershoots the provider idle window) so a short
157
+ * post-connect first-event budget cannot kill legitimate slow setup.
158
+ */
159
+ export function resolveAnthropicSdkRequestTimeoutMs(
160
+ provider: string,
161
+ streamFirstEventTimeoutOverride?: number,
162
+ streamIdleTimeoutOverride?: number,
163
+ ): number | undefined {
164
+ const idleTimeoutMs =
165
+ streamIdleTimeoutOverride ?? getStreamIdleTimeoutMs(getProviderStreamIdleTimeoutFallbackMs(provider));
166
+ const envSdkTimeoutMs = getStreamFirstEventTimeoutMs(
167
+ idleTimeoutMs,
168
+ getProviderFirstEventTimeoutFallbackMs(provider),
169
+ );
170
+ if (streamFirstEventTimeoutOverride === 0) return undefined;
171
+ if (streamFirstEventTimeoutOverride !== undefined) {
172
+ return Math.max(envSdkTimeoutMs ?? 0, streamFirstEventTimeoutOverride);
173
+ }
174
+ return envSdkTimeoutMs;
175
+ }
176
+
177
+ export type Watchdog = NodeJS.Timeout | undefined;
178
+ export interface FirstEventTimeoutFacts {
179
+ requestBytes?: number;
180
+ firstEventElapsedMs?: number;
181
+ firstEventTimeoutMs?: number;
182
+ endpointClass?: "canonical" | "custom";
183
+ retryMaxAttempts?: number;
184
+ }
185
+
186
+ export class FirstEventTimeoutError extends Error {
187
+ readonly providerCode = STREAM_FIRST_EVENT_TIMEOUT_PROVIDER_CODE;
188
+ readonly requestBytes?: number;
189
+ readonly firstEventElapsedMs?: number;
190
+ readonly firstEventTimeoutMs?: number;
191
+ readonly endpointClass?: "canonical" | "custom";
192
+ readonly retryMaxAttempts?: number;
193
+
194
+ constructor(message: string, facts: FirstEventTimeoutFacts = {}) {
195
+ super(message);
196
+ this.name = "FirstEventTimeoutError";
197
+ this.requestBytes = facts.requestBytes;
198
+ this.firstEventElapsedMs = facts.firstEventElapsedMs;
199
+ this.firstEventTimeoutMs = facts.firstEventTimeoutMs;
200
+ this.endpointClass = facts.endpointClass;
201
+ this.retryMaxAttempts = facts.retryMaxAttempts;
202
+ }
203
+ }
204
+
205
+ const dummyWatchdog = setTimeout(() => {}, 1);
206
+ clearTimeout(dummyWatchdog);
207
+
208
+ /**
209
+ * Starts a watchdog that aborts a request if no first stream event arrives in time.
210
+ * Call `markFirstEventReceived()` as soon as the first event is observed.
211
+ */
212
+ export function createWatchdog(timeoutMs: number | undefined, onTimeout: () => void): Watchdog {
213
+ if (timeoutMs !== undefined && timeoutMs > 0) {
214
+ return setTimeout(onTimeout, timeoutMs);
215
+ }
216
+ return undefined;
217
+ }
218
+
219
+ export interface IdleTimeoutIteratorOptions {
220
+ watchdog?: Watchdog;
221
+ idleTimeoutMs?: number;
222
+ firstItemTimeoutMs?: number;
223
+ errorMessage: string;
224
+ firstItemErrorMessage?: string;
225
+ onIdle?: () => void;
226
+ onFirstItemTimeout?: () => void;
227
+ /**
228
+ * Optional semantic-progress predicate. Non-progress items are still yielded,
229
+ * but they do not reset the idle deadline. This prevents provider
230
+ * keepalive/no-op events from keeping a stalled tool call alive forever.
231
+ */
232
+ isProgressItem?: (item: unknown) => boolean;
233
+ /**
234
+ * Cancel iteration as soon as this signal aborts. Required for caller-driven
235
+ * cancellation (ESC) when the underlying transport does not surface signal
236
+ * aborts to the iterator (HTTP/2 proxies, native sockets, mocked fetch).
237
+ * Without this, the consumer sleeps on iterator.next() until the idle/first
238
+ * -event watchdog fires — observable as the issue #912 "Working… forever"
239
+ * symptom on the github-copilot provider.
240
+ */
241
+ abortSignal?: AbortSignal;
242
+ }
243
+
244
+ /**
245
+ * Yields items from an async iterable while enforcing a maximum idle gap between items.
246
+ *
247
+ * The first item may use a shorter timeout so stuck requests can be aborted and retried
248
+ * before any user-visible content has streamed.
249
+ */
250
+ export async function* iterateWithIdleTimeout<T>(
251
+ iterable: AsyncIterable<T>,
252
+ options: IdleTimeoutIteratorOptions,
253
+ ): AsyncGenerator<T> {
254
+ let watchdog = options.watchdog;
255
+ const firstItemTimeoutMs = options.firstItemTimeoutMs ?? options.idleTimeoutMs;
256
+ const abortSignal = options.abortSignal;
257
+ const iterator = iterable[Symbol.asyncIterator]();
258
+
259
+ const closeIterator = (): void => {
260
+ const returnPromise = iterator.return?.();
261
+ if (returnPromise) {
262
+ void returnPromise.catch(() => {});
263
+ }
264
+ };
265
+
266
+ if (abortSignal?.aborted) {
267
+ closeIterator();
268
+ throw abortReason(abortSignal);
269
+ }
270
+
271
+ const withRacy = <T>(promise: Promise<T>) =>
272
+ promise.then(
273
+ result => ({ kind: "next" as const, result }),
274
+ error => ({ kind: "error" as const, error }),
275
+ );
276
+
277
+ let awaitingFirstItem = true;
278
+ const markFirstItemReceived = () => {
279
+ watchdog && clearTimeout(watchdog);
280
+ watchdog = undefined;
281
+ awaitingFirstItem = false;
282
+ };
283
+ const isProgressItem = (item: T): boolean => {
284
+ if (!options.isProgressItem) return true;
285
+ try {
286
+ return options.isProgressItem(item);
287
+ } catch {
288
+ return true;
289
+ }
290
+ };
291
+ let lastProgressAt = Date.now();
292
+ const firstItemDeadlineAt =
293
+ firstItemTimeoutMs !== undefined && firstItemTimeoutMs > 0 ? Date.now() + firstItemTimeoutMs : undefined;
294
+
295
+ const noTimeoutEnforced =
296
+ (firstItemTimeoutMs === undefined || firstItemTimeoutMs <= 0) &&
297
+ (options.idleTimeoutMs === undefined || options.idleTimeoutMs <= 0);
298
+
299
+ while (true) {
300
+ let activeTimeoutMs: number | undefined;
301
+ if (awaitingFirstItem) {
302
+ activeTimeoutMs =
303
+ firstItemDeadlineAt === undefined ? undefined : Math.max(0, firstItemDeadlineAt - Date.now());
304
+ } else if (options.idleTimeoutMs !== undefined && options.idleTimeoutMs > 0) {
305
+ activeTimeoutMs = options.idleTimeoutMs - (Date.now() - lastProgressAt);
306
+ // The idle deadline may already have elapsed because the *consumer*
307
+ // was slow, not because the provider stalled — and the next item may
308
+ // already be buffered and ready to deliver. Clamp to 0 instead of
309
+ // throwing eagerly so the next() race below still gets a chance to
310
+ // win (it settles on a microtask, ahead of the 0ms timer). Only a
311
+ // genuinely hung iterator loses that race and surfaces as a stall.
312
+ if (activeTimeoutMs < 0) {
313
+ activeTimeoutMs = 0;
314
+ }
315
+ }
316
+
317
+ const racers: Array<
318
+ Promise<
319
+ | { kind: "next"; result: IteratorResult<T> }
320
+ | { kind: "error"; error: unknown }
321
+ | { kind: "timeout" }
322
+ | { kind: "abort" }
323
+ >
324
+ > = [];
325
+
326
+ let timer: NodeJS.Timeout | undefined;
327
+ let resolveTimeout: ((value: { kind: "timeout" }) => void) | undefined;
328
+ const enforceTimeout = !noTimeoutEnforced && activeTimeoutMs !== undefined && activeTimeoutMs >= 0;
329
+ if (enforceTimeout) {
330
+ const { promise, resolve } = Promise.withResolvers<{ kind: "timeout" }>();
331
+ resolveTimeout = resolve;
332
+ timer = setTimeout(() => resolve({ kind: "timeout" }), activeTimeoutMs);
333
+ racers.push(promise);
334
+ }
335
+
336
+ let abortListener: (() => void) | undefined;
337
+ let resolveAbort: ((value: { kind: "abort" }) => void) | undefined;
338
+ if (abortSignal) {
339
+ const { promise, resolve } = Promise.withResolvers<{ kind: "abort" }>();
340
+ resolveAbort = resolve;
341
+ abortListener = () => resolve({ kind: "abort" });
342
+ abortSignal.addEventListener("abort", abortListener, { once: true });
343
+ racers.push(promise);
344
+ }
345
+
346
+ // Arm timeout/abort races before asking the source for its next item. A
347
+ // periodic keepalive iterator commonly registers its own timer inside
348
+ // `next()`; registering that first lets equal-deadline keepalives win every
349
+ // race and extend the idle window forever. Already-buffered items still
350
+ // settle as microtasks before a 0ms watchdog.
351
+ racers.unshift(withRacy(iterator.next()));
352
+
353
+ try {
354
+ const outcome = await Promise.race(racers);
355
+ if (outcome.kind === "abort") {
356
+ closeIterator();
357
+ throw abortReason(abortSignal!);
358
+ }
359
+ if (outcome.kind === "timeout") {
360
+ if (!awaitingFirstItem) {
361
+ options.onIdle?.();
362
+ } else {
363
+ options.onFirstItemTimeout?.();
364
+ }
365
+ closeIterator();
366
+ throw awaitingFirstItem
367
+ ? new FirstEventTimeoutError(options.firstItemErrorMessage ?? options.errorMessage)
368
+ : new Error(options.errorMessage);
369
+ }
370
+ if (outcome.kind === "error") {
371
+ throw outcome.error;
372
+ }
373
+ if (awaitingFirstItem && firstItemDeadlineAt !== undefined && Date.now() >= firstItemDeadlineAt) {
374
+ options.onFirstItemTimeout?.();
375
+ closeIterator();
376
+ throw new FirstEventTimeoutError(options.firstItemErrorMessage ?? options.errorMessage);
377
+ }
378
+ if (outcome.result.done) {
379
+ markFirstItemReceived();
380
+ return;
381
+ }
382
+ const item = outcome.result.value;
383
+ // Non-progress items (e.g. provider keepalives, synthetic `start` events that
384
+ // arrive before the model has produced any tokens) MUST NOT flip us out of
385
+ // `awaitingFirstItem`. Otherwise the next iteration switches from the (longer)
386
+ // first-item watchdog to the (shorter) idle watchdog while we're still waiting
387
+ // on the model's first real output.
388
+ if (isProgressItem(item)) {
389
+ markFirstItemReceived();
390
+ lastProgressAt = Date.now();
391
+ }
392
+ yield item;
393
+ } finally {
394
+ if (timer !== undefined) clearTimeout(timer);
395
+ // Resolve dangling promises so the racers don't leak (Promise.race is one-shot).
396
+ resolveTimeout?.({ kind: "timeout" });
397
+ if (abortListener && abortSignal) {
398
+ abortSignal.removeEventListener("abort", abortListener);
399
+ }
400
+ resolveAbort?.({ kind: "abort" });
401
+ }
402
+ }
403
+ }
404
+
405
+ function abortReason(signal: AbortSignal): Error {
406
+ const reason = signal.reason;
407
+ if (reason instanceof Error) return reason;
408
+ if (typeof reason === "string") return new Error(reason);
409
+ return new Error("Request was aborted");
410
+ }
@@ -0,0 +1,98 @@
1
+ export interface UnicodeEscapePositionEvidence {
2
+ /** UTF-16 offset of the escape's leading backslash in the raw JSON. */
3
+ readonly offset: number;
4
+ /** Process-keyed tag of the encoded scalar; never the recoverable character. */
5
+ readonly scalarTag: string;
6
+ /** Process-keyed tag of the unambiguous array-index-free path; never raw field names. */
7
+ readonly pathTag: string;
8
+ /** Escapes in object keys are structural and can never be display-safe. */
9
+ readonly location: "key" | "value";
10
+ /** Ordinal of this string among values sharing the array-index-free path. */
11
+ readonly valueOrdinal: number;
12
+ /** UTF-16 offset of the decoded scalar inside that string value. */
13
+ readonly valueOffset: number;
14
+ }
15
+ export interface UnicodeEscapeEvidence {
16
+ readonly positions: readonly UnicodeEscapePositionEvidence[];
17
+ /** Total qualifying escapes observed, including positions omitted by the cap. */
18
+ readonly totalPositions: number;
19
+ /** More qualifying escapes existed than the bounded evidence can carry. */
20
+ readonly truncated: boolean;
21
+ /** The raw JSON could not be mapped exactly and unambiguously; validation must fail closed. */
22
+ readonly malformed: boolean;
23
+ /** Process-local HMAC binding the complete collector-produced envelope. */
24
+ readonly integrity: string;
25
+ }
26
+ interface UnicodeEscapeEvidenceTarget {
27
+ escapedNonAsciiArguments?: boolean;
28
+ escapedUnicodeArgumentEvidence?: UnicodeEscapeEvidence;
29
+ }
30
+ /** Stable, payload-free identity for an unambiguous array-index-free argument path. */
31
+ export declare function unicodeEscapePathTag(path: readonly string[]): string;
32
+ /** Process-keyed scalar identity used without retaining recoverable argument text. */
33
+ export declare function unicodeEscapeScalarTag(codePoint: number): string;
34
+ /** Verify that an evidence envelope is complete and was produced in this process. */
35
+ export declare function verifyUnicodeEscapeEvidence(evidence: UnicodeEscapeEvidence): boolean;
36
+ export declare function repairJson(json: string): string;
37
+ /**
38
+ * First unnecessary `\uXXXX` escape in a JSON document, or `undefined` when the
39
+ * document contains none.
40
+ *
41
+ * "Unnecessary" means the escape encodes a printable character JSON can carry
42
+ * literally, including ASCII. ASCII must remain observable because one mistyped
43
+ * nibble can move a non-ASCII escape into ASCII (`\u00b7` → `\u0077`). Control
44
+ * characters (< U+0020), DEL, and unpaired surrogates are excluded. A `\\uXXXX`
45
+ * sequence is a literal backslash followed by `u` — the
46
+ * intended source syntax when the model is writing code or a nested JSON
47
+ * document — and is skipped, which is why this scans the raw text with the same
48
+ * string/escape state machine as {@link repairJson} instead of using a regex.
49
+ *
50
+ * Models that spell text as hand-written hex instead of literal characters
51
+ * mistype the digits, and every mistyped nibble silently decodes to a different
52
+ * but perfectly valid character (`\uc7a5` vs `\uc7a4`). The resulting arguments
53
+ * parse cleanly and cannot be repaired after the fact, so the escape itself is
54
+ * the only observable evidence that the payload is untrustworthy.
55
+ */
56
+ export declare function findUnnecessaryUnicodeEscape(json: string): string | undefined;
57
+ /**
58
+ * Bounded raw-position/scalar evidence for every suspicious `\uXXXX` escape.
59
+ *
60
+ * Scalars and paths are carried only as process-keyed HMAC tags, so terminal
61
+ * validation can match them against decoded arguments without retaining
62
+ * recoverable characters, keys, or values in messages, diagnostics, or durable
63
+ * session artifacts. Array indices are
64
+ * intentionally omitted to preserve `questions.question`-style field matching.
65
+ */
66
+ export declare function collectUnicodeEscapeEvidence(json: string): UnicodeEscapeEvidence | undefined;
67
+ /**
68
+ * Return evidence only when decoded tool arguments are unsafe to execute.
69
+ *
70
+ * Valid JSON escapes and literal UTF-8 have the same canonical decoded value,
71
+ * including a valid scalar whose hex digits differ from what a caller intended:
72
+ * runtime syntax validation cannot infer author intent after decoding.
73
+ * Malformed escape-bearing JSON, duplicate/deep suspicious escape evidence, and
74
+ * unpaired UTF-16 surrogates keep the fail-closed path.
75
+ */
76
+ export declare function collectUnsafeUnicodeEscapeEvidence(json: string): UnicodeEscapeEvidence | undefined;
77
+ /** Attach unsafe raw evidence while preserving the existing call-level guard flag. */
78
+ export declare function captureUnicodeEscapeEvidence(target: UnicodeEscapeEvidenceTarget, json: string): boolean;
79
+ /** Attach evidence as transient, non-enumerable metadata excluded from serialization. */
80
+ export declare function attachUnicodeEscapeEvidence(target: UnicodeEscapeEvidenceTarget, evidence: UnicodeEscapeEvidence): void;
81
+ export declare function parseJsonWithRepair<T>(json: string): T;
82
+ /**
83
+ * Attempts to parse potentially incomplete JSON during streaming.
84
+ * Always returns a valid object, even if the JSON is incomplete.
85
+ *
86
+ * @param partialJson The partial JSON string from streaming
87
+ * @returns Parsed object or empty object if parsing fails
88
+ */
89
+ export declare function parseStreamingJson<T = Record<string, unknown>>(partialJson: string | undefined): T;
90
+ /**
91
+ * Whether a string is a complete, well-formed JSON document (strict parse, no
92
+ * repair). Used to distinguish a tool-call argument blob that finished cleanly
93
+ * from one that was cut off mid-stream (truncation). An empty / whitespace-only
94
+ * string is treated as complete: a tool invoked with no arguments legitimately
95
+ * streams an empty buffer and must not be flagged as truncated.
96
+ */
97
+ export declare function isCompleteJson(text: string | undefined): boolean;
98
+ export {};