@aryee337/aery-ai 0.1.148 → 0.2.10

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 (592) hide show
  1. package/CHANGELOG.md +2914 -0
  2. package/README.md +614 -813
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth-broker/client.d.ts +66 -0
  5. package/dist/types/auth-broker/index.d.ts +5 -0
  6. package/dist/types/auth-broker/refresher.d.ts +25 -0
  7. package/dist/types/auth-broker/remote-store.d.ts +96 -0
  8. package/dist/types/auth-broker/server.d.ts +32 -0
  9. package/dist/types/auth-broker/types.d.ts +105 -0
  10. package/dist/types/auth-broker/wire-schemas.d.ts +412 -0
  11. package/dist/types/auth-gateway/http.d.ts +39 -0
  12. package/dist/types/auth-gateway/index.d.ts +3 -0
  13. package/dist/types/auth-gateway/server.d.ts +36 -0
  14. package/dist/types/auth-gateway/types.d.ts +117 -0
  15. package/dist/types/auth-storage.d.ts +739 -0
  16. package/dist/types/index.d.ts +49 -0
  17. package/dist/types/model-cache.d.ts +17 -0
  18. package/dist/types/model-manager.d.ts +64 -0
  19. package/dist/types/model-thinking.d.ts +100 -0
  20. package/dist/types/models.d.ts +12 -0
  21. package/dist/types/provider-details.d.ts +24 -0
  22. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  23. package/dist/types/provider-models/descriptors.d.ts +50 -0
  24. package/dist/types/provider-models/google.d.ts +24 -0
  25. package/dist/types/provider-models/index.d.ts +5 -0
  26. package/dist/types/provider-models/ollama.d.ts +7 -0
  27. package/dist/types/provider-models/openai-compat.d.ts +296 -0
  28. package/dist/types/provider-models/special.d.ts +16 -0
  29. package/dist/types/providers/aery-native-client.d.ts +13 -0
  30. package/dist/types/providers/aery-native-server.d.ts +68 -0
  31. package/dist/types/providers/amazon-bedrock.d.ts +38 -0
  32. package/dist/types/providers/anthropic-client.d.ts +99 -0
  33. package/dist/types/providers/anthropic-messages-server-schema.d.ts +465 -0
  34. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  35. package/dist/types/providers/anthropic-wire.d.ts +262 -0
  36. package/dist/types/providers/anthropic.d.ts +206 -0
  37. package/dist/types/providers/aws-credentials.d.ts +43 -0
  38. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  39. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  40. package/dist/types/providers/azure-openai-responses.d.ts +15 -0
  41. package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
  42. package/dist/types/providers/cursor.d.ts +43 -0
  43. package/dist/types/providers/error-message.d.ts +27 -0
  44. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  45. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  46. package/dist/types/providers/google-auth.d.ts +24 -0
  47. package/dist/types/providers/google-gemini-cli.d.ts +81 -0
  48. package/dist/types/providers/google-gemini-headers.d.ts +18 -0
  49. package/dist/types/providers/google-shared.d.ts +171 -0
  50. package/dist/types/providers/google-types.d.ts +138 -0
  51. package/dist/types/providers/google-vertex.d.ts +7 -0
  52. package/dist/types/providers/google.d.ts +4 -0
  53. package/dist/types/providers/grammar.d.ts +1 -0
  54. package/dist/types/providers/kimi.d.ts +27 -0
  55. package/dist/types/providers/mock.d.ts +173 -0
  56. package/dist/types/providers/ollama.d.ts +6 -0
  57. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  58. package/dist/types/providers/openai-chat-server-schema.d.ts +817 -0
  59. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  60. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  61. package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
  62. package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
  63. package/dist/types/providers/openai-codex-responses.d.ts +67 -0
  64. package/dist/types/providers/openai-completions-compat.d.ts +25 -0
  65. package/dist/types/providers/openai-completions.d.ts +54 -0
  66. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  67. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  68. package/dist/types/providers/openai-responses-shared.d.ts +100 -0
  69. package/dist/types/providers/openai-responses.d.ts +66 -0
  70. package/dist/types/providers/register-builtins.d.ts +31 -0
  71. package/dist/types/providers/synthetic.d.ts +26 -0
  72. package/dist/{providers → types/providers}/transform-messages.d.ts +6 -2
  73. package/dist/types/providers/vision-guard.d.ts +8 -0
  74. package/dist/types/providers/xai-responses.d.ts +23 -0
  75. package/dist/types/rate-limit-utils.d.ts +19 -0
  76. package/dist/types/stream.d.ts +28 -0
  77. package/dist/types/types.d.ts +801 -0
  78. package/dist/types/usage/claude.d.ts +4 -0
  79. package/dist/types/usage/gemini.d.ts +2 -0
  80. package/dist/types/usage/github-copilot.d.ts +7 -0
  81. package/dist/types/usage/google-antigravity.d.ts +2 -0
  82. package/dist/types/usage/kimi.d.ts +2 -0
  83. package/dist/types/usage/minimax-code.d.ts +2 -0
  84. package/dist/types/usage/openai-codex.d.ts +3 -0
  85. package/dist/types/usage/shared.d.ts +1 -0
  86. package/dist/types/usage/zai.d.ts +2 -0
  87. package/dist/types/usage.d.ts +260 -0
  88. package/dist/types/utils/abort.d.ts +19 -0
  89. package/dist/types/utils/abortable-iterator.d.ts +4 -0
  90. package/dist/types/utils/anthropic-auth.d.ts +35 -0
  91. package/dist/types/utils/discovery/antigravity.d.ts +61 -0
  92. package/dist/types/utils/discovery/codex.d.ts +38 -0
  93. package/dist/types/utils/discovery/cursor.d.ts +23 -0
  94. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  95. package/dist/types/utils/discovery/index.d.ts +4 -0
  96. package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
  97. package/dist/types/utils/event-stream.d.ts +28 -0
  98. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  99. package/dist/types/utils/foundry.d.ts +1 -0
  100. package/dist/types/utils/http-inspector.d.ts +31 -0
  101. package/dist/types/utils/idle-iterator.d.ts +78 -0
  102. package/dist/types/utils/json-parse.d.ts +37 -0
  103. package/dist/types/utils/oauth/__tests__/xai-oauth.test.d.ts +1 -0
  104. package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
  105. package/dist/types/utils/oauth/anthropic.d.ts +22 -0
  106. package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
  107. package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
  108. package/dist/types/utils/oauth/callback-server.d.ts +57 -0
  109. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  110. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  111. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  112. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  113. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  114. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  115. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  116. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  117. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  118. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  119. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  120. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  121. package/dist/types/utils/oauth/index.d.ts +38 -0
  122. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  123. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  124. package/dist/types/utils/oauth/kimi.d.ts +21 -0
  125. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  126. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  127. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  128. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  129. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  130. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  131. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  132. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  133. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  134. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  135. package/dist/types/utils/oauth/openrouter.d.ts +1 -0
  136. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  137. package/dist/types/utils/oauth/perplexity.d.ts +9 -0
  138. package/dist/{utils → types/utils}/oauth/pkce.d.ts +0 -5
  139. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  140. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  141. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  142. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  143. package/dist/types/utils/oauth/together.d.ts +1 -0
  144. package/dist/types/utils/oauth/types.d.ts +44 -0
  145. package/dist/types/utils/oauth/venice.d.ts +18 -0
  146. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  147. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  148. package/dist/types/utils/oauth/wafer.d.ts +2 -0
  149. package/dist/types/utils/oauth/xai-oauth.d.ts +60 -0
  150. package/dist/types/utils/oauth/xiaomi.d.ts +19 -0
  151. package/dist/types/utils/oauth/zai.d.ts +18 -0
  152. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  153. package/dist/types/utils/oauth/zhipu.d.ts +18 -0
  154. package/dist/{utils → types/utils}/overflow.d.ts +9 -11
  155. package/dist/types/utils/parse-bind.d.ts +23 -0
  156. package/dist/types/utils/provider-response.d.ts +3 -0
  157. package/dist/types/utils/request-debug.d.ts +29 -0
  158. package/dist/types/utils/retry-after.d.ts +3 -0
  159. package/dist/types/utils/retry.d.ts +26 -0
  160. package/dist/types/utils/schema/adapt.d.ts +24 -0
  161. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  162. package/dist/types/utils/schema/dereference.d.ts +11 -0
  163. package/dist/types/utils/schema/draft.d.ts +10 -0
  164. package/dist/types/utils/schema/equality.d.ts +4 -0
  165. package/dist/types/utils/schema/fields.d.ts +49 -0
  166. package/dist/types/utils/schema/index.d.ts +13 -0
  167. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  168. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  169. package/dist/types/utils/schema/normalize.d.ts +93 -0
  170. package/dist/types/utils/schema/spill.d.ts +8 -0
  171. package/dist/types/utils/schema/stamps.d.ts +25 -0
  172. package/dist/types/utils/schema/types.d.ts +4 -0
  173. package/dist/types/utils/schema/wire.d.ts +53 -0
  174. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  175. package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
  176. package/dist/types/utils/sse-debug.d.ts +10 -0
  177. package/dist/types/utils/stream-markup-healing.d.ts +80 -0
  178. package/dist/types/utils/tool-choice.d.ts +50 -0
  179. package/dist/types/utils/validation.d.ts +17 -0
  180. package/dist/types/utils.d.ts +28 -0
  181. package/package.json +139 -105
  182. package/src/api-registry.ts +96 -0
  183. package/src/auth-broker/client.ts +358 -0
  184. package/src/auth-broker/index.ts +5 -0
  185. package/src/auth-broker/refresher.ts +117 -0
  186. package/src/auth-broker/remote-store.ts +623 -0
  187. package/src/auth-broker/server.ts +644 -0
  188. package/src/auth-broker/types.ts +127 -0
  189. package/src/auth-broker/wire-schemas.ts +200 -0
  190. package/src/auth-gateway/http.ts +194 -0
  191. package/src/auth-gateway/index.ts +3 -0
  192. package/src/auth-gateway/server.ts +818 -0
  193. package/src/auth-gateway/types.ts +143 -0
  194. package/src/auth-storage.ts +4422 -0
  195. package/src/index.ts +54 -0
  196. package/src/model-cache.ts +129 -0
  197. package/src/model-manager.ts +469 -0
  198. package/src/model-thinking.ts +782 -0
  199. package/src/models.json +83530 -0
  200. package/src/models.json.d.ts +9 -0
  201. package/src/models.ts +56 -0
  202. package/src/prompts/turn-aborted-guidance.md +4 -0
  203. package/src/provider-details.ts +90 -0
  204. package/src/provider-models/bundled-references.ts +38 -0
  205. package/src/provider-models/descriptors.ts +355 -0
  206. package/src/provider-models/google.ts +88 -0
  207. package/src/provider-models/index.ts +5 -0
  208. package/src/provider-models/ollama.ts +153 -0
  209. package/src/provider-models/openai-compat.ts +2817 -0
  210. package/src/provider-models/special.ts +67 -0
  211. package/src/providers/aery-native-client.ts +228 -0
  212. package/src/providers/aery-native-server.ts +212 -0
  213. package/src/providers/amazon-bedrock.ts +873 -0
  214. package/src/providers/anthropic-client.ts +318 -0
  215. package/src/providers/anthropic-messages-server-schema.ts +243 -0
  216. package/src/providers/anthropic-messages-server.ts +683 -0
  217. package/src/providers/anthropic-wire.ts +268 -0
  218. package/src/providers/anthropic.ts +3094 -0
  219. package/src/providers/aws-credentials.ts +501 -0
  220. package/src/providers/aws-eventstream.ts +185 -0
  221. package/src/providers/aws-sigv4.ts +218 -0
  222. package/src/providers/azure-openai-responses.ts +361 -0
  223. package/src/providers/cursor/gen/agent_pb.ts +15274 -0
  224. package/src/providers/cursor/proto/agent.proto +3526 -0
  225. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  226. package/src/providers/cursor/proto/buf.yaml +17 -0
  227. package/src/providers/cursor.ts +2621 -0
  228. package/src/providers/error-message.ts +21 -0
  229. package/src/providers/github-copilot-headers.ts +140 -0
  230. package/src/providers/gitlab-duo.ts +372 -0
  231. package/src/providers/google-auth.ts +252 -0
  232. package/src/providers/google-gemini-cli.ts +809 -0
  233. package/src/providers/google-gemini-headers.ts +41 -0
  234. package/src/providers/google-shared.ts +917 -0
  235. package/src/providers/google-types.ts +167 -0
  236. package/src/providers/google-vertex.ts +91 -0
  237. package/src/providers/google.ts +41 -0
  238. package/src/providers/grammar.ts +70 -0
  239. package/src/providers/kimi.ts +52 -0
  240. package/src/providers/mock.ts +496 -0
  241. package/src/providers/ollama.ts +644 -0
  242. package/src/providers/openai-anthropic-shim.ts +138 -0
  243. package/src/providers/openai-chat-server-schema.ts +252 -0
  244. package/src/providers/openai-chat-server.ts +647 -0
  245. package/src/providers/openai-codex/constants.ts +43 -0
  246. package/src/providers/openai-codex/request-transformer.ts +161 -0
  247. package/src/providers/openai-codex/response-handler.ts +81 -0
  248. package/src/providers/openai-codex-responses.ts +3018 -0
  249. package/src/providers/openai-completions-compat.ts +300 -0
  250. package/src/providers/openai-completions.ts +1979 -0
  251. package/src/providers/openai-responses-server-schema.ts +290 -0
  252. package/src/providers/openai-responses-server.ts +1183 -0
  253. package/src/providers/openai-responses-shared.ts +873 -0
  254. package/src/providers/openai-responses.ts +679 -0
  255. package/src/providers/register-builtins.ts +436 -0
  256. package/src/providers/synthetic.ts +50 -0
  257. package/src/providers/transform-messages.ts +382 -0
  258. package/src/providers/vision-guard.ts +31 -0
  259. package/src/providers/xai-responses.ts +82 -0
  260. package/src/rate-limit-utils.ts +84 -0
  261. package/src/stream.ts +1065 -0
  262. package/src/types.ts +944 -0
  263. package/src/usage/claude.ts +482 -0
  264. package/src/usage/gemini.ts +250 -0
  265. package/src/usage/github-copilot.ts +421 -0
  266. package/src/usage/google-antigravity.ts +201 -0
  267. package/src/usage/kimi.ts +271 -0
  268. package/src/usage/minimax-code.ts +31 -0
  269. package/src/usage/openai-codex.ts +503 -0
  270. package/src/usage/shared.ts +10 -0
  271. package/src/usage/zai.ts +247 -0
  272. package/src/usage.ts +185 -0
  273. package/src/utils/abort.ts +51 -0
  274. package/src/utils/abortable-iterator.ts +69 -0
  275. package/src/utils/anthropic-auth.ts +93 -0
  276. package/src/utils/discovery/antigravity.ts +261 -0
  277. package/src/utils/discovery/codex.ts +371 -0
  278. package/src/utils/discovery/cursor.ts +306 -0
  279. package/src/utils/discovery/gemini.ts +248 -0
  280. package/src/utils/discovery/index.ts +4 -0
  281. package/src/utils/discovery/openai-compatible.ts +224 -0
  282. package/src/utils/event-stream.ts +142 -0
  283. package/src/utils/fireworks-model-id.ts +30 -0
  284. package/src/utils/foundry.ts +8 -0
  285. package/src/utils/http-inspector.ts +176 -0
  286. package/src/utils/idle-iterator.ts +267 -0
  287. package/src/utils/json-parse.ts +182 -0
  288. package/src/utils/oauth/__tests__/xai-oauth.test.ts +107 -0
  289. package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
  290. package/src/utils/oauth/anthropic.ts +273 -0
  291. package/src/utils/oauth/api-key-login.ts +87 -0
  292. package/src/utils/oauth/api-key-validation.ts +92 -0
  293. package/src/utils/oauth/callback-server.ts +276 -0
  294. package/src/utils/oauth/cerebras.ts +16 -0
  295. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  296. package/src/utils/oauth/cursor.ts +157 -0
  297. package/src/utils/oauth/deepseek.ts +53 -0
  298. package/src/utils/oauth/firepass.ts +24 -0
  299. package/src/utils/oauth/fireworks.ts +15 -0
  300. package/src/utils/oauth/github-copilot.ts +362 -0
  301. package/src/utils/oauth/gitlab-duo.ts +123 -0
  302. package/src/utils/oauth/google-antigravity.ts +200 -0
  303. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  304. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  305. package/src/utils/oauth/huggingface.ts +62 -0
  306. package/src/utils/oauth/index.ts +484 -0
  307. package/src/utils/oauth/kagi.ts +47 -0
  308. package/src/utils/oauth/kilo.ts +87 -0
  309. package/src/utils/oauth/kimi.ts +254 -0
  310. package/src/utils/oauth/litellm.ts +47 -0
  311. package/src/utils/oauth/lm-studio.ts +38 -0
  312. package/src/utils/oauth/minimax-code.ts +78 -0
  313. package/src/utils/oauth/moonshot.ts +23 -0
  314. package/src/utils/oauth/nanogpt.ts +15 -0
  315. package/src/utils/oauth/nvidia.ts +70 -0
  316. package/src/utils/oauth/oauth.html +203 -0
  317. package/src/utils/oauth/ollama-cloud.ts +28 -0
  318. package/src/utils/oauth/ollama.ts +47 -0
  319. package/src/utils/oauth/openai-codex.ts +299 -0
  320. package/src/utils/oauth/opencode.ts +49 -0
  321. package/src/utils/oauth/openrouter.ts +20 -0
  322. package/src/utils/oauth/parallel.ts +46 -0
  323. package/src/utils/oauth/perplexity.ts +206 -0
  324. package/src/utils/oauth/pkce.ts +18 -0
  325. package/src/utils/oauth/qianfan.ts +58 -0
  326. package/src/utils/oauth/qwen-portal.ts +60 -0
  327. package/src/utils/oauth/synthetic.ts +15 -0
  328. package/src/utils/oauth/tavily.ts +46 -0
  329. package/src/utils/oauth/together.ts +16 -0
  330. package/src/utils/oauth/types.ts +99 -0
  331. package/src/utils/oauth/venice.ts +59 -0
  332. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  333. package/src/utils/oauth/vllm.ts +40 -0
  334. package/src/utils/oauth/wafer.ts +50 -0
  335. package/src/utils/oauth/xai-oauth.ts +342 -0
  336. package/src/utils/oauth/xiaomi.ts +139 -0
  337. package/src/utils/oauth/zai.ts +60 -0
  338. package/src/utils/oauth/zenmux.ts +15 -0
  339. package/src/utils/oauth/zhipu.ts +60 -0
  340. package/src/utils/overflow.ts +137 -0
  341. package/src/utils/parse-bind.ts +54 -0
  342. package/src/utils/provider-response.ts +30 -0
  343. package/src/utils/request-debug.ts +336 -0
  344. package/src/utils/retry-after.ts +110 -0
  345. package/src/utils/retry.ts +54 -0
  346. package/src/utils/schema/CONSTRAINTS.md +164 -0
  347. package/src/utils/schema/adapt.ts +36 -0
  348. package/src/utils/schema/compatibility.ts +435 -0
  349. package/src/utils/schema/dereference.ts +98 -0
  350. package/src/utils/schema/draft.ts +341 -0
  351. package/src/utils/schema/equality.ts +97 -0
  352. package/src/utils/schema/fields.ts +191 -0
  353. package/src/utils/schema/index.ts +13 -0
  354. package/src/utils/schema/json-schema-validator.ts +577 -0
  355. package/src/utils/schema/meta-validator.ts +167 -0
  356. package/src/utils/schema/normalize.ts +1588 -0
  357. package/src/utils/schema/spill.ts +43 -0
  358. package/src/utils/schema/stamps.ts +97 -0
  359. package/src/utils/schema/types.ts +10 -0
  360. package/src/utils/schema/wire.ts +293 -0
  361. package/src/utils/schema/zod-decontaminate.ts +331 -0
  362. package/src/utils/sdk-stream-timeout.ts +43 -0
  363. package/src/utils/sse-debug.ts +289 -0
  364. package/src/utils/stream-markup-healing.ts +612 -0
  365. package/src/utils/tool-choice.ts +99 -0
  366. package/src/utils/validation.ts +1024 -0
  367. package/src/utils.ts +166 -0
  368. package/dist/api-registry.d.ts +0 -20
  369. package/dist/api-registry.d.ts.map +0 -1
  370. package/dist/api-registry.js +0 -44
  371. package/dist/api-registry.js.map +0 -1
  372. package/dist/bedrock-provider.d.ts +0 -5
  373. package/dist/bedrock-provider.d.ts.map +0 -1
  374. package/dist/bedrock-provider.js +0 -6
  375. package/dist/bedrock-provider.js.map +0 -1
  376. package/dist/cli.d.ts +0 -3
  377. package/dist/cli.d.ts.map +0 -1
  378. package/dist/cli.js +0 -130
  379. package/dist/cli.js.map +0 -1
  380. package/dist/env-api-keys.d.ts +0 -18
  381. package/dist/env-api-keys.d.ts.map +0 -1
  382. package/dist/env-api-keys.js +0 -178
  383. package/dist/env-api-keys.js.map +0 -1
  384. package/dist/image-models.d.ts +0 -10
  385. package/dist/image-models.d.ts.map +0 -1
  386. package/dist/image-models.generated.d.ts +0 -440
  387. package/dist/image-models.generated.d.ts.map +0 -1
  388. package/dist/image-models.generated.js +0 -442
  389. package/dist/image-models.generated.js.map +0 -1
  390. package/dist/image-models.js +0 -23
  391. package/dist/image-models.js.map +0 -1
  392. package/dist/images-api-registry.d.ts +0 -14
  393. package/dist/images-api-registry.d.ts.map +0 -1
  394. package/dist/images-api-registry.js +0 -22
  395. package/dist/images-api-registry.js.map +0 -1
  396. package/dist/images.d.ts +0 -4
  397. package/dist/images.d.ts.map +0 -1
  398. package/dist/images.js +0 -14
  399. package/dist/images.js.map +0 -1
  400. package/dist/index.d.ts +0 -32
  401. package/dist/index.d.ts.map +0 -1
  402. package/dist/index.js +0 -20
  403. package/dist/index.js.map +0 -1
  404. package/dist/models.d.ts +0 -18
  405. package/dist/models.d.ts.map +0 -1
  406. package/dist/models.generated.d.ts +0 -17480
  407. package/dist/models.generated.d.ts.map +0 -1
  408. package/dist/models.generated.js +0 -16339
  409. package/dist/models.generated.js.map +0 -1
  410. package/dist/models.js +0 -71
  411. package/dist/models.js.map +0 -1
  412. package/dist/oauth.d.ts +0 -2
  413. package/dist/oauth.d.ts.map +0 -1
  414. package/dist/oauth.js +0 -2
  415. package/dist/oauth.js.map +0 -1
  416. package/dist/providers/aery-error-formatting.d.ts +0 -13
  417. package/dist/providers/aery-error-formatting.d.ts.map +0 -1
  418. package/dist/providers/aery-error-formatting.js +0 -112
  419. package/dist/providers/aery-error-formatting.js.map +0 -1
  420. package/dist/providers/amazon-bedrock.d.ts +0 -38
  421. package/dist/providers/amazon-bedrock.d.ts.map +0 -1
  422. package/dist/providers/amazon-bedrock.js +0 -763
  423. package/dist/providers/amazon-bedrock.js.map +0 -1
  424. package/dist/providers/anthropic.d.ts +0 -71
  425. package/dist/providers/anthropic.d.ts.map +0 -1
  426. package/dist/providers/anthropic.js +0 -949
  427. package/dist/providers/anthropic.js.map +0 -1
  428. package/dist/providers/azure-openai-responses.d.ts +0 -15
  429. package/dist/providers/azure-openai-responses.d.ts.map +0 -1
  430. package/dist/providers/azure-openai-responses.js +0 -225
  431. package/dist/providers/azure-openai-responses.js.map +0 -1
  432. package/dist/providers/cloudflare.d.ts +0 -13
  433. package/dist/providers/cloudflare.d.ts.map +0 -1
  434. package/dist/providers/cloudflare.js +0 -26
  435. package/dist/providers/cloudflare.js.map +0 -1
  436. package/dist/providers/faux.d.ts +0 -56
  437. package/dist/providers/faux.d.ts.map +0 -1
  438. package/dist/providers/faux.js +0 -368
  439. package/dist/providers/faux.js.map +0 -1
  440. package/dist/providers/github-copilot-headers.d.ts +0 -8
  441. package/dist/providers/github-copilot-headers.d.ts.map +0 -1
  442. package/dist/providers/github-copilot-headers.js +0 -29
  443. package/dist/providers/github-copilot-headers.js.map +0 -1
  444. package/dist/providers/google-gemini-cli.d.ts +0 -74
  445. package/dist/providers/google-gemini-cli.d.ts.map +0 -1
  446. package/dist/providers/google-gemini-cli.js +0 -779
  447. package/dist/providers/google-gemini-cli.js.map +0 -1
  448. package/dist/providers/google-shared.d.ts +0 -70
  449. package/dist/providers/google-shared.d.ts.map +0 -1
  450. package/dist/providers/google-shared.js +0 -329
  451. package/dist/providers/google-shared.js.map +0 -1
  452. package/dist/providers/google-vertex.d.ts +0 -15
  453. package/dist/providers/google-vertex.d.ts.map +0 -1
  454. package/dist/providers/google-vertex.js +0 -442
  455. package/dist/providers/google-vertex.js.map +0 -1
  456. package/dist/providers/google.d.ts +0 -13
  457. package/dist/providers/google.d.ts.map +0 -1
  458. package/dist/providers/google.js +0 -400
  459. package/dist/providers/google.js.map +0 -1
  460. package/dist/providers/images/openrouter.d.ts +0 -3
  461. package/dist/providers/images/openrouter.d.ts.map +0 -1
  462. package/dist/providers/images/openrouter.js +0 -129
  463. package/dist/providers/images/openrouter.js.map +0 -1
  464. package/dist/providers/images/register-builtins.d.ts +0 -4
  465. package/dist/providers/images/register-builtins.d.ts.map +0 -1
  466. package/dist/providers/images/register-builtins.js +0 -34
  467. package/dist/providers/images/register-builtins.js.map +0 -1
  468. package/dist/providers/mistral.d.ts +0 -25
  469. package/dist/providers/mistral.d.ts.map +0 -1
  470. package/dist/providers/mistral.js +0 -535
  471. package/dist/providers/mistral.js.map +0 -1
  472. package/dist/providers/openai-codex-responses.d.ts +0 -30
  473. package/dist/providers/openai-codex-responses.d.ts.map +0 -1
  474. package/dist/providers/openai-codex-responses.js +0 -1090
  475. package/dist/providers/openai-codex-responses.js.map +0 -1
  476. package/dist/providers/openai-completions.d.ts +0 -19
  477. package/dist/providers/openai-completions.d.ts.map +0 -1
  478. package/dist/providers/openai-completions.js +0 -950
  479. package/dist/providers/openai-completions.js.map +0 -1
  480. package/dist/providers/openai-prompt-cache.d.ts +0 -3
  481. package/dist/providers/openai-prompt-cache.d.ts.map +0 -1
  482. package/dist/providers/openai-prompt-cache.js +0 -10
  483. package/dist/providers/openai-prompt-cache.js.map +0 -1
  484. package/dist/providers/openai-responses-shared.d.ts +0 -18
  485. package/dist/providers/openai-responses-shared.d.ts.map +0 -1
  486. package/dist/providers/openai-responses-shared.js +0 -492
  487. package/dist/providers/openai-responses-shared.js.map +0 -1
  488. package/dist/providers/openai-responses.d.ts +0 -13
  489. package/dist/providers/openai-responses.d.ts.map +0 -1
  490. package/dist/providers/openai-responses.js +0 -237
  491. package/dist/providers/openai-responses.js.map +0 -1
  492. package/dist/providers/register-builtins.d.ts +0 -38
  493. package/dist/providers/register-builtins.d.ts.map +0 -1
  494. package/dist/providers/register-builtins.js +0 -278
  495. package/dist/providers/register-builtins.js.map +0 -1
  496. package/dist/providers/simple-options.d.ts +0 -8
  497. package/dist/providers/simple-options.d.ts.map +0 -1
  498. package/dist/providers/simple-options.js +0 -41
  499. package/dist/providers/simple-options.js.map +0 -1
  500. package/dist/providers/transform-messages.d.ts.map +0 -1
  501. package/dist/providers/transform-messages.js +0 -184
  502. package/dist/providers/transform-messages.js.map +0 -1
  503. package/dist/session-resources.d.ts +0 -4
  504. package/dist/session-resources.d.ts.map +0 -1
  505. package/dist/session-resources.js +0 -22
  506. package/dist/session-resources.js.map +0 -1
  507. package/dist/stream.d.ts +0 -8
  508. package/dist/stream.d.ts.map +0 -1
  509. package/dist/stream.js +0 -27
  510. package/dist/stream.js.map +0 -1
  511. package/dist/types.d.ts +0 -498
  512. package/dist/types.d.ts.map +0 -1
  513. package/dist/types.js +0 -2
  514. package/dist/types.js.map +0 -1
  515. package/dist/utils/diagnostics.d.ts +0 -19
  516. package/dist/utils/diagnostics.d.ts.map +0 -1
  517. package/dist/utils/diagnostics.js +0 -25
  518. package/dist/utils/diagnostics.js.map +0 -1
  519. package/dist/utils/event-stream.d.ts +0 -21
  520. package/dist/utils/event-stream.d.ts.map +0 -1
  521. package/dist/utils/event-stream.js +0 -81
  522. package/dist/utils/event-stream.js.map +0 -1
  523. package/dist/utils/hash.d.ts +0 -3
  524. package/dist/utils/hash.d.ts.map +0 -1
  525. package/dist/utils/hash.js +0 -14
  526. package/dist/utils/hash.js.map +0 -1
  527. package/dist/utils/headers.d.ts +0 -2
  528. package/dist/utils/headers.d.ts.map +0 -1
  529. package/dist/utils/headers.js +0 -8
  530. package/dist/utils/headers.js.map +0 -1
  531. package/dist/utils/json-parse.d.ts +0 -16
  532. package/dist/utils/json-parse.d.ts.map +0 -1
  533. package/dist/utils/json-parse.js +0 -113
  534. package/dist/utils/json-parse.js.map +0 -1
  535. package/dist/utils/node-http-proxy.d.ts +0 -10
  536. package/dist/utils/node-http-proxy.d.ts.map +0 -1
  537. package/dist/utils/node-http-proxy.js +0 -97
  538. package/dist/utils/node-http-proxy.js.map +0 -1
  539. package/dist/utils/oauth/anthropic.d.ts +0 -25
  540. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  541. package/dist/utils/oauth/anthropic.js +0 -335
  542. package/dist/utils/oauth/anthropic.js.map +0 -1
  543. package/dist/utils/oauth/device-code.d.ts +0 -19
  544. package/dist/utils/oauth/device-code.d.ts.map +0 -1
  545. package/dist/utils/oauth/device-code.js +0 -55
  546. package/dist/utils/oauth/device-code.js.map +0 -1
  547. package/dist/utils/oauth/github-copilot.d.ts +0 -30
  548. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  549. package/dist/utils/oauth/github-copilot.js +0 -268
  550. package/dist/utils/oauth/github-copilot.js.map +0 -1
  551. package/dist/utils/oauth/google-antigravity.d.ts +0 -26
  552. package/dist/utils/oauth/google-antigravity.d.ts.map +0 -1
  553. package/dist/utils/oauth/google-antigravity.js +0 -377
  554. package/dist/utils/oauth/google-antigravity.js.map +0 -1
  555. package/dist/utils/oauth/google-gemini-cli.d.ts +0 -26
  556. package/dist/utils/oauth/google-gemini-cli.d.ts.map +0 -1
  557. package/dist/utils/oauth/google-gemini-cli.js +0 -482
  558. package/dist/utils/oauth/google-gemini-cli.js.map +0 -1
  559. package/dist/utils/oauth/index.d.ts +0 -63
  560. package/dist/utils/oauth/index.d.ts.map +0 -1
  561. package/dist/utils/oauth/index.js +0 -131
  562. package/dist/utils/oauth/index.js.map +0 -1
  563. package/dist/utils/oauth/oauth-page.d.ts +0 -3
  564. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  565. package/dist/utils/oauth/oauth-page.js +0 -105
  566. package/dist/utils/oauth/oauth-page.js.map +0 -1
  567. package/dist/utils/oauth/openai-codex.d.ts +0 -34
  568. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  569. package/dist/utils/oauth/openai-codex.js +0 -385
  570. package/dist/utils/oauth/openai-codex.js.map +0 -1
  571. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  572. package/dist/utils/oauth/pkce.js +0 -31
  573. package/dist/utils/oauth/pkce.js.map +0 -1
  574. package/dist/utils/oauth/types.d.ts +0 -64
  575. package/dist/utils/oauth/types.d.ts.map +0 -1
  576. package/dist/utils/oauth/types.js +0 -2
  577. package/dist/utils/oauth/types.js.map +0 -1
  578. package/dist/utils/overflow.d.ts.map +0 -1
  579. package/dist/utils/overflow.js +0 -151
  580. package/dist/utils/overflow.js.map +0 -1
  581. package/dist/utils/sanitize-unicode.d.ts +0 -22
  582. package/dist/utils/sanitize-unicode.d.ts.map +0 -1
  583. package/dist/utils/sanitize-unicode.js +0 -26
  584. package/dist/utils/sanitize-unicode.js.map +0 -1
  585. package/dist/utils/typebox-helpers.d.ts +0 -17
  586. package/dist/utils/typebox-helpers.d.ts.map +0 -1
  587. package/dist/utils/typebox-helpers.js +0 -21
  588. package/dist/utils/typebox-helpers.js.map +0 -1
  589. package/dist/utils/validation.d.ts +0 -18
  590. package/dist/utils/validation.d.ts.map +0 -1
  591. package/dist/utils/validation.js +0 -281
  592. package/dist/utils/validation.js.map +0 -1
@@ -0,0 +1,809 @@
1
+ /**
2
+ * Google Gemini CLI / Antigravity provider.
3
+ * Shared implementation for both google-gemini-cli and google-antigravity providers.
4
+ * Uses the Cloud Code Assist API endpoint to access Gemini and Claude models.
5
+ */
6
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
7
+ import { scheduler } from "node:timers/promises";
8
+ import { extractHttpStatusFromError, fetchWithRetry, readSseJson } from "@aryee337/aery-utils";
9
+ import { calculateCost } from "../models";
10
+ import type {
11
+ Api,
12
+ AssistantMessage,
13
+ Context,
14
+ Model,
15
+ StreamFunction,
16
+ StreamOptions,
17
+ TextContent,
18
+ ThinkingContent,
19
+ ToolCall,
20
+ } from "../types";
21
+ import { normalizeSystemPrompts } from "../utils";
22
+ import { AssistantMessageEventStream } from "../utils/event-stream";
23
+ import { appendRawHttpRequestDumpFor400, type RawHttpRequestDump, withHttpStatus } from "../utils/http-inspector";
24
+ // Refresh is the sole responsibility of AuthStorage (broker-aware, single-flighted);
25
+ // the stream provider trusts the access token threaded through `options.apiKey`.
26
+ import { normalizeSchemaForCCA } from "../utils/schema";
27
+ import { ANTIGRAVITY_SYSTEM_INSTRUCTION, getAntigravityUserAgent, getGeminiCliHeaders } from "./google-gemini-headers";
28
+ import type { Content, FunctionCallingConfigMode, ThinkingConfig } from "./google-shared";
29
+ import {
30
+ convertMessages,
31
+ convertTools,
32
+ type GoogleThinkingLevel,
33
+ isThinkingPart,
34
+ mapStopReasonString,
35
+ mapToolChoice,
36
+ nextToolCallId,
37
+ pushBlockEndEvent,
38
+ pushToolCallEvents,
39
+ retainThoughtSignature,
40
+ startTextOrThinkingBlock,
41
+ } from "./google-shared";
42
+
43
+ /**
44
+ * Thinking level for Gemini 3 models. Re-exported from `google-shared` so existing
45
+ * `import { GoogleThinkingLevel } from "./google-gemini-cli"` callers keep working.
46
+ */
47
+ export type { GoogleThinkingLevel };
48
+
49
+ export interface GoogleGeminiCliOptions extends StreamOptions {
50
+ /**
51
+ * Tool selection mode. String forms map directly to Gemini
52
+ * `FunctionCallingConfigMode`. The object form forces a single named tool —
53
+ * `mode: "ANY"` is wire-required when `allowedFunctionNames` is set.
54
+ */
55
+ toolChoice?: "auto" | "none" | "any" | { mode: "ANY"; allowedFunctionNames: [string, ...string[]] };
56
+ /**
57
+ * Thinking/reasoning configuration.
58
+ * - Gemini 2.x models: use `budgetTokens` to set the thinking budget
59
+ * - Gemini 3 models (gemini-3-pro-*, gemini-3-flash-*): use `level` instead
60
+ *
61
+ * When using `streamSimple`, this is handled automatically based on the model.
62
+ */
63
+ thinking?: {
64
+ enabled: boolean;
65
+ /** Thinking budget in tokens. Use for Gemini 2.x models. */
66
+ budgetTokens?: number;
67
+ /** Thinking level. Use for Gemini 3 models (LOW/HIGH for Pro, MINIMAL/LOW/MEDIUM/HIGH for Flash). */
68
+ level?: GoogleThinkingLevel;
69
+ };
70
+ projectId?: string;
71
+ }
72
+
73
+ const DEFAULT_ENDPOINT = "https://cloudcode-pa.googleapis.com";
74
+ const ANTIGRAVITY_DAILY_ENDPOINT = "https://daily-cloudcode-pa.googleapis.com";
75
+ const ANTIGRAVITY_SANDBOX_ENDPOINT = "https://daily-cloudcode-pa.sandbox.googleapis.com";
76
+ const ANTIGRAVITY_ENDPOINT_FALLBACKS = [ANTIGRAVITY_DAILY_ENDPOINT, ANTIGRAVITY_SANDBOX_ENDPOINT] as const;
77
+
78
+ export {
79
+ ANTIGRAVITY_SYSTEM_INSTRUCTION,
80
+ getAntigravityUserAgent,
81
+ getGeminiCliHeaders,
82
+ getGeminiCliUserAgent,
83
+ } from "./google-gemini-headers";
84
+
85
+ // Retry configuration
86
+ const MAX_RETRIES = 3;
87
+ const BASE_DELAY_MS = 1000;
88
+ const MAX_EMPTY_STREAM_RETRIES = 2;
89
+ const EMPTY_STREAM_BASE_DELAY_MS = 500;
90
+ const RATE_LIMIT_BUDGET_MS = 5 * 60 * 1000;
91
+ const CLAUDE_THINKING_BETA_HEADER = "interleaved-thinking-2025-05-14";
92
+ const GOOGLE_GEMINI_REFRESH_SKEW_MS = 60_000;
93
+ const ANTIGRAVITY_REFRESH_SKEW_MS = 60_000;
94
+
95
+ function isClaudeModel(modelId: string): boolean {
96
+ return modelId.toLowerCase().includes("claude");
97
+ }
98
+
99
+ function needsClaudeThinkingBetaHeader(model: Model<"google-gemini-cli">): boolean {
100
+ return model.provider === "google-antigravity" && model.id.startsWith("claude-") && model.reasoning;
101
+ }
102
+
103
+ function shouldInjectAntigravitySystemInstruction(modelId: string): boolean {
104
+ const normalized = modelId.toLowerCase();
105
+ return normalized.includes("claude") || normalized.includes("gemini-3");
106
+ }
107
+
108
+ /**
109
+ * Extract a clean, user-friendly error message from Google API error response.
110
+ * Parses JSON error responses and returns just the message field.
111
+ */
112
+ function extractErrorMessage(errorText: string): string {
113
+ try {
114
+ const parsed = JSON.parse(errorText) as { error?: { message?: string } };
115
+ if (parsed.error?.message) {
116
+ return parsed.error.message;
117
+ }
118
+ } catch {
119
+ // Not JSON, return as-is
120
+ }
121
+ return errorText;
122
+ }
123
+
124
+ interface GeminiCliApiKeyPayload {
125
+ token?: unknown;
126
+ projectId?: unknown;
127
+ project_id?: unknown;
128
+ refreshToken?: unknown;
129
+ expiresAt?: unknown;
130
+ refresh?: unknown;
131
+ expires?: unknown;
132
+ }
133
+ interface ParsedGeminiCliCredentials {
134
+ accessToken: string;
135
+ projectId: string;
136
+ refreshToken?: string;
137
+ expiresAt?: number;
138
+ }
139
+
140
+ function normalizeExpiryMs(value: unknown): number | undefined {
141
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
142
+ return undefined;
143
+ }
144
+ return value < 10_000_000_000 ? value * 1000 : value;
145
+ }
146
+
147
+ export function parseGeminiCliCredentials(apiKeyRaw: string): ParsedGeminiCliCredentials {
148
+ const invalidCredentialsMessage = "Invalid Google Cloud Code Assist credentials. Use /login to re-authenticate.";
149
+ const missingCredentialsMessage =
150
+ "Missing token or projectId in Google Cloud credentials. Use /login to re-authenticate.";
151
+
152
+ let parsed: GeminiCliApiKeyPayload;
153
+ try {
154
+ parsed = JSON.parse(apiKeyRaw) as GeminiCliApiKeyPayload;
155
+ } catch {
156
+ throw new Error(invalidCredentialsMessage);
157
+ }
158
+
159
+ const projectId =
160
+ typeof parsed.projectId === "string"
161
+ ? parsed.projectId
162
+ : typeof parsed.project_id === "string"
163
+ ? parsed.project_id
164
+ : undefined;
165
+
166
+ if (typeof parsed.token !== "string" || typeof projectId !== "string") {
167
+ throw new Error(missingCredentialsMessage);
168
+ }
169
+
170
+ const refreshToken =
171
+ typeof parsed.refreshToken === "string"
172
+ ? parsed.refreshToken
173
+ : typeof parsed.refresh === "string"
174
+ ? parsed.refresh
175
+ : undefined;
176
+ const expiresAt = normalizeExpiryMs(parsed.expiresAt ?? parsed.expires);
177
+
178
+ return {
179
+ accessToken: parsed.token,
180
+ projectId,
181
+ refreshToken,
182
+ expiresAt,
183
+ };
184
+ }
185
+
186
+ export function shouldRefreshGeminiCliCredentials(
187
+ expiresAt: number | undefined,
188
+ isAntigravity: boolean,
189
+ nowMs = Date.now(),
190
+ ): boolean {
191
+ if (expiresAt === undefined) {
192
+ return false;
193
+ }
194
+
195
+ const skewMs = isAntigravity ? ANTIGRAVITY_REFRESH_SKEW_MS : GOOGLE_GEMINI_REFRESH_SKEW_MS;
196
+ return nowMs + skewMs >= expiresAt;
197
+ }
198
+
199
+ interface CloudCodeAssistRequest {
200
+ project: string;
201
+ model: string;
202
+ request: {
203
+ contents: Content[];
204
+ sessionId?: string;
205
+ systemInstruction?: { role?: string; parts: { text: string }[] };
206
+ generationConfig?: {
207
+ maxOutputTokens?: number;
208
+ temperature?: number;
209
+ topP?: number;
210
+ topK?: number;
211
+ minP?: number;
212
+ presencePenalty?: number;
213
+ repetitionPenalty?: number;
214
+ thinkingConfig?: ThinkingConfig;
215
+ };
216
+ tools?: { functionDeclarations: Record<string, unknown>[] }[] | undefined;
217
+ toolConfig?: {
218
+ functionCallingConfig: {
219
+ mode: FunctionCallingConfigMode;
220
+ allowedFunctionNames?: string[];
221
+ };
222
+ };
223
+ };
224
+ requestType?: string;
225
+ userAgent?: string;
226
+ requestId?: string;
227
+ }
228
+
229
+ interface CloudCodeAssistResponseChunk {
230
+ response?: {
231
+ candidates?: Array<{
232
+ content?: {
233
+ role: string;
234
+ parts?: Array<{
235
+ text?: string;
236
+ thought?: boolean;
237
+ thoughtSignature?: string;
238
+ functionCall?: {
239
+ name: string;
240
+ args: Record<string, unknown>;
241
+ id?: string;
242
+ };
243
+ }>;
244
+ };
245
+ finishReason?: string;
246
+ }>;
247
+ usageMetadata?: {
248
+ promptTokenCount?: number;
249
+ candidatesTokenCount?: number;
250
+ thoughtsTokenCount?: number;
251
+ totalTokenCount?: number;
252
+ cachedContentTokenCount?: number;
253
+ };
254
+ modelVersion?: string;
255
+ responseId?: string;
256
+ };
257
+ traceId?: string;
258
+ }
259
+
260
+ export const streamGoogleGeminiCli: StreamFunction<"google-gemini-cli"> = (
261
+ model: Model<"google-gemini-cli">,
262
+ context: Context,
263
+ options?: GoogleGeminiCliOptions,
264
+ ): AssistantMessageEventStream => {
265
+ const stream = new AssistantMessageEventStream();
266
+
267
+ (async () => {
268
+ const startTime = Date.now();
269
+ let firstTokenTime: number | undefined;
270
+
271
+ const output: AssistantMessage = {
272
+ role: "assistant",
273
+ content: [],
274
+ api: "google-gemini-cli" as Api,
275
+ provider: model.provider,
276
+ model: model.id,
277
+ usage: {
278
+ input: 0,
279
+ output: 0,
280
+ cacheRead: 0,
281
+ cacheWrite: 0,
282
+ totalTokens: 0,
283
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
284
+ },
285
+ stopReason: "stop",
286
+ timestamp: Date.now(),
287
+ };
288
+ let rawRequestDump: RawHttpRequestDump | undefined;
289
+
290
+ try {
291
+ const apiKeyRaw = options?.apiKey;
292
+ if (!apiKeyRaw) {
293
+ throw new Error("Google Cloud Code Assist requires OAuth authentication. Use /login to authenticate.");
294
+ }
295
+
296
+ const isAntigravity = model.provider === "google-antigravity";
297
+ const parsedCredentials = parseGeminiCliCredentials(apiKeyRaw);
298
+ // AuthStorage already refreshed credentials before threading them
299
+ // here (see {@link OAUTH_REFRESH_SKEW_MS}). If the credential lands
300
+ // expired we bail rather than POSTing a stale token; the next call
301
+ // — driven by AuthStorage's invalidate+retry path — will carry a
302
+ // fresh credential.
303
+ if (
304
+ shouldRefreshGeminiCliCredentials(parsedCredentials.expiresAt, isAntigravity) &&
305
+ parsedCredentials.expiresAt !== undefined &&
306
+ Date.now() >= parsedCredentials.expiresAt
307
+ ) {
308
+ throw new Error(
309
+ "OAuth token expired before request — please retry; AuthStorage will refresh on the next attempt.",
310
+ );
311
+ }
312
+ const { accessToken, projectId } = parsedCredentials;
313
+
314
+ const baseUrl = model.baseUrl?.trim();
315
+ const endpoints = baseUrl ? [baseUrl] : isAntigravity ? ANTIGRAVITY_ENDPOINT_FALLBACKS : [DEFAULT_ENDPOINT];
316
+
317
+ let requestBody = buildRequest(model, context, projectId, options, isAntigravity);
318
+ const replacementPayload = await options?.onPayload?.(requestBody, model);
319
+ if (replacementPayload !== undefined) {
320
+ requestBody = replacementPayload as typeof requestBody;
321
+ }
322
+ const headers = isAntigravity ? { "User-Agent": getAntigravityUserAgent() } : getGeminiCliHeaders(model.id);
323
+
324
+ const requestHeaders = {
325
+ Authorization: `Bearer ${accessToken}`,
326
+ "Content-Type": "application/json",
327
+ Accept: "text/event-stream",
328
+ ...headers,
329
+ ...(needsClaudeThinkingBetaHeader(model) ? { "anthropic-beta": CLAUDE_THINKING_BETA_HEADER } : {}),
330
+ ...(options?.headers ?? {}),
331
+ };
332
+ const requestBodyJson = JSON.stringify(requestBody);
333
+ rawRequestDump = {
334
+ provider: model.provider,
335
+ api: output.api,
336
+ model: model.id,
337
+ method: "POST",
338
+ body: requestBody,
339
+ headers: requestHeaders,
340
+ };
341
+
342
+ const response = await fetchWithRetry(
343
+ attempt => `${endpoints[Math.min(attempt, endpoints.length - 1)]}/v1internal:streamGenerateContent?alt=sse`,
344
+ {
345
+ method: "POST",
346
+ headers: requestHeaders,
347
+ body: requestBodyJson,
348
+ signal: options?.signal,
349
+ maxAttempts: MAX_RETRIES + 1,
350
+ defaultDelayMs: attempt => BASE_DELAY_MS * 2 ** attempt,
351
+ maxDelayMs: options?.maxRetryDelayMs ?? RATE_LIMIT_BUDGET_MS,
352
+ fetch: options?.fetch,
353
+ },
354
+ );
355
+ if (!response.ok) {
356
+ const errorText = await response.text();
357
+ throw withHttpStatus(
358
+ new Error(`Cloud Code Assist API error (${response.status}): ${extractErrorMessage(errorText)}`),
359
+ response.status,
360
+ );
361
+ }
362
+ const requestUrl = response.url;
363
+
364
+ let started = false;
365
+ const ensureStarted = () => {
366
+ if (!started) {
367
+ if (!firstTokenTime) firstTokenTime = Date.now();
368
+ stream.push({ type: "start", partial: output });
369
+ started = true;
370
+ }
371
+ };
372
+
373
+ const resetOutput = () => {
374
+ output.content = [];
375
+ output.usage = {
376
+ input: 0,
377
+ output: 0,
378
+ cacheRead: 0,
379
+ cacheWrite: 0,
380
+ totalTokens: 0,
381
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
382
+ };
383
+ output.stopReason = "stop";
384
+ output.errorMessage = undefined;
385
+ output.timestamp = Date.now();
386
+ started = false;
387
+ };
388
+
389
+ const streamResponse = async (activeResponse: Response): Promise<boolean> => {
390
+ if (!activeResponse.body) {
391
+ throw new Error("No response body");
392
+ }
393
+
394
+ let hasContent = false;
395
+ let currentBlock: TextContent | ThinkingContent | null = null;
396
+ const blocks = output.content;
397
+ const blockIndex = () => blocks.length - 1;
398
+
399
+ for await (const chunk of readSseJson<CloudCodeAssistResponseChunk>(
400
+ activeResponse.body!,
401
+ options?.signal,
402
+ event => options?.onSseEvent?.({ event: event.event, data: event.data, raw: [...event.raw] }, model),
403
+ )) {
404
+ const responseData = chunk.response;
405
+ if (!responseData) continue;
406
+
407
+ const candidate = responseData.candidates?.[0];
408
+ if (candidate?.content?.parts) {
409
+ for (const part of candidate.content.parts) {
410
+ if (part.text !== undefined) {
411
+ hasContent = true;
412
+ const isThinking = isThinkingPart(part);
413
+ if (
414
+ !currentBlock ||
415
+ (isThinking && currentBlock.type !== "thinking") ||
416
+ (!isThinking && currentBlock.type !== "text")
417
+ ) {
418
+ if (currentBlock) {
419
+ pushBlockEndEvent(currentBlock, blockIndex(), output, stream);
420
+ }
421
+ currentBlock = startTextOrThinkingBlock(isThinking, output, stream, ensureStarted);
422
+ }
423
+ if (currentBlock.type === "thinking") {
424
+ currentBlock.thinking += part.text;
425
+ currentBlock.thinkingSignature = retainThoughtSignature(
426
+ currentBlock.thinkingSignature,
427
+ part.thoughtSignature,
428
+ );
429
+ stream.push({
430
+ type: "thinking_delta",
431
+ contentIndex: blockIndex(),
432
+ delta: part.text,
433
+ partial: output,
434
+ });
435
+ } else {
436
+ currentBlock.text += part.text;
437
+ currentBlock.textSignature = retainThoughtSignature(
438
+ currentBlock.textSignature,
439
+ part.thoughtSignature,
440
+ );
441
+ stream.push({
442
+ type: "text_delta",
443
+ contentIndex: blockIndex(),
444
+ delta: part.text,
445
+ partial: output,
446
+ });
447
+ }
448
+ }
449
+
450
+ if (part.functionCall) {
451
+ hasContent = true;
452
+ if (currentBlock) {
453
+ pushBlockEndEvent(currentBlock, blockIndex(), output, stream);
454
+ currentBlock = null;
455
+ }
456
+
457
+ const providedId = part.functionCall.id;
458
+ const needsNewId =
459
+ !providedId || output.content.some(b => b.type === "toolCall" && b.id === providedId);
460
+ const toolCallId = needsNewId ? nextToolCallId(part.functionCall.name || "tool") : providedId;
461
+
462
+ const toolCall: ToolCall = {
463
+ type: "toolCall",
464
+ id: toolCallId,
465
+ name: part.functionCall.name || "",
466
+ arguments: part.functionCall.args as Record<string, unknown>,
467
+ ...(part.thoughtSignature && { thoughtSignature: part.thoughtSignature }),
468
+ };
469
+
470
+ output.content.push(toolCall);
471
+ ensureStarted();
472
+ pushToolCallEvents(toolCall, blockIndex(), output, stream);
473
+ }
474
+ }
475
+ }
476
+
477
+ if (candidate?.finishReason) {
478
+ output.stopReason = mapStopReasonString(candidate.finishReason);
479
+ if (output.content.some(b => b.type === "toolCall")) {
480
+ output.stopReason = "toolUse";
481
+ }
482
+ }
483
+
484
+ if (responseData.usageMetadata) {
485
+ // promptTokenCount includes cachedContentTokenCount, so subtract to get fresh input
486
+ const promptTokens = responseData.usageMetadata.promptTokenCount || 0;
487
+ const cacheReadTokens = responseData.usageMetadata.cachedContentTokenCount || 0;
488
+ const thinkingTokens = responseData.usageMetadata.thoughtsTokenCount || 0;
489
+ output.usage = {
490
+ input: promptTokens - cacheReadTokens,
491
+ output: (responseData.usageMetadata.candidatesTokenCount || 0) + thinkingTokens,
492
+ cacheRead: cacheReadTokens,
493
+ cacheWrite: 0,
494
+ totalTokens: responseData.usageMetadata.totalTokenCount || 0,
495
+ ...(thinkingTokens > 0 ? { reasoningTokens: thinkingTokens } : {}),
496
+ cost: {
497
+ input: 0,
498
+ output: 0,
499
+ cacheRead: 0,
500
+ cacheWrite: 0,
501
+ total: 0,
502
+ },
503
+ };
504
+ calculateCost(model, output.usage);
505
+ }
506
+ }
507
+
508
+ if (currentBlock) {
509
+ pushBlockEndEvent(currentBlock, blockIndex(), output, stream);
510
+ }
511
+
512
+ return hasContent;
513
+ };
514
+
515
+ let receivedContent = false;
516
+ let currentResponse = response;
517
+
518
+ for (let emptyAttempt = 0; emptyAttempt <= MAX_EMPTY_STREAM_RETRIES; emptyAttempt++) {
519
+ if (options?.signal?.aborted) {
520
+ throw new Error("Request was aborted");
521
+ }
522
+
523
+ if (emptyAttempt > 0) {
524
+ const backoffMs = EMPTY_STREAM_BASE_DELAY_MS * 2 ** (emptyAttempt - 1);
525
+ try {
526
+ await scheduler.wait(backoffMs, { signal: options?.signal });
527
+ } catch {
528
+ // Normalize AbortError to expected message for consistent error handling
529
+ throw new Error("Request was aborted");
530
+ }
531
+
532
+ if (!requestUrl) {
533
+ throw new Error("Missing request URL");
534
+ }
535
+
536
+ currentResponse = await (options?.fetch ?? fetch)(requestUrl, {
537
+ method: "POST",
538
+ headers: requestHeaders,
539
+ body: requestBodyJson,
540
+ signal: options?.signal,
541
+ });
542
+
543
+ if (!currentResponse.ok) {
544
+ const retryErrorText = await currentResponse.text();
545
+ throw withHttpStatus(
546
+ new Error(`Cloud Code Assist API error (${currentResponse.status}): ${retryErrorText}`),
547
+ currentResponse.status,
548
+ );
549
+ }
550
+ }
551
+
552
+ const streamed = await streamResponse(currentResponse);
553
+ if (streamed) {
554
+ receivedContent = true;
555
+ break;
556
+ }
557
+
558
+ if (emptyAttempt < MAX_EMPTY_STREAM_RETRIES) {
559
+ resetOutput();
560
+ }
561
+ }
562
+
563
+ if (!receivedContent) {
564
+ throw new Error("Cloud Code Assist API returned an empty response");
565
+ }
566
+
567
+ if (options?.signal?.aborted) {
568
+ throw new Error("Request was aborted");
569
+ }
570
+
571
+ if (output.stopReason === "aborted" || output.stopReason === "error") {
572
+ throw new Error(output.errorMessage ?? "An unknown error occurred");
573
+ }
574
+
575
+ output.duration = Date.now() - startTime;
576
+ if (firstTokenTime) output.ttft = firstTokenTime - startTime;
577
+ stream.push({ type: "done", reason: output.stopReason, message: output });
578
+ stream.end();
579
+ } catch (error) {
580
+ for (const block of output.content) {
581
+ if ("index" in block) {
582
+ delete (block as { index?: number }).index;
583
+ }
584
+ }
585
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
586
+ output.errorStatus = extractHttpStatusFromError(error);
587
+ output.errorMessage = await appendRawHttpRequestDumpFor400(
588
+ error instanceof Error ? error.message : JSON.stringify(error),
589
+ error,
590
+ rawRequestDump,
591
+ );
592
+ output.duration = Date.now() - startTime;
593
+ if (firstTokenTime) output.ttft = firstTokenTime - startTime;
594
+ stream.push({ type: "error", reason: output.stopReason, error: output });
595
+ stream.end();
596
+ }
597
+ })();
598
+
599
+ return stream;
600
+ };
601
+
602
+ const INT63_MASK = (1n << 63n) - 1n;
603
+ const ANTIGRAVITY_RANDOM_BOUND = 9_000_000_000_000_000_000n;
604
+
605
+ function formatSignedDecimalSessionId(value: bigint): string {
606
+ return `-${value.toString()}`;
607
+ }
608
+
609
+ function deriveSignedDecimalFromHash(text: string): string {
610
+ const digest = createHash("sha256").update(text).digest();
611
+ let value = 0n;
612
+ for (let index = 0; index < 8; index += 1) {
613
+ value = (value << 8n) | BigInt(digest[index] ?? 0);
614
+ }
615
+ return formatSignedDecimalSessionId(value & INT63_MASK);
616
+ }
617
+
618
+ function randomBoundedInt63(maxExclusive: bigint): bigint {
619
+ while (true) {
620
+ const bytes = randomBytes(8);
621
+ let value = 0n;
622
+ for (const byte of bytes) {
623
+ value = (value << 8n) | BigInt(byte);
624
+ }
625
+ value &= INT63_MASK;
626
+ if (value < maxExclusive) {
627
+ return value;
628
+ }
629
+ }
630
+ }
631
+
632
+ function randomSignedDecimalSessionId(): string {
633
+ return formatSignedDecimalSessionId(randomBoundedInt63(ANTIGRAVITY_RANDOM_BOUND));
634
+ }
635
+
636
+ function getFirstUserTextForAntigravitySession(context: Context): string | undefined {
637
+ for (const message of context.messages) {
638
+ if (message.role !== "user") {
639
+ continue;
640
+ }
641
+
642
+ if (typeof message.content === "string") {
643
+ return message.content;
644
+ }
645
+
646
+ if (Array.isArray(message.content)) {
647
+ const firstTextPart = message.content.find((item): item is TextContent => item.type === "text");
648
+ return firstTextPart?.text;
649
+ }
650
+
651
+ return undefined;
652
+ }
653
+
654
+ return undefined;
655
+ }
656
+
657
+ function deriveAntigravitySessionId(context: Context): string {
658
+ const text = getFirstUserTextForAntigravitySession(context);
659
+ if (text && text.trim().length > 0) {
660
+ return deriveSignedDecimalFromHash(text);
661
+ }
662
+
663
+ return randomSignedDecimalSessionId();
664
+ }
665
+
666
+ function normalizeAntigravityTools(
667
+ tools: CloudCodeAssistRequest["request"]["tools"],
668
+ ): CloudCodeAssistRequest["request"]["tools"] {
669
+ return tools?.map(tool => ({
670
+ ...tool,
671
+ functionDeclarations: tool.functionDeclarations.map(declaration => {
672
+ if ("parameters" in declaration) {
673
+ return declaration;
674
+ }
675
+
676
+ const { parametersJsonSchema, ...rest } = declaration;
677
+ return {
678
+ ...rest,
679
+ parameters: normalizeSchemaForCCA(parametersJsonSchema),
680
+ };
681
+ }),
682
+ }));
683
+ }
684
+
685
+ export function buildRequest(
686
+ model: Model<"google-gemini-cli">,
687
+ context: Context,
688
+ projectId: string,
689
+ options: GoogleGeminiCliOptions = {},
690
+ isAntigravity = false,
691
+ ): CloudCodeAssistRequest {
692
+ const systemPrompts = normalizeSystemPrompts(context.systemPrompt);
693
+ const contents = convertMessages(model, context);
694
+ const generationConfig: CloudCodeAssistRequest["request"]["generationConfig"] = {};
695
+ if (options.temperature !== undefined) {
696
+ generationConfig.temperature = options.temperature;
697
+ }
698
+ if (options.maxTokens !== undefined) {
699
+ generationConfig.maxOutputTokens = options.maxTokens;
700
+ }
701
+ if (options.topP !== undefined) {
702
+ generationConfig.topP = options.topP;
703
+ }
704
+ if (options.topK !== undefined) {
705
+ generationConfig.topK = options.topK;
706
+ }
707
+ if (options.minP !== undefined) {
708
+ generationConfig.minP = options.minP;
709
+ }
710
+ if (options.presencePenalty !== undefined) {
711
+ generationConfig.presencePenalty = options.presencePenalty;
712
+ }
713
+ if (options.repetitionPenalty !== undefined) {
714
+ generationConfig.repetitionPenalty = options.repetitionPenalty;
715
+ }
716
+
717
+ // Thinking config
718
+ if (options.thinking?.enabled && model.reasoning) {
719
+ generationConfig.thinkingConfig = {
720
+ includeThoughts: true,
721
+ };
722
+ // Gemini 3 models use thinkingLevel, older models use thinkingBudget
723
+ if (options.thinking.level !== undefined) {
724
+ // Cast to any since our GoogleThinkingLevel mirrors Google's ThinkingLevel enum values
725
+ generationConfig.thinkingConfig.thinkingLevel = options.thinking.level as any;
726
+ } else if (options.thinking.budgetTokens !== undefined) {
727
+ generationConfig.thinkingConfig.thinkingBudget = options.thinking.budgetTokens;
728
+ }
729
+ }
730
+
731
+ const request: CloudCodeAssistRequest["request"] = {
732
+ contents,
733
+ };
734
+
735
+ if (isAntigravity) {
736
+ request.sessionId = deriveAntigravitySessionId(context);
737
+ }
738
+
739
+ // System instruction must be object with parts, not plain string
740
+ if (systemPrompts.length > 0) {
741
+ request.systemInstruction = {
742
+ parts: systemPrompts.map(text => ({ text })),
743
+ };
744
+ }
745
+
746
+ if (Object.keys(generationConfig).length > 0) {
747
+ request.generationConfig = generationConfig;
748
+ }
749
+
750
+ if (context.tools && context.tools.length > 0) {
751
+ const convertedTools = convertTools(context.tools, model);
752
+ request.tools = isAntigravity ? normalizeAntigravityTools(convertedTools) : convertedTools;
753
+ if (options.toolChoice) {
754
+ const choice = options.toolChoice;
755
+ if (typeof choice === "string") {
756
+ request.toolConfig = {
757
+ functionCallingConfig: { mode: mapToolChoice(choice) },
758
+ };
759
+ } else {
760
+ request.toolConfig = {
761
+ functionCallingConfig: {
762
+ mode: "ANY",
763
+ allowedFunctionNames: [...choice.allowedFunctionNames],
764
+ },
765
+ };
766
+ }
767
+ }
768
+ }
769
+
770
+ if (isAntigravity && !isClaudeModel(model.id) && request.generationConfig?.maxOutputTokens !== undefined) {
771
+ delete request.generationConfig.maxOutputTokens;
772
+ if (Object.keys(request.generationConfig).length === 0) {
773
+ delete request.generationConfig;
774
+ }
775
+ }
776
+
777
+ if (isAntigravity && isClaudeModel(model.id)) {
778
+ request.toolConfig = {
779
+ functionCallingConfig: {
780
+ mode: "VALIDATED" as FunctionCallingConfigMode,
781
+ },
782
+ };
783
+ }
784
+
785
+ if (isAntigravity && shouldInjectAntigravitySystemInstruction(model.id)) {
786
+ const existingParts = request.systemInstruction?.parts ?? [];
787
+ request.systemInstruction = {
788
+ role: "user",
789
+ parts: [
790
+ { text: ANTIGRAVITY_SYSTEM_INSTRUCTION },
791
+ { text: `Please ignore following [ignore]${ANTIGRAVITY_SYSTEM_INSTRUCTION}[/ignore]` },
792
+ ...existingParts,
793
+ ],
794
+ };
795
+ }
796
+
797
+ return {
798
+ project: projectId,
799
+ model: model.id,
800
+ request,
801
+ ...(isAntigravity
802
+ ? {
803
+ requestType: "agent",
804
+ userAgent: "antigravity",
805
+ requestId: `agent-${randomUUID()}`,
806
+ }
807
+ : {}),
808
+ };
809
+ }