@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.
- package/CHANGELOG.md +2644 -0
- package/README.md +1181 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +66 -0
- package/dist/types/auth-broker/index.d.ts +5 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +96 -0
- package/dist/types/auth-broker/server.d.ts +32 -0
- package/dist/types/auth-broker/types.d.ts +105 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +412 -0
- package/dist/types/auth-gateway/http.d.ts +39 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +17 -0
- package/dist/types/auth-gateway/types.d.ts +115 -0
- package/dist/types/auth-storage.d.ts +641 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/model-cache.d.ts +17 -0
- package/dist/types/model-manager.d.ts +62 -0
- package/dist/types/model-thinking.d.ts +71 -0
- package/dist/types/models.d.ts +12 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/provider-models/bundled-references.d.ts +4 -0
- package/dist/types/provider-models/descriptors.d.ts +48 -0
- package/dist/types/provider-models/google.d.ts +20 -0
- package/dist/types/provider-models/index.d.ts +5 -0
- package/dist/types/provider-models/ollama.d.ts +7 -0
- package/dist/types/provider-models/openai-compat.d.ts +237 -0
- package/dist/types/provider-models/special.d.ts +16 -0
- package/dist/types/providers/amazon-bedrock.d.ts +36 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic.d.ts +188 -0
- package/dist/types/providers/aws-credentials.d.ts +43 -0
- package/dist/types/providers/aws-eventstream.d.ts +38 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +15 -0
- package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
- package/dist/types/providers/cursor.d.ts +42 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +24 -0
- package/dist/types/providers/google-gemini-cli.d.ts +72 -0
- package/dist/types/providers/google-gemini-headers.d.ts +18 -0
- package/dist/types/providers/google-shared.d.ts +163 -0
- package/dist/types/providers/google-types.d.ts +138 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +175 -0
- package/dist/types/providers/ollama.d.ts +6 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +814 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-codex/constants.d.ts +26 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
- package/dist/types/providers/openai-codex-responses.d.ts +67 -0
- package/dist/types/providers/openai-completions-compat.d.ts +25 -0
- package/dist/types/providers/openai-completions.d.ts +33 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-shared.d.ts +89 -0
- package/dist/types/providers/openai-responses.d.ts +32 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +68 -0
- package/dist/types/providers/register-builtins.d.ts +31 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +12 -0
- package/dist/types/providers/vision-guard.d.ts +8 -0
- package/dist/types/rate-limit-utils.d.ts +19 -0
- package/dist/types/stream.d.ts +24 -0
- package/dist/types/types.d.ts +746 -0
- package/dist/types/usage/claude.d.ts +3 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +2 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +258 -0
- package/dist/types/utils/abort.d.ts +19 -0
- package/dist/types/utils/anthropic-auth.d.ts +31 -0
- package/dist/types/utils/discovery/antigravity.d.ts +61 -0
- package/dist/types/utils/discovery/codex.d.ts +38 -0
- package/dist/types/utils/discovery/cursor.d.ts +23 -0
- package/dist/types/utils/discovery/gemini.d.ts +25 -0
- package/dist/types/utils/discovery/index.d.ts +4 -0
- package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
- package/dist/types/utils/event-stream.d.ts +28 -0
- package/dist/types/utils/fireworks-model-id.d.ts +10 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/h2-fetch.d.ts +22 -0
- package/dist/types/utils/http-inspector.d.ts +31 -0
- package/dist/types/utils/idle-iterator.d.ts +67 -0
- package/dist/types/utils/json-parse.d.ts +10 -0
- package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
- package/dist/types/utils/oauth/anthropic.d.ts +22 -0
- package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
- package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
- package/dist/types/utils/oauth/callback-server.d.ts +57 -0
- package/dist/types/utils/oauth/cerebras.d.ts +1 -0
- package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/cursor.d.ts +15 -0
- package/dist/types/utils/oauth/deepseek.d.ts +10 -0
- package/dist/types/utils/oauth/firepass.d.ts +1 -0
- package/dist/types/utils/oauth/fireworks.d.ts +1 -0
- package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
- package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
- package/dist/types/utils/oauth/huggingface.d.ts +19 -0
- package/dist/types/utils/oauth/index.d.ts +38 -0
- package/dist/types/utils/oauth/kagi.d.ts +17 -0
- package/dist/types/utils/oauth/kilo.d.ts +5 -0
- package/dist/types/utils/oauth/kimi.d.ts +21 -0
- package/dist/types/utils/oauth/litellm.d.ts +18 -0
- package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
- package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
- package/dist/types/utils/oauth/moonshot.d.ts +1 -0
- package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
- package/dist/types/utils/oauth/nvidia.d.ts +18 -0
- package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
- package/dist/types/utils/oauth/ollama.d.ts +18 -0
- package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
- package/dist/types/utils/oauth/opencode.d.ts +18 -0
- package/dist/types/utils/oauth/parallel.d.ts +17 -0
- package/dist/types/utils/oauth/perplexity.d.ts +9 -0
- package/dist/types/utils/oauth/pkce.d.ts +8 -0
- package/dist/types/utils/oauth/qianfan.d.ts +17 -0
- package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
- package/dist/types/utils/oauth/synthetic.d.ts +1 -0
- package/dist/types/utils/oauth/tavily.d.ts +17 -0
- package/dist/types/utils/oauth/together.d.ts +1 -0
- package/dist/types/utils/oauth/types.d.ts +44 -0
- package/dist/types/utils/oauth/venice.d.ts +18 -0
- package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/vllm.d.ts +16 -0
- package/dist/types/utils/oauth/xiaomi.d.ts +19 -0
- package/dist/types/utils/oauth/zai.d.ts +18 -0
- package/dist/types/utils/oauth/zenmux.d.ts +1 -0
- package/dist/types/utils/overflow.d.ts +54 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/retry-after.d.ts +3 -0
- package/dist/types/utils/retry.d.ts +26 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +49 -0
- package/dist/types/utils/schema/index.d.ts +13 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +93 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +25 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/wire.d.ts +54 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sse-debug.d.ts +10 -0
- package/dist/types/utils/tool-call-healing.d.ts +71 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +17 -0
- package/dist/types/utils.d.ts +28 -0
- package/package.json +146 -0
- package/src/api-registry.ts +96 -0
- package/src/auth-broker/client.ts +358 -0
- package/src/auth-broker/index.ts +5 -0
- package/src/auth-broker/refresher.ts +127 -0
- package/src/auth-broker/remote-store.ts +623 -0
- package/src/auth-broker/server.ts +644 -0
- package/src/auth-broker/types.ts +127 -0
- package/src/auth-broker/wire-schemas.ts +200 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +717 -0
- package/src/auth-gateway/types.ts +134 -0
- package/src/auth-storage.ts +4104 -0
- package/src/cli.ts +262 -0
- package/src/index.ts +54 -0
- package/src/model-cache.ts +129 -0
- package/src/model-manager.ts +450 -0
- package/src/model-thinking.ts +691 -0
- package/src/models.json +73853 -0
- package/src/models.json.d.ts +9 -0
- package/src/models.ts +56 -0
- package/src/prompts/turn-aborted-guidance.md +4 -0
- package/src/provider-details.ts +90 -0
- package/src/provider-models/bundled-references.ts +38 -0
- package/src/provider-models/descriptors.ts +308 -0
- package/src/provider-models/google.ts +91 -0
- package/src/provider-models/index.ts +5 -0
- package/src/provider-models/ollama.ts +153 -0
- package/src/provider-models/openai-compat.ts +2275 -0
- package/src/provider-models/special.ts +67 -0
- package/src/providers/amazon-bedrock.ts +849 -0
- package/src/providers/anthropic-messages-server-schema.ts +229 -0
- package/src/providers/anthropic-messages-server.ts +677 -0
- package/src/providers/anthropic.ts +2696 -0
- package/src/providers/aws-credentials.ts +501 -0
- package/src/providers/aws-eventstream.ts +185 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +337 -0
- package/src/providers/cursor/gen/agent_pb.ts +15274 -0
- package/src/providers/cursor/proto/agent.proto +3526 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor.ts +2561 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.ts +140 -0
- package/src/providers/gitlab-duo.ts +372 -0
- package/src/providers/google-auth.ts +252 -0
- package/src/providers/google-gemini-cli.ts +795 -0
- package/src/providers/google-gemini-headers.ts +41 -0
- package/src/providers/google-shared.ts +902 -0
- package/src/providers/google-types.ts +167 -0
- package/src/providers/google-vertex.ts +88 -0
- package/src/providers/google.ts +41 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +500 -0
- package/src/providers/ollama.ts +544 -0
- package/src/providers/openai-anthropic-shim.ts +138 -0
- package/src/providers/openai-chat-server-schema.ts +243 -0
- package/src/providers/openai-chat-server.ts +628 -0
- package/src/providers/openai-codex/constants.ts +43 -0
- package/src/providers/openai-codex/request-transformer.ts +161 -0
- package/src/providers/openai-codex/response-handler.ts +81 -0
- package/src/providers/openai-codex-responses.ts +2598 -0
- package/src/providers/openai-completions-compat.ts +279 -0
- package/src/providers/openai-completions.ts +1853 -0
- package/src/providers/openai-responses-server-schema.ts +290 -0
- package/src/providers/openai-responses-server.ts +1183 -0
- package/src/providers/openai-responses-shared.ts +800 -0
- package/src/providers/openai-responses.ts +621 -0
- package/src/providers/pi-native-client.ts +228 -0
- package/src/providers/pi-native-server.ts +210 -0
- package/src/providers/register-builtins.ts +412 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +309 -0
- package/src/providers/vision-guard.ts +31 -0
- package/src/rate-limit-utils.ts +84 -0
- package/src/stream.ts +895 -0
- package/src/types.ts +884 -0
- package/src/usage/claude.ts +431 -0
- package/src/usage/gemini.ts +250 -0
- package/src/usage/github-copilot.ts +421 -0
- package/src/usage/google-antigravity.ts +201 -0
- package/src/usage/kimi.ts +271 -0
- package/src/usage/minimax-code.ts +31 -0
- package/src/usage/openai-codex.ts +503 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +247 -0
- package/src/usage.ts +183 -0
- package/src/utils/abort.ts +51 -0
- package/src/utils/anthropic-auth.ts +87 -0
- package/src/utils/discovery/antigravity.ts +261 -0
- package/src/utils/discovery/codex.ts +371 -0
- package/src/utils/discovery/cursor.ts +306 -0
- package/src/utils/discovery/gemini.ts +248 -0
- package/src/utils/discovery/index.ts +4 -0
- package/src/utils/discovery/openai-compatible.ts +224 -0
- package/src/utils/event-stream.ts +142 -0
- package/src/utils/fireworks-model-id.ts +30 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/h2-fetch.ts +60 -0
- package/src/utils/http-inspector.ts +176 -0
- package/src/utils/idle-iterator.ts +250 -0
- package/src/utils/json-parse.ts +148 -0
- package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
- package/src/utils/oauth/anthropic.ts +200 -0
- package/src/utils/oauth/api-key-login.ts +87 -0
- package/src/utils/oauth/api-key-validation.ts +92 -0
- package/src/utils/oauth/callback-server.ts +276 -0
- package/src/utils/oauth/cerebras.ts +16 -0
- package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
- package/src/utils/oauth/cursor.ts +157 -0
- package/src/utils/oauth/deepseek.ts +53 -0
- package/src/utils/oauth/firepass.ts +24 -0
- package/src/utils/oauth/fireworks.ts +15 -0
- package/src/utils/oauth/github-copilot.ts +362 -0
- package/src/utils/oauth/gitlab-duo.ts +123 -0
- package/src/utils/oauth/google-antigravity.ts +200 -0
- package/src/utils/oauth/google-gemini-cli.ts +256 -0
- package/src/utils/oauth/google-oauth-shared.ts +110 -0
- package/src/utils/oauth/huggingface.ts +62 -0
- package/src/utils/oauth/index.ts +444 -0
- package/src/utils/oauth/kagi.ts +47 -0
- package/src/utils/oauth/kilo.ts +87 -0
- package/src/utils/oauth/kimi.ts +254 -0
- package/src/utils/oauth/litellm.ts +47 -0
- package/src/utils/oauth/lm-studio.ts +38 -0
- package/src/utils/oauth/minimax-code.ts +78 -0
- package/src/utils/oauth/moonshot.ts +16 -0
- package/src/utils/oauth/nanogpt.ts +15 -0
- package/src/utils/oauth/nvidia.ts +70 -0
- package/src/utils/oauth/oauth.html +199 -0
- package/src/utils/oauth/ollama-cloud.ts +28 -0
- package/src/utils/oauth/ollama.ts +47 -0
- package/src/utils/oauth/openai-codex.ts +299 -0
- package/src/utils/oauth/opencode.ts +49 -0
- package/src/utils/oauth/parallel.ts +46 -0
- package/src/utils/oauth/perplexity.ts +206 -0
- package/src/utils/oauth/pkce.ts +18 -0
- package/src/utils/oauth/qianfan.ts +58 -0
- package/src/utils/oauth/qwen-portal.ts +60 -0
- package/src/utils/oauth/synthetic.ts +16 -0
- package/src/utils/oauth/tavily.ts +46 -0
- package/src/utils/oauth/together.ts +16 -0
- package/src/utils/oauth/types.ts +94 -0
- package/src/utils/oauth/venice.ts +59 -0
- package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
- package/src/utils/oauth/vllm.ts +40 -0
- package/src/utils/oauth/xiaomi.ts +137 -0
- package/src/utils/oauth/zai.ts +60 -0
- package/src/utils/oauth/zenmux.ts +15 -0
- package/src/utils/overflow.ts +137 -0
- package/src/utils/parse-bind.ts +54 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +54 -0
- package/src/utils/schema/CONSTRAINTS.md +164 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +190 -0
- package/src/utils/schema/index.ts +13 -0
- package/src/utils/schema/json-schema-validator.ts +577 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +1588 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +97 -0
- package/src/utils/schema/types.ts +11 -0
- package/src/utils/schema/wire.ts +213 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sse-debug.ts +289 -0
- package/src/utils/tool-call-healing.ts +271 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1019 -0
- 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
|
+
}
|