jeopi-ai 16.2.13

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 (598) hide show
  1. package/CHANGELOG.md +4347 -0
  2. package/README.md +1193 -0
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth-broker/client.d.ts +73 -0
  5. package/dist/types/auth-broker/discover.d.ts +35 -0
  6. package/dist/types/auth-broker/index.d.ts +7 -0
  7. package/dist/types/auth-broker/refresher.d.ts +25 -0
  8. package/dist/types/auth-broker/remote-store.d.ts +102 -0
  9. package/dist/types/auth-broker/server.d.ts +43 -0
  10. package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
  11. package/dist/types/auth-broker/types.d.ts +107 -0
  12. package/dist/types/auth-broker/wire-schemas.d.ts +411 -0
  13. package/dist/types/auth-gateway/http.d.ts +39 -0
  14. package/dist/types/auth-gateway/index.d.ts +3 -0
  15. package/dist/types/auth-gateway/server.d.ts +36 -0
  16. package/dist/types/auth-gateway/types.d.ts +123 -0
  17. package/dist/types/auth-retry.d.ts +124 -0
  18. package/dist/types/auth-storage.d.ts +1026 -0
  19. package/dist/types/dialect/anthropic.d.ts +15 -0
  20. package/dist/types/dialect/catalog.d.ts +3 -0
  21. package/dist/types/dialect/coercion.d.ts +23 -0
  22. package/dist/types/dialect/deepseek.d.ts +14 -0
  23. package/dist/types/dialect/demotion.d.ts +23 -0
  24. package/dist/types/dialect/examples.d.ts +2 -0
  25. package/dist/types/dialect/factory.d.ts +3 -0
  26. package/dist/types/dialect/fenced-thinking.d.ts +53 -0
  27. package/dist/types/dialect/gemini.d.ts +17 -0
  28. package/dist/types/dialect/gemma.d.ts +15 -0
  29. package/dist/types/dialect/glm.d.ts +9 -0
  30. package/dist/types/dialect/harmony.d.ts +8 -0
  31. package/dist/types/dialect/hermes.d.ts +9 -0
  32. package/dist/types/dialect/history.d.ts +3 -0
  33. package/dist/types/dialect/index.d.ts +11 -0
  34. package/dist/types/dialect/inventory.d.ts +12 -0
  35. package/dist/types/dialect/kimi.d.ts +14 -0
  36. package/dist/types/dialect/minimax.d.ts +3 -0
  37. package/dist/types/dialect/owned-stream.d.ts +4 -0
  38. package/dist/types/dialect/qwen3.d.ts +9 -0
  39. package/dist/types/dialect/rendering.d.ts +45 -0
  40. package/dist/types/dialect/thinking.d.ts +6 -0
  41. package/dist/types/dialect/types.d.ts +69 -0
  42. package/dist/types/dialect/xml.d.ts +9 -0
  43. package/dist/types/error/abort.d.ts +14 -0
  44. package/dist/types/error/auth-classify.d.ts +16 -0
  45. package/dist/types/error/auth.d.ts +27 -0
  46. package/dist/types/error/aws.d.ts +23 -0
  47. package/dist/types/error/classes.d.ts +102 -0
  48. package/dist/types/error/finalize.d.ts +39 -0
  49. package/dist/types/error/flags.d.ts +79 -0
  50. package/dist/types/error/format.d.ts +20 -0
  51. package/dist/types/error/gateway.d.ts +20 -0
  52. package/dist/types/error/index.d.ts +13 -0
  53. package/dist/types/error/oauth.d.ts +43 -0
  54. package/dist/types/error/provider.d.ts +42 -0
  55. package/dist/types/error/rate-limit.d.ts +59 -0
  56. package/dist/types/error/retryable.d.ts +27 -0
  57. package/dist/types/error/validation.d.ts +32 -0
  58. package/dist/types/index.d.ts +49 -0
  59. package/dist/types/provider-details.d.ts +24 -0
  60. package/dist/types/providers/__tests__/google-auth.test.d.ts +1 -0
  61. package/dist/types/providers/__tests__/kimi-code-thinking.test.d.ts +1 -0
  62. package/dist/types/providers/__tests__/openai-codex-error.test.d.ts +1 -0
  63. package/dist/types/providers/amazon-bedrock.d.ts +39 -0
  64. package/dist/types/providers/anthropic-client.d.ts +94 -0
  65. package/dist/types/providers/anthropic-messages-server-schema.d.ts +497 -0
  66. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  67. package/dist/types/providers/anthropic-wire.d.ts +318 -0
  68. package/dist/types/providers/anthropic.d.ts +248 -0
  69. package/dist/types/providers/aws-credentials.d.ts +53 -0
  70. package/dist/types/providers/aws-eventstream.d.ts +39 -0
  71. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  72. package/dist/types/providers/azure-openai-responses.d.ts +16 -0
  73. package/dist/types/providers/cursor.d.ts +91 -0
  74. package/dist/types/providers/devin.d.ts +12 -0
  75. package/dist/types/providers/error-message.d.ts +27 -0
  76. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  77. package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
  78. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  79. package/dist/types/providers/google-auth.d.ts +32 -0
  80. package/dist/types/providers/google-gemini-cli.d.ts +118 -0
  81. package/dist/types/providers/google-interactions.d.ts +65 -0
  82. package/dist/types/providers/google-shared.d.ts +203 -0
  83. package/dist/types/providers/google-types.d.ts +155 -0
  84. package/dist/types/providers/google-vertex.d.ts +7 -0
  85. package/dist/types/providers/google.d.ts +4 -0
  86. package/dist/types/providers/grammar.d.ts +1 -0
  87. package/dist/types/providers/kimi.d.ts +27 -0
  88. package/dist/types/providers/mock.d.ts +178 -0
  89. package/dist/types/providers/ollama.d.ts +7 -0
  90. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  91. package/dist/types/providers/openai-chat-server-schema.d.ts +695 -0
  92. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  93. package/dist/types/providers/openai-chat-wire.d.ts +644 -0
  94. package/dist/types/providers/openai-codex/request-transformer.d.ts +54 -0
  95. package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
  96. package/dist/types/providers/openai-codex-responses.d.ts +108 -0
  97. package/dist/types/providers/openai-completions.d.ts +45 -0
  98. package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
  99. package/dist/types/providers/openai-responses-server-schema.d.ts +349 -0
  100. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  101. package/dist/types/providers/openai-responses-wire.d.ts +6065 -0
  102. package/dist/types/providers/openai-responses.d.ts +126 -0
  103. package/dist/types/providers/openai-shared.d.ts +506 -0
  104. package/dist/types/providers/pi-native-client.d.ts +13 -0
  105. package/dist/types/providers/pi-native-server.d.ts +69 -0
  106. package/dist/types/providers/register-builtins.d.ts +32 -0
  107. package/dist/types/providers/synthetic.d.ts +26 -0
  108. package/dist/types/providers/transform-messages.d.ts +11 -0
  109. package/dist/types/providers/vision-guard.d.ts +20 -0
  110. package/dist/types/registry/aimlapi.d.ts +4 -0
  111. package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
  112. package/dist/types/registry/amazon-bedrock.d.ts +5 -0
  113. package/dist/types/registry/anthropic.d.ts +10 -0
  114. package/dist/types/registry/api-key-login.d.ts +42 -0
  115. package/dist/types/registry/api-key-validation.d.ts +43 -0
  116. package/dist/types/registry/azure.d.ts +4 -0
  117. package/dist/types/registry/cerebras.d.ts +7 -0
  118. package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
  119. package/dist/types/registry/coreweave.d.ts +7 -0
  120. package/dist/types/registry/cursor.d.ts +7 -0
  121. package/dist/types/registry/deepseek.d.ts +8 -0
  122. package/dist/types/registry/derived.d.ts +5 -0
  123. package/dist/types/registry/devin.d.ts +8 -0
  124. package/dist/types/registry/firepass.d.ts +16 -0
  125. package/dist/types/registry/fireworks.d.ts +7 -0
  126. package/dist/types/registry/github-copilot.d.ts +7 -0
  127. package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
  128. package/dist/types/registry/gitlab-duo.d.ts +9 -0
  129. package/dist/types/registry/google-antigravity.d.ts +9 -0
  130. package/dist/types/registry/google-gemini-cli.d.ts +9 -0
  131. package/dist/types/registry/google-vertex.d.ts +5 -0
  132. package/dist/types/registry/google.d.ts +4 -0
  133. package/dist/types/registry/groq.d.ts +4 -0
  134. package/dist/types/registry/huggingface.d.ts +7 -0
  135. package/dist/types/registry/index.d.ts +4 -0
  136. package/dist/types/registry/kagi.d.ts +14 -0
  137. package/dist/types/registry/kilo.d.ts +7 -0
  138. package/dist/types/registry/kimi-code.d.ts +7 -0
  139. package/dist/types/registry/litellm.d.ts +13 -0
  140. package/dist/types/registry/llama-cpp.d.ts +8 -0
  141. package/dist/types/registry/lm-studio.d.ts +8 -0
  142. package/dist/types/registry/minimax-code-cn.d.ts +6 -0
  143. package/dist/types/registry/minimax-code.d.ts +6 -0
  144. package/dist/types/registry/minimax.d.ts +4 -0
  145. package/dist/types/registry/mistral.d.ts +4 -0
  146. package/dist/types/registry/moonshot.d.ts +7 -0
  147. package/dist/types/registry/nanogpt.d.ts +7 -0
  148. package/dist/types/registry/nvidia.d.ts +7 -0
  149. package/dist/types/registry/oauth/__tests__/xai-oauth.test.d.ts +1 -0
  150. package/dist/types/registry/oauth/anthropic.d.ts +23 -0
  151. package/dist/types/registry/oauth/callback-server.d.ts +72 -0
  152. package/dist/types/registry/oauth/cursor.d.ts +15 -0
  153. package/dist/types/registry/oauth/devin.d.ts +5 -0
  154. package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
  155. package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
  156. package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
  157. package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
  158. package/dist/types/registry/oauth/google-gemini-cli.d.ts +10 -0
  159. package/dist/types/registry/oauth/google-oauth-shared.d.ts +22 -0
  160. package/dist/types/registry/oauth/index.d.ts +64 -0
  161. package/dist/types/registry/oauth/kimi.d.ts +21 -0
  162. package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
  163. package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
  164. package/dist/types/registry/oauth/opencode.d.ts +18 -0
  165. package/dist/types/registry/oauth/perplexity.d.ts +9 -0
  166. package/dist/types/registry/oauth/pkce.d.ts +8 -0
  167. package/dist/types/registry/oauth/types.d.ts +56 -0
  168. package/dist/types/registry/oauth/wafer.d.ts +1 -0
  169. package/dist/types/registry/oauth/xai-oauth.d.ts +52 -0
  170. package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
  171. package/dist/types/registry/ollama-cloud.d.ts +7 -0
  172. package/dist/types/registry/ollama.d.ts +12 -0
  173. package/dist/types/registry/openai-codex-device.d.ts +8 -0
  174. package/dist/types/registry/openai-codex.d.ts +9 -0
  175. package/dist/types/registry/openai.d.ts +4 -0
  176. package/dist/types/registry/opencode-go.d.ts +6 -0
  177. package/dist/types/registry/opencode-zen.d.ts +6 -0
  178. package/dist/types/registry/openrouter.d.ts +13 -0
  179. package/dist/types/registry/parallel.d.ts +14 -0
  180. package/dist/types/registry/perplexity.d.ts +7 -0
  181. package/dist/types/registry/qianfan.d.ts +7 -0
  182. package/dist/types/registry/qwen-portal.d.ts +7 -0
  183. package/dist/types/registry/registry.d.ts +303 -0
  184. package/dist/types/registry/sakana.d.ts +7 -0
  185. package/dist/types/registry/synthetic.d.ts +6 -0
  186. package/dist/types/registry/tavily.d.ts +14 -0
  187. package/dist/types/registry/together.d.ts +6 -0
  188. package/dist/types/registry/types.d.ts +51 -0
  189. package/dist/types/registry/umans.d.ts +7 -0
  190. package/dist/types/registry/venice.d.ts +13 -0
  191. package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
  192. package/dist/types/registry/vllm.d.ts +7 -0
  193. package/dist/types/registry/wafer-serverless.d.ts +6 -0
  194. package/dist/types/registry/xai-oauth.d.ts +7 -0
  195. package/dist/types/registry/xai.d.ts +4 -0
  196. package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
  197. package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
  198. package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
  199. package/dist/types/registry/xiaomi.d.ts +6 -0
  200. package/dist/types/registry/zai.d.ts +7 -0
  201. package/dist/types/registry/zenmux.d.ts +7 -0
  202. package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
  203. package/dist/types/stream.d.ts +44 -0
  204. package/dist/types/types.d.ts +715 -0
  205. package/dist/types/usage/claude.d.ts +4 -0
  206. package/dist/types/usage/gemini.d.ts +2 -0
  207. package/dist/types/usage/github-copilot.d.ts +7 -0
  208. package/dist/types/usage/google-antigravity.d.ts +15 -0
  209. package/dist/types/usage/kimi.d.ts +2 -0
  210. package/dist/types/usage/minimax-code.d.ts +2 -0
  211. package/dist/types/usage/ollama.d.ts +5 -0
  212. package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
  213. package/dist/types/usage/openai-codex-reset.d.ts +79 -0
  214. package/dist/types/usage/openai-codex.d.ts +3 -0
  215. package/dist/types/usage/opencode-go.d.ts +2 -0
  216. package/dist/types/usage/shared.d.ts +1 -0
  217. package/dist/types/usage/zai.d.ts +2 -0
  218. package/dist/types/usage.d.ts +346 -0
  219. package/dist/types/utils/abort.d.ts +25 -0
  220. package/dist/types/utils/anthropic-auth.d.ts +35 -0
  221. package/dist/types/utils/block-symbols.d.ts +20 -0
  222. package/dist/types/utils/deterministic-id.d.ts +16 -0
  223. package/dist/types/utils/empty-completion-retry.d.ts +21 -0
  224. package/dist/types/utils/event-stream.d.ts +30 -0
  225. package/dist/types/utils/foundry.d.ts +1 -0
  226. package/dist/types/utils/google-validation.d.ts +2 -0
  227. package/dist/types/utils/harmony-leak.d.ts +118 -0
  228. package/dist/types/utils/http-inspector.d.ts +30 -0
  229. package/dist/types/utils/idle-iterator.d.ts +137 -0
  230. package/dist/types/utils/leaked-thinking-stream.d.ts +29 -0
  231. package/dist/types/utils/openai-http.d.ts +54 -0
  232. package/dist/types/utils/openrouter-headers.d.ts +1 -0
  233. package/dist/types/utils/parse-bind.d.ts +23 -0
  234. package/dist/types/utils/provider-response.d.ts +3 -0
  235. package/dist/types/utils/proxy.d.ts +29 -0
  236. package/dist/types/utils/request-debug.d.ts +29 -0
  237. package/dist/types/utils/retry-after.d.ts +4 -0
  238. package/dist/types/utils/retry.d.ts +14 -0
  239. package/dist/types/utils/schema/adapt.d.ts +24 -0
  240. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  241. package/dist/types/utils/schema/dereference.d.ts +11 -0
  242. package/dist/types/utils/schema/draft.d.ts +10 -0
  243. package/dist/types/utils/schema/equality.d.ts +4 -0
  244. package/dist/types/utils/schema/fields.d.ts +54 -0
  245. package/dist/types/utils/schema/index.d.ts +15 -0
  246. package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
  247. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  248. package/dist/types/utils/schema/normalize.d.ts +124 -0
  249. package/dist/types/utils/schema/spill.d.ts +8 -0
  250. package/dist/types/utils/schema/stamps.d.ts +17 -0
  251. package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
  252. package/dist/types/utils/schema/types.d.ts +4 -0
  253. package/dist/types/utils/schema/typescript.d.ts +18 -0
  254. package/dist/types/utils/schema/wire.d.ts +92 -0
  255. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  256. package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
  257. package/dist/types/utils/sse-debug.d.ts +5 -0
  258. package/dist/types/utils/stream-markup-healing.d.ts +87 -0
  259. package/dist/types/utils/thinking-loop.d.ts +102 -0
  260. package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
  261. package/dist/types/utils/tool-choice.d.ts +50 -0
  262. package/dist/types/utils/validation.d.ts +42 -0
  263. package/dist/types/utils.d.ts +24 -0
  264. package/package.json +139 -0
  265. package/src/api-registry.ts +109 -0
  266. package/src/auth-broker/client.ts +359 -0
  267. package/src/auth-broker/discover.ts +222 -0
  268. package/src/auth-broker/index.ts +7 -0
  269. package/src/auth-broker/refresher.ts +117 -0
  270. package/src/auth-broker/remote-store.ts +657 -0
  271. package/src/auth-broker/server.ts +646 -0
  272. package/src/auth-broker/snapshot-cache.ts +191 -0
  273. package/src/auth-broker/types.ts +130 -0
  274. package/src/auth-broker/wire-schemas.ts +249 -0
  275. package/src/auth-gateway/http.ts +194 -0
  276. package/src/auth-gateway/index.ts +3 -0
  277. package/src/auth-gateway/server.ts +802 -0
  278. package/src/auth-gateway/types.ts +151 -0
  279. package/src/auth-retry.ts +250 -0
  280. package/src/auth-storage.ts +5576 -0
  281. package/src/dialect/anthropic.md +31 -0
  282. package/src/dialect/anthropic.ts +608 -0
  283. package/src/dialect/catalog.ts +29 -0
  284. package/src/dialect/coercion.ts +136 -0
  285. package/src/dialect/deepseek.md +24 -0
  286. package/src/dialect/deepseek.ts +609 -0
  287. package/src/dialect/demotion.ts +36 -0
  288. package/src/dialect/examples.ts +33 -0
  289. package/src/dialect/factory.ts +34 -0
  290. package/src/dialect/fenced-thinking.ts +184 -0
  291. package/src/dialect/gemini.md +44 -0
  292. package/src/dialect/gemini.ts +597 -0
  293. package/src/dialect/gemma.md +33 -0
  294. package/src/dialect/gemma.ts +387 -0
  295. package/src/dialect/glm.md +32 -0
  296. package/src/dialect/glm.ts +456 -0
  297. package/src/dialect/harmony.md +31 -0
  298. package/src/dialect/harmony.ts +346 -0
  299. package/src/dialect/hermes.md +25 -0
  300. package/src/dialect/hermes.ts +206 -0
  301. package/src/dialect/history.ts +81 -0
  302. package/src/dialect/index.ts +15 -0
  303. package/src/dialect/inventory.ts +73 -0
  304. package/src/dialect/kimi.md +24 -0
  305. package/src/dialect/kimi.ts +340 -0
  306. package/src/dialect/minimax.md +31 -0
  307. package/src/dialect/minimax.ts +95 -0
  308. package/src/dialect/owned-stream.ts +470 -0
  309. package/src/dialect/prompt-template.md +12 -0
  310. package/src/dialect/qwen3.md +28 -0
  311. package/src/dialect/qwen3.ts +240 -0
  312. package/src/dialect/rendering.ts +249 -0
  313. package/src/dialect/thinking.ts +122 -0
  314. package/src/dialect/types.ts +57 -0
  315. package/src/dialect/xml.md +22 -0
  316. package/src/dialect/xml.ts +90 -0
  317. package/src/error/abort.ts +18 -0
  318. package/src/error/auth-classify.ts +30 -0
  319. package/src/error/auth.ts +48 -0
  320. package/src/error/aws.ts +31 -0
  321. package/src/error/classes.ts +186 -0
  322. package/src/error/finalize.ts +69 -0
  323. package/src/error/flags.ts +506 -0
  324. package/src/error/format.ts +45 -0
  325. package/src/error/gateway.ts +96 -0
  326. package/src/error/index.ts +13 -0
  327. package/src/error/oauth.ts +58 -0
  328. package/src/error/provider.ts +62 -0
  329. package/src/error/rate-limit.ts +161 -0
  330. package/src/error/retryable.ts +70 -0
  331. package/src/error/validation.ts +44 -0
  332. package/src/index.ts +49 -0
  333. package/src/provider-details.ts +90 -0
  334. package/src/providers/__tests__/google-auth.test.ts +144 -0
  335. package/src/providers/__tests__/kimi-code-thinking.test.ts +112 -0
  336. package/src/providers/__tests__/openai-codex-error.test.ts +84 -0
  337. package/src/providers/amazon-bedrock.ts +1042 -0
  338. package/src/providers/anthropic-client.ts +295 -0
  339. package/src/providers/anthropic-messages-server-schema.ts +252 -0
  340. package/src/providers/anthropic-messages-server.ts +756 -0
  341. package/src/providers/anthropic-wire.ts +318 -0
  342. package/src/providers/anthropic.ts +4078 -0
  343. package/src/providers/aws-credentials.ts +586 -0
  344. package/src/providers/aws-eventstream.ts +181 -0
  345. package/src/providers/aws-sigv4.ts +218 -0
  346. package/src/providers/azure-openai-responses.ts +382 -0
  347. package/src/providers/cursor/proto/agent.proto +3526 -0
  348. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  349. package/src/providers/cursor/proto/buf.yaml +17 -0
  350. package/src/providers/cursor.ts +2695 -0
  351. package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
  352. package/src/providers/devin/proto/buf.gen.yaml +33 -0
  353. package/src/providers/devin/proto/buf.yaml +17 -0
  354. package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
  355. package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
  356. package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
  357. package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
  358. package/src/providers/devin/proto/cel/expr/value.proto +41 -0
  359. package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
  360. package/src/providers/devin/proto/errorspb/errors.proto +56 -0
  361. package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
  362. package/src/providers/devin/proto/errorspb/markers.proto +10 -0
  363. package/src/providers/devin/proto/errorspb/tags.proto +12 -0
  364. package/src/providers/devin/proto/errorspb/testing.proto +6 -0
  365. package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
  366. package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
  367. package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
  368. package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
  369. package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
  370. package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
  371. package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
  372. package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
  373. package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
  374. package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
  375. package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
  376. package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
  377. package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
  378. package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
  379. package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
  380. package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
  381. package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
  382. package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
  383. package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
  384. package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
  385. package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
  386. package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
  387. package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
  388. package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
  389. package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
  390. package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
  391. package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
  392. package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
  393. package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
  394. package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
  395. package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
  396. package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
  397. package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
  398. package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
  399. package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
  400. package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
  401. package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
  402. package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
  403. package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
  404. package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
  405. package/src/providers/devin.ts +577 -0
  406. package/src/providers/error-message.ts +21 -0
  407. package/src/providers/github-copilot-headers.ts +141 -0
  408. package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
  409. package/src/providers/gitlab-duo-workflow.ts +3058 -0
  410. package/src/providers/gitlab-duo.ts +395 -0
  411. package/src/providers/google-auth.ts +350 -0
  412. package/src/providers/google-gemini-cli.ts +1362 -0
  413. package/src/providers/google-interactions.ts +753 -0
  414. package/src/providers/google-shared.ts +1103 -0
  415. package/src/providers/google-types.ts +180 -0
  416. package/src/providers/google-vertex.ts +183 -0
  417. package/src/providers/google.ts +87 -0
  418. package/src/providers/grammar.ts +70 -0
  419. package/src/providers/kimi.ts +52 -0
  420. package/src/providers/mock.ts +507 -0
  421. package/src/providers/ollama.ts +773 -0
  422. package/src/providers/openai-anthropic-shim.ts +152 -0
  423. package/src/providers/openai-chat-server-schema.ts +242 -0
  424. package/src/providers/openai-chat-server.ts +715 -0
  425. package/src/providers/openai-chat-wire.ts +847 -0
  426. package/src/providers/openai-codex/request-transformer.ts +295 -0
  427. package/src/providers/openai-codex/response-handler.ts +102 -0
  428. package/src/providers/openai-codex-responses.ts +3468 -0
  429. package/src/providers/openai-completions.ts +2173 -0
  430. package/src/providers/openai-reasoning-fallback.ts +269 -0
  431. package/src/providers/openai-responses-reasoning-suppression.md +1 -0
  432. package/src/providers/openai-responses-server-schema.ts +282 -0
  433. package/src/providers/openai-responses-server.ts +1280 -0
  434. package/src/providers/openai-responses-wire.ts +6391 -0
  435. package/src/providers/openai-responses.ts +1022 -0
  436. package/src/providers/openai-shared.ts +2648 -0
  437. package/src/providers/pi-native-client.ts +266 -0
  438. package/src/providers/pi-native-server.ts +242 -0
  439. package/src/providers/register-builtins.ts +475 -0
  440. package/src/providers/synthetic.ts +50 -0
  441. package/src/providers/transform-messages.ts +787 -0
  442. package/src/providers/vision-guard.ts +54 -0
  443. package/src/registry/aimlapi.ts +6 -0
  444. package/src/registry/alibaba-coding-plan.ts +95 -0
  445. package/src/registry/amazon-bedrock.ts +22 -0
  446. package/src/registry/anthropic.ts +26 -0
  447. package/src/registry/api-key-login.ts +112 -0
  448. package/src/registry/api-key-validation.ts +161 -0
  449. package/src/registry/azure.ts +6 -0
  450. package/src/registry/cerebras.ts +23 -0
  451. package/src/registry/cloudflare-ai-gateway.ts +45 -0
  452. package/src/registry/coreweave.ts +40 -0
  453. package/src/registry/cursor.ts +20 -0
  454. package/src/registry/deepseek.ts +46 -0
  455. package/src/registry/derived.ts +9 -0
  456. package/src/registry/devin.ts +15 -0
  457. package/src/registry/firepass.ts +32 -0
  458. package/src/registry/fireworks.ts +28 -0
  459. package/src/registry/github-copilot.ts +22 -0
  460. package/src/registry/gitlab-duo-workflow.ts +20 -0
  461. package/src/registry/gitlab-duo.ts +19 -0
  462. package/src/registry/google-antigravity.ts +22 -0
  463. package/src/registry/google-gemini-cli.ts +22 -0
  464. package/src/registry/google-vertex.ts +38 -0
  465. package/src/registry/google.ts +6 -0
  466. package/src/registry/groq.ts +6 -0
  467. package/src/registry/huggingface.ts +29 -0
  468. package/src/registry/index.ts +4 -0
  469. package/src/registry/kagi.ts +46 -0
  470. package/src/registry/kilo.ts +114 -0
  471. package/src/registry/kimi-code.ts +17 -0
  472. package/src/registry/litellm.ts +45 -0
  473. package/src/registry/llama-cpp.ts +35 -0
  474. package/src/registry/lm-studio.ts +31 -0
  475. package/src/registry/minimax-code-cn.ts +12 -0
  476. package/src/registry/minimax-code.ts +12 -0
  477. package/src/registry/minimax.ts +6 -0
  478. package/src/registry/mistral.ts +6 -0
  479. package/src/registry/moonshot.ts +22 -0
  480. package/src/registry/nanogpt.ts +22 -0
  481. package/src/registry/nvidia.ts +61 -0
  482. package/src/registry/oauth/__tests__/xai-oauth.test.ts +104 -0
  483. package/src/registry/oauth/anthropic.ts +311 -0
  484. package/src/registry/oauth/callback-server.ts +315 -0
  485. package/src/registry/oauth/cursor.ts +171 -0
  486. package/src/registry/oauth/devin.ts +124 -0
  487. package/src/registry/oauth/github-copilot.ts +369 -0
  488. package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
  489. package/src/registry/oauth/gitlab-duo.ts +222 -0
  490. package/src/registry/oauth/google-antigravity.ts +209 -0
  491. package/src/registry/oauth/google-gemini-cli.ts +273 -0
  492. package/src/registry/oauth/google-oauth-shared.ts +125 -0
  493. package/src/registry/oauth/index.ts +269 -0
  494. package/src/registry/oauth/kimi.ts +289 -0
  495. package/src/registry/oauth/minimax-code.ts +53 -0
  496. package/src/registry/oauth/oauth.html +311 -0
  497. package/src/registry/oauth/openai-codex.ts +364 -0
  498. package/src/registry/oauth/opencode.ts +50 -0
  499. package/src/registry/oauth/perplexity.ts +228 -0
  500. package/src/registry/oauth/pkce.ts +18 -0
  501. package/src/registry/oauth/types.ts +65 -0
  502. package/src/registry/oauth/wafer.ts +24 -0
  503. package/src/registry/oauth/xai-oauth.ts +394 -0
  504. package/src/registry/oauth/xiaomi.ts +211 -0
  505. package/src/registry/ollama-cloud.ts +36 -0
  506. package/src/registry/ollama.ts +43 -0
  507. package/src/registry/openai-codex-device.ts +18 -0
  508. package/src/registry/openai-codex.ts +19 -0
  509. package/src/registry/openai.ts +6 -0
  510. package/src/registry/opencode-go.ts +12 -0
  511. package/src/registry/opencode-zen.ts +12 -0
  512. package/src/registry/openrouter.ts +28 -0
  513. package/src/registry/parallel.ts +45 -0
  514. package/src/registry/perplexity.ts +13 -0
  515. package/src/registry/qianfan.ts +27 -0
  516. package/src/registry/qwen-portal.ts +50 -0
  517. package/src/registry/registry.ts +161 -0
  518. package/src/registry/sakana.ts +22 -0
  519. package/src/registry/synthetic.ts +21 -0
  520. package/src/registry/tavily.ts +45 -0
  521. package/src/registry/together.ts +22 -0
  522. package/src/registry/types.ts +56 -0
  523. package/src/registry/umans.ts +23 -0
  524. package/src/registry/venice.ts +33 -0
  525. package/src/registry/vercel-ai-gateway.ts +38 -0
  526. package/src/registry/vllm.ts +34 -0
  527. package/src/registry/wafer-serverless.ts +12 -0
  528. package/src/registry/xai-oauth.ts +17 -0
  529. package/src/registry/xai.ts +6 -0
  530. package/src/registry/xiaomi-token-plan-ams.ts +12 -0
  531. package/src/registry/xiaomi-token-plan-cn.ts +12 -0
  532. package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
  533. package/src/registry/xiaomi.ts +12 -0
  534. package/src/registry/zai.ts +27 -0
  535. package/src/registry/zenmux.ts +22 -0
  536. package/src/registry/zhipu-coding-plan.ts +27 -0
  537. package/src/stream.ts +1778 -0
  538. package/src/types.ts +856 -0
  539. package/src/usage/claude.ts +485 -0
  540. package/src/usage/gemini.ts +258 -0
  541. package/src/usage/github-copilot.ts +424 -0
  542. package/src/usage/google-antigravity.ts +497 -0
  543. package/src/usage/kimi.ts +271 -0
  544. package/src/usage/minimax-code.ts +30 -0
  545. package/src/usage/ollama.ts +41 -0
  546. package/src/usage/openai-codex-base-url.ts +35 -0
  547. package/src/usage/openai-codex-reset.ts +174 -0
  548. package/src/usage/openai-codex.ts +535 -0
  549. package/src/usage/opencode-go.ts +89 -0
  550. package/src/usage/shared.ts +10 -0
  551. package/src/usage/zai.ts +321 -0
  552. package/src/usage.ts +333 -0
  553. package/src/utils/abort.ts +67 -0
  554. package/src/utils/anthropic-auth.ts +93 -0
  555. package/src/utils/block-symbols.ts +32 -0
  556. package/src/utils/deterministic-id.ts +20 -0
  557. package/src/utils/empty-completion-retry.ts +159 -0
  558. package/src/utils/event-stream.ts +171 -0
  559. package/src/utils/foundry.ts +8 -0
  560. package/src/utils/google-validation.ts +25 -0
  561. package/src/utils/harmony-leak.ts +456 -0
  562. package/src/utils/http-inspector.ts +168 -0
  563. package/src/utils/idle-iterator.ts +473 -0
  564. package/src/utils/leaked-thinking-stream.ts +294 -0
  565. package/src/utils/openai-http.ts +122 -0
  566. package/src/utils/openrouter-headers.ts +12 -0
  567. package/src/utils/parse-bind.ts +56 -0
  568. package/src/utils/provider-response.ts +30 -0
  569. package/src/utils/proxy.ts +240 -0
  570. package/src/utils/request-debug.ts +351 -0
  571. package/src/utils/retry-after.ts +110 -0
  572. package/src/utils/retry.ts +59 -0
  573. package/src/utils/schema/CONSTRAINTS.md +166 -0
  574. package/src/utils/schema/adapt.ts +36 -0
  575. package/src/utils/schema/compatibility.ts +435 -0
  576. package/src/utils/schema/dereference.ts +98 -0
  577. package/src/utils/schema/draft.ts +341 -0
  578. package/src/utils/schema/equality.ts +97 -0
  579. package/src/utils/schema/fields.ts +207 -0
  580. package/src/utils/schema/index.ts +15 -0
  581. package/src/utils/schema/json-schema-validator.ts +595 -0
  582. package/src/utils/schema/meta-validator.ts +167 -0
  583. package/src/utils/schema/normalize.ts +1901 -0
  584. package/src/utils/schema/spill.ts +43 -0
  585. package/src/utils/schema/stamps.ts +109 -0
  586. package/src/utils/schema/strict-tool-validation.ts +117 -0
  587. package/src/utils/schema/types.ts +10 -0
  588. package/src/utils/schema/typescript.ts +198 -0
  589. package/src/utils/schema/wire.ts +789 -0
  590. package/src/utils/schema/zod-decontaminate.ts +331 -0
  591. package/src/utils/sdk-stream-timeout.ts +43 -0
  592. package/src/utils/sse-debug.ts +18 -0
  593. package/src/utils/stream-markup-healing.ts +247 -0
  594. package/src/utils/thinking-loop.ts +552 -0
  595. package/src/utils/tool-call-loop-guard.ts +107 -0
  596. package/src/utils/tool-choice.ts +99 -0
  597. package/src/utils/validation.ts +1507 -0
  598. package/src/utils.ts +171 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Tool-call argument validation pipeline.
3
+ *
4
+ * Tools may declare their parameters as either Zod schemas (canonical) or
5
+ * plain JSON Schema (legacy / extensions). This module is the single
6
+ * entrypoint the agent calls before dispatching a tool — it:
7
+ *
8
+ * 1. Builds (or fetches from cache) a `ValidationContext` for the tool —
9
+ * the Zod schema if available plus the equivalent wire JSON Schema, or
10
+ * just the JSON Schema for non-Zod tools.
11
+ * 2. Normalizes LLM quirks (null / "null" → omit-or-default substitution)
12
+ * against the JSON Schema before validation.
13
+ * 3. Validates with the Zod or JSON-Schema validator.
14
+ * 4. On failure, walks the resulting issues and coerces common LLM type
15
+ * drift (JSON-stringified values, boolean/number/string scalar drift),
16
+ * drops unrecognized keys, and retries up to `MAX_COERCION_PASSES` times.
17
+ * 5. Throws a formatted error if reconciliation fails; otherwise returns
18
+ * the parsed arguments with original unknown root fields preserved (so
19
+ * hallucinated top-level keys still surface to the caller).
20
+ *
21
+ * The goal is to be conservative: every coercion is a structural rewrite that
22
+ * keeps the schema in charge of acceptance — we never invent values, only
23
+ * massage shapes the LLM almost got right.
24
+ */
25
+ import type { Tool, ToolCall } from "../types";
26
+ /**
27
+ * Finds a tool by name and validates the tool call arguments against its schema.
28
+ * @param tools Array of tool definitions
29
+ * @param toolCall The tool call from the LLM
30
+ * @returns The validated arguments
31
+ * @throws Error if tool is not found or validation fails
32
+ */
33
+ export declare function validateToolCall(tools: Tool[], toolCall: ToolCall): ToolCall["arguments"];
34
+ /**
35
+ * Validates tool call arguments against the tool's schema (Zod or plain JSON
36
+ * Schema). Applies LLM-quirk coercions (numeric strings, JSON-string
37
+ * containers, null/invalid-empty-string-for-optional, null-for-default) before
38
+ * declaring failure.
39
+ *
40
+ * @throws Error with a formatted message when validation cannot be reconciled.
41
+ */
42
+ export declare function validateToolArguments(tool: Tool, toolCall: ToolCall): ToolCall["arguments"];
@@ -0,0 +1,24 @@
1
+ import type { ResponseInput } from "./providers/openai-responses-wire";
2
+ import type { CacheRetention, OpenAIResponsesHistoryPayload, ProviderPayload } from "./types";
3
+ export { isRecord } from "jeopi-utils";
4
+ export declare function normalizeSystemPrompts(systemPrompt: readonly string[] | string | undefined | null): string[];
5
+ export declare function normalizeToolCallId(id: string): string;
6
+ type ResponsesToolItemIdPrefix = "fc" | "ctc";
7
+ export declare function normalizeResponsesToolCallId(id: string, itemPrefix?: ResponsesToolItemIdPrefix): {
8
+ callId: string;
9
+ itemId: string;
10
+ };
11
+ /**
12
+ * Truncate an OpenAI Responses API item ID to 64 characters.
13
+ * IDs exceeding the limit are replaced with a hash-based ID using the given prefix.
14
+ */
15
+ export declare function truncateResponseItemId(id: string, prefix: string): string;
16
+ export declare function sanitizeOpenAIResponsesHistoryItemsForReplay(items: Array<Record<string, unknown>>): ResponseInput;
17
+ export declare function createOpenAIResponsesHistoryPayload(provider: string, items: Array<Record<string, unknown>>, incremental?: boolean): OpenAIResponsesHistoryPayload;
18
+ export declare function getOpenAIResponsesHistoryPayload(providerPayload: ProviderPayload | undefined, currentProvider: string, fallbackProvider?: string): OpenAIResponsesHistoryPayload | undefined;
19
+ export declare function getOpenAIResponsesHistoryItems(providerPayload: ProviderPayload | undefined, currentProvider: string, fallbackProvider?: string): Array<Record<string, unknown>> | undefined;
20
+ /**
21
+ * Resolve cache retention preference.
22
+ * Defaults to "short" and uses PI_CACHE_RETENTION for backward compatibility.
23
+ */
24
+ export declare function resolveCacheRetention(cacheRetention?: CacheRetention): CacheRetention;
package/package.json ADDED
@@ -0,0 +1,139 @@
1
+ {
2
+ "type": "module",
3
+ "name": "jeopi-ai",
4
+ "version": "16.2.13",
5
+ "description": "Unified LLM API with automatic model discovery and provider configuration",
6
+ "homepage": "https://github.com/akillness/jeopi",
7
+ "author": "Can Boluk",
8
+ "contributors": [
9
+ "Mario Zechner"
10
+ ],
11
+ "license": "MIT",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/akillness/jeopi.git",
15
+ "directory": "packages/ai"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/akillness/jeopi/issues"
19
+ },
20
+ "keywords": [
21
+ "ai",
22
+ "llm",
23
+ "openai",
24
+ "anthropic",
25
+ "gemini",
26
+ "unified",
27
+ "api"
28
+ ],
29
+ "main": "./src/index.ts",
30
+ "types": "./dist/types/index.d.ts",
31
+ "scripts": {
32
+ "check": "biome check . && bun run check:types",
33
+ "check:types": "tsgo -p tsconfig.json --noEmit",
34
+ "lint": "biome lint .",
35
+ "test": "bun test --parallel",
36
+ "fix": "biome check --write --unsafe .",
37
+ "fmt": "biome format --write ."
38
+ },
39
+ "dependencies": {
40
+ "@bufbuild/protobuf": "^2.12.0",
41
+ "jeopi-catalog": "16.2.13",
42
+ "jeopi-utils": "16.2.13",
43
+ "jeopi-wire": "16.2.13",
44
+ "arktype": "^2.2.0",
45
+ "zod": "^4"
46
+ },
47
+ "devDependencies": {
48
+ "@bufbuild/protoc-gen-es": "^2.12.0",
49
+ "@types/bun": "^1.3.14"
50
+ },
51
+ "engines": {
52
+ "bun": ">=1.3.14"
53
+ },
54
+ "files": [
55
+ "src",
56
+ "README.md",
57
+ "CHANGELOG.md",
58
+ "dist/types"
59
+ ],
60
+ "exports": {
61
+ ".": {
62
+ "types": "./dist/types/index.d.ts",
63
+ "import": "./src/index.ts"
64
+ },
65
+ "./error": {
66
+ "types": "./dist/types/error/index.d.ts",
67
+ "import": "./src/error/index.ts"
68
+ },
69
+ "./*": {
70
+ "types": "./dist/types/*.d.ts",
71
+ "import": "./src/*.ts"
72
+ },
73
+ "./auth-broker": {
74
+ "types": "./dist/types/auth-broker/index.d.ts",
75
+ "import": "./src/auth-broker/index.ts"
76
+ },
77
+ "./auth-broker/*": {
78
+ "types": "./dist/types/auth-broker/*.d.ts",
79
+ "import": "./src/auth-broker/*.ts"
80
+ },
81
+ "./auth-gateway": {
82
+ "types": "./dist/types/auth-gateway/index.d.ts",
83
+ "import": "./src/auth-gateway/index.ts"
84
+ },
85
+ "./auth-gateway/*": {
86
+ "types": "./dist/types/auth-gateway/*.d.ts",
87
+ "import": "./src/auth-gateway/*.ts"
88
+ },
89
+ "./providers/*": {
90
+ "types": "./dist/types/providers/*.d.ts",
91
+ "import": "./src/providers/*.ts"
92
+ },
93
+ "./providers/openai-codex/*": {
94
+ "types": "./dist/types/providers/openai-codex/*.d.ts",
95
+ "import": "./src/providers/openai-codex/*.ts"
96
+ },
97
+ "./usage/*": {
98
+ "types": "./dist/types/usage/*.d.ts",
99
+ "import": "./src/usage/*.ts"
100
+ },
101
+ "./utils/harmony-leak": {
102
+ "types": "./dist/types/utils/harmony-leak.d.ts",
103
+ "import": "./src/utils/harmony-leak.ts"
104
+ },
105
+ "./dialect": {
106
+ "types": "./dist/types/dialect/index.d.ts",
107
+ "import": "./src/dialect/index.ts"
108
+ },
109
+ "./utils/*": {
110
+ "types": "./dist/types/utils/*.d.ts",
111
+ "import": "./src/utils/*.ts"
112
+ },
113
+ "./oauth": {
114
+ "types": "./dist/types/registry/oauth/index.d.ts",
115
+ "import": "./src/registry/oauth/index.ts"
116
+ },
117
+ "./oauth/*": {
118
+ "types": "./dist/types/registry/oauth/*.d.ts",
119
+ "import": "./src/registry/oauth/*.ts"
120
+ },
121
+ "./registry": {
122
+ "types": "./dist/types/registry/index.d.ts",
123
+ "import": "./src/registry/index.ts"
124
+ },
125
+ "./registry/oauth": {
126
+ "types": "./dist/types/registry/oauth/index.d.ts",
127
+ "import": "./src/registry/oauth/index.ts"
128
+ },
129
+ "./utils/schema": {
130
+ "types": "./dist/types/utils/schema/index.d.ts",
131
+ "import": "./src/utils/schema/index.ts"
132
+ },
133
+ "./utils/schema/*": {
134
+ "types": "./dist/types/utils/schema/*.d.ts",
135
+ "import": "./src/utils/schema/*.ts"
136
+ },
137
+ "./*.js": "./src/*.ts"
138
+ }
139
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Custom API provider registry.
3
+ *
4
+ * Allows extensions to register streaming functions for custom API types
5
+ * (e.g., "vertex-claude-api") that are not built into stream.ts.
6
+ */
7
+
8
+ import * as AIError from "./error";
9
+ import type {
10
+ Api,
11
+ AssistantMessageEventStream,
12
+ Context,
13
+ KnownApi,
14
+ Model,
15
+ SimpleStreamOptions,
16
+ StreamOptions,
17
+ } from "./types";
18
+
19
+ const BUILTIN_API_IDS = [
20
+ "openai-completions",
21
+ "openai-responses",
22
+ "openrouter",
23
+ "openai-codex-responses",
24
+ "azure-openai-responses",
25
+ "anthropic-messages",
26
+ "bedrock-converse-stream",
27
+ "google-generative-ai",
28
+ "google-gemini-cli",
29
+ "google-vertex",
30
+ "ollama-chat",
31
+ "cursor-agent",
32
+ "gitlab-duo-agent",
33
+ "devin-agent",
34
+ ] as const satisfies readonly KnownApi[];
35
+
36
+ type _MissingBuiltinApis = Exclude<KnownApi, (typeof BUILTIN_API_IDS)[number]>;
37
+ type _CheckBuiltinApis = _MissingBuiltinApis extends never
38
+ ? true
39
+ : ["BUILTIN_APIS is missing KnownApi values", _MissingBuiltinApis];
40
+ true satisfies _CheckBuiltinApis;
41
+
42
+ const BUILTIN_APIS = new Set<KnownApi>(BUILTIN_API_IDS);
43
+
44
+ export type CustomStreamFn = (
45
+ model: Model<Api>,
46
+ context: Context,
47
+ options?: StreamOptions,
48
+ ) => AssistantMessageEventStream;
49
+ export type CustomStreamSimpleFn = (
50
+ model: Model<Api>,
51
+ context: Context,
52
+ options?: SimpleStreamOptions,
53
+ ) => AssistantMessageEventStream;
54
+
55
+ export interface RegisteredCustomApi {
56
+ stream: CustomStreamFn;
57
+ streamSimple: CustomStreamSimpleFn;
58
+ sourceId?: string;
59
+ }
60
+
61
+ const customApiRegistry = new Map<string, RegisteredCustomApi>();
62
+
63
+ function assertCustomApiName(api: string): void {
64
+ if (BUILTIN_APIS.has(api as KnownApi)) {
65
+ throw new AIError.ConfigurationError(`Cannot register custom API "${api}": built-in API names are reserved.`);
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Register a custom API streaming function.
71
+ */
72
+ export function registerCustomApi(
73
+ api: string,
74
+ streamSimple: CustomStreamSimpleFn,
75
+ sourceId?: string,
76
+ stream?: CustomStreamFn,
77
+ ): void {
78
+ assertCustomApiName(api);
79
+ customApiRegistry.set(api, {
80
+ stream: stream ?? ((model, context, options) => streamSimple(model, context, options as SimpleStreamOptions)),
81
+ streamSimple,
82
+ sourceId,
83
+ });
84
+ }
85
+
86
+ /**
87
+ * Get a custom API provider by API identifier.
88
+ */
89
+ export function getCustomApi(api: string): RegisteredCustomApi | undefined {
90
+ return customApiRegistry.get(api);
91
+ }
92
+
93
+ /**
94
+ * Remove all custom APIs registered by a specific source (e.g., extension path).
95
+ */
96
+ export function unregisterCustomApis(sourceId: string): void {
97
+ for (const [api, entry] of customApiRegistry.entries()) {
98
+ if (entry.sourceId === sourceId) {
99
+ customApiRegistry.delete(api);
100
+ }
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Clear all custom API registrations.
106
+ */
107
+ export function clearCustomApis(): void {
108
+ customApiRegistry.clear();
109
+ }
@@ -0,0 +1,359 @@
1
+ /**
2
+ * HTTP client for the omp auth-broker server.
3
+ *
4
+ * Used by {@link RemoteAuthCredentialStore} (snapshot pulls) and by
5
+ * `omp auth-broker status` (liveness checks). All endpoints except
6
+ * `/v1/healthz` require a bearer token.
7
+ */
8
+
9
+ import { type } from "arktype";
10
+ import { readSseEvents } from "jeopi-utils";
11
+ import type { AuthCredential } from "../auth-storage";
12
+ import type {
13
+ CredentialDisableRequest,
14
+ CredentialDisableResponse,
15
+ CredentialRefreshResponse,
16
+ CredentialUploadRequest,
17
+ CredentialUploadResponse,
18
+ HealthzResponse,
19
+ SnapshotResponse,
20
+ SnapshotStreamEvent,
21
+ UsageResponse,
22
+ } from "./types";
23
+ import {
24
+ credentialDisableResponseSchema,
25
+ credentialRefreshResponseSchema,
26
+ credentialUploadResponseSchema,
27
+ healthzResponseSchema,
28
+ snapshotResponseSchema,
29
+ snapshotStreamEventSchema,
30
+ usageResponseSchema,
31
+ } from "./wire-schemas";
32
+
33
+ export interface AuthBrokerClientOptions {
34
+ /** Base URL (e.g. `https://broker.tailnet:8765`). Trailing slashes are trimmed. */
35
+ url: string;
36
+ /** Bearer token used for everything except `healthz`. */
37
+ token: string;
38
+ /** Per-request timeout in milliseconds. Default 10s. */
39
+ timeoutMs?: number;
40
+ /** Retry connection errors this many times. Default 1. */
41
+ maxRetries?: number;
42
+ /** Override fetch (used in tests). Default global `fetch`. */
43
+ fetchImpl?: typeof fetch;
44
+ }
45
+
46
+ export class AuthBrokerError extends Error {
47
+ readonly status: number | undefined;
48
+ readonly body: string | undefined;
49
+ constructor(message: string, opts: { status?: number; body?: string; cause?: unknown } = {}) {
50
+ super(message, { cause: opts.cause });
51
+ this.name = "AuthBrokerError";
52
+ this.status = opts.status;
53
+ this.body = opts.body;
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Thrown when a broker responds 404 to `GET /v1/snapshot/stream` — old
59
+ * brokers that predate the SSE endpoint. Callers (`RemoteAuthCredentialStore`)
60
+ * detect this sentinel to fall back to long-polling permanently.
61
+ */
62
+ export class AuthBrokerStreamUnsupportedError extends AuthBrokerError {
63
+ constructor(message = "Auth broker does not support /v1/snapshot/stream") {
64
+ super(message, { status: 404 });
65
+ this.name = "AuthBrokerStreamUnsupportedError";
66
+ }
67
+ }
68
+
69
+ export interface FetchSnapshotOptions {
70
+ ifGenerationGt?: number;
71
+ waitMs?: number;
72
+ signal?: AbortSignal;
73
+ }
74
+
75
+ export type FetchSnapshotResult =
76
+ | { status: 200; snapshot: SnapshotResponse; generation: number }
77
+ | { status: 304; generation: number };
78
+
79
+ function parseGenerationTag(header: string | null): number | undefined {
80
+ if (!header) return undefined;
81
+ let value = header.trim();
82
+ if (value.startsWith("W/")) value = value.slice(2).trim();
83
+ if (value.startsWith('"') && value.endsWith('"') && value.length >= 2) {
84
+ value = value.slice(1, -1);
85
+ }
86
+ const generation = Number(value);
87
+ if (!Number.isInteger(generation) || generation < 0) return undefined;
88
+ return generation;
89
+ }
90
+
91
+ const DEFAULT_TIMEOUT_MS = 10_000;
92
+ const DEFAULT_MAX_RETRIES = 1;
93
+
94
+ export class AuthBrokerClient {
95
+ readonly #baseUrl: string;
96
+ readonly #token: string;
97
+ readonly #timeoutMs: number;
98
+ readonly #maxRetries: number;
99
+ readonly #fetch: typeof fetch;
100
+
101
+ constructor(opts: AuthBrokerClientOptions) {
102
+ this.#baseUrl = opts.url.replace(/\/+$/, "");
103
+ this.#token = opts.token;
104
+ this.#timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
105
+ this.#maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES;
106
+ this.#fetch = opts.fetchImpl ?? fetch;
107
+ }
108
+
109
+ healthz(signal?: AbortSignal): Promise<HealthzResponse> {
110
+ return this.#request("GET", "/v1/healthz", { schema: healthzResponseSchema, auth: false, signal });
111
+ }
112
+
113
+ async fetchSnapshot(opts: FetchSnapshotOptions = {}): Promise<FetchSnapshotResult> {
114
+ return this.#fetchSnapshotResult(opts);
115
+ }
116
+ async #fetchSnapshotResult(opts: FetchSnapshotOptions): Promise<FetchSnapshotResult> {
117
+ const query = new URLSearchParams();
118
+ if (opts.waitMs !== undefined) query.set("wait", String(opts.waitMs));
119
+ const path = `/v1/snapshot${query.size > 0 ? `?${query.toString()}` : ""}`;
120
+ const headers: Record<string, string> = {};
121
+ if (opts.ifGenerationGt !== undefined) headers["If-None-Match"] = `"${opts.ifGenerationGt}"`;
122
+ const timeoutMs =
123
+ opts.waitMs !== undefined && opts.waitMs > 0 ? Math.max(this.#timeoutMs, opts.waitMs + 1000) : undefined;
124
+ const response = await this.#fetchRaw("GET", path, {
125
+ auth: true,
126
+ headers,
127
+ signal: opts.signal,
128
+ timeoutMs,
129
+ });
130
+ const etagGeneration = parseGenerationTag(response.headers.get("etag"));
131
+ if (response.status === 304) {
132
+ return { status: 304, generation: etagGeneration ?? opts.ifGenerationGt ?? 0 };
133
+ }
134
+ const text = await response.text();
135
+ const raw = this.#parseJson(text, response.status);
136
+ const validated = snapshotResponseSchema(raw);
137
+ if (validated instanceof type.errors) {
138
+ throw new AuthBrokerError("Auth broker response failed schema validation", {
139
+ status: response.status,
140
+ body: validated.summary,
141
+ });
142
+ }
143
+ const snapshot = validated as SnapshotResponse;
144
+ return { status: 200, snapshot, generation: etagGeneration ?? snapshot.generation };
145
+ }
146
+
147
+ /**
148
+ * Subscribe to the broker's SSE snapshot stream. The first frame is always
149
+ * a full `snapshot`; subsequent frames are `entry` upserts / refreshes or
150
+ * `removed` deletes. Caller controls lifecycle via `opts.signal`.
151
+ *
152
+ * Throws {@link AuthBrokerStreamUnsupportedError} when the broker responds
153
+ * 404 — older brokers predate this endpoint and the caller should fall back
154
+ * to long-polling for the remainder of its lifetime.
155
+ */
156
+ async *openSnapshotStream(opts: { signal?: AbortSignal } = {}): AsyncGenerator<SnapshotStreamEvent> {
157
+ const url = `${this.#baseUrl}/v1/snapshot/stream`;
158
+ const headers: Record<string, string> = {
159
+ Accept: "text/event-stream",
160
+ Authorization: `Bearer ${this.#token}`,
161
+ };
162
+ if (opts.signal?.aborted) {
163
+ throw new AuthBrokerError("Auth broker request aborted", { cause: opts.signal.reason });
164
+ }
165
+ // No timeout: this connection is intentionally long-lived. Caller's signal
166
+ // is the only cancel path.
167
+ const response = await this.#fetch(url, { method: "GET", headers, signal: opts.signal });
168
+ if (response.status === 404) {
169
+ // Drain the body so the socket can be reused; tiny payload.
170
+ await response.text().catch(() => {});
171
+ throw new AuthBrokerStreamUnsupportedError();
172
+ }
173
+ if (!response.ok) {
174
+ const text = await response.text().catch(() => "");
175
+ throw new AuthBrokerError(`Auth broker stream failed: ${response.status} ${response.statusText}`, {
176
+ status: response.status,
177
+ body: text,
178
+ });
179
+ }
180
+ if (!response.body) {
181
+ throw new AuthBrokerError("Auth broker stream response had no body", { status: response.status });
182
+ }
183
+ const contentType = response.headers.get("content-type")?.toLowerCase();
184
+ if (contentType?.split(";", 1)[0].trim() !== "text/event-stream") {
185
+ await response.body.cancel().catch(() => {});
186
+ throw new AuthBrokerError("Auth broker stream returned non-SSE response", {
187
+ status: response.status,
188
+ body: contentType ?? "",
189
+ });
190
+ }
191
+
192
+ let sawFirstEvent = false;
193
+ for await (const sse of readSseEvents(response.body, opts.signal)) {
194
+ if (sse.event === null && sse.data === "") continue; // keepalive comment frames
195
+ let parsed: unknown;
196
+ try {
197
+ parsed = JSON.parse(sse.data);
198
+ } catch (err) {
199
+ throw new AuthBrokerError("Auth broker stream returned malformed JSON", {
200
+ body: sse.data,
201
+ cause: err,
202
+ });
203
+ }
204
+ const validated = snapshotStreamEventSchema(parsed);
205
+ if (validated instanceof type.errors) {
206
+ throw new AuthBrokerError("Auth broker stream event failed schema validation", {
207
+ body: validated.summary,
208
+ });
209
+ }
210
+ const event = validated as SnapshotStreamEvent;
211
+ if (!sawFirstEvent) {
212
+ sawFirstEvent = true;
213
+ if (event.kind !== "snapshot") {
214
+ throw new AuthBrokerError("Auth broker stream did not start with snapshot", { body: sse.data });
215
+ }
216
+ }
217
+ yield event;
218
+ }
219
+ if (!opts.signal?.aborted) {
220
+ throw new AuthBrokerError(
221
+ sawFirstEvent
222
+ ? "Auth broker stream ended unexpectedly"
223
+ : "Auth broker stream ended before initial snapshot",
224
+ { status: response.status },
225
+ );
226
+ }
227
+ }
228
+
229
+ fetchUsage(signal?: AbortSignal): Promise<UsageResponse> {
230
+ // Validates the envelope (`generatedAt`, `reports[].provider`, `limits`,
231
+ // `metadata`) but leaves provider-specific extension fields permissive so
232
+ // the broker can ship new shapes ahead of the client. `raw` is accepted
233
+ // but normally stripped by the broker before send.
234
+ return this.#request("GET", "/v1/usage", { schema: usageResponseSchema, signal }) as Promise<UsageResponse>;
235
+ }
236
+
237
+ async refreshCredential(id: number, signal?: AbortSignal): Promise<CredentialRefreshResponse> {
238
+ return this.#request("POST", `/v1/credential/${id}/refresh`, {
239
+ schema: credentialRefreshResponseSchema,
240
+ signal,
241
+ }) as Promise<CredentialRefreshResponse>;
242
+ }
243
+
244
+ async disableCredential(id: number, cause: string, signal?: AbortSignal): Promise<CredentialDisableResponse> {
245
+ const body: CredentialDisableRequest = { cause };
246
+ return this.#request("POST", `/v1/credential/${id}/disable`, {
247
+ body,
248
+ schema: credentialDisableResponseSchema,
249
+ signal,
250
+ });
251
+ }
252
+
253
+ async uploadCredential(
254
+ provider: string,
255
+ credential: AuthCredential,
256
+ signal?: AbortSignal,
257
+ ): Promise<CredentialUploadResponse> {
258
+ const body: CredentialUploadRequest = { provider, credential };
259
+ return this.#request("POST", "/v1/credential", {
260
+ body,
261
+ schema: credentialUploadResponseSchema,
262
+ signal,
263
+ }) as Promise<CredentialUploadResponse>;
264
+ }
265
+
266
+ async #request(
267
+ method: "GET" | "POST",
268
+ path: string,
269
+ opts: { schema: (input: unknown) => unknown; auth?: boolean; body?: unknown; signal?: AbortSignal },
270
+ ): Promise<any> {
271
+ const response = await this.#fetchRaw(method, path, opts);
272
+ const text = await response.text();
273
+ const raw = this.#parseJson(text, response.status);
274
+ const validated = opts.schema(raw);
275
+ if (validated instanceof type.errors) {
276
+ throw new AuthBrokerError("Auth broker response failed schema validation", {
277
+ status: response.status,
278
+ body: validated.summary,
279
+ });
280
+ }
281
+ return validated;
282
+ }
283
+
284
+ #parseJson(text: string, status: number): unknown {
285
+ try {
286
+ return text.length === 0 ? null : JSON.parse(text);
287
+ } catch (parseError) {
288
+ throw new AuthBrokerError("Auth broker returned malformed JSON", {
289
+ status,
290
+ body: text,
291
+ cause: parseError,
292
+ });
293
+ }
294
+ }
295
+
296
+ async #fetchRaw(
297
+ method: "GET" | "POST",
298
+ path: string,
299
+ opts: {
300
+ auth?: boolean;
301
+ body?: unknown;
302
+ signal?: AbortSignal;
303
+ headers?: Record<string, string>;
304
+ timeoutMs?: number;
305
+ },
306
+ ): Promise<Response> {
307
+ const auth = opts.auth ?? true;
308
+ const url = `${this.#baseUrl}${path}`;
309
+ const headers: Record<string, string> = { Accept: "application/json", ...(opts.headers ?? {}) };
310
+ if (auth) headers.Authorization = `Bearer ${this.#token}`;
311
+ let payload: string | undefined;
312
+ if (opts.body !== undefined) {
313
+ payload = JSON.stringify(opts.body);
314
+ headers["Content-Type"] = "application/json";
315
+ }
316
+
317
+ // Fast-fail when the caller's signal is already aborted — avoids spinning
318
+ // up a fetch + timer that the first `await` would just abort anyway.
319
+ if (opts.signal?.aborted) {
320
+ throw new AuthBrokerError("Auth broker request aborted", { cause: opts.signal.reason });
321
+ }
322
+
323
+ let lastError: unknown;
324
+ for (let attempt = 0; attempt <= this.#maxRetries; attempt += 1) {
325
+ const timeoutSignal = AbortSignal.timeout(opts.timeoutMs ?? this.#timeoutMs);
326
+ const signal = opts.signal ? AbortSignal.any([opts.signal, timeoutSignal]) : timeoutSignal;
327
+ try {
328
+ const response = await this.#fetch(url, {
329
+ method,
330
+ headers,
331
+ body: payload,
332
+ signal,
333
+ });
334
+ if (!response.ok && response.status !== 304) {
335
+ const text = await response.text();
336
+ throw new AuthBrokerError(`Auth broker request failed: ${response.status} ${response.statusText}`, {
337
+ status: response.status,
338
+ body: text,
339
+ });
340
+ }
341
+ return response;
342
+ } catch (error) {
343
+ lastError = error;
344
+ // Caller-driven abort wins over retry — the caller said stop.
345
+ if (opts.signal?.aborted) {
346
+ throw new AuthBrokerError("Auth broker request aborted", { cause: opts.signal.reason });
347
+ }
348
+ if (error instanceof AuthBrokerError && error.status !== undefined) {
349
+ // HTTP errors (4xx/5xx) don't retry — caller knows what to do.
350
+ throw error;
351
+ }
352
+ if (attempt >= this.#maxRetries) break;
353
+ }
354
+ }
355
+ throw new AuthBrokerError(`Auth broker request failed after ${this.#maxRetries + 1} attempt(s)`, {
356
+ cause: lastError,
357
+ });
358
+ }
359
+ }