@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,256 @@
1
+ /**
2
+ * Gemini CLI OAuth flow (Google Cloud Code Assist)
3
+ * Standard Gemini models only (gemini-2.0-flash, gemini-2.5-*)
4
+ */
5
+
6
+ import { $env } from "@aryee337/aery-utils";
7
+ import { getGeminiCliHeaders } from "../../providers/google-gemini-headers";
8
+ import { runGoogleOAuthLogin } from "./google-oauth-shared";
9
+ import type { OAuthController, OAuthCredentials } from "./types";
10
+
11
+ const decode = (s: string) => atob(s);
12
+ const CLIENT_ID = decode(
13
+ "NjgxMjU1ODA5Mzk1LW9vOGZ0Mm9wcmRybnA5ZTNhcWY2YXYzaG1kaWIxMzVqLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29t",
14
+ );
15
+ const CLIENT_SECRET = decode("R09DU1BYLTR1SGdNUG0tMW83U2stZ2VWNkN1NWNsWEZzeGw=");
16
+ const CALLBACK_PORT = 8085;
17
+ const CALLBACK_PATH = "/oauth2callback";
18
+ const SCOPES = [
19
+ "https://www.googleapis.com/auth/cloud-platform",
20
+ "https://www.googleapis.com/auth/userinfo.email",
21
+ "https://www.googleapis.com/auth/userinfo.profile",
22
+ ];
23
+ const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
24
+ const TOKEN_URL = "https://oauth2.googleapis.com/token";
25
+ const CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
26
+
27
+ interface LoadCodeAssistPayload {
28
+ cloudaicompanionProject?: string;
29
+ currentTier?: { id?: string };
30
+ allowedTiers?: Array<{ id?: string; isDefault?: boolean }>;
31
+ }
32
+
33
+ interface LongRunningOperationResponse {
34
+ name?: string;
35
+ done?: boolean;
36
+ response?: {
37
+ cloudaicompanionProject?: { id?: string };
38
+ };
39
+ }
40
+
41
+ const TIER_FREE = "free-tier";
42
+ const TIER_LEGACY = "legacy-tier";
43
+ const TIER_STANDARD = "standard-tier";
44
+
45
+ interface GoogleRpcErrorResponse {
46
+ error?: {
47
+ details?: Array<{ reason?: string }>;
48
+ };
49
+ }
50
+
51
+ function getDefaultTier(allowedTiers?: Array<{ id?: string; isDefault?: boolean }>): { id?: string } {
52
+ if (!allowedTiers || allowedTiers.length === 0) return { id: TIER_LEGACY };
53
+ const defaultTier = allowedTiers.find(t => t.isDefault);
54
+ return defaultTier ?? { id: TIER_LEGACY };
55
+ }
56
+
57
+ function isVpcScAffectedUser(payload: unknown): boolean {
58
+ if (!payload || typeof payload !== "object") return false;
59
+ if (!("error" in payload)) return false;
60
+ const error = (payload as GoogleRpcErrorResponse).error;
61
+ if (!error?.details || !Array.isArray(error.details)) return false;
62
+ return error.details.some(detail => detail.reason === "SECURITY_POLICY_VIOLATED");
63
+ }
64
+
65
+ async function pollOperation(
66
+ operationName: string,
67
+ headers: Record<string, string>,
68
+ onProgress?: (message: string) => void,
69
+ ): Promise<LongRunningOperationResponse> {
70
+ let attempt = 0;
71
+ while (true) {
72
+ if (attempt > 0) {
73
+ onProgress?.(`Waiting for project provisioning (attempt ${attempt + 1})...`);
74
+ await Bun.sleep(5000);
75
+ }
76
+
77
+ const response = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal/${operationName}`, {
78
+ method: "GET",
79
+ headers,
80
+ });
81
+
82
+ if (!response.ok) {
83
+ throw new Error(`Failed to poll operation: ${response.status} ${response.statusText}`);
84
+ }
85
+
86
+ const data = (await response.json()) as LongRunningOperationResponse;
87
+ if (data.done) {
88
+ return data;
89
+ }
90
+
91
+ attempt += 1;
92
+ }
93
+ }
94
+
95
+ async function discoverProject(accessToken: string, onProgress?: (message: string) => void): Promise<string> {
96
+ const envProjectId = $env.GOOGLE_CLOUD_PROJECT || $env.GOOGLE_CLOUD_PROJECT_ID;
97
+
98
+ const headers = {
99
+ Authorization: `Bearer ${accessToken}`,
100
+ "Content-Type": "application/json",
101
+ ...getGeminiCliHeaders(),
102
+ };
103
+
104
+ onProgress?.("Checking for existing Cloud Code Assist project...");
105
+ const loadResponse = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal:loadCodeAssist`, {
106
+ method: "POST",
107
+ headers,
108
+ body: JSON.stringify({
109
+ cloudaicompanionProject: envProjectId,
110
+ metadata: {
111
+ ideType: "IDE_UNSPECIFIED",
112
+ platform: "PLATFORM_UNSPECIFIED",
113
+ pluginType: "GEMINI",
114
+ duetProject: envProjectId,
115
+ },
116
+ }),
117
+ });
118
+
119
+ let data: LoadCodeAssistPayload;
120
+
121
+ if (!loadResponse.ok) {
122
+ let errorPayload: unknown;
123
+ try {
124
+ errorPayload = await loadResponse.clone().json();
125
+ } catch {
126
+ errorPayload = undefined;
127
+ }
128
+
129
+ if (isVpcScAffectedUser(errorPayload)) {
130
+ data = { currentTier: { id: TIER_STANDARD } };
131
+ } else {
132
+ const errorText = await loadResponse.text();
133
+ throw new Error(`loadCodeAssist failed: ${loadResponse.status} ${loadResponse.statusText}: ${errorText}`);
134
+ }
135
+ } else {
136
+ data = (await loadResponse.json()) as LoadCodeAssistPayload;
137
+ }
138
+
139
+ if (data.currentTier) {
140
+ if (data.cloudaicompanionProject) {
141
+ return data.cloudaicompanionProject;
142
+ }
143
+ if (envProjectId) {
144
+ return envProjectId;
145
+ }
146
+ throw new Error(
147
+ "This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
148
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
149
+ );
150
+ }
151
+
152
+ const tier = getDefaultTier(data.allowedTiers);
153
+ const tierId = tier?.id ?? TIER_FREE;
154
+
155
+ if (tierId !== TIER_FREE && !envProjectId) {
156
+ throw new Error(
157
+ "This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
158
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
159
+ );
160
+ }
161
+
162
+ onProgress?.("Provisioning Cloud Code Assist project (this may take a moment)...");
163
+
164
+ const onboardBody: Record<string, unknown> = {
165
+ tierId,
166
+ metadata: {
167
+ ideType: "IDE_UNSPECIFIED",
168
+ platform: "PLATFORM_UNSPECIFIED",
169
+ pluginType: "GEMINI",
170
+ },
171
+ };
172
+
173
+ if (tierId !== TIER_FREE && envProjectId) {
174
+ onboardBody.cloudaicompanionProject = envProjectId;
175
+ (onboardBody.metadata as Record<string, unknown>).duetProject = envProjectId;
176
+ }
177
+
178
+ const onboardResponse = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal:onboardUser`, {
179
+ method: "POST",
180
+ headers,
181
+ body: JSON.stringify(onboardBody),
182
+ });
183
+
184
+ if (!onboardResponse.ok) {
185
+ const errorText = await onboardResponse.text();
186
+ throw new Error(`onboardUser failed: ${onboardResponse.status} ${onboardResponse.statusText}: ${errorText}`);
187
+ }
188
+
189
+ let lroData = (await onboardResponse.json()) as LongRunningOperationResponse;
190
+
191
+ if (!lroData.done && lroData.name) {
192
+ lroData = await pollOperation(lroData.name, headers, onProgress);
193
+ }
194
+
195
+ const projectId = lroData.response?.cloudaicompanionProject?.id;
196
+ if (projectId) {
197
+ return projectId;
198
+ }
199
+
200
+ if (envProjectId) {
201
+ return envProjectId;
202
+ }
203
+
204
+ throw new Error(
205
+ "Could not discover or provision a Google Cloud project. " +
206
+ "Try setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
207
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
208
+ );
209
+ }
210
+
211
+ export async function loginGeminiCli(ctrl: OAuthController): Promise<OAuthCredentials> {
212
+ return runGoogleOAuthLogin(ctrl, {
213
+ clientId: CLIENT_ID,
214
+ clientSecret: CLIENT_SECRET,
215
+ authUrl: AUTH_URL,
216
+ tokenUrl: TOKEN_URL,
217
+ scopes: SCOPES,
218
+ callbackPort: CALLBACK_PORT,
219
+ callbackPath: CALLBACK_PATH,
220
+ discoverProject,
221
+ });
222
+ }
223
+
224
+ /**
225
+ * Refresh Google Cloud Code Assist token
226
+ */
227
+ export async function refreshGoogleCloudToken(refreshToken: string, projectId: string): Promise<OAuthCredentials> {
228
+ const response = await fetch(TOKEN_URL, {
229
+ method: "POST",
230
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
231
+ body: new URLSearchParams({
232
+ client_id: CLIENT_ID,
233
+ client_secret: CLIENT_SECRET,
234
+ refresh_token: refreshToken,
235
+ grant_type: "refresh_token",
236
+ }),
237
+ });
238
+
239
+ if (!response.ok) {
240
+ const error = await response.text();
241
+ throw new Error(`Google Cloud token refresh failed: ${error}`);
242
+ }
243
+
244
+ const data = (await response.json()) as {
245
+ access_token: string;
246
+ expires_in: number;
247
+ refresh_token?: string;
248
+ };
249
+
250
+ return {
251
+ refresh: data.refresh_token || refreshToken,
252
+ access: data.access_token,
253
+ expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
254
+ projectId,
255
+ };
256
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Shared OAuth flow for Google-style providers (Gemini CLI, Antigravity).
3
+ *
4
+ * Both providers use the same authorization-code flow shape; only the client
5
+ * credentials, scopes, endpoint constants, and project-discovery logic differ.
6
+ */
7
+ import { OAuthCallbackFlow } from "./callback-server";
8
+ import type { OAuthController, OAuthCredentials } from "./types";
9
+
10
+ export interface GoogleOAuthFlowConfig {
11
+ clientId: string;
12
+ clientSecret: string;
13
+ authUrl: string;
14
+ tokenUrl: string;
15
+ scopes: string[];
16
+ callbackPort: number;
17
+ callbackPath: string;
18
+ discoverProject: (accessToken: string, onProgress?: (message: string) => void) => Promise<string>;
19
+ }
20
+
21
+ async function getUserEmail(accessToken: string): Promise<string | undefined> {
22
+ try {
23
+ const response = await fetch("https://www.googleapis.com/oauth2/v1/userinfo?alt=json", {
24
+ headers: { Authorization: `Bearer ${accessToken}` },
25
+ });
26
+
27
+ if (response.ok) {
28
+ const data = (await response.json()) as { email?: string };
29
+ return data.email;
30
+ }
31
+ } catch {
32
+ // Ignore errors, email is optional
33
+ }
34
+ return undefined;
35
+ }
36
+
37
+ export class GoogleOAuthFlow extends OAuthCallbackFlow {
38
+ private readonly config: GoogleOAuthFlowConfig;
39
+
40
+ constructor(ctrl: OAuthController, config: GoogleOAuthFlowConfig) {
41
+ super(ctrl, config.callbackPort, config.callbackPath);
42
+ this.config = config;
43
+ }
44
+
45
+ async generateAuthUrl(state: string, redirectUri: string): Promise<{ url: string; instructions?: string }> {
46
+ const authParams = new URLSearchParams({
47
+ client_id: this.config.clientId,
48
+ response_type: "code",
49
+ redirect_uri: redirectUri,
50
+ scope: this.config.scopes.join(" "),
51
+ state,
52
+ access_type: "offline",
53
+ prompt: "consent",
54
+ });
55
+
56
+ const url = `${this.config.authUrl}?${authParams.toString()}`;
57
+ return { url, instructions: "Complete the sign-in in your browser." };
58
+ }
59
+
60
+ async exchangeToken(code: string, _state: string, redirectUri: string): Promise<OAuthCredentials> {
61
+ this.ctrl.onProgress?.("Exchanging authorization code for tokens...");
62
+
63
+ const tokenResponse = await fetch(this.config.tokenUrl, {
64
+ method: "POST",
65
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
66
+ body: new URLSearchParams({
67
+ client_id: this.config.clientId,
68
+ client_secret: this.config.clientSecret,
69
+ code,
70
+ grant_type: "authorization_code",
71
+ redirect_uri: redirectUri,
72
+ }),
73
+ });
74
+
75
+ if (!tokenResponse.ok) {
76
+ const error = await tokenResponse.text();
77
+ throw new Error(`Token exchange failed: ${error}`);
78
+ }
79
+
80
+ const tokenData = (await tokenResponse.json()) as {
81
+ access_token: string;
82
+ refresh_token: string;
83
+ expires_in: number;
84
+ };
85
+
86
+ if (!tokenData.refresh_token) {
87
+ throw new Error("No refresh token received. Please try again.");
88
+ }
89
+
90
+ this.ctrl.onProgress?.("Getting user info...");
91
+ const email = await getUserEmail(tokenData.access_token);
92
+ const projectId = await this.config.discoverProject(tokenData.access_token, this.ctrl.onProgress);
93
+
94
+ return {
95
+ refresh: tokenData.refresh_token,
96
+ access: tokenData.access_token,
97
+ expires: Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000,
98
+ projectId,
99
+ email,
100
+ };
101
+ }
102
+ }
103
+
104
+ export async function runGoogleOAuthLogin(
105
+ ctrl: OAuthController,
106
+ config: GoogleOAuthFlowConfig,
107
+ ): Promise<OAuthCredentials> {
108
+ const flow = new GoogleOAuthFlow(ctrl, config);
109
+ return flow.login();
110
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Hugging Face Inference login flow.
3
+ *
4
+ * Hugging Face Inference Providers expose an OpenAI-compatible endpoint via
5
+ * https://router.huggingface.co/v1.
6
+ *
7
+ * This is an API key flow:
8
+ * 1. Open browser to Hugging Face token settings
9
+ * 2. User creates/copies a token with Inference Providers permission
10
+ * 3. User pastes the token into the CLI
11
+ */
12
+
13
+ import { validateOpenAICompatibleApiKey } from "./api-key-validation";
14
+ import type { OAuthController } from "./types";
15
+
16
+ const AUTH_URL =
17
+ "https://huggingface.co/settings/tokens/new?ownUserPermissions=inference.serverless.write&tokenType=fineGrained";
18
+ const API_BASE_URL = "https://router.huggingface.co/v1";
19
+ const VALIDATION_MODEL = "openai/gpt-oss-120b";
20
+
21
+ /**
22
+ * Login to Hugging Face Inference Providers.
23
+ *
24
+ * Opens browser to token settings, prompts user to paste their API key.
25
+ * Returns the API key directly (not OAuthCredentials - this isn't OAuth).
26
+ */
27
+ export async function loginHuggingface(options: OAuthController): Promise<string> {
28
+ if (!options.onPrompt) {
29
+ throw new Error("Hugging Face login requires onPrompt callback");
30
+ }
31
+
32
+ options.onAuth?.({
33
+ url: AUTH_URL,
34
+ instructions:
35
+ "Create/copy a token with Make calls to Inference Providers permission (usable as HUGGINGFACE_HUB_TOKEN or HF_TOKEN)",
36
+ });
37
+
38
+ const apiKey = await options.onPrompt({
39
+ message: "Paste your Hugging Face token (HUGGINGFACE_HUB_TOKEN / HF_TOKEN)",
40
+ placeholder: "hf_...",
41
+ });
42
+
43
+ if (options.signal?.aborted) {
44
+ throw new Error("Login cancelled");
45
+ }
46
+
47
+ const trimmed = apiKey.trim();
48
+ if (!trimmed) {
49
+ throw new Error("API key is required");
50
+ }
51
+
52
+ options.onProgress?.("Validating API key...");
53
+ await validateOpenAICompatibleApiKey({
54
+ provider: "Hugging Face",
55
+ apiKey: trimmed,
56
+ baseUrl: API_BASE_URL,
57
+ model: VALIDATION_MODEL,
58
+ signal: options.signal,
59
+ });
60
+
61
+ return trimmed;
62
+ }