@anthonyhaussman/opencode-agy-auth 1.2.8 → 1.2.9-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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.8";
271
+ var AGY_CLI_VERSION = "1.2.9";
272
272
 
273
273
  // src/sdk/user-agent.ts
274
274
  var cachedUserAgent = null;
@@ -579,6 +579,12 @@ async function resolveQuotaResetDelay(accessToken, projectId, model, userAgentMo
579
579
  return null;
580
580
  }
581
581
  }
582
+ var retryInternals = {
583
+ parseRetryDelayValue,
584
+ parseRetryDelayFromMessage,
585
+ findResetTimeForModel,
586
+ resolveQuotaResetDelay
587
+ };
582
588
 
583
589
  // src/sdk/retry/helpers.ts
584
590
  var DEFAULT_MAX_ATTEMPTS = 3;
@@ -1575,7 +1581,11 @@ function createOAuthAuthorizeMethod(options) {
1575
1581
  const isHeadless = !!(process.env.SSH_CONNECTION || process.env.SSH_CLIENT || process.env.SSH_TTY || process.env.OPENCODE_HEADLESS);
1576
1582
  const authorization = await authorizeAgy();
1577
1583
  if (!isHeadless) {
1578
- openBrowserUrl(authorization.url);
1584
+ if (options?.openBrowser) {
1585
+ options.openBrowser(authorization.url);
1586
+ } else {
1587
+ openBrowserUrl(authorization.url);
1588
+ }
1579
1589
  }
1580
1590
  return {
1581
1591
  url: authorization.url,
@@ -1629,16 +1639,23 @@ function parseOAuthCallbackInput(input) {
1629
1639
  }
1630
1640
  return { code: trimmed };
1631
1641
  }
1642
+ function defaultOpenBrowserLauncher(command, args) {
1643
+ const child = spawn(command, args, {
1644
+ stdio: "ignore",
1645
+ detached: true
1646
+ });
1647
+ child.unref?.();
1648
+ }
1649
+ var openBrowserLauncher = defaultOpenBrowserLauncher;
1632
1650
  function openBrowserUrl(url2) {
1651
+ if ((process.env.NODE_ENV === "test" || process.env.VITEST) && openBrowserLauncher === defaultOpenBrowserLauncher) {
1652
+ return;
1653
+ }
1633
1654
  try {
1634
1655
  const platform2 = process.platform;
1635
1656
  const command = platform2 === "darwin" ? "open" : platform2 === "win32" ? "rundll32" : "xdg-open";
1636
1657
  const args = platform2 === "win32" ? ["url.dll,FileProtocolHandler", url2] : [url2];
1637
- const child = spawn(command, args, {
1638
- stdio: "ignore",
1639
- detached: true
1640
- });
1641
- child.unref?.();
1658
+ openBrowserLauncher(command, args);
1642
1659
  } catch {
1643
1660
  }
1644
1661
  }
@@ -15320,6 +15337,12 @@ function formatRelativeResetTime(resetTime) {
15320
15337
 
15321
15338
  // src/plugin/quota.ts
15322
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
+ `;
15323
15346
  function createAgyQuotaTool({
15324
15347
  client,
15325
15348
  getAuthResolver,
@@ -15559,6 +15582,12 @@ function splitModelVariant(modelId) {
15559
15582
 
15560
15583
  // src/plugin/quota-summary.ts
15561
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
+ `;
15562
15591
  function createAgyQuotaSummaryTool({
15563
15592
  client,
15564
15593
  getAuthResolver,
@@ -16054,17 +16083,15 @@ var models_default = {
16054
16083
  106121401,
16055
16084
  106100625,
16056
16085
  106143956,
16057
- 105879567,
16058
16086
  105856899,
16059
16087
  106064030,
16060
- 106567313,
16088
+ 106711598,
16061
16089
  106106760,
16062
16090
  106021688,
16063
16091
  105887299,
16064
16092
  106428370,
16065
16093
  106283618,
16066
16094
  106640126,
16067
- 106278607,
16068
16095
  106380926,
16069
16096
  106723203,
16070
16097
  106242397,
@@ -16083,7 +16110,6 @@ var models_default = {
16083
16110
  106121399,
16084
16111
  106100654,
16085
16112
  106064028,
16086
- 106567309,
16087
16113
  105906495,
16088
16114
  106283614,
16089
16115
  106640124,
@@ -16150,7 +16176,7 @@ var models_default = {
16150
16176
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16151
16177
  quotaInfo: {
16152
16178
  remainingFraction: 1,
16153
- resetTime: "2026-09-22T12:32:50Z"
16179
+ resetTime: "2026-09-23T14:29:32Z"
16154
16180
  },
16155
16181
  recommended: true,
16156
16182
  supportedMimeTypes: {
@@ -16189,7 +16215,7 @@ var models_default = {
16189
16215
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16190
16216
  quotaInfo: {
16191
16217
  remainingFraction: 1,
16192
- resetTime: "2026-09-22T12:32:50Z"
16218
+ resetTime: "2026-09-23T14:29:32Z"
16193
16219
  },
16194
16220
  recommended: true,
16195
16221
  supportedMimeTypes: {
@@ -16225,8 +16251,8 @@ var models_default = {
16225
16251
  },
16226
16252
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16227
16253
  quotaInfo: {
16228
- remainingFraction: 0.9721721,
16229
- resetTime: "2026-09-22T12:27:35Z"
16254
+ remainingFraction: 0.9531947,
16255
+ resetTime: "2026-09-23T14:18:13Z"
16230
16256
  },
16231
16257
  recommended: true,
16232
16258
  supportedMimeTypes: {
@@ -16308,8 +16334,8 @@ var models_default = {
16308
16334
  },
16309
16335
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16310
16336
  quotaInfo: {
16311
- remainingFraction: 0.9721721,
16312
- resetTime: "2026-09-22T12:27:35Z"
16337
+ remainingFraction: 0.9531947,
16338
+ resetTime: "2026-09-23T14:18:13Z"
16313
16339
  },
16314
16340
  recommended: true,
16315
16341
  supportedMimeTypes: {
@@ -16391,8 +16417,8 @@ var models_default = {
16391
16417
  },
16392
16418
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16393
16419
  quotaInfo: {
16394
- remainingFraction: 0.9721721,
16395
- resetTime: "2026-09-22T12:27:35Z"
16420
+ remainingFraction: 0.9531947,
16421
+ resetTime: "2026-09-23T14:18:13Z"
16396
16422
  },
16397
16423
  recommended: true,
16398
16424
  supportedMimeTypes: {
@@ -16471,8 +16497,8 @@ var models_default = {
16471
16497
  },
16472
16498
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16473
16499
  quotaInfo: {
16474
- remainingFraction: 0.9721721,
16475
- resetTime: "2026-09-22T12:27:35Z"
16500
+ remainingFraction: 0.9531947,
16501
+ resetTime: "2026-09-23T14:18:13Z"
16476
16502
  },
16477
16503
  recommended: true,
16478
16504
  requiresImageOutputOutsideFunctionResponses: true,
@@ -16552,8 +16578,8 @@ var models_default = {
16552
16578
  },
16553
16579
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16554
16580
  quotaInfo: {
16555
- remainingFraction: 0.9721721,
16556
- resetTime: "2026-09-22T12:27:35Z"
16581
+ remainingFraction: 0.9531947,
16582
+ resetTime: "2026-09-23T14:18:13Z"
16557
16583
  },
16558
16584
  recommended: true,
16559
16585
  supportedMimeTypes: {
@@ -16657,8 +16683,8 @@ var models_default = {
16657
16683
  },
16658
16684
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16659
16685
  quotaInfo: {
16660
- remainingFraction: 0.9721721,
16661
- resetTime: "2026-09-22T12:27:35Z"
16686
+ remainingFraction: 0.9531947,
16687
+ resetTime: "2026-09-23T14:18:13Z"
16662
16688
  },
16663
16689
  recommended: true,
16664
16690
  supportedMimeTypes: {
@@ -16727,8 +16753,8 @@ var models_default = {
16727
16753
  model: "MODEL_PLACEHOLDER_M21",
16728
16754
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16729
16755
  quotaInfo: {
16730
- remainingFraction: 0.9721721,
16731
- resetTime: "2026-09-22T12:27:35Z"
16756
+ remainingFraction: 0.9531947,
16757
+ resetTime: "2026-09-23T14:18:13Z"
16732
16758
  }
16733
16759
  },
16734
16760
  "gemini-3.1-flash-lite": {
@@ -16746,8 +16772,8 @@ var models_default = {
16746
16772
  },
16747
16773
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16748
16774
  quotaInfo: {
16749
- remainingFraction: 0.9721721,
16750
- resetTime: "2026-09-22T12:27:35Z"
16775
+ remainingFraction: 0.9531947,
16776
+ resetTime: "2026-09-23T14:18:13Z"
16751
16777
  }
16752
16778
  },
16753
16779
  "gemini-3.1-pro-high": {
@@ -16778,8 +16804,8 @@ var models_default = {
16778
16804
  },
16779
16805
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16780
16806
  quotaInfo: {
16781
- remainingFraction: 0.9721721,
16782
- resetTime: "2026-09-22T12:27:35Z"
16807
+ remainingFraction: 0.9531947,
16808
+ resetTime: "2026-09-23T14:18:13Z"
16783
16809
  },
16784
16810
  recommended: true,
16785
16811
  supportedMimeTypes: {
@@ -16869,8 +16895,8 @@ var models_default = {
16869
16895
  },
16870
16896
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16871
16897
  quotaInfo: {
16872
- remainingFraction: 0.9721721,
16873
- resetTime: "2026-09-22T12:27:35Z"
16898
+ remainingFraction: 0.9531947,
16899
+ resetTime: "2026-09-23T14:18:13Z"
16874
16900
  },
16875
16901
  recommended: true,
16876
16902
  supportedMimeTypes: {
@@ -16974,8 +17000,8 @@ var models_default = {
16974
17000
  },
16975
17001
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16976
17002
  quotaInfo: {
16977
- remainingFraction: 0.9721721,
16978
- resetTime: "2026-09-22T12:27:35Z"
17003
+ remainingFraction: 0.9531947,
17004
+ resetTime: "2026-09-23T14:18:13Z"
16979
17005
  },
16980
17006
  recommended: true,
16981
17007
  supportedMimeTypes: {
@@ -17057,8 +17083,8 @@ var models_default = {
17057
17083
  },
17058
17084
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17059
17085
  quotaInfo: {
17060
- remainingFraction: 0.9721721,
17061
- resetTime: "2026-09-22T12:27:35Z"
17086
+ remainingFraction: 0.9531947,
17087
+ resetTime: "2026-09-23T14:18:13Z"
17062
17088
  },
17063
17089
  recommended: true,
17064
17090
  supportedMimeTypes: {
@@ -17164,8 +17190,8 @@ var models_default = {
17164
17190
  },
17165
17191
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17166
17192
  quotaInfo: {
17167
- remainingFraction: 0.9721721,
17168
- resetTime: "2026-09-22T12:27:35Z"
17193
+ remainingFraction: 0.9531947,
17194
+ resetTime: "2026-09-23T14:18:13Z"
17169
17195
  },
17170
17196
  recommended: true,
17171
17197
  supportedMimeTypes: {
@@ -17283,8 +17309,8 @@ var models_default = {
17283
17309
  },
17284
17310
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17285
17311
  quotaInfo: {
17286
- remainingFraction: 0.9721721,
17287
- resetTime: "2026-09-22T12:27:35Z"
17312
+ remainingFraction: 0.9531947,
17313
+ resetTime: "2026-09-23T14:18:13Z"
17288
17314
  },
17289
17315
  recommended: true,
17290
17316
  supportedMimeTypes: {
@@ -17402,8 +17428,8 @@ var models_default = {
17402
17428
  },
17403
17429
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17404
17430
  quotaInfo: {
17405
- remainingFraction: 0.9721721,
17406
- resetTime: "2026-09-22T12:27:35Z"
17431
+ remainingFraction: 0.9531947,
17432
+ resetTime: "2026-09-23T14:18:13Z"
17407
17433
  },
17408
17434
  recommended: true,
17409
17435
  supportedMimeTypes: {
@@ -17521,8 +17547,8 @@ var models_default = {
17521
17547
  },
17522
17548
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17523
17549
  quotaInfo: {
17524
- remainingFraction: 0.9721721,
17525
- resetTime: "2026-09-22T12:27:35Z"
17550
+ remainingFraction: 0.9531947,
17551
+ resetTime: "2026-09-23T14:18:13Z"
17526
17552
  },
17527
17553
  recommended: true,
17528
17554
  supportedMimeTypes: {
@@ -17639,8 +17665,8 @@ var models_default = {
17639
17665
  },
17640
17666
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17641
17667
  quotaInfo: {
17642
- remainingFraction: 0.9721721,
17643
- resetTime: "2026-09-22T12:27:35Z"
17668
+ remainingFraction: 0.9531947,
17669
+ resetTime: "2026-09-23T14:18:13Z"
17644
17670
  },
17645
17671
  recommended: true,
17646
17672
  supportedMimeTypes: {
@@ -17750,8 +17776,8 @@ var models_default = {
17750
17776
  },
17751
17777
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17752
17778
  quotaInfo: {
17753
- remainingFraction: 0.9721721,
17754
- resetTime: "2026-09-22T12:27:35Z"
17779
+ remainingFraction: 0.9531947,
17780
+ resetTime: "2026-09-23T14:18:13Z"
17755
17781
  },
17756
17782
  recommended: true,
17757
17783
  supportedMimeTypes: {
@@ -17863,8 +17889,8 @@ var models_default = {
17863
17889
  },
17864
17890
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17865
17891
  quotaInfo: {
17866
- remainingFraction: 0.9721721,
17867
- resetTime: "2026-09-22T12:27:35Z"
17892
+ remainingFraction: 0.9531947,
17893
+ resetTime: "2026-09-23T14:18:13Z"
17868
17894
  },
17869
17895
  recommended: true,
17870
17896
  supportedMimeTypes: {
@@ -17976,8 +18002,8 @@ var models_default = {
17976
18002
  },
17977
18003
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17978
18004
  quotaInfo: {
17979
- remainingFraction: 0.9721721,
17980
- resetTime: "2026-09-22T12:27:35Z"
18005
+ remainingFraction: 0.9531947,
18006
+ resetTime: "2026-09-23T14:18:13Z"
17981
18007
  },
17982
18008
  recommended: true,
17983
18009
  supportedMimeTypes: {
@@ -18088,8 +18114,8 @@ var models_default = {
18088
18114
  },
18089
18115
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18090
18116
  quotaInfo: {
18091
- remainingFraction: 0.9721721,
18092
- resetTime: "2026-09-22T12:27:35Z"
18117
+ remainingFraction: 0.9531947,
18118
+ resetTime: "2026-09-23T14:18:13Z"
18093
18119
  },
18094
18120
  recommended: true,
18095
18121
  supportedMimeTypes: {
@@ -18199,8 +18225,8 @@ var models_default = {
18199
18225
  },
18200
18226
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18201
18227
  quotaInfo: {
18202
- remainingFraction: 0.9721721,
18203
- resetTime: "2026-09-22T12:27:35Z"
18228
+ remainingFraction: 0.9531947,
18229
+ resetTime: "2026-09-23T14:18:13Z"
18204
18230
  },
18205
18231
  recommended: true,
18206
18232
  supportedMimeTypes: {
@@ -18312,8 +18338,8 @@ var models_default = {
18312
18338
  },
18313
18339
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18314
18340
  quotaInfo: {
18315
- remainingFraction: 0.9721721,
18316
- resetTime: "2026-09-22T12:27:35Z"
18341
+ remainingFraction: 0.9531947,
18342
+ resetTime: "2026-09-23T14:18:13Z"
18317
18343
  },
18318
18344
  recommended: true,
18319
18345
  supportedMimeTypes: {
@@ -18425,8 +18451,8 @@ var models_default = {
18425
18451
  },
18426
18452
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18427
18453
  quotaInfo: {
18428
- remainingFraction: 0.9721721,
18429
- resetTime: "2026-09-22T12:27:35Z"
18454
+ remainingFraction: 0.9531947,
18455
+ resetTime: "2026-09-23T14:18:13Z"
18430
18456
  },
18431
18457
  recommended: true,
18432
18458
  supportedMimeTypes: {
@@ -18537,8 +18563,8 @@ var models_default = {
18537
18563
  },
18538
18564
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18539
18565
  quotaInfo: {
18540
- remainingFraction: 0.9721721,
18541
- resetTime: "2026-09-22T12:27:35Z"
18566
+ remainingFraction: 0.9531947,
18567
+ resetTime: "2026-09-23T14:18:13Z"
18542
18568
  },
18543
18569
  recommended: true,
18544
18570
  supportedMimeTypes: {
@@ -18627,8 +18653,8 @@ var models_default = {
18627
18653
  },
18628
18654
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18629
18655
  quotaInfo: {
18630
- remainingFraction: 0.9721721,
18631
- resetTime: "2026-09-22T12:27:35Z"
18656
+ remainingFraction: 0.9531947,
18657
+ resetTime: "2026-09-23T14:18:13Z"
18632
18658
  },
18633
18659
  recommended: true,
18634
18660
  supportedMimeTypes: {
@@ -18705,7 +18731,7 @@ var models_default = {
18705
18731
  modelProvider: "MODEL_PROVIDER_OPENAI",
18706
18732
  quotaInfo: {
18707
18733
  remainingFraction: 1,
18708
- resetTime: "2026-09-22T12:32:50Z"
18734
+ resetTime: "2026-09-23T14:29:32Z"
18709
18735
  },
18710
18736
  recommended: true,
18711
18737
  supportsThinking: true,
@@ -20204,22 +20230,81 @@ var ChatLoggerImpl = class {
20204
20230
  }
20205
20231
  };
20206
20232
 
20207
- // src/plugin.ts
20208
- var AGY_QUOTA_COMMAND = "agyquota";
20209
- var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20210
-
20211
- Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20212
- Do not call other tools.
20213
- `;
20214
- var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20215
- 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.
20233
+ // src/plugin/headers.ts
20234
+ function getSafeHeader(headers, key) {
20235
+ if (!headers) {
20236
+ return void 0;
20237
+ }
20238
+ const targetKey = key.toLowerCase();
20239
+ if (typeof headers.get === "function") {
20240
+ try {
20241
+ return headers.get(targetKey) || void 0;
20242
+ } catch {
20243
+ }
20244
+ }
20245
+ if (Array.isArray(headers)) {
20246
+ const found = headers.find((item) => {
20247
+ if (Array.isArray(item) && typeof item[0] === "string") {
20248
+ return item[0].toLowerCase() === targetKey;
20249
+ }
20250
+ return false;
20251
+ });
20252
+ return found ? String(found[1]) : void 0;
20253
+ }
20254
+ if (typeof headers === "object") {
20255
+ const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20256
+ return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20257
+ }
20258
+ return void 0;
20259
+ }
20260
+ function setSafeHeaders(initHeaders, newHeaders) {
20261
+ if (typeof globalThis.Headers !== "undefined") {
20262
+ const headers = new globalThis.Headers(initHeaders ?? {});
20263
+ for (const [k, v] of Object.entries(newHeaders)) {
20264
+ headers.set(k, v);
20265
+ }
20266
+ return headers;
20267
+ }
20268
+ if (Array.isArray(initHeaders)) {
20269
+ const nextHeaders2 = [...initHeaders];
20270
+ for (const [k, v] of Object.entries(newHeaders)) {
20271
+ const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20272
+ if (idx !== -1) {
20273
+ nextHeaders2[idx] = [k, v];
20274
+ } else {
20275
+ nextHeaders2.push([k, v]);
20276
+ }
20277
+ }
20278
+ return nextHeaders2;
20279
+ }
20280
+ const nextHeaders = {};
20281
+ if (initHeaders && typeof initHeaders === "object") {
20282
+ for (const [k, v] of Object.entries(initHeaders)) {
20283
+ nextHeaders[k] = String(v);
20284
+ }
20285
+ }
20286
+ for (const [k, v] of Object.entries(newHeaders)) {
20287
+ const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20288
+ if (existingKey) {
20289
+ nextHeaders[existingKey] = v;
20290
+ } else {
20291
+ nextHeaders[k] = v;
20292
+ }
20293
+ }
20294
+ return nextHeaders;
20295
+ }
20296
+ function toUrlString(value) {
20297
+ if (typeof value === "string") {
20298
+ return value;
20299
+ }
20300
+ const candidate = value.url;
20301
+ if (candidate) {
20302
+ return candidate;
20303
+ }
20304
+ return value.toString();
20305
+ }
20216
20306
 
20217
- Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20218
- Do not call other tools.
20219
- `;
20220
- var latestAgyAuthResolver;
20221
- var latestAgyConfiguredProjectId;
20222
- var latestAgyUserAgentModel;
20307
+ // src/plugin/tier.ts
20223
20308
  var STATIC_MODELS_SIMPLE = {
20224
20309
  "gemini-3.8-flash": {
20225
20310
  name: "Gemini 3.8 Flash",
@@ -20307,6 +20392,39 @@ var TIER_MAPPING = {
20307
20392
  high: "gemini-3.1-pro-high"
20308
20393
  }
20309
20394
  };
20395
+ function resolveModelTier(baseModelId, headersOrInit) {
20396
+ const parts = baseModelId.split("@");
20397
+ const base = parts[0] || "";
20398
+ const suffixTier = parts[1]?.toLowerCase();
20399
+ const mapping = TIER_MAPPING[base];
20400
+ if (!mapping) {
20401
+ return baseModelId;
20402
+ }
20403
+ const rawHeaders = headersOrInit && typeof headersOrInit === "object" && "headers" in headersOrInit ? headersOrInit.headers : headersOrInit;
20404
+ const headerTier = getSafeHeader(rawHeaders, "x-agy-tier")?.toLowerCase() || null;
20405
+ const requestedTier = headerTier || suffixTier;
20406
+ if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20407
+ return mapping[requestedTier] || baseModelId;
20408
+ }
20409
+ return mapping["medium"] ?? mapping["high"] ?? baseModelId;
20410
+ }
20411
+
20412
+ // src/plugin.ts
20413
+ var AGY_QUOTA_COMMAND = "agyquota";
20414
+ var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20415
+
20416
+ Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20417
+ Do not call other tools.
20418
+ `;
20419
+ var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20420
+ 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.
20421
+
20422
+ Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20423
+ Do not call other tools.
20424
+ `;
20425
+ var latestAgyAuthResolver;
20426
+ var latestAgyConfiguredProjectId;
20427
+ var latestAgyUserAgentModel;
20310
20428
  var buildModelFromSimple = (modelId, simple) => {
20311
20429
  const isClaude = modelId.startsWith("claude-");
20312
20430
  const isGpt = modelId.startsWith("gpt-");
@@ -20400,83 +20518,6 @@ var STATIC_MODELS = {};
20400
20518
  for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
20401
20519
  STATIC_MODELS[modelId] = buildModelFromSimple(modelId, simple);
20402
20520
  }
20403
- function getSafeHeader(headers, key) {
20404
- if (!headers) {
20405
- return void 0;
20406
- }
20407
- const targetKey = key.toLowerCase();
20408
- if (typeof headers.get === "function") {
20409
- try {
20410
- return headers.get(targetKey) || void 0;
20411
- } catch {
20412
- }
20413
- }
20414
- if (Array.isArray(headers)) {
20415
- const found = headers.find((item) => {
20416
- if (Array.isArray(item) && typeof item[0] === "string") {
20417
- return item[0].toLowerCase() === targetKey;
20418
- }
20419
- return false;
20420
- });
20421
- return found ? String(found[1]) : void 0;
20422
- }
20423
- if (typeof headers === "object") {
20424
- const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20425
- return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20426
- }
20427
- return void 0;
20428
- }
20429
- function setSafeHeaders(initHeaders, newHeaders) {
20430
- if (typeof globalThis.Headers !== "undefined") {
20431
- const headers = new globalThis.Headers(initHeaders ?? {});
20432
- for (const [k, v] of Object.entries(newHeaders)) {
20433
- headers.set(k, v);
20434
- }
20435
- return headers;
20436
- }
20437
- if (Array.isArray(initHeaders)) {
20438
- const nextHeaders2 = [...initHeaders];
20439
- for (const [k, v] of Object.entries(newHeaders)) {
20440
- const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20441
- if (idx !== -1) {
20442
- nextHeaders2[idx] = [k, v];
20443
- } else {
20444
- nextHeaders2.push([k, v]);
20445
- }
20446
- }
20447
- return nextHeaders2;
20448
- }
20449
- const nextHeaders = {};
20450
- if (initHeaders && typeof initHeaders === "object") {
20451
- for (const [k, v] of Object.entries(initHeaders)) {
20452
- nextHeaders[k] = String(v);
20453
- }
20454
- }
20455
- for (const [k, v] of Object.entries(newHeaders)) {
20456
- const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20457
- if (existingKey) {
20458
- nextHeaders[existingKey] = v;
20459
- } else {
20460
- nextHeaders[k] = v;
20461
- }
20462
- }
20463
- return nextHeaders;
20464
- }
20465
- function resolveModelTier(baseModelId, init) {
20466
- const parts = baseModelId.split("@");
20467
- const base = parts[0] || "";
20468
- const suffixTier = parts[1]?.toLowerCase();
20469
- const mapping = TIER_MAPPING[base];
20470
- if (!mapping) {
20471
- return baseModelId;
20472
- }
20473
- const headerTier = getSafeHeader(init?.headers, "x-agy-tier")?.toLowerCase() || null;
20474
- const requestedTier = headerTier || suffixTier;
20475
- if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20476
- return mapping[requestedTier] || baseModelId;
20477
- }
20478
- return mapping["medium"] ?? mapping["high"];
20479
- }
20480
20521
  var AgyCLIOAuthPlugin = async ({ client }) => {
20481
20522
  let latestConfig;
20482
20523
  updateStaticModelsWithPricing(STATIC_MODELS);
@@ -20804,25 +20845,754 @@ async function ensureProjectContextOrThrow(authRecord, client, configuredProject
20804
20845
  throw error45;
20805
20846
  }
20806
20847
  }
20807
- function toUrlString(value) {
20808
- if (typeof value === "string") {
20809
- return value;
20848
+
20849
+ // src/plugin/types.ts
20850
+ function defineOpenCodeV2Plugin(def) {
20851
+ return def;
20852
+ }
20853
+
20854
+ // src/plugin/v2-storage.ts
20855
+ import { existsSync as existsSync6, mkdirSync as mkdirSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "fs";
20856
+ import { homedir as homedir4 } from "os";
20857
+ import { join as join6 } from "path";
20858
+ var storedAuthOverrideForTesting = void 0;
20859
+ function loadStoredAuthFromJson() {
20860
+ if (storedAuthOverrideForTesting !== void 0) {
20861
+ return storedAuthOverrideForTesting;
20862
+ }
20863
+ const authPath = join6(homedir4(), ".local", "share", "opencode", "auth.json");
20864
+ try {
20865
+ if (existsSync6(authPath)) {
20866
+ const content = readFileSync5(authPath, "utf8");
20867
+ const data = JSON.parse(content);
20868
+ return data?.[AGY_PROVIDER_ID];
20869
+ }
20870
+ } catch {
20810
20871
  }
20811
- const candidate = value.url;
20812
- if (candidate) {
20813
- return candidate;
20872
+ return void 0;
20873
+ }
20874
+ function saveStoredAuthToJson(authRecord) {
20875
+ if (process.env.NODE_ENV === "test" || process.env.VITEST || storedAuthOverrideForTesting !== void 0) {
20876
+ return;
20814
20877
  }
20815
- return value.toString();
20878
+ try {
20879
+ const dirPath = join6(homedir4(), ".local", "share", "opencode");
20880
+ if (!existsSync6(dirPath)) {
20881
+ mkdirSync5(dirPath, { recursive: true });
20882
+ }
20883
+ const authPath = join6(dirPath, "auth.json");
20884
+ let data = {};
20885
+ if (existsSync6(authPath)) {
20886
+ try {
20887
+ data = JSON.parse(readFileSync5(authPath, "utf8")) || {};
20888
+ } catch {
20889
+ data = {};
20890
+ }
20891
+ }
20892
+ data[AGY_PROVIDER_ID] = {
20893
+ type: "oauth",
20894
+ refresh: authRecord.refresh,
20895
+ access: authRecord.access,
20896
+ expires: authRecord.expires
20897
+ };
20898
+ writeFileSync5(authPath, JSON.stringify(data, null, 2), "utf8");
20899
+ } catch {
20900
+ }
20901
+ }
20902
+
20903
+ // src/plugin/v2-fetch.ts
20904
+ function createV2FetchInterceptor(getAuthSnapshot) {
20905
+ return async function agyV2Fetch(input, init) {
20906
+ const isGL = isGenerativeLanguageRequest(input);
20907
+ const isInternal = toUrlString(input).includes("cloudcode-pa.googleapis.com");
20908
+ if (!isGL && !isInternal) {
20909
+ return (globalThis.fetch || fetch)(input, init);
20910
+ }
20911
+ let rawAuth = getAuthSnapshot ? await getAuthSnapshot() : void 0;
20912
+ if (!rawAuth) {
20913
+ rawAuth = loadStoredAuthFromJson();
20914
+ }
20915
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
20916
+ return (globalThis.fetch || fetch)(input, init);
20917
+ }
20918
+ let authRecord = resolveCachedAuth(rawAuth);
20919
+ if (accessTokenExpired(authRecord)) {
20920
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
20921
+ } } });
20922
+ if (refreshed) {
20923
+ authRecord = refreshed;
20924
+ }
20925
+ }
20926
+ if (!authRecord.access) {
20927
+ return (globalThis.fetch || fetch)(input, init);
20928
+ }
20929
+ if (isInternal) {
20930
+ const hasAuth = getSafeHeader(init?.headers, "Authorization") !== void 0;
20931
+ if (hasAuth) {
20932
+ return (globalThis.fetch || fetch)(input, init);
20933
+ }
20934
+ const userAgent = buildAgyCliUserAgent();
20935
+ const headers = setSafeHeaders(init?.headers, {
20936
+ Authorization: `Bearer ${authRecord.access}`,
20937
+ "User-Agent": userAgent
20938
+ });
20939
+ return (globalThis.fetch || fetch)(input, {
20940
+ ...init,
20941
+ headers
20942
+ });
20943
+ }
20944
+ const requestTarget = parseGenerativeLanguageRequest(input);
20945
+ const requestUserAgentModel = requestTarget?.effectiveModel;
20946
+ let projectContext;
20947
+ try {
20948
+ projectContext = await ensureProjectContext(
20949
+ authRecord,
20950
+ { auth: { set: async () => {
20951
+ } } },
20952
+ void 0,
20953
+ requestUserAgentModel
20954
+ );
20955
+ } catch {
20956
+ projectContext = {
20957
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
20958
+ auth: authRecord
20959
+ };
20960
+ }
20961
+ const originalRequestedModel = parseGenerativeLanguageRequest(input)?.effectiveModel;
20962
+ let modifiedInput = input;
20963
+ if (isGL && originalRequestedModel) {
20964
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
20965
+ const resolvedBase = resolveModelTier(originalBase, init);
20966
+ if (originalBase !== resolvedBase) {
20967
+ if (typeof modifiedInput === "string") {
20968
+ modifiedInput = modifiedInput.replace(`models/${originalBase}`, `models/${resolvedBase}`);
20969
+ } else if (typeof Request !== "undefined" && modifiedInput instanceof Request) {
20970
+ const newUrl = modifiedInput.url.replace(`models/${originalBase}`, `models/${resolvedBase}`);
20971
+ modifiedInput = new Request(newUrl, modifiedInput);
20972
+ }
20973
+ }
20974
+ }
20975
+ const transformed = prepareAgyRequest(
20976
+ modifiedInput,
20977
+ init,
20978
+ authRecord.access,
20979
+ projectContext.effectiveProjectId,
20980
+ void 0
20981
+ );
20982
+ const chatLogger = createChatLogger();
20983
+ if (chatLogger) {
20984
+ chatLogger.logRequest(
20985
+ toUrlString(transformed.request),
20986
+ transformed.init.method || "GET",
20987
+ transformed.init.headers,
20988
+ transformed.init.body
20989
+ );
20990
+ }
20991
+ const response = await fetchWithRetry(transformed.request, transformed.init);
20992
+ return transformAgyResponse(
20993
+ response,
20994
+ transformed.streaming,
20995
+ null,
20996
+ transformed.requestedModel,
20997
+ transformed.sessionId,
20998
+ chatLogger
20999
+ );
21000
+ };
21001
+ }
21002
+
21003
+ // src/plugin/v2-session.ts
21004
+ function createV2HttpRequestHook(state = {}) {
21005
+ return async (event) => {
21006
+ if (!event) return;
21007
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21008
+ const isGL = isGenerativeLanguageRequest(rawUrl);
21009
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21010
+ if (!isGL && !isInternal) {
21011
+ return;
21012
+ }
21013
+ event.headers = event.headers || {};
21014
+ let modelName;
21015
+ let rawAuth = event.auth;
21016
+ if (rawAuth && !rawAuth.type) {
21017
+ const tokenVal = rawAuth.access || rawAuth.token;
21018
+ if (tokenVal || rawAuth.refresh) {
21019
+ rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
21020
+ }
21021
+ }
21022
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
21023
+ rawAuth = loadStoredAuthFromJson();
21024
+ }
21025
+ let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
21026
+ if (authRecord && accessTokenExpired(authRecord)) {
21027
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
21028
+ } } });
21029
+ if (refreshed) {
21030
+ authRecord = refreshed;
21031
+ saveStoredAuthToJson(refreshed);
21032
+ }
21033
+ }
21034
+ if (isGL) {
21035
+ const parsed = parseGenerativeLanguageRequest(rawUrl);
21036
+ modelName = parsed?.effectiveModel;
21037
+ if (modelName) {
21038
+ state.lastInterceptedModel = modelName;
21039
+ }
21040
+ if (typeof event.headers.delete === "function") {
21041
+ event.headers.delete("x-goog-api-key");
21042
+ event.headers.delete("api-key");
21043
+ } else {
21044
+ for (const key of Object.keys(event.headers)) {
21045
+ const lower = key.toLowerCase();
21046
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21047
+ delete event.headers[key];
21048
+ }
21049
+ }
21050
+ }
21051
+ if (event.request?.headers) {
21052
+ if (typeof event.request.headers.delete === "function") {
21053
+ event.request.headers.delete("x-goog-api-key");
21054
+ event.request.headers.delete("api-key");
21055
+ } else {
21056
+ for (const key of Object.keys(event.request.headers)) {
21057
+ const lower = key.toLowerCase();
21058
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21059
+ delete event.request.headers[key];
21060
+ }
21061
+ }
21062
+ }
21063
+ }
21064
+ let cleanUrl = rawUrl;
21065
+ try {
21066
+ const parsedUrl = new URL(rawUrl);
21067
+ let urlChanged = false;
21068
+ for (const param of ["key", "x-goog-api-key", "api-key"]) {
21069
+ if (parsedUrl.searchParams.has(param)) {
21070
+ parsedUrl.searchParams.delete(param);
21071
+ urlChanged = true;
21072
+ }
21073
+ }
21074
+ if (urlChanged) {
21075
+ cleanUrl = parsedUrl.toString();
21076
+ }
21077
+ } catch {
21078
+ }
21079
+ if (authRecord && authRecord.access) {
21080
+ let projectContext;
21081
+ try {
21082
+ projectContext = await ensureProjectContext(
21083
+ authRecord,
21084
+ { auth: { set: async () => {
21085
+ } } },
21086
+ void 0,
21087
+ modelName
21088
+ );
21089
+ } catch {
21090
+ projectContext = {
21091
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
21092
+ auth: authRecord
21093
+ };
21094
+ }
21095
+ const originalRequestedModel = modelName;
21096
+ let modifiedUrl = cleanUrl;
21097
+ if (originalRequestedModel) {
21098
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
21099
+ const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
21100
+ const resolvedBase = resolveModelTier(originalBase, { headers: initHeaders });
21101
+ if (originalBase !== resolvedBase) {
21102
+ modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
21103
+ }
21104
+ }
21105
+ let bodyPayload = event.body;
21106
+ if (bodyPayload === void 0 && event.request) {
21107
+ if (typeof event.request.clone === "function") {
21108
+ try {
21109
+ bodyPayload = await event.request.clone().text();
21110
+ } catch {
21111
+ }
21112
+ } else if (event.request.body !== void 0) {
21113
+ bodyPayload = event.request.body;
21114
+ }
21115
+ }
21116
+ let preExistingUserAgent;
21117
+ if (typeof event.headers?.get === "function") {
21118
+ preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
21119
+ } else if (event.headers && typeof event.headers === "object") {
21120
+ preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
21121
+ }
21122
+ if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
21123
+ preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
21124
+ } else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
21125
+ preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
21126
+ }
21127
+ const method = event.method || event.request?.method || "POST";
21128
+ const requestHeaders = event.headers || event.request?.headers;
21129
+ const transformed = prepareAgyRequest(
21130
+ modifiedUrl,
21131
+ {
21132
+ method,
21133
+ headers: requestHeaders,
21134
+ body: bodyPayload
21135
+ },
21136
+ authRecord.access,
21137
+ projectContext.effectiveProjectId
21138
+ );
21139
+ const targetUrl = toUrlString(transformed.request);
21140
+ if (typeof event.url === "string") {
21141
+ event.url = targetUrl;
21142
+ }
21143
+ if (event.request && typeof event.request === "object") {
21144
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21145
+ event.request = new Request(targetUrl, {
21146
+ method: transformed.init.method,
21147
+ headers: transformed.init.headers,
21148
+ body: transformed.init.body
21149
+ });
21150
+ } else if (typeof event.request.url === "string") {
21151
+ try {
21152
+ event.request.url = targetUrl;
21153
+ } catch {
21154
+ }
21155
+ }
21156
+ }
21157
+ const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
21158
+ for (const [k, v] of headerEntries) {
21159
+ const lowerK = k.toLowerCase();
21160
+ if (lowerK === "user-agent") {
21161
+ if (preExistingUserAgent) {
21162
+ continue;
21163
+ }
21164
+ if (typeof event.headers?.set === "function") {
21165
+ event.headers.set("User-Agent", v);
21166
+ } else if (event.headers) {
21167
+ event.headers["User-Agent"] = v;
21168
+ }
21169
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21170
+ event.request.headers.set("User-Agent", v);
21171
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21172
+ event.request.headers["User-Agent"] = v;
21173
+ }
21174
+ continue;
21175
+ }
21176
+ if (typeof event.headers?.set === "function") {
21177
+ event.headers.set(k, v);
21178
+ } else if (event.headers) {
21179
+ event.headers[k] = v;
21180
+ }
21181
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21182
+ event.request.headers.set(k, v);
21183
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21184
+ event.request.headers[k] = v;
21185
+ }
21186
+ }
21187
+ if (transformed.init.body !== void 0) {
21188
+ event.body = transformed.init.body;
21189
+ if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
21190
+ event.request.body = transformed.init.body;
21191
+ }
21192
+ }
21193
+ } else {
21194
+ if (typeof event.url === "string") {
21195
+ event.url = cleanUrl;
21196
+ }
21197
+ if (event.request && typeof event.request === "object") {
21198
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21199
+ event.request = new Request(cleanUrl, event.request);
21200
+ } else if (typeof event.request.url === "string") {
21201
+ try {
21202
+ event.request.url = cleanUrl;
21203
+ } catch {
21204
+ }
21205
+ }
21206
+ }
21207
+ }
21208
+ }
21209
+ if (authRecord && authRecord.access) {
21210
+ if (typeof event.headers?.set === "function") {
21211
+ event.headers.set("Authorization", `Bearer ${authRecord.access}`);
21212
+ } else if (event.headers) {
21213
+ event.headers["Authorization"] = `Bearer ${authRecord.access}`;
21214
+ }
21215
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21216
+ event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
21217
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21218
+ event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
21219
+ }
21220
+ }
21221
+ const userAgent = buildAgyCliUserAgent(modelName);
21222
+ if (typeof event.headers?.set === "function") {
21223
+ if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
21224
+ event.headers.set("User-Agent", userAgent);
21225
+ }
21226
+ } else if (event.headers) {
21227
+ if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
21228
+ event.headers["User-Agent"] = userAgent;
21229
+ }
21230
+ }
21231
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21232
+ if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
21233
+ event.request.headers.set("User-Agent", userAgent);
21234
+ }
21235
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21236
+ if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
21237
+ event.request.headers["User-Agent"] = userAgent;
21238
+ }
21239
+ }
21240
+ };
21241
+ }
21242
+ function createV2HttpResponseHook(state = {}) {
21243
+ return async (event) => {
21244
+ if (!event || !event.response) return;
21245
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21246
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21247
+ if (isInternal && event.response instanceof Response) {
21248
+ const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
21249
+ const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || state.lastInterceptedModel;
21250
+ const transformed = await transformAgyResponse(
21251
+ event.response,
21252
+ !!isStreaming,
21253
+ null,
21254
+ parsedModel,
21255
+ void 0,
21256
+ void 0
21257
+ );
21258
+ event.response = transformed;
21259
+ }
21260
+ };
21261
+ }
21262
+ function createV2RetryHook() {
21263
+ return async (event) => {
21264
+ if (!event) return;
21265
+ const response = event.response;
21266
+ if (response instanceof Response) {
21267
+ if (response.status === 429 || response.status === 503) {
21268
+ const quota = await classifyQuotaResponse(response);
21269
+ if (quota?.retryDelayMs) {
21270
+ event.retryDelayMs = quota.retryDelayMs;
21271
+ } else {
21272
+ event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
21273
+ }
21274
+ }
21275
+ } else if (event.details && Array.isArray(event.details)) {
21276
+ const retryInfo = event.details.find(
21277
+ (d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
21278
+ );
21279
+ if (retryInfo?.retryDelay) {
21280
+ const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
21281
+ if (delayMs !== null) {
21282
+ event.retryDelayMs = delayMs;
21283
+ }
21284
+ }
21285
+ }
21286
+ };
21287
+ }
21288
+ function registerV2SessionHooks(ctx) {
21289
+ const state = {};
21290
+ ctx.session.hook("http.request", createV2HttpRequestHook(state), { providerID: AGY_PROVIDER_ID });
21291
+ ctx.session.hook("http.response", createV2HttpResponseHook(state), { providerID: AGY_PROVIDER_ID });
21292
+ ctx.session.hook("retry", createV2RetryHook(), { providerID: AGY_PROVIDER_ID });
20816
21293
  }
20817
21294
 
21295
+ // src/plugin/v2.ts
21296
+ async function setupOpenCodeV2(ctx) {
21297
+ const resolveVariants = (modelId) => {
21298
+ const mapping = TIER_MAPPING[modelId];
21299
+ if (!mapping) return void 0;
21300
+ const variants = [];
21301
+ if (mapping.minimal !== void 0) variants.push({ id: "minimal" });
21302
+ if (mapping.low !== void 0) variants.push({ id: "low" });
21303
+ if (mapping.medium !== void 0) variants.push({ id: "medium" });
21304
+ if (mapping.high !== void 0) variants.push({ id: "high" });
21305
+ return variants.length > 0 ? variants : void 0;
21306
+ };
21307
+ const updateProviderRecord = (p) => {
21308
+ p.name = "Antigravity CLI";
21309
+ p.activation = "enabled";
21310
+ p.package = "aisdk:@ai-sdk/google";
21311
+ p.description = "Google Gemini Antigravity Code Assist OAuth provider";
21312
+ p.settings = { ...p.settings || {}, apiKey: "dummy" };
21313
+ p.integrationID = AGY_PROVIDER_ID;
21314
+ };
21315
+ const buildModelRecord = (modelId, simple, existingModel) => {
21316
+ const isClaude = modelId.startsWith("claude-");
21317
+ const isGpt = modelId.startsWith("gpt-");
21318
+ const variants = resolveVariants(modelId);
21319
+ return {
21320
+ id: modelId,
21321
+ providerID: AGY_PROVIDER_ID,
21322
+ name: simple.name,
21323
+ description: simple.description,
21324
+ family: modelId.includes("gemini") ? "gemini" : isClaude ? "claude" : isGpt ? "gpt" : "unknown",
21325
+ reasoning: simple.reasoning,
21326
+ attachment: simple.attachment,
21327
+ tool_call: simple.toolCall,
21328
+ limit: {
21329
+ context: simple.maxTokens,
21330
+ output: simple.maxOutputTokens
21331
+ },
21332
+ cost: simple.cost || { input: 0, output: 0 },
21333
+ ...variants ? { variants } : {},
21334
+ ...existingModel || {}
21335
+ };
21336
+ };
21337
+ const updateModelRecord = (m, modelId, simple) => {
21338
+ m.name = simple.name;
21339
+ m.capabilities = {
21340
+ tools: true,
21341
+ input: ["text", "image"],
21342
+ output: ["text"]
21343
+ };
21344
+ m.limit = {
21345
+ context: simple.maxTokens,
21346
+ output: simple.maxOutputTokens
21347
+ };
21348
+ m.family = "gemini";
21349
+ if (simple.cost) {
21350
+ m.cost = simple.cost;
21351
+ }
21352
+ const variants = resolveVariants(modelId);
21353
+ if (variants) {
21354
+ m.variants = variants;
21355
+ }
21356
+ };
21357
+ if (ctx.provider?.transform) {
21358
+ ctx.provider.transform(async (editor) => {
21359
+ if (!editor) return;
21360
+ if (typeof editor.update === "function") {
21361
+ editor.update(AGY_PROVIDER_ID, updateProviderRecord);
21362
+ } else if (typeof editor.set === "function") {
21363
+ const p = { id: AGY_PROVIDER_ID };
21364
+ updateProviderRecord(p);
21365
+ editor.set(AGY_PROVIDER_ID, p);
21366
+ } else if (typeof editor === "object") {
21367
+ const p = editor[AGY_PROVIDER_ID] || { id: AGY_PROVIDER_ID };
21368
+ updateProviderRecord(p);
21369
+ editor[AGY_PROVIDER_ID] = p;
21370
+ }
21371
+ });
21372
+ }
21373
+ if (ctx.model?.transform) {
21374
+ ctx.model.transform(async (editor) => {
21375
+ if (!editor) return;
21376
+ if (typeof editor.update === "function") {
21377
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21378
+ editor.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21379
+ }
21380
+ } else if (typeof editor.set === "function") {
21381
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21382
+ const m = buildModelRecord(modelId, simple);
21383
+ editor.set(`${AGY_PROVIDER_ID}:${modelId}`, m);
21384
+ }
21385
+ } else if (typeof editor === "object") {
21386
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21387
+ const key = `${AGY_PROVIDER_ID}:${modelId}`;
21388
+ editor[key] = buildModelRecord(modelId, simple, editor[key]);
21389
+ }
21390
+ }
21391
+ });
21392
+ }
21393
+ if (ctx.catalog?.transform) {
21394
+ ctx.catalog.transform(async (editor) => {
21395
+ if (!editor) return;
21396
+ if (typeof editor?.provider?.update === "function") {
21397
+ editor.provider.update(AGY_PROVIDER_ID, updateProviderRecord);
21398
+ if (typeof editor?.model?.update === "function") {
21399
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21400
+ editor.model.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21401
+ }
21402
+ }
21403
+ return;
21404
+ }
21405
+ const catalog = editor;
21406
+ catalog.providers = catalog.providers || {};
21407
+ catalog.providers[AGY_PROVIDER_ID] = {
21408
+ id: AGY_PROVIDER_ID,
21409
+ name: "Antigravity CLI",
21410
+ npm: "aisdk:@ai-sdk/google",
21411
+ settings: { apiKey: "dummy" },
21412
+ integrationID: AGY_PROVIDER_ID,
21413
+ models: { ...catalog.providers[AGY_PROVIDER_ID]?.models || {} },
21414
+ ...catalog.providers[AGY_PROVIDER_ID]
21415
+ };
21416
+ if (catalog.providers[AGY_PROVIDER_ID].settings) {
21417
+ catalog.providers[AGY_PROVIDER_ID].settings = {
21418
+ ...catalog.providers[AGY_PROVIDER_ID].settings,
21419
+ apiKey: "dummy"
21420
+ };
21421
+ } else {
21422
+ catalog.providers[AGY_PROVIDER_ID].settings = { apiKey: "dummy" };
21423
+ }
21424
+ catalog.providers[AGY_PROVIDER_ID].integrationID = AGY_PROVIDER_ID;
21425
+ const targetModels = catalog.providers[AGY_PROVIDER_ID].models;
21426
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21427
+ targetModels[modelId] = buildModelRecord(modelId, simple, targetModels[modelId]);
21428
+ }
21429
+ });
21430
+ }
21431
+ ctx.tool.transform(async (editor) => {
21432
+ if (!editor) return;
21433
+ const quotaTool = createAgyQuotaTool({
21434
+ client: void 0,
21435
+ getAuthResolver: () => void 0,
21436
+ getConfiguredProjectId: () => void 0,
21437
+ getUserAgentModel: () => void 0
21438
+ });
21439
+ const quotaSummaryTool = createAgyQuotaSummaryTool({
21440
+ client: void 0,
21441
+ getAuthResolver: () => void 0,
21442
+ getConfiguredProjectId: () => void 0,
21443
+ getUserAgentModel: () => void 0
21444
+ });
21445
+ if (typeof editor.add === "function") {
21446
+ editor.add({
21447
+ name: AGY_QUOTA_TOOL_NAME,
21448
+ description: quotaTool.description,
21449
+ input: {},
21450
+ execute: async (args, context) => quotaTool.execute(args, context)
21451
+ });
21452
+ editor.add({
21453
+ name: AGY_QUOTA_SUMMARY_TOOL_NAME,
21454
+ description: quotaSummaryTool.description,
21455
+ input: {},
21456
+ execute: async (args, context) => quotaSummaryTool.execute(args, context)
21457
+ });
21458
+ } else if (typeof editor.set === "function") {
21459
+ editor.set(AGY_QUOTA_TOOL_NAME, quotaTool);
21460
+ editor.set(AGY_QUOTA_SUMMARY_TOOL_NAME, quotaSummaryTool);
21461
+ } else if (editor.tools && typeof editor.tools === "object") {
21462
+ editor.tools[AGY_QUOTA_TOOL_NAME] = quotaTool;
21463
+ editor.tools[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21464
+ } else if (typeof editor === "object") {
21465
+ editor[AGY_QUOTA_TOOL_NAME] = quotaTool;
21466
+ editor[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21467
+ }
21468
+ });
21469
+ ctx.command.transform(async (editor) => {
21470
+ if (!editor) return;
21471
+ const commands = {
21472
+ [AGY_V2_QUOTA_COMMAND]: {
21473
+ description: "Show Agy Code Assist quota usage",
21474
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21475
+ },
21476
+ [AGY_V2_QUOTA_SUMMARY_COMMAND]: {
21477
+ description: "Show Agy Code Assist quota summary with weekly and 5-hour limits",
21478
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21479
+ }
21480
+ };
21481
+ if (typeof editor.add === "function") {
21482
+ editor.add({
21483
+ name: AGY_V2_QUOTA_COMMAND,
21484
+ description: "Display current Antigravity quota usage",
21485
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21486
+ });
21487
+ editor.add({
21488
+ name: AGY_V2_QUOTA_SUMMARY_COMMAND,
21489
+ description: "Display Antigravity quota summary grouped by model family",
21490
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21491
+ });
21492
+ } else if (typeof editor.set === "function") {
21493
+ editor.set(AGY_V2_QUOTA_COMMAND, commands[AGY_V2_QUOTA_COMMAND]);
21494
+ editor.set(AGY_V2_QUOTA_SUMMARY_COMMAND, commands[AGY_V2_QUOTA_SUMMARY_COMMAND]);
21495
+ } else if (editor.commands && typeof editor.commands === "object") {
21496
+ editor.commands[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21497
+ editor.commands[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21498
+ } else if (typeof editor === "object") {
21499
+ editor[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21500
+ editor[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21501
+ }
21502
+ });
21503
+ ctx.integration?.transform?.((editor) => {
21504
+ if (!editor) return;
21505
+ editor.update?.(AGY_PROVIDER_ID, (integration) => {
21506
+ integration.name = "Antigravity CLI (plugin)";
21507
+ });
21508
+ editor.method?.update?.({
21509
+ integrationID: AGY_PROVIDER_ID,
21510
+ method: {
21511
+ id: "oauth",
21512
+ type: "oauth",
21513
+ label: "Antigravity CLI (OAuth)"
21514
+ },
21515
+ authorize: async () => {
21516
+ const authorization = await authorizeAgy();
21517
+ return {
21518
+ mode: "code",
21519
+ url: authorization.url,
21520
+ instructions: "Please complete Google account authorization in your browser. After authorization, copy the full redirect URL or code and paste it below:",
21521
+ callback: async (code) => {
21522
+ const trimmed = code.trim();
21523
+ const parsed = parseOAuthCallbackInput(trimmed);
21524
+ const authCode = parsed.code || trimmed;
21525
+ if (!authCode) {
21526
+ return { type: "failed", error: "Missing authorization code in callback input" };
21527
+ }
21528
+ if (parsed.state && parsed.state !== authorization.state) {
21529
+ return { type: "failed", error: "State mismatch in callback input (possible CSRF attempt)" };
21530
+ }
21531
+ const exchangeResult = await exchangeAgyWithVerifier(authCode, authorization.verifier);
21532
+ if (exchangeResult.type !== "success") {
21533
+ return exchangeResult;
21534
+ }
21535
+ const initialRefresh = formatRefreshParts({
21536
+ refreshToken: exchangeResult.refresh
21537
+ });
21538
+ let authRecord = {
21539
+ type: "oauth",
21540
+ refresh: initialRefresh,
21541
+ access: exchangeResult.access,
21542
+ expires: exchangeResult.expires
21543
+ };
21544
+ try {
21545
+ const projectContext = await ensureProjectContext(
21546
+ authRecord,
21547
+ { auth: { set: async () => {
21548
+ } } }
21549
+ );
21550
+ authRecord = {
21551
+ ...authRecord,
21552
+ refresh: projectContext.auth.refresh
21553
+ };
21554
+ } catch {
21555
+ }
21556
+ saveStoredAuthToJson(authRecord);
21557
+ return {
21558
+ type: "oauth",
21559
+ methodID: "oauth",
21560
+ refresh: authRecord.refresh,
21561
+ access: authRecord.access,
21562
+ expires: authRecord.expires
21563
+ };
21564
+ }
21565
+ };
21566
+ }
21567
+ });
21568
+ });
21569
+ ctx.aisdk?.hook("sdk", async (event) => {
21570
+ if (!event) return;
21571
+ const isMatchingProvider = event.providerID === AGY_PROVIDER_ID || event.model?.providerID === AGY_PROVIDER_ID;
21572
+ if (!isMatchingProvider) return;
21573
+ event.options = event.options || {};
21574
+ event.options.apiKey = "dummy";
21575
+ event.options.fetch = createV2FetchInterceptor();
21576
+ });
21577
+ registerV2SessionHooks(ctx);
21578
+ }
21579
+ var v2PluginDefinition = defineOpenCodeV2Plugin({
21580
+ id: AGY_PROVIDER_ID,
21581
+ setup: setupOpenCodeV2
21582
+ });
21583
+
20818
21584
  // index.ts
20819
- var index_default = {
20820
- id: "@anthonyhaussman/opencode-agy-auth",
21585
+ var dualPlugin = {
21586
+ ...v2PluginDefinition,
20821
21587
  server: AgyCLIOAuthPlugin
20822
21588
  };
21589
+ var index_default = dualPlugin;
20823
21590
  export {
20824
21591
  AgyCLIOAuthPlugin,
20825
21592
  GoogleOAuthPlugin,
20826
- index_default as default
21593
+ index_default as default,
21594
+ defineOpenCodeV2Plugin,
21595
+ setupOpenCodeV2,
21596
+ v2PluginDefinition
20827
21597
  };
20828
21598
  //# sourceMappingURL=index.js.map