@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,12 @@
1
+ /** True when a JSON Schema node describes an object (explicit `type` or `properties`). */
2
+ export declare function isJsonSchemaObjectNode(schema: Record<string, unknown>): boolean;
3
+ /**
4
+ * Flatten a provider-emitted tool ROOT whose top level is a `oneOf`/`anyOf`/`allOf`
5
+ * combinator into one `type: "object"` schema: merge object-branch properties,
6
+ * derive the discriminant (`action`) enum, keep the common required set, and demote
7
+ * leftover combinators plus per-branch guidance into the description. Nested
8
+ * combinators (inside individual properties) are left untouched.
9
+ *
10
+ * Idempotent: a root that already lacks top-level combinators is returned unchanged.
11
+ */
12
+ export declare function flattenToolRootCombinators(schema: Record<string, unknown>): Record<string, unknown>;
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Tool `input_schema` root flattening.
3
+ *
4
+ * Tool/function-calling `input_schema` roots MUST be a single JSON Schema object.
5
+ * Bedrock Converse (`toolConfig.tools[*].toolSpec.inputSchema.json.type must be
6
+ * one of the following: object`), OpenAI strict mode, Gemini, and Anthropic all
7
+ * reject roots whose top level is a bare `oneOf`/`anyOf`/`allOf` combinator (the
8
+ * validators require `type: "object"`).
9
+ *
10
+ * Zod `z.union(...)` / `z.discriminatedUnion(...)` tool parameters serialize to
11
+ * exactly such a combinator root, so this normalization is provider-agnostic and
12
+ * runs inside the shared wire pipeline (`toolWireSchema`).
13
+ */
14
+ import { isRecord } from "@vib-rato/utils";
15
+ import { COMBINATOR_KEYS } from "./fields";
16
+ import { spillToDescription } from "./spill";
17
+
18
+ /** `minItems` / `maxItems` apply to arrays; some validators reject them on `type: "object"`. */
19
+ function isJsonSchemaArrayNode(schema: Record<string, unknown>): boolean {
20
+ const t = schema.type;
21
+ if (t === "array") return true;
22
+ if (Array.isArray(t) && t.includes("array") && !t.includes("object")) return true;
23
+ return false;
24
+ }
25
+
26
+ /** True when a JSON Schema node describes an object (explicit `type` or `properties`). */
27
+ export function isJsonSchemaObjectNode(schema: Record<string, unknown>): boolean {
28
+ if (isJsonSchemaArrayNode(schema)) return false;
29
+ if (schema.type === "object") return true;
30
+ if (Array.isArray(schema.type) && schema.type.includes("object")) return true;
31
+ if (isRecord(schema.properties)) return true;
32
+ return false;
33
+ }
34
+
35
+ function getRequiredNames(schema: Record<string, unknown>): Set<string> {
36
+ return new Set(
37
+ Array.isArray(schema.required)
38
+ ? schema.required.filter((entry): entry is string => typeof entry === "string")
39
+ : [],
40
+ );
41
+ }
42
+
43
+ function getSingleLiteralValue(schema: unknown): unknown | undefined {
44
+ if (!isRecord(schema)) return undefined;
45
+ if (Object.hasOwn(schema, "const")) return schema.const;
46
+ if (Array.isArray(schema.enum) && schema.enum.length === 1) return schema.enum[0];
47
+ return undefined;
48
+ }
49
+
50
+ function describeRootBranch(index: number, branch: Record<string, unknown>, action: unknown): string {
51
+ const required = [...getRequiredNames(branch)];
52
+ const parts = [`Branch ${index + 1}`];
53
+ if (typeof action === "string" || typeof action === "number" || typeof action === "boolean") {
54
+ parts.push(`action ${JSON.stringify(action)}`);
55
+ }
56
+ if (required.length > 0) parts.push(`branch-required fields: ${required.join(", ")}`);
57
+ if (typeof branch.description === "string" && branch.description.length > 0) parts.push(branch.description);
58
+ return parts.join("; ");
59
+ }
60
+
61
+ function collectRootObjectBranches(schema: unknown): Record<string, unknown>[] | undefined {
62
+ if (!isRecord(schema)) return undefined;
63
+ if (isJsonSchemaObjectNode(schema)) return [schema];
64
+
65
+ const combinatorKeys = COMBINATOR_KEYS.filter(key => Array.isArray(schema[key]));
66
+ if (combinatorKeys.length === 0) return undefined;
67
+
68
+ const branches: Record<string, unknown>[] = [];
69
+ for (const key of combinatorKeys) {
70
+ const variants = schema[key];
71
+ if (!Array.isArray(variants) || variants.length === 0) return undefined;
72
+ for (const variant of variants) {
73
+ const nestedBranches = collectRootObjectBranches(variant);
74
+ if (nestedBranches === undefined) return undefined;
75
+ branches.push(...nestedBranches);
76
+ }
77
+ }
78
+ return branches;
79
+ }
80
+
81
+ /**
82
+ * Flatten a provider-emitted tool ROOT whose top level is a `oneOf`/`anyOf`/`allOf`
83
+ * combinator into one `type: "object"` schema: merge object-branch properties,
84
+ * derive the discriminant (`action`) enum, keep the common required set, and demote
85
+ * leftover combinators plus per-branch guidance into the description. Nested
86
+ * combinators (inside individual properties) are left untouched.
87
+ *
88
+ * Idempotent: a root that already lacks top-level combinators is returned unchanged.
89
+ */
90
+ export function flattenToolRootCombinators(schema: Record<string, unknown>): Record<string, unknown> {
91
+ const rootCombinators = COMBINATOR_KEYS.filter(key => Array.isArray(schema[key]));
92
+ if (rootCombinators.length === 0) return schema;
93
+ const result: Record<string, unknown> = { ...schema };
94
+
95
+ const baseProperties = isRecord(result.properties) ? { ...result.properties } : {};
96
+ const flattenedBranches = rootCombinators
97
+ .map(key => ({ key, branches: collectRootObjectBranches({ [key]: result[key] }) }))
98
+ .find(entry => entry.branches !== undefined && entry.branches.length > 0);
99
+
100
+ result.type = "object";
101
+ result.properties = baseProperties;
102
+ result.additionalProperties = result.additionalProperties === undefined ? false : result.additionalProperties;
103
+
104
+ if (flattenedBranches?.branches !== undefined) {
105
+ const variants = flattenedBranches.branches;
106
+ const commonRequired = variants.map(variant => getRequiredNames(variant));
107
+ const required = [...commonRequired[0]].filter(name => commonRequired.every(set => set.has(name)));
108
+ const actionValues: unknown[] = [];
109
+ const guidance: string[] = [];
110
+
111
+ for (const [index, branch] of variants.entries()) {
112
+ if (isRecord(branch.properties)) {
113
+ Object.assign(baseProperties, branch.properties);
114
+ const actionValue = getSingleLiteralValue(branch.properties.action);
115
+ if (actionValue !== undefined && !actionValues.includes(actionValue)) actionValues.push(actionValue);
116
+ guidance.push(describeRootBranch(index, branch, actionValue));
117
+ } else {
118
+ guidance.push(describeRootBranch(index, branch, undefined));
119
+ }
120
+ }
121
+
122
+ if (actionValues.length > 0) {
123
+ const existingAction = isRecord(baseProperties.action) ? { ...baseProperties.action } : {};
124
+ delete existingAction.const;
125
+ baseProperties.action = { ...existingAction, enum: actionValues };
126
+ }
127
+ result.required = required;
128
+ spillToDescription(result, [
129
+ ["rootCombinatorGuidance", guidance],
130
+ ...rootCombinators
131
+ .filter(key => key !== flattenedBranches.key)
132
+ .map(key => [key, result[key]] as [string, unknown]),
133
+ ]);
134
+ } else {
135
+ spillToDescription(
136
+ result,
137
+ rootCombinators.map(key => [key, result[key]]),
138
+ );
139
+ }
140
+
141
+ for (const key of COMBINATOR_KEYS) delete result[key];
142
+ return result;
143
+ }
@@ -0,0 +1,8 @@
1
+ import type { JsonObject } from "./types";
2
+ export type DescriptionSpillFormat = "spill" | "paren";
3
+ /**
4
+ * Demote stripped JSON Schema keywords into a node's `description` so the model
5
+ * still receives the constraint as natural-language context after the wire
6
+ * schema drops it.
7
+ */
8
+ export declare function spillToDescription(node: JsonObject, entries: ReadonlyArray<readonly [string, unknown]>, format?: DescriptionSpillFormat): void;
@@ -0,0 +1,43 @@
1
+ import type { JsonObject } from "./types";
2
+
3
+ export type DescriptionSpillFormat = "spill" | "paren";
4
+
5
+ function formatSpillValue(value: unknown): string {
6
+ return JSON.stringify(value);
7
+ }
8
+
9
+ function formatParenValue(value: unknown): string {
10
+ return typeof value === "string" ? value : JSON.stringify(value);
11
+ }
12
+
13
+ /**
14
+ * Demote stripped JSON Schema keywords into a node's `description` so the model
15
+ * still receives the constraint as natural-language context after the wire
16
+ * schema drops it.
17
+ */
18
+ export function spillToDescription(
19
+ node: JsonObject,
20
+ entries: ReadonlyArray<readonly [string, unknown]>,
21
+ format: DescriptionSpillFormat = "spill",
22
+ ): void {
23
+ let spilled: Array<readonly [string, unknown]> | undefined;
24
+ for (const entry of entries) {
25
+ if (entry[1] === undefined) continue;
26
+ if (spilled === undefined) spilled = [];
27
+ spilled.push(entry);
28
+ }
29
+ if (spilled === undefined || spilled.length === 0) return;
30
+
31
+ const existing = typeof node.description === "string" ? node.description : "";
32
+ if (format === "paren") {
33
+ let suffix = "";
34
+ for (const [key, value] of spilled) {
35
+ suffix += ` (${key}: ${formatParenValue(value)})`;
36
+ }
37
+ node.description = `${existing}${suffix}`;
38
+ return;
39
+ }
40
+
41
+ const formatted = `{${spilled.map(([key, value]) => `${key}: ${formatSpillValue(value)}`).join(", ")}}`;
42
+ node.description = existing ? `${existing}\n\n${formatted}` : formatted;
43
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Symbol-keyed lazy memoization stamped directly onto the host object.
3
+ *
4
+ * Faster than a module-level `WeakMap` in V8/JSC because the symbol slot is
5
+ * resolved through the object's hidden class instead of a side-table hash
6
+ * lookup. The slot is defined as a non-enumerable property so the stamp
7
+ * does not leak through `{...spread}`, `Object.keys`, `JSON.stringify`, or
8
+ * `toEqual`-style deep equality.
9
+ *
10
+ * Caveats: the stamp lives as long as the host object, even after callers
11
+ * release their references to the cached value — only use this for caches
12
+ * whose lifetime should match the host. Frozen hosts will throw on write in
13
+ * strict mode; callers that may receive frozen input must handle that.
14
+ */
15
+ export declare function stamp<T extends object, V>(target: T, key: symbol, compute: (target: T) => V): V;
16
+ export declare function epochNext(): number;
17
+ /**
18
+ * Marks `target` as visited for this `epoch`. Returns `true` the first time
19
+ * it is called for a given (target, epoch) pair and `false` on every
20
+ * subsequent call within the same epoch.
21
+ */
22
+ export declare function once<T extends object>(target: T, epoch: number): boolean;
23
+ /** Returns `true` on first entry, `false` if `target` is already on the current path. */
24
+ export declare function enter<T extends object>(target: T): boolean;
25
+ export declare function exit<T extends object>(target: T): void;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Symbol-keyed lazy memoization stamped directly onto the host object.
3
+ *
4
+ * Faster than a module-level `WeakMap` in V8/JSC because the symbol slot is
5
+ * resolved through the object's hidden class instead of a side-table hash
6
+ * lookup. The slot is defined as a non-enumerable property so the stamp
7
+ * does not leak through `{...spread}`, `Object.keys`, `JSON.stringify`, or
8
+ * `toEqual`-style deep equality.
9
+ *
10
+ * Caveats: the stamp lives as long as the host object, even after callers
11
+ * release their references to the cached value — only use this for caches
12
+ * whose lifetime should match the host. Frozen hosts will throw on write in
13
+ * strict mode; callers that may receive frozen input must handle that.
14
+ */
15
+
16
+ function define<T extends object>(target: T, key: symbol, value: unknown): void {
17
+ Object.defineProperty(target, key, { value, writable: true, configurable: true });
18
+ }
19
+
20
+ export function stamp<T extends object, V>(target: T, key: symbol, compute: (target: T) => V): V {
21
+ const slot = target as Record<symbol, V | undefined>;
22
+ const existing = slot[key];
23
+ if (existing !== undefined) return existing;
24
+ const value = compute(target);
25
+ define(target, key, value);
26
+ return value;
27
+ }
28
+
29
+ /**
30
+ * Epoch-keyed cycle guard. Cheaper than `WeakSet` for recursive traversal
31
+ * because the marker is a single property slot on the host object, written
32
+ * once and overwritten in place on every subsequent traversal — the hidden
33
+ * class transitions once per object lifetime, not per traversal.
34
+ *
35
+ * Usage:
36
+ * function walk(node, epoch = epochNext()) {
37
+ * if (!once(node, epoch)) return; // cycle
38
+ * for (const child of node.children) walk(child, epoch);
39
+ * }
40
+ */
41
+ const kEpoch = Symbol("pi.schema.epoch");
42
+ let __epoch = 0;
43
+
44
+ export function epochNext(): number {
45
+ return ++__epoch;
46
+ }
47
+
48
+ /**
49
+ * Marks `target` as visited for this `epoch`. Returns `true` the first time
50
+ * it is called for a given (target, epoch) pair and `false` on every
51
+ * subsequent call within the same epoch.
52
+ */
53
+ export function once<T extends object>(target: T, epoch: number): boolean {
54
+ const slot = target as Record<symbol, number | undefined>;
55
+ const cur = slot[kEpoch];
56
+ if (cur !== undefined && cur >= epoch) return false;
57
+ if (cur === undefined) define(target, kEpoch, epoch);
58
+ else slot[kEpoch] = epoch;
59
+ return true;
60
+ }
61
+
62
+ /**
63
+ * Counter-based path tracker. Use when a traversal needs to distinguish
64
+ * "currently on the recursion path" from "previously visited" — i.e. cycle
65
+ * detection that throws while still allowing DAG sharing. Increment on
66
+ * entry, decrement on exit; the slot returns to 0 after a balanced walk so
67
+ * subsequent top-level calls see a fresh state without any reset.
68
+ *
69
+ * Unlike a `WeakSet` with `seen.delete(...)`, the property is never deleted
70
+ * — only incremented and decremented — so the host object's hidden class
71
+ * is never invalidated.
72
+ *
73
+ * Usage:
74
+ * function walk(node) {
75
+ * if (!enter(node)) throw new Error("cycle");
76
+ * try { for (const c of node.children) walk(c); }
77
+ * finally { exit(node); }
78
+ * }
79
+ */
80
+ const kDepth = Symbol("pi.schema.depth");
81
+
82
+ /** Returns `true` on first entry, `false` if `target` is already on the current path. */
83
+ export function enter<T extends object>(target: T): boolean {
84
+ const slot = target as Record<symbol, number | undefined>;
85
+ const cur = slot[kDepth];
86
+ if (cur === undefined) {
87
+ define(target, kDepth, 1);
88
+ return true;
89
+ }
90
+ slot[kDepth] = cur + 1;
91
+ return cur === 0;
92
+ }
93
+
94
+ export function exit<T extends object>(target: T): void {
95
+ const slot = target as Record<symbol, number>;
96
+ slot[kDepth]--;
97
+ }
@@ -0,0 +1,4 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ export declare function isJsonObject(value: unknown): value is JsonObject;
3
+ /** True when `value` is a plain JSON object with no own enumerable keys. */
4
+ export declare function isJsonObjectEmpty(value: JsonObject): boolean;
@@ -0,0 +1,11 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+
3
+ export function isJsonObject(value: unknown): value is JsonObject {
4
+ return !!value && typeof value === "object" && !Array.isArray(value);
5
+ }
6
+
7
+ /** True when `value` is a plain JSON object with no own enumerable keys. */
8
+ export function isJsonObjectEmpty(value: JsonObject): boolean {
9
+ for (const _ in value) return false;
10
+ return true;
11
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Compute the wire (JSON Schema) representation of a tool's parameters and
3
+ * convert TypeBox-style schemas into Zod for internal validation.
4
+ *
5
+ * Tools may author parameters in two shapes:
6
+ * 1. Zod (canonical going forward) — converted to JSON Schema on demand.
7
+ * 2. TypeBox / plain JSON Schema (legacy + extension compat) — upgraded to
8
+ * draft 2020-12 without converting through Zod.
9
+ *
10
+ * Both are normalized at the boundary so providers and validators see the same
11
+ * JSON Schema dialect.
12
+ */
13
+ import { type ZodType } from "zod/v4";
14
+ import type { Tool } from "../../types";
15
+ /**
16
+ * True when `value` is a live Zod schema instance.
17
+ *
18
+ * The check is stricter than "has a `_zod` property" because a JSON
19
+ * round-trip preserves the `_zod` key as a plain object and would otherwise
20
+ * fool the predicate — see issue #1101, where MCP servers ship
21
+ * `JSON.stringify(zodSchemaInstance)` as a tool's `inputSchema` and the
22
+ * resulting plain object then explodes `z.toJSONSchema` because the prototype
23
+ * (and every Zod parsing method) is gone.
24
+ *
25
+ * Live Zod instances always carry a `.parse` function on the prototype;
26
+ * impostors do not.
27
+ */
28
+ export declare function isZodSchema(value: unknown): value is ZodType;
29
+ /**
30
+ * Normalize `{}` (empty JSON Schema = `z.unknown()` / unconstrained value) to
31
+ * boolean `true` in every schema-valued position. JSON Schema draft 2020-12
32
+ * §4.3.1: `{}` and `true` are semantically equivalent ("any JSON value").
33
+ * Grammar-constrained samplers (llama.cpp, etc.) treat the object form as
34
+ * "generate an empty object" rather than "any JSON value", causing open-typed
35
+ * fields like `extra.title` (from `z.record(z.string(), z.unknown())`) to
36
+ * always emit `{}` instead of the intended string/number/etc. (issue #1179).
37
+ *
38
+ * Mutates in place. Provider-agnostic — applied to every tool wire schema so
39
+ * Anthropic, Google, OpenAI, Ollama, Bedrock, and Cursor all see the
40
+ * normalized form, regardless of whether the source was Zod or TypeBox.
41
+ */
42
+ export declare function normalizeEmptySchemas(node: unknown): void;
43
+ /** Convert a Zod schema into the JSON Schema shape providers consume. */
44
+ export declare function zodToWireSchema(schema: ZodType): Record<string, unknown>;
45
+ /**
46
+ * Resolve a tool's parameters to a JSON Schema object suitable for sending
47
+ * over the wire. Zod schemas are converted (and cached); legacy TypeBox / raw
48
+ * JSON Schema parameters are upgraded to draft 2020-12 (and cached).
49
+ *
50
+ * Both branches finish with `normalizeEmptySchemas` so every provider —
51
+ * OpenAI, Anthropic, Google, Ollama, Bedrock, Cursor — sees `{}` normalized
52
+ * to `true` in schema-valued positions (issue #1179).
53
+ */
54
+ export declare function toolWireSchema(tool: Tool): Record<string, unknown>;
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Compute the wire (JSON Schema) representation of a tool's parameters and
3
+ * convert TypeBox-style schemas into Zod for internal validation.
4
+ *
5
+ * Tools may author parameters in two shapes:
6
+ * 1. Zod (canonical going forward) — converted to JSON Schema on demand.
7
+ * 2. TypeBox / plain JSON Schema (legacy + extension compat) — upgraded to
8
+ * draft 2020-12 without converting through Zod.
9
+ *
10
+ * Both are normalized at the boundary so providers and validators see the same
11
+ * JSON Schema dialect.
12
+ */
13
+
14
+ // We import the Zod *value* (z) for runtime APIs. Marker checks rely on the
15
+ // `_zod` symbol that every Zod v4 schema instance carries.
16
+ import { type ZodType, z } from "zod/v4";
17
+ import type { Tool, TSchema } from "../../types";
18
+ import { upgradeJsonSchemaTo202012 } from "./draft";
19
+ import { stamp } from "./stamps";
20
+
21
+ /**
22
+ * True when `value` is a live Zod schema instance.
23
+ *
24
+ * The check is stricter than "has a `_zod` property" because a JSON
25
+ * round-trip preserves the `_zod` key as a plain object and would otherwise
26
+ * fool the predicate — see issue #1101, where MCP servers ship
27
+ * `JSON.stringify(zodSchemaInstance)` as a tool's `inputSchema` and the
28
+ * resulting plain object then explodes `z.toJSONSchema` because the prototype
29
+ * (and every Zod parsing method) is gone.
30
+ *
31
+ * Live Zod instances always carry a `.parse` function on the prototype;
32
+ * impostors do not.
33
+ */
34
+ export function isZodSchema(value: unknown): value is ZodType {
35
+ return (
36
+ typeof value === "object" &&
37
+ value !== null &&
38
+ // Zod v4 instances expose a `_zod` internal property with a `def` object.
39
+ // Tagging on this marker keeps the check stable across Zod minor versions.
40
+ // (`_zod` is part of Zod's documented internal contract used by introspection.)
41
+ // We avoid checking constructor name because Zod ships multiple variants
42
+ // (`ZodObject`, `ZodOptional`, etc.) and a tagged-union style check would
43
+ // have to enumerate them all.
44
+ "_zod" in value &&
45
+ typeof (value as { _zod?: { def?: unknown } })._zod === "object" &&
46
+ // Reject JSON-roundtripped objects that kept the `_zod` key but lost the
47
+ // prototype. Real instances have `.parse` on the prototype chain.
48
+ typeof (value as { parse?: unknown }).parse === "function"
49
+ );
50
+ }
51
+
52
+ /** Symbol-stamped caches keyed by schema object identity. */
53
+ const kZodWireSchema = Symbol("pi.schema.zod.wire");
54
+ const kJsonWireSchema = Symbol("pi.schema.json.wire");
55
+
56
+ /**
57
+ * Post-process Zod-emitted JSON Schema so it matches the wire shape providers
58
+ * already expect from TypeBox-authored tools:
59
+ *
60
+ * - Drop the `$schema` URL (providers parse the body, not the metadata).
61
+ * - Make fields with a `default` non-required (TypeBox/JSON-Schema semantics
62
+ * treat defaulted fields as optional; Zod inverts this and keeps them
63
+ * required at the input boundary, then materializes the default).
64
+ * - Strip the noisy safe-integer bounds Zod injects for `z.number().int()`.
65
+ *
66
+ * The empty-schema normalization (`{}` → `true`, see `normalizeEmptySchemas`)
67
+ * runs separately from `toolWireSchema` so both Zod and TypeBox tools get it.
68
+ */
69
+ function postProcess(schema: Record<string, unknown>): Record<string, unknown> {
70
+ delete schema.$schema;
71
+ walk(schema);
72
+ normalizeEmptySchemas(schema);
73
+ return schema;
74
+ }
75
+
76
+ const SAFE_INTEGER_MAX = Number.MAX_SAFE_INTEGER;
77
+ const SAFE_INTEGER_MIN = Number.MIN_SAFE_INTEGER;
78
+
79
+ /** Keys whose values are a single JSON Schema (not an array or map). */
80
+ const SCHEMA_VALUE_KEYS = [
81
+ "additionalProperties",
82
+ "unevaluatedProperties",
83
+ "unevaluatedItems",
84
+ "items",
85
+ "contains",
86
+ "propertyNames",
87
+ "if",
88
+ "then",
89
+ "else",
90
+ "not",
91
+ ] as const;
92
+
93
+ /** Keys whose values are a map of `{ key: Schema }` entries. */
94
+ const SCHEMA_MAP_KEYS = ["properties", "patternProperties", "$defs", "definitions"] as const;
95
+
96
+ /** Keys whose values are an array of schemas. */
97
+ const SCHEMA_ARRAY_KEYS = ["anyOf", "oneOf", "allOf", "prefixItems"] as const;
98
+
99
+ /** True when `val` is a plain empty object `{}`. */
100
+ function isEmptyObject(val: unknown): val is Record<string, never> {
101
+ if (val === null || typeof val !== "object" || Array.isArray(val)) return false;
102
+ for (const _ in val as object) return false;
103
+ return true;
104
+ }
105
+
106
+ function walk(node: unknown): void {
107
+ if (Array.isArray(node)) {
108
+ for (const child of node) walk(child);
109
+ return;
110
+ }
111
+ if (!node || typeof node !== "object") return;
112
+ const obj = node as Record<string, unknown>;
113
+
114
+ // Drop noise injected for `z.number().int()`.
115
+ if (obj.type === "integer") {
116
+ if (obj.minimum === SAFE_INTEGER_MIN) delete obj.minimum;
117
+ if (obj.maximum === SAFE_INTEGER_MAX) delete obj.maximum;
118
+ }
119
+
120
+ // Make defaulted properties non-required.
121
+ if (Array.isArray(obj.required) && obj.properties && typeof obj.properties === "object") {
122
+ const properties = obj.properties as Record<string, unknown>;
123
+ const required = obj.required as string[];
124
+ const filtered = required.filter(name => {
125
+ const propertySchema = properties[name];
126
+ if (!propertySchema || typeof propertySchema !== "object") return true;
127
+ return !("default" in (propertySchema as Record<string, unknown>));
128
+ });
129
+ if (filtered.length !== required.length) {
130
+ if (filtered.length === 0) {
131
+ delete obj.required;
132
+ } else {
133
+ obj.required = filtered;
134
+ }
135
+ }
136
+ }
137
+
138
+ for (const k in obj) walk(obj[k]);
139
+ }
140
+
141
+ /**
142
+ * Normalize `{}` (empty JSON Schema = `z.unknown()` / unconstrained value) to
143
+ * boolean `true` in every schema-valued position. JSON Schema draft 2020-12
144
+ * §4.3.1: `{}` and `true` are semantically equivalent ("any JSON value").
145
+ * Grammar-constrained samplers (llama.cpp, etc.) treat the object form as
146
+ * "generate an empty object" rather than "any JSON value", causing open-typed
147
+ * fields like `extra.title` (from `z.record(z.string(), z.unknown())`) to
148
+ * always emit `{}` instead of the intended string/number/etc. (issue #1179).
149
+ *
150
+ * Mutates in place. Provider-agnostic — applied to every tool wire schema so
151
+ * Anthropic, Google, OpenAI, Ollama, Bedrock, and Cursor all see the
152
+ * normalized form, regardless of whether the source was Zod or TypeBox.
153
+ */
154
+ export function normalizeEmptySchemas(node: unknown): void {
155
+ if (Array.isArray(node)) {
156
+ for (const child of node) normalizeEmptySchemas(child);
157
+ return;
158
+ }
159
+ if (!node || typeof node !== "object") return;
160
+ const obj = node as Record<string, unknown>;
161
+
162
+ for (const key of SCHEMA_VALUE_KEYS) {
163
+ if (Object.hasOwn(obj, key) && isEmptyObject(obj[key])) obj[key] = true;
164
+ }
165
+ for (const mapKey of SCHEMA_MAP_KEYS) {
166
+ const map = obj[mapKey];
167
+ if (map !== null && typeof map === "object" && !Array.isArray(map)) {
168
+ for (const k in map as Record<string, unknown>) {
169
+ if (isEmptyObject((map as Record<string, unknown>)[k])) (map as Record<string, unknown>)[k] = true;
170
+ }
171
+ }
172
+ }
173
+ for (const arrKey of SCHEMA_ARRAY_KEYS) {
174
+ const arr = obj[arrKey];
175
+ if (Array.isArray(arr)) {
176
+ for (let i = 0; i < arr.length; i++) {
177
+ if (isEmptyObject(arr[i])) arr[i] = true;
178
+ }
179
+ }
180
+ }
181
+
182
+ for (const k in obj) normalizeEmptySchemas(obj[k]);
183
+ }
184
+
185
+ /** Convert a Zod schema into the JSON Schema shape providers consume. */
186
+ export function zodToWireSchema(schema: ZodType): Record<string, unknown> {
187
+ return stamp(schema, kZodWireSchema, s => {
188
+ // `target: "draft-2020-12"` matches what Anthropic's `input_schema` validator
189
+ // requires out of the box; our other provider sanitizers (OpenAI strict,
190
+ // Google, Anthropic CCA) already handle the superset structurally.
191
+ const raw = z.toJSONSchema(s, { target: "draft-2020-12" }) as Record<string, unknown>;
192
+ return postProcess(raw);
193
+ });
194
+ }
195
+
196
+ /**
197
+ * Resolve a tool's parameters to a JSON Schema object suitable for sending
198
+ * over the wire. Zod schemas are converted (and cached); legacy TypeBox / raw
199
+ * JSON Schema parameters are upgraded to draft 2020-12 (and cached).
200
+ *
201
+ * Both branches finish with `normalizeEmptySchemas` so every provider —
202
+ * OpenAI, Anthropic, Google, Ollama, Bedrock, Cursor — sees `{}` normalized
203
+ * to `true` in schema-valued positions (issue #1179).
204
+ */
205
+ export function toolWireSchema(tool: Tool): Record<string, unknown> {
206
+ const params: TSchema = tool.parameters;
207
+ if (isZodSchema(params)) return zodToWireSchema(params);
208
+ return stamp(params as Record<string, unknown>, kJsonWireSchema, p => {
209
+ const upgraded = upgradeJsonSchemaTo202012(p) as Record<string, unknown>;
210
+ normalizeEmptySchemas(upgraded);
211
+ return upgraded;
212
+ });
213
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Defensive rewrite for nodes that look like `JSON.stringify(zodSchemaInstance)`
3
+ * output rather than JSON Schema. MCP servers using Zod 4 sometimes ship a
4
+ * serialised schema instance directly as a tool's `inputSchema`, because the
5
+ * fields Zod surfaces on its instances (`type`, `enum`, `options`, `def`) shadow
6
+ * (and clash with) JSON Schema keywords. The resulting payload is neither valid
7
+ * Zod nor valid JSON Schema 2020-12 and Anthropic's strict validator rejects
8
+ * the whole tool list.
9
+ *
10
+ * Symptoms we've observed (gitnexus_impact.direction):
11
+ * {
12
+ * def: { type: "enum", entries: { upstream: "upstream", ... } },
13
+ * type: "enum", // <- invalid `type` value
14
+ * enum: { upstream: "upstream", ... }, // <- `enum` MUST be an array
15
+ * options: ["upstream", "downstream"],
16
+ * }
17
+ *
18
+ * This module recognises the shape (`def.type === node.type` and `def.type` is
19
+ * a known Zod kind) and rewrites it to clean JSON Schema where deterministic.
20
+ * For Zod kinds we don't fully model, we strip the toxic siblings (`def`,
21
+ * `options`, object-shaped `enum`) and drop an invalid `type` so the remainder
22
+ * passes meta-schema validation as a permissive node.
23
+ *
24
+ * Pure / identity-preserving: returns the input reference when nothing changes.
25
+ */
26
+ /**
27
+ * Walks a JSON value and rewrites every Zod-instance-shaped node into clean
28
+ * JSON Schema 2020-12. Identity-preserving when no rewrite fires. Tolerates
29
+ * self-referential graphs — a revisited node returns as-is.
30
+ */
31
+ export declare function decontaminateZodInstance(value: unknown): unknown;