@aryee337/aery-ai 0.2.27 → 0.2.29

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 (417) hide show
  1. package/CHANGELOG.md +2914 -0
  2. package/README.md +614 -813
  3. package/package.json +140 -105
  4. package/src/api-registry.ts +96 -0
  5. package/src/auth-broker/client.ts +358 -0
  6. package/src/auth-broker/index.ts +5 -0
  7. package/src/auth-broker/refresher.ts +117 -0
  8. package/src/auth-broker/remote-store.ts +623 -0
  9. package/src/auth-broker/server.ts +644 -0
  10. package/src/auth-broker/types.ts +127 -0
  11. package/src/auth-broker/wire-schemas.ts +200 -0
  12. package/src/auth-gateway/http.ts +194 -0
  13. package/src/auth-gateway/index.ts +3 -0
  14. package/src/auth-gateway/server.ts +818 -0
  15. package/src/auth-gateway/types.ts +143 -0
  16. package/src/auth-storage.ts +4422 -0
  17. package/src/index.ts +54 -0
  18. package/src/model-cache.ts +129 -0
  19. package/src/model-manager.ts +469 -0
  20. package/src/model-thinking.ts +782 -0
  21. package/src/models.json +83530 -0
  22. package/src/models.json.d.ts +9 -0
  23. package/src/models.ts +56 -0
  24. package/src/prompts/turn-aborted-guidance.md +4 -0
  25. package/src/provider-details.ts +90 -0
  26. package/src/provider-models/bundled-references.ts +38 -0
  27. package/src/provider-models/descriptors.ts +355 -0
  28. package/src/provider-models/google.ts +88 -0
  29. package/src/provider-models/index.ts +5 -0
  30. package/src/provider-models/ollama.ts +153 -0
  31. package/src/provider-models/openai-compat.ts +2817 -0
  32. package/src/provider-models/special.ts +67 -0
  33. package/src/providers/aery-native-client.ts +228 -0
  34. package/src/providers/aery-native-server.ts +212 -0
  35. package/src/providers/amazon-bedrock.ts +873 -0
  36. package/src/providers/anthropic-client.ts +318 -0
  37. package/src/providers/anthropic-messages-server-schema.ts +243 -0
  38. package/src/providers/anthropic-messages-server.ts +683 -0
  39. package/src/providers/anthropic-wire.ts +268 -0
  40. package/src/providers/anthropic.ts +3094 -0
  41. package/src/providers/aws-credentials.ts +501 -0
  42. package/src/providers/aws-eventstream.ts +185 -0
  43. package/src/providers/aws-sigv4.ts +218 -0
  44. package/src/providers/azure-openai-responses.ts +361 -0
  45. package/src/providers/cursor/gen/agent_pb.ts +15274 -0
  46. package/src/providers/cursor/proto/agent.proto +3526 -0
  47. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  48. package/src/providers/cursor/proto/buf.yaml +17 -0
  49. package/src/providers/cursor.ts +2621 -0
  50. package/src/providers/error-message.ts +21 -0
  51. package/src/providers/github-copilot-headers.ts +140 -0
  52. package/src/providers/gitlab-duo.ts +372 -0
  53. package/src/providers/google-auth.ts +252 -0
  54. package/src/providers/google-gemini-cli.ts +809 -0
  55. package/src/providers/google-gemini-headers.ts +41 -0
  56. package/src/providers/google-shared.ts +917 -0
  57. package/src/providers/google-types.ts +167 -0
  58. package/src/providers/google-vertex.ts +91 -0
  59. package/src/providers/google.ts +41 -0
  60. package/src/providers/grammar.ts +70 -0
  61. package/src/providers/kimi.ts +52 -0
  62. package/src/providers/mock.ts +496 -0
  63. package/src/providers/ollama.ts +644 -0
  64. package/src/providers/openai-anthropic-shim.ts +138 -0
  65. package/src/providers/openai-chat-server-schema.ts +252 -0
  66. package/src/providers/openai-chat-server.ts +647 -0
  67. package/src/providers/openai-codex/constants.ts +43 -0
  68. package/src/providers/openai-codex/request-transformer.ts +161 -0
  69. package/src/providers/openai-codex/response-handler.ts +81 -0
  70. package/src/providers/openai-codex-responses.ts +3018 -0
  71. package/src/providers/openai-completions-compat.ts +300 -0
  72. package/src/providers/openai-completions.ts +1979 -0
  73. package/src/providers/openai-responses-server-schema.ts +290 -0
  74. package/src/providers/openai-responses-server.ts +1183 -0
  75. package/src/providers/openai-responses-shared.ts +873 -0
  76. package/src/providers/openai-responses.ts +679 -0
  77. package/src/providers/register-builtins.ts +436 -0
  78. package/src/providers/synthetic.ts +50 -0
  79. package/src/providers/transform-messages.ts +382 -0
  80. package/src/providers/vision-guard.ts +31 -0
  81. package/src/providers/xai-responses.ts +82 -0
  82. package/src/rate-limit-utils.ts +84 -0
  83. package/src/stream.ts +1065 -0
  84. package/src/types.ts +944 -0
  85. package/src/usage/claude.ts +482 -0
  86. package/src/usage/gemini.ts +250 -0
  87. package/src/usage/github-copilot.ts +421 -0
  88. package/src/usage/google-antigravity.ts +201 -0
  89. package/src/usage/kimi.ts +271 -0
  90. package/src/usage/minimax-code.ts +31 -0
  91. package/src/usage/openai-codex.ts +503 -0
  92. package/src/usage/shared.ts +10 -0
  93. package/src/usage/zai.ts +247 -0
  94. package/src/usage.ts +185 -0
  95. package/src/utils/abort.ts +51 -0
  96. package/src/utils/abortable-iterator.ts +69 -0
  97. package/src/utils/anthropic-auth.ts +93 -0
  98. package/src/utils/discovery/antigravity.ts +261 -0
  99. package/src/utils/discovery/codex.ts +371 -0
  100. package/src/utils/discovery/cursor.ts +306 -0
  101. package/src/utils/discovery/gemini.ts +248 -0
  102. package/src/utils/discovery/index.ts +4 -0
  103. package/src/utils/discovery/openai-compatible.ts +224 -0
  104. package/src/utils/event-stream.ts +142 -0
  105. package/src/utils/fireworks-model-id.ts +30 -0
  106. package/src/utils/foundry.ts +8 -0
  107. package/src/utils/http-inspector.ts +176 -0
  108. package/src/utils/idle-iterator.ts +267 -0
  109. package/src/utils/json-parse.ts +182 -0
  110. package/src/utils/oauth/__tests__/xai-oauth.test.ts +107 -0
  111. package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
  112. package/src/utils/oauth/anthropic.ts +273 -0
  113. package/src/utils/oauth/api-key-login.ts +87 -0
  114. package/src/utils/oauth/api-key-validation.ts +92 -0
  115. package/src/utils/oauth/callback-server.ts +276 -0
  116. package/src/utils/oauth/cerebras.ts +16 -0
  117. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  118. package/src/utils/oauth/cursor.ts +157 -0
  119. package/src/utils/oauth/deepseek.ts +53 -0
  120. package/src/utils/oauth/firepass.ts +24 -0
  121. package/src/utils/oauth/fireworks.ts +15 -0
  122. package/src/utils/oauth/github-copilot.ts +362 -0
  123. package/src/utils/oauth/gitlab-duo.ts +123 -0
  124. package/src/utils/oauth/google-antigravity.ts +200 -0
  125. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  126. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  127. package/src/utils/oauth/huggingface.ts +62 -0
  128. package/src/utils/oauth/index.ts +484 -0
  129. package/src/utils/oauth/kagi.ts +47 -0
  130. package/src/utils/oauth/kilo.ts +87 -0
  131. package/src/utils/oauth/kimi.ts +254 -0
  132. package/src/utils/oauth/litellm.ts +47 -0
  133. package/src/utils/oauth/lm-studio.ts +38 -0
  134. package/src/utils/oauth/minimax-code.ts +78 -0
  135. package/src/utils/oauth/moonshot.ts +23 -0
  136. package/src/utils/oauth/nanogpt.ts +15 -0
  137. package/src/utils/oauth/nvidia.ts +70 -0
  138. package/src/utils/oauth/oauth.html +203 -0
  139. package/src/utils/oauth/ollama-cloud.ts +28 -0
  140. package/src/utils/oauth/ollama.ts +47 -0
  141. package/src/utils/oauth/openai-codex.ts +299 -0
  142. package/src/utils/oauth/opencode.ts +49 -0
  143. package/src/utils/oauth/openrouter.ts +20 -0
  144. package/src/utils/oauth/parallel.ts +46 -0
  145. package/src/utils/oauth/perplexity.ts +206 -0
  146. package/src/utils/oauth/pkce.ts +18 -0
  147. package/src/utils/oauth/qianfan.ts +58 -0
  148. package/src/utils/oauth/qwen-portal.ts +60 -0
  149. package/src/utils/oauth/synthetic.ts +15 -0
  150. package/src/utils/oauth/tavily.ts +46 -0
  151. package/src/utils/oauth/together.ts +16 -0
  152. package/src/utils/oauth/types.ts +99 -0
  153. package/src/utils/oauth/venice.ts +59 -0
  154. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  155. package/src/utils/oauth/vllm.ts +40 -0
  156. package/src/utils/oauth/wafer.ts +50 -0
  157. package/src/utils/oauth/xai-oauth.ts +342 -0
  158. package/src/utils/oauth/xiaomi.ts +139 -0
  159. package/src/utils/oauth/zai.ts +60 -0
  160. package/src/utils/oauth/zenmux.ts +15 -0
  161. package/src/utils/oauth/zhipu.ts +60 -0
  162. package/src/utils/overflow.ts +137 -0
  163. package/src/utils/parse-bind.ts +54 -0
  164. package/src/utils/provider-response.ts +30 -0
  165. package/src/utils/request-debug.ts +336 -0
  166. package/src/utils/retry-after.ts +110 -0
  167. package/src/utils/retry.ts +54 -0
  168. package/src/utils/schema/CONSTRAINTS.md +164 -0
  169. package/src/utils/schema/adapt.ts +36 -0
  170. package/src/utils/schema/compatibility.ts +435 -0
  171. package/src/utils/schema/dereference.ts +98 -0
  172. package/src/utils/schema/draft.ts +341 -0
  173. package/src/utils/schema/equality.ts +97 -0
  174. package/src/utils/schema/fields.ts +191 -0
  175. package/src/utils/schema/index.ts +13 -0
  176. package/src/utils/schema/json-schema-validator.ts +577 -0
  177. package/src/utils/schema/meta-validator.ts +167 -0
  178. package/src/utils/schema/normalize.ts +1588 -0
  179. package/src/utils/schema/spill.ts +43 -0
  180. package/src/utils/schema/stamps.ts +97 -0
  181. package/src/utils/schema/types.ts +10 -0
  182. package/src/utils/schema/wire.ts +293 -0
  183. package/src/utils/schema/zod-decontaminate.ts +331 -0
  184. package/src/utils/sdk-stream-timeout.ts +43 -0
  185. package/src/utils/sse-debug.ts +289 -0
  186. package/src/utils/stream-markup-healing.ts +612 -0
  187. package/src/utils/tool-choice.ts +99 -0
  188. package/src/utils/validation.ts +1024 -0
  189. package/src/utils.ts +166 -0
  190. package/dist/api-registry.d.ts +0 -20
  191. package/dist/api-registry.d.ts.map +0 -1
  192. package/dist/api-registry.js +0 -44
  193. package/dist/api-registry.js.map +0 -1
  194. package/dist/bedrock-provider.d.ts +0 -5
  195. package/dist/bedrock-provider.d.ts.map +0 -1
  196. package/dist/bedrock-provider.js +0 -6
  197. package/dist/bedrock-provider.js.map +0 -1
  198. package/dist/cli.d.ts +0 -3
  199. package/dist/cli.d.ts.map +0 -1
  200. package/dist/cli.js +0 -130
  201. package/dist/cli.js.map +0 -1
  202. package/dist/env-api-keys.d.ts +0 -18
  203. package/dist/env-api-keys.d.ts.map +0 -1
  204. package/dist/env-api-keys.js +0 -178
  205. package/dist/env-api-keys.js.map +0 -1
  206. package/dist/image-models.d.ts +0 -10
  207. package/dist/image-models.d.ts.map +0 -1
  208. package/dist/image-models.generated.d.ts +0 -440
  209. package/dist/image-models.generated.d.ts.map +0 -1
  210. package/dist/image-models.generated.js +0 -442
  211. package/dist/image-models.generated.js.map +0 -1
  212. package/dist/image-models.js +0 -23
  213. package/dist/image-models.js.map +0 -1
  214. package/dist/images-api-registry.d.ts +0 -14
  215. package/dist/images-api-registry.d.ts.map +0 -1
  216. package/dist/images-api-registry.js +0 -22
  217. package/dist/images-api-registry.js.map +0 -1
  218. package/dist/images.d.ts +0 -4
  219. package/dist/images.d.ts.map +0 -1
  220. package/dist/images.js +0 -14
  221. package/dist/images.js.map +0 -1
  222. package/dist/index.d.ts +0 -32
  223. package/dist/index.d.ts.map +0 -1
  224. package/dist/index.js +0 -20
  225. package/dist/index.js.map +0 -1
  226. package/dist/models.d.ts +0 -18
  227. package/dist/models.d.ts.map +0 -1
  228. package/dist/models.generated.d.ts +0 -17707
  229. package/dist/models.generated.d.ts.map +0 -1
  230. package/dist/models.generated.js +0 -16561
  231. package/dist/models.generated.js.map +0 -1
  232. package/dist/models.js +0 -71
  233. package/dist/models.js.map +0 -1
  234. package/dist/oauth.d.ts +0 -2
  235. package/dist/oauth.d.ts.map +0 -1
  236. package/dist/oauth.js +0 -2
  237. package/dist/oauth.js.map +0 -1
  238. package/dist/providers/aery-error-formatting.d.ts +0 -13
  239. package/dist/providers/aery-error-formatting.d.ts.map +0 -1
  240. package/dist/providers/aery-error-formatting.js +0 -112
  241. package/dist/providers/aery-error-formatting.js.map +0 -1
  242. package/dist/providers/amazon-bedrock.d.ts +0 -38
  243. package/dist/providers/amazon-bedrock.d.ts.map +0 -1
  244. package/dist/providers/amazon-bedrock.js +0 -763
  245. package/dist/providers/amazon-bedrock.js.map +0 -1
  246. package/dist/providers/anthropic.d.ts +0 -71
  247. package/dist/providers/anthropic.d.ts.map +0 -1
  248. package/dist/providers/anthropic.js +0 -949
  249. package/dist/providers/anthropic.js.map +0 -1
  250. package/dist/providers/azure-openai-responses.d.ts +0 -15
  251. package/dist/providers/azure-openai-responses.d.ts.map +0 -1
  252. package/dist/providers/azure-openai-responses.js +0 -225
  253. package/dist/providers/azure-openai-responses.js.map +0 -1
  254. package/dist/providers/cloudflare.d.ts +0 -13
  255. package/dist/providers/cloudflare.d.ts.map +0 -1
  256. package/dist/providers/cloudflare.js +0 -26
  257. package/dist/providers/cloudflare.js.map +0 -1
  258. package/dist/providers/faux.d.ts +0 -56
  259. package/dist/providers/faux.d.ts.map +0 -1
  260. package/dist/providers/faux.js +0 -368
  261. package/dist/providers/faux.js.map +0 -1
  262. package/dist/providers/github-copilot-headers.d.ts +0 -8
  263. package/dist/providers/github-copilot-headers.d.ts.map +0 -1
  264. package/dist/providers/github-copilot-headers.js +0 -29
  265. package/dist/providers/github-copilot-headers.js.map +0 -1
  266. package/dist/providers/google-gemini-cli.d.ts +0 -74
  267. package/dist/providers/google-gemini-cli.d.ts.map +0 -1
  268. package/dist/providers/google-gemini-cli.js +0 -779
  269. package/dist/providers/google-gemini-cli.js.map +0 -1
  270. package/dist/providers/google-shared.d.ts +0 -70
  271. package/dist/providers/google-shared.d.ts.map +0 -1
  272. package/dist/providers/google-shared.js +0 -329
  273. package/dist/providers/google-shared.js.map +0 -1
  274. package/dist/providers/google-vertex.d.ts +0 -15
  275. package/dist/providers/google-vertex.d.ts.map +0 -1
  276. package/dist/providers/google-vertex.js +0 -442
  277. package/dist/providers/google-vertex.js.map +0 -1
  278. package/dist/providers/google.d.ts +0 -13
  279. package/dist/providers/google.d.ts.map +0 -1
  280. package/dist/providers/google.js +0 -400
  281. package/dist/providers/google.js.map +0 -1
  282. package/dist/providers/images/openrouter.d.ts +0 -3
  283. package/dist/providers/images/openrouter.d.ts.map +0 -1
  284. package/dist/providers/images/openrouter.js +0 -129
  285. package/dist/providers/images/openrouter.js.map +0 -1
  286. package/dist/providers/images/register-builtins.d.ts +0 -4
  287. package/dist/providers/images/register-builtins.d.ts.map +0 -1
  288. package/dist/providers/images/register-builtins.js +0 -34
  289. package/dist/providers/images/register-builtins.js.map +0 -1
  290. package/dist/providers/mistral.d.ts +0 -25
  291. package/dist/providers/mistral.d.ts.map +0 -1
  292. package/dist/providers/mistral.js +0 -535
  293. package/dist/providers/mistral.js.map +0 -1
  294. package/dist/providers/openai-codex-responses.d.ts +0 -30
  295. package/dist/providers/openai-codex-responses.d.ts.map +0 -1
  296. package/dist/providers/openai-codex-responses.js +0 -1090
  297. package/dist/providers/openai-codex-responses.js.map +0 -1
  298. package/dist/providers/openai-completions.d.ts +0 -19
  299. package/dist/providers/openai-completions.d.ts.map +0 -1
  300. package/dist/providers/openai-completions.js +0 -950
  301. package/dist/providers/openai-completions.js.map +0 -1
  302. package/dist/providers/openai-prompt-cache.d.ts +0 -3
  303. package/dist/providers/openai-prompt-cache.d.ts.map +0 -1
  304. package/dist/providers/openai-prompt-cache.js +0 -10
  305. package/dist/providers/openai-prompt-cache.js.map +0 -1
  306. package/dist/providers/openai-responses-shared.d.ts +0 -18
  307. package/dist/providers/openai-responses-shared.d.ts.map +0 -1
  308. package/dist/providers/openai-responses-shared.js +0 -492
  309. package/dist/providers/openai-responses-shared.js.map +0 -1
  310. package/dist/providers/openai-responses.d.ts +0 -13
  311. package/dist/providers/openai-responses.d.ts.map +0 -1
  312. package/dist/providers/openai-responses.js +0 -237
  313. package/dist/providers/openai-responses.js.map +0 -1
  314. package/dist/providers/register-builtins.d.ts +0 -38
  315. package/dist/providers/register-builtins.d.ts.map +0 -1
  316. package/dist/providers/register-builtins.js +0 -278
  317. package/dist/providers/register-builtins.js.map +0 -1
  318. package/dist/providers/simple-options.d.ts +0 -8
  319. package/dist/providers/simple-options.d.ts.map +0 -1
  320. package/dist/providers/simple-options.js +0 -41
  321. package/dist/providers/simple-options.js.map +0 -1
  322. package/dist/providers/transform-messages.d.ts +0 -8
  323. package/dist/providers/transform-messages.d.ts.map +0 -1
  324. package/dist/providers/transform-messages.js +0 -184
  325. package/dist/providers/transform-messages.js.map +0 -1
  326. package/dist/session-resources.d.ts +0 -4
  327. package/dist/session-resources.d.ts.map +0 -1
  328. package/dist/session-resources.js +0 -22
  329. package/dist/session-resources.js.map +0 -1
  330. package/dist/stream.d.ts +0 -8
  331. package/dist/stream.d.ts.map +0 -1
  332. package/dist/stream.js +0 -27
  333. package/dist/stream.js.map +0 -1
  334. package/dist/types.d.ts +0 -498
  335. package/dist/types.d.ts.map +0 -1
  336. package/dist/types.js +0 -2
  337. package/dist/types.js.map +0 -1
  338. package/dist/utils/diagnostics.d.ts +0 -19
  339. package/dist/utils/diagnostics.d.ts.map +0 -1
  340. package/dist/utils/diagnostics.js +0 -25
  341. package/dist/utils/diagnostics.js.map +0 -1
  342. package/dist/utils/event-stream.d.ts +0 -21
  343. package/dist/utils/event-stream.d.ts.map +0 -1
  344. package/dist/utils/event-stream.js +0 -81
  345. package/dist/utils/event-stream.js.map +0 -1
  346. package/dist/utils/hash.d.ts +0 -3
  347. package/dist/utils/hash.d.ts.map +0 -1
  348. package/dist/utils/hash.js +0 -14
  349. package/dist/utils/hash.js.map +0 -1
  350. package/dist/utils/headers.d.ts +0 -2
  351. package/dist/utils/headers.d.ts.map +0 -1
  352. package/dist/utils/headers.js +0 -8
  353. package/dist/utils/headers.js.map +0 -1
  354. package/dist/utils/json-parse.d.ts +0 -16
  355. package/dist/utils/json-parse.d.ts.map +0 -1
  356. package/dist/utils/json-parse.js +0 -113
  357. package/dist/utils/json-parse.js.map +0 -1
  358. package/dist/utils/node-http-proxy.d.ts +0 -10
  359. package/dist/utils/node-http-proxy.d.ts.map +0 -1
  360. package/dist/utils/node-http-proxy.js +0 -97
  361. package/dist/utils/node-http-proxy.js.map +0 -1
  362. package/dist/utils/oauth/anthropic.d.ts +0 -25
  363. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  364. package/dist/utils/oauth/anthropic.js +0 -335
  365. package/dist/utils/oauth/anthropic.js.map +0 -1
  366. package/dist/utils/oauth/device-code.d.ts +0 -19
  367. package/dist/utils/oauth/device-code.d.ts.map +0 -1
  368. package/dist/utils/oauth/device-code.js +0 -55
  369. package/dist/utils/oauth/device-code.js.map +0 -1
  370. package/dist/utils/oauth/github-copilot.d.ts +0 -30
  371. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  372. package/dist/utils/oauth/github-copilot.js +0 -268
  373. package/dist/utils/oauth/github-copilot.js.map +0 -1
  374. package/dist/utils/oauth/google-antigravity.d.ts +0 -26
  375. package/dist/utils/oauth/google-antigravity.d.ts.map +0 -1
  376. package/dist/utils/oauth/google-antigravity.js +0 -377
  377. package/dist/utils/oauth/google-antigravity.js.map +0 -1
  378. package/dist/utils/oauth/google-gemini-cli.d.ts +0 -26
  379. package/dist/utils/oauth/google-gemini-cli.d.ts.map +0 -1
  380. package/dist/utils/oauth/google-gemini-cli.js +0 -482
  381. package/dist/utils/oauth/google-gemini-cli.js.map +0 -1
  382. package/dist/utils/oauth/index.d.ts +0 -63
  383. package/dist/utils/oauth/index.d.ts.map +0 -1
  384. package/dist/utils/oauth/index.js +0 -131
  385. package/dist/utils/oauth/index.js.map +0 -1
  386. package/dist/utils/oauth/oauth-page.d.ts +0 -3
  387. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  388. package/dist/utils/oauth/oauth-page.js +0 -105
  389. package/dist/utils/oauth/oauth-page.js.map +0 -1
  390. package/dist/utils/oauth/openai-codex.d.ts +0 -34
  391. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  392. package/dist/utils/oauth/openai-codex.js +0 -385
  393. package/dist/utils/oauth/openai-codex.js.map +0 -1
  394. package/dist/utils/oauth/pkce.d.ts +0 -13
  395. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  396. package/dist/utils/oauth/pkce.js +0 -31
  397. package/dist/utils/oauth/pkce.js.map +0 -1
  398. package/dist/utils/oauth/types.d.ts +0 -64
  399. package/dist/utils/oauth/types.d.ts.map +0 -1
  400. package/dist/utils/oauth/types.js +0 -2
  401. package/dist/utils/oauth/types.js.map +0 -1
  402. package/dist/utils/overflow.d.ts +0 -56
  403. package/dist/utils/overflow.d.ts.map +0 -1
  404. package/dist/utils/overflow.js +0 -151
  405. package/dist/utils/overflow.js.map +0 -1
  406. package/dist/utils/sanitize-unicode.d.ts +0 -22
  407. package/dist/utils/sanitize-unicode.d.ts.map +0 -1
  408. package/dist/utils/sanitize-unicode.js +0 -26
  409. package/dist/utils/sanitize-unicode.js.map +0 -1
  410. package/dist/utils/typebox-helpers.d.ts +0 -17
  411. package/dist/utils/typebox-helpers.d.ts.map +0 -1
  412. package/dist/utils/typebox-helpers.js +0 -21
  413. package/dist/utils/typebox-helpers.js.map +0 -1
  414. package/dist/utils/validation.d.ts +0 -18
  415. package/dist/utils/validation.d.ts.map +0 -1
  416. package/dist/utils/validation.js +0 -281
  417. package/dist/utils/validation.js.map +0 -1
@@ -0,0 +1,306 @@
1
+ import * as http2 from "node:http2";
2
+ import { create, fromBinary, toBinary } from "@bufbuild/protobuf";
3
+ import * as z from "zod/v4";
4
+ import { getBundledModels } from "../../models";
5
+ import { GetUsableModelsRequestSchema, GetUsableModelsResponseSchema } from "../../providers/cursor/gen/agent_pb";
6
+ import type { Model } from "../../types";
7
+
8
+ const CURSOR_DEFAULT_BASE_URL = "https://api2.cursor.sh";
9
+ const CURSOR_DEFAULT_CLIENT_VERSION = "cli-2026.02.13-41ac335";
10
+ const CURSOR_GET_USABLE_MODELS_PATH = "/agent.v1.AgentService/GetUsableModels";
11
+
12
+ const DEFAULT_CONTEXT_WINDOW = 200_000;
13
+ const DEFAULT_MAX_TOKENS = 64_000;
14
+
15
+ const OptionalDisplayNameSchema = z.string().optional().catch(undefined);
16
+ const CursorAliasesSchema = z
17
+ .array(z.unknown())
18
+ .optional()
19
+ .catch([])
20
+ .transform(aliases => (aliases ?? []).filter((alias: unknown): alias is string => typeof alias === "string"));
21
+
22
+ const CursorModelDetailsSchema = z.object({
23
+ modelId: z.string(),
24
+ displayName: OptionalDisplayNameSchema,
25
+ displayNameShort: OptionalDisplayNameSchema,
26
+ displayModelId: OptionalDisplayNameSchema,
27
+ aliases: CursorAliasesSchema,
28
+ thinkingDetails: z.unknown().optional(),
29
+ });
30
+
31
+ const CursorDecodedResponseSchema = z.object({
32
+ models: z.array(z.unknown()).optional().catch([]),
33
+ });
34
+
35
+ type CursorModelDetailsValue = z.infer<typeof CursorModelDetailsSchema>;
36
+
37
+ /**
38
+ * Options for fetching dynamic Cursor models from `GetUsableModels`.
39
+ */
40
+ export interface CursorModelDiscoveryOptions {
41
+ /** Cursor access token used for bearer authentication. */
42
+ apiKey: string;
43
+ /** Optional Cursor API base URL override. */
44
+ baseUrl?: string;
45
+ /** Optional client version override sent as `x-cursor-client-version`. */
46
+ clientVersion?: string;
47
+ /** Optional request timeout in milliseconds. */
48
+ timeoutMs?: number;
49
+ /** Optional list of custom Cursor model ids to include in request context. */
50
+ customModelIds?: string[];
51
+ }
52
+
53
+ /**
54
+ * Fetches Cursor models through `GetUsableModels` and normalizes them into canonical model entries.
55
+ *
56
+ * Returns `null` on request/decode failures.
57
+ * Returns `[]` only when the endpoint responds successfully with no usable models.
58
+ */
59
+ export async function fetchCursorUsableModels(
60
+ options: CursorModelDiscoveryOptions,
61
+ ): Promise<Model<"cursor-agent">[] | null> {
62
+ const timeoutMs = options.timeoutMs ?? 5_000;
63
+ try {
64
+ const requestPayload = create(GetUsableModelsRequestSchema, {
65
+ customModelIds: normalizeCustomModelIds(options.customModelIds),
66
+ });
67
+ const body = toBinary(GetUsableModelsRequestSchema, requestPayload);
68
+ const baseUrl = (options.baseUrl ?? CURSOR_DEFAULT_BASE_URL).replace(/\/+$/, "");
69
+
70
+ const responseBuffer = await fetchViaHttp2(baseUrl, body, options, timeoutMs);
71
+
72
+ if (!responseBuffer) {
73
+ return null;
74
+ }
75
+ const decoded = decodeGetUsableModelsResponse(responseBuffer);
76
+ const parsedDecoded = CursorDecodedResponseSchema.safeParse(decoded);
77
+ if (!parsedDecoded.success) {
78
+ return null;
79
+ }
80
+
81
+ const references = createCursorReferenceMap();
82
+ return normalizeCursorModels(parsedDecoded.data.models, options.baseUrl, references);
83
+ } catch {
84
+ return null;
85
+ }
86
+ }
87
+
88
+ function buildRequestHeaders(options: CursorModelDiscoveryOptions): Record<string, string> {
89
+ return {
90
+ "content-type": "application/proto",
91
+ te: "trailers",
92
+ authorization: `Bearer ${options.apiKey}`,
93
+ "x-ghost-mode": "true",
94
+ "x-cursor-client-version": options.clientVersion ?? CURSOR_DEFAULT_CLIENT_VERSION,
95
+ "x-cursor-client-type": "cli",
96
+ };
97
+ }
98
+
99
+ /** HTTP/2 transport required by Cursor API (HTTP/1.1 is rejected with 464). */
100
+ async function fetchViaHttp2(
101
+ baseUrl: string,
102
+ body: Uint8Array,
103
+ options: CursorModelDiscoveryOptions,
104
+ timeoutMs: number,
105
+ ): Promise<Uint8Array | null> {
106
+ const { promise, resolve } = Promise.withResolvers<Uint8Array | null>();
107
+ const client = http2.connect(baseUrl);
108
+ const timer = setTimeout(() => {
109
+ client.destroy();
110
+ resolve(null);
111
+ }, timeoutMs);
112
+
113
+ client.on("error", () => {
114
+ clearTimeout(timer);
115
+ resolve(null);
116
+ });
117
+
118
+ const req = client.request({
119
+ ":method": "POST",
120
+ ":path": CURSOR_GET_USABLE_MODELS_PATH,
121
+ ...buildRequestHeaders(options),
122
+ });
123
+
124
+ const chunks: Buffer[] = [];
125
+ req.on("data", (chunk: Buffer) => chunks.push(chunk));
126
+ req.on("end", () => {
127
+ clearTimeout(timer);
128
+ client.close();
129
+ resolve(new Uint8Array(Buffer.concat(chunks)));
130
+ });
131
+ req.on("error", () => {
132
+ clearTimeout(timer);
133
+ client.close();
134
+ resolve(null);
135
+ });
136
+ req.on("response", headers => {
137
+ const status = Number(headers[":status"] ?? 0);
138
+ if (status < 200 || status >= 300) {
139
+ clearTimeout(timer);
140
+ client.close();
141
+ resolve(null);
142
+ }
143
+ });
144
+
145
+ if (body.length > 0) {
146
+ req.end(Buffer.from(body));
147
+ } else {
148
+ req.end();
149
+ }
150
+
151
+ return promise;
152
+ }
153
+
154
+ function normalizeCustomModelIds(customModelIds: readonly string[] | undefined): string[] {
155
+ if (!customModelIds) {
156
+ return [];
157
+ }
158
+ const normalized = new Set<string>();
159
+ for (const value of customModelIds) {
160
+ if (typeof value !== "string") {
161
+ continue;
162
+ }
163
+ const trimmed = value.trim();
164
+ if (!trimmed) {
165
+ continue;
166
+ }
167
+ normalized.add(trimmed);
168
+ }
169
+ return [...normalized];
170
+ }
171
+
172
+ function createCursorReferenceMap(): Map<string, Model<"cursor-agent">> {
173
+ const references = new Map<string, Model<"cursor-agent">>();
174
+ for (const model of getBundledModels("cursor") as Model<"cursor-agent">[]) {
175
+ references.set(model.id, model);
176
+ }
177
+ return references;
178
+ }
179
+
180
+ function decodeGetUsableModelsResponse(payload: Uint8Array) {
181
+ if (payload.length === 0) {
182
+ return null;
183
+ }
184
+
185
+ const framedBody = decodeConnectUnaryBody(payload);
186
+ if (framedBody) {
187
+ try {
188
+ return fromBinary(GetUsableModelsResponseSchema, framedBody);
189
+ } catch {
190
+ return null;
191
+ }
192
+ }
193
+
194
+ try {
195
+ return fromBinary(GetUsableModelsResponseSchema, payload);
196
+ } catch {
197
+ return null;
198
+ }
199
+ }
200
+
201
+ function decodeConnectUnaryBody(payload: Uint8Array): Uint8Array | null {
202
+ if (payload.length < 5) {
203
+ return null;
204
+ }
205
+
206
+ let offset = 0;
207
+ while (offset + 5 <= payload.length) {
208
+ const flags = payload[offset];
209
+ const view = new DataView(payload.buffer, payload.byteOffset + offset, payload.byteLength - offset);
210
+ const messageLength = view.getUint32(1, false);
211
+ const frameEnd = offset + 5 + messageLength;
212
+ if (frameEnd > payload.length) {
213
+ return null;
214
+ }
215
+ const compressionFlagSet = (flags & 0b0000_0001) !== 0;
216
+ if (compressionFlagSet) {
217
+ return null;
218
+ }
219
+ const endStreamFlagSet = (flags & 0b0000_0010) !== 0;
220
+ if (!endStreamFlagSet) {
221
+ return payload.subarray(offset + 5, frameEnd);
222
+ }
223
+
224
+ offset = frameEnd;
225
+ }
226
+
227
+ return null;
228
+ }
229
+
230
+ function normalizeCursorModels(
231
+ models: readonly unknown[] | undefined,
232
+ baseUrlOverride: string | undefined,
233
+ references: Map<string, Model<"cursor-agent">>,
234
+ ): Model<"cursor-agent">[] {
235
+ if (!models || models.length === 0) {
236
+ return [];
237
+ }
238
+
239
+ const byId = new Map<string, Model<"cursor-agent">>();
240
+ for (const model of models) {
241
+ const normalized = normalizeCursorModel(model, baseUrlOverride, references);
242
+ if (!normalized) {
243
+ continue;
244
+ }
245
+ byId.set(normalized.id, normalized);
246
+ }
247
+
248
+ return [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));
249
+ }
250
+
251
+ function normalizeCursorModel(
252
+ model: unknown,
253
+ baseUrlOverride: string | undefined,
254
+ references: Map<string, Model<"cursor-agent">>,
255
+ ): Model<"cursor-agent"> | null {
256
+ const parsedModel = CursorModelDetailsSchema.safeParse(model);
257
+ if (!parsedModel.success) {
258
+ return null;
259
+ }
260
+
261
+ const details = parsedModel.data;
262
+ const id = details.modelId.trim();
263
+ if (!id) {
264
+ return null;
265
+ }
266
+
267
+ const name = pickModelDisplayName(details, id);
268
+ const reference = references.get(id);
269
+ const reasoning = Boolean(details.thinkingDetails) || reference?.reasoning === true;
270
+
271
+ if (reference) {
272
+ return {
273
+ ...reference,
274
+ id,
275
+ name,
276
+ baseUrl: baseUrlOverride ?? reference.baseUrl,
277
+ reasoning,
278
+ };
279
+ }
280
+ return {
281
+ id,
282
+ name,
283
+ api: "cursor-agent",
284
+ provider: "cursor",
285
+ baseUrl: baseUrlOverride ?? CURSOR_DEFAULT_BASE_URL,
286
+ reasoning,
287
+ input: ["text"],
288
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
289
+ contextWindow: DEFAULT_CONTEXT_WINDOW,
290
+ maxTokens: DEFAULT_MAX_TOKENS,
291
+ };
292
+ }
293
+
294
+ function pickModelDisplayName(model: CursorModelDetailsValue, fallbackId: string): string {
295
+ const candidates = [model.displayName, model.displayNameShort, model.displayModelId, ...model.aliases, fallbackId];
296
+ for (const candidate of candidates) {
297
+ if (typeof candidate !== "string") {
298
+ continue;
299
+ }
300
+ const trimmed = candidate.trim();
301
+ if (trimmed) {
302
+ return trimmed;
303
+ }
304
+ }
305
+ return fallbackId;
306
+ }
@@ -0,0 +1,248 @@
1
+ import { UNK_CONTEXT_WINDOW, UNK_MAX_TOKENS } from "@aryee337/aery-ai";
2
+ import * as z from "zod/v4";
3
+ import { getBundledModels } from "../../models";
4
+ import type { Model } from "../../types";
5
+
6
+ const GOOGLE_GENERATIVE_AI_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
7
+ const DEFAULT_PAGE_SIZE = 100;
8
+ const DEFAULT_MAX_PAGES = 25;
9
+
10
+ const geminiModelListItemSchema = z.object({
11
+ name: z.string().optional().catch(undefined),
12
+ displayName: z.string().optional().catch(undefined),
13
+ supportedGenerationMethods: z.array(z.string()).optional(),
14
+ inputTokenLimit: z.number().finite().optional().catch(undefined),
15
+ outputTokenLimit: z.number().finite().optional().catch(undefined),
16
+ });
17
+
18
+ const geminiModelListResponseSchema = z.object({
19
+ models: z
20
+ .array(z.unknown())
21
+ .optional()
22
+ .transform(items => {
23
+ if (!items) {
24
+ return [];
25
+ }
26
+ const parsedItems: GeminiModelListItem[] = [];
27
+ for (const item of items) {
28
+ const parsed = geminiModelListItemSchema.safeParse(item);
29
+ if (parsed.success) {
30
+ parsedItems.push(parsed.data);
31
+ }
32
+ }
33
+ return parsedItems;
34
+ }),
35
+ nextPageToken: z.string().optional().catch(undefined),
36
+ });
37
+
38
+ type GeminiModelListItem = z.infer<typeof geminiModelListItemSchema>;
39
+
40
+ /**
41
+ * Configuration for Google Generative AI model discovery.
42
+ */
43
+ export interface GeminiDiscoveryOptions {
44
+ /** API key for the Google Generative AI public endpoint. */
45
+ apiKey: string;
46
+ /** Optional endpoint override for testing or proxying. */
47
+ baseUrl?: string;
48
+ /** Optional requested page size for model listing. */
49
+ pageSize?: number;
50
+ /** Maximum number of pages to request before stopping pagination. */
51
+ maxPages?: number;
52
+ /** Optional abort signal for HTTP requests. */
53
+ signal?: AbortSignal;
54
+ /** Optional fetch implementation override for tests. */
55
+ fetch?: typeof fetch;
56
+ }
57
+
58
+ /**
59
+ * Fetches and normalizes Google Generative AI models from the public models endpoint.
60
+ *
61
+ * Returns `null` on transport/protocol failures.
62
+ * Returns `[]` only when the endpoint responds successfully with no usable models.
63
+ */
64
+ export async function fetchGeminiModels(
65
+ options: GeminiDiscoveryOptions,
66
+ ): Promise<Model<"google-generative-ai">[] | null> {
67
+ if (!options.apiKey.trim()) {
68
+ return null;
69
+ }
70
+
71
+ const fetchImpl = options.fetch ?? fetch;
72
+ const baseUrl = normalizeBaseUrl(options.baseUrl);
73
+ const pageSize = normalizePositiveInt(options.pageSize, DEFAULT_PAGE_SIZE);
74
+ const maxPages = normalizePositiveInt(options.maxPages, DEFAULT_MAX_PAGES);
75
+
76
+ const bundledById = new Map(
77
+ getBundledModels("google").map(model => [model.id, model as Model<"google-generative-ai">]),
78
+ );
79
+ const modelsById = new Map<string, Model<"google-generative-ai">>();
80
+ const seenTokens = new Set<string>();
81
+ let nextPageToken: string | undefined;
82
+
83
+ for (let page = 0; page < maxPages; page += 1) {
84
+ const requestUrl = buildModelsUrl(baseUrl, options.apiKey, pageSize, nextPageToken);
85
+ let response: Response;
86
+ try {
87
+ response = await fetchImpl(requestUrl, {
88
+ method: "GET",
89
+ signal: options.signal,
90
+ });
91
+ } catch {
92
+ return null;
93
+ }
94
+
95
+ if (!response.ok) {
96
+ return null;
97
+ }
98
+
99
+ let payload: unknown;
100
+ try {
101
+ payload = await response.json();
102
+ } catch {
103
+ return null;
104
+ }
105
+
106
+ const parsed = geminiModelListResponseSchema.safeParse(payload);
107
+ if (!parsed.success) {
108
+ return null;
109
+ }
110
+
111
+ for (const item of parsed.data.models) {
112
+ const model = normalizeModel(item, baseUrl, bundledById);
113
+ if (model) {
114
+ modelsById.set(model.id, model);
115
+ }
116
+ }
117
+
118
+ const token = normalizePageToken(parsed.data.nextPageToken);
119
+ if (!token) {
120
+ break;
121
+ }
122
+ if (seenTokens.has(token)) {
123
+ break;
124
+ }
125
+ seenTokens.add(token);
126
+ nextPageToken = token;
127
+ }
128
+
129
+ return Array.from(modelsById.values()).sort((left, right) => left.id.localeCompare(right.id));
130
+ }
131
+
132
+ function buildModelsUrl(baseUrl: string, apiKey: string, pageSize: number, pageToken?: string): URL {
133
+ const url = new URL(`${baseUrl}/models`);
134
+ url.searchParams.set("key", apiKey);
135
+ url.searchParams.set("pageSize", String(pageSize));
136
+ if (pageToken) {
137
+ url.searchParams.set("pageToken", pageToken);
138
+ }
139
+ return url;
140
+ }
141
+
142
+ function normalizeBaseUrl(baseUrl?: string): string {
143
+ const value = (baseUrl ?? GOOGLE_GENERATIVE_AI_BASE_URL).trim();
144
+ if (!value) {
145
+ return GOOGLE_GENERATIVE_AI_BASE_URL;
146
+ }
147
+ return value.replace(/\/+$/, "");
148
+ }
149
+
150
+ function normalizePositiveInt(value: number | undefined, fallback: number): number {
151
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
152
+ return fallback;
153
+ }
154
+ const normalized = Math.floor(value);
155
+ return normalized > 0 ? normalized : fallback;
156
+ }
157
+
158
+ function normalizePageToken(value: unknown): string | undefined {
159
+ if (typeof value !== "string") {
160
+ return undefined;
161
+ }
162
+ const token = value.trim();
163
+ return token.length > 0 ? token : undefined;
164
+ }
165
+
166
+ function normalizeModel(
167
+ item: GeminiModelListItem,
168
+ baseUrl: string,
169
+ bundledById: Map<string, Model<"google-generative-ai">>,
170
+ ): Model<"google-generative-ai"> | null {
171
+ const id = normalizeModelId(item.name);
172
+ if (!id) {
173
+ return null;
174
+ }
175
+ if (!supportsTextGeneration(item.supportedGenerationMethods)) {
176
+ return null;
177
+ }
178
+
179
+ const reference = bundledById.get(id);
180
+ const contextWindow = normalizePositiveInt(item.inputTokenLimit, reference?.contextWindow ?? UNK_CONTEXT_WINDOW);
181
+ const maxTokens = normalizePositiveInt(item.outputTokenLimit, reference?.maxTokens ?? UNK_MAX_TOKENS);
182
+ const name = normalizeModelName(item.displayName, reference?.name ?? id);
183
+
184
+ if (reference) {
185
+ return {
186
+ ...reference,
187
+ id,
188
+ name,
189
+ baseUrl,
190
+ contextWindow,
191
+ maxTokens,
192
+ };
193
+ }
194
+ return {
195
+ id,
196
+ name,
197
+ api: "google-generative-ai",
198
+ provider: "google",
199
+ baseUrl,
200
+ reasoning: inferReasoningFromGeminiId(id),
201
+ input: inferInputFromGeminiId(id),
202
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
203
+ contextWindow,
204
+ maxTokens,
205
+ };
206
+ }
207
+
208
+ function normalizeModelId(value: string | undefined): string | null {
209
+ if (!value) {
210
+ return null;
211
+ }
212
+ const trimmed = value.trim();
213
+ if (!trimmed) {
214
+ return null;
215
+ }
216
+ return trimmed.startsWith("models/") ? trimmed.slice("models/".length) : trimmed;
217
+ }
218
+
219
+ function normalizeModelName(displayName: string | undefined, id: string): string {
220
+ const trimmed = displayName?.trim();
221
+ return trimmed ? trimmed : id;
222
+ }
223
+
224
+ function supportsTextGeneration(methods: string[] | undefined): boolean {
225
+ if (!methods || methods.length === 0) {
226
+ return false;
227
+ }
228
+ return methods.some(method => method === "generateContent");
229
+ }
230
+
231
+ function inferReasoningFromGeminiId(id: string): boolean {
232
+ const normalized = id.toLowerCase();
233
+ if (normalized.includes("thinking")) {
234
+ return true;
235
+ }
236
+ if (normalized.includes("pro") || normalized.includes("2.5")) {
237
+ return true;
238
+ }
239
+ return false;
240
+ }
241
+
242
+ function inferInputFromGeminiId(id: string): ("text" | "image")[] {
243
+ const normalized = id.toLowerCase();
244
+ if (normalized.includes("vision") || normalized.includes("image") || normalized.includes("gemini")) {
245
+ return ["text", "image"];
246
+ }
247
+ return ["text"];
248
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./antigravity";
2
+ export * from "./codex";
3
+ export * from "./gemini";
4
+ export * from "./openai-compatible";