@anthonyhaussman/opencode-agy-auth 1.2.13-alpha.0 → 1.2.13-alpha.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/dist/index.js +489 -528
- package/dist/index.js.map +1 -1
- package/dist/src/plugin/headers.d.ts +7 -0
- package/dist/src/plugin/quota-summary.d.ts +2 -0
- package/dist/src/plugin/quota.d.ts +2 -0
- package/dist/src/plugin/tier.d.ts +28 -0
- package/dist/src/plugin/v2-fetch.d.ts +1 -0
- package/dist/src/plugin/v2-session.d.ts +7 -0
- package/dist/src/plugin/v2-storage.d.ts +3 -0
- package/dist/src/plugin/v2.d.ts +7 -15
- package/dist/src/plugin.d.ts +2 -23
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -15337,6 +15337,12 @@ function formatRelativeResetTime(resetTime) {
|
|
|
15337
15337
|
|
|
15338
15338
|
// src/plugin/quota.ts
|
|
15339
15339
|
var AGY_QUOTA_TOOL_NAME = "agy_quota";
|
|
15340
|
+
var AGY_V2_QUOTA_COMMAND = "agy-quota";
|
|
15341
|
+
var AGY_V2_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
|
|
15342
|
+
|
|
15343
|
+
Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
|
|
15344
|
+
Do not call other tools.
|
|
15345
|
+
`;
|
|
15340
15346
|
function createAgyQuotaTool({
|
|
15341
15347
|
client,
|
|
15342
15348
|
getAuthResolver,
|
|
@@ -15576,6 +15582,12 @@ function splitModelVariant(modelId) {
|
|
|
15576
15582
|
|
|
15577
15583
|
// src/plugin/quota-summary.ts
|
|
15578
15584
|
var AGY_QUOTA_SUMMARY_TOOL_NAME = "agy_quota_summary";
|
|
15585
|
+
var AGY_V2_QUOTA_SUMMARY_COMMAND = "agy-quota-summary";
|
|
15586
|
+
var AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota summary (weekly and 5-hour limits by model group) for the current authenticated account.
|
|
15587
|
+
|
|
15588
|
+
Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
|
|
15589
|
+
Do not call other tools.
|
|
15590
|
+
`;
|
|
15579
15591
|
function createAgyQuotaSummaryTool({
|
|
15580
15592
|
client,
|
|
15581
15593
|
getAuthResolver,
|
|
@@ -19792,9 +19804,14 @@ function normalizeToolSchemaTypes(tools, toolMapper) {
|
|
|
19792
19804
|
fn.name = toolMapper ? toolMapper.toGemini(fn.name) : sanitizeToolName(fn.name);
|
|
19793
19805
|
}
|
|
19794
19806
|
if (fn) {
|
|
19807
|
+
if (!fn.parameters) {
|
|
19808
|
+
fn.parameters = fn.parameters_json_schema ?? fn.parametersJsonSchema;
|
|
19809
|
+
}
|
|
19795
19810
|
if (!fn.parameters) {
|
|
19796
19811
|
fn.parameters = { type: "OBJECT", properties: {} };
|
|
19797
19812
|
}
|
|
19813
|
+
delete fn.parameters_json_schema;
|
|
19814
|
+
delete fn.parametersJsonSchema;
|
|
19798
19815
|
sanitizeSchema(fn.parameters);
|
|
19799
19816
|
}
|
|
19800
19817
|
}
|
|
@@ -20219,22 +20236,81 @@ var ChatLoggerImpl = class {
|
|
|
20219
20236
|
}
|
|
20220
20237
|
};
|
|
20221
20238
|
|
|
20222
|
-
// src/plugin.ts
|
|
20223
|
-
|
|
20224
|
-
|
|
20225
|
-
|
|
20226
|
-
|
|
20227
|
-
|
|
20228
|
-
|
|
20229
|
-
|
|
20230
|
-
|
|
20239
|
+
// src/plugin/headers.ts
|
|
20240
|
+
function getSafeHeader(headers, key) {
|
|
20241
|
+
if (!headers) {
|
|
20242
|
+
return void 0;
|
|
20243
|
+
}
|
|
20244
|
+
const targetKey = key.toLowerCase();
|
|
20245
|
+
if (typeof headers.get === "function") {
|
|
20246
|
+
try {
|
|
20247
|
+
return headers.get(targetKey) || void 0;
|
|
20248
|
+
} catch {
|
|
20249
|
+
}
|
|
20250
|
+
}
|
|
20251
|
+
if (Array.isArray(headers)) {
|
|
20252
|
+
const found = headers.find((item) => {
|
|
20253
|
+
if (Array.isArray(item) && typeof item[0] === "string") {
|
|
20254
|
+
return item[0].toLowerCase() === targetKey;
|
|
20255
|
+
}
|
|
20256
|
+
return false;
|
|
20257
|
+
});
|
|
20258
|
+
return found ? String(found[1]) : void 0;
|
|
20259
|
+
}
|
|
20260
|
+
if (typeof headers === "object") {
|
|
20261
|
+
const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
|
|
20262
|
+
return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
|
|
20263
|
+
}
|
|
20264
|
+
return void 0;
|
|
20265
|
+
}
|
|
20266
|
+
function setSafeHeaders(initHeaders, newHeaders) {
|
|
20267
|
+
if (typeof globalThis.Headers !== "undefined") {
|
|
20268
|
+
const headers = new globalThis.Headers(initHeaders ?? {});
|
|
20269
|
+
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20270
|
+
headers.set(k, v);
|
|
20271
|
+
}
|
|
20272
|
+
return headers;
|
|
20273
|
+
}
|
|
20274
|
+
if (Array.isArray(initHeaders)) {
|
|
20275
|
+
const nextHeaders2 = [...initHeaders];
|
|
20276
|
+
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20277
|
+
const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
|
|
20278
|
+
if (idx !== -1) {
|
|
20279
|
+
nextHeaders2[idx] = [k, v];
|
|
20280
|
+
} else {
|
|
20281
|
+
nextHeaders2.push([k, v]);
|
|
20282
|
+
}
|
|
20283
|
+
}
|
|
20284
|
+
return nextHeaders2;
|
|
20285
|
+
}
|
|
20286
|
+
const nextHeaders = {};
|
|
20287
|
+
if (initHeaders && typeof initHeaders === "object") {
|
|
20288
|
+
for (const [k, v] of Object.entries(initHeaders)) {
|
|
20289
|
+
nextHeaders[k] = String(v);
|
|
20290
|
+
}
|
|
20291
|
+
}
|
|
20292
|
+
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20293
|
+
const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
|
|
20294
|
+
if (existingKey) {
|
|
20295
|
+
nextHeaders[existingKey] = v;
|
|
20296
|
+
} else {
|
|
20297
|
+
nextHeaders[k] = v;
|
|
20298
|
+
}
|
|
20299
|
+
}
|
|
20300
|
+
return nextHeaders;
|
|
20301
|
+
}
|
|
20302
|
+
function toUrlString(value) {
|
|
20303
|
+
if (typeof value === "string") {
|
|
20304
|
+
return value;
|
|
20305
|
+
}
|
|
20306
|
+
const candidate = value.url;
|
|
20307
|
+
if (candidate) {
|
|
20308
|
+
return candidate;
|
|
20309
|
+
}
|
|
20310
|
+
return value.toString();
|
|
20311
|
+
}
|
|
20231
20312
|
|
|
20232
|
-
|
|
20233
|
-
Do not call other tools.
|
|
20234
|
-
`;
|
|
20235
|
-
var latestAgyAuthResolver;
|
|
20236
|
-
var latestAgyConfiguredProjectId;
|
|
20237
|
-
var latestAgyUserAgentModel;
|
|
20313
|
+
// src/plugin/tier.ts
|
|
20238
20314
|
var STATIC_MODELS_SIMPLE = {
|
|
20239
20315
|
"gemini-3.8-flash": {
|
|
20240
20316
|
name: "Gemini 3.8 Flash",
|
|
@@ -20322,6 +20398,39 @@ var TIER_MAPPING = {
|
|
|
20322
20398
|
high: "gemini-3.1-pro-high"
|
|
20323
20399
|
}
|
|
20324
20400
|
};
|
|
20401
|
+
function resolveModelTier(baseModelId, headersOrInit) {
|
|
20402
|
+
const parts = baseModelId.split("@");
|
|
20403
|
+
const base = parts[0] || "";
|
|
20404
|
+
const suffixTier = parts[1]?.toLowerCase();
|
|
20405
|
+
const mapping = TIER_MAPPING[base];
|
|
20406
|
+
if (!mapping) {
|
|
20407
|
+
return baseModelId;
|
|
20408
|
+
}
|
|
20409
|
+
const rawHeaders = headersOrInit && typeof headersOrInit === "object" && "headers" in headersOrInit ? headersOrInit.headers : headersOrInit;
|
|
20410
|
+
const headerTier = getSafeHeader(rawHeaders, "x-agy-tier")?.toLowerCase() || null;
|
|
20411
|
+
const requestedTier = headerTier || suffixTier;
|
|
20412
|
+
if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
|
|
20413
|
+
return mapping[requestedTier] || baseModelId;
|
|
20414
|
+
}
|
|
20415
|
+
return mapping["medium"] ?? mapping["high"] ?? baseModelId;
|
|
20416
|
+
}
|
|
20417
|
+
|
|
20418
|
+
// src/plugin.ts
|
|
20419
|
+
var AGY_QUOTA_COMMAND = "agyquota";
|
|
20420
|
+
var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
|
|
20421
|
+
|
|
20422
|
+
Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
|
|
20423
|
+
Do not call other tools.
|
|
20424
|
+
`;
|
|
20425
|
+
var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
|
|
20426
|
+
var AGY_QUOTA_SUMMARY_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota summary (weekly and 5-hour limits by model group) for the current authenticated account.
|
|
20427
|
+
|
|
20428
|
+
Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
|
|
20429
|
+
Do not call other tools.
|
|
20430
|
+
`;
|
|
20431
|
+
var latestAgyAuthResolver;
|
|
20432
|
+
var latestAgyConfiguredProjectId;
|
|
20433
|
+
var latestAgyUserAgentModel;
|
|
20325
20434
|
var buildModelFromSimple = (modelId, simple) => {
|
|
20326
20435
|
const isClaude = modelId.startsWith("claude-");
|
|
20327
20436
|
const isGpt = modelId.startsWith("gpt-");
|
|
@@ -20415,83 +20524,6 @@ var STATIC_MODELS = {};
|
|
|
20415
20524
|
for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
|
|
20416
20525
|
STATIC_MODELS[modelId] = buildModelFromSimple(modelId, simple);
|
|
20417
20526
|
}
|
|
20418
|
-
function getSafeHeader(headers, key) {
|
|
20419
|
-
if (!headers) {
|
|
20420
|
-
return void 0;
|
|
20421
|
-
}
|
|
20422
|
-
const targetKey = key.toLowerCase();
|
|
20423
|
-
if (typeof headers.get === "function") {
|
|
20424
|
-
try {
|
|
20425
|
-
return headers.get(targetKey) || void 0;
|
|
20426
|
-
} catch {
|
|
20427
|
-
}
|
|
20428
|
-
}
|
|
20429
|
-
if (Array.isArray(headers)) {
|
|
20430
|
-
const found = headers.find((item) => {
|
|
20431
|
-
if (Array.isArray(item) && typeof item[0] === "string") {
|
|
20432
|
-
return item[0].toLowerCase() === targetKey;
|
|
20433
|
-
}
|
|
20434
|
-
return false;
|
|
20435
|
-
});
|
|
20436
|
-
return found ? String(found[1]) : void 0;
|
|
20437
|
-
}
|
|
20438
|
-
if (typeof headers === "object") {
|
|
20439
|
-
const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
|
|
20440
|
-
return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
|
|
20441
|
-
}
|
|
20442
|
-
return void 0;
|
|
20443
|
-
}
|
|
20444
|
-
function setSafeHeaders(initHeaders, newHeaders) {
|
|
20445
|
-
if (typeof globalThis.Headers !== "undefined") {
|
|
20446
|
-
const headers = new globalThis.Headers(initHeaders ?? {});
|
|
20447
|
-
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20448
|
-
headers.set(k, v);
|
|
20449
|
-
}
|
|
20450
|
-
return headers;
|
|
20451
|
-
}
|
|
20452
|
-
if (Array.isArray(initHeaders)) {
|
|
20453
|
-
const nextHeaders2 = [...initHeaders];
|
|
20454
|
-
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20455
|
-
const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
|
|
20456
|
-
if (idx !== -1) {
|
|
20457
|
-
nextHeaders2[idx] = [k, v];
|
|
20458
|
-
} else {
|
|
20459
|
-
nextHeaders2.push([k, v]);
|
|
20460
|
-
}
|
|
20461
|
-
}
|
|
20462
|
-
return nextHeaders2;
|
|
20463
|
-
}
|
|
20464
|
-
const nextHeaders = {};
|
|
20465
|
-
if (initHeaders && typeof initHeaders === "object") {
|
|
20466
|
-
for (const [k, v] of Object.entries(initHeaders)) {
|
|
20467
|
-
nextHeaders[k] = String(v);
|
|
20468
|
-
}
|
|
20469
|
-
}
|
|
20470
|
-
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20471
|
-
const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
|
|
20472
|
-
if (existingKey) {
|
|
20473
|
-
nextHeaders[existingKey] = v;
|
|
20474
|
-
} else {
|
|
20475
|
-
nextHeaders[k] = v;
|
|
20476
|
-
}
|
|
20477
|
-
}
|
|
20478
|
-
return nextHeaders;
|
|
20479
|
-
}
|
|
20480
|
-
function resolveModelTier(baseModelId, init) {
|
|
20481
|
-
const parts = baseModelId.split("@");
|
|
20482
|
-
const base = parts[0] || "";
|
|
20483
|
-
const suffixTier = parts[1]?.toLowerCase();
|
|
20484
|
-
const mapping = TIER_MAPPING[base];
|
|
20485
|
-
if (!mapping) {
|
|
20486
|
-
return baseModelId;
|
|
20487
|
-
}
|
|
20488
|
-
const headerTier = getSafeHeader(init?.headers, "x-agy-tier")?.toLowerCase() || null;
|
|
20489
|
-
const requestedTier = headerTier || suffixTier;
|
|
20490
|
-
if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
|
|
20491
|
-
return mapping[requestedTier] || baseModelId;
|
|
20492
|
-
}
|
|
20493
|
-
return mapping["medium"] ?? mapping["high"];
|
|
20494
|
-
}
|
|
20495
20527
|
var AgyCLIOAuthPlugin = async ({ client }) => {
|
|
20496
20528
|
let latestConfig;
|
|
20497
20529
|
updateStaticModelsWithPricing(STATIC_MODELS);
|
|
@@ -20819,139 +20851,30 @@ async function ensureProjectContextOrThrow(authRecord, client, configuredProject
|
|
|
20819
20851
|
throw error45;
|
|
20820
20852
|
}
|
|
20821
20853
|
}
|
|
20822
|
-
function toUrlString(value) {
|
|
20823
|
-
if (typeof value === "string") {
|
|
20824
|
-
return value;
|
|
20825
|
-
}
|
|
20826
|
-
const candidate = value.url;
|
|
20827
|
-
if (candidate) {
|
|
20828
|
-
return candidate;
|
|
20829
|
-
}
|
|
20830
|
-
return value.toString();
|
|
20831
|
-
}
|
|
20832
20854
|
|
|
20833
20855
|
// src/plugin/types.ts
|
|
20834
20856
|
function defineOpenCodeV2Plugin(def) {
|
|
20835
20857
|
return def;
|
|
20836
20858
|
}
|
|
20837
20859
|
|
|
20838
|
-
// src/plugin/v2.ts
|
|
20860
|
+
// src/plugin/v2-storage.ts
|
|
20861
|
+
import { closeSync, existsSync as existsSync6, mkdirSync as mkdirSync5, openSync, readFileSync as readFileSync5, renameSync as renameSync4, unlinkSync as unlinkSync4, writeFileSync as writeFileSync5 } from "fs";
|
|
20862
|
+
import { randomUUID as randomUUID4 } from "crypto";
|
|
20839
20863
|
import { homedir as homedir4 } from "os";
|
|
20840
20864
|
import { join as join6 } from "path";
|
|
20841
|
-
|
|
20842
|
-
|
|
20843
|
-
|
|
20844
|
-
|
|
20845
|
-
var AGY_V2_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
|
|
20846
|
-
|
|
20847
|
-
Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
|
|
20848
|
-
Do not call other tools.
|
|
20849
|
-
`;
|
|
20850
|
-
var AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota summary (weekly and 5-hour limits by model group) for the current authenticated account.
|
|
20851
|
-
|
|
20852
|
-
Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
|
|
20853
|
-
Do not call other tools.
|
|
20854
|
-
`;
|
|
20855
|
-
function getSafeHeader2(headers, key) {
|
|
20856
|
-
if (!headers) {
|
|
20857
|
-
return void 0;
|
|
20865
|
+
var storedAuthOverrideForTesting = void 0;
|
|
20866
|
+
function loadStoredAuthFromJson() {
|
|
20867
|
+
if (storedAuthOverrideForTesting !== void 0) {
|
|
20868
|
+
return storedAuthOverrideForTesting;
|
|
20858
20869
|
}
|
|
20859
|
-
const
|
|
20860
|
-
|
|
20861
|
-
|
|
20862
|
-
|
|
20863
|
-
|
|
20870
|
+
const authPath = join6(homedir4(), ".local", "share", "opencode", "auth.json");
|
|
20871
|
+
try {
|
|
20872
|
+
if (existsSync6(authPath)) {
|
|
20873
|
+
const content = readFileSync5(authPath, "utf8");
|
|
20874
|
+
const data = JSON.parse(content);
|
|
20875
|
+
return data?.[AGY_PROVIDER_ID];
|
|
20864
20876
|
}
|
|
20865
|
-
}
|
|
20866
|
-
if (Array.isArray(headers)) {
|
|
20867
|
-
const found = headers.find((item) => {
|
|
20868
|
-
if (Array.isArray(item) && typeof item[0] === "string") {
|
|
20869
|
-
return item[0].toLowerCase() === targetKey;
|
|
20870
|
-
}
|
|
20871
|
-
return false;
|
|
20872
|
-
});
|
|
20873
|
-
return found ? String(found[1]) : void 0;
|
|
20874
|
-
}
|
|
20875
|
-
if (typeof headers === "object") {
|
|
20876
|
-
const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
|
|
20877
|
-
return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
|
|
20878
|
-
}
|
|
20879
|
-
return void 0;
|
|
20880
|
-
}
|
|
20881
|
-
function setSafeHeaders2(initHeaders, newHeaders) {
|
|
20882
|
-
if (typeof globalThis.Headers !== "undefined") {
|
|
20883
|
-
const headers = new globalThis.Headers(initHeaders ?? {});
|
|
20884
|
-
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20885
|
-
headers.set(k, v);
|
|
20886
|
-
}
|
|
20887
|
-
return headers;
|
|
20888
|
-
}
|
|
20889
|
-
if (Array.isArray(initHeaders)) {
|
|
20890
|
-
const nextHeaders2 = [...initHeaders];
|
|
20891
|
-
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20892
|
-
const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
|
|
20893
|
-
if (idx !== -1) {
|
|
20894
|
-
nextHeaders2[idx] = [k, v];
|
|
20895
|
-
} else {
|
|
20896
|
-
nextHeaders2.push([k, v]);
|
|
20897
|
-
}
|
|
20898
|
-
}
|
|
20899
|
-
return nextHeaders2;
|
|
20900
|
-
}
|
|
20901
|
-
const nextHeaders = {};
|
|
20902
|
-
if (initHeaders && typeof initHeaders === "object") {
|
|
20903
|
-
for (const [k, v] of Object.entries(initHeaders)) {
|
|
20904
|
-
nextHeaders[k] = String(v);
|
|
20905
|
-
}
|
|
20906
|
-
}
|
|
20907
|
-
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20908
|
-
const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
|
|
20909
|
-
if (existingKey) {
|
|
20910
|
-
nextHeaders[existingKey] = v;
|
|
20911
|
-
} else {
|
|
20912
|
-
nextHeaders[k] = v;
|
|
20913
|
-
}
|
|
20914
|
-
}
|
|
20915
|
-
return nextHeaders;
|
|
20916
|
-
}
|
|
20917
|
-
function toUrlString2(value) {
|
|
20918
|
-
if (typeof value === "string") {
|
|
20919
|
-
return value;
|
|
20920
|
-
}
|
|
20921
|
-
const candidate = value.url;
|
|
20922
|
-
if (candidate) {
|
|
20923
|
-
return candidate;
|
|
20924
|
-
}
|
|
20925
|
-
return value.toString();
|
|
20926
|
-
}
|
|
20927
|
-
function resolveModelTier2(baseModelId, init) {
|
|
20928
|
-
const parts = baseModelId.split("@");
|
|
20929
|
-
const base = parts[0] || "";
|
|
20930
|
-
const suffixTier = parts[1]?.toLowerCase();
|
|
20931
|
-
const mapping = TIER_MAPPING[base];
|
|
20932
|
-
if (!mapping) {
|
|
20933
|
-
return baseModelId;
|
|
20934
|
-
}
|
|
20935
|
-
const headerTier = getSafeHeader2(init?.headers, "x-agy-tier")?.toLowerCase() || null;
|
|
20936
|
-
const requestedTier = headerTier || suffixTier;
|
|
20937
|
-
if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
|
|
20938
|
-
return mapping[requestedTier] || baseModelId;
|
|
20939
|
-
}
|
|
20940
|
-
return mapping["medium"] ?? mapping["high"];
|
|
20941
|
-
}
|
|
20942
|
-
var storedAuthOverrideForTesting = void 0;
|
|
20943
|
-
function loadStoredAuthFromJson() {
|
|
20944
|
-
if (storedAuthOverrideForTesting !== void 0) {
|
|
20945
|
-
return storedAuthOverrideForTesting;
|
|
20946
|
-
}
|
|
20947
|
-
const authPath = join6(homedir4(), ".local", "share", "opencode", "auth.json");
|
|
20948
|
-
try {
|
|
20949
|
-
if (existsSync6(authPath)) {
|
|
20950
|
-
const content = readFileSync5(authPath, "utf8");
|
|
20951
|
-
const data = JSON.parse(content);
|
|
20952
|
-
return data?.[AGY_PROVIDER_ID];
|
|
20953
|
-
}
|
|
20954
|
-
} catch {
|
|
20877
|
+
} catch {
|
|
20955
20878
|
}
|
|
20956
20879
|
return void 0;
|
|
20957
20880
|
}
|
|
@@ -20959,43 +20882,61 @@ function saveStoredAuthToJson(authRecord) {
|
|
|
20959
20882
|
if (process.env.NODE_ENV === "test" || process.env.VITEST || storedAuthOverrideForTesting !== void 0) {
|
|
20960
20883
|
return;
|
|
20961
20884
|
}
|
|
20885
|
+
const dirPath = join6(homedir4(), ".local", "share", "opencode");
|
|
20886
|
+
if (!existsSync6(dirPath)) {
|
|
20887
|
+
mkdirSync5(dirPath, { recursive: true });
|
|
20888
|
+
}
|
|
20889
|
+
const authPath = join6(dirPath, "auth.json");
|
|
20890
|
+
const data = existsSync6(authPath) ? JSON.parse(readFileSync5(authPath, "utf8")) : {};
|
|
20891
|
+
data[AGY_PROVIDER_ID] = {
|
|
20892
|
+
type: "oauth",
|
|
20893
|
+
refresh: authRecord.refresh,
|
|
20894
|
+
access: authRecord.access,
|
|
20895
|
+
expires: authRecord.expires
|
|
20896
|
+
};
|
|
20897
|
+
const tempPath = `${authPath}.${process.pid}.${randomUUID4()}.tmp`;
|
|
20898
|
+
let tempFileDescriptor;
|
|
20899
|
+
let ownsTempFile = false;
|
|
20962
20900
|
try {
|
|
20963
|
-
|
|
20964
|
-
|
|
20965
|
-
|
|
20901
|
+
tempFileDescriptor = openSync(tempPath, "wx", 384);
|
|
20902
|
+
ownsTempFile = true;
|
|
20903
|
+
writeFileSync5(tempFileDescriptor, JSON.stringify(data, null, 2), {
|
|
20904
|
+
encoding: "utf8"
|
|
20905
|
+
});
|
|
20906
|
+
closeSync(tempFileDescriptor);
|
|
20907
|
+
tempFileDescriptor = void 0;
|
|
20908
|
+
renameSync4(tempPath, authPath);
|
|
20909
|
+
} catch (error45) {
|
|
20910
|
+
if (tempFileDescriptor !== void 0) {
|
|
20911
|
+
try {
|
|
20912
|
+
closeSync(tempFileDescriptor);
|
|
20913
|
+
} catch {
|
|
20914
|
+
}
|
|
20966
20915
|
}
|
|
20967
|
-
|
|
20968
|
-
let data = {};
|
|
20969
|
-
if (existsSync6(authPath)) {
|
|
20916
|
+
if (ownsTempFile) {
|
|
20970
20917
|
try {
|
|
20971
|
-
|
|
20918
|
+
unlinkSync4(tempPath);
|
|
20972
20919
|
} catch {
|
|
20973
|
-
data = {};
|
|
20974
20920
|
}
|
|
20975
20921
|
}
|
|
20976
|
-
|
|
20977
|
-
type: "oauth",
|
|
20978
|
-
refresh: authRecord.refresh,
|
|
20979
|
-
access: authRecord.access,
|
|
20980
|
-
expires: authRecord.expires
|
|
20981
|
-
};
|
|
20982
|
-
writeFileSync5(authPath, JSON.stringify(data, null, 2), "utf8");
|
|
20983
|
-
} catch {
|
|
20922
|
+
throw error45;
|
|
20984
20923
|
}
|
|
20985
20924
|
}
|
|
20925
|
+
|
|
20926
|
+
// src/plugin/v2-fetch.ts
|
|
20986
20927
|
function createV2FetchInterceptor(getAuthSnapshot) {
|
|
20987
20928
|
return async function agyV2Fetch(input, init) {
|
|
20988
20929
|
const isGL = isGenerativeLanguageRequest(input);
|
|
20989
|
-
const isInternal =
|
|
20930
|
+
const isInternal = toUrlString(input).includes("cloudcode-pa.googleapis.com");
|
|
20990
20931
|
if (!isGL && !isInternal) {
|
|
20991
|
-
return
|
|
20932
|
+
return (globalThis.fetch || fetch)(input, init);
|
|
20992
20933
|
}
|
|
20993
20934
|
let rawAuth = getAuthSnapshot ? await getAuthSnapshot() : void 0;
|
|
20994
20935
|
if (!rawAuth) {
|
|
20995
20936
|
rawAuth = loadStoredAuthFromJson();
|
|
20996
20937
|
}
|
|
20997
20938
|
if (!rawAuth || !isOAuthAuth(rawAuth)) {
|
|
20998
|
-
return
|
|
20939
|
+
return (globalThis.fetch || fetch)(input, init);
|
|
20999
20940
|
}
|
|
21000
20941
|
let authRecord = resolveCachedAuth(rawAuth);
|
|
21001
20942
|
if (accessTokenExpired(authRecord)) {
|
|
@@ -21006,19 +20947,19 @@ function createV2FetchInterceptor(getAuthSnapshot) {
|
|
|
21006
20947
|
}
|
|
21007
20948
|
}
|
|
21008
20949
|
if (!authRecord.access) {
|
|
21009
|
-
return
|
|
20950
|
+
return (globalThis.fetch || fetch)(input, init);
|
|
21010
20951
|
}
|
|
21011
20952
|
if (isInternal) {
|
|
21012
|
-
const hasAuth =
|
|
20953
|
+
const hasAuth = getSafeHeader(init?.headers, "Authorization") !== void 0;
|
|
21013
20954
|
if (hasAuth) {
|
|
21014
|
-
return
|
|
20955
|
+
return (globalThis.fetch || fetch)(input, init);
|
|
21015
20956
|
}
|
|
21016
20957
|
const userAgent = buildAgyCliUserAgent();
|
|
21017
|
-
const headers =
|
|
20958
|
+
const headers = setSafeHeaders(init?.headers, {
|
|
21018
20959
|
Authorization: `Bearer ${authRecord.access}`,
|
|
21019
20960
|
"User-Agent": userAgent
|
|
21020
20961
|
});
|
|
21021
|
-
return
|
|
20962
|
+
return (globalThis.fetch || fetch)(input, {
|
|
21022
20963
|
...init,
|
|
21023
20964
|
headers
|
|
21024
20965
|
});
|
|
@@ -21044,7 +20985,7 @@ function createV2FetchInterceptor(getAuthSnapshot) {
|
|
|
21044
20985
|
let modifiedInput = input;
|
|
21045
20986
|
if (isGL && originalRequestedModel) {
|
|
21046
20987
|
const originalBase = originalRequestedModel.replace("google-agy/", "");
|
|
21047
|
-
const resolvedBase =
|
|
20988
|
+
const resolvedBase = resolveModelTier(originalBase, init);
|
|
21048
20989
|
if (originalBase !== resolvedBase) {
|
|
21049
20990
|
if (typeof modifiedInput === "string") {
|
|
21050
20991
|
modifiedInput = modifiedInput.replace(`models/${originalBase}`, `models/${resolvedBase}`);
|
|
@@ -21064,7 +21005,7 @@ function createV2FetchInterceptor(getAuthSnapshot) {
|
|
|
21064
21005
|
const chatLogger = createChatLogger();
|
|
21065
21006
|
if (chatLogger) {
|
|
21066
21007
|
chatLogger.logRequest(
|
|
21067
|
-
|
|
21008
|
+
toUrlString(transformed.request),
|
|
21068
21009
|
transformed.init.method || "GET",
|
|
21069
21010
|
transformed.init.headers,
|
|
21070
21011
|
transformed.init.body
|
|
@@ -21081,6 +21022,304 @@ function createV2FetchInterceptor(getAuthSnapshot) {
|
|
|
21081
21022
|
);
|
|
21082
21023
|
};
|
|
21083
21024
|
}
|
|
21025
|
+
|
|
21026
|
+
// src/plugin/v2-session.ts
|
|
21027
|
+
function createV2HttpRequestHook(state = {}) {
|
|
21028
|
+
return async (event) => {
|
|
21029
|
+
if (!event) return;
|
|
21030
|
+
const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
|
|
21031
|
+
const isGL = isGenerativeLanguageRequest(rawUrl);
|
|
21032
|
+
const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
|
|
21033
|
+
if (!isGL && !isInternal) {
|
|
21034
|
+
return;
|
|
21035
|
+
}
|
|
21036
|
+
event.headers = event.headers || {};
|
|
21037
|
+
let modelName;
|
|
21038
|
+
let rawAuth = event.auth;
|
|
21039
|
+
if (rawAuth && !rawAuth.type) {
|
|
21040
|
+
const tokenVal = rawAuth.access || rawAuth.token;
|
|
21041
|
+
if (tokenVal || rawAuth.refresh) {
|
|
21042
|
+
rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
|
|
21043
|
+
}
|
|
21044
|
+
}
|
|
21045
|
+
if (!rawAuth || !isOAuthAuth(rawAuth)) {
|
|
21046
|
+
rawAuth = loadStoredAuthFromJson();
|
|
21047
|
+
}
|
|
21048
|
+
let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
|
|
21049
|
+
if (authRecord && accessTokenExpired(authRecord)) {
|
|
21050
|
+
const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
|
|
21051
|
+
} } });
|
|
21052
|
+
if (refreshed) {
|
|
21053
|
+
authRecord = refreshed;
|
|
21054
|
+
try {
|
|
21055
|
+
saveStoredAuthToJson(refreshed);
|
|
21056
|
+
} catch {
|
|
21057
|
+
console.warn("[Agy Auth] Refreshed credentials could not be persisted; the current request will continue.");
|
|
21058
|
+
}
|
|
21059
|
+
}
|
|
21060
|
+
}
|
|
21061
|
+
if (isGL) {
|
|
21062
|
+
const parsed = parseGenerativeLanguageRequest(rawUrl);
|
|
21063
|
+
modelName = parsed?.effectiveModel;
|
|
21064
|
+
if (modelName) {
|
|
21065
|
+
state.lastInterceptedModel = modelName;
|
|
21066
|
+
}
|
|
21067
|
+
if (typeof event.headers.delete === "function") {
|
|
21068
|
+
event.headers.delete("x-goog-api-key");
|
|
21069
|
+
event.headers.delete("api-key");
|
|
21070
|
+
} else {
|
|
21071
|
+
for (const key of Object.keys(event.headers)) {
|
|
21072
|
+
const lower = key.toLowerCase();
|
|
21073
|
+
if (lower === "x-goog-api-key" || lower === "api-key") {
|
|
21074
|
+
delete event.headers[key];
|
|
21075
|
+
}
|
|
21076
|
+
}
|
|
21077
|
+
}
|
|
21078
|
+
if (event.request?.headers) {
|
|
21079
|
+
if (typeof event.request.headers.delete === "function") {
|
|
21080
|
+
event.request.headers.delete("x-goog-api-key");
|
|
21081
|
+
event.request.headers.delete("api-key");
|
|
21082
|
+
} else {
|
|
21083
|
+
for (const key of Object.keys(event.request.headers)) {
|
|
21084
|
+
const lower = key.toLowerCase();
|
|
21085
|
+
if (lower === "x-goog-api-key" || lower === "api-key") {
|
|
21086
|
+
delete event.request.headers[key];
|
|
21087
|
+
}
|
|
21088
|
+
}
|
|
21089
|
+
}
|
|
21090
|
+
}
|
|
21091
|
+
let cleanUrl = rawUrl;
|
|
21092
|
+
try {
|
|
21093
|
+
const parsedUrl = new URL(rawUrl);
|
|
21094
|
+
let urlChanged = false;
|
|
21095
|
+
for (const param of ["key", "x-goog-api-key", "api-key"]) {
|
|
21096
|
+
if (parsedUrl.searchParams.has(param)) {
|
|
21097
|
+
parsedUrl.searchParams.delete(param);
|
|
21098
|
+
urlChanged = true;
|
|
21099
|
+
}
|
|
21100
|
+
}
|
|
21101
|
+
if (urlChanged) {
|
|
21102
|
+
cleanUrl = parsedUrl.toString();
|
|
21103
|
+
}
|
|
21104
|
+
} catch {
|
|
21105
|
+
}
|
|
21106
|
+
if (authRecord && authRecord.access) {
|
|
21107
|
+
let projectContext;
|
|
21108
|
+
try {
|
|
21109
|
+
projectContext = await ensureProjectContext(
|
|
21110
|
+
authRecord,
|
|
21111
|
+
{ auth: { set: async () => {
|
|
21112
|
+
} } },
|
|
21113
|
+
void 0,
|
|
21114
|
+
modelName
|
|
21115
|
+
);
|
|
21116
|
+
} catch {
|
|
21117
|
+
projectContext = {
|
|
21118
|
+
effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
|
|
21119
|
+
auth: authRecord
|
|
21120
|
+
};
|
|
21121
|
+
}
|
|
21122
|
+
const originalRequestedModel = modelName;
|
|
21123
|
+
let modifiedUrl = cleanUrl;
|
|
21124
|
+
if (originalRequestedModel) {
|
|
21125
|
+
const originalBase = originalRequestedModel.replace("google-agy/", "");
|
|
21126
|
+
const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
|
|
21127
|
+
const resolvedBase = resolveModelTier(originalBase, { headers: initHeaders });
|
|
21128
|
+
if (originalBase !== resolvedBase) {
|
|
21129
|
+
modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
|
|
21130
|
+
}
|
|
21131
|
+
}
|
|
21132
|
+
let bodyPayload = event.body;
|
|
21133
|
+
if (bodyPayload === void 0 && event.request) {
|
|
21134
|
+
if (typeof event.request.clone === "function") {
|
|
21135
|
+
try {
|
|
21136
|
+
bodyPayload = await event.request.clone().text();
|
|
21137
|
+
} catch {
|
|
21138
|
+
}
|
|
21139
|
+
} else if (event.request.body !== void 0) {
|
|
21140
|
+
bodyPayload = event.request.body;
|
|
21141
|
+
}
|
|
21142
|
+
}
|
|
21143
|
+
let preExistingUserAgent;
|
|
21144
|
+
if (typeof event.headers?.get === "function") {
|
|
21145
|
+
preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
|
|
21146
|
+
} else if (event.headers && typeof event.headers === "object") {
|
|
21147
|
+
preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
|
|
21148
|
+
}
|
|
21149
|
+
if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
|
|
21150
|
+
preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
|
|
21151
|
+
} else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
|
|
21152
|
+
preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
|
|
21153
|
+
}
|
|
21154
|
+
const method = event.method || event.request?.method || "POST";
|
|
21155
|
+
const requestHeaders = event.headers || event.request?.headers;
|
|
21156
|
+
const transformed = prepareAgyRequest(
|
|
21157
|
+
modifiedUrl,
|
|
21158
|
+
{
|
|
21159
|
+
method,
|
|
21160
|
+
headers: requestHeaders,
|
|
21161
|
+
body: bodyPayload
|
|
21162
|
+
},
|
|
21163
|
+
authRecord.access,
|
|
21164
|
+
projectContext.effectiveProjectId
|
|
21165
|
+
);
|
|
21166
|
+
const targetUrl = toUrlString(transformed.request);
|
|
21167
|
+
if (typeof event.url === "string") {
|
|
21168
|
+
event.url = targetUrl;
|
|
21169
|
+
}
|
|
21170
|
+
if (event.request && typeof event.request === "object") {
|
|
21171
|
+
if (typeof Request !== "undefined" && event.request instanceof Request) {
|
|
21172
|
+
event.request = new Request(targetUrl, {
|
|
21173
|
+
method: transformed.init.method,
|
|
21174
|
+
headers: transformed.init.headers,
|
|
21175
|
+
body: transformed.init.body
|
|
21176
|
+
});
|
|
21177
|
+
} else if (typeof event.request.url === "string") {
|
|
21178
|
+
try {
|
|
21179
|
+
event.request.url = targetUrl;
|
|
21180
|
+
} catch {
|
|
21181
|
+
}
|
|
21182
|
+
}
|
|
21183
|
+
}
|
|
21184
|
+
const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
|
|
21185
|
+
for (const [k, v] of headerEntries) {
|
|
21186
|
+
const lowerK = k.toLowerCase();
|
|
21187
|
+
if (lowerK === "user-agent") {
|
|
21188
|
+
if (preExistingUserAgent) {
|
|
21189
|
+
continue;
|
|
21190
|
+
}
|
|
21191
|
+
if (typeof event.headers?.set === "function") {
|
|
21192
|
+
event.headers.set("User-Agent", v);
|
|
21193
|
+
} else if (event.headers) {
|
|
21194
|
+
event.headers["User-Agent"] = v;
|
|
21195
|
+
}
|
|
21196
|
+
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21197
|
+
event.request.headers.set("User-Agent", v);
|
|
21198
|
+
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21199
|
+
event.request.headers["User-Agent"] = v;
|
|
21200
|
+
}
|
|
21201
|
+
continue;
|
|
21202
|
+
}
|
|
21203
|
+
if (typeof event.headers?.set === "function") {
|
|
21204
|
+
event.headers.set(k, v);
|
|
21205
|
+
} else if (event.headers) {
|
|
21206
|
+
event.headers[k] = v;
|
|
21207
|
+
}
|
|
21208
|
+
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21209
|
+
event.request.headers.set(k, v);
|
|
21210
|
+
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21211
|
+
event.request.headers[k] = v;
|
|
21212
|
+
}
|
|
21213
|
+
}
|
|
21214
|
+
if (transformed.init.body !== void 0) {
|
|
21215
|
+
event.body = transformed.init.body;
|
|
21216
|
+
if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
|
|
21217
|
+
event.request.body = transformed.init.body;
|
|
21218
|
+
}
|
|
21219
|
+
}
|
|
21220
|
+
} else {
|
|
21221
|
+
if (typeof event.url === "string") {
|
|
21222
|
+
event.url = cleanUrl;
|
|
21223
|
+
}
|
|
21224
|
+
if (event.request && typeof event.request === "object") {
|
|
21225
|
+
if (typeof Request !== "undefined" && event.request instanceof Request) {
|
|
21226
|
+
event.request = new Request(cleanUrl, event.request);
|
|
21227
|
+
} else if (typeof event.request.url === "string") {
|
|
21228
|
+
try {
|
|
21229
|
+
event.request.url = cleanUrl;
|
|
21230
|
+
} catch {
|
|
21231
|
+
}
|
|
21232
|
+
}
|
|
21233
|
+
}
|
|
21234
|
+
}
|
|
21235
|
+
}
|
|
21236
|
+
if (authRecord && authRecord.access) {
|
|
21237
|
+
if (typeof event.headers?.set === "function") {
|
|
21238
|
+
event.headers.set("Authorization", `Bearer ${authRecord.access}`);
|
|
21239
|
+
} else if (event.headers) {
|
|
21240
|
+
event.headers["Authorization"] = `Bearer ${authRecord.access}`;
|
|
21241
|
+
}
|
|
21242
|
+
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21243
|
+
event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
|
|
21244
|
+
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21245
|
+
event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
|
|
21246
|
+
}
|
|
21247
|
+
}
|
|
21248
|
+
const userAgent = buildAgyCliUserAgent(modelName);
|
|
21249
|
+
if (typeof event.headers?.set === "function") {
|
|
21250
|
+
if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
|
|
21251
|
+
event.headers.set("User-Agent", userAgent);
|
|
21252
|
+
}
|
|
21253
|
+
} else if (event.headers) {
|
|
21254
|
+
if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
|
|
21255
|
+
event.headers["User-Agent"] = userAgent;
|
|
21256
|
+
}
|
|
21257
|
+
}
|
|
21258
|
+
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21259
|
+
if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
|
|
21260
|
+
event.request.headers.set("User-Agent", userAgent);
|
|
21261
|
+
}
|
|
21262
|
+
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21263
|
+
if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
|
|
21264
|
+
event.request.headers["User-Agent"] = userAgent;
|
|
21265
|
+
}
|
|
21266
|
+
}
|
|
21267
|
+
};
|
|
21268
|
+
}
|
|
21269
|
+
function createV2HttpResponseHook(state = {}) {
|
|
21270
|
+
return async (event) => {
|
|
21271
|
+
if (!event || !event.response) return;
|
|
21272
|
+
const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
|
|
21273
|
+
const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
|
|
21274
|
+
if (isInternal && event.response instanceof Response) {
|
|
21275
|
+
const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
|
|
21276
|
+
const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || state.lastInterceptedModel;
|
|
21277
|
+
const transformed = await transformAgyResponse(
|
|
21278
|
+
event.response,
|
|
21279
|
+
!!isStreaming,
|
|
21280
|
+
null,
|
|
21281
|
+
parsedModel,
|
|
21282
|
+
void 0,
|
|
21283
|
+
void 0
|
|
21284
|
+
);
|
|
21285
|
+
event.response = transformed;
|
|
21286
|
+
}
|
|
21287
|
+
};
|
|
21288
|
+
}
|
|
21289
|
+
function createV2RetryHook() {
|
|
21290
|
+
return async (event) => {
|
|
21291
|
+
if (!event) return;
|
|
21292
|
+
const response = event.response;
|
|
21293
|
+
if (response instanceof Response) {
|
|
21294
|
+
if (response.status === 429 || response.status === 503) {
|
|
21295
|
+
const quota = await classifyQuotaResponse(response);
|
|
21296
|
+
if (quota?.retryDelayMs) {
|
|
21297
|
+
event.retryDelayMs = quota.retryDelayMs;
|
|
21298
|
+
} else {
|
|
21299
|
+
event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
|
|
21300
|
+
}
|
|
21301
|
+
}
|
|
21302
|
+
} else if (event.details && Array.isArray(event.details)) {
|
|
21303
|
+
const retryInfo = event.details.find(
|
|
21304
|
+
(d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
|
|
21305
|
+
);
|
|
21306
|
+
if (retryInfo?.retryDelay) {
|
|
21307
|
+
const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
|
|
21308
|
+
if (delayMs !== null) {
|
|
21309
|
+
event.retryDelayMs = delayMs;
|
|
21310
|
+
}
|
|
21311
|
+
}
|
|
21312
|
+
}
|
|
21313
|
+
};
|
|
21314
|
+
}
|
|
21315
|
+
function registerV2SessionHooks(ctx) {
|
|
21316
|
+
const state = {};
|
|
21317
|
+
ctx.session.hook("http.request", createV2HttpRequestHook(state), { providerID: AGY_PROVIDER_ID });
|
|
21318
|
+
ctx.session.hook("http.response", createV2HttpResponseHook(state), { providerID: AGY_PROVIDER_ID });
|
|
21319
|
+
ctx.session.hook("retry", createV2RetryHook(), { providerID: AGY_PROVIDER_ID });
|
|
21320
|
+
}
|
|
21321
|
+
|
|
21322
|
+
// src/plugin/v2.ts
|
|
21084
21323
|
async function setupOpenCodeV2(ctx) {
|
|
21085
21324
|
const resolveVariants = (modelId) => {
|
|
21086
21325
|
const mapping = TIER_MAPPING[modelId];
|
|
@@ -21341,7 +21580,14 @@ async function setupOpenCodeV2(ctx) {
|
|
|
21341
21580
|
};
|
|
21342
21581
|
} catch {
|
|
21343
21582
|
}
|
|
21344
|
-
|
|
21583
|
+
try {
|
|
21584
|
+
saveStoredAuthToJson(authRecord);
|
|
21585
|
+
} catch {
|
|
21586
|
+
return {
|
|
21587
|
+
type: "failed",
|
|
21588
|
+
error: "Google authentication succeeded but AGY credentials could not be stored. Check filesystem access and retry."
|
|
21589
|
+
};
|
|
21590
|
+
}
|
|
21345
21591
|
return {
|
|
21346
21592
|
type: "oauth",
|
|
21347
21593
|
methodID: "oauth",
|
|
@@ -21362,292 +21608,7 @@ async function setupOpenCodeV2(ctx) {
|
|
|
21362
21608
|
event.options.apiKey = "dummy";
|
|
21363
21609
|
event.options.fetch = createV2FetchInterceptor();
|
|
21364
21610
|
});
|
|
21365
|
-
|
|
21366
|
-
ctx.session.hook(
|
|
21367
|
-
"http.request",
|
|
21368
|
-
async (event) => {
|
|
21369
|
-
if (!event) return;
|
|
21370
|
-
const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
|
|
21371
|
-
const isGL = isGenerativeLanguageRequest(rawUrl);
|
|
21372
|
-
const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
|
|
21373
|
-
if (!isGL && !isInternal) {
|
|
21374
|
-
return;
|
|
21375
|
-
}
|
|
21376
|
-
event.headers = event.headers || {};
|
|
21377
|
-
let modelName;
|
|
21378
|
-
let rawAuth = event.auth;
|
|
21379
|
-
if (rawAuth && !rawAuth.type) {
|
|
21380
|
-
const tokenVal = rawAuth.access || rawAuth.token;
|
|
21381
|
-
if (tokenVal || rawAuth.refresh) {
|
|
21382
|
-
rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
|
|
21383
|
-
}
|
|
21384
|
-
}
|
|
21385
|
-
if (!rawAuth || !isOAuthAuth(rawAuth)) {
|
|
21386
|
-
rawAuth = loadStoredAuthFromJson();
|
|
21387
|
-
}
|
|
21388
|
-
let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
|
|
21389
|
-
if (authRecord && accessTokenExpired(authRecord)) {
|
|
21390
|
-
const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
|
|
21391
|
-
} } });
|
|
21392
|
-
if (refreshed) {
|
|
21393
|
-
authRecord = refreshed;
|
|
21394
|
-
saveStoredAuthToJson(refreshed);
|
|
21395
|
-
}
|
|
21396
|
-
}
|
|
21397
|
-
if (isGL) {
|
|
21398
|
-
const parsed = parseGenerativeLanguageRequest(rawUrl);
|
|
21399
|
-
modelName = parsed?.effectiveModel;
|
|
21400
|
-
if (modelName) {
|
|
21401
|
-
lastInterceptedModel = modelName;
|
|
21402
|
-
}
|
|
21403
|
-
if (typeof event.headers.delete === "function") {
|
|
21404
|
-
event.headers.delete("x-goog-api-key");
|
|
21405
|
-
event.headers.delete("api-key");
|
|
21406
|
-
} else {
|
|
21407
|
-
for (const key of Object.keys(event.headers)) {
|
|
21408
|
-
const lower = key.toLowerCase();
|
|
21409
|
-
if (lower === "x-goog-api-key" || lower === "api-key") {
|
|
21410
|
-
delete event.headers[key];
|
|
21411
|
-
}
|
|
21412
|
-
}
|
|
21413
|
-
}
|
|
21414
|
-
if (event.request?.headers) {
|
|
21415
|
-
if (typeof event.request.headers.delete === "function") {
|
|
21416
|
-
event.request.headers.delete("x-goog-api-key");
|
|
21417
|
-
event.request.headers.delete("api-key");
|
|
21418
|
-
} else {
|
|
21419
|
-
for (const key of Object.keys(event.request.headers)) {
|
|
21420
|
-
const lower = key.toLowerCase();
|
|
21421
|
-
if (lower === "x-goog-api-key" || lower === "api-key") {
|
|
21422
|
-
delete event.request.headers[key];
|
|
21423
|
-
}
|
|
21424
|
-
}
|
|
21425
|
-
}
|
|
21426
|
-
}
|
|
21427
|
-
let cleanUrl = rawUrl;
|
|
21428
|
-
try {
|
|
21429
|
-
const parsedUrl = new URL(rawUrl);
|
|
21430
|
-
let urlChanged = false;
|
|
21431
|
-
for (const param of ["key", "x-goog-api-key", "api-key"]) {
|
|
21432
|
-
if (parsedUrl.searchParams.has(param)) {
|
|
21433
|
-
parsedUrl.searchParams.delete(param);
|
|
21434
|
-
urlChanged = true;
|
|
21435
|
-
}
|
|
21436
|
-
}
|
|
21437
|
-
if (urlChanged) {
|
|
21438
|
-
cleanUrl = parsedUrl.toString();
|
|
21439
|
-
}
|
|
21440
|
-
} catch {
|
|
21441
|
-
}
|
|
21442
|
-
if (authRecord && authRecord.access) {
|
|
21443
|
-
let projectContext;
|
|
21444
|
-
try {
|
|
21445
|
-
projectContext = await ensureProjectContext(
|
|
21446
|
-
authRecord,
|
|
21447
|
-
{ auth: { set: async () => {
|
|
21448
|
-
} } },
|
|
21449
|
-
void 0,
|
|
21450
|
-
modelName
|
|
21451
|
-
);
|
|
21452
|
-
} catch {
|
|
21453
|
-
projectContext = {
|
|
21454
|
-
effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
|
|
21455
|
-
auth: authRecord
|
|
21456
|
-
};
|
|
21457
|
-
}
|
|
21458
|
-
const originalRequestedModel = modelName;
|
|
21459
|
-
let modifiedUrl = cleanUrl;
|
|
21460
|
-
if (originalRequestedModel) {
|
|
21461
|
-
const originalBase = originalRequestedModel.replace("google-agy/", "");
|
|
21462
|
-
const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
|
|
21463
|
-
const resolvedBase = resolveModelTier2(originalBase, { headers: initHeaders });
|
|
21464
|
-
if (originalBase !== resolvedBase) {
|
|
21465
|
-
modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
|
|
21466
|
-
}
|
|
21467
|
-
}
|
|
21468
|
-
let bodyPayload = event.body;
|
|
21469
|
-
if (bodyPayload === void 0 && event.request) {
|
|
21470
|
-
if (typeof event.request.clone === "function") {
|
|
21471
|
-
try {
|
|
21472
|
-
bodyPayload = await event.request.clone().text();
|
|
21473
|
-
} catch {
|
|
21474
|
-
}
|
|
21475
|
-
} else if (event.request.body !== void 0) {
|
|
21476
|
-
bodyPayload = event.request.body;
|
|
21477
|
-
}
|
|
21478
|
-
}
|
|
21479
|
-
let preExistingUserAgent;
|
|
21480
|
-
if (typeof event.headers?.get === "function") {
|
|
21481
|
-
preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
|
|
21482
|
-
} else if (event.headers && typeof event.headers === "object") {
|
|
21483
|
-
preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
|
|
21484
|
-
}
|
|
21485
|
-
if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
|
|
21486
|
-
preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
|
|
21487
|
-
} else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
|
|
21488
|
-
preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
|
|
21489
|
-
}
|
|
21490
|
-
const method = event.method || event.request?.method || "POST";
|
|
21491
|
-
const requestHeaders = event.headers || event.request?.headers;
|
|
21492
|
-
const transformed = prepareAgyRequest(
|
|
21493
|
-
modifiedUrl,
|
|
21494
|
-
{
|
|
21495
|
-
method,
|
|
21496
|
-
headers: requestHeaders,
|
|
21497
|
-
body: bodyPayload
|
|
21498
|
-
},
|
|
21499
|
-
authRecord.access,
|
|
21500
|
-
projectContext.effectiveProjectId
|
|
21501
|
-
);
|
|
21502
|
-
const targetUrl = toUrlString2(transformed.request);
|
|
21503
|
-
if (typeof event.url === "string") {
|
|
21504
|
-
event.url = targetUrl;
|
|
21505
|
-
}
|
|
21506
|
-
if (event.request && typeof event.request === "object") {
|
|
21507
|
-
if (typeof Request !== "undefined" && event.request instanceof Request) {
|
|
21508
|
-
event.request = new Request(targetUrl, {
|
|
21509
|
-
method: transformed.init.method,
|
|
21510
|
-
headers: transformed.init.headers,
|
|
21511
|
-
body: transformed.init.body
|
|
21512
|
-
});
|
|
21513
|
-
} else if (typeof event.request.url === "string") {
|
|
21514
|
-
try {
|
|
21515
|
-
event.request.url = targetUrl;
|
|
21516
|
-
} catch {
|
|
21517
|
-
}
|
|
21518
|
-
}
|
|
21519
|
-
}
|
|
21520
|
-
const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
|
|
21521
|
-
for (const [k, v] of headerEntries) {
|
|
21522
|
-
const lowerK = k.toLowerCase();
|
|
21523
|
-
if (lowerK === "user-agent") {
|
|
21524
|
-
if (preExistingUserAgent) {
|
|
21525
|
-
continue;
|
|
21526
|
-
}
|
|
21527
|
-
if (typeof event.headers?.set === "function") {
|
|
21528
|
-
event.headers.set("User-Agent", v);
|
|
21529
|
-
} else if (event.headers) {
|
|
21530
|
-
event.headers["User-Agent"] = v;
|
|
21531
|
-
}
|
|
21532
|
-
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21533
|
-
event.request.headers.set("User-Agent", v);
|
|
21534
|
-
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21535
|
-
event.request.headers["User-Agent"] = v;
|
|
21536
|
-
}
|
|
21537
|
-
continue;
|
|
21538
|
-
}
|
|
21539
|
-
if (typeof event.headers?.set === "function") {
|
|
21540
|
-
event.headers.set(k, v);
|
|
21541
|
-
} else if (event.headers) {
|
|
21542
|
-
event.headers[k] = v;
|
|
21543
|
-
}
|
|
21544
|
-
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21545
|
-
event.request.headers.set(k, v);
|
|
21546
|
-
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21547
|
-
event.request.headers[k] = v;
|
|
21548
|
-
}
|
|
21549
|
-
}
|
|
21550
|
-
if (transformed.init.body !== void 0) {
|
|
21551
|
-
event.body = transformed.init.body;
|
|
21552
|
-
if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
|
|
21553
|
-
event.request.body = transformed.init.body;
|
|
21554
|
-
}
|
|
21555
|
-
}
|
|
21556
|
-
} else {
|
|
21557
|
-
if (typeof event.url === "string") {
|
|
21558
|
-
event.url = cleanUrl;
|
|
21559
|
-
}
|
|
21560
|
-
if (event.request && typeof event.request === "object") {
|
|
21561
|
-
if (typeof event.request.url === "string") {
|
|
21562
|
-
event.request.url = cleanUrl;
|
|
21563
|
-
}
|
|
21564
|
-
}
|
|
21565
|
-
}
|
|
21566
|
-
}
|
|
21567
|
-
if (authRecord && authRecord.access) {
|
|
21568
|
-
if (typeof event.headers?.set === "function") {
|
|
21569
|
-
event.headers.set("Authorization", `Bearer ${authRecord.access}`);
|
|
21570
|
-
} else if (event.headers) {
|
|
21571
|
-
event.headers["Authorization"] = `Bearer ${authRecord.access}`;
|
|
21572
|
-
}
|
|
21573
|
-
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21574
|
-
event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
|
|
21575
|
-
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21576
|
-
event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
|
|
21577
|
-
}
|
|
21578
|
-
}
|
|
21579
|
-
const userAgent = buildAgyCliUserAgent(modelName);
|
|
21580
|
-
if (typeof event.headers?.set === "function") {
|
|
21581
|
-
if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
|
|
21582
|
-
event.headers.set("User-Agent", userAgent);
|
|
21583
|
-
}
|
|
21584
|
-
} else if (event.headers) {
|
|
21585
|
-
if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
|
|
21586
|
-
event.headers["User-Agent"] = userAgent;
|
|
21587
|
-
}
|
|
21588
|
-
}
|
|
21589
|
-
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21590
|
-
if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
|
|
21591
|
-
event.request.headers.set("User-Agent", userAgent);
|
|
21592
|
-
}
|
|
21593
|
-
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21594
|
-
if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
|
|
21595
|
-
event.request.headers["User-Agent"] = userAgent;
|
|
21596
|
-
}
|
|
21597
|
-
}
|
|
21598
|
-
},
|
|
21599
|
-
{ providerID: AGY_PROVIDER_ID }
|
|
21600
|
-
);
|
|
21601
|
-
ctx.session.hook(
|
|
21602
|
-
"http.response",
|
|
21603
|
-
async (event) => {
|
|
21604
|
-
if (!event || !event.response) return;
|
|
21605
|
-
const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
|
|
21606
|
-
const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
|
|
21607
|
-
if (isInternal && event.response instanceof Response) {
|
|
21608
|
-
const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
|
|
21609
|
-
const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || lastInterceptedModel;
|
|
21610
|
-
const transformed = await transformAgyResponse(
|
|
21611
|
-
event.response,
|
|
21612
|
-
!!isStreaming,
|
|
21613
|
-
null,
|
|
21614
|
-
parsedModel,
|
|
21615
|
-
void 0,
|
|
21616
|
-
void 0
|
|
21617
|
-
);
|
|
21618
|
-
event.response = transformed;
|
|
21619
|
-
}
|
|
21620
|
-
},
|
|
21621
|
-
{ providerID: AGY_PROVIDER_ID }
|
|
21622
|
-
);
|
|
21623
|
-
ctx.session.hook(
|
|
21624
|
-
"retry",
|
|
21625
|
-
async (event) => {
|
|
21626
|
-
if (!event) return;
|
|
21627
|
-
const response = event.response;
|
|
21628
|
-
if (response instanceof Response) {
|
|
21629
|
-
if (response.status === 429 || response.status === 503) {
|
|
21630
|
-
const quota = await classifyQuotaResponse(response);
|
|
21631
|
-
if (quota?.retryDelayMs) {
|
|
21632
|
-
event.retryDelayMs = quota.retryDelayMs;
|
|
21633
|
-
} else {
|
|
21634
|
-
event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
|
|
21635
|
-
}
|
|
21636
|
-
}
|
|
21637
|
-
} else if (event.details && Array.isArray(event.details)) {
|
|
21638
|
-
const retryInfo = event.details.find(
|
|
21639
|
-
(d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
|
|
21640
|
-
);
|
|
21641
|
-
if (retryInfo?.retryDelay) {
|
|
21642
|
-
const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
|
|
21643
|
-
if (delayMs !== null) {
|
|
21644
|
-
event.retryDelayMs = delayMs;
|
|
21645
|
-
}
|
|
21646
|
-
}
|
|
21647
|
-
}
|
|
21648
|
-
},
|
|
21649
|
-
{ providerID: AGY_PROVIDER_ID }
|
|
21650
|
-
);
|
|
21611
|
+
registerV2SessionHooks(ctx);
|
|
21651
21612
|
}
|
|
21652
21613
|
var v2PluginDefinition = defineOpenCodeV2Plugin({
|
|
21653
21614
|
id: AGY_PROVIDER_ID,
|