@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 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
- var AGY_QUOTA_COMMAND = "agyquota";
20224
- var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20225
-
20226
- Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20227
- Do not call other tools.
20228
- `;
20229
- var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20230
- 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.
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
- Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
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
- import { existsSync as existsSync6, mkdirSync as mkdirSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "fs";
20842
- import "http";
20843
- var AGY_V2_QUOTA_COMMAND = "agy-quota";
20844
- var AGY_V2_QUOTA_SUMMARY_COMMAND = "agy-quota-summary";
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 targetKey = key.toLowerCase();
20860
- if (typeof headers.get === "function") {
20861
- try {
20862
- return headers.get(targetKey) || void 0;
20863
- } catch {
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
- const dirPath = join6(homedir4(), ".local", "share", "opencode");
20964
- if (!existsSync6(dirPath)) {
20965
- mkdirSync5(dirPath, { recursive: true });
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
- const authPath = join6(dirPath, "auth.json");
20968
- let data = {};
20969
- if (existsSync6(authPath)) {
20916
+ if (ownsTempFile) {
20970
20917
  try {
20971
- data = JSON.parse(readFileSync5(authPath, "utf8")) || {};
20918
+ unlinkSync4(tempPath);
20972
20919
  } catch {
20973
- data = {};
20974
20920
  }
20975
20921
  }
20976
- data[AGY_PROVIDER_ID] = {
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 = toUrlString2(input).includes("cloudcode-pa.googleapis.com");
20930
+ const isInternal = toUrlString(input).includes("cloudcode-pa.googleapis.com");
20990
20931
  if (!isGL && !isInternal) {
20991
- return agyFetch(input, init);
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 agyFetch(input, init);
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 agyFetch(input, init);
20950
+ return (globalThis.fetch || fetch)(input, init);
21010
20951
  }
21011
20952
  if (isInternal) {
21012
- const hasAuth = getSafeHeader2(init?.headers, "Authorization") !== void 0;
20953
+ const hasAuth = getSafeHeader(init?.headers, "Authorization") !== void 0;
21013
20954
  if (hasAuth) {
21014
- return agyFetch(input, init);
20955
+ return (globalThis.fetch || fetch)(input, init);
21015
20956
  }
21016
20957
  const userAgent = buildAgyCliUserAgent();
21017
- const headers = setSafeHeaders2(init?.headers, {
20958
+ const headers = setSafeHeaders(init?.headers, {
21018
20959
  Authorization: `Bearer ${authRecord.access}`,
21019
20960
  "User-Agent": userAgent
21020
20961
  });
21021
- return agyFetch(input, {
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 = resolveModelTier2(originalBase, init);
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
- toUrlString2(transformed.request),
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
- saveStoredAuthToJson(authRecord);
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
- let lastInterceptedModel;
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,