@anthonyhaussman/opencode-agy-auth 1.2.7-alpha.2 → 1.2.7-alpha.4

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