@gajae-code/ai 0.1.1

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 (349) hide show
  1. package/CHANGELOG.md +2644 -0
  2. package/README.md +1181 -0
  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 +17 -0
  14. package/dist/types/auth-gateway/types.d.ts +115 -0
  15. package/dist/types/auth-storage.d.ts +641 -0
  16. package/dist/types/cli.d.ts +2 -0
  17. package/dist/types/index.d.ts +49 -0
  18. package/dist/types/model-cache.d.ts +17 -0
  19. package/dist/types/model-manager.d.ts +62 -0
  20. package/dist/types/model-thinking.d.ts +71 -0
  21. package/dist/types/models.d.ts +12 -0
  22. package/dist/types/provider-details.d.ts +24 -0
  23. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  24. package/dist/types/provider-models/descriptors.d.ts +48 -0
  25. package/dist/types/provider-models/google.d.ts +20 -0
  26. package/dist/types/provider-models/index.d.ts +5 -0
  27. package/dist/types/provider-models/ollama.d.ts +7 -0
  28. package/dist/types/provider-models/openai-compat.d.ts +237 -0
  29. package/dist/types/provider-models/special.d.ts +16 -0
  30. package/dist/types/providers/amazon-bedrock.d.ts +36 -0
  31. package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
  32. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  33. package/dist/types/providers/anthropic.d.ts +188 -0
  34. package/dist/types/providers/aws-credentials.d.ts +43 -0
  35. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  36. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  37. package/dist/types/providers/azure-openai-responses.d.ts +15 -0
  38. package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
  39. package/dist/types/providers/cursor.d.ts +42 -0
  40. package/dist/types/providers/error-message.d.ts +27 -0
  41. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  42. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  43. package/dist/types/providers/google-auth.d.ts +24 -0
  44. package/dist/types/providers/google-gemini-cli.d.ts +72 -0
  45. package/dist/types/providers/google-gemini-headers.d.ts +18 -0
  46. package/dist/types/providers/google-shared.d.ts +163 -0
  47. package/dist/types/providers/google-types.d.ts +138 -0
  48. package/dist/types/providers/google-vertex.d.ts +7 -0
  49. package/dist/types/providers/google.d.ts +4 -0
  50. package/dist/types/providers/grammar.d.ts +1 -0
  51. package/dist/types/providers/kimi.d.ts +27 -0
  52. package/dist/types/providers/mock.d.ts +175 -0
  53. package/dist/types/providers/ollama.d.ts +6 -0
  54. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  55. package/dist/types/providers/openai-chat-server-schema.d.ts +814 -0
  56. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  57. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  58. package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
  59. package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
  60. package/dist/types/providers/openai-codex-responses.d.ts +67 -0
  61. package/dist/types/providers/openai-completions-compat.d.ts +25 -0
  62. package/dist/types/providers/openai-completions.d.ts +33 -0
  63. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  64. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  65. package/dist/types/providers/openai-responses-shared.d.ts +89 -0
  66. package/dist/types/providers/openai-responses.d.ts +32 -0
  67. package/dist/types/providers/pi-native-client.d.ts +13 -0
  68. package/dist/types/providers/pi-native-server.d.ts +68 -0
  69. package/dist/types/providers/register-builtins.d.ts +31 -0
  70. package/dist/types/providers/synthetic.d.ts +26 -0
  71. package/dist/types/providers/transform-messages.d.ts +12 -0
  72. package/dist/types/providers/vision-guard.d.ts +8 -0
  73. package/dist/types/rate-limit-utils.d.ts +19 -0
  74. package/dist/types/stream.d.ts +24 -0
  75. package/dist/types/types.d.ts +746 -0
  76. package/dist/types/usage/claude.d.ts +3 -0
  77. package/dist/types/usage/gemini.d.ts +2 -0
  78. package/dist/types/usage/github-copilot.d.ts +7 -0
  79. package/dist/types/usage/google-antigravity.d.ts +2 -0
  80. package/dist/types/usage/kimi.d.ts +2 -0
  81. package/dist/types/usage/minimax-code.d.ts +2 -0
  82. package/dist/types/usage/openai-codex.d.ts +3 -0
  83. package/dist/types/usage/shared.d.ts +1 -0
  84. package/dist/types/usage/zai.d.ts +2 -0
  85. package/dist/types/usage.d.ts +258 -0
  86. package/dist/types/utils/abort.d.ts +19 -0
  87. package/dist/types/utils/anthropic-auth.d.ts +31 -0
  88. package/dist/types/utils/discovery/antigravity.d.ts +61 -0
  89. package/dist/types/utils/discovery/codex.d.ts +38 -0
  90. package/dist/types/utils/discovery/cursor.d.ts +23 -0
  91. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  92. package/dist/types/utils/discovery/index.d.ts +4 -0
  93. package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
  94. package/dist/types/utils/event-stream.d.ts +28 -0
  95. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  96. package/dist/types/utils/foundry.d.ts +1 -0
  97. package/dist/types/utils/h2-fetch.d.ts +22 -0
  98. package/dist/types/utils/http-inspector.d.ts +31 -0
  99. package/dist/types/utils/idle-iterator.d.ts +67 -0
  100. package/dist/types/utils/json-parse.d.ts +10 -0
  101. package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
  102. package/dist/types/utils/oauth/anthropic.d.ts +22 -0
  103. package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
  104. package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
  105. package/dist/types/utils/oauth/callback-server.d.ts +57 -0
  106. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  107. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  108. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  109. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  110. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  111. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  112. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  113. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  114. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  115. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  116. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  117. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  118. package/dist/types/utils/oauth/index.d.ts +38 -0
  119. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  120. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  121. package/dist/types/utils/oauth/kimi.d.ts +21 -0
  122. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  123. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  124. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  125. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  126. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  127. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  128. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  129. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  130. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  131. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  132. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  133. package/dist/types/utils/oauth/perplexity.d.ts +9 -0
  134. package/dist/types/utils/oauth/pkce.d.ts +8 -0
  135. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  136. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  137. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  138. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  139. package/dist/types/utils/oauth/together.d.ts +1 -0
  140. package/dist/types/utils/oauth/types.d.ts +44 -0
  141. package/dist/types/utils/oauth/venice.d.ts +18 -0
  142. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  143. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  144. package/dist/types/utils/oauth/xiaomi.d.ts +19 -0
  145. package/dist/types/utils/oauth/zai.d.ts +18 -0
  146. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  147. package/dist/types/utils/overflow.d.ts +54 -0
  148. package/dist/types/utils/parse-bind.d.ts +23 -0
  149. package/dist/types/utils/provider-response.d.ts +3 -0
  150. package/dist/types/utils/retry-after.d.ts +3 -0
  151. package/dist/types/utils/retry.d.ts +26 -0
  152. package/dist/types/utils/schema/adapt.d.ts +24 -0
  153. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  154. package/dist/types/utils/schema/dereference.d.ts +11 -0
  155. package/dist/types/utils/schema/draft.d.ts +10 -0
  156. package/dist/types/utils/schema/equality.d.ts +4 -0
  157. package/dist/types/utils/schema/fields.d.ts +49 -0
  158. package/dist/types/utils/schema/index.d.ts +13 -0
  159. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  160. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  161. package/dist/types/utils/schema/normalize.d.ts +93 -0
  162. package/dist/types/utils/schema/spill.d.ts +8 -0
  163. package/dist/types/utils/schema/stamps.d.ts +25 -0
  164. package/dist/types/utils/schema/types.d.ts +4 -0
  165. package/dist/types/utils/schema/wire.d.ts +54 -0
  166. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  167. package/dist/types/utils/sse-debug.d.ts +10 -0
  168. package/dist/types/utils/tool-call-healing.d.ts +71 -0
  169. package/dist/types/utils/tool-choice.d.ts +50 -0
  170. package/dist/types/utils/validation.d.ts +17 -0
  171. package/dist/types/utils.d.ts +28 -0
  172. package/package.json +146 -0
  173. package/src/api-registry.ts +96 -0
  174. package/src/auth-broker/client.ts +358 -0
  175. package/src/auth-broker/index.ts +5 -0
  176. package/src/auth-broker/refresher.ts +127 -0
  177. package/src/auth-broker/remote-store.ts +623 -0
  178. package/src/auth-broker/server.ts +644 -0
  179. package/src/auth-broker/types.ts +127 -0
  180. package/src/auth-broker/wire-schemas.ts +200 -0
  181. package/src/auth-gateway/http.ts +194 -0
  182. package/src/auth-gateway/index.ts +3 -0
  183. package/src/auth-gateway/server.ts +717 -0
  184. package/src/auth-gateway/types.ts +134 -0
  185. package/src/auth-storage.ts +4104 -0
  186. package/src/cli.ts +262 -0
  187. package/src/index.ts +54 -0
  188. package/src/model-cache.ts +129 -0
  189. package/src/model-manager.ts +450 -0
  190. package/src/model-thinking.ts +691 -0
  191. package/src/models.json +73853 -0
  192. package/src/models.json.d.ts +9 -0
  193. package/src/models.ts +56 -0
  194. package/src/prompts/turn-aborted-guidance.md +4 -0
  195. package/src/provider-details.ts +90 -0
  196. package/src/provider-models/bundled-references.ts +38 -0
  197. package/src/provider-models/descriptors.ts +308 -0
  198. package/src/provider-models/google.ts +91 -0
  199. package/src/provider-models/index.ts +5 -0
  200. package/src/provider-models/ollama.ts +153 -0
  201. package/src/provider-models/openai-compat.ts +2275 -0
  202. package/src/provider-models/special.ts +67 -0
  203. package/src/providers/amazon-bedrock.ts +849 -0
  204. package/src/providers/anthropic-messages-server-schema.ts +229 -0
  205. package/src/providers/anthropic-messages-server.ts +677 -0
  206. package/src/providers/anthropic.ts +2696 -0
  207. package/src/providers/aws-credentials.ts +501 -0
  208. package/src/providers/aws-eventstream.ts +185 -0
  209. package/src/providers/aws-sigv4.ts +218 -0
  210. package/src/providers/azure-openai-responses.ts +337 -0
  211. package/src/providers/cursor/gen/agent_pb.ts +15274 -0
  212. package/src/providers/cursor/proto/agent.proto +3526 -0
  213. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  214. package/src/providers/cursor/proto/buf.yaml +17 -0
  215. package/src/providers/cursor.ts +2561 -0
  216. package/src/providers/error-message.ts +21 -0
  217. package/src/providers/github-copilot-headers.ts +140 -0
  218. package/src/providers/gitlab-duo.ts +372 -0
  219. package/src/providers/google-auth.ts +252 -0
  220. package/src/providers/google-gemini-cli.ts +795 -0
  221. package/src/providers/google-gemini-headers.ts +41 -0
  222. package/src/providers/google-shared.ts +902 -0
  223. package/src/providers/google-types.ts +167 -0
  224. package/src/providers/google-vertex.ts +88 -0
  225. package/src/providers/google.ts +41 -0
  226. package/src/providers/grammar.ts +70 -0
  227. package/src/providers/kimi.ts +52 -0
  228. package/src/providers/mock.ts +500 -0
  229. package/src/providers/ollama.ts +544 -0
  230. package/src/providers/openai-anthropic-shim.ts +138 -0
  231. package/src/providers/openai-chat-server-schema.ts +243 -0
  232. package/src/providers/openai-chat-server.ts +628 -0
  233. package/src/providers/openai-codex/constants.ts +43 -0
  234. package/src/providers/openai-codex/request-transformer.ts +161 -0
  235. package/src/providers/openai-codex/response-handler.ts +81 -0
  236. package/src/providers/openai-codex-responses.ts +2598 -0
  237. package/src/providers/openai-completions-compat.ts +279 -0
  238. package/src/providers/openai-completions.ts +1853 -0
  239. package/src/providers/openai-responses-server-schema.ts +290 -0
  240. package/src/providers/openai-responses-server.ts +1183 -0
  241. package/src/providers/openai-responses-shared.ts +800 -0
  242. package/src/providers/openai-responses.ts +621 -0
  243. package/src/providers/pi-native-client.ts +228 -0
  244. package/src/providers/pi-native-server.ts +210 -0
  245. package/src/providers/register-builtins.ts +412 -0
  246. package/src/providers/synthetic.ts +50 -0
  247. package/src/providers/transform-messages.ts +309 -0
  248. package/src/providers/vision-guard.ts +31 -0
  249. package/src/rate-limit-utils.ts +84 -0
  250. package/src/stream.ts +895 -0
  251. package/src/types.ts +884 -0
  252. package/src/usage/claude.ts +431 -0
  253. package/src/usage/gemini.ts +250 -0
  254. package/src/usage/github-copilot.ts +421 -0
  255. package/src/usage/google-antigravity.ts +201 -0
  256. package/src/usage/kimi.ts +271 -0
  257. package/src/usage/minimax-code.ts +31 -0
  258. package/src/usage/openai-codex.ts +503 -0
  259. package/src/usage/shared.ts +10 -0
  260. package/src/usage/zai.ts +247 -0
  261. package/src/usage.ts +183 -0
  262. package/src/utils/abort.ts +51 -0
  263. package/src/utils/anthropic-auth.ts +87 -0
  264. package/src/utils/discovery/antigravity.ts +261 -0
  265. package/src/utils/discovery/codex.ts +371 -0
  266. package/src/utils/discovery/cursor.ts +306 -0
  267. package/src/utils/discovery/gemini.ts +248 -0
  268. package/src/utils/discovery/index.ts +4 -0
  269. package/src/utils/discovery/openai-compatible.ts +224 -0
  270. package/src/utils/event-stream.ts +142 -0
  271. package/src/utils/fireworks-model-id.ts +30 -0
  272. package/src/utils/foundry.ts +8 -0
  273. package/src/utils/h2-fetch.ts +60 -0
  274. package/src/utils/http-inspector.ts +176 -0
  275. package/src/utils/idle-iterator.ts +250 -0
  276. package/src/utils/json-parse.ts +148 -0
  277. package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
  278. package/src/utils/oauth/anthropic.ts +200 -0
  279. package/src/utils/oauth/api-key-login.ts +87 -0
  280. package/src/utils/oauth/api-key-validation.ts +92 -0
  281. package/src/utils/oauth/callback-server.ts +276 -0
  282. package/src/utils/oauth/cerebras.ts +16 -0
  283. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  284. package/src/utils/oauth/cursor.ts +157 -0
  285. package/src/utils/oauth/deepseek.ts +53 -0
  286. package/src/utils/oauth/firepass.ts +24 -0
  287. package/src/utils/oauth/fireworks.ts +15 -0
  288. package/src/utils/oauth/github-copilot.ts +362 -0
  289. package/src/utils/oauth/gitlab-duo.ts +123 -0
  290. package/src/utils/oauth/google-antigravity.ts +200 -0
  291. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  292. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  293. package/src/utils/oauth/huggingface.ts +62 -0
  294. package/src/utils/oauth/index.ts +444 -0
  295. package/src/utils/oauth/kagi.ts +47 -0
  296. package/src/utils/oauth/kilo.ts +87 -0
  297. package/src/utils/oauth/kimi.ts +254 -0
  298. package/src/utils/oauth/litellm.ts +47 -0
  299. package/src/utils/oauth/lm-studio.ts +38 -0
  300. package/src/utils/oauth/minimax-code.ts +78 -0
  301. package/src/utils/oauth/moonshot.ts +16 -0
  302. package/src/utils/oauth/nanogpt.ts +15 -0
  303. package/src/utils/oauth/nvidia.ts +70 -0
  304. package/src/utils/oauth/oauth.html +199 -0
  305. package/src/utils/oauth/ollama-cloud.ts +28 -0
  306. package/src/utils/oauth/ollama.ts +47 -0
  307. package/src/utils/oauth/openai-codex.ts +299 -0
  308. package/src/utils/oauth/opencode.ts +49 -0
  309. package/src/utils/oauth/parallel.ts +46 -0
  310. package/src/utils/oauth/perplexity.ts +206 -0
  311. package/src/utils/oauth/pkce.ts +18 -0
  312. package/src/utils/oauth/qianfan.ts +58 -0
  313. package/src/utils/oauth/qwen-portal.ts +60 -0
  314. package/src/utils/oauth/synthetic.ts +16 -0
  315. package/src/utils/oauth/tavily.ts +46 -0
  316. package/src/utils/oauth/together.ts +16 -0
  317. package/src/utils/oauth/types.ts +94 -0
  318. package/src/utils/oauth/venice.ts +59 -0
  319. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  320. package/src/utils/oauth/vllm.ts +40 -0
  321. package/src/utils/oauth/xiaomi.ts +137 -0
  322. package/src/utils/oauth/zai.ts +60 -0
  323. package/src/utils/oauth/zenmux.ts +15 -0
  324. package/src/utils/overflow.ts +137 -0
  325. package/src/utils/parse-bind.ts +54 -0
  326. package/src/utils/provider-response.ts +30 -0
  327. package/src/utils/retry-after.ts +110 -0
  328. package/src/utils/retry.ts +54 -0
  329. package/src/utils/schema/CONSTRAINTS.md +164 -0
  330. package/src/utils/schema/adapt.ts +36 -0
  331. package/src/utils/schema/compatibility.ts +435 -0
  332. package/src/utils/schema/dereference.ts +98 -0
  333. package/src/utils/schema/draft.ts +341 -0
  334. package/src/utils/schema/equality.ts +97 -0
  335. package/src/utils/schema/fields.ts +190 -0
  336. package/src/utils/schema/index.ts +13 -0
  337. package/src/utils/schema/json-schema-validator.ts +577 -0
  338. package/src/utils/schema/meta-validator.ts +167 -0
  339. package/src/utils/schema/normalize.ts +1588 -0
  340. package/src/utils/schema/spill.ts +43 -0
  341. package/src/utils/schema/stamps.ts +97 -0
  342. package/src/utils/schema/types.ts +11 -0
  343. package/src/utils/schema/wire.ts +213 -0
  344. package/src/utils/schema/zod-decontaminate.ts +331 -0
  345. package/src/utils/sse-debug.ts +289 -0
  346. package/src/utils/tool-call-healing.ts +271 -0
  347. package/src/utils/tool-choice.ts +99 -0
  348. package/src/utils/validation.ts +1019 -0
  349. package/src/utils.ts +166 -0
package/src/cli.ts ADDED
@@ -0,0 +1,262 @@
1
+ #!/usr/bin/env bun
2
+ import * as readline from "node:readline";
3
+ import { AuthStorage, SqliteAuthCredentialStore } from "./auth-storage";
4
+ import { getOAuthProviders } from "./utils/oauth";
5
+ import type { OAuthProvider } from "./utils/oauth/types";
6
+
7
+ const PROVIDERS = getOAuthProviders();
8
+
9
+ function prompt(rl: readline.Interface, question: string): Promise<string> {
10
+ const { promise, resolve, reject } = Promise.withResolvers<string>();
11
+ const input = process.stdin as NodeJS.ReadStream;
12
+ const supportsRawMode = input.isTTY && typeof input.setRawMode === "function";
13
+ const wasRaw = supportsRawMode ? input.isRaw : false;
14
+ let settled = false;
15
+
16
+ const cleanup = () => {
17
+ rl.off("SIGINT", onSigint);
18
+ if (supportsRawMode) {
19
+ input.off("keypress", onKeypress);
20
+ input.setRawMode?.(wasRaw);
21
+ }
22
+ };
23
+
24
+ const finish = (result: () => void) => {
25
+ if (settled) return;
26
+ settled = true;
27
+ cleanup();
28
+ result();
29
+ };
30
+
31
+ const cancel = () => {
32
+ finish(() => reject(new Error("Login cancelled")));
33
+ };
34
+
35
+ const onSigint = () => {
36
+ cancel();
37
+ };
38
+
39
+ const onKeypress = (_str: string, key: readline.Key) => {
40
+ if (key.name === "escape" || (key.ctrl && key.name === "c")) {
41
+ cancel();
42
+ rl.close();
43
+ }
44
+ };
45
+
46
+ if (supportsRawMode) {
47
+ readline.emitKeypressEvents(input, rl);
48
+ input.setRawMode(true);
49
+ input.on("keypress", onKeypress);
50
+ }
51
+
52
+ rl.once("SIGINT", onSigint);
53
+ rl.question(question, answer => {
54
+ finish(() => resolve(answer));
55
+ });
56
+ return promise;
57
+ }
58
+
59
+ async function login(provider: OAuthProvider): Promise<void> {
60
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
61
+ const promptFn = (msg: string) => prompt(rl, `${msg} `);
62
+ const store = await SqliteAuthCredentialStore.open();
63
+ const storage = new AuthStorage(store);
64
+ await storage.reload();
65
+
66
+ try {
67
+ await storage.login(provider, {
68
+ onAuth(info) {
69
+ const { url, instructions } = info;
70
+ console.log(`\nOpen this URL in your browser:\n${url}`);
71
+ if (instructions) console.log(instructions);
72
+ console.log();
73
+ },
74
+ onProgress(message) {
75
+ console.log(message);
76
+ },
77
+ onPrompt(p) {
78
+ return promptFn(`${p.message}${p.placeholder ? ` (${p.placeholder})` : ""}:`);
79
+ },
80
+ });
81
+ console.log(`\nCredentials saved to ~/.gjc/agent/agent.db`);
82
+ } finally {
83
+ store.close();
84
+ rl.close();
85
+ }
86
+ }
87
+
88
+ async function main(): Promise<void> {
89
+ const args = process.argv.slice(2);
90
+ const command = args[0];
91
+
92
+ if (!command || command === "help" || command === "--help" || command === "-h") {
93
+ console.log(`Usage: bunx @gajae-code/ai <command> [provider]
94
+
95
+ Commands:
96
+ login [provider] Login to a provider
97
+ logout [provider] Logout from a provider
98
+ status Show logged-in providers
99
+ list List available providers
100
+
101
+ Providers:
102
+ anthropic Anthropic
103
+ github-copilot GitHub Copilot
104
+ google-gemini-cli Google Gemini CLI
105
+ google-antigravity Antigravity (Gemini 3, Anthropic, GPT-OSS)
106
+ openai-codex OpenAI code provider (ChatGPT Plus/Pro)
107
+ kimi-code Kimi Code
108
+ kilo Kilo Gateway
109
+ kagi Kagi
110
+ tavily Tavily
111
+ zai Z.AI (GLM Coding Plan)
112
+ deepseek DeepSeek
113
+ nanogpt NanoGPT
114
+ minimax-code MiniMax Coding Plan (International)
115
+ minimax-code-cn MiniMax Coding Plan (China)
116
+ cursor Cursor (Anthropic, GPT, etc.)
117
+ zenmux ZenMux
118
+ ollama-cloud Ollama Cloud
119
+
120
+ Examples:
121
+ bunx @gajae-code/ai login # interactive provider selection
122
+ bunx @gajae-code/ai login anthropic # login to specific provider
123
+ bunx @gajae-code/ai logout anthropic # logout from specific provider
124
+ bunx @gajae-code/ai status # show logged-in providers
125
+ bunx @gajae-code/ai list # list providers
126
+ `);
127
+ return;
128
+ }
129
+
130
+ if (command === "status") {
131
+ const storage = await SqliteAuthCredentialStore.open();
132
+ try {
133
+ const providers = storage.listProviders();
134
+ if (providers.length === 0) {
135
+ console.log("No credentials stored.");
136
+ console.log(`Use 'bunx @gajae-code/ai login' to authenticate.`);
137
+ } else {
138
+ console.log("Logged-in providers:\n");
139
+ for (const provider of providers) {
140
+ const oauth = storage.getOAuth(provider);
141
+ if (oauth) {
142
+ const expires = new Date(oauth.expires);
143
+ const expired = Date.now() >= oauth.expires;
144
+ const status = expired ? "(expired)" : `(expires ${expires.toLocaleString()})`;
145
+ console.log(` ${provider.padEnd(20)} ${status}`);
146
+ continue;
147
+ }
148
+ const apiKey = storage.getApiKey(provider);
149
+ if (apiKey) {
150
+ console.log(` ${provider.padEnd(20)} (api key)`);
151
+ }
152
+ }
153
+ }
154
+ } finally {
155
+ storage.close();
156
+ }
157
+ return;
158
+ }
159
+
160
+ if (command === "list") {
161
+ console.log("Available providers:\n");
162
+ for (const p of PROVIDERS) {
163
+ console.log(` ${p.id.padEnd(20)} ${p.name}`);
164
+ }
165
+ return;
166
+ }
167
+
168
+ if (command === "logout") {
169
+ let provider = args[1] as OAuthProvider | undefined;
170
+ const storage = await SqliteAuthCredentialStore.open();
171
+
172
+ try {
173
+ if (!provider) {
174
+ const providers = storage.listProviders();
175
+ if (providers.length === 0) {
176
+ console.log("No credentials stored.");
177
+ return;
178
+ }
179
+
180
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
181
+ console.log("Select a provider to logout:\n");
182
+ for (let i = 0; i < providers.length; i++) {
183
+ console.log(` ${i + 1}. ${providers[i]}`);
184
+ }
185
+ console.log();
186
+
187
+ const choice = await prompt(rl, `Enter number (1-${providers.length}): `);
188
+ rl.close();
189
+
190
+ const index = parseInt(choice, 10) - 1;
191
+ if (index < 0 || index >= providers.length) {
192
+ console.error("Invalid selection");
193
+ process.exit(1);
194
+ }
195
+ provider = providers[index] as OAuthProvider;
196
+ }
197
+ if (!provider) {
198
+ console.error("No provider selected");
199
+ process.exit(1);
200
+ }
201
+
202
+ const oauth = storage.getOAuth(provider);
203
+ const apiKey = storage.getApiKey(provider);
204
+ if (!oauth && !apiKey) {
205
+ console.error(`Not logged in to ${provider}`);
206
+ process.exit(1);
207
+ }
208
+
209
+ storage.deleteProvider(provider);
210
+ console.log(`Logged out from ${provider}`);
211
+ } finally {
212
+ storage.close();
213
+ }
214
+ return;
215
+ }
216
+
217
+ if (command === "login") {
218
+ let provider = args[1] as OAuthProvider | undefined;
219
+
220
+ if (!provider) {
221
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
222
+ console.log("Select a provider:\n");
223
+ for (let i = 0; i < PROVIDERS.length; i++) {
224
+ console.log(` ${i + 1}. ${PROVIDERS[i].name}`);
225
+ }
226
+ console.log();
227
+
228
+ const choice = await prompt(rl, `Enter number (1-${PROVIDERS.length}): `);
229
+ rl.close();
230
+
231
+ const index = parseInt(choice, 10) - 1;
232
+ if (index < 0 || index >= PROVIDERS.length) {
233
+ console.error("Invalid selection");
234
+ process.exit(1);
235
+ }
236
+ provider = PROVIDERS[index].id as OAuthProvider;
237
+ }
238
+ if (!provider) {
239
+ console.error("No provider selected");
240
+ process.exit(1);
241
+ }
242
+
243
+ if (!PROVIDERS.some(p => p.id === provider)) {
244
+ console.error(`Unknown provider: ${provider}`);
245
+ console.error(`Use 'bunx @gajae-code/ai list' to see available providers`);
246
+ process.exit(1);
247
+ }
248
+
249
+ console.log(`Logging in to ${provider}…`);
250
+ await login(provider);
251
+ return;
252
+ }
253
+
254
+ console.error(`Unknown command: ${command}`);
255
+ console.error(`Use 'bunx @gajae-code/ai --help' for usage`);
256
+ process.exit(1);
257
+ }
258
+
259
+ main().catch(err => {
260
+ console.error("Error:", err.message);
261
+ process.exit(1);
262
+ });
package/src/index.ts ADDED
@@ -0,0 +1,54 @@
1
+ export { type ZodType, z } from "zod/v4";
2
+ export * from "./api-registry";
3
+ export * from "./auth-broker";
4
+ export { type AuthGatewayBootOptions, type ModelResolver, startAuthGateway } from "./auth-gateway/server";
5
+ export * from "./auth-gateway/types";
6
+ export * from "./auth-storage";
7
+ export * from "./model-cache";
8
+ export * from "./model-manager";
9
+ export * from "./model-thinking";
10
+ export * from "./models";
11
+ export * from "./provider-details";
12
+ export * from "./provider-models";
13
+ export * from "./providers/anthropic";
14
+ export * from "./providers/azure-openai-responses";
15
+ export type * from "./providers/cursor";
16
+ export * from "./providers/gitlab-duo";
17
+ export type * from "./providers/google";
18
+ export type * from "./providers/google-gemini-cli";
19
+ export * from "./providers/google-gemini-headers";
20
+ export type * from "./providers/google-vertex";
21
+ export * from "./providers/kimi";
22
+ export * from "./providers/mock";
23
+ export * from "./providers/ollama";
24
+ export * from "./providers/openai-codex-responses";
25
+ export * from "./providers/openai-completions";
26
+ export * from "./providers/openai-responses";
27
+ export * from "./providers/synthetic";
28
+ export * from "./rate-limit-utils";
29
+ export * from "./stream";
30
+ export * from "./types";
31
+ export * from "./usage";
32
+ export * from "./usage/claude";
33
+ export * from "./usage/gemini";
34
+ export * from "./usage/github-copilot";
35
+ export * from "./usage/google-antigravity";
36
+ export * from "./usage/kimi";
37
+ export * from "./usage/minimax-code";
38
+ export * from "./usage/openai-codex";
39
+ export * from "./usage/zai";
40
+ export * from "./utils/anthropic-auth";
41
+ export * from "./utils/discovery";
42
+ export * from "./utils/event-stream";
43
+ export * from "./utils/h2-fetch";
44
+ export * from "./utils/oauth";
45
+ export type {
46
+ OAuthCredentials,
47
+ OAuthProvider,
48
+ OAuthProviderId,
49
+ OAuthProviderInfo,
50
+ } from "./utils/oauth/types";
51
+ export * from "./utils/overflow";
52
+ export * from "./utils/retry";
53
+ export * from "./utils/schema";
54
+ export * from "./utils/validation";
@@ -0,0 +1,129 @@
1
+ /**
2
+ * SQLite-backed model cache for atomic cross-process access.
3
+ * Replaces per-provider JSON files with a single cache.db.
4
+ */
5
+ import { Database } from "bun:sqlite";
6
+ import { getModelDbPath } from "@gajae-code/utils";
7
+ import type { Api, Model } from "./types";
8
+
9
+ const CACHE_SCHEMA_VERSION = 3;
10
+
11
+ interface CacheRow {
12
+ provider_id: string;
13
+ version: number;
14
+ updated_at: number;
15
+ authoritative: number;
16
+ static_fingerprint: string;
17
+ models: string;
18
+ }
19
+
20
+ interface TableInfoRow {
21
+ name: string;
22
+ }
23
+
24
+ interface CacheEntry<TApi extends Api = Api> {
25
+ models: Model<TApi>[];
26
+ fresh: boolean;
27
+ authoritative: boolean;
28
+ updatedAt: number;
29
+ /**
30
+ * Hash of the static catalog slice that was merged into `models` when this
31
+ * row was written. `resolveProviderModels` compares against the current
32
+ * static fingerprint and bypasses the static+cache re-merge when they
33
+ * match — the cache already incorporates the same static state.
34
+ */
35
+ staticFingerprint: string;
36
+ }
37
+
38
+ let sharedDb: Database | null = null;
39
+ let sharedDbPath: string | null = null;
40
+
41
+ function getDb(dbPath?: string): Database {
42
+ const resolvedPath = dbPath ?? getModelDbPath();
43
+ if (sharedDb && sharedDbPath === resolvedPath) {
44
+ return sharedDb;
45
+ }
46
+ if (sharedDb) {
47
+ sharedDb.close();
48
+ }
49
+ const db = new Database(resolvedPath, { create: true });
50
+ db.run("PRAGMA journal_mode = WAL");
51
+ db.run("PRAGMA busy_timeout = 3000");
52
+ db.run(`
53
+ CREATE TABLE IF NOT EXISTS model_cache (
54
+ provider_id TEXT PRIMARY KEY,
55
+ version INTEGER NOT NULL,
56
+ updated_at INTEGER NOT NULL,
57
+ authoritative INTEGER NOT NULL DEFAULT 0,
58
+ static_fingerprint TEXT NOT NULL DEFAULT '',
59
+ models TEXT NOT NULL
60
+ )
61
+ `);
62
+ migrateCacheSchema(db);
63
+
64
+ sharedDb = db;
65
+ sharedDbPath = resolvedPath;
66
+ return db;
67
+ }
68
+
69
+ function migrateCacheSchema(db: Database): void {
70
+ const columns = db.prepare("PRAGMA table_info(model_cache)").all() as TableInfoRow[];
71
+ if (!columns.some(column => column.name === "static_fingerprint")) {
72
+ db.run("ALTER TABLE model_cache ADD COLUMN static_fingerprint TEXT NOT NULL DEFAULT ''");
73
+ }
74
+ db.run("UPDATE model_cache SET version = ? WHERE version = 2", [CACHE_SCHEMA_VERSION]);
75
+ }
76
+
77
+ export function readModelCache<TApi extends Api>(
78
+ providerId: string,
79
+ ttlMs: number,
80
+ now: () => number,
81
+ dbPath?: string,
82
+ ): CacheEntry<TApi> | null {
83
+ try {
84
+ const db = getDb(dbPath);
85
+ const row = db.query<CacheRow, [string]>("SELECT * FROM model_cache WHERE provider_id = ?").get(providerId);
86
+ if (!row || row.version !== CACHE_SCHEMA_VERSION) {
87
+ return null;
88
+ }
89
+ const models = JSON.parse(row.models) as Model<TApi>[];
90
+ const ageMs = now() - row.updated_at;
91
+ const fresh = Number.isFinite(ageMs) && ageMs >= 0 && ageMs <= ttlMs;
92
+ return {
93
+ models,
94
+ fresh,
95
+ authoritative: row.authoritative === 1,
96
+ updatedAt: row.updated_at,
97
+ staticFingerprint: row.static_fingerprint ?? "",
98
+ };
99
+ } catch {
100
+ return null;
101
+ }
102
+ }
103
+
104
+ export function writeModelCache<TApi extends Api>(
105
+ providerId: string,
106
+ updatedAt: number,
107
+ models: Model<TApi>[],
108
+ authoritative: boolean,
109
+ staticFingerprint: string,
110
+ dbPath?: string,
111
+ ): void {
112
+ try {
113
+ const db = getDb(dbPath);
114
+ db.run(
115
+ `INSERT OR REPLACE INTO model_cache (provider_id, version, updated_at, authoritative, static_fingerprint, models)
116
+ VALUES (?, ?, ?, ?, ?, ?)`,
117
+ [
118
+ providerId,
119
+ CACHE_SCHEMA_VERSION,
120
+ updatedAt,
121
+ authoritative ? 1 : 0,
122
+ staticFingerprint,
123
+ JSON.stringify(models),
124
+ ],
125
+ );
126
+ } catch {
127
+ // Cache writes are best-effort; failures should not break model resolution.
128
+ }
129
+ }