@anthonyhaussman/opencode-agy-auth 1.2.10 → 1.2.11-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.10";
271
+ var AGY_CLI_VERSION = "1.2.11";
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,
@@ -16056,6 +16085,7 @@ var models_default = {
16056
16085
  106143956,
16057
16086
  105856899,
16058
16087
  106064030,
16088
+ 106264162,
16059
16089
  106711598,
16060
16090
  106106760,
16061
16091
  106021688,
@@ -16081,6 +16111,7 @@ var models_default = {
16081
16111
  106121399,
16082
16112
  106100654,
16083
16113
  106064028,
16114
+ 106264150,
16084
16115
  105906495,
16085
16116
  106283614,
16086
16117
  106640124,
@@ -16147,7 +16178,7 @@ var models_default = {
16147
16178
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16148
16179
  quotaInfo: {
16149
16180
  remainingFraction: 1,
16150
- resetTime: "2026-09-24T13:14:02Z"
16181
+ resetTime: "2026-09-25T11:24:59Z"
16151
16182
  },
16152
16183
  recommended: true,
16153
16184
  supportedMimeTypes: {
@@ -16186,7 +16217,7 @@ var models_default = {
16186
16217
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16187
16218
  quotaInfo: {
16188
16219
  remainingFraction: 1,
16189
- resetTime: "2026-09-24T13:14:02Z"
16220
+ resetTime: "2026-09-25T11:24:59Z"
16190
16221
  },
16191
16222
  recommended: true,
16192
16223
  supportedMimeTypes: {
@@ -16222,8 +16253,8 @@ var models_default = {
16222
16253
  },
16223
16254
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16224
16255
  quotaInfo: {
16225
- remainingFraction: 0.9556033,
16226
- resetTime: "2026-09-24T13:08:46Z"
16256
+ remainingFraction: 0.8656157,
16257
+ resetTime: "2026-09-25T09:39:31Z"
16227
16258
  },
16228
16259
  recommended: true,
16229
16260
  supportedMimeTypes: {
@@ -16305,8 +16336,8 @@ var models_default = {
16305
16336
  },
16306
16337
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16307
16338
  quotaInfo: {
16308
- remainingFraction: 0.9556033,
16309
- resetTime: "2026-09-24T13:08:46Z"
16339
+ remainingFraction: 0.8656157,
16340
+ resetTime: "2026-09-25T09:39:31Z"
16310
16341
  },
16311
16342
  recommended: true,
16312
16343
  supportedMimeTypes: {
@@ -16388,8 +16419,8 @@ var models_default = {
16388
16419
  },
16389
16420
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16390
16421
  quotaInfo: {
16391
- remainingFraction: 0.9556033,
16392
- resetTime: "2026-09-24T13:08:46Z"
16422
+ remainingFraction: 0.8656157,
16423
+ resetTime: "2026-09-25T09:39:31Z"
16393
16424
  },
16394
16425
  recommended: true,
16395
16426
  supportedMimeTypes: {
@@ -16468,8 +16499,8 @@ var models_default = {
16468
16499
  },
16469
16500
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16470
16501
  quotaInfo: {
16471
- remainingFraction: 0.9556033,
16472
- resetTime: "2026-09-24T13:08:46Z"
16502
+ remainingFraction: 0.8656157,
16503
+ resetTime: "2026-09-25T09:39:31Z"
16473
16504
  },
16474
16505
  recommended: true,
16475
16506
  requiresImageOutputOutsideFunctionResponses: true,
@@ -16549,8 +16580,8 @@ var models_default = {
16549
16580
  },
16550
16581
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16551
16582
  quotaInfo: {
16552
- remainingFraction: 0.9556033,
16553
- resetTime: "2026-09-24T13:08:46Z"
16583
+ remainingFraction: 0.8656157,
16584
+ resetTime: "2026-09-25T09:39:31Z"
16554
16585
  },
16555
16586
  recommended: true,
16556
16587
  supportedMimeTypes: {
@@ -16654,8 +16685,8 @@ var models_default = {
16654
16685
  },
16655
16686
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16656
16687
  quotaInfo: {
16657
- remainingFraction: 0.9556033,
16658
- resetTime: "2026-09-24T13:08:46Z"
16688
+ remainingFraction: 0.8656157,
16689
+ resetTime: "2026-09-25T09:39:31Z"
16659
16690
  },
16660
16691
  recommended: true,
16661
16692
  supportedMimeTypes: {
@@ -16724,8 +16755,8 @@ var models_default = {
16724
16755
  model: "MODEL_PLACEHOLDER_M21",
16725
16756
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16726
16757
  quotaInfo: {
16727
- remainingFraction: 0.9556033,
16728
- resetTime: "2026-09-24T13:08:46Z"
16758
+ remainingFraction: 0.8656157,
16759
+ resetTime: "2026-09-25T09:39:31Z"
16729
16760
  }
16730
16761
  },
16731
16762
  "gemini-3.1-flash-lite": {
@@ -16743,8 +16774,8 @@ var models_default = {
16743
16774
  },
16744
16775
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16745
16776
  quotaInfo: {
16746
- remainingFraction: 0.9556033,
16747
- resetTime: "2026-09-24T13:08:46Z"
16777
+ remainingFraction: 0.8656157,
16778
+ resetTime: "2026-09-25T09:39:31Z"
16748
16779
  }
16749
16780
  },
16750
16781
  "gemini-3.1-pro-high": {
@@ -16775,8 +16806,8 @@ var models_default = {
16775
16806
  },
16776
16807
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16777
16808
  quotaInfo: {
16778
- remainingFraction: 0.9556033,
16779
- resetTime: "2026-09-24T13:08:46Z"
16809
+ remainingFraction: 0.8656157,
16810
+ resetTime: "2026-09-25T09:39:31Z"
16780
16811
  },
16781
16812
  recommended: true,
16782
16813
  supportedMimeTypes: {
@@ -16866,8 +16897,8 @@ var models_default = {
16866
16897
  },
16867
16898
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16868
16899
  quotaInfo: {
16869
- remainingFraction: 0.9556033,
16870
- resetTime: "2026-09-24T13:08:46Z"
16900
+ remainingFraction: 0.8656157,
16901
+ resetTime: "2026-09-25T09:39:31Z"
16871
16902
  },
16872
16903
  recommended: true,
16873
16904
  supportedMimeTypes: {
@@ -16971,8 +17002,8 @@ var models_default = {
16971
17002
  },
16972
17003
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16973
17004
  quotaInfo: {
16974
- remainingFraction: 0.9556033,
16975
- resetTime: "2026-09-24T13:08:46Z"
17005
+ remainingFraction: 0.8656157,
17006
+ resetTime: "2026-09-25T09:39:31Z"
16976
17007
  },
16977
17008
  recommended: true,
16978
17009
  supportedMimeTypes: {
@@ -17054,8 +17085,8 @@ var models_default = {
17054
17085
  },
17055
17086
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17056
17087
  quotaInfo: {
17057
- remainingFraction: 0.9556033,
17058
- resetTime: "2026-09-24T13:08:46Z"
17088
+ remainingFraction: 0.8656157,
17089
+ resetTime: "2026-09-25T09:39:31Z"
17059
17090
  },
17060
17091
  recommended: true,
17061
17092
  supportedMimeTypes: {
@@ -17161,8 +17192,8 @@ var models_default = {
17161
17192
  },
17162
17193
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17163
17194
  quotaInfo: {
17164
- remainingFraction: 0.9556033,
17165
- resetTime: "2026-09-24T13:08:46Z"
17195
+ remainingFraction: 0.8656157,
17196
+ resetTime: "2026-09-25T09:39:31Z"
17166
17197
  },
17167
17198
  recommended: true,
17168
17199
  supportedMimeTypes: {
@@ -17280,8 +17311,8 @@ var models_default = {
17280
17311
  },
17281
17312
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17282
17313
  quotaInfo: {
17283
- remainingFraction: 0.9556033,
17284
- resetTime: "2026-09-24T13:08:46Z"
17314
+ remainingFraction: 0.8656157,
17315
+ resetTime: "2026-09-25T09:39:31Z"
17285
17316
  },
17286
17317
  recommended: true,
17287
17318
  supportedMimeTypes: {
@@ -17399,8 +17430,8 @@ var models_default = {
17399
17430
  },
17400
17431
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17401
17432
  quotaInfo: {
17402
- remainingFraction: 0.9556033,
17403
- resetTime: "2026-09-24T13:08:46Z"
17433
+ remainingFraction: 0.8656157,
17434
+ resetTime: "2026-09-25T09:39:31Z"
17404
17435
  },
17405
17436
  recommended: true,
17406
17437
  supportedMimeTypes: {
@@ -17518,8 +17549,8 @@ var models_default = {
17518
17549
  },
17519
17550
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17520
17551
  quotaInfo: {
17521
- remainingFraction: 0.9556033,
17522
- resetTime: "2026-09-24T13:08:46Z"
17552
+ remainingFraction: 0.8656157,
17553
+ resetTime: "2026-09-25T09:39:31Z"
17523
17554
  },
17524
17555
  recommended: true,
17525
17556
  supportedMimeTypes: {
@@ -17636,8 +17667,8 @@ var models_default = {
17636
17667
  },
17637
17668
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17638
17669
  quotaInfo: {
17639
- remainingFraction: 0.9556033,
17640
- resetTime: "2026-09-24T13:08:46Z"
17670
+ remainingFraction: 0.8656157,
17671
+ resetTime: "2026-09-25T09:39:31Z"
17641
17672
  },
17642
17673
  recommended: true,
17643
17674
  supportedMimeTypes: {
@@ -17747,8 +17778,8 @@ var models_default = {
17747
17778
  },
17748
17779
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17749
17780
  quotaInfo: {
17750
- remainingFraction: 0.9556033,
17751
- resetTime: "2026-09-24T13:08:46Z"
17781
+ remainingFraction: 0.8656157,
17782
+ resetTime: "2026-09-25T09:39:31Z"
17752
17783
  },
17753
17784
  recommended: true,
17754
17785
  supportedMimeTypes: {
@@ -17860,8 +17891,8 @@ var models_default = {
17860
17891
  },
17861
17892
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17862
17893
  quotaInfo: {
17863
- remainingFraction: 0.9556033,
17864
- resetTime: "2026-09-24T13:08:46Z"
17894
+ remainingFraction: 0.8656157,
17895
+ resetTime: "2026-09-25T09:39:31Z"
17865
17896
  },
17866
17897
  recommended: true,
17867
17898
  supportedMimeTypes: {
@@ -17973,8 +18004,8 @@ var models_default = {
17973
18004
  },
17974
18005
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17975
18006
  quotaInfo: {
17976
- remainingFraction: 0.9556033,
17977
- resetTime: "2026-09-24T13:08:46Z"
18007
+ remainingFraction: 0.8656157,
18008
+ resetTime: "2026-09-25T09:39:31Z"
17978
18009
  },
17979
18010
  recommended: true,
17980
18011
  supportedMimeTypes: {
@@ -18085,8 +18116,8 @@ var models_default = {
18085
18116
  },
18086
18117
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18087
18118
  quotaInfo: {
18088
- remainingFraction: 0.9556033,
18089
- resetTime: "2026-09-24T13:08:46Z"
18119
+ remainingFraction: 0.8656157,
18120
+ resetTime: "2026-09-25T09:39:31Z"
18090
18121
  },
18091
18122
  recommended: true,
18092
18123
  supportedMimeTypes: {
@@ -18196,8 +18227,8 @@ var models_default = {
18196
18227
  },
18197
18228
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18198
18229
  quotaInfo: {
18199
- remainingFraction: 0.9556033,
18200
- resetTime: "2026-09-24T13:08:46Z"
18230
+ remainingFraction: 0.8656157,
18231
+ resetTime: "2026-09-25T09:39:31Z"
18201
18232
  },
18202
18233
  recommended: true,
18203
18234
  supportedMimeTypes: {
@@ -18309,8 +18340,8 @@ var models_default = {
18309
18340
  },
18310
18341
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18311
18342
  quotaInfo: {
18312
- remainingFraction: 0.9556033,
18313
- resetTime: "2026-09-24T13:08:46Z"
18343
+ remainingFraction: 0.8656157,
18344
+ resetTime: "2026-09-25T09:39:31Z"
18314
18345
  },
18315
18346
  recommended: true,
18316
18347
  supportedMimeTypes: {
@@ -18422,8 +18453,8 @@ var models_default = {
18422
18453
  },
18423
18454
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18424
18455
  quotaInfo: {
18425
- remainingFraction: 0.9556033,
18426
- resetTime: "2026-09-24T13:08:46Z"
18456
+ remainingFraction: 0.8656157,
18457
+ resetTime: "2026-09-25T09:39:31Z"
18427
18458
  },
18428
18459
  recommended: true,
18429
18460
  supportedMimeTypes: {
@@ -18534,8 +18565,8 @@ var models_default = {
18534
18565
  },
18535
18566
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18536
18567
  quotaInfo: {
18537
- remainingFraction: 0.9556033,
18538
- resetTime: "2026-09-24T13:08:46Z"
18568
+ remainingFraction: 0.8656157,
18569
+ resetTime: "2026-09-25T09:39:31Z"
18539
18570
  },
18540
18571
  recommended: true,
18541
18572
  supportedMimeTypes: {
@@ -18624,8 +18655,8 @@ var models_default = {
18624
18655
  },
18625
18656
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18626
18657
  quotaInfo: {
18627
- remainingFraction: 0.9556033,
18628
- resetTime: "2026-09-24T13:08:46Z"
18658
+ remainingFraction: 0.8656157,
18659
+ resetTime: "2026-09-25T09:39:31Z"
18629
18660
  },
18630
18661
  recommended: true,
18631
18662
  supportedMimeTypes: {
@@ -18702,7 +18733,7 @@ var models_default = {
18702
18733
  modelProvider: "MODEL_PROVIDER_OPENAI",
18703
18734
  quotaInfo: {
18704
18735
  remainingFraction: 1,
18705
- resetTime: "2026-09-24T13:14:02Z"
18736
+ resetTime: "2026-09-25T11:24:59Z"
18706
18737
  },
18707
18738
  recommended: true,
18708
18739
  supportsThinking: true,
@@ -19774,9 +19805,14 @@ function normalizeToolSchemaTypes(tools, toolMapper) {
19774
19805
  fn.name = toolMapper ? toolMapper.toGemini(fn.name) : sanitizeToolName(fn.name);
19775
19806
  }
19776
19807
  if (fn) {
19808
+ if (!fn.parameters) {
19809
+ fn.parameters = fn.parameters_json_schema ?? fn.parametersJsonSchema;
19810
+ }
19777
19811
  if (!fn.parameters) {
19778
19812
  fn.parameters = { type: "OBJECT", properties: {} };
19779
19813
  }
19814
+ delete fn.parameters_json_schema;
19815
+ delete fn.parametersJsonSchema;
19780
19816
  sanitizeSchema(fn.parameters);
19781
19817
  }
19782
19818
  }
@@ -20201,22 +20237,81 @@ var ChatLoggerImpl = class {
20201
20237
  }
20202
20238
  };
20203
20239
 
20204
- // src/plugin.ts
20205
- var AGY_QUOTA_COMMAND = "agyquota";
20206
- var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20207
-
20208
- Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20209
- Do not call other tools.
20210
- `;
20211
- var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20212
- 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.
20240
+ // src/plugin/headers.ts
20241
+ function getSafeHeader(headers, key) {
20242
+ if (!headers) {
20243
+ return void 0;
20244
+ }
20245
+ const targetKey = key.toLowerCase();
20246
+ if (typeof headers.get === "function") {
20247
+ try {
20248
+ return headers.get(targetKey) || void 0;
20249
+ } catch {
20250
+ }
20251
+ }
20252
+ if (Array.isArray(headers)) {
20253
+ const found = headers.find((item) => {
20254
+ if (Array.isArray(item) && typeof item[0] === "string") {
20255
+ return item[0].toLowerCase() === targetKey;
20256
+ }
20257
+ return false;
20258
+ });
20259
+ return found ? String(found[1]) : void 0;
20260
+ }
20261
+ if (typeof headers === "object") {
20262
+ const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20263
+ return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20264
+ }
20265
+ return void 0;
20266
+ }
20267
+ function setSafeHeaders(initHeaders, newHeaders) {
20268
+ if (typeof globalThis.Headers !== "undefined") {
20269
+ const headers = new globalThis.Headers(initHeaders ?? {});
20270
+ for (const [k, v] of Object.entries(newHeaders)) {
20271
+ headers.set(k, v);
20272
+ }
20273
+ return headers;
20274
+ }
20275
+ if (Array.isArray(initHeaders)) {
20276
+ const nextHeaders2 = [...initHeaders];
20277
+ for (const [k, v] of Object.entries(newHeaders)) {
20278
+ const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20279
+ if (idx !== -1) {
20280
+ nextHeaders2[idx] = [k, v];
20281
+ } else {
20282
+ nextHeaders2.push([k, v]);
20283
+ }
20284
+ }
20285
+ return nextHeaders2;
20286
+ }
20287
+ const nextHeaders = {};
20288
+ if (initHeaders && typeof initHeaders === "object") {
20289
+ for (const [k, v] of Object.entries(initHeaders)) {
20290
+ nextHeaders[k] = String(v);
20291
+ }
20292
+ }
20293
+ for (const [k, v] of Object.entries(newHeaders)) {
20294
+ const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20295
+ if (existingKey) {
20296
+ nextHeaders[existingKey] = v;
20297
+ } else {
20298
+ nextHeaders[k] = v;
20299
+ }
20300
+ }
20301
+ return nextHeaders;
20302
+ }
20303
+ function toUrlString(value) {
20304
+ if (typeof value === "string") {
20305
+ return value;
20306
+ }
20307
+ const candidate = value.url;
20308
+ if (candidate) {
20309
+ return candidate;
20310
+ }
20311
+ return value.toString();
20312
+ }
20213
20313
 
20214
- Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20215
- Do not call other tools.
20216
- `;
20217
- var latestAgyAuthResolver;
20218
- var latestAgyConfiguredProjectId;
20219
- var latestAgyUserAgentModel;
20314
+ // src/plugin/tier.ts
20220
20315
  var STATIC_MODELS_SIMPLE = {
20221
20316
  "gemini-3.8-flash": {
20222
20317
  name: "Gemini 3.8 Flash",
@@ -20304,6 +20399,39 @@ var TIER_MAPPING = {
20304
20399
  high: "gemini-3.1-pro-high"
20305
20400
  }
20306
20401
  };
20402
+ function resolveModelTier(baseModelId, headersOrInit) {
20403
+ const parts = baseModelId.split("@");
20404
+ const base = parts[0] || "";
20405
+ const suffixTier = parts[1]?.toLowerCase();
20406
+ const mapping = TIER_MAPPING[base];
20407
+ if (!mapping) {
20408
+ return baseModelId;
20409
+ }
20410
+ const rawHeaders = headersOrInit && typeof headersOrInit === "object" && "headers" in headersOrInit ? headersOrInit.headers : headersOrInit;
20411
+ const headerTier = getSafeHeader(rawHeaders, "x-agy-tier")?.toLowerCase() || null;
20412
+ const requestedTier = headerTier || suffixTier;
20413
+ if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20414
+ return mapping[requestedTier] || baseModelId;
20415
+ }
20416
+ return mapping["medium"] ?? mapping["high"] ?? baseModelId;
20417
+ }
20418
+
20419
+ // src/plugin.ts
20420
+ var AGY_QUOTA_COMMAND = "agyquota";
20421
+ var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20422
+
20423
+ Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20424
+ Do not call other tools.
20425
+ `;
20426
+ var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20427
+ 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.
20428
+
20429
+ Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20430
+ Do not call other tools.
20431
+ `;
20432
+ var latestAgyAuthResolver;
20433
+ var latestAgyConfiguredProjectId;
20434
+ var latestAgyUserAgentModel;
20307
20435
  var buildModelFromSimple = (modelId, simple) => {
20308
20436
  const isClaude = modelId.startsWith("claude-");
20309
20437
  const isGpt = modelId.startsWith("gpt-");
@@ -20397,83 +20525,6 @@ var STATIC_MODELS = {};
20397
20525
  for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
20398
20526
  STATIC_MODELS[modelId] = buildModelFromSimple(modelId, simple);
20399
20527
  }
20400
- function getSafeHeader(headers, key) {
20401
- if (!headers) {
20402
- return void 0;
20403
- }
20404
- const targetKey = key.toLowerCase();
20405
- if (typeof headers.get === "function") {
20406
- try {
20407
- return headers.get(targetKey) || void 0;
20408
- } catch {
20409
- }
20410
- }
20411
- if (Array.isArray(headers)) {
20412
- const found = headers.find((item) => {
20413
- if (Array.isArray(item) && typeof item[0] === "string") {
20414
- return item[0].toLowerCase() === targetKey;
20415
- }
20416
- return false;
20417
- });
20418
- return found ? String(found[1]) : void 0;
20419
- }
20420
- if (typeof headers === "object") {
20421
- const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20422
- return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20423
- }
20424
- return void 0;
20425
- }
20426
- function setSafeHeaders(initHeaders, newHeaders) {
20427
- if (typeof globalThis.Headers !== "undefined") {
20428
- const headers = new globalThis.Headers(initHeaders ?? {});
20429
- for (const [k, v] of Object.entries(newHeaders)) {
20430
- headers.set(k, v);
20431
- }
20432
- return headers;
20433
- }
20434
- if (Array.isArray(initHeaders)) {
20435
- const nextHeaders2 = [...initHeaders];
20436
- for (const [k, v] of Object.entries(newHeaders)) {
20437
- const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20438
- if (idx !== -1) {
20439
- nextHeaders2[idx] = [k, v];
20440
- } else {
20441
- nextHeaders2.push([k, v]);
20442
- }
20443
- }
20444
- return nextHeaders2;
20445
- }
20446
- const nextHeaders = {};
20447
- if (initHeaders && typeof initHeaders === "object") {
20448
- for (const [k, v] of Object.entries(initHeaders)) {
20449
- nextHeaders[k] = String(v);
20450
- }
20451
- }
20452
- for (const [k, v] of Object.entries(newHeaders)) {
20453
- const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20454
- if (existingKey) {
20455
- nextHeaders[existingKey] = v;
20456
- } else {
20457
- nextHeaders[k] = v;
20458
- }
20459
- }
20460
- return nextHeaders;
20461
- }
20462
- function resolveModelTier(baseModelId, init) {
20463
- const parts = baseModelId.split("@");
20464
- const base = parts[0] || "";
20465
- const suffixTier = parts[1]?.toLowerCase();
20466
- const mapping = TIER_MAPPING[base];
20467
- if (!mapping) {
20468
- return baseModelId;
20469
- }
20470
- const headerTier = getSafeHeader(init?.headers, "x-agy-tier")?.toLowerCase() || null;
20471
- const requestedTier = headerTier || suffixTier;
20472
- if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20473
- return mapping[requestedTier] || baseModelId;
20474
- }
20475
- return mapping["medium"] ?? mapping["high"];
20476
- }
20477
20528
  var AgyCLIOAuthPlugin = async ({ client }) => {
20478
20529
  let latestConfig;
20479
20530
  updateStaticModelsWithPricing(STATIC_MODELS);
@@ -20801,25 +20852,782 @@ async function ensureProjectContextOrThrow(authRecord, client, configuredProject
20801
20852
  throw error45;
20802
20853
  }
20803
20854
  }
20804
- function toUrlString(value) {
20805
- if (typeof value === "string") {
20806
- return value;
20855
+
20856
+ // src/plugin/types.ts
20857
+ function defineOpenCodeV2Plugin(def) {
20858
+ return def;
20859
+ }
20860
+
20861
+ // src/plugin/v2-storage.ts
20862
+ import { closeSync, existsSync as existsSync6, mkdirSync as mkdirSync5, openSync, readFileSync as readFileSync5, renameSync as renameSync4, unlinkSync as unlinkSync4, writeFileSync as writeFileSync5 } from "fs";
20863
+ import { randomUUID as randomUUID4 } from "crypto";
20864
+ import { homedir as homedir4 } from "os";
20865
+ import { join as join6 } from "path";
20866
+ var storedAuthOverrideForTesting = void 0;
20867
+ function loadStoredAuthFromJson() {
20868
+ if (storedAuthOverrideForTesting !== void 0) {
20869
+ return storedAuthOverrideForTesting;
20870
+ }
20871
+ const authPath = join6(homedir4(), ".local", "share", "opencode", "auth.json");
20872
+ try {
20873
+ if (existsSync6(authPath)) {
20874
+ const content = readFileSync5(authPath, "utf8");
20875
+ const data = JSON.parse(content);
20876
+ return data?.[AGY_PROVIDER_ID];
20877
+ }
20878
+ } catch {
20807
20879
  }
20808
- const candidate = value.url;
20809
- if (candidate) {
20810
- return candidate;
20880
+ return void 0;
20881
+ }
20882
+ function saveStoredAuthToJson(authRecord) {
20883
+ if (process.env.NODE_ENV === "test" || process.env.VITEST || storedAuthOverrideForTesting !== void 0) {
20884
+ return;
20811
20885
  }
20812
- return value.toString();
20886
+ const dirPath = join6(homedir4(), ".local", "share", "opencode");
20887
+ if (!existsSync6(dirPath)) {
20888
+ mkdirSync5(dirPath, { recursive: true });
20889
+ }
20890
+ const authPath = join6(dirPath, "auth.json");
20891
+ const data = existsSync6(authPath) ? JSON.parse(readFileSync5(authPath, "utf8")) : {};
20892
+ data[AGY_PROVIDER_ID] = {
20893
+ type: "oauth",
20894
+ refresh: authRecord.refresh,
20895
+ access: authRecord.access,
20896
+ expires: authRecord.expires
20897
+ };
20898
+ const tempPath = `${authPath}.${process.pid}.${randomUUID4()}.tmp`;
20899
+ let tempFileDescriptor;
20900
+ let ownsTempFile = false;
20901
+ try {
20902
+ tempFileDescriptor = openSync(tempPath, "wx", 384);
20903
+ ownsTempFile = true;
20904
+ writeFileSync5(tempFileDescriptor, JSON.stringify(data, null, 2), {
20905
+ encoding: "utf8"
20906
+ });
20907
+ closeSync(tempFileDescriptor);
20908
+ tempFileDescriptor = void 0;
20909
+ renameSync4(tempPath, authPath);
20910
+ } catch (error45) {
20911
+ if (tempFileDescriptor !== void 0) {
20912
+ try {
20913
+ closeSync(tempFileDescriptor);
20914
+ } catch {
20915
+ }
20916
+ }
20917
+ if (ownsTempFile) {
20918
+ try {
20919
+ unlinkSync4(tempPath);
20920
+ } catch {
20921
+ }
20922
+ }
20923
+ throw error45;
20924
+ }
20925
+ }
20926
+
20927
+ // src/plugin/v2-fetch.ts
20928
+ function createV2FetchInterceptor(getAuthSnapshot) {
20929
+ return async function agyV2Fetch(input, init) {
20930
+ const isGL = isGenerativeLanguageRequest(input);
20931
+ const isInternal = toUrlString(input).includes("cloudcode-pa.googleapis.com");
20932
+ if (!isGL && !isInternal) {
20933
+ return (globalThis.fetch || fetch)(input, init);
20934
+ }
20935
+ let rawAuth = getAuthSnapshot ? await getAuthSnapshot() : void 0;
20936
+ if (!rawAuth) {
20937
+ rawAuth = loadStoredAuthFromJson();
20938
+ }
20939
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
20940
+ return (globalThis.fetch || fetch)(input, init);
20941
+ }
20942
+ let authRecord = resolveCachedAuth(rawAuth);
20943
+ if (accessTokenExpired(authRecord)) {
20944
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
20945
+ } } });
20946
+ if (refreshed) {
20947
+ authRecord = refreshed;
20948
+ }
20949
+ }
20950
+ if (!authRecord.access) {
20951
+ return (globalThis.fetch || fetch)(input, init);
20952
+ }
20953
+ if (isInternal) {
20954
+ const hasAuth = getSafeHeader(init?.headers, "Authorization") !== void 0;
20955
+ if (hasAuth) {
20956
+ return (globalThis.fetch || fetch)(input, init);
20957
+ }
20958
+ const userAgent = buildAgyCliUserAgent();
20959
+ const headers = setSafeHeaders(init?.headers, {
20960
+ Authorization: `Bearer ${authRecord.access}`,
20961
+ "User-Agent": userAgent
20962
+ });
20963
+ return (globalThis.fetch || fetch)(input, {
20964
+ ...init,
20965
+ headers
20966
+ });
20967
+ }
20968
+ const requestTarget = parseGenerativeLanguageRequest(input);
20969
+ const requestUserAgentModel = requestTarget?.effectiveModel;
20970
+ let projectContext;
20971
+ try {
20972
+ projectContext = await ensureProjectContext(
20973
+ authRecord,
20974
+ { auth: { set: async () => {
20975
+ } } },
20976
+ void 0,
20977
+ requestUserAgentModel
20978
+ );
20979
+ } catch {
20980
+ projectContext = {
20981
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
20982
+ auth: authRecord
20983
+ };
20984
+ }
20985
+ const originalRequestedModel = parseGenerativeLanguageRequest(input)?.effectiveModel;
20986
+ let modifiedInput = input;
20987
+ if (isGL && originalRequestedModel) {
20988
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
20989
+ const resolvedBase = resolveModelTier(originalBase, init);
20990
+ if (originalBase !== resolvedBase) {
20991
+ if (typeof modifiedInput === "string") {
20992
+ modifiedInput = modifiedInput.replace(`models/${originalBase}`, `models/${resolvedBase}`);
20993
+ } else if (typeof Request !== "undefined" && modifiedInput instanceof Request) {
20994
+ const newUrl = modifiedInput.url.replace(`models/${originalBase}`, `models/${resolvedBase}`);
20995
+ modifiedInput = new Request(newUrl, modifiedInput);
20996
+ }
20997
+ }
20998
+ }
20999
+ const transformed = prepareAgyRequest(
21000
+ modifiedInput,
21001
+ init,
21002
+ authRecord.access,
21003
+ projectContext.effectiveProjectId,
21004
+ void 0
21005
+ );
21006
+ const chatLogger = createChatLogger();
21007
+ if (chatLogger) {
21008
+ chatLogger.logRequest(
21009
+ toUrlString(transformed.request),
21010
+ transformed.init.method || "GET",
21011
+ transformed.init.headers,
21012
+ transformed.init.body
21013
+ );
21014
+ }
21015
+ const response = await fetchWithRetry(transformed.request, transformed.init);
21016
+ return transformAgyResponse(
21017
+ response,
21018
+ transformed.streaming,
21019
+ null,
21020
+ transformed.requestedModel,
21021
+ transformed.sessionId,
21022
+ chatLogger
21023
+ );
21024
+ };
20813
21025
  }
20814
21026
 
21027
+ // src/plugin/v2-session.ts
21028
+ function createV2HttpRequestHook(state = {}) {
21029
+ return async (event) => {
21030
+ if (!event) return;
21031
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21032
+ const isGL = isGenerativeLanguageRequest(rawUrl);
21033
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21034
+ if (!isGL && !isInternal) {
21035
+ return;
21036
+ }
21037
+ event.headers = event.headers || {};
21038
+ let modelName;
21039
+ let rawAuth = event.auth;
21040
+ if (rawAuth && !rawAuth.type) {
21041
+ const tokenVal = rawAuth.access || rawAuth.token;
21042
+ if (tokenVal || rawAuth.refresh) {
21043
+ rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
21044
+ }
21045
+ }
21046
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
21047
+ rawAuth = loadStoredAuthFromJson();
21048
+ }
21049
+ let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
21050
+ if (authRecord && accessTokenExpired(authRecord)) {
21051
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
21052
+ } } });
21053
+ if (refreshed) {
21054
+ authRecord = refreshed;
21055
+ try {
21056
+ saveStoredAuthToJson(refreshed);
21057
+ } catch {
21058
+ console.warn("[Agy Auth] Refreshed credentials could not be persisted; the current request will continue.");
21059
+ }
21060
+ }
21061
+ }
21062
+ if (isGL) {
21063
+ const parsed = parseGenerativeLanguageRequest(rawUrl);
21064
+ modelName = parsed?.effectiveModel;
21065
+ if (modelName) {
21066
+ state.lastInterceptedModel = modelName;
21067
+ }
21068
+ if (typeof event.headers.delete === "function") {
21069
+ event.headers.delete("x-goog-api-key");
21070
+ event.headers.delete("api-key");
21071
+ } else {
21072
+ for (const key of Object.keys(event.headers)) {
21073
+ const lower = key.toLowerCase();
21074
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21075
+ delete event.headers[key];
21076
+ }
21077
+ }
21078
+ }
21079
+ if (event.request?.headers) {
21080
+ if (typeof event.request.headers.delete === "function") {
21081
+ event.request.headers.delete("x-goog-api-key");
21082
+ event.request.headers.delete("api-key");
21083
+ } else {
21084
+ for (const key of Object.keys(event.request.headers)) {
21085
+ const lower = key.toLowerCase();
21086
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21087
+ delete event.request.headers[key];
21088
+ }
21089
+ }
21090
+ }
21091
+ }
21092
+ let cleanUrl = rawUrl;
21093
+ try {
21094
+ const parsedUrl = new URL(rawUrl);
21095
+ let urlChanged = false;
21096
+ for (const param of ["key", "x-goog-api-key", "api-key"]) {
21097
+ if (parsedUrl.searchParams.has(param)) {
21098
+ parsedUrl.searchParams.delete(param);
21099
+ urlChanged = true;
21100
+ }
21101
+ }
21102
+ if (urlChanged) {
21103
+ cleanUrl = parsedUrl.toString();
21104
+ }
21105
+ } catch {
21106
+ }
21107
+ if (authRecord && authRecord.access) {
21108
+ let projectContext;
21109
+ try {
21110
+ projectContext = await ensureProjectContext(
21111
+ authRecord,
21112
+ { auth: { set: async () => {
21113
+ } } },
21114
+ void 0,
21115
+ modelName
21116
+ );
21117
+ } catch {
21118
+ projectContext = {
21119
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
21120
+ auth: authRecord
21121
+ };
21122
+ }
21123
+ const originalRequestedModel = modelName;
21124
+ let modifiedUrl = cleanUrl;
21125
+ if (originalRequestedModel) {
21126
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
21127
+ const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
21128
+ const resolvedBase = resolveModelTier(originalBase, { headers: initHeaders });
21129
+ if (originalBase !== resolvedBase) {
21130
+ modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
21131
+ }
21132
+ }
21133
+ let bodyPayload = event.body;
21134
+ if (bodyPayload === void 0 && event.request) {
21135
+ if (typeof event.request.clone === "function") {
21136
+ try {
21137
+ bodyPayload = await event.request.clone().text();
21138
+ } catch {
21139
+ }
21140
+ } else if (event.request.body !== void 0) {
21141
+ bodyPayload = event.request.body;
21142
+ }
21143
+ }
21144
+ let preExistingUserAgent;
21145
+ if (typeof event.headers?.get === "function") {
21146
+ preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
21147
+ } else if (event.headers && typeof event.headers === "object") {
21148
+ preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
21149
+ }
21150
+ if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
21151
+ preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
21152
+ } else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
21153
+ preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
21154
+ }
21155
+ const method = event.method || event.request?.method || "POST";
21156
+ const requestHeaders = event.headers || event.request?.headers;
21157
+ const transformed = prepareAgyRequest(
21158
+ modifiedUrl,
21159
+ {
21160
+ method,
21161
+ headers: requestHeaders,
21162
+ body: bodyPayload
21163
+ },
21164
+ authRecord.access,
21165
+ projectContext.effectiveProjectId
21166
+ );
21167
+ const targetUrl = toUrlString(transformed.request);
21168
+ if (typeof event.url === "string") {
21169
+ event.url = targetUrl;
21170
+ }
21171
+ if (event.request && typeof event.request === "object") {
21172
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21173
+ event.request = new Request(targetUrl, {
21174
+ method: transformed.init.method,
21175
+ headers: transformed.init.headers,
21176
+ body: transformed.init.body
21177
+ });
21178
+ } else if (typeof event.request.url === "string") {
21179
+ try {
21180
+ event.request.url = targetUrl;
21181
+ } catch {
21182
+ }
21183
+ }
21184
+ }
21185
+ const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
21186
+ for (const [k, v] of headerEntries) {
21187
+ const lowerK = k.toLowerCase();
21188
+ if (lowerK === "user-agent") {
21189
+ if (preExistingUserAgent) {
21190
+ continue;
21191
+ }
21192
+ if (typeof event.headers?.set === "function") {
21193
+ event.headers.set("User-Agent", v);
21194
+ } else if (event.headers) {
21195
+ event.headers["User-Agent"] = v;
21196
+ }
21197
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21198
+ event.request.headers.set("User-Agent", v);
21199
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21200
+ event.request.headers["User-Agent"] = v;
21201
+ }
21202
+ continue;
21203
+ }
21204
+ if (typeof event.headers?.set === "function") {
21205
+ event.headers.set(k, v);
21206
+ } else if (event.headers) {
21207
+ event.headers[k] = v;
21208
+ }
21209
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21210
+ event.request.headers.set(k, v);
21211
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21212
+ event.request.headers[k] = v;
21213
+ }
21214
+ }
21215
+ if (transformed.init.body !== void 0) {
21216
+ event.body = transformed.init.body;
21217
+ if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
21218
+ event.request.body = transformed.init.body;
21219
+ }
21220
+ }
21221
+ } else {
21222
+ if (typeof event.url === "string") {
21223
+ event.url = cleanUrl;
21224
+ }
21225
+ if (event.request && typeof event.request === "object") {
21226
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21227
+ event.request = new Request(cleanUrl, event.request);
21228
+ } else if (typeof event.request.url === "string") {
21229
+ try {
21230
+ event.request.url = cleanUrl;
21231
+ } catch {
21232
+ }
21233
+ }
21234
+ }
21235
+ }
21236
+ }
21237
+ if (authRecord && authRecord.access) {
21238
+ if (typeof event.headers?.set === "function") {
21239
+ event.headers.set("Authorization", `Bearer ${authRecord.access}`);
21240
+ } else if (event.headers) {
21241
+ event.headers["Authorization"] = `Bearer ${authRecord.access}`;
21242
+ }
21243
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21244
+ event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
21245
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21246
+ event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
21247
+ }
21248
+ }
21249
+ const userAgent = buildAgyCliUserAgent(modelName);
21250
+ if (typeof event.headers?.set === "function") {
21251
+ if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
21252
+ event.headers.set("User-Agent", userAgent);
21253
+ }
21254
+ } else if (event.headers) {
21255
+ if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
21256
+ event.headers["User-Agent"] = userAgent;
21257
+ }
21258
+ }
21259
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21260
+ if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
21261
+ event.request.headers.set("User-Agent", userAgent);
21262
+ }
21263
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21264
+ if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
21265
+ event.request.headers["User-Agent"] = userAgent;
21266
+ }
21267
+ }
21268
+ };
21269
+ }
21270
+ function createV2HttpResponseHook(state = {}) {
21271
+ return async (event) => {
21272
+ if (!event || !event.response) return;
21273
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21274
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21275
+ if (isInternal && event.response instanceof Response) {
21276
+ const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
21277
+ const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || state.lastInterceptedModel;
21278
+ const transformed = await transformAgyResponse(
21279
+ event.response,
21280
+ !!isStreaming,
21281
+ null,
21282
+ parsedModel,
21283
+ void 0,
21284
+ void 0
21285
+ );
21286
+ event.response = transformed;
21287
+ }
21288
+ };
21289
+ }
21290
+ function createV2RetryHook() {
21291
+ return async (event) => {
21292
+ if (!event) return;
21293
+ const response = event.response;
21294
+ if (response instanceof Response) {
21295
+ if (response.status === 429 || response.status === 503) {
21296
+ const quota = await classifyQuotaResponse(response);
21297
+ if (quota?.retryDelayMs) {
21298
+ event.retryDelayMs = quota.retryDelayMs;
21299
+ } else {
21300
+ event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
21301
+ }
21302
+ }
21303
+ } else if (event.details && Array.isArray(event.details)) {
21304
+ const retryInfo = event.details.find(
21305
+ (d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
21306
+ );
21307
+ if (retryInfo?.retryDelay) {
21308
+ const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
21309
+ if (delayMs !== null) {
21310
+ event.retryDelayMs = delayMs;
21311
+ }
21312
+ }
21313
+ }
21314
+ };
21315
+ }
21316
+ function registerV2SessionHooks(ctx) {
21317
+ const state = {};
21318
+ ctx.session.hook("http.request", createV2HttpRequestHook(state), { providerID: AGY_PROVIDER_ID });
21319
+ ctx.session.hook("http.response", createV2HttpResponseHook(state), { providerID: AGY_PROVIDER_ID });
21320
+ ctx.session.hook("retry", createV2RetryHook(), { providerID: AGY_PROVIDER_ID });
21321
+ }
21322
+
21323
+ // src/plugin/v2.ts
21324
+ async function setupOpenCodeV2(ctx) {
21325
+ const resolveVariants = (modelId) => {
21326
+ const mapping = TIER_MAPPING[modelId];
21327
+ if (!mapping) return void 0;
21328
+ const variants = [];
21329
+ if (mapping.minimal !== void 0) variants.push({ id: "minimal" });
21330
+ if (mapping.low !== void 0) variants.push({ id: "low" });
21331
+ if (mapping.medium !== void 0) variants.push({ id: "medium" });
21332
+ if (mapping.high !== void 0) variants.push({ id: "high" });
21333
+ return variants.length > 0 ? variants : void 0;
21334
+ };
21335
+ const updateProviderRecord = (p) => {
21336
+ p.name = "Antigravity CLI";
21337
+ p.activation = "enabled";
21338
+ p.package = "aisdk:@ai-sdk/google";
21339
+ p.description = "Google Gemini Antigravity Code Assist OAuth provider";
21340
+ p.settings = { ...p.settings || {}, apiKey: "dummy" };
21341
+ p.integrationID = AGY_PROVIDER_ID;
21342
+ };
21343
+ const buildModelRecord = (modelId, simple, existingModel) => {
21344
+ const isClaude = modelId.startsWith("claude-");
21345
+ const isGpt = modelId.startsWith("gpt-");
21346
+ const variants = resolveVariants(modelId);
21347
+ return {
21348
+ id: modelId,
21349
+ providerID: AGY_PROVIDER_ID,
21350
+ name: simple.name,
21351
+ description: simple.description,
21352
+ family: modelId.includes("gemini") ? "gemini" : isClaude ? "claude" : isGpt ? "gpt" : "unknown",
21353
+ reasoning: simple.reasoning,
21354
+ attachment: simple.attachment,
21355
+ tool_call: simple.toolCall,
21356
+ limit: {
21357
+ context: simple.maxTokens,
21358
+ output: simple.maxOutputTokens
21359
+ },
21360
+ cost: simple.cost || { input: 0, output: 0 },
21361
+ ...variants ? { variants } : {},
21362
+ ...existingModel || {}
21363
+ };
21364
+ };
21365
+ const updateModelRecord = (m, modelId, simple) => {
21366
+ m.name = simple.name;
21367
+ m.capabilities = {
21368
+ tools: true,
21369
+ input: ["text", "image"],
21370
+ output: ["text"]
21371
+ };
21372
+ m.limit = {
21373
+ context: simple.maxTokens,
21374
+ output: simple.maxOutputTokens
21375
+ };
21376
+ m.family = "gemini";
21377
+ if (simple.cost) {
21378
+ m.cost = simple.cost;
21379
+ }
21380
+ const variants = resolveVariants(modelId);
21381
+ if (variants) {
21382
+ m.variants = variants;
21383
+ }
21384
+ };
21385
+ if (ctx.provider?.transform) {
21386
+ ctx.provider.transform(async (editor) => {
21387
+ if (!editor) return;
21388
+ if (typeof editor.update === "function") {
21389
+ editor.update(AGY_PROVIDER_ID, updateProviderRecord);
21390
+ } else if (typeof editor.set === "function") {
21391
+ const p = { id: AGY_PROVIDER_ID };
21392
+ updateProviderRecord(p);
21393
+ editor.set(AGY_PROVIDER_ID, p);
21394
+ } else if (typeof editor === "object") {
21395
+ const p = editor[AGY_PROVIDER_ID] || { id: AGY_PROVIDER_ID };
21396
+ updateProviderRecord(p);
21397
+ editor[AGY_PROVIDER_ID] = p;
21398
+ }
21399
+ });
21400
+ }
21401
+ if (ctx.model?.transform) {
21402
+ ctx.model.transform(async (editor) => {
21403
+ if (!editor) return;
21404
+ if (typeof editor.update === "function") {
21405
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21406
+ editor.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21407
+ }
21408
+ } else if (typeof editor.set === "function") {
21409
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21410
+ const m = buildModelRecord(modelId, simple);
21411
+ editor.set(`${AGY_PROVIDER_ID}:${modelId}`, m);
21412
+ }
21413
+ } else if (typeof editor === "object") {
21414
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21415
+ const key = `${AGY_PROVIDER_ID}:${modelId}`;
21416
+ editor[key] = buildModelRecord(modelId, simple, editor[key]);
21417
+ }
21418
+ }
21419
+ });
21420
+ }
21421
+ if (ctx.catalog?.transform) {
21422
+ ctx.catalog.transform(async (editor) => {
21423
+ if (!editor) return;
21424
+ if (typeof editor?.provider?.update === "function") {
21425
+ editor.provider.update(AGY_PROVIDER_ID, updateProviderRecord);
21426
+ if (typeof editor?.model?.update === "function") {
21427
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21428
+ editor.model.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21429
+ }
21430
+ }
21431
+ return;
21432
+ }
21433
+ const catalog = editor;
21434
+ catalog.providers = catalog.providers || {};
21435
+ catalog.providers[AGY_PROVIDER_ID] = {
21436
+ id: AGY_PROVIDER_ID,
21437
+ name: "Antigravity CLI",
21438
+ npm: "aisdk:@ai-sdk/google",
21439
+ settings: { apiKey: "dummy" },
21440
+ integrationID: AGY_PROVIDER_ID,
21441
+ models: { ...catalog.providers[AGY_PROVIDER_ID]?.models || {} },
21442
+ ...catalog.providers[AGY_PROVIDER_ID]
21443
+ };
21444
+ if (catalog.providers[AGY_PROVIDER_ID].settings) {
21445
+ catalog.providers[AGY_PROVIDER_ID].settings = {
21446
+ ...catalog.providers[AGY_PROVIDER_ID].settings,
21447
+ apiKey: "dummy"
21448
+ };
21449
+ } else {
21450
+ catalog.providers[AGY_PROVIDER_ID].settings = { apiKey: "dummy" };
21451
+ }
21452
+ catalog.providers[AGY_PROVIDER_ID].integrationID = AGY_PROVIDER_ID;
21453
+ const targetModels = catalog.providers[AGY_PROVIDER_ID].models;
21454
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21455
+ targetModels[modelId] = buildModelRecord(modelId, simple, targetModels[modelId]);
21456
+ }
21457
+ });
21458
+ }
21459
+ ctx.tool.transform(async (editor) => {
21460
+ if (!editor) return;
21461
+ const quotaTool = createAgyQuotaTool({
21462
+ client: void 0,
21463
+ getAuthResolver: () => void 0,
21464
+ getConfiguredProjectId: () => void 0,
21465
+ getUserAgentModel: () => void 0
21466
+ });
21467
+ const quotaSummaryTool = createAgyQuotaSummaryTool({
21468
+ client: void 0,
21469
+ getAuthResolver: () => void 0,
21470
+ getConfiguredProjectId: () => void 0,
21471
+ getUserAgentModel: () => void 0
21472
+ });
21473
+ if (typeof editor.add === "function") {
21474
+ editor.add({
21475
+ name: AGY_QUOTA_TOOL_NAME,
21476
+ description: quotaTool.description,
21477
+ input: {},
21478
+ execute: async (args, context) => quotaTool.execute(args, context)
21479
+ });
21480
+ editor.add({
21481
+ name: AGY_QUOTA_SUMMARY_TOOL_NAME,
21482
+ description: quotaSummaryTool.description,
21483
+ input: {},
21484
+ execute: async (args, context) => quotaSummaryTool.execute(args, context)
21485
+ });
21486
+ } else if (typeof editor.set === "function") {
21487
+ editor.set(AGY_QUOTA_TOOL_NAME, quotaTool);
21488
+ editor.set(AGY_QUOTA_SUMMARY_TOOL_NAME, quotaSummaryTool);
21489
+ } else if (editor.tools && typeof editor.tools === "object") {
21490
+ editor.tools[AGY_QUOTA_TOOL_NAME] = quotaTool;
21491
+ editor.tools[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21492
+ } else if (typeof editor === "object") {
21493
+ editor[AGY_QUOTA_TOOL_NAME] = quotaTool;
21494
+ editor[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21495
+ }
21496
+ });
21497
+ ctx.command.transform(async (editor) => {
21498
+ if (!editor) return;
21499
+ const commands = {
21500
+ [AGY_V2_QUOTA_COMMAND]: {
21501
+ description: "Show Agy Code Assist quota usage",
21502
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21503
+ },
21504
+ [AGY_V2_QUOTA_SUMMARY_COMMAND]: {
21505
+ description: "Show Agy Code Assist quota summary with weekly and 5-hour limits",
21506
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21507
+ }
21508
+ };
21509
+ if (typeof editor.add === "function") {
21510
+ editor.add({
21511
+ name: AGY_V2_QUOTA_COMMAND,
21512
+ description: "Display current Antigravity quota usage",
21513
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21514
+ });
21515
+ editor.add({
21516
+ name: AGY_V2_QUOTA_SUMMARY_COMMAND,
21517
+ description: "Display Antigravity quota summary grouped by model family",
21518
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21519
+ });
21520
+ } else if (typeof editor.set === "function") {
21521
+ editor.set(AGY_V2_QUOTA_COMMAND, commands[AGY_V2_QUOTA_COMMAND]);
21522
+ editor.set(AGY_V2_QUOTA_SUMMARY_COMMAND, commands[AGY_V2_QUOTA_SUMMARY_COMMAND]);
21523
+ } else if (editor.commands && typeof editor.commands === "object") {
21524
+ editor.commands[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21525
+ editor.commands[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21526
+ } else if (typeof editor === "object") {
21527
+ editor[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21528
+ editor[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21529
+ }
21530
+ });
21531
+ ctx.integration?.transform?.((editor) => {
21532
+ if (!editor) return;
21533
+ editor.update?.(AGY_PROVIDER_ID, (integration) => {
21534
+ integration.name = "Antigravity CLI (plugin)";
21535
+ });
21536
+ editor.method?.update?.({
21537
+ integrationID: AGY_PROVIDER_ID,
21538
+ method: {
21539
+ id: "oauth",
21540
+ type: "oauth",
21541
+ label: "Antigravity CLI (OAuth)"
21542
+ },
21543
+ authorize: async () => {
21544
+ const authorization = await authorizeAgy();
21545
+ return {
21546
+ mode: "code",
21547
+ url: authorization.url,
21548
+ instructions: "Please complete Google account authorization in your browser. After authorization, copy the full redirect URL or code and paste it below:",
21549
+ callback: async (code) => {
21550
+ const trimmed = code.trim();
21551
+ const parsed = parseOAuthCallbackInput(trimmed);
21552
+ const authCode = parsed.code || trimmed;
21553
+ if (!authCode) {
21554
+ return { type: "failed", error: "Missing authorization code in callback input" };
21555
+ }
21556
+ if (parsed.state && parsed.state !== authorization.state) {
21557
+ return { type: "failed", error: "State mismatch in callback input (possible CSRF attempt)" };
21558
+ }
21559
+ const exchangeResult = await exchangeAgyWithVerifier(authCode, authorization.verifier);
21560
+ if (exchangeResult.type !== "success") {
21561
+ return exchangeResult;
21562
+ }
21563
+ const initialRefresh = formatRefreshParts({
21564
+ refreshToken: exchangeResult.refresh
21565
+ });
21566
+ let authRecord = {
21567
+ type: "oauth",
21568
+ refresh: initialRefresh,
21569
+ access: exchangeResult.access,
21570
+ expires: exchangeResult.expires
21571
+ };
21572
+ try {
21573
+ const projectContext = await ensureProjectContext(
21574
+ authRecord,
21575
+ { auth: { set: async () => {
21576
+ } } }
21577
+ );
21578
+ authRecord = {
21579
+ ...authRecord,
21580
+ refresh: projectContext.auth.refresh
21581
+ };
21582
+ } catch {
21583
+ }
21584
+ try {
21585
+ saveStoredAuthToJson(authRecord);
21586
+ } catch {
21587
+ return {
21588
+ type: "failed",
21589
+ error: "Google authentication succeeded but AGY credentials could not be stored. Check filesystem access and retry."
21590
+ };
21591
+ }
21592
+ return {
21593
+ type: "oauth",
21594
+ methodID: "oauth",
21595
+ refresh: authRecord.refresh,
21596
+ access: authRecord.access,
21597
+ expires: authRecord.expires
21598
+ };
21599
+ }
21600
+ };
21601
+ }
21602
+ });
21603
+ });
21604
+ ctx.aisdk?.hook("sdk", async (event) => {
21605
+ if (!event) return;
21606
+ const isMatchingProvider = event.providerID === AGY_PROVIDER_ID || event.model?.providerID === AGY_PROVIDER_ID;
21607
+ if (!isMatchingProvider) return;
21608
+ event.options = event.options || {};
21609
+ event.options.apiKey = "dummy";
21610
+ event.options.fetch = createV2FetchInterceptor();
21611
+ });
21612
+ registerV2SessionHooks(ctx);
21613
+ }
21614
+ var v2PluginDefinition = defineOpenCodeV2Plugin({
21615
+ id: AGY_PROVIDER_ID,
21616
+ setup: setupOpenCodeV2
21617
+ });
21618
+
20815
21619
  // index.ts
20816
- var index_default = {
20817
- id: "@anthonyhaussman/opencode-agy-auth",
21620
+ var dualPlugin = {
21621
+ ...v2PluginDefinition,
20818
21622
  server: AgyCLIOAuthPlugin
20819
21623
  };
21624
+ var index_default = dualPlugin;
20820
21625
  export {
20821
21626
  AgyCLIOAuthPlugin,
20822
21627
  GoogleOAuthPlugin,
20823
- index_default as default
21628
+ index_default as default,
21629
+ defineOpenCodeV2Plugin,
21630
+ setupOpenCodeV2,
21631
+ v2PluginDefinition
20824
21632
  };
20825
21633
  //# sourceMappingURL=index.js.map