@benjamolina/opencode-antigravity-guard 1.0.0
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/LICENSE +21 -0
- package/README.md +773 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/src/antigravity/oauth.d.ts +31 -0
- package/dist/src/antigravity/oauth.d.ts.map +1 -0
- package/dist/src/antigravity/oauth.js +171 -0
- package/dist/src/antigravity/oauth.js.map +1 -0
- package/dist/src/constants.d.ts +139 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +220 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
- package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/cache.js +71 -0
- package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.js +234 -0
- package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.js +23 -0
- package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.js +122 -0
- package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/logging.d.ts +3 -0
- package/dist/src/hooks/auto-update-checker/logging.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/logging.js +9 -0
- package/dist/src/hooks/auto-update-checker/logging.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.js +1 -0
- package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
- package/dist/src/plugin/accounts.d.ts +180 -0
- package/dist/src/plugin/accounts.d.ts.map +1 -0
- package/dist/src/plugin/accounts.js +1045 -0
- package/dist/src/plugin/accounts.js.map +1 -0
- package/dist/src/plugin/api-key.d.ts +90 -0
- package/dist/src/plugin/api-key.d.ts.map +1 -0
- package/dist/src/plugin/api-key.js +544 -0
- package/dist/src/plugin/api-key.js.map +1 -0
- package/dist/src/plugin/auth.d.ts +21 -0
- package/dist/src/plugin/auth.d.ts.map +1 -0
- package/dist/src/plugin/auth.js +46 -0
- package/dist/src/plugin/auth.js.map +1 -0
- package/dist/src/plugin/cache/index.d.ts +5 -0
- package/dist/src/plugin/cache/index.d.ts.map +1 -0
- package/dist/src/plugin/cache/index.js +5 -0
- package/dist/src/plugin/cache/index.js.map +1 -0
- package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
- package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
- package/dist/src/plugin/cache/signature-cache.js +375 -0
- package/dist/src/plugin/cache/signature-cache.js.map +1 -0
- package/dist/src/plugin/cache.d.ts +44 -0
- package/dist/src/plugin/cache.d.ts.map +1 -0
- package/dist/src/plugin/cache.js +200 -0
- package/dist/src/plugin/cache.js.map +1 -0
- package/dist/src/plugin/cli.d.ts +31 -0
- package/dist/src/plugin/cli.d.ts.map +1 -0
- package/dist/src/plugin/cli.js +135 -0
- package/dist/src/plugin/cli.js.map +1 -0
- package/dist/src/plugin/config/index.d.ts +16 -0
- package/dist/src/plugin/config/index.d.ts.map +1 -0
- package/dist/src/plugin/config/index.js +16 -0
- package/dist/src/plugin/config/index.js.map +1 -0
- package/dist/src/plugin/config/loader.d.ts +36 -0
- package/dist/src/plugin/config/loader.d.ts.map +1 -0
- package/dist/src/plugin/config/loader.js +140 -0
- package/dist/src/plugin/config/loader.js.map +1 -0
- package/dist/src/plugin/config/models.d.ts +43 -0
- package/dist/src/plugin/config/models.d.ts.map +1 -0
- package/dist/src/plugin/config/models.js +176 -0
- package/dist/src/plugin/config/models.js.map +1 -0
- package/dist/src/plugin/config/schema.d.ts +177 -0
- package/dist/src/plugin/config/schema.d.ts.map +1 -0
- package/dist/src/plugin/config/schema.js +507 -0
- package/dist/src/plugin/config/schema.js.map +1 -0
- package/dist/src/plugin/config/updater.d.ts +55 -0
- package/dist/src/plugin/config/updater.d.ts.map +1 -0
- package/dist/src/plugin/config/updater.js +125 -0
- package/dist/src/plugin/config/updater.js.map +1 -0
- package/dist/src/plugin/core/streaming/index.d.ts +3 -0
- package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/index.js +3 -0
- package/dist/src/plugin/core/streaming/index.js.map +1 -0
- package/dist/src/plugin/core/streaming/transformer.d.ts +10 -0
- package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/transformer.js +271 -0
- package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
- package/dist/src/plugin/core/streaming/types.d.ts +27 -0
- package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/types.js +1 -0
- package/dist/src/plugin/core/streaming/types.js.map +1 -0
- package/dist/src/plugin/debug.d.ts +99 -0
- package/dist/src/plugin/debug.d.ts.map +1 -0
- package/dist/src/plugin/debug.js +400 -0
- package/dist/src/plugin/debug.js.map +1 -0
- package/dist/src/plugin/errors.d.ts +28 -0
- package/dist/src/plugin/errors.d.ts.map +1 -0
- package/dist/src/plugin/errors.js +42 -0
- package/dist/src/plugin/errors.js.map +1 -0
- package/dist/src/plugin/fingerprint.d.ts +70 -0
- package/dist/src/plugin/fingerprint.d.ts.map +1 -0
- package/dist/src/plugin/fingerprint.js +138 -0
- package/dist/src/plugin/fingerprint.js.map +1 -0
- package/dist/src/plugin/image-saver.d.ts +25 -0
- package/dist/src/plugin/image-saver.d.ts.map +1 -0
- package/dist/src/plugin/image-saver.js +86 -0
- package/dist/src/plugin/image-saver.js.map +1 -0
- package/dist/src/plugin/logger.d.ts +36 -0
- package/dist/src/plugin/logger.d.ts.map +1 -0
- package/dist/src/plugin/logger.js +71 -0
- package/dist/src/plugin/logger.js.map +1 -0
- package/dist/src/plugin/logging-utils.d.ts +23 -0
- package/dist/src/plugin/logging-utils.d.ts.map +1 -0
- package/dist/src/plugin/logging-utils.js +92 -0
- package/dist/src/plugin/logging-utils.js.map +1 -0
- package/dist/src/plugin/project.d.ts +33 -0
- package/dist/src/plugin/project.d.ts.map +1 -0
- package/dist/src/plugin/project.js +234 -0
- package/dist/src/plugin/project.js.map +1 -0
- package/dist/src/plugin/quota.d.ts +59 -0
- package/dist/src/plugin/quota.d.ts.map +1 -0
- package/dist/src/plugin/quota.js +295 -0
- package/dist/src/plugin/quota.js.map +1 -0
- package/dist/src/plugin/recovery/constants.d.ts +22 -0
- package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
- package/dist/src/plugin/recovery/constants.js +43 -0
- package/dist/src/plugin/recovery/constants.js.map +1 -0
- package/dist/src/plugin/recovery/index.d.ts +12 -0
- package/dist/src/plugin/recovery/index.d.ts.map +1 -0
- package/dist/src/plugin/recovery/index.js +12 -0
- package/dist/src/plugin/recovery/index.js.map +1 -0
- package/dist/src/plugin/recovery/storage.d.ts +24 -0
- package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
- package/dist/src/plugin/recovery/storage.js +354 -0
- package/dist/src/plugin/recovery/storage.js.map +1 -0
- package/dist/src/plugin/recovery/types.d.ts +116 -0
- package/dist/src/plugin/recovery/types.d.ts.map +1 -0
- package/dist/src/plugin/recovery/types.js +6 -0
- package/dist/src/plugin/recovery/types.js.map +1 -0
- package/dist/src/plugin/recovery.d.ts +61 -0
- package/dist/src/plugin/recovery.d.ts.map +1 -0
- package/dist/src/plugin/recovery.js +381 -0
- package/dist/src/plugin/recovery.js.map +1 -0
- package/dist/src/plugin/refresh-queue.d.ts +100 -0
- package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
- package/dist/src/plugin/refresh-queue.js +247 -0
- package/dist/src/plugin/refresh-queue.js.map +1 -0
- package/dist/src/plugin/request-helpers.d.ts +270 -0
- package/dist/src/plugin/request-helpers.d.ts.map +1 -0
- package/dist/src/plugin/request-helpers.js +2384 -0
- package/dist/src/plugin/request-helpers.js.map +1 -0
- package/dist/src/plugin/request.d.ts +116 -0
- package/dist/src/plugin/request.d.ts.map +1 -0
- package/dist/src/plugin/request.js +1626 -0
- package/dist/src/plugin/request.js.map +1 -0
- package/dist/src/plugin/rotation.d.ts +169 -0
- package/dist/src/plugin/rotation.d.ts.map +1 -0
- package/dist/src/plugin/rotation.js +328 -0
- package/dist/src/plugin/rotation.js.map +1 -0
- package/dist/src/plugin/search.d.ts +32 -0
- package/dist/src/plugin/search.d.ts.map +1 -0
- package/dist/src/plugin/search.js +195 -0
- package/dist/src/plugin/search.js.map +1 -0
- package/dist/src/plugin/server.d.ts +23 -0
- package/dist/src/plugin/server.d.ts.map +1 -0
- package/dist/src/plugin/server.js +324 -0
- package/dist/src/plugin/server.js.map +1 -0
- package/dist/src/plugin/storage.d.ts +137 -0
- package/dist/src/plugin/storage.d.ts.map +1 -0
- package/dist/src/plugin/storage.js +637 -0
- package/dist/src/plugin/storage.js.map +1 -0
- package/dist/src/plugin/stores/signature-store.d.ts +5 -0
- package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
- package/dist/src/plugin/stores/signature-store.js +25 -0
- package/dist/src/plugin/stores/signature-store.js.map +1 -0
- package/dist/src/plugin/thinking-recovery.d.ts +90 -0
- package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
- package/dist/src/plugin/thinking-recovery.js +316 -0
- package/dist/src/plugin/thinking-recovery.js.map +1 -0
- package/dist/src/plugin/token.d.ts +19 -0
- package/dist/src/plugin/token.d.ts.map +1 -0
- package/dist/src/plugin/token.js +128 -0
- package/dist/src/plugin/token.js.map +1 -0
- package/dist/src/plugin/transform/claude.d.ts +80 -0
- package/dist/src/plugin/transform/claude.d.ts.map +1 -0
- package/dist/src/plugin/transform/claude.js +265 -0
- package/dist/src/plugin/transform/claude.js.map +1 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +35 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.js +225 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
- package/dist/src/plugin/transform/gemini.d.ts +100 -0
- package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
- package/dist/src/plugin/transform/gemini.js +482 -0
- package/dist/src/plugin/transform/gemini.js.map +1 -0
- package/dist/src/plugin/transform/index.d.ts +15 -0
- package/dist/src/plugin/transform/index.d.ts.map +1 -0
- package/dist/src/plugin/transform/index.js +14 -0
- package/dist/src/plugin/transform/index.js.map +1 -0
- package/dist/src/plugin/transform/model-resolver.d.ts +96 -0
- package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
- package/dist/src/plugin/transform/model-resolver.js +444 -0
- package/dist/src/plugin/transform/model-resolver.js.map +1 -0
- package/dist/src/plugin/transform/types.d.ts +111 -0
- package/dist/src/plugin/transform/types.d.ts.map +1 -0
- package/dist/src/plugin/transform/types.js +1 -0
- package/dist/src/plugin/transform/types.js.map +1 -0
- package/dist/src/plugin/types.d.ts +105 -0
- package/dist/src/plugin/types.d.ts.map +1 -0
- package/dist/src/plugin/types.js +1 -0
- package/dist/src/plugin/types.js.map +1 -0
- package/dist/src/plugin/ui/ansi.d.ts +32 -0
- package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
- package/dist/src/plugin/ui/ansi.js +52 -0
- package/dist/src/plugin/ui/ansi.js.map +1 -0
- package/dist/src/plugin/ui/auth-menu.d.ts +33 -0
- package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
- package/dist/src/plugin/ui/auth-menu.js +110 -0
- package/dist/src/plugin/ui/auth-menu.js.map +1 -0
- package/dist/src/plugin/ui/confirm.d.ts +2 -0
- package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
- package/dist/src/plugin/ui/confirm.js +15 -0
- package/dist/src/plugin/ui/confirm.js.map +1 -0
- package/dist/src/plugin/ui/select.d.ts +23 -0
- package/dist/src/plugin/ui/select.d.ts.map +1 -0
- package/dist/src/plugin/ui/select.js +254 -0
- package/dist/src/plugin/ui/select.js.map +1 -0
- package/dist/src/plugin/version.d.ts +19 -0
- package/dist/src/plugin/version.d.ts.map +1 -0
- package/dist/src/plugin/version.js +80 -0
- package/dist/src/plugin/version.js.map +1 -0
- package/dist/src/plugin.d.ts +50 -0
- package/dist/src/plugin.d.ts.map +1 -0
- package/dist/src/plugin.js +3378 -0
- package/dist/src/plugin.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { extractVariantThinkingConfig } from "./request-helpers.js";
|
|
2
|
+
import { applyGeminiTransforms, isGemini3Model, mapAntigravityModelToPublicApi, resolveModelForHeaderStyle } from "./transform/index.js";
|
|
3
|
+
const rateLimitedUntilByKey = new Map();
|
|
4
|
+
let cursor = 0;
|
|
5
|
+
const GEMINI_MODELS_LIST_TIMEOUT_MS = 10000;
|
|
6
|
+
const GEMINI_MODELS_LIST_MAX_PAGES = 20;
|
|
7
|
+
export function resetAgySdkCredentialStateForTests() {
|
|
8
|
+
rateLimitedUntilByKey.clear();
|
|
9
|
+
cursor = 0;
|
|
10
|
+
}
|
|
11
|
+
async function requestBodyText(request) {
|
|
12
|
+
if (!request.body)
|
|
13
|
+
return undefined;
|
|
14
|
+
try {
|
|
15
|
+
return await request.clone().text();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function splitEnvList(value) {
|
|
22
|
+
if (!value)
|
|
23
|
+
return [];
|
|
24
|
+
return value
|
|
25
|
+
.split(",")
|
|
26
|
+
.map((part) => part.trim())
|
|
27
|
+
.filter(Boolean);
|
|
28
|
+
}
|
|
29
|
+
function dedupeCredentials(credentials) {
|
|
30
|
+
const seen = new Set();
|
|
31
|
+
const result = [];
|
|
32
|
+
for (const credential of credentials) {
|
|
33
|
+
if (seen.has(credential.apiKey))
|
|
34
|
+
continue;
|
|
35
|
+
seen.add(credential.apiKey);
|
|
36
|
+
result.push(credential);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
export function getAgySdkCredentials(config, auth) {
|
|
41
|
+
if (!config.agy_sdk.enabled)
|
|
42
|
+
return [];
|
|
43
|
+
const credentials = [];
|
|
44
|
+
if (auth?.key?.trim()) {
|
|
45
|
+
credentials.push({ label: "opencode api key", apiKey: auth.key.trim() });
|
|
46
|
+
}
|
|
47
|
+
for (const project of config.agy_sdk.cloud_projects) {
|
|
48
|
+
if (project.enabled === false)
|
|
49
|
+
continue;
|
|
50
|
+
credentials.push({
|
|
51
|
+
label: project.label?.trim() || project.project_id?.trim() || "cloud project",
|
|
52
|
+
apiKey: project.api_key.trim(),
|
|
53
|
+
projectId: project.project_id?.trim() || undefined,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const envKeys = splitEnvList(process.env.OPENCODE_ANTIGRAVITY_API_KEYS);
|
|
57
|
+
const envCandidates = [
|
|
58
|
+
process.env.GEMINI_API_KEY,
|
|
59
|
+
process.env.GOOGLE_API_KEY,
|
|
60
|
+
...envKeys,
|
|
61
|
+
]
|
|
62
|
+
.map((apiKey) => apiKey?.trim())
|
|
63
|
+
.filter((apiKey) => Boolean(apiKey));
|
|
64
|
+
for (const apiKey of envCandidates) {
|
|
65
|
+
credentials.push({ label: "environment", apiKey });
|
|
66
|
+
}
|
|
67
|
+
return dedupeCredentials(credentials);
|
|
68
|
+
}
|
|
69
|
+
export function selectAgySdkCredential(credentials) {
|
|
70
|
+
if (credentials.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
for (let attempts = 0; attempts < credentials.length; attempts += 1) {
|
|
74
|
+
const index = cursor % credentials.length;
|
|
75
|
+
cursor += 1;
|
|
76
|
+
const credential = credentials[index];
|
|
77
|
+
if (!credential)
|
|
78
|
+
continue;
|
|
79
|
+
const limitedUntil = rateLimitedUntilByKey.get(credential.apiKey) ?? 0;
|
|
80
|
+
if (limitedUntil <= now) {
|
|
81
|
+
return credential;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
export function markAgySdkCredentialRateLimited(credential, retryAfterMs) {
|
|
87
|
+
rateLimitedUntilByKey.set(credential.apiKey, Date.now() + Math.max(1000, retryAfterMs));
|
|
88
|
+
}
|
|
89
|
+
function retryAfterMsFromResponse(response, fallbackMs) {
|
|
90
|
+
const retryAfter = response.headers.get("retry-after");
|
|
91
|
+
if (!retryAfter)
|
|
92
|
+
return fallbackMs;
|
|
93
|
+
const parsed = Number.parseInt(retryAfter, 10);
|
|
94
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
95
|
+
return parsed * 1000;
|
|
96
|
+
}
|
|
97
|
+
return fallbackMs;
|
|
98
|
+
}
|
|
99
|
+
export function isApiKeyAuth(auth) {
|
|
100
|
+
if (!auth || typeof auth !== "object")
|
|
101
|
+
return false;
|
|
102
|
+
const candidate = auth;
|
|
103
|
+
return (candidate.type === "api" || candidate.type === "api_key") && typeof candidate.key === "string";
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Classifies a model as servable by the public Gemini API via the api-key path,
|
|
107
|
+
* either natively or via translation in `prepareAgySdkGeminiRequest`.
|
|
108
|
+
*
|
|
109
|
+
* Strips the optional `antigravity-` prefix and any tier suffix (-minimal/-low/
|
|
110
|
+
* -medium/-high), then checks:
|
|
111
|
+
* - Claude models: never servable on the public API → returns false.
|
|
112
|
+
* - Has an explicit translation (e.g. `gemini-3.1-pro` → `gemini-3.1-pro-preview`)
|
|
113
|
+
* via `mapAntigravityModelToPublicApi` → routable.
|
|
114
|
+
* - Stripped id is NOT in the Antigravity-only denylist → assumed public-API
|
|
115
|
+
* native (covers `antigravity-gemini-3.5-flash` → `gemini-3.5-flash`, which
|
|
116
|
+
* the public API serves bare).
|
|
117
|
+
*
|
|
118
|
+
* Shared by `isAgySdkSupportedRequest` (positive gate) and
|
|
119
|
+
* `isAntigravityOnlyGenerativeLanguageRequest` (negative gate / synthetic-404 trigger).
|
|
120
|
+
*/
|
|
121
|
+
function canRouteAsPublicGeminiApiModel(model) {
|
|
122
|
+
const m = model.toLowerCase();
|
|
123
|
+
if (m.includes("claude"))
|
|
124
|
+
return false;
|
|
125
|
+
const isAntigravityPrefixed = m.startsWith("antigravity-");
|
|
126
|
+
const stripped = m.replace(/^antigravity-/, "").replace(/-(minimal|low|medium|high)$/, "");
|
|
127
|
+
// Explicit translation (e.g. gemini-3.1-pro → gemini-3.1-pro-preview) → routable.
|
|
128
|
+
if (mapAntigravityModelToPublicApi(stripped))
|
|
129
|
+
return true;
|
|
130
|
+
// For `antigravity-` prefixed inputs without a known mapping, require the
|
|
131
|
+
// stripped id to look like a Gemini-family id. Unknown antigravity-* ids
|
|
132
|
+
// (typos, hypotheticals) fall through to `isAntigravityOnlyGenerativeLanguageRequest`
|
|
133
|
+
// which short-circuits with the synthetic OAuth re-auth guidance — better UX
|
|
134
|
+
// than raw-forwarding to the public Gemini API and surfacing Google's 404.
|
|
135
|
+
if (isAntigravityPrefixed) {
|
|
136
|
+
return /^gemini-/.test(stripped) && !ANTIGRAVITY_ONLY_BARE_GEMINI_IDS.has(stripped);
|
|
137
|
+
}
|
|
138
|
+
// Bare (non-prefixed) inputs not in the Antigravity-only denylist are
|
|
139
|
+
// assumed to be public-API natives (e.g. gemini-3.5-flash, gemini-2.5-pro).
|
|
140
|
+
return !ANTIGRAVITY_ONLY_BARE_GEMINI_IDS.has(stripped);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Returns true when the request can be routed to the public Gemini API
|
|
144
|
+
* (`generativelanguage.googleapis.com`) via the api-key path — either natively
|
|
145
|
+
* or via translation in `prepareAgySdkGeminiRequest`.
|
|
146
|
+
*
|
|
147
|
+
* Antigravity-only models with no public-API equivalent (Claude ids, unmapped
|
|
148
|
+
* antigravity- prefixed non-Gemini ids) are excluded: the caller should stay on
|
|
149
|
+
* the OAuth Antigravity path or short-circuit with a synthetic error.
|
|
150
|
+
*/
|
|
151
|
+
export function isAgySdkSupportedRequest(urlString) {
|
|
152
|
+
let url;
|
|
153
|
+
try {
|
|
154
|
+
url = new URL(urlString);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
if (url.hostname !== "generativelanguage.googleapis.com")
|
|
160
|
+
return false;
|
|
161
|
+
const model = extractGeminiModelFromUrl(url.toString());
|
|
162
|
+
if (!model || !model.toLowerCase().includes("gemini"))
|
|
163
|
+
return false;
|
|
164
|
+
return canRouteAsPublicGeminiApiModel(model);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Returns true when the URL targets `generativelanguage.googleapis.com` with an
|
|
168
|
+
* Antigravity-only model that CANNOT be served by the public Gemini API even
|
|
169
|
+
* with translation — Claude ids and unmapped antigravity- prefixed non-Gemini ids.
|
|
170
|
+
*
|
|
171
|
+
* Translatable Antigravity-only Gemini ids (e.g. `antigravity-gemini-3.1-pro`,
|
|
172
|
+
* bare `gemini-3.1-pro`) and Antigravity-prefixed public-API natives (e.g.
|
|
173
|
+
* `antigravity-gemini-3.5-flash` → `gemini-3.5-flash`) return false here —
|
|
174
|
+
* `prepareAgySdkGeminiRequest` rewrites them to the public-API equivalent.
|
|
175
|
+
*
|
|
176
|
+
* Use this in API-key-only auth paths to short-circuit with a helpful synthetic
|
|
177
|
+
* error (via `createAntigravityOnlyModelErrorResponse`) instead of forwarding to
|
|
178
|
+
* the public Gemini API where it would 404.
|
|
179
|
+
*/
|
|
180
|
+
export function isAntigravityOnlyGenerativeLanguageRequest(urlString) {
|
|
181
|
+
let url;
|
|
182
|
+
try {
|
|
183
|
+
url = new URL(urlString);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
if (url.hostname !== "generativelanguage.googleapis.com")
|
|
189
|
+
return false;
|
|
190
|
+
const model = extractGeminiModelFromUrl(url.toString());
|
|
191
|
+
if (!model)
|
|
192
|
+
return false;
|
|
193
|
+
return isLikelyAntigravityOnlyModel(model) && !canRouteAsPublicGeminiApiModel(model);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Extracts the requested model id from a `generativelanguage.googleapis.com`
|
|
197
|
+
* URL (e.g. `.../v1beta/models/gemini-3.1-pro:generateContent` -> `gemini-3.1-pro`).
|
|
198
|
+
* Returns `undefined` when the URL is malformed or doesn't match the model path.
|
|
199
|
+
*/
|
|
200
|
+
export function extractRequestedGeminiModel(urlString) {
|
|
201
|
+
return extractGeminiModelFromUrl(urlString);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Public Gemini API models commonly available on `generativelanguage.googleapis.com/v1beta`.
|
|
205
|
+
* Used to suggest alternatives when an Antigravity-only model is requested through
|
|
206
|
+
* the API-key path. Kept short and stable; the live registry has more, but these
|
|
207
|
+
* are the high-signal choices for the error hint.
|
|
208
|
+
*
|
|
209
|
+
* Source: GET https://generativelanguage.googleapis.com/v1beta/models (May 2026).
|
|
210
|
+
*/
|
|
211
|
+
const PUBLIC_GEMINI_API_MODEL_SUGGESTIONS = [
|
|
212
|
+
"gemini-2.5-pro",
|
|
213
|
+
"gemini-2.5-flash",
|
|
214
|
+
"gemini-3.1-pro-preview",
|
|
215
|
+
"gemini-3.1-flash-lite",
|
|
216
|
+
"gemini-3.5-flash",
|
|
217
|
+
];
|
|
218
|
+
/**
|
|
219
|
+
* Bare Gemini ids that the Antigravity Code Assist backend serves but the public
|
|
220
|
+
* Gemini API does NOT expose. Cross-checked against
|
|
221
|
+
* `GET https://generativelanguage.googleapis.com/v1beta/models` (May 2026).
|
|
222
|
+
*
|
|
223
|
+
* The public registry DOES include `-preview` / `-lite` / `-image` / `-tts` variants,
|
|
224
|
+
* and notably `gemini-3.5-flash` as a bare id, so this list stays explicit rather
|
|
225
|
+
* than pattern-based to avoid false positives.
|
|
226
|
+
*/
|
|
227
|
+
const ANTIGRAVITY_ONLY_BARE_GEMINI_IDS = new Set([
|
|
228
|
+
"gemini-3-pro",
|
|
229
|
+
"gemini-3-flash",
|
|
230
|
+
"gemini-3.1-pro",
|
|
231
|
+
"gemini-3.1-flash",
|
|
232
|
+
]);
|
|
233
|
+
/**
|
|
234
|
+
* Classifies models that the Antigravity Code Assist backend serves but the public
|
|
235
|
+
* Gemini API (v1beta on `generativelanguage.googleapis.com`) does not.
|
|
236
|
+
*
|
|
237
|
+
* Anything with the `antigravity-` prefix or any Claude model is OAuth-only by
|
|
238
|
+
* construction. For Gemini ids we use an explicit denylist (see
|
|
239
|
+
* `ANTIGRAVITY_ONLY_BARE_GEMINI_IDS`).
|
|
240
|
+
*/
|
|
241
|
+
export function isLikelyAntigravityOnlyModel(model) {
|
|
242
|
+
const m = model.toLowerCase();
|
|
243
|
+
if (m.startsWith("antigravity-"))
|
|
244
|
+
return true;
|
|
245
|
+
if (m.includes("claude"))
|
|
246
|
+
return true;
|
|
247
|
+
return ANTIGRAVITY_ONLY_BARE_GEMINI_IDS.has(m);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Builds the human-facing guidance message used by both
|
|
251
|
+
* `enhanceAgySdkErrorResponse` (post-hoc, after a public-API 404) and
|
|
252
|
+
* `createAntigravityOnlyModelErrorResponse` (pre-flight, before the round trip).
|
|
253
|
+
*
|
|
254
|
+
* When `originalMessage` is omitted, the trailing "(Underlying Gemini API error: ...)"
|
|
255
|
+
* line is dropped so synthetic errors don't pretend to have a real upstream cause.
|
|
256
|
+
*/
|
|
257
|
+
function buildAntigravityModelGuidanceMessage(requestedModel, originalMessage) {
|
|
258
|
+
const suggestions = PUBLIC_GEMINI_API_MODEL_SUGGESTIONS.join(", ");
|
|
259
|
+
const antigravityOnly = isLikelyAntigravityOnlyModel(requestedModel);
|
|
260
|
+
const lines = [
|
|
261
|
+
`Model '${requestedModel}' was sent to the public Gemini API (v1beta) and rejected as NOT_FOUND.`,
|
|
262
|
+
];
|
|
263
|
+
if (antigravityOnly) {
|
|
264
|
+
lines.push("", "This model id is served by the Antigravity Code Assist backend, not the public Gemini API.", "The plugin's API-key path forwarded the request unchanged because either:", " • opencode's 'google' provider is in API-key mode (no OAuth session), or", " • all OAuth Antigravity accounts were rate-limited and `agy_sdk.api_key_fallback` kicked in.", "", "To reach this model, re-authenticate with OAuth:", " opencode auth logout google", " opencode auth login # choose Google → OAuth with Google (Antigravity)");
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
lines.push("", "The model id was forwarded to the public Gemini API verbatim. Double-check the spelling,", "or pick a model that's actually published on v1beta.");
|
|
268
|
+
}
|
|
269
|
+
lines.push("", `Public-API models known to work: ${suggestions}.`);
|
|
270
|
+
if (originalMessage) {
|
|
271
|
+
lines.push("", `(Underlying Gemini API error: ${originalMessage})`);
|
|
272
|
+
}
|
|
273
|
+
return lines.join("\n");
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* When the public Gemini API returns 404 NOT_FOUND for a model, rewrite the
|
|
277
|
+
* response body with actionable guidance. Without this, users see a bare
|
|
278
|
+
* "models/X is not found for API version v1beta" from Google and have no
|
|
279
|
+
* indication that the plugin routed their request through the API-key path
|
|
280
|
+
* because (a) opencode is in API-key mode for the google provider, or
|
|
281
|
+
* (b) all OAuth accounts were rate-limited and `api_key_fallback` kicked in.
|
|
282
|
+
*
|
|
283
|
+
* The rewritten body preserves the JSON error envelope so `@ai-sdk/google` still
|
|
284
|
+
* surfaces it as a normal `AI_APICallError` — only the human-facing message changes.
|
|
285
|
+
*/
|
|
286
|
+
export async function enhanceAgySdkErrorResponse(response, requestedModel) {
|
|
287
|
+
if (response.status !== 404 || !requestedModel)
|
|
288
|
+
return response;
|
|
289
|
+
// NB: Gemini's `streamGenerateContent?alt=sse` returns 404 errors with a JSON
|
|
290
|
+
// body but `Content-Type: text/event-stream`, so we can't gate on content-type.
|
|
291
|
+
// Parse the body as JSON unconditionally; bail if it doesn't look like the
|
|
292
|
+
// expected `{ error: { message } }` envelope.
|
|
293
|
+
let body;
|
|
294
|
+
try {
|
|
295
|
+
body = JSON.parse(await response.clone().text());
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return response;
|
|
299
|
+
}
|
|
300
|
+
const originalMessage = body.error?.message ?? "";
|
|
301
|
+
const looksLikeModelNotFound = /not (?:found|supported)/i.test(originalMessage) &&
|
|
302
|
+
originalMessage.toLowerCase().includes("model");
|
|
303
|
+
if (!looksLikeModelNotFound)
|
|
304
|
+
return response;
|
|
305
|
+
const enhanced = {
|
|
306
|
+
error: {
|
|
307
|
+
code: body.error?.code ?? 404,
|
|
308
|
+
message: buildAntigravityModelGuidanceMessage(requestedModel, originalMessage),
|
|
309
|
+
status: body.error?.status ?? "NOT_FOUND",
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
const headers = new Headers(response.headers);
|
|
313
|
+
headers.delete("content-length");
|
|
314
|
+
// Body is now JSON regardless of the original (`text/event-stream` on SSE 404s);
|
|
315
|
+
// normalize content-type so downstream parsers don't try to read it as a stream.
|
|
316
|
+
headers.set("content-type", "application/json");
|
|
317
|
+
return new Response(JSON.stringify(enhanced), {
|
|
318
|
+
status: response.status,
|
|
319
|
+
statusText: response.statusText,
|
|
320
|
+
headers,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Synthesizes the same 404 guidance produced by `enhanceAgySdkErrorResponse`,
|
|
325
|
+
* but pre-flight — before any request is sent to the public Gemini API.
|
|
326
|
+
*
|
|
327
|
+
* Use this in API-key-only auth paths when the requested model is identified by
|
|
328
|
+
* `isLikelyAntigravityOnlyModel`: the round trip would deterministically 404,
|
|
329
|
+
* so we short-circuit with the same Gemini-shaped error envelope. The shape
|
|
330
|
+
* matches `enhanceAgySdkErrorResponse` so `@ai-sdk/google` raises a normal
|
|
331
|
+
* `AI_APICallError` carrying the actionable message.
|
|
332
|
+
*/
|
|
333
|
+
export function createAntigravityOnlyModelErrorResponse(requestedModel) {
|
|
334
|
+
const body = {
|
|
335
|
+
error: {
|
|
336
|
+
code: 404,
|
|
337
|
+
message: buildAntigravityModelGuidanceMessage(requestedModel),
|
|
338
|
+
status: "NOT_FOUND",
|
|
339
|
+
},
|
|
340
|
+
};
|
|
341
|
+
return new Response(JSON.stringify(body), {
|
|
342
|
+
status: 404,
|
|
343
|
+
statusText: "Not Found",
|
|
344
|
+
headers: { "content-type": "application/json" },
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
function extractGeminiModelFromUrl(urlString) {
|
|
348
|
+
try {
|
|
349
|
+
const url = new URL(urlString);
|
|
350
|
+
return url.pathname.match(/\/models\/([^:]+):(\w+)/)?.[1];
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function isRecord(value) {
|
|
357
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
358
|
+
}
|
|
359
|
+
function toThinkingTier(value) {
|
|
360
|
+
if (value === "low" || value === "medium" || value === "high")
|
|
361
|
+
return value;
|
|
362
|
+
return undefined;
|
|
363
|
+
}
|
|
364
|
+
function thinkingLevelFromBudget(budget) {
|
|
365
|
+
if (budget <= 8192)
|
|
366
|
+
return "low";
|
|
367
|
+
if (budget <= 16384)
|
|
368
|
+
return "medium";
|
|
369
|
+
return "high";
|
|
370
|
+
}
|
|
371
|
+
function mergeExtraBody(payload) {
|
|
372
|
+
const extraBody = isRecord(payload.extra_body)
|
|
373
|
+
? payload.extra_body
|
|
374
|
+
: isRecord(payload.extraBody)
|
|
375
|
+
? payload.extraBody
|
|
376
|
+
: undefined;
|
|
377
|
+
if (!extraBody)
|
|
378
|
+
return undefined;
|
|
379
|
+
if (isRecord(extraBody.generationConfig)) {
|
|
380
|
+
const generationConfig = isRecord(payload.generationConfig) ? payload.generationConfig : {};
|
|
381
|
+
for (const [key, value] of Object.entries(extraBody.generationConfig)) {
|
|
382
|
+
if (!(key in generationConfig)) {
|
|
383
|
+
generationConfig[key] = value;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
payload.generationConfig = generationConfig;
|
|
387
|
+
}
|
|
388
|
+
for (const [key, value] of Object.entries(extraBody)) {
|
|
389
|
+
if (!(key in payload)) {
|
|
390
|
+
payload[key] = value;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return extraBody;
|
|
394
|
+
}
|
|
395
|
+
function applyAgySdkGeminiBodyTransforms(payload, model, thinkingLevel) {
|
|
396
|
+
const generationConfig = isRecord(payload.generationConfig)
|
|
397
|
+
? payload.generationConfig
|
|
398
|
+
: {};
|
|
399
|
+
const extraBody = mergeExtraBody(payload);
|
|
400
|
+
const variantConfig = extractVariantThinkingConfig(isRecord(payload.providerOptions) ? payload.providerOptions : undefined, generationConfig);
|
|
401
|
+
const extraThinkingConfig = isRecord(extraBody?.thinkingConfig) ? extraBody.thinkingConfig : undefined;
|
|
402
|
+
const existingThinkingConfig = isRecord(generationConfig.thinkingConfig)
|
|
403
|
+
? generationConfig.thinkingConfig
|
|
404
|
+
: extraThinkingConfig
|
|
405
|
+
? { ...extraThinkingConfig }
|
|
406
|
+
: {};
|
|
407
|
+
if (isGemini3Model(model)) {
|
|
408
|
+
const resolvedLevel = variantConfig?.thinkingLevel
|
|
409
|
+
?? (typeof existingThinkingConfig.thinkingLevel === "string" ? existingThinkingConfig.thinkingLevel : undefined)
|
|
410
|
+
?? (variantConfig?.thinkingBudget !== undefined ? thinkingLevelFromBudget(variantConfig.thinkingBudget) : undefined)
|
|
411
|
+
?? thinkingLevel
|
|
412
|
+
?? "low";
|
|
413
|
+
existingThinkingConfig.thinkingLevel = resolvedLevel;
|
|
414
|
+
if (variantConfig?.includeThoughts !== undefined) {
|
|
415
|
+
existingThinkingConfig.includeThoughts = variantConfig.includeThoughts;
|
|
416
|
+
}
|
|
417
|
+
else if (typeof existingThinkingConfig.includeThoughts !== "boolean") {
|
|
418
|
+
existingThinkingConfig.includeThoughts = true;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
else if (variantConfig?.thinkingBudget !== undefined || typeof existingThinkingConfig.thinkingBudget === "number") {
|
|
422
|
+
existingThinkingConfig.thinkingBudget = variantConfig?.thinkingBudget ?? existingThinkingConfig.thinkingBudget;
|
|
423
|
+
if (variantConfig?.includeThoughts !== undefined) {
|
|
424
|
+
existingThinkingConfig.includeThoughts = variantConfig.includeThoughts;
|
|
425
|
+
}
|
|
426
|
+
else if (typeof existingThinkingConfig.includeThoughts !== "boolean") {
|
|
427
|
+
existingThinkingConfig.includeThoughts = true;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
if (Object.keys(existingThinkingConfig).length > 0) {
|
|
431
|
+
generationConfig.thinkingConfig = existingThinkingConfig;
|
|
432
|
+
payload.generationConfig = generationConfig;
|
|
433
|
+
}
|
|
434
|
+
if (Array.isArray(payload.tools) || variantConfig?.googleSearch) {
|
|
435
|
+
applyGeminiTransforms(payload, {
|
|
436
|
+
model,
|
|
437
|
+
tierThinkingLevel: toThinkingTier(typeof generationConfig.thinkingConfig === "object"
|
|
438
|
+
&& generationConfig.thinkingConfig
|
|
439
|
+
&& "thinkingLevel" in generationConfig.thinkingConfig
|
|
440
|
+
? String(generationConfig.thinkingConfig.thinkingLevel)
|
|
441
|
+
: undefined),
|
|
442
|
+
googleSearch: variantConfig?.googleSearch,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
delete payload.model;
|
|
446
|
+
delete payload.providerOptions;
|
|
447
|
+
delete payload.extra_body;
|
|
448
|
+
delete payload.extraBody;
|
|
449
|
+
delete payload.thinkingConfig;
|
|
450
|
+
delete payload.thinking;
|
|
451
|
+
}
|
|
452
|
+
export async function prepareAgySdkGeminiRequest(input, init, credential) {
|
|
453
|
+
const requestInput = typeof input === "string" ? undefined : input;
|
|
454
|
+
const urlString = requestInput?.url ?? input.toString();
|
|
455
|
+
const url = new URL(urlString);
|
|
456
|
+
const match = url.pathname.match(/\/models\/([^:]+):(\w+)/);
|
|
457
|
+
const rawModel = match?.[1] ?? undefined;
|
|
458
|
+
const action = match?.[2] ?? undefined;
|
|
459
|
+
const resolved = rawModel ? resolveModelForHeaderStyle(rawModel, "agy-sdk") : undefined;
|
|
460
|
+
if (resolved && action) {
|
|
461
|
+
url.pathname = url.pathname.replace(`/models/${rawModel}:${action}`, `/models/${resolved.actualModel}:${action}`);
|
|
462
|
+
}
|
|
463
|
+
url.searchParams.delete("key");
|
|
464
|
+
const headers = new Headers(init?.headers ?? requestInput?.headers ?? {});
|
|
465
|
+
headers.delete("Authorization");
|
|
466
|
+
headers.delete("x-api-key");
|
|
467
|
+
headers.set("x-goog-api-key", credential.apiKey);
|
|
468
|
+
headers.delete("x-goog-user-project");
|
|
469
|
+
const requestTextBody = init?.body === undefined && requestInput ? await requestBodyText(requestInput) : undefined;
|
|
470
|
+
const originalBody = init?.body ?? requestTextBody ?? requestInput?.body ?? undefined;
|
|
471
|
+
let body = originalBody;
|
|
472
|
+
if (typeof body === "string" && body.trim()) {
|
|
473
|
+
try {
|
|
474
|
+
const payload = JSON.parse(body);
|
|
475
|
+
applyAgySdkGeminiBodyTransforms(payload, resolved?.actualModel ?? rawModel ?? "", resolved?.thinkingLevel);
|
|
476
|
+
body = JSON.stringify(payload);
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
body = originalBody;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return {
|
|
483
|
+
request: url.toString(),
|
|
484
|
+
init: {
|
|
485
|
+
method: requestInput?.method,
|
|
486
|
+
...init,
|
|
487
|
+
headers,
|
|
488
|
+
body,
|
|
489
|
+
},
|
|
490
|
+
model: resolved?.actualModel ?? rawModel,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
async function fetchGeminiModelsPage(url, credential) {
|
|
494
|
+
const controller = new AbortController();
|
|
495
|
+
const timeout = setTimeout(() => controller.abort(), GEMINI_MODELS_LIST_TIMEOUT_MS);
|
|
496
|
+
try {
|
|
497
|
+
return await fetch(url, {
|
|
498
|
+
signal: controller.signal,
|
|
499
|
+
headers: {
|
|
500
|
+
"x-goog-api-key": credential.apiKey,
|
|
501
|
+
},
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
finally {
|
|
505
|
+
clearTimeout(timeout);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
export async function fetchWithAgySdkCredential(input, init, credential, fallbackRetryAfterMs) {
|
|
509
|
+
const prepared = await prepareAgySdkGeminiRequest(input, init, credential);
|
|
510
|
+
const response = await fetch(prepared.request, prepared.init);
|
|
511
|
+
if (response.status === 429 || response.status === 503 || response.status === 529) {
|
|
512
|
+
markAgySdkCredentialRateLimited(credential, retryAfterMsFromResponse(response, fallbackRetryAfterMs));
|
|
513
|
+
}
|
|
514
|
+
return enhanceAgySdkErrorResponse(response, prepared.model);
|
|
515
|
+
}
|
|
516
|
+
export async function fetchGeminiApiModels(credential) {
|
|
517
|
+
const models = [];
|
|
518
|
+
let pageToken;
|
|
519
|
+
const seenPageTokens = new Set();
|
|
520
|
+
for (let page = 0; page < GEMINI_MODELS_LIST_MAX_PAGES; page += 1) {
|
|
521
|
+
const url = new URL("https://generativelanguage.googleapis.com/v1beta/models");
|
|
522
|
+
url.searchParams.set("pageSize", "1000");
|
|
523
|
+
if (pageToken) {
|
|
524
|
+
if (seenPageTokens.has(pageToken)) {
|
|
525
|
+
throw new Error(`Gemini models.list returned repeated page token for ${credential.label}`);
|
|
526
|
+
}
|
|
527
|
+
seenPageTokens.add(pageToken);
|
|
528
|
+
url.searchParams.set("pageToken", pageToken);
|
|
529
|
+
}
|
|
530
|
+
const response = await fetchGeminiModelsPage(url.toString(), credential);
|
|
531
|
+
if (!response.ok) {
|
|
532
|
+
const body = await response.text().catch(() => "");
|
|
533
|
+
const snippet = body.trim().slice(0, 200);
|
|
534
|
+
throw new Error(`Gemini models.list failed for ${credential.label}: ${response.status}${snippet ? ` ${snippet}` : ""}`);
|
|
535
|
+
}
|
|
536
|
+
const payload = (await response.json());
|
|
537
|
+
models.push(...(payload.models ?? []));
|
|
538
|
+
pageToken = payload.nextPageToken;
|
|
539
|
+
if (!pageToken)
|
|
540
|
+
return models;
|
|
541
|
+
}
|
|
542
|
+
throw new Error(`Gemini models.list exceeded ${GEMINI_MODELS_LIST_MAX_PAGES} pages for ${credential.label}`);
|
|
543
|
+
}
|
|
544
|
+
//# sourceMappingURL=api-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key.js","sourceRoot":"","sources":["../../../src/plugin/api-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AuthDetails, OAuthAuthDetails, RefreshParts } from "./types";
|
|
2
|
+
export declare function isOAuthAuth(auth: AuthDetails): auth is OAuthAuthDetails;
|
|
3
|
+
/**
|
|
4
|
+
* Splits a packed refresh string into its constituent refresh token and project IDs.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseRefreshParts(refresh: string): RefreshParts;
|
|
7
|
+
/**
|
|
8
|
+
* Serializes refresh token parts into the stored string format.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatRefreshParts(parts: RefreshParts): string;
|
|
11
|
+
/**
|
|
12
|
+
* Determines whether an access token is expired or missing, with buffer for clock skew.
|
|
13
|
+
*/
|
|
14
|
+
export declare function accessTokenExpired(auth: OAuthAuthDetails): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Calculates absolute expiry timestamp based on a duration.
|
|
17
|
+
* @param requestTimeMs The local time when the request was initiated
|
|
18
|
+
* @param expiresInSeconds The duration returned by the server
|
|
19
|
+
*/
|
|
20
|
+
export declare function calculateTokenExpiry(requestTimeMs: number, expiresInSeconds: unknown): number;
|
|
21
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/plugin/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,gBAAgB,CAEvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAO/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAI9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAKlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,MAAM,CAO7F"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const ACCESS_TOKEN_EXPIRY_BUFFER_MS = 60 * 1000;
|
|
2
|
+
export function isOAuthAuth(auth) {
|
|
3
|
+
return auth.type === "oauth";
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Splits a packed refresh string into its constituent refresh token and project IDs.
|
|
7
|
+
*/
|
|
8
|
+
export function parseRefreshParts(refresh) {
|
|
9
|
+
const [refreshToken = "", projectId = "", managedProjectId = ""] = (refresh ?? "").split("|");
|
|
10
|
+
return {
|
|
11
|
+
refreshToken,
|
|
12
|
+
projectId: projectId || undefined,
|
|
13
|
+
managedProjectId: managedProjectId || undefined,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Serializes refresh token parts into the stored string format.
|
|
18
|
+
*/
|
|
19
|
+
export function formatRefreshParts(parts) {
|
|
20
|
+
const projectSegment = parts.projectId ?? "";
|
|
21
|
+
const base = `${parts.refreshToken}|${projectSegment}`;
|
|
22
|
+
return parts.managedProjectId ? `${base}|${parts.managedProjectId}` : base;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Determines whether an access token is expired or missing, with buffer for clock skew.
|
|
26
|
+
*/
|
|
27
|
+
export function accessTokenExpired(auth) {
|
|
28
|
+
if (!auth.access || typeof auth.expires !== "number") {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return auth.expires <= Date.now() + ACCESS_TOKEN_EXPIRY_BUFFER_MS;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calculates absolute expiry timestamp based on a duration.
|
|
35
|
+
* @param requestTimeMs The local time when the request was initiated
|
|
36
|
+
* @param expiresInSeconds The duration returned by the server
|
|
37
|
+
*/
|
|
38
|
+
export function calculateTokenExpiry(requestTimeMs, expiresInSeconds) {
|
|
39
|
+
const seconds = typeof expiresInSeconds === "number" ? expiresInSeconds : 3600;
|
|
40
|
+
// Safety check for bad data - if it's not a positive number, treat as immediately expired
|
|
41
|
+
if (isNaN(seconds) || seconds <= 0) {
|
|
42
|
+
return requestTimeMs;
|
|
43
|
+
}
|
|
44
|
+
return requestTimeMs + seconds * 1000;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/plugin/auth.ts"],"names":[],"mappings":"AAEA,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,CAAC,YAAY,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE,gBAAgB,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9F,OAAO;QACL,YAAY;QACZ,SAAS,EAAE,SAAS,IAAI,SAAS;QACjC,gBAAgB,EAAE,gBAAgB,IAAI,SAAS;KAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IACpD,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,YAAY,IAAI,cAAc,EAAE,CAAC;IACvD,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,6BAA6B,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAqB,EAAE,gBAAyB;IACnF,MAAM,OAAO,GAAG,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,0FAA0F;IAC1F,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,aAAa,GAAG,OAAO,GAAG,IAAI,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugin/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
|