@anthonyhaussman/opencode-agy-auth 1.2.7-alpha.1 → 1.2.7-alpha.3

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
@@ -268,7 +268,7 @@ function createAgyActivityRequestId() {
268
268
  import os from "os";
269
269
 
270
270
  // src/sdk/agy-cli-version.ts
271
- var AGY_CLI_VERSION = "1.2.6";
271
+ var AGY_CLI_VERSION = "1.2.7";
272
272
 
273
273
  // src/sdk/user-agent.ts
274
274
  var cachedUserAgent = null;
@@ -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,
@@ -16060,6 +16072,7 @@ var models_default = {
16060
16072
  }
16061
16073
  },
16062
16074
  experimentIds: [
16075
+ 106738697,
16063
16076
  106329234,
16064
16077
  106519115,
16065
16078
  105979552,
@@ -16168,7 +16181,7 @@ var models_default = {
16168
16181
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16169
16182
  quotaInfo: {
16170
16183
  remainingFraction: 1,
16171
- resetTime: "2026-09-18T16:07:34Z"
16184
+ resetTime: "2026-09-19T15:08:03Z"
16172
16185
  },
16173
16186
  recommended: true,
16174
16187
  supportedMimeTypes: {
@@ -16207,7 +16220,7 @@ var models_default = {
16207
16220
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16208
16221
  quotaInfo: {
16209
16222
  remainingFraction: 1,
16210
- resetTime: "2026-09-18T16:07:34Z"
16223
+ resetTime: "2026-09-19T15:08:03Z"
16211
16224
  },
16212
16225
  recommended: true,
16213
16226
  supportedMimeTypes: {
@@ -16243,8 +16256,8 @@ var models_default = {
16243
16256
  },
16244
16257
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16245
16258
  quotaInfo: {
16246
- remainingFraction: 0.7753168,
16247
- resetTime: "2026-09-18T11:38:10Z"
16259
+ remainingFraction: 0.964089,
16260
+ resetTime: "2026-09-19T14:53:58Z"
16248
16261
  },
16249
16262
  recommended: true,
16250
16263
  supportedMimeTypes: {
@@ -16326,8 +16339,8 @@ var models_default = {
16326
16339
  },
16327
16340
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16328
16341
  quotaInfo: {
16329
- remainingFraction: 0.7753168,
16330
- resetTime: "2026-09-18T11:38:10Z"
16342
+ remainingFraction: 0.964089,
16343
+ resetTime: "2026-09-19T14:53:58Z"
16331
16344
  },
16332
16345
  recommended: true,
16333
16346
  supportedMimeTypes: {
@@ -16409,8 +16422,8 @@ var models_default = {
16409
16422
  },
16410
16423
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16411
16424
  quotaInfo: {
16412
- remainingFraction: 0.7753168,
16413
- resetTime: "2026-09-18T11:38:10Z"
16425
+ remainingFraction: 0.964089,
16426
+ resetTime: "2026-09-19T14:53:58Z"
16414
16427
  },
16415
16428
  recommended: true,
16416
16429
  supportedMimeTypes: {
@@ -16489,8 +16502,8 @@ var models_default = {
16489
16502
  },
16490
16503
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16491
16504
  quotaInfo: {
16492
- remainingFraction: 0.7753168,
16493
- resetTime: "2026-09-18T11:38:10Z"
16505
+ remainingFraction: 0.964089,
16506
+ resetTime: "2026-09-19T14:53:58Z"
16494
16507
  },
16495
16508
  recommended: true,
16496
16509
  requiresImageOutputOutsideFunctionResponses: true,
@@ -16570,8 +16583,8 @@ var models_default = {
16570
16583
  },
16571
16584
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16572
16585
  quotaInfo: {
16573
- remainingFraction: 0.7753168,
16574
- resetTime: "2026-09-18T11:38:10Z"
16586
+ remainingFraction: 0.964089,
16587
+ resetTime: "2026-09-19T14:53:58Z"
16575
16588
  },
16576
16589
  recommended: true,
16577
16590
  supportedMimeTypes: {
@@ -16675,8 +16688,8 @@ var models_default = {
16675
16688
  },
16676
16689
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16677
16690
  quotaInfo: {
16678
- remainingFraction: 0.7753168,
16679
- resetTime: "2026-09-18T11:38:10Z"
16691
+ remainingFraction: 0.964089,
16692
+ resetTime: "2026-09-19T14:53:58Z"
16680
16693
  },
16681
16694
  recommended: true,
16682
16695
  supportedMimeTypes: {
@@ -16745,8 +16758,8 @@ var models_default = {
16745
16758
  model: "MODEL_PLACEHOLDER_M21",
16746
16759
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16747
16760
  quotaInfo: {
16748
- remainingFraction: 0.7753168,
16749
- resetTime: "2026-09-18T11:38:10Z"
16761
+ remainingFraction: 0.964089,
16762
+ resetTime: "2026-09-19T14:53:58Z"
16750
16763
  }
16751
16764
  },
16752
16765
  "gemini-3.1-flash-lite": {
@@ -16764,8 +16777,8 @@ var models_default = {
16764
16777
  },
16765
16778
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16766
16779
  quotaInfo: {
16767
- remainingFraction: 0.7753168,
16768
- resetTime: "2026-09-18T11:38:10Z"
16780
+ remainingFraction: 0.964089,
16781
+ resetTime: "2026-09-19T14:53:58Z"
16769
16782
  }
16770
16783
  },
16771
16784
  "gemini-3.1-pro-high": {
@@ -16796,8 +16809,8 @@ var models_default = {
16796
16809
  },
16797
16810
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16798
16811
  quotaInfo: {
16799
- remainingFraction: 0.7753168,
16800
- resetTime: "2026-09-18T11:38:10Z"
16812
+ remainingFraction: 0.964089,
16813
+ resetTime: "2026-09-19T14:53:58Z"
16801
16814
  },
16802
16815
  recommended: true,
16803
16816
  supportedMimeTypes: {
@@ -16887,8 +16900,8 @@ var models_default = {
16887
16900
  },
16888
16901
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16889
16902
  quotaInfo: {
16890
- remainingFraction: 0.7753168,
16891
- resetTime: "2026-09-18T11:38:10Z"
16903
+ remainingFraction: 0.964089,
16904
+ resetTime: "2026-09-19T14:53:58Z"
16892
16905
  },
16893
16906
  recommended: true,
16894
16907
  supportedMimeTypes: {
@@ -16992,8 +17005,8 @@ var models_default = {
16992
17005
  },
16993
17006
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16994
17007
  quotaInfo: {
16995
- remainingFraction: 0.7753168,
16996
- resetTime: "2026-09-18T11:38:10Z"
17008
+ remainingFraction: 0.964089,
17009
+ resetTime: "2026-09-19T14:53:58Z"
16997
17010
  },
16998
17011
  recommended: true,
16999
17012
  supportedMimeTypes: {
@@ -17075,8 +17088,8 @@ var models_default = {
17075
17088
  },
17076
17089
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17077
17090
  quotaInfo: {
17078
- remainingFraction: 0.7753168,
17079
- resetTime: "2026-09-18T11:38:10Z"
17091
+ remainingFraction: 0.964089,
17092
+ resetTime: "2026-09-19T14:53:58Z"
17080
17093
  },
17081
17094
  recommended: true,
17082
17095
  supportedMimeTypes: {
@@ -17182,8 +17195,8 @@ var models_default = {
17182
17195
  },
17183
17196
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17184
17197
  quotaInfo: {
17185
- remainingFraction: 0.7753168,
17186
- resetTime: "2026-09-18T11:38:10Z"
17198
+ remainingFraction: 0.964089,
17199
+ resetTime: "2026-09-19T14:53:58Z"
17187
17200
  },
17188
17201
  recommended: true,
17189
17202
  supportedMimeTypes: {
@@ -17301,8 +17314,8 @@ var models_default = {
17301
17314
  },
17302
17315
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17303
17316
  quotaInfo: {
17304
- remainingFraction: 0.7753168,
17305
- resetTime: "2026-09-18T11:38:10Z"
17317
+ remainingFraction: 0.964089,
17318
+ resetTime: "2026-09-19T14:53:58Z"
17306
17319
  },
17307
17320
  recommended: true,
17308
17321
  supportedMimeTypes: {
@@ -17420,8 +17433,8 @@ var models_default = {
17420
17433
  },
17421
17434
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17422
17435
  quotaInfo: {
17423
- remainingFraction: 0.7753168,
17424
- resetTime: "2026-09-18T11:38:10Z"
17436
+ remainingFraction: 0.964089,
17437
+ resetTime: "2026-09-19T14:53:58Z"
17425
17438
  },
17426
17439
  recommended: true,
17427
17440
  supportedMimeTypes: {
@@ -17539,8 +17552,8 @@ var models_default = {
17539
17552
  },
17540
17553
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17541
17554
  quotaInfo: {
17542
- remainingFraction: 0.7753168,
17543
- resetTime: "2026-09-18T11:38:10Z"
17555
+ remainingFraction: 0.964089,
17556
+ resetTime: "2026-09-19T14:53:58Z"
17544
17557
  },
17545
17558
  recommended: true,
17546
17559
  supportedMimeTypes: {
@@ -17657,8 +17670,8 @@ var models_default = {
17657
17670
  },
17658
17671
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17659
17672
  quotaInfo: {
17660
- remainingFraction: 0.7753168,
17661
- resetTime: "2026-09-18T11:38:10Z"
17673
+ remainingFraction: 0.964089,
17674
+ resetTime: "2026-09-19T14:53:58Z"
17662
17675
  },
17663
17676
  recommended: true,
17664
17677
  supportedMimeTypes: {
@@ -17768,8 +17781,8 @@ var models_default = {
17768
17781
  },
17769
17782
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17770
17783
  quotaInfo: {
17771
- remainingFraction: 0.7753168,
17772
- resetTime: "2026-09-18T11:38:10Z"
17784
+ remainingFraction: 0.964089,
17785
+ resetTime: "2026-09-19T14:53:58Z"
17773
17786
  },
17774
17787
  recommended: true,
17775
17788
  supportedMimeTypes: {
@@ -17881,8 +17894,8 @@ var models_default = {
17881
17894
  },
17882
17895
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17883
17896
  quotaInfo: {
17884
- remainingFraction: 0.7753168,
17885
- resetTime: "2026-09-18T11:38:10Z"
17897
+ remainingFraction: 0.964089,
17898
+ resetTime: "2026-09-19T14:53:58Z"
17886
17899
  },
17887
17900
  recommended: true,
17888
17901
  supportedMimeTypes: {
@@ -17994,8 +18007,8 @@ var models_default = {
17994
18007
  },
17995
18008
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17996
18009
  quotaInfo: {
17997
- remainingFraction: 0.7753168,
17998
- resetTime: "2026-09-18T11:38:10Z"
18010
+ remainingFraction: 0.964089,
18011
+ resetTime: "2026-09-19T14:53:58Z"
17999
18012
  },
18000
18013
  recommended: true,
18001
18014
  supportedMimeTypes: {
@@ -18106,8 +18119,8 @@ var models_default = {
18106
18119
  },
18107
18120
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18108
18121
  quotaInfo: {
18109
- remainingFraction: 0.7753168,
18110
- resetTime: "2026-09-18T11:38:10Z"
18122
+ remainingFraction: 0.964089,
18123
+ resetTime: "2026-09-19T14:53:58Z"
18111
18124
  },
18112
18125
  recommended: true,
18113
18126
  supportedMimeTypes: {
@@ -18217,8 +18230,8 @@ var models_default = {
18217
18230
  },
18218
18231
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18219
18232
  quotaInfo: {
18220
- remainingFraction: 0.7753168,
18221
- resetTime: "2026-09-18T11:38:10Z"
18233
+ remainingFraction: 0.964089,
18234
+ resetTime: "2026-09-19T14:53:58Z"
18222
18235
  },
18223
18236
  recommended: true,
18224
18237
  supportedMimeTypes: {
@@ -18277,8 +18290,6 @@ var models_default = {
18277
18290
  supportsImages: true,
18278
18291
  supportsThinking: true,
18279
18292
  supportsVideo: true,
18280
- tagDescription: "Limited time",
18281
- tagTitle: "Fast",
18282
18293
  thinkingBudget: -1
18283
18294
  },
18284
18295
  "gemini-3.8-flash-low": {
@@ -18330,8 +18341,8 @@ var models_default = {
18330
18341
  },
18331
18342
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18332
18343
  quotaInfo: {
18333
- remainingFraction: 0.7753168,
18334
- resetTime: "2026-09-18T11:38:10Z"
18344
+ remainingFraction: 0.964089,
18345
+ resetTime: "2026-09-19T14:53:58Z"
18335
18346
  },
18336
18347
  recommended: true,
18337
18348
  supportedMimeTypes: {
@@ -18443,8 +18454,8 @@ var models_default = {
18443
18454
  },
18444
18455
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18445
18456
  quotaInfo: {
18446
- remainingFraction: 0.7753168,
18447
- resetTime: "2026-09-18T11:38:10Z"
18457
+ remainingFraction: 0.964089,
18458
+ resetTime: "2026-09-19T14:53:58Z"
18448
18459
  },
18449
18460
  recommended: true,
18450
18461
  supportedMimeTypes: {
@@ -18555,8 +18566,8 @@ var models_default = {
18555
18566
  },
18556
18567
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18557
18568
  quotaInfo: {
18558
- remainingFraction: 0.7753168,
18559
- resetTime: "2026-09-18T11:38:10Z"
18569
+ remainingFraction: 0.964089,
18570
+ resetTime: "2026-09-19T14:53:58Z"
18560
18571
  },
18561
18572
  recommended: true,
18562
18573
  supportedMimeTypes: {
@@ -18645,8 +18656,8 @@ var models_default = {
18645
18656
  },
18646
18657
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18647
18658
  quotaInfo: {
18648
- remainingFraction: 0.7753168,
18649
- resetTime: "2026-09-18T11:38:10Z"
18659
+ remainingFraction: 0.964089,
18660
+ resetTime: "2026-09-19T14:53:58Z"
18650
18661
  },
18651
18662
  recommended: true,
18652
18663
  supportedMimeTypes: {
@@ -18723,7 +18734,7 @@ var models_default = {
18723
18734
  modelProvider: "MODEL_PROVIDER_OPENAI",
18724
18735
  quotaInfo: {
18725
18736
  remainingFraction: 1,
18726
- resetTime: "2026-09-18T16:07:34Z"
18737
+ resetTime: "2026-09-19T15:08:03Z"
18727
18738
  },
18728
18739
  recommended: true,
18729
18740
  supportsThinking: true,
@@ -20222,22 +20233,81 @@ var ChatLoggerImpl = class {
20222
20233
  }
20223
20234
  };
20224
20235
 
20225
- // src/plugin.ts
20226
- var AGY_QUOTA_COMMAND = "agyquota";
20227
- var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20228
-
20229
- Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20230
- Do not call other tools.
20231
- `;
20232
- var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20233
- 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
+ }
20234
20309
 
20235
- Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20236
- Do not call other tools.
20237
- `;
20238
- var latestAgyAuthResolver;
20239
- var latestAgyConfiguredProjectId;
20240
- var latestAgyUserAgentModel;
20310
+ // src/plugin/tier.ts
20241
20311
  var STATIC_MODELS_SIMPLE = {
20242
20312
  "gemini-3.8-flash": {
20243
20313
  name: "Gemini 3.8 Flash",
@@ -20325,6 +20395,39 @@ var TIER_MAPPING = {
20325
20395
  high: "gemini-3.1-pro-high"
20326
20396
  }
20327
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;
20328
20431
  var buildModelFromSimple = (modelId, simple) => {
20329
20432
  const isClaude = modelId.startsWith("claude-");
20330
20433
  const isGpt = modelId.startsWith("gpt-");
@@ -20418,83 +20521,6 @@ var STATIC_MODELS = {};
20418
20521
  for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
20419
20522
  STATIC_MODELS[modelId] = buildModelFromSimple(modelId, simple);
20420
20523
  }
20421
- function getSafeHeader(headers, key) {
20422
- if (!headers) {
20423
- return void 0;
20424
- }
20425
- const targetKey = key.toLowerCase();
20426
- if (typeof headers.get === "function") {
20427
- try {
20428
- return headers.get(targetKey) || void 0;
20429
- } catch {
20430
- }
20431
- }
20432
- if (Array.isArray(headers)) {
20433
- const found = headers.find((item) => {
20434
- if (Array.isArray(item) && typeof item[0] === "string") {
20435
- return item[0].toLowerCase() === targetKey;
20436
- }
20437
- return false;
20438
- });
20439
- return found ? String(found[1]) : void 0;
20440
- }
20441
- if (typeof headers === "object") {
20442
- const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20443
- return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20444
- }
20445
- return void 0;
20446
- }
20447
- function setSafeHeaders(initHeaders, newHeaders) {
20448
- if (typeof globalThis.Headers !== "undefined") {
20449
- const headers = new globalThis.Headers(initHeaders ?? {});
20450
- for (const [k, v] of Object.entries(newHeaders)) {
20451
- headers.set(k, v);
20452
- }
20453
- return headers;
20454
- }
20455
- if (Array.isArray(initHeaders)) {
20456
- const nextHeaders2 = [...initHeaders];
20457
- for (const [k, v] of Object.entries(newHeaders)) {
20458
- const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20459
- if (idx !== -1) {
20460
- nextHeaders2[idx] = [k, v];
20461
- } else {
20462
- nextHeaders2.push([k, v]);
20463
- }
20464
- }
20465
- return nextHeaders2;
20466
- }
20467
- const nextHeaders = {};
20468
- if (initHeaders && typeof initHeaders === "object") {
20469
- for (const [k, v] of Object.entries(initHeaders)) {
20470
- nextHeaders[k] = String(v);
20471
- }
20472
- }
20473
- for (const [k, v] of Object.entries(newHeaders)) {
20474
- const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20475
- if (existingKey) {
20476
- nextHeaders[existingKey] = v;
20477
- } else {
20478
- nextHeaders[k] = v;
20479
- }
20480
- }
20481
- return nextHeaders;
20482
- }
20483
- function resolveModelTier(baseModelId, init) {
20484
- const parts = baseModelId.split("@");
20485
- const base = parts[0] || "";
20486
- const suffixTier = parts[1]?.toLowerCase();
20487
- const mapping = TIER_MAPPING[base];
20488
- if (!mapping) {
20489
- return baseModelId;
20490
- }
20491
- const headerTier = getSafeHeader(init?.headers, "x-agy-tier")?.toLowerCase() || null;
20492
- const requestedTier = headerTier || suffixTier;
20493
- if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20494
- return mapping[requestedTier] || baseModelId;
20495
- }
20496
- return mapping["medium"] ?? mapping["high"];
20497
- }
20498
20524
  var AgyCLIOAuthPlugin = async ({ client }) => {
20499
20525
  let latestConfig;
20500
20526
  updateStaticModelsWithPricing(STATIC_MODELS);
@@ -20822,139 +20848,29 @@ async function ensureProjectContextOrThrow(authRecord, client, configuredProject
20822
20848
  throw error45;
20823
20849
  }
20824
20850
  }
20825
- function toUrlString(value) {
20826
- if (typeof value === "string") {
20827
- return value;
20828
- }
20829
- const candidate = value.url;
20830
- if (candidate) {
20831
- return candidate;
20832
- }
20833
- return value.toString();
20834
- }
20835
20851
 
20836
20852
  // src/plugin/types.ts
20837
20853
  function defineOpenCodeV2Plugin(def) {
20838
20854
  return def;
20839
20855
  }
20840
20856
 
20841
- // 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";
20842
20859
  import { homedir as homedir4 } from "os";
20843
20860
  import { join as join6 } from "path";
20844
- import { existsSync as existsSync6, mkdirSync as mkdirSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "fs";
20845
- import "http";
20846
- var AGY_V2_QUOTA_COMMAND = "agy-quota";
20847
- var AGY_V2_QUOTA_SUMMARY_COMMAND = "agy-quota-summary";
20848
- var AGY_V2_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20849
-
20850
- Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20851
- Do not call other tools.
20852
- `;
20853
- 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.
20854
-
20855
- Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20856
- Do not call other tools.
20857
- `;
20858
- function getSafeHeader2(headers, key) {
20859
- if (!headers) {
20860
- return void 0;
20861
+ var storedAuthOverrideForTesting = void 0;
20862
+ function loadStoredAuthFromJson() {
20863
+ if (storedAuthOverrideForTesting !== void 0) {
20864
+ return storedAuthOverrideForTesting;
20861
20865
  }
20862
- const targetKey = key.toLowerCase();
20863
- if (typeof headers.get === "function") {
20864
- try {
20865
- return headers.get(targetKey) || void 0;
20866
- } 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];
20867
20872
  }
20868
- }
20869
- if (Array.isArray(headers)) {
20870
- const found = headers.find((item) => {
20871
- if (Array.isArray(item) && typeof item[0] === "string") {
20872
- return item[0].toLowerCase() === targetKey;
20873
- }
20874
- return false;
20875
- });
20876
- return found ? String(found[1]) : void 0;
20877
- }
20878
- if (typeof headers === "object") {
20879
- const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20880
- return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20881
- }
20882
- return void 0;
20883
- }
20884
- function setSafeHeaders2(initHeaders, newHeaders) {
20885
- if (typeof globalThis.Headers !== "undefined") {
20886
- const headers = new globalThis.Headers(initHeaders ?? {});
20887
- for (const [k, v] of Object.entries(newHeaders)) {
20888
- headers.set(k, v);
20889
- }
20890
- return headers;
20891
- }
20892
- if (Array.isArray(initHeaders)) {
20893
- const nextHeaders2 = [...initHeaders];
20894
- for (const [k, v] of Object.entries(newHeaders)) {
20895
- const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20896
- if (idx !== -1) {
20897
- nextHeaders2[idx] = [k, v];
20898
- } else {
20899
- nextHeaders2.push([k, v]);
20900
- }
20901
- }
20902
- return nextHeaders2;
20903
- }
20904
- const nextHeaders = {};
20905
- if (initHeaders && typeof initHeaders === "object") {
20906
- for (const [k, v] of Object.entries(initHeaders)) {
20907
- nextHeaders[k] = String(v);
20908
- }
20909
- }
20910
- for (const [k, v] of Object.entries(newHeaders)) {
20911
- const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20912
- if (existingKey) {
20913
- nextHeaders[existingKey] = v;
20914
- } else {
20915
- nextHeaders[k] = v;
20916
- }
20917
- }
20918
- return nextHeaders;
20919
- }
20920
- function toUrlString2(value) {
20921
- if (typeof value === "string") {
20922
- return value;
20923
- }
20924
- const candidate = value.url;
20925
- if (candidate) {
20926
- return candidate;
20927
- }
20928
- return value.toString();
20929
- }
20930
- function resolveModelTier2(baseModelId, init) {
20931
- const parts = baseModelId.split("@");
20932
- const base = parts[0] || "";
20933
- const suffixTier = parts[1]?.toLowerCase();
20934
- const mapping = TIER_MAPPING[base];
20935
- if (!mapping) {
20936
- return baseModelId;
20937
- }
20938
- const headerTier = getSafeHeader2(init?.headers, "x-agy-tier")?.toLowerCase() || null;
20939
- const requestedTier = headerTier || suffixTier;
20940
- if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20941
- return mapping[requestedTier] || baseModelId;
20942
- }
20943
- return mapping["medium"] ?? mapping["high"];
20944
- }
20945
- var storedAuthOverrideForTesting = void 0;
20946
- function loadStoredAuthFromJson() {
20947
- if (storedAuthOverrideForTesting !== void 0) {
20948
- return storedAuthOverrideForTesting;
20949
- }
20950
- const authPath = join6(homedir4(), ".local", "share", "opencode", "auth.json");
20951
- try {
20952
- if (existsSync6(authPath)) {
20953
- const content = readFileSync5(authPath, "utf8");
20954
- const data = JSON.parse(content);
20955
- return data?.[AGY_PROVIDER_ID];
20956
- }
20957
- } catch {
20873
+ } catch {
20958
20874
  }
20959
20875
  return void 0;
20960
20876
  }
@@ -20986,19 +20902,21 @@ function saveStoredAuthToJson(authRecord) {
20986
20902
  } catch {
20987
20903
  }
20988
20904
  }
20905
+
20906
+ // src/plugin/v2-fetch.ts
20989
20907
  function createV2FetchInterceptor(getAuthSnapshot) {
20990
20908
  return async function agyV2Fetch(input, init) {
20991
20909
  const isGL = isGenerativeLanguageRequest(input);
20992
- const isInternal = toUrlString2(input).includes("cloudcode-pa.googleapis.com");
20910
+ const isInternal = toUrlString(input).includes("cloudcode-pa.googleapis.com");
20993
20911
  if (!isGL && !isInternal) {
20994
- return agyFetch(input, init);
20912
+ return (globalThis.fetch || fetch)(input, init);
20995
20913
  }
20996
20914
  let rawAuth = getAuthSnapshot ? await getAuthSnapshot() : void 0;
20997
20915
  if (!rawAuth) {
20998
20916
  rawAuth = loadStoredAuthFromJson();
20999
20917
  }
21000
20918
  if (!rawAuth || !isOAuthAuth(rawAuth)) {
21001
- return agyFetch(input, init);
20919
+ return (globalThis.fetch || fetch)(input, init);
21002
20920
  }
21003
20921
  let authRecord = resolveCachedAuth(rawAuth);
21004
20922
  if (accessTokenExpired(authRecord)) {
@@ -21009,19 +20927,19 @@ function createV2FetchInterceptor(getAuthSnapshot) {
21009
20927
  }
21010
20928
  }
21011
20929
  if (!authRecord.access) {
21012
- return agyFetch(input, init);
20930
+ return (globalThis.fetch || fetch)(input, init);
21013
20931
  }
21014
20932
  if (isInternal) {
21015
- const hasAuth = getSafeHeader2(init?.headers, "Authorization") !== void 0;
20933
+ const hasAuth = getSafeHeader(init?.headers, "Authorization") !== void 0;
21016
20934
  if (hasAuth) {
21017
- return agyFetch(input, init);
20935
+ return (globalThis.fetch || fetch)(input, init);
21018
20936
  }
21019
20937
  const userAgent = buildAgyCliUserAgent();
21020
- const headers = setSafeHeaders2(init?.headers, {
20938
+ const headers = setSafeHeaders(init?.headers, {
21021
20939
  Authorization: `Bearer ${authRecord.access}`,
21022
20940
  "User-Agent": userAgent
21023
20941
  });
21024
- return agyFetch(input, {
20942
+ return (globalThis.fetch || fetch)(input, {
21025
20943
  ...init,
21026
20944
  headers
21027
20945
  });
@@ -21047,7 +20965,7 @@ function createV2FetchInterceptor(getAuthSnapshot) {
21047
20965
  let modifiedInput = input;
21048
20966
  if (isGL && originalRequestedModel) {
21049
20967
  const originalBase = originalRequestedModel.replace("google-agy/", "");
21050
- const resolvedBase = resolveModelTier2(originalBase, init);
20968
+ const resolvedBase = resolveModelTier(originalBase, init);
21051
20969
  if (originalBase !== resolvedBase) {
21052
20970
  if (typeof modifiedInput === "string") {
21053
20971
  modifiedInput = modifiedInput.replace(`models/${originalBase}`, `models/${resolvedBase}`);
@@ -21067,7 +20985,7 @@ function createV2FetchInterceptor(getAuthSnapshot) {
21067
20985
  const chatLogger = createChatLogger();
21068
20986
  if (chatLogger) {
21069
20987
  chatLogger.logRequest(
21070
- toUrlString2(transformed.request),
20988
+ toUrlString(transformed.request),
21071
20989
  transformed.init.method || "GET",
21072
20990
  transformed.init.headers,
21073
20991
  transformed.init.body
@@ -21084,6 +21002,295 @@ function createV2FetchInterceptor(getAuthSnapshot) {
21084
21002
  );
21085
21003
  };
21086
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 event.request.url === "string") {
21202
+ event.request.url = cleanUrl;
21203
+ }
21204
+ }
21205
+ }
21206
+ }
21207
+ if (authRecord && authRecord.access) {
21208
+ if (typeof event.headers?.set === "function") {
21209
+ event.headers.set("Authorization", `Bearer ${authRecord.access}`);
21210
+ } else if (event.headers) {
21211
+ event.headers["Authorization"] = `Bearer ${authRecord.access}`;
21212
+ }
21213
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21214
+ event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
21215
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21216
+ event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
21217
+ }
21218
+ }
21219
+ const userAgent = buildAgyCliUserAgent(modelName);
21220
+ if (typeof event.headers?.set === "function") {
21221
+ if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
21222
+ event.headers.set("User-Agent", userAgent);
21223
+ }
21224
+ } else if (event.headers) {
21225
+ if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
21226
+ event.headers["User-Agent"] = userAgent;
21227
+ }
21228
+ }
21229
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21230
+ if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
21231
+ event.request.headers.set("User-Agent", userAgent);
21232
+ }
21233
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21234
+ if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
21235
+ event.request.headers["User-Agent"] = userAgent;
21236
+ }
21237
+ }
21238
+ };
21239
+ }
21240
+ function createV2HttpResponseHook(state = {}) {
21241
+ return async (event) => {
21242
+ if (!event || !event.response) return;
21243
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21244
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21245
+ if (isInternal && event.response instanceof Response) {
21246
+ const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
21247
+ const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || state.lastInterceptedModel;
21248
+ const transformed = await transformAgyResponse(
21249
+ event.response,
21250
+ !!isStreaming,
21251
+ null,
21252
+ parsedModel,
21253
+ void 0,
21254
+ void 0
21255
+ );
21256
+ event.response = transformed;
21257
+ }
21258
+ };
21259
+ }
21260
+ function createV2RetryHook() {
21261
+ return async (event) => {
21262
+ if (!event) return;
21263
+ const response = event.response;
21264
+ if (response instanceof Response) {
21265
+ if (response.status === 429 || response.status === 503) {
21266
+ const quota = await classifyQuotaResponse(response);
21267
+ if (quota?.retryDelayMs) {
21268
+ event.retryDelayMs = quota.retryDelayMs;
21269
+ } else {
21270
+ event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
21271
+ }
21272
+ }
21273
+ } else if (event.details && Array.isArray(event.details)) {
21274
+ const retryInfo = event.details.find(
21275
+ (d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
21276
+ );
21277
+ if (retryInfo?.retryDelay) {
21278
+ const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
21279
+ if (delayMs !== null) {
21280
+ event.retryDelayMs = delayMs;
21281
+ }
21282
+ }
21283
+ }
21284
+ };
21285
+ }
21286
+ function registerV2SessionHooks(ctx) {
21287
+ const state = {};
21288
+ ctx.session.hook("http.request", createV2HttpRequestHook(state), { providerID: AGY_PROVIDER_ID });
21289
+ ctx.session.hook("http.response", createV2HttpResponseHook(state), { providerID: AGY_PROVIDER_ID });
21290
+ ctx.session.hook("retry", createV2RetryHook(), { providerID: AGY_PROVIDER_ID });
21291
+ }
21292
+
21293
+ // src/plugin/v2.ts
21087
21294
  async function setupOpenCodeV2(ctx) {
21088
21295
  const resolveVariants = (modelId) => {
21089
21296
  const mapping = TIER_MAPPING[modelId];
@@ -21365,292 +21572,7 @@ async function setupOpenCodeV2(ctx) {
21365
21572
  event.options.apiKey = "dummy";
21366
21573
  event.options.fetch = createV2FetchInterceptor();
21367
21574
  });
21368
- let lastInterceptedModel;
21369
- ctx.session.hook(
21370
- "http.request",
21371
- async (event) => {
21372
- if (!event) return;
21373
- const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21374
- const isGL = isGenerativeLanguageRequest(rawUrl);
21375
- const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21376
- if (!isGL && !isInternal) {
21377
- return;
21378
- }
21379
- event.headers = event.headers || {};
21380
- let modelName;
21381
- let rawAuth = event.auth;
21382
- if (rawAuth && !rawAuth.type) {
21383
- const tokenVal = rawAuth.access || rawAuth.token;
21384
- if (tokenVal || rawAuth.refresh) {
21385
- rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
21386
- }
21387
- }
21388
- if (!rawAuth || !isOAuthAuth(rawAuth)) {
21389
- rawAuth = loadStoredAuthFromJson();
21390
- }
21391
- let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
21392
- if (authRecord && accessTokenExpired(authRecord)) {
21393
- const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
21394
- } } });
21395
- if (refreshed) {
21396
- authRecord = refreshed;
21397
- saveStoredAuthToJson(refreshed);
21398
- }
21399
- }
21400
- if (isGL) {
21401
- const parsed = parseGenerativeLanguageRequest(rawUrl);
21402
- modelName = parsed?.effectiveModel;
21403
- if (modelName) {
21404
- lastInterceptedModel = modelName;
21405
- }
21406
- if (typeof event.headers.delete === "function") {
21407
- event.headers.delete("x-goog-api-key");
21408
- event.headers.delete("api-key");
21409
- } else {
21410
- for (const key of Object.keys(event.headers)) {
21411
- const lower = key.toLowerCase();
21412
- if (lower === "x-goog-api-key" || lower === "api-key") {
21413
- delete event.headers[key];
21414
- }
21415
- }
21416
- }
21417
- if (event.request?.headers) {
21418
- if (typeof event.request.headers.delete === "function") {
21419
- event.request.headers.delete("x-goog-api-key");
21420
- event.request.headers.delete("api-key");
21421
- } else {
21422
- for (const key of Object.keys(event.request.headers)) {
21423
- const lower = key.toLowerCase();
21424
- if (lower === "x-goog-api-key" || lower === "api-key") {
21425
- delete event.request.headers[key];
21426
- }
21427
- }
21428
- }
21429
- }
21430
- let cleanUrl = rawUrl;
21431
- try {
21432
- const parsedUrl = new URL(rawUrl);
21433
- let urlChanged = false;
21434
- for (const param of ["key", "x-goog-api-key", "api-key"]) {
21435
- if (parsedUrl.searchParams.has(param)) {
21436
- parsedUrl.searchParams.delete(param);
21437
- urlChanged = true;
21438
- }
21439
- }
21440
- if (urlChanged) {
21441
- cleanUrl = parsedUrl.toString();
21442
- }
21443
- } catch {
21444
- }
21445
- if (authRecord && authRecord.access) {
21446
- let projectContext;
21447
- try {
21448
- projectContext = await ensureProjectContext(
21449
- authRecord,
21450
- { auth: { set: async () => {
21451
- } } },
21452
- void 0,
21453
- modelName
21454
- );
21455
- } catch {
21456
- projectContext = {
21457
- effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
21458
- auth: authRecord
21459
- };
21460
- }
21461
- const originalRequestedModel = modelName;
21462
- let modifiedUrl = cleanUrl;
21463
- if (originalRequestedModel) {
21464
- const originalBase = originalRequestedModel.replace("google-agy/", "");
21465
- const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
21466
- const resolvedBase = resolveModelTier2(originalBase, { headers: initHeaders });
21467
- if (originalBase !== resolvedBase) {
21468
- modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
21469
- }
21470
- }
21471
- let bodyPayload = event.body;
21472
- if (bodyPayload === void 0 && event.request) {
21473
- if (typeof event.request.clone === "function") {
21474
- try {
21475
- bodyPayload = await event.request.clone().text();
21476
- } catch {
21477
- }
21478
- } else if (event.request.body !== void 0) {
21479
- bodyPayload = event.request.body;
21480
- }
21481
- }
21482
- let preExistingUserAgent;
21483
- if (typeof event.headers?.get === "function") {
21484
- preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
21485
- } else if (event.headers && typeof event.headers === "object") {
21486
- preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
21487
- }
21488
- if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
21489
- preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
21490
- } else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
21491
- preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
21492
- }
21493
- const method = event.method || event.request?.method || "POST";
21494
- const requestHeaders = event.headers || event.request?.headers;
21495
- const transformed = prepareAgyRequest(
21496
- modifiedUrl,
21497
- {
21498
- method,
21499
- headers: requestHeaders,
21500
- body: bodyPayload
21501
- },
21502
- authRecord.access,
21503
- projectContext.effectiveProjectId
21504
- );
21505
- const targetUrl = toUrlString2(transformed.request);
21506
- if (typeof event.url === "string") {
21507
- event.url = targetUrl;
21508
- }
21509
- if (event.request && typeof event.request === "object") {
21510
- if (typeof Request !== "undefined" && event.request instanceof Request) {
21511
- event.request = new Request(targetUrl, {
21512
- method: transformed.init.method,
21513
- headers: transformed.init.headers,
21514
- body: transformed.init.body
21515
- });
21516
- } else if (typeof event.request.url === "string") {
21517
- try {
21518
- event.request.url = targetUrl;
21519
- } catch {
21520
- }
21521
- }
21522
- }
21523
- const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
21524
- for (const [k, v] of headerEntries) {
21525
- const lowerK = k.toLowerCase();
21526
- if (lowerK === "user-agent") {
21527
- if (preExistingUserAgent) {
21528
- continue;
21529
- }
21530
- if (typeof event.headers?.set === "function") {
21531
- event.headers.set("User-Agent", v);
21532
- } else if (event.headers) {
21533
- event.headers["User-Agent"] = v;
21534
- }
21535
- if (event.request?.headers && typeof event.request.headers.set === "function") {
21536
- event.request.headers.set("User-Agent", v);
21537
- } else if (event.request?.headers && typeof event.request.headers === "object") {
21538
- event.request.headers["User-Agent"] = v;
21539
- }
21540
- continue;
21541
- }
21542
- if (typeof event.headers?.set === "function") {
21543
- event.headers.set(k, v);
21544
- } else if (event.headers) {
21545
- event.headers[k] = v;
21546
- }
21547
- if (event.request?.headers && typeof event.request.headers.set === "function") {
21548
- event.request.headers.set(k, v);
21549
- } else if (event.request?.headers && typeof event.request.headers === "object") {
21550
- event.request.headers[k] = v;
21551
- }
21552
- }
21553
- if (transformed.init.body !== void 0) {
21554
- event.body = transformed.init.body;
21555
- if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
21556
- event.request.body = transformed.init.body;
21557
- }
21558
- }
21559
- } else {
21560
- if (typeof event.url === "string") {
21561
- event.url = cleanUrl;
21562
- }
21563
- if (event.request && typeof event.request === "object") {
21564
- if (typeof event.request.url === "string") {
21565
- event.request.url = cleanUrl;
21566
- }
21567
- }
21568
- }
21569
- }
21570
- if (authRecord && authRecord.access) {
21571
- if (typeof event.headers?.set === "function") {
21572
- event.headers.set("Authorization", `Bearer ${authRecord.access}`);
21573
- } else if (event.headers) {
21574
- event.headers["Authorization"] = `Bearer ${authRecord.access}`;
21575
- }
21576
- if (event.request?.headers && typeof event.request.headers.set === "function") {
21577
- event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
21578
- } else if (event.request?.headers && typeof event.request.headers === "object") {
21579
- event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
21580
- }
21581
- }
21582
- const userAgent = buildAgyCliUserAgent(modelName);
21583
- if (typeof event.headers?.set === "function") {
21584
- if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
21585
- event.headers.set("User-Agent", userAgent);
21586
- }
21587
- } else if (event.headers) {
21588
- if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
21589
- event.headers["User-Agent"] = userAgent;
21590
- }
21591
- }
21592
- if (event.request?.headers && typeof event.request.headers.set === "function") {
21593
- if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
21594
- event.request.headers.set("User-Agent", userAgent);
21595
- }
21596
- } else if (event.request?.headers && typeof event.request.headers === "object") {
21597
- if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
21598
- event.request.headers["User-Agent"] = userAgent;
21599
- }
21600
- }
21601
- },
21602
- { providerID: AGY_PROVIDER_ID }
21603
- );
21604
- ctx.session.hook(
21605
- "http.response",
21606
- async (event) => {
21607
- if (!event || !event.response) return;
21608
- const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21609
- const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21610
- if (isInternal && event.response instanceof Response) {
21611
- const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
21612
- const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || lastInterceptedModel;
21613
- const transformed = await transformAgyResponse(
21614
- event.response,
21615
- !!isStreaming,
21616
- null,
21617
- parsedModel,
21618
- void 0,
21619
- void 0
21620
- );
21621
- event.response = transformed;
21622
- }
21623
- },
21624
- { providerID: AGY_PROVIDER_ID }
21625
- );
21626
- ctx.session.hook(
21627
- "retry",
21628
- async (event) => {
21629
- if (!event) return;
21630
- const response = event.response;
21631
- if (response instanceof Response) {
21632
- if (response.status === 429 || response.status === 503) {
21633
- const quota = await classifyQuotaResponse(response);
21634
- if (quota?.retryDelayMs) {
21635
- event.retryDelayMs = quota.retryDelayMs;
21636
- } else {
21637
- event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
21638
- }
21639
- }
21640
- } else if (event.details && Array.isArray(event.details)) {
21641
- const retryInfo = event.details.find(
21642
- (d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
21643
- );
21644
- if (retryInfo?.retryDelay) {
21645
- const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
21646
- if (delayMs !== null) {
21647
- event.retryDelayMs = delayMs;
21648
- }
21649
- }
21650
- }
21651
- },
21652
- { providerID: AGY_PROVIDER_ID }
21653
- );
21575
+ registerV2SessionHooks(ctx);
21654
21576
  }
21655
21577
  var v2PluginDefinition = defineOpenCodeV2Plugin({
21656
21578
  id: AGY_PROVIDER_ID,