@anthonyhaussman/opencode-agy-auth 1.2.7 → 1.2.8-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.7";
271
+ var AGY_CLI_VERSION = "1.2.8";
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,
@@ -16043,8 +16072,7 @@ var models_default = {
16043
16072
  }
16044
16073
  },
16045
16074
  experimentIds: [
16046
- 106738697,
16047
- 106329234,
16075
+ 106140402,
16048
16076
  106519115,
16049
16077
  105979552,
16050
16078
  105979574,
@@ -16066,7 +16094,6 @@ var models_default = {
16066
16094
  106283618,
16067
16095
  106640126,
16068
16096
  106278607,
16069
- 106512082,
16070
16097
  106380926,
16071
16098
  106723203,
16072
16099
  106242397,
@@ -16152,7 +16179,7 @@ var models_default = {
16152
16179
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16153
16180
  quotaInfo: {
16154
16181
  remainingFraction: 1,
16155
- resetTime: "2026-09-19T15:08:03Z"
16182
+ resetTime: "2026-09-22T12:32:50Z"
16156
16183
  },
16157
16184
  recommended: true,
16158
16185
  supportedMimeTypes: {
@@ -16191,7 +16218,7 @@ var models_default = {
16191
16218
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16192
16219
  quotaInfo: {
16193
16220
  remainingFraction: 1,
16194
- resetTime: "2026-09-19T15:08:03Z"
16221
+ resetTime: "2026-09-22T12:32:50Z"
16195
16222
  },
16196
16223
  recommended: true,
16197
16224
  supportedMimeTypes: {
@@ -16227,8 +16254,8 @@ var models_default = {
16227
16254
  },
16228
16255
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16229
16256
  quotaInfo: {
16230
- remainingFraction: 0.964089,
16231
- resetTime: "2026-09-19T14:53:58Z"
16257
+ remainingFraction: 0.9721721,
16258
+ resetTime: "2026-09-22T12:27:35Z"
16232
16259
  },
16233
16260
  recommended: true,
16234
16261
  supportedMimeTypes: {
@@ -16310,8 +16337,8 @@ var models_default = {
16310
16337
  },
16311
16338
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16312
16339
  quotaInfo: {
16313
- remainingFraction: 0.964089,
16314
- resetTime: "2026-09-19T14:53:58Z"
16340
+ remainingFraction: 0.9721721,
16341
+ resetTime: "2026-09-22T12:27:35Z"
16315
16342
  },
16316
16343
  recommended: true,
16317
16344
  supportedMimeTypes: {
@@ -16393,8 +16420,8 @@ var models_default = {
16393
16420
  },
16394
16421
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16395
16422
  quotaInfo: {
16396
- remainingFraction: 0.964089,
16397
- resetTime: "2026-09-19T14:53:58Z"
16423
+ remainingFraction: 0.9721721,
16424
+ resetTime: "2026-09-22T12:27:35Z"
16398
16425
  },
16399
16426
  recommended: true,
16400
16427
  supportedMimeTypes: {
@@ -16473,8 +16500,8 @@ var models_default = {
16473
16500
  },
16474
16501
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16475
16502
  quotaInfo: {
16476
- remainingFraction: 0.964089,
16477
- resetTime: "2026-09-19T14:53:58Z"
16503
+ remainingFraction: 0.9721721,
16504
+ resetTime: "2026-09-22T12:27:35Z"
16478
16505
  },
16479
16506
  recommended: true,
16480
16507
  requiresImageOutputOutsideFunctionResponses: true,
@@ -16554,8 +16581,8 @@ var models_default = {
16554
16581
  },
16555
16582
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16556
16583
  quotaInfo: {
16557
- remainingFraction: 0.964089,
16558
- resetTime: "2026-09-19T14:53:58Z"
16584
+ remainingFraction: 0.9721721,
16585
+ resetTime: "2026-09-22T12:27:35Z"
16559
16586
  },
16560
16587
  recommended: true,
16561
16588
  supportedMimeTypes: {
@@ -16659,8 +16686,8 @@ var models_default = {
16659
16686
  },
16660
16687
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16661
16688
  quotaInfo: {
16662
- remainingFraction: 0.964089,
16663
- resetTime: "2026-09-19T14:53:58Z"
16689
+ remainingFraction: 0.9721721,
16690
+ resetTime: "2026-09-22T12:27:35Z"
16664
16691
  },
16665
16692
  recommended: true,
16666
16693
  supportedMimeTypes: {
@@ -16729,8 +16756,8 @@ var models_default = {
16729
16756
  model: "MODEL_PLACEHOLDER_M21",
16730
16757
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16731
16758
  quotaInfo: {
16732
- remainingFraction: 0.964089,
16733
- resetTime: "2026-09-19T14:53:58Z"
16759
+ remainingFraction: 0.9721721,
16760
+ resetTime: "2026-09-22T12:27:35Z"
16734
16761
  }
16735
16762
  },
16736
16763
  "gemini-3.1-flash-lite": {
@@ -16748,8 +16775,8 @@ var models_default = {
16748
16775
  },
16749
16776
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16750
16777
  quotaInfo: {
16751
- remainingFraction: 0.964089,
16752
- resetTime: "2026-09-19T14:53:58Z"
16778
+ remainingFraction: 0.9721721,
16779
+ resetTime: "2026-09-22T12:27:35Z"
16753
16780
  }
16754
16781
  },
16755
16782
  "gemini-3.1-pro-high": {
@@ -16780,8 +16807,8 @@ var models_default = {
16780
16807
  },
16781
16808
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16782
16809
  quotaInfo: {
16783
- remainingFraction: 0.964089,
16784
- resetTime: "2026-09-19T14:53:58Z"
16810
+ remainingFraction: 0.9721721,
16811
+ resetTime: "2026-09-22T12:27:35Z"
16785
16812
  },
16786
16813
  recommended: true,
16787
16814
  supportedMimeTypes: {
@@ -16871,8 +16898,8 @@ var models_default = {
16871
16898
  },
16872
16899
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16873
16900
  quotaInfo: {
16874
- remainingFraction: 0.964089,
16875
- resetTime: "2026-09-19T14:53:58Z"
16901
+ remainingFraction: 0.9721721,
16902
+ resetTime: "2026-09-22T12:27:35Z"
16876
16903
  },
16877
16904
  recommended: true,
16878
16905
  supportedMimeTypes: {
@@ -16976,8 +17003,8 @@ var models_default = {
16976
17003
  },
16977
17004
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16978
17005
  quotaInfo: {
16979
- remainingFraction: 0.964089,
16980
- resetTime: "2026-09-19T14:53:58Z"
17006
+ remainingFraction: 0.9721721,
17007
+ resetTime: "2026-09-22T12:27:35Z"
16981
17008
  },
16982
17009
  recommended: true,
16983
17010
  supportedMimeTypes: {
@@ -17059,8 +17086,8 @@ var models_default = {
17059
17086
  },
17060
17087
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17061
17088
  quotaInfo: {
17062
- remainingFraction: 0.964089,
17063
- resetTime: "2026-09-19T14:53:58Z"
17089
+ remainingFraction: 0.9721721,
17090
+ resetTime: "2026-09-22T12:27:35Z"
17064
17091
  },
17065
17092
  recommended: true,
17066
17093
  supportedMimeTypes: {
@@ -17166,8 +17193,8 @@ var models_default = {
17166
17193
  },
17167
17194
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17168
17195
  quotaInfo: {
17169
- remainingFraction: 0.964089,
17170
- resetTime: "2026-09-19T14:53:58Z"
17196
+ remainingFraction: 0.9721721,
17197
+ resetTime: "2026-09-22T12:27:35Z"
17171
17198
  },
17172
17199
  recommended: true,
17173
17200
  supportedMimeTypes: {
@@ -17285,8 +17312,8 @@ var models_default = {
17285
17312
  },
17286
17313
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17287
17314
  quotaInfo: {
17288
- remainingFraction: 0.964089,
17289
- resetTime: "2026-09-19T14:53:58Z"
17315
+ remainingFraction: 0.9721721,
17316
+ resetTime: "2026-09-22T12:27:35Z"
17290
17317
  },
17291
17318
  recommended: true,
17292
17319
  supportedMimeTypes: {
@@ -17404,8 +17431,8 @@ var models_default = {
17404
17431
  },
17405
17432
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17406
17433
  quotaInfo: {
17407
- remainingFraction: 0.964089,
17408
- resetTime: "2026-09-19T14:53:58Z"
17434
+ remainingFraction: 0.9721721,
17435
+ resetTime: "2026-09-22T12:27:35Z"
17409
17436
  },
17410
17437
  recommended: true,
17411
17438
  supportedMimeTypes: {
@@ -17523,8 +17550,8 @@ var models_default = {
17523
17550
  },
17524
17551
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17525
17552
  quotaInfo: {
17526
- remainingFraction: 0.964089,
17527
- resetTime: "2026-09-19T14:53:58Z"
17553
+ remainingFraction: 0.9721721,
17554
+ resetTime: "2026-09-22T12:27:35Z"
17528
17555
  },
17529
17556
  recommended: true,
17530
17557
  supportedMimeTypes: {
@@ -17641,8 +17668,8 @@ var models_default = {
17641
17668
  },
17642
17669
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17643
17670
  quotaInfo: {
17644
- remainingFraction: 0.964089,
17645
- resetTime: "2026-09-19T14:53:58Z"
17671
+ remainingFraction: 0.9721721,
17672
+ resetTime: "2026-09-22T12:27:35Z"
17646
17673
  },
17647
17674
  recommended: true,
17648
17675
  supportedMimeTypes: {
@@ -17752,8 +17779,8 @@ var models_default = {
17752
17779
  },
17753
17780
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17754
17781
  quotaInfo: {
17755
- remainingFraction: 0.964089,
17756
- resetTime: "2026-09-19T14:53:58Z"
17782
+ remainingFraction: 0.9721721,
17783
+ resetTime: "2026-09-22T12:27:35Z"
17757
17784
  },
17758
17785
  recommended: true,
17759
17786
  supportedMimeTypes: {
@@ -17865,8 +17892,8 @@ var models_default = {
17865
17892
  },
17866
17893
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17867
17894
  quotaInfo: {
17868
- remainingFraction: 0.964089,
17869
- resetTime: "2026-09-19T14:53:58Z"
17895
+ remainingFraction: 0.9721721,
17896
+ resetTime: "2026-09-22T12:27:35Z"
17870
17897
  },
17871
17898
  recommended: true,
17872
17899
  supportedMimeTypes: {
@@ -17978,8 +18005,8 @@ var models_default = {
17978
18005
  },
17979
18006
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17980
18007
  quotaInfo: {
17981
- remainingFraction: 0.964089,
17982
- resetTime: "2026-09-19T14:53:58Z"
18008
+ remainingFraction: 0.9721721,
18009
+ resetTime: "2026-09-22T12:27:35Z"
17983
18010
  },
17984
18011
  recommended: true,
17985
18012
  supportedMimeTypes: {
@@ -18090,8 +18117,8 @@ var models_default = {
18090
18117
  },
18091
18118
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18092
18119
  quotaInfo: {
18093
- remainingFraction: 0.964089,
18094
- resetTime: "2026-09-19T14:53:58Z"
18120
+ remainingFraction: 0.9721721,
18121
+ resetTime: "2026-09-22T12:27:35Z"
18095
18122
  },
18096
18123
  recommended: true,
18097
18124
  supportedMimeTypes: {
@@ -18201,8 +18228,8 @@ var models_default = {
18201
18228
  },
18202
18229
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18203
18230
  quotaInfo: {
18204
- remainingFraction: 0.964089,
18205
- resetTime: "2026-09-19T14:53:58Z"
18231
+ remainingFraction: 0.9721721,
18232
+ resetTime: "2026-09-22T12:27:35Z"
18206
18233
  },
18207
18234
  recommended: true,
18208
18235
  supportedMimeTypes: {
@@ -18261,6 +18288,8 @@ var models_default = {
18261
18288
  supportsImages: true,
18262
18289
  supportsThinking: true,
18263
18290
  supportsVideo: true,
18291
+ tagDescription: "Limited time",
18292
+ tagTitle: "Fast",
18264
18293
  thinkingBudget: -1
18265
18294
  },
18266
18295
  "gemini-3.8-flash-low": {
@@ -18312,8 +18341,8 @@ var models_default = {
18312
18341
  },
18313
18342
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18314
18343
  quotaInfo: {
18315
- remainingFraction: 0.964089,
18316
- resetTime: "2026-09-19T14:53:58Z"
18344
+ remainingFraction: 0.9721721,
18345
+ resetTime: "2026-09-22T12:27:35Z"
18317
18346
  },
18318
18347
  recommended: true,
18319
18348
  supportedMimeTypes: {
@@ -18425,8 +18454,8 @@ var models_default = {
18425
18454
  },
18426
18455
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18427
18456
  quotaInfo: {
18428
- remainingFraction: 0.964089,
18429
- resetTime: "2026-09-19T14:53:58Z"
18457
+ remainingFraction: 0.9721721,
18458
+ resetTime: "2026-09-22T12:27:35Z"
18430
18459
  },
18431
18460
  recommended: true,
18432
18461
  supportedMimeTypes: {
@@ -18537,8 +18566,8 @@ var models_default = {
18537
18566
  },
18538
18567
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18539
18568
  quotaInfo: {
18540
- remainingFraction: 0.964089,
18541
- resetTime: "2026-09-19T14:53:58Z"
18569
+ remainingFraction: 0.9721721,
18570
+ resetTime: "2026-09-22T12:27:35Z"
18542
18571
  },
18543
18572
  recommended: true,
18544
18573
  supportedMimeTypes: {
@@ -18627,8 +18656,8 @@ var models_default = {
18627
18656
  },
18628
18657
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18629
18658
  quotaInfo: {
18630
- remainingFraction: 0.964089,
18631
- resetTime: "2026-09-19T14:53:58Z"
18659
+ remainingFraction: 0.9721721,
18660
+ resetTime: "2026-09-22T12:27:35Z"
18632
18661
  },
18633
18662
  recommended: true,
18634
18663
  supportedMimeTypes: {
@@ -18705,7 +18734,7 @@ var models_default = {
18705
18734
  modelProvider: "MODEL_PROVIDER_OPENAI",
18706
18735
  quotaInfo: {
18707
18736
  remainingFraction: 1,
18708
- resetTime: "2026-09-19T15:08:03Z"
18737
+ resetTime: "2026-09-22T12:32:50Z"
18709
18738
  },
18710
18739
  recommended: true,
18711
18740
  supportsThinking: true,
@@ -20204,22 +20233,81 @@ var ChatLoggerImpl = class {
20204
20233
  }
20205
20234
  };
20206
20235
 
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.
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
+ }
20216
20309
 
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;
20310
+ // src/plugin/tier.ts
20223
20311
  var STATIC_MODELS_SIMPLE = {
20224
20312
  "gemini-3.8-flash": {
20225
20313
  name: "Gemini 3.8 Flash",
@@ -20307,6 +20395,39 @@ var TIER_MAPPING = {
20307
20395
  high: "gemini-3.1-pro-high"
20308
20396
  }
20309
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;
20310
20431
  var buildModelFromSimple = (modelId, simple) => {
20311
20432
  const isClaude = modelId.startsWith("claude-");
20312
20433
  const isGpt = modelId.startsWith("gpt-");
@@ -20400,83 +20521,6 @@ var STATIC_MODELS = {};
20400
20521
  for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
20401
20522
  STATIC_MODELS[modelId] = buildModelFromSimple(modelId, simple);
20402
20523
  }
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
20524
  var AgyCLIOAuthPlugin = async ({ client }) => {
20481
20525
  let latestConfig;
20482
20526
  updateStaticModelsWithPricing(STATIC_MODELS);
@@ -20804,25 +20848,754 @@ async function ensureProjectContextOrThrow(authRecord, client, configuredProject
20804
20848
  throw error45;
20805
20849
  }
20806
20850
  }
20807
- function toUrlString(value) {
20808
- if (typeof value === "string") {
20809
- return value;
20851
+
20852
+ // src/plugin/types.ts
20853
+ function defineOpenCodeV2Plugin(def) {
20854
+ return def;
20855
+ }
20856
+
20857
+ // src/plugin/v2-storage.ts
20858
+ import { existsSync as existsSync6, mkdirSync as mkdirSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "fs";
20859
+ import { homedir as homedir4 } from "os";
20860
+ import { join as join6 } from "path";
20861
+ var storedAuthOverrideForTesting = void 0;
20862
+ function loadStoredAuthFromJson() {
20863
+ if (storedAuthOverrideForTesting !== void 0) {
20864
+ return storedAuthOverrideForTesting;
20865
+ }
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];
20872
+ }
20873
+ } catch {
20810
20874
  }
20811
- const candidate = value.url;
20812
- if (candidate) {
20813
- return candidate;
20875
+ return void 0;
20876
+ }
20877
+ function saveStoredAuthToJson(authRecord) {
20878
+ if (process.env.NODE_ENV === "test" || process.env.VITEST || storedAuthOverrideForTesting !== void 0) {
20879
+ return;
20880
+ }
20881
+ try {
20882
+ const dirPath = join6(homedir4(), ".local", "share", "opencode");
20883
+ if (!existsSync6(dirPath)) {
20884
+ mkdirSync5(dirPath, { recursive: true });
20885
+ }
20886
+ const authPath = join6(dirPath, "auth.json");
20887
+ let data = {};
20888
+ if (existsSync6(authPath)) {
20889
+ try {
20890
+ data = JSON.parse(readFileSync5(authPath, "utf8")) || {};
20891
+ } catch {
20892
+ data = {};
20893
+ }
20894
+ }
20895
+ data[AGY_PROVIDER_ID] = {
20896
+ type: "oauth",
20897
+ refresh: authRecord.refresh,
20898
+ access: authRecord.access,
20899
+ expires: authRecord.expires
20900
+ };
20901
+ writeFileSync5(authPath, JSON.stringify(data, null, 2), "utf8");
20902
+ } catch {
20814
20903
  }
20815
- return value.toString();
20816
20904
  }
20817
20905
 
20906
+ // src/plugin/v2-fetch.ts
20907
+ function createV2FetchInterceptor(getAuthSnapshot) {
20908
+ return async function agyV2Fetch(input, init) {
20909
+ const isGL = isGenerativeLanguageRequest(input);
20910
+ const isInternal = toUrlString(input).includes("cloudcode-pa.googleapis.com");
20911
+ if (!isGL && !isInternal) {
20912
+ return (globalThis.fetch || fetch)(input, init);
20913
+ }
20914
+ let rawAuth = getAuthSnapshot ? await getAuthSnapshot() : void 0;
20915
+ if (!rawAuth) {
20916
+ rawAuth = loadStoredAuthFromJson();
20917
+ }
20918
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
20919
+ return (globalThis.fetch || fetch)(input, init);
20920
+ }
20921
+ let authRecord = resolveCachedAuth(rawAuth);
20922
+ if (accessTokenExpired(authRecord)) {
20923
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
20924
+ } } });
20925
+ if (refreshed) {
20926
+ authRecord = refreshed;
20927
+ }
20928
+ }
20929
+ if (!authRecord.access) {
20930
+ return (globalThis.fetch || fetch)(input, init);
20931
+ }
20932
+ if (isInternal) {
20933
+ const hasAuth = getSafeHeader(init?.headers, "Authorization") !== void 0;
20934
+ if (hasAuth) {
20935
+ return (globalThis.fetch || fetch)(input, init);
20936
+ }
20937
+ const userAgent = buildAgyCliUserAgent();
20938
+ const headers = setSafeHeaders(init?.headers, {
20939
+ Authorization: `Bearer ${authRecord.access}`,
20940
+ "User-Agent": userAgent
20941
+ });
20942
+ return (globalThis.fetch || fetch)(input, {
20943
+ ...init,
20944
+ headers
20945
+ });
20946
+ }
20947
+ const requestTarget = parseGenerativeLanguageRequest(input);
20948
+ const requestUserAgentModel = requestTarget?.effectiveModel;
20949
+ let projectContext;
20950
+ try {
20951
+ projectContext = await ensureProjectContext(
20952
+ authRecord,
20953
+ { auth: { set: async () => {
20954
+ } } },
20955
+ void 0,
20956
+ requestUserAgentModel
20957
+ );
20958
+ } catch {
20959
+ projectContext = {
20960
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
20961
+ auth: authRecord
20962
+ };
20963
+ }
20964
+ const originalRequestedModel = parseGenerativeLanguageRequest(input)?.effectiveModel;
20965
+ let modifiedInput = input;
20966
+ if (isGL && originalRequestedModel) {
20967
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
20968
+ const resolvedBase = resolveModelTier(originalBase, init);
20969
+ if (originalBase !== resolvedBase) {
20970
+ if (typeof modifiedInput === "string") {
20971
+ modifiedInput = modifiedInput.replace(`models/${originalBase}`, `models/${resolvedBase}`);
20972
+ } else if (typeof Request !== "undefined" && modifiedInput instanceof Request) {
20973
+ const newUrl = modifiedInput.url.replace(`models/${originalBase}`, `models/${resolvedBase}`);
20974
+ modifiedInput = new Request(newUrl, modifiedInput);
20975
+ }
20976
+ }
20977
+ }
20978
+ const transformed = prepareAgyRequest(
20979
+ modifiedInput,
20980
+ init,
20981
+ authRecord.access,
20982
+ projectContext.effectiveProjectId,
20983
+ void 0
20984
+ );
20985
+ const chatLogger = createChatLogger();
20986
+ if (chatLogger) {
20987
+ chatLogger.logRequest(
20988
+ toUrlString(transformed.request),
20989
+ transformed.init.method || "GET",
20990
+ transformed.init.headers,
20991
+ transformed.init.body
20992
+ );
20993
+ }
20994
+ const response = await fetchWithRetry(transformed.request, transformed.init);
20995
+ return transformAgyResponse(
20996
+ response,
20997
+ transformed.streaming,
20998
+ null,
20999
+ transformed.requestedModel,
21000
+ transformed.sessionId,
21001
+ chatLogger
21002
+ );
21003
+ };
21004
+ }
21005
+
21006
+ // src/plugin/v2-session.ts
21007
+ function createV2HttpRequestHook(state = {}) {
21008
+ return async (event) => {
21009
+ if (!event) return;
21010
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21011
+ const isGL = isGenerativeLanguageRequest(rawUrl);
21012
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21013
+ if (!isGL && !isInternal) {
21014
+ return;
21015
+ }
21016
+ event.headers = event.headers || {};
21017
+ let modelName;
21018
+ let rawAuth = event.auth;
21019
+ if (rawAuth && !rawAuth.type) {
21020
+ const tokenVal = rawAuth.access || rawAuth.token;
21021
+ if (tokenVal || rawAuth.refresh) {
21022
+ rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
21023
+ }
21024
+ }
21025
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
21026
+ rawAuth = loadStoredAuthFromJson();
21027
+ }
21028
+ let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
21029
+ if (authRecord && accessTokenExpired(authRecord)) {
21030
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
21031
+ } } });
21032
+ if (refreshed) {
21033
+ authRecord = refreshed;
21034
+ saveStoredAuthToJson(refreshed);
21035
+ }
21036
+ }
21037
+ if (isGL) {
21038
+ const parsed = parseGenerativeLanguageRequest(rawUrl);
21039
+ modelName = parsed?.effectiveModel;
21040
+ if (modelName) {
21041
+ state.lastInterceptedModel = modelName;
21042
+ }
21043
+ if (typeof event.headers.delete === "function") {
21044
+ event.headers.delete("x-goog-api-key");
21045
+ event.headers.delete("api-key");
21046
+ } else {
21047
+ for (const key of Object.keys(event.headers)) {
21048
+ const lower = key.toLowerCase();
21049
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21050
+ delete event.headers[key];
21051
+ }
21052
+ }
21053
+ }
21054
+ if (event.request?.headers) {
21055
+ if (typeof event.request.headers.delete === "function") {
21056
+ event.request.headers.delete("x-goog-api-key");
21057
+ event.request.headers.delete("api-key");
21058
+ } else {
21059
+ for (const key of Object.keys(event.request.headers)) {
21060
+ const lower = key.toLowerCase();
21061
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21062
+ delete event.request.headers[key];
21063
+ }
21064
+ }
21065
+ }
21066
+ }
21067
+ let cleanUrl = rawUrl;
21068
+ try {
21069
+ const parsedUrl = new URL(rawUrl);
21070
+ let urlChanged = false;
21071
+ for (const param of ["key", "x-goog-api-key", "api-key"]) {
21072
+ if (parsedUrl.searchParams.has(param)) {
21073
+ parsedUrl.searchParams.delete(param);
21074
+ urlChanged = true;
21075
+ }
21076
+ }
21077
+ if (urlChanged) {
21078
+ cleanUrl = parsedUrl.toString();
21079
+ }
21080
+ } catch {
21081
+ }
21082
+ if (authRecord && authRecord.access) {
21083
+ let projectContext;
21084
+ try {
21085
+ projectContext = await ensureProjectContext(
21086
+ authRecord,
21087
+ { auth: { set: async () => {
21088
+ } } },
21089
+ void 0,
21090
+ modelName
21091
+ );
21092
+ } catch {
21093
+ projectContext = {
21094
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
21095
+ auth: authRecord
21096
+ };
21097
+ }
21098
+ const originalRequestedModel = modelName;
21099
+ let modifiedUrl = cleanUrl;
21100
+ if (originalRequestedModel) {
21101
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
21102
+ const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
21103
+ const resolvedBase = resolveModelTier(originalBase, { headers: initHeaders });
21104
+ if (originalBase !== resolvedBase) {
21105
+ modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
21106
+ }
21107
+ }
21108
+ let bodyPayload = event.body;
21109
+ if (bodyPayload === void 0 && event.request) {
21110
+ if (typeof event.request.clone === "function") {
21111
+ try {
21112
+ bodyPayload = await event.request.clone().text();
21113
+ } catch {
21114
+ }
21115
+ } else if (event.request.body !== void 0) {
21116
+ bodyPayload = event.request.body;
21117
+ }
21118
+ }
21119
+ let preExistingUserAgent;
21120
+ if (typeof event.headers?.get === "function") {
21121
+ preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
21122
+ } else if (event.headers && typeof event.headers === "object") {
21123
+ preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
21124
+ }
21125
+ if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
21126
+ preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
21127
+ } else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
21128
+ preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
21129
+ }
21130
+ const method = event.method || event.request?.method || "POST";
21131
+ const requestHeaders = event.headers || event.request?.headers;
21132
+ const transformed = prepareAgyRequest(
21133
+ modifiedUrl,
21134
+ {
21135
+ method,
21136
+ headers: requestHeaders,
21137
+ body: bodyPayload
21138
+ },
21139
+ authRecord.access,
21140
+ projectContext.effectiveProjectId
21141
+ );
21142
+ const targetUrl = toUrlString(transformed.request);
21143
+ if (typeof event.url === "string") {
21144
+ event.url = targetUrl;
21145
+ }
21146
+ if (event.request && typeof event.request === "object") {
21147
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21148
+ event.request = new Request(targetUrl, {
21149
+ method: transformed.init.method,
21150
+ headers: transformed.init.headers,
21151
+ body: transformed.init.body
21152
+ });
21153
+ } else if (typeof event.request.url === "string") {
21154
+ try {
21155
+ event.request.url = targetUrl;
21156
+ } catch {
21157
+ }
21158
+ }
21159
+ }
21160
+ const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
21161
+ for (const [k, v] of headerEntries) {
21162
+ const lowerK = k.toLowerCase();
21163
+ if (lowerK === "user-agent") {
21164
+ if (preExistingUserAgent) {
21165
+ continue;
21166
+ }
21167
+ if (typeof event.headers?.set === "function") {
21168
+ event.headers.set("User-Agent", v);
21169
+ } else if (event.headers) {
21170
+ event.headers["User-Agent"] = v;
21171
+ }
21172
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21173
+ event.request.headers.set("User-Agent", v);
21174
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21175
+ event.request.headers["User-Agent"] = v;
21176
+ }
21177
+ continue;
21178
+ }
21179
+ if (typeof event.headers?.set === "function") {
21180
+ event.headers.set(k, v);
21181
+ } else if (event.headers) {
21182
+ event.headers[k] = v;
21183
+ }
21184
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21185
+ event.request.headers.set(k, v);
21186
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21187
+ event.request.headers[k] = v;
21188
+ }
21189
+ }
21190
+ if (transformed.init.body !== void 0) {
21191
+ event.body = transformed.init.body;
21192
+ if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
21193
+ event.request.body = transformed.init.body;
21194
+ }
21195
+ }
21196
+ } else {
21197
+ if (typeof event.url === "string") {
21198
+ event.url = cleanUrl;
21199
+ }
21200
+ if (event.request && typeof event.request === "object") {
21201
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21202
+ event.request = new Request(cleanUrl, event.request);
21203
+ } else if (typeof event.request.url === "string") {
21204
+ try {
21205
+ event.request.url = cleanUrl;
21206
+ } catch {
21207
+ }
21208
+ }
21209
+ }
21210
+ }
21211
+ }
21212
+ if (authRecord && authRecord.access) {
21213
+ if (typeof event.headers?.set === "function") {
21214
+ event.headers.set("Authorization", `Bearer ${authRecord.access}`);
21215
+ } else if (event.headers) {
21216
+ event.headers["Authorization"] = `Bearer ${authRecord.access}`;
21217
+ }
21218
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21219
+ event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
21220
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21221
+ event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
21222
+ }
21223
+ }
21224
+ const userAgent = buildAgyCliUserAgent(modelName);
21225
+ if (typeof event.headers?.set === "function") {
21226
+ if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
21227
+ event.headers.set("User-Agent", userAgent);
21228
+ }
21229
+ } else if (event.headers) {
21230
+ if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
21231
+ event.headers["User-Agent"] = userAgent;
21232
+ }
21233
+ }
21234
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21235
+ if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
21236
+ event.request.headers.set("User-Agent", userAgent);
21237
+ }
21238
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21239
+ if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
21240
+ event.request.headers["User-Agent"] = userAgent;
21241
+ }
21242
+ }
21243
+ };
21244
+ }
21245
+ function createV2HttpResponseHook(state = {}) {
21246
+ return async (event) => {
21247
+ if (!event || !event.response) return;
21248
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21249
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21250
+ if (isInternal && event.response instanceof Response) {
21251
+ const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
21252
+ const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || state.lastInterceptedModel;
21253
+ const transformed = await transformAgyResponse(
21254
+ event.response,
21255
+ !!isStreaming,
21256
+ null,
21257
+ parsedModel,
21258
+ void 0,
21259
+ void 0
21260
+ );
21261
+ event.response = transformed;
21262
+ }
21263
+ };
21264
+ }
21265
+ function createV2RetryHook() {
21266
+ return async (event) => {
21267
+ if (!event) return;
21268
+ const response = event.response;
21269
+ if (response instanceof Response) {
21270
+ if (response.status === 429 || response.status === 503) {
21271
+ const quota = await classifyQuotaResponse(response);
21272
+ if (quota?.retryDelayMs) {
21273
+ event.retryDelayMs = quota.retryDelayMs;
21274
+ } else {
21275
+ event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
21276
+ }
21277
+ }
21278
+ } else if (event.details && Array.isArray(event.details)) {
21279
+ const retryInfo = event.details.find(
21280
+ (d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
21281
+ );
21282
+ if (retryInfo?.retryDelay) {
21283
+ const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
21284
+ if (delayMs !== null) {
21285
+ event.retryDelayMs = delayMs;
21286
+ }
21287
+ }
21288
+ }
21289
+ };
21290
+ }
21291
+ function registerV2SessionHooks(ctx) {
21292
+ const state = {};
21293
+ ctx.session.hook("http.request", createV2HttpRequestHook(state), { providerID: AGY_PROVIDER_ID });
21294
+ ctx.session.hook("http.response", createV2HttpResponseHook(state), { providerID: AGY_PROVIDER_ID });
21295
+ ctx.session.hook("retry", createV2RetryHook(), { providerID: AGY_PROVIDER_ID });
21296
+ }
21297
+
21298
+ // src/plugin/v2.ts
21299
+ async function setupOpenCodeV2(ctx) {
21300
+ const resolveVariants = (modelId) => {
21301
+ const mapping = TIER_MAPPING[modelId];
21302
+ if (!mapping) return void 0;
21303
+ const variants = [];
21304
+ if (mapping.minimal !== void 0) variants.push({ id: "minimal" });
21305
+ if (mapping.low !== void 0) variants.push({ id: "low" });
21306
+ if (mapping.medium !== void 0) variants.push({ id: "medium" });
21307
+ if (mapping.high !== void 0) variants.push({ id: "high" });
21308
+ return variants.length > 0 ? variants : void 0;
21309
+ };
21310
+ const updateProviderRecord = (p) => {
21311
+ p.name = "Antigravity CLI";
21312
+ p.activation = "enabled";
21313
+ p.package = "aisdk:@ai-sdk/google";
21314
+ p.description = "Google Gemini Antigravity Code Assist OAuth provider";
21315
+ p.settings = { ...p.settings || {}, apiKey: "dummy" };
21316
+ p.integrationID = AGY_PROVIDER_ID;
21317
+ };
21318
+ const buildModelRecord = (modelId, simple, existingModel) => {
21319
+ const isClaude = modelId.startsWith("claude-");
21320
+ const isGpt = modelId.startsWith("gpt-");
21321
+ const variants = resolveVariants(modelId);
21322
+ return {
21323
+ id: modelId,
21324
+ providerID: AGY_PROVIDER_ID,
21325
+ name: simple.name,
21326
+ description: simple.description,
21327
+ family: modelId.includes("gemini") ? "gemini" : isClaude ? "claude" : isGpt ? "gpt" : "unknown",
21328
+ reasoning: simple.reasoning,
21329
+ attachment: simple.attachment,
21330
+ tool_call: simple.toolCall,
21331
+ limit: {
21332
+ context: simple.maxTokens,
21333
+ output: simple.maxOutputTokens
21334
+ },
21335
+ cost: simple.cost || { input: 0, output: 0 },
21336
+ ...variants ? { variants } : {},
21337
+ ...existingModel || {}
21338
+ };
21339
+ };
21340
+ const updateModelRecord = (m, modelId, simple) => {
21341
+ m.name = simple.name;
21342
+ m.capabilities = {
21343
+ tools: true,
21344
+ input: ["text", "image"],
21345
+ output: ["text"]
21346
+ };
21347
+ m.limit = {
21348
+ context: simple.maxTokens,
21349
+ output: simple.maxOutputTokens
21350
+ };
21351
+ m.family = "gemini";
21352
+ if (simple.cost) {
21353
+ m.cost = simple.cost;
21354
+ }
21355
+ const variants = resolveVariants(modelId);
21356
+ if (variants) {
21357
+ m.variants = variants;
21358
+ }
21359
+ };
21360
+ if (ctx.provider?.transform) {
21361
+ ctx.provider.transform(async (editor) => {
21362
+ if (!editor) return;
21363
+ if (typeof editor.update === "function") {
21364
+ editor.update(AGY_PROVIDER_ID, updateProviderRecord);
21365
+ } else if (typeof editor.set === "function") {
21366
+ const p = { id: AGY_PROVIDER_ID };
21367
+ updateProviderRecord(p);
21368
+ editor.set(AGY_PROVIDER_ID, p);
21369
+ } else if (typeof editor === "object") {
21370
+ const p = editor[AGY_PROVIDER_ID] || { id: AGY_PROVIDER_ID };
21371
+ updateProviderRecord(p);
21372
+ editor[AGY_PROVIDER_ID] = p;
21373
+ }
21374
+ });
21375
+ }
21376
+ if (ctx.model?.transform) {
21377
+ ctx.model.transform(async (editor) => {
21378
+ if (!editor) return;
21379
+ if (typeof editor.update === "function") {
21380
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21381
+ editor.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21382
+ }
21383
+ } else if (typeof editor.set === "function") {
21384
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21385
+ const m = buildModelRecord(modelId, simple);
21386
+ editor.set(`${AGY_PROVIDER_ID}:${modelId}`, m);
21387
+ }
21388
+ } else if (typeof editor === "object") {
21389
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21390
+ const key = `${AGY_PROVIDER_ID}:${modelId}`;
21391
+ editor[key] = buildModelRecord(modelId, simple, editor[key]);
21392
+ }
21393
+ }
21394
+ });
21395
+ }
21396
+ if (ctx.catalog?.transform) {
21397
+ ctx.catalog.transform(async (editor) => {
21398
+ if (!editor) return;
21399
+ if (typeof editor?.provider?.update === "function") {
21400
+ editor.provider.update(AGY_PROVIDER_ID, updateProviderRecord);
21401
+ if (typeof editor?.model?.update === "function") {
21402
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21403
+ editor.model.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21404
+ }
21405
+ }
21406
+ return;
21407
+ }
21408
+ const catalog = editor;
21409
+ catalog.providers = catalog.providers || {};
21410
+ catalog.providers[AGY_PROVIDER_ID] = {
21411
+ id: AGY_PROVIDER_ID,
21412
+ name: "Antigravity CLI",
21413
+ npm: "aisdk:@ai-sdk/google",
21414
+ settings: { apiKey: "dummy" },
21415
+ integrationID: AGY_PROVIDER_ID,
21416
+ models: { ...catalog.providers[AGY_PROVIDER_ID]?.models || {} },
21417
+ ...catalog.providers[AGY_PROVIDER_ID]
21418
+ };
21419
+ if (catalog.providers[AGY_PROVIDER_ID].settings) {
21420
+ catalog.providers[AGY_PROVIDER_ID].settings = {
21421
+ ...catalog.providers[AGY_PROVIDER_ID].settings,
21422
+ apiKey: "dummy"
21423
+ };
21424
+ } else {
21425
+ catalog.providers[AGY_PROVIDER_ID].settings = { apiKey: "dummy" };
21426
+ }
21427
+ catalog.providers[AGY_PROVIDER_ID].integrationID = AGY_PROVIDER_ID;
21428
+ const targetModels = catalog.providers[AGY_PROVIDER_ID].models;
21429
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21430
+ targetModels[modelId] = buildModelRecord(modelId, simple, targetModels[modelId]);
21431
+ }
21432
+ });
21433
+ }
21434
+ ctx.tool.transform(async (editor) => {
21435
+ if (!editor) return;
21436
+ const quotaTool = createAgyQuotaTool({
21437
+ client: void 0,
21438
+ getAuthResolver: () => void 0,
21439
+ getConfiguredProjectId: () => void 0,
21440
+ getUserAgentModel: () => void 0
21441
+ });
21442
+ const quotaSummaryTool = createAgyQuotaSummaryTool({
21443
+ client: void 0,
21444
+ getAuthResolver: () => void 0,
21445
+ getConfiguredProjectId: () => void 0,
21446
+ getUserAgentModel: () => void 0
21447
+ });
21448
+ if (typeof editor.add === "function") {
21449
+ editor.add({
21450
+ name: AGY_QUOTA_TOOL_NAME,
21451
+ description: quotaTool.description,
21452
+ input: {},
21453
+ execute: async (args, context) => quotaTool.execute(args, context)
21454
+ });
21455
+ editor.add({
21456
+ name: AGY_QUOTA_SUMMARY_TOOL_NAME,
21457
+ description: quotaSummaryTool.description,
21458
+ input: {},
21459
+ execute: async (args, context) => quotaSummaryTool.execute(args, context)
21460
+ });
21461
+ } else if (typeof editor.set === "function") {
21462
+ editor.set(AGY_QUOTA_TOOL_NAME, quotaTool);
21463
+ editor.set(AGY_QUOTA_SUMMARY_TOOL_NAME, quotaSummaryTool);
21464
+ } else if (editor.tools && typeof editor.tools === "object") {
21465
+ editor.tools[AGY_QUOTA_TOOL_NAME] = quotaTool;
21466
+ editor.tools[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21467
+ } else if (typeof editor === "object") {
21468
+ editor[AGY_QUOTA_TOOL_NAME] = quotaTool;
21469
+ editor[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21470
+ }
21471
+ });
21472
+ ctx.command.transform(async (editor) => {
21473
+ if (!editor) return;
21474
+ const commands = {
21475
+ [AGY_V2_QUOTA_COMMAND]: {
21476
+ description: "Show Agy Code Assist quota usage",
21477
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21478
+ },
21479
+ [AGY_V2_QUOTA_SUMMARY_COMMAND]: {
21480
+ description: "Show Agy Code Assist quota summary with weekly and 5-hour limits",
21481
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21482
+ }
21483
+ };
21484
+ if (typeof editor.add === "function") {
21485
+ editor.add({
21486
+ name: AGY_V2_QUOTA_COMMAND,
21487
+ description: "Display current Antigravity quota usage",
21488
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21489
+ });
21490
+ editor.add({
21491
+ name: AGY_V2_QUOTA_SUMMARY_COMMAND,
21492
+ description: "Display Antigravity quota summary grouped by model family",
21493
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21494
+ });
21495
+ } else if (typeof editor.set === "function") {
21496
+ editor.set(AGY_V2_QUOTA_COMMAND, commands[AGY_V2_QUOTA_COMMAND]);
21497
+ editor.set(AGY_V2_QUOTA_SUMMARY_COMMAND, commands[AGY_V2_QUOTA_SUMMARY_COMMAND]);
21498
+ } else if (editor.commands && typeof editor.commands === "object") {
21499
+ editor.commands[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21500
+ editor.commands[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21501
+ } else if (typeof editor === "object") {
21502
+ editor[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21503
+ editor[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21504
+ }
21505
+ });
21506
+ ctx.integration?.transform?.((editor) => {
21507
+ if (!editor) return;
21508
+ editor.update?.(AGY_PROVIDER_ID, (integration) => {
21509
+ integration.name = "Antigravity CLI (plugin)";
21510
+ });
21511
+ editor.method?.update?.({
21512
+ integrationID: AGY_PROVIDER_ID,
21513
+ method: {
21514
+ id: "oauth",
21515
+ type: "oauth",
21516
+ label: "Antigravity CLI (OAuth)"
21517
+ },
21518
+ authorize: async () => {
21519
+ const authorization = await authorizeAgy();
21520
+ return {
21521
+ mode: "code",
21522
+ url: authorization.url,
21523
+ instructions: "Please complete Google account authorization in your browser. After authorization, copy the full redirect URL or code and paste it below:",
21524
+ callback: async (code) => {
21525
+ const trimmed = code.trim();
21526
+ const parsed = parseOAuthCallbackInput(trimmed);
21527
+ const authCode = parsed.code || trimmed;
21528
+ if (!authCode) {
21529
+ return { type: "failed", error: "Missing authorization code in callback input" };
21530
+ }
21531
+ if (parsed.state && parsed.state !== authorization.state) {
21532
+ return { type: "failed", error: "State mismatch in callback input (possible CSRF attempt)" };
21533
+ }
21534
+ const exchangeResult = await exchangeAgyWithVerifier(authCode, authorization.verifier);
21535
+ if (exchangeResult.type !== "success") {
21536
+ return exchangeResult;
21537
+ }
21538
+ const initialRefresh = formatRefreshParts({
21539
+ refreshToken: exchangeResult.refresh
21540
+ });
21541
+ let authRecord = {
21542
+ type: "oauth",
21543
+ refresh: initialRefresh,
21544
+ access: exchangeResult.access,
21545
+ expires: exchangeResult.expires
21546
+ };
21547
+ try {
21548
+ const projectContext = await ensureProjectContext(
21549
+ authRecord,
21550
+ { auth: { set: async () => {
21551
+ } } }
21552
+ );
21553
+ authRecord = {
21554
+ ...authRecord,
21555
+ refresh: projectContext.auth.refresh
21556
+ };
21557
+ } catch {
21558
+ }
21559
+ saveStoredAuthToJson(authRecord);
21560
+ return {
21561
+ type: "oauth",
21562
+ methodID: "oauth",
21563
+ refresh: authRecord.refresh,
21564
+ access: authRecord.access,
21565
+ expires: authRecord.expires
21566
+ };
21567
+ }
21568
+ };
21569
+ }
21570
+ });
21571
+ });
21572
+ ctx.aisdk?.hook("sdk", async (event) => {
21573
+ if (!event) return;
21574
+ const isMatchingProvider = event.providerID === AGY_PROVIDER_ID || event.model?.providerID === AGY_PROVIDER_ID;
21575
+ if (!isMatchingProvider) return;
21576
+ event.options = event.options || {};
21577
+ event.options.apiKey = "dummy";
21578
+ event.options.fetch = createV2FetchInterceptor();
21579
+ });
21580
+ registerV2SessionHooks(ctx);
21581
+ }
21582
+ var v2PluginDefinition = defineOpenCodeV2Plugin({
21583
+ id: AGY_PROVIDER_ID,
21584
+ setup: setupOpenCodeV2
21585
+ });
21586
+
20818
21587
  // index.ts
20819
- var index_default = {
20820
- id: "@anthonyhaussman/opencode-agy-auth",
21588
+ var dualPlugin = {
21589
+ ...v2PluginDefinition,
20821
21590
  server: AgyCLIOAuthPlugin
20822
21591
  };
21592
+ var index_default = dualPlugin;
20823
21593
  export {
20824
21594
  AgyCLIOAuthPlugin,
20825
21595
  GoogleOAuthPlugin,
20826
- index_default as default
21596
+ index_default as default,
21597
+ defineOpenCodeV2Plugin,
21598
+ setupOpenCodeV2,
21599
+ v2PluginDefinition
20827
21600
  };
20828
21601
  //# sourceMappingURL=index.js.map