@anthonyhaussman/opencode-agy-auth 1.2.17 → 1.3.0-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.17";
271
+ var AGY_CLI_VERSION = "1.3.0";
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,
@@ -16047,8 +16076,12 @@ var models_default = {
16047
16076
  }
16048
16077
  },
16049
16078
  experimentIds: [
16050
- 106560668,
16079
+ 106791760,
16080
+ 106786387,
16081
+ 106791766,
16082
+ 106140402,
16051
16083
  106760947,
16084
+ 106805876,
16052
16085
  105979552,
16053
16086
  105979574,
16054
16087
  106015333,
@@ -16089,7 +16122,9 @@ var models_default = {
16089
16122
  106038164,
16090
16123
  106032301,
16091
16124
  106121604,
16092
- 106793057
16125
+ 106793057,
16126
+ 106778026,
16127
+ 106786388
16093
16128
  ],
16094
16129
  imageGenerationModelIds: [
16095
16130
  "gemini-3.1-flash-image"
@@ -16146,7 +16181,7 @@ var models_default = {
16146
16181
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16147
16182
  quotaInfo: {
16148
16183
  remainingFraction: 1,
16149
- resetTime: "2026-10-06T00:32:08Z"
16184
+ resetTime: "2026-10-07T21:03:53Z"
16150
16185
  },
16151
16186
  recommended: true,
16152
16187
  supportedMimeTypes: {
@@ -16184,7 +16219,7 @@ var models_default = {
16184
16219
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16185
16220
  quotaInfo: {
16186
16221
  remainingFraction: 1,
16187
- resetTime: "2026-10-06T00:32:08Z"
16222
+ resetTime: "2026-10-07T21:03:53Z"
16188
16223
  },
16189
16224
  recommended: true,
16190
16225
  supportedMimeTypes: {
@@ -16222,7 +16257,7 @@ var models_default = {
16222
16257
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16223
16258
  quotaInfo: {
16224
16259
  remainingFraction: 1,
16225
- resetTime: "2026-10-06T00:32:08Z"
16260
+ resetTime: "2026-10-07T21:03:53Z"
16226
16261
  },
16227
16262
  recommended: true,
16228
16263
  supportedMimeTypes: {
@@ -16260,7 +16295,7 @@ var models_default = {
16260
16295
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16261
16296
  quotaInfo: {
16262
16297
  remainingFraction: 1,
16263
- resetTime: "2026-10-06T00:32:08Z"
16298
+ resetTime: "2026-10-07T21:03:53Z"
16264
16299
  },
16265
16300
  recommended: true,
16266
16301
  supportedMimeTypes: {
@@ -16298,7 +16333,7 @@ var models_default = {
16298
16333
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16299
16334
  quotaInfo: {
16300
16335
  remainingFraction: 1,
16301
- resetTime: "2026-10-06T00:32:08Z"
16336
+ resetTime: "2026-10-07T21:03:53Z"
16302
16337
  },
16303
16338
  recommended: true,
16304
16339
  supportedMimeTypes: {
@@ -16336,7 +16371,7 @@ var models_default = {
16336
16371
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16337
16372
  quotaInfo: {
16338
16373
  remainingFraction: 1,
16339
- resetTime: "2026-10-06T00:32:08Z"
16374
+ resetTime: "2026-10-07T21:03:53Z"
16340
16375
  },
16341
16376
  recommended: true,
16342
16377
  supportedMimeTypes: {
@@ -16374,8 +16409,8 @@ var models_default = {
16374
16409
  },
16375
16410
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16376
16411
  quotaInfo: {
16377
- remainingFraction: 0.9418832,
16378
- resetTime: "2026-10-05T19:38:35Z"
16412
+ remainingFraction: 0.8814505,
16413
+ resetTime: "2026-10-07T16:06:55Z"
16379
16414
  },
16380
16415
  recommended: true,
16381
16416
  supportedMimeTypes: {
@@ -16457,8 +16492,8 @@ var models_default = {
16457
16492
  },
16458
16493
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16459
16494
  quotaInfo: {
16460
- remainingFraction: 0.9418832,
16461
- resetTime: "2026-10-05T19:38:35Z"
16495
+ remainingFraction: 0.8814505,
16496
+ resetTime: "2026-10-07T16:06:55Z"
16462
16497
  },
16463
16498
  recommended: true,
16464
16499
  supportedMimeTypes: {
@@ -16540,8 +16575,8 @@ var models_default = {
16540
16575
  },
16541
16576
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16542
16577
  quotaInfo: {
16543
- remainingFraction: 0.9418832,
16544
- resetTime: "2026-10-05T19:38:35Z"
16578
+ remainingFraction: 0.8814505,
16579
+ resetTime: "2026-10-07T16:06:55Z"
16545
16580
  },
16546
16581
  recommended: true,
16547
16582
  supportedMimeTypes: {
@@ -16620,8 +16655,8 @@ var models_default = {
16620
16655
  },
16621
16656
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16622
16657
  quotaInfo: {
16623
- remainingFraction: 0.9418832,
16624
- resetTime: "2026-10-05T19:38:35Z"
16658
+ remainingFraction: 0.8814505,
16659
+ resetTime: "2026-10-07T16:06:55Z"
16625
16660
  },
16626
16661
  recommended: true,
16627
16662
  requiresImageOutputOutsideFunctionResponses: true,
@@ -16701,8 +16736,8 @@ var models_default = {
16701
16736
  },
16702
16737
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16703
16738
  quotaInfo: {
16704
- remainingFraction: 0.9418832,
16705
- resetTime: "2026-10-05T19:38:35Z"
16739
+ remainingFraction: 0.8814505,
16740
+ resetTime: "2026-10-07T16:06:55Z"
16706
16741
  },
16707
16742
  recommended: true,
16708
16743
  supportedMimeTypes: {
@@ -16806,8 +16841,8 @@ var models_default = {
16806
16841
  },
16807
16842
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16808
16843
  quotaInfo: {
16809
- remainingFraction: 0.9418832,
16810
- resetTime: "2026-10-05T19:38:35Z"
16844
+ remainingFraction: 0.8814505,
16845
+ resetTime: "2026-10-07T16:06:55Z"
16811
16846
  },
16812
16847
  recommended: true,
16813
16848
  supportedMimeTypes: {
@@ -16874,8 +16909,8 @@ var models_default = {
16874
16909
  model: "MODEL_PLACEHOLDER_M21",
16875
16910
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16876
16911
  quotaInfo: {
16877
- remainingFraction: 0.9418832,
16878
- resetTime: "2026-10-05T19:38:35Z"
16912
+ remainingFraction: 0.8814505,
16913
+ resetTime: "2026-10-07T16:06:55Z"
16879
16914
  }
16880
16915
  },
16881
16916
  "gemini-3.1-flash-lite": {
@@ -16893,8 +16928,8 @@ var models_default = {
16893
16928
  },
16894
16929
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16895
16930
  quotaInfo: {
16896
- remainingFraction: 0.9418832,
16897
- resetTime: "2026-10-05T19:38:35Z"
16931
+ remainingFraction: 0.8814505,
16932
+ resetTime: "2026-10-07T16:06:55Z"
16898
16933
  }
16899
16934
  },
16900
16935
  "gemini-3.1-pro-high": {
@@ -16925,8 +16960,8 @@ var models_default = {
16925
16960
  },
16926
16961
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16927
16962
  quotaInfo: {
16928
- remainingFraction: 0.9418832,
16929
- resetTime: "2026-10-05T19:38:35Z"
16963
+ remainingFraction: 0.8814505,
16964
+ resetTime: "2026-10-07T16:06:55Z"
16930
16965
  },
16931
16966
  recommended: true,
16932
16967
  supportedMimeTypes: {
@@ -17016,8 +17051,8 @@ var models_default = {
17016
17051
  },
17017
17052
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17018
17053
  quotaInfo: {
17019
- remainingFraction: 0.9418832,
17020
- resetTime: "2026-10-05T19:38:35Z"
17054
+ remainingFraction: 0.8814505,
17055
+ resetTime: "2026-10-07T16:06:55Z"
17021
17056
  },
17022
17057
  recommended: true,
17023
17058
  supportedMimeTypes: {
@@ -17121,8 +17156,8 @@ var models_default = {
17121
17156
  },
17122
17157
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17123
17158
  quotaInfo: {
17124
- remainingFraction: 0.9418832,
17125
- resetTime: "2026-10-05T19:38:35Z"
17159
+ remainingFraction: 0.8814505,
17160
+ resetTime: "2026-10-07T16:06:55Z"
17126
17161
  },
17127
17162
  recommended: true,
17128
17163
  supportedMimeTypes: {
@@ -17202,8 +17237,8 @@ var models_default = {
17202
17237
  },
17203
17238
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17204
17239
  quotaInfo: {
17205
- remainingFraction: 0.9418832,
17206
- resetTime: "2026-10-05T19:38:35Z"
17240
+ remainingFraction: 0.8814505,
17241
+ resetTime: "2026-10-07T16:06:55Z"
17207
17242
  },
17208
17243
  recommended: true,
17209
17244
  supportedMimeTypes: {
@@ -17309,8 +17344,8 @@ var models_default = {
17309
17344
  },
17310
17345
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17311
17346
  quotaInfo: {
17312
- remainingFraction: 0.9418832,
17313
- resetTime: "2026-10-05T19:38:35Z"
17347
+ remainingFraction: 0.8814505,
17348
+ resetTime: "2026-10-07T16:06:55Z"
17314
17349
  },
17315
17350
  recommended: true,
17316
17351
  supportedMimeTypes: {
@@ -17426,8 +17461,8 @@ var models_default = {
17426
17461
  },
17427
17462
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17428
17463
  quotaInfo: {
17429
- remainingFraction: 0.9418832,
17430
- resetTime: "2026-10-05T19:38:35Z"
17464
+ remainingFraction: 0.8814505,
17465
+ resetTime: "2026-10-07T16:06:55Z"
17431
17466
  },
17432
17467
  recommended: true,
17433
17468
  supportedMimeTypes: {
@@ -17486,6 +17521,8 @@ var models_default = {
17486
17521
  supportsImages: true,
17487
17522
  supportsThinking: true,
17488
17523
  supportsVideo: true,
17524
+ tagDescription: "Start using Gemini 3.8 Flash, our best Flash model.",
17525
+ tagTitle: "Leaving Soon",
17489
17526
  thinkingBudget: -1
17490
17527
  },
17491
17528
  "gemini-3.6-flash-low": {
@@ -17543,8 +17580,8 @@ var models_default = {
17543
17580
  },
17544
17581
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17545
17582
  quotaInfo: {
17546
- remainingFraction: 0.9418832,
17547
- resetTime: "2026-10-05T19:38:35Z"
17583
+ remainingFraction: 0.8814505,
17584
+ resetTime: "2026-10-07T16:06:55Z"
17548
17585
  },
17549
17586
  recommended: true,
17550
17587
  supportedMimeTypes: {
@@ -17603,6 +17640,8 @@ var models_default = {
17603
17640
  supportsImages: true,
17604
17641
  supportsThinking: true,
17605
17642
  supportsVideo: true,
17643
+ tagDescription: "Start using Gemini 3.8 Flash, our best Flash model.",
17644
+ tagTitle: "Leaving Soon",
17606
17645
  thinkingBudget: 1e3
17607
17646
  },
17608
17647
  "gemini-3.6-flash-medium": {
@@ -17660,8 +17699,8 @@ var models_default = {
17660
17699
  },
17661
17700
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17662
17701
  quotaInfo: {
17663
- remainingFraction: 0.9418832,
17664
- resetTime: "2026-10-05T19:38:35Z"
17702
+ remainingFraction: 0.8814505,
17703
+ resetTime: "2026-10-07T16:06:55Z"
17665
17704
  },
17666
17705
  recommended: true,
17667
17706
  supportedMimeTypes: {
@@ -17720,6 +17759,8 @@ var models_default = {
17720
17759
  supportsImages: true,
17721
17760
  supportsThinking: true,
17722
17761
  supportsVideo: true,
17762
+ tagDescription: "Start using Gemini 3.8 Flash, our best Flash model.",
17763
+ tagTitle: "Leaving Soon",
17723
17764
  thinkingBudget: 4e3
17724
17765
  },
17725
17766
  "gemini-3.6-flash-tiered": {
@@ -17776,8 +17817,8 @@ var models_default = {
17776
17817
  },
17777
17818
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17778
17819
  quotaInfo: {
17779
- remainingFraction: 0.9418832,
17780
- resetTime: "2026-10-05T19:38:35Z"
17820
+ remainingFraction: 0.8814505,
17821
+ resetTime: "2026-10-07T16:06:55Z"
17781
17822
  },
17782
17823
  recommended: true,
17783
17824
  supportedMimeTypes: {
@@ -17887,8 +17928,8 @@ var models_default = {
17887
17928
  },
17888
17929
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17889
17930
  quotaInfo: {
17890
- remainingFraction: 0.9418832,
17891
- resetTime: "2026-10-05T19:38:35Z"
17931
+ remainingFraction: 0.8814505,
17932
+ resetTime: "2026-10-07T16:06:55Z"
17892
17933
  },
17893
17934
  recommended: true,
17894
17935
  supportedMimeTypes: {
@@ -17947,6 +17988,8 @@ var models_default = {
17947
17988
  supportsImages: true,
17948
17989
  supportsThinking: true,
17949
17990
  supportsVideo: true,
17991
+ tagDescription: "Start using Gemini 3.8 Flash, our best Flash model.",
17992
+ tagTitle: "Leaving Soon",
17950
17993
  thinkingBudget: -1
17951
17994
  },
17952
17995
  "gemini-3.7-flash-low": {
@@ -17998,8 +18041,8 @@ var models_default = {
17998
18041
  },
17999
18042
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18000
18043
  quotaInfo: {
18001
- remainingFraction: 0.9418832,
18002
- resetTime: "2026-10-05T19:38:35Z"
18044
+ remainingFraction: 0.8814505,
18045
+ resetTime: "2026-10-07T16:06:55Z"
18003
18046
  },
18004
18047
  recommended: true,
18005
18048
  supportedMimeTypes: {
@@ -18058,6 +18101,8 @@ var models_default = {
18058
18101
  supportsImages: true,
18059
18102
  supportsThinking: true,
18060
18103
  supportsVideo: true,
18104
+ tagDescription: "Start using Gemini 3.8 Flash, our best Flash model.",
18105
+ tagTitle: "Leaving Soon",
18061
18106
  thinkingBudget: 1e3
18062
18107
  },
18063
18108
  "gemini-3.7-flash-medium": {
@@ -18109,8 +18154,8 @@ var models_default = {
18109
18154
  },
18110
18155
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18111
18156
  quotaInfo: {
18112
- remainingFraction: 0.9418832,
18113
- resetTime: "2026-10-05T19:38:35Z"
18157
+ remainingFraction: 0.8814505,
18158
+ resetTime: "2026-10-07T16:06:55Z"
18114
18159
  },
18115
18160
  recommended: true,
18116
18161
  supportedMimeTypes: {
@@ -18169,6 +18214,8 @@ var models_default = {
18169
18214
  supportsImages: true,
18170
18215
  supportsThinking: true,
18171
18216
  supportsVideo: true,
18217
+ tagDescription: "Start using Gemini 3.8 Flash, our best Flash model.",
18218
+ tagTitle: "Leaving Soon",
18172
18219
  thinkingBudget: 4e3
18173
18220
  },
18174
18221
  "gemini-3.7-flash-tiered": {
@@ -18219,8 +18266,8 @@ var models_default = {
18219
18266
  },
18220
18267
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18221
18268
  quotaInfo: {
18222
- remainingFraction: 0.9418832,
18223
- resetTime: "2026-10-05T19:38:35Z"
18269
+ remainingFraction: 0.8814505,
18270
+ resetTime: "2026-10-07T16:06:55Z"
18224
18271
  },
18225
18272
  recommended: true,
18226
18273
  supportedMimeTypes: {
@@ -18330,8 +18377,8 @@ var models_default = {
18330
18377
  },
18331
18378
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18332
18379
  quotaInfo: {
18333
- remainingFraction: 0.9418832,
18334
- resetTime: "2026-10-05T19:38:35Z"
18380
+ remainingFraction: 0.8814505,
18381
+ resetTime: "2026-10-07T16:06:55Z"
18335
18382
  },
18336
18383
  recommended: true,
18337
18384
  supportedMimeTypes: {
@@ -18441,8 +18488,8 @@ var models_default = {
18441
18488
  },
18442
18489
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18443
18490
  quotaInfo: {
18444
- remainingFraction: 0.9418832,
18445
- resetTime: "2026-10-05T19:38:35Z"
18491
+ remainingFraction: 0.8814505,
18492
+ resetTime: "2026-10-07T16:06:55Z"
18446
18493
  },
18447
18494
  recommended: true,
18448
18495
  supportedMimeTypes: {
@@ -18552,8 +18599,8 @@ var models_default = {
18552
18599
  },
18553
18600
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18554
18601
  quotaInfo: {
18555
- remainingFraction: 0.9418832,
18556
- resetTime: "2026-10-05T19:38:35Z"
18602
+ remainingFraction: 0.8814505,
18603
+ resetTime: "2026-10-07T16:06:55Z"
18557
18604
  },
18558
18605
  recommended: true,
18559
18606
  supportedMimeTypes: {
@@ -18662,8 +18709,8 @@ var models_default = {
18662
18709
  },
18663
18710
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18664
18711
  quotaInfo: {
18665
- remainingFraction: 0.9418832,
18666
- resetTime: "2026-10-05T19:38:35Z"
18712
+ remainingFraction: 0.8814505,
18713
+ resetTime: "2026-10-07T16:06:55Z"
18667
18714
  },
18668
18715
  recommended: true,
18669
18716
  supportedMimeTypes: {
@@ -18752,8 +18799,8 @@ var models_default = {
18752
18799
  },
18753
18800
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18754
18801
  quotaInfo: {
18755
- remainingFraction: 0.9418832,
18756
- resetTime: "2026-10-05T19:38:35Z"
18802
+ remainingFraction: 0.8814505,
18803
+ resetTime: "2026-10-07T16:06:55Z"
18757
18804
  },
18758
18805
  recommended: true,
18759
18806
  supportedMimeTypes: {
@@ -18830,7 +18877,7 @@ var models_default = {
18830
18877
  modelProvider: "MODEL_PROVIDER_OPENAI",
18831
18878
  quotaInfo: {
18832
18879
  remainingFraction: 1,
18833
- resetTime: "2026-10-06T00:32:08Z"
18880
+ resetTime: "2026-10-07T21:03:53Z"
18834
18881
  },
18835
18882
  recommended: true,
18836
18883
  supportsThinking: true,
@@ -19934,9 +19981,14 @@ function normalizeToolSchemaTypes(tools, toolMapper) {
19934
19981
  fn.name = toolMapper ? toolMapper.toGemini(fn.name) : sanitizeToolName(fn.name);
19935
19982
  }
19936
19983
  if (fn) {
19984
+ if (!fn.parameters) {
19985
+ fn.parameters = fn.parameters_json_schema ?? fn.parametersJsonSchema;
19986
+ }
19937
19987
  if (!fn.parameters) {
19938
19988
  fn.parameters = { type: "OBJECT", properties: {} };
19939
19989
  }
19990
+ delete fn.parameters_json_schema;
19991
+ delete fn.parametersJsonSchema;
19940
19992
  sanitizeSchema(fn.parameters);
19941
19993
  }
19942
19994
  }
@@ -20361,22 +20413,81 @@ var ChatLoggerImpl = class {
20361
20413
  }
20362
20414
  };
20363
20415
 
20364
- // src/plugin.ts
20365
- var AGY_QUOTA_COMMAND = "agyquota";
20366
- var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20367
-
20368
- Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20369
- Do not call other tools.
20370
- `;
20371
- var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20372
- 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.
20416
+ // src/plugin/headers.ts
20417
+ function getSafeHeader(headers, key) {
20418
+ if (!headers) {
20419
+ return void 0;
20420
+ }
20421
+ const targetKey = key.toLowerCase();
20422
+ if (typeof headers.get === "function") {
20423
+ try {
20424
+ return headers.get(targetKey) || void 0;
20425
+ } catch {
20426
+ }
20427
+ }
20428
+ if (Array.isArray(headers)) {
20429
+ const found = headers.find((item) => {
20430
+ if (Array.isArray(item) && typeof item[0] === "string") {
20431
+ return item[0].toLowerCase() === targetKey;
20432
+ }
20433
+ return false;
20434
+ });
20435
+ return found ? String(found[1]) : void 0;
20436
+ }
20437
+ if (typeof headers === "object") {
20438
+ const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20439
+ return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20440
+ }
20441
+ return void 0;
20442
+ }
20443
+ function setSafeHeaders(initHeaders, newHeaders) {
20444
+ if (typeof globalThis.Headers !== "undefined") {
20445
+ const headers = new globalThis.Headers(initHeaders ?? {});
20446
+ for (const [k, v] of Object.entries(newHeaders)) {
20447
+ headers.set(k, v);
20448
+ }
20449
+ return headers;
20450
+ }
20451
+ if (Array.isArray(initHeaders)) {
20452
+ const nextHeaders2 = [...initHeaders];
20453
+ for (const [k, v] of Object.entries(newHeaders)) {
20454
+ const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20455
+ if (idx !== -1) {
20456
+ nextHeaders2[idx] = [k, v];
20457
+ } else {
20458
+ nextHeaders2.push([k, v]);
20459
+ }
20460
+ }
20461
+ return nextHeaders2;
20462
+ }
20463
+ const nextHeaders = {};
20464
+ if (initHeaders && typeof initHeaders === "object") {
20465
+ for (const [k, v] of Object.entries(initHeaders)) {
20466
+ nextHeaders[k] = String(v);
20467
+ }
20468
+ }
20469
+ for (const [k, v] of Object.entries(newHeaders)) {
20470
+ const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20471
+ if (existingKey) {
20472
+ nextHeaders[existingKey] = v;
20473
+ } else {
20474
+ nextHeaders[k] = v;
20475
+ }
20476
+ }
20477
+ return nextHeaders;
20478
+ }
20479
+ function toUrlString(value) {
20480
+ if (typeof value === "string") {
20481
+ return value;
20482
+ }
20483
+ const candidate = value.url;
20484
+ if (candidate) {
20485
+ return candidate;
20486
+ }
20487
+ return value.toString();
20488
+ }
20373
20489
 
20374
- Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20375
- Do not call other tools.
20376
- `;
20377
- var latestAgyAuthResolver;
20378
- var latestAgyConfiguredProjectId;
20379
- var latestAgyUserAgentModel;
20490
+ // src/plugin/tier.ts
20380
20491
  var STATIC_MODELS_SIMPLE = {
20381
20492
  "gemini-3.8-flash": {
20382
20493
  name: "Gemini 3.8 Flash",
@@ -20474,6 +20585,39 @@ var TIER_MAPPING = {
20474
20585
  high: "claude-sonnet-5-5-high"
20475
20586
  }
20476
20587
  };
20588
+ function resolveModelTier(baseModelId, headersOrInit) {
20589
+ const parts = baseModelId.split("@");
20590
+ const base = parts[0] || "";
20591
+ const suffixTier = parts[1]?.toLowerCase();
20592
+ const mapping = TIER_MAPPING[base];
20593
+ if (!mapping) {
20594
+ return baseModelId;
20595
+ }
20596
+ const rawHeaders = headersOrInit && typeof headersOrInit === "object" && "headers" in headersOrInit ? headersOrInit.headers : headersOrInit;
20597
+ const headerTier = getSafeHeader(rawHeaders, "x-agy-tier")?.toLowerCase() || null;
20598
+ const requestedTier = headerTier || suffixTier;
20599
+ if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20600
+ return mapping[requestedTier] || baseModelId;
20601
+ }
20602
+ return mapping["medium"] ?? mapping["high"] ?? baseModelId;
20603
+ }
20604
+
20605
+ // src/plugin.ts
20606
+ var AGY_QUOTA_COMMAND = "agyquota";
20607
+ var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20608
+
20609
+ Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20610
+ Do not call other tools.
20611
+ `;
20612
+ var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20613
+ 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.
20614
+
20615
+ Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20616
+ Do not call other tools.
20617
+ `;
20618
+ var latestAgyAuthResolver;
20619
+ var latestAgyConfiguredProjectId;
20620
+ var latestAgyUserAgentModel;
20477
20621
  var buildModelFromSimple = (modelId, simple) => {
20478
20622
  const isClaude = modelId.startsWith("claude-");
20479
20623
  const isGpt = modelId.startsWith("gpt-");
@@ -20567,83 +20711,6 @@ var STATIC_MODELS = {};
20567
20711
  for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
20568
20712
  STATIC_MODELS[modelId] = buildModelFromSimple(modelId, simple);
20569
20713
  }
20570
- function getSafeHeader(headers, key) {
20571
- if (!headers) {
20572
- return void 0;
20573
- }
20574
- const targetKey = key.toLowerCase();
20575
- if (typeof headers.get === "function") {
20576
- try {
20577
- return headers.get(targetKey) || void 0;
20578
- } catch {
20579
- }
20580
- }
20581
- if (Array.isArray(headers)) {
20582
- const found = headers.find((item) => {
20583
- if (Array.isArray(item) && typeof item[0] === "string") {
20584
- return item[0].toLowerCase() === targetKey;
20585
- }
20586
- return false;
20587
- });
20588
- return found ? String(found[1]) : void 0;
20589
- }
20590
- if (typeof headers === "object") {
20591
- const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20592
- return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20593
- }
20594
- return void 0;
20595
- }
20596
- function setSafeHeaders(initHeaders, newHeaders) {
20597
- if (typeof globalThis.Headers !== "undefined") {
20598
- const headers = new globalThis.Headers(initHeaders ?? {});
20599
- for (const [k, v] of Object.entries(newHeaders)) {
20600
- headers.set(k, v);
20601
- }
20602
- return headers;
20603
- }
20604
- if (Array.isArray(initHeaders)) {
20605
- const nextHeaders2 = [...initHeaders];
20606
- for (const [k, v] of Object.entries(newHeaders)) {
20607
- const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20608
- if (idx !== -1) {
20609
- nextHeaders2[idx] = [k, v];
20610
- } else {
20611
- nextHeaders2.push([k, v]);
20612
- }
20613
- }
20614
- return nextHeaders2;
20615
- }
20616
- const nextHeaders = {};
20617
- if (initHeaders && typeof initHeaders === "object") {
20618
- for (const [k, v] of Object.entries(initHeaders)) {
20619
- nextHeaders[k] = String(v);
20620
- }
20621
- }
20622
- for (const [k, v] of Object.entries(newHeaders)) {
20623
- const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20624
- if (existingKey) {
20625
- nextHeaders[existingKey] = v;
20626
- } else {
20627
- nextHeaders[k] = v;
20628
- }
20629
- }
20630
- return nextHeaders;
20631
- }
20632
- function resolveModelTier(baseModelId, init) {
20633
- const parts = baseModelId.split("@");
20634
- const base = parts[0] || "";
20635
- const suffixTier = parts[1]?.toLowerCase();
20636
- const mapping = TIER_MAPPING[base];
20637
- if (!mapping) {
20638
- return baseModelId;
20639
- }
20640
- const headerTier = getSafeHeader(init?.headers, "x-agy-tier")?.toLowerCase() || null;
20641
- const requestedTier = headerTier || suffixTier;
20642
- if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20643
- return mapping[requestedTier] || baseModelId;
20644
- }
20645
- return mapping["medium"] ?? mapping["high"];
20646
- }
20647
20714
  var AgyCLIOAuthPlugin = async ({ client }) => {
20648
20715
  let latestConfig;
20649
20716
  updateStaticModelsWithPricing(STATIC_MODELS);
@@ -20971,25 +21038,782 @@ async function ensureProjectContextOrThrow(authRecord, client, configuredProject
20971
21038
  throw error45;
20972
21039
  }
20973
21040
  }
20974
- function toUrlString(value) {
20975
- if (typeof value === "string") {
20976
- return value;
21041
+
21042
+ // src/plugin/types.ts
21043
+ function defineOpenCodeV2Plugin(def) {
21044
+ return def;
21045
+ }
21046
+
21047
+ // src/plugin/v2-storage.ts
21048
+ import { closeSync, existsSync as existsSync6, mkdirSync as mkdirSync5, openSync, readFileSync as readFileSync5, renameSync as renameSync4, unlinkSync as unlinkSync4, writeFileSync as writeFileSync5 } from "fs";
21049
+ import { randomUUID as randomUUID4 } from "crypto";
21050
+ import { homedir as homedir4 } from "os";
21051
+ import { join as join6 } from "path";
21052
+ var storedAuthOverrideForTesting = void 0;
21053
+ function loadStoredAuthFromJson() {
21054
+ if (storedAuthOverrideForTesting !== void 0) {
21055
+ return storedAuthOverrideForTesting;
21056
+ }
21057
+ const authPath = join6(homedir4(), ".local", "share", "opencode", "auth.json");
21058
+ try {
21059
+ if (existsSync6(authPath)) {
21060
+ const content = readFileSync5(authPath, "utf8");
21061
+ const data = JSON.parse(content);
21062
+ return data?.[AGY_PROVIDER_ID];
21063
+ }
21064
+ } catch {
20977
21065
  }
20978
- const candidate = value.url;
20979
- if (candidate) {
20980
- return candidate;
21066
+ return void 0;
21067
+ }
21068
+ function saveStoredAuthToJson(authRecord) {
21069
+ if (process.env.NODE_ENV === "test" || process.env.VITEST || storedAuthOverrideForTesting !== void 0) {
21070
+ return;
20981
21071
  }
20982
- return value.toString();
21072
+ const dirPath = join6(homedir4(), ".local", "share", "opencode");
21073
+ if (!existsSync6(dirPath)) {
21074
+ mkdirSync5(dirPath, { recursive: true });
21075
+ }
21076
+ const authPath = join6(dirPath, "auth.json");
21077
+ const data = existsSync6(authPath) ? JSON.parse(readFileSync5(authPath, "utf8")) : {};
21078
+ data[AGY_PROVIDER_ID] = {
21079
+ type: "oauth",
21080
+ refresh: authRecord.refresh,
21081
+ access: authRecord.access,
21082
+ expires: authRecord.expires
21083
+ };
21084
+ const tempPath = `${authPath}.${process.pid}.${randomUUID4()}.tmp`;
21085
+ let tempFileDescriptor;
21086
+ let ownsTempFile = false;
21087
+ try {
21088
+ tempFileDescriptor = openSync(tempPath, "wx", 384);
21089
+ ownsTempFile = true;
21090
+ writeFileSync5(tempFileDescriptor, JSON.stringify(data, null, 2), {
21091
+ encoding: "utf8"
21092
+ });
21093
+ closeSync(tempFileDescriptor);
21094
+ tempFileDescriptor = void 0;
21095
+ renameSync4(tempPath, authPath);
21096
+ } catch (error45) {
21097
+ if (tempFileDescriptor !== void 0) {
21098
+ try {
21099
+ closeSync(tempFileDescriptor);
21100
+ } catch {
21101
+ }
21102
+ }
21103
+ if (ownsTempFile) {
21104
+ try {
21105
+ unlinkSync4(tempPath);
21106
+ } catch {
21107
+ }
21108
+ }
21109
+ throw error45;
21110
+ }
21111
+ }
21112
+
21113
+ // src/plugin/v2-fetch.ts
21114
+ function createV2FetchInterceptor(getAuthSnapshot) {
21115
+ return async function agyV2Fetch(input, init) {
21116
+ const isGL = isGenerativeLanguageRequest(input);
21117
+ const isInternal = toUrlString(input).includes("cloudcode-pa.googleapis.com");
21118
+ if (!isGL && !isInternal) {
21119
+ return (globalThis.fetch || fetch)(input, init);
21120
+ }
21121
+ let rawAuth = getAuthSnapshot ? await getAuthSnapshot() : void 0;
21122
+ if (!rawAuth) {
21123
+ rawAuth = loadStoredAuthFromJson();
21124
+ }
21125
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
21126
+ return (globalThis.fetch || fetch)(input, init);
21127
+ }
21128
+ let authRecord = resolveCachedAuth(rawAuth);
21129
+ if (accessTokenExpired(authRecord)) {
21130
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
21131
+ } } });
21132
+ if (refreshed) {
21133
+ authRecord = refreshed;
21134
+ }
21135
+ }
21136
+ if (!authRecord.access) {
21137
+ return (globalThis.fetch || fetch)(input, init);
21138
+ }
21139
+ if (isInternal) {
21140
+ const hasAuth = getSafeHeader(init?.headers, "Authorization") !== void 0;
21141
+ if (hasAuth) {
21142
+ return (globalThis.fetch || fetch)(input, init);
21143
+ }
21144
+ const userAgent = buildAgyCliUserAgent();
21145
+ const headers = setSafeHeaders(init?.headers, {
21146
+ Authorization: `Bearer ${authRecord.access}`,
21147
+ "User-Agent": userAgent
21148
+ });
21149
+ return (globalThis.fetch || fetch)(input, {
21150
+ ...init,
21151
+ headers
21152
+ });
21153
+ }
21154
+ const requestTarget = parseGenerativeLanguageRequest(input);
21155
+ const requestUserAgentModel = requestTarget?.effectiveModel;
21156
+ let projectContext;
21157
+ try {
21158
+ projectContext = await ensureProjectContext(
21159
+ authRecord,
21160
+ { auth: { set: async () => {
21161
+ } } },
21162
+ void 0,
21163
+ requestUserAgentModel
21164
+ );
21165
+ } catch {
21166
+ projectContext = {
21167
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
21168
+ auth: authRecord
21169
+ };
21170
+ }
21171
+ const originalRequestedModel = parseGenerativeLanguageRequest(input)?.effectiveModel;
21172
+ let modifiedInput = input;
21173
+ if (isGL && originalRequestedModel) {
21174
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
21175
+ const resolvedBase = resolveModelTier(originalBase, init);
21176
+ if (originalBase !== resolvedBase) {
21177
+ if (typeof modifiedInput === "string") {
21178
+ modifiedInput = modifiedInput.replace(`models/${originalBase}`, `models/${resolvedBase}`);
21179
+ } else if (typeof Request !== "undefined" && modifiedInput instanceof Request) {
21180
+ const newUrl = modifiedInput.url.replace(`models/${originalBase}`, `models/${resolvedBase}`);
21181
+ modifiedInput = new Request(newUrl, modifiedInput);
21182
+ }
21183
+ }
21184
+ }
21185
+ const transformed = prepareAgyRequest(
21186
+ modifiedInput,
21187
+ init,
21188
+ authRecord.access,
21189
+ projectContext.effectiveProjectId,
21190
+ void 0
21191
+ );
21192
+ const chatLogger = createChatLogger();
21193
+ if (chatLogger) {
21194
+ chatLogger.logRequest(
21195
+ toUrlString(transformed.request),
21196
+ transformed.init.method || "GET",
21197
+ transformed.init.headers,
21198
+ transformed.init.body
21199
+ );
21200
+ }
21201
+ const response = await fetchWithRetry(transformed.request, transformed.init);
21202
+ return transformAgyResponse(
21203
+ response,
21204
+ transformed.streaming,
21205
+ null,
21206
+ transformed.requestedModel,
21207
+ transformed.sessionId,
21208
+ chatLogger
21209
+ );
21210
+ };
20983
21211
  }
20984
21212
 
21213
+ // src/plugin/v2-session.ts
21214
+ function createV2HttpRequestHook(state = {}) {
21215
+ return async (event) => {
21216
+ if (!event) return;
21217
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21218
+ const isGL = isGenerativeLanguageRequest(rawUrl);
21219
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21220
+ if (!isGL && !isInternal) {
21221
+ return;
21222
+ }
21223
+ event.headers = event.headers || {};
21224
+ let modelName;
21225
+ let rawAuth = event.auth;
21226
+ if (rawAuth && !rawAuth.type) {
21227
+ const tokenVal = rawAuth.access || rawAuth.token;
21228
+ if (tokenVal || rawAuth.refresh) {
21229
+ rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
21230
+ }
21231
+ }
21232
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
21233
+ rawAuth = loadStoredAuthFromJson();
21234
+ }
21235
+ let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
21236
+ if (authRecord && accessTokenExpired(authRecord)) {
21237
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
21238
+ } } });
21239
+ if (refreshed) {
21240
+ authRecord = refreshed;
21241
+ try {
21242
+ saveStoredAuthToJson(refreshed);
21243
+ } catch {
21244
+ console.warn("[Agy Auth] Refreshed credentials could not be persisted; the current request will continue.");
21245
+ }
21246
+ }
21247
+ }
21248
+ if (isGL) {
21249
+ const parsed = parseGenerativeLanguageRequest(rawUrl);
21250
+ modelName = parsed?.effectiveModel;
21251
+ if (modelName) {
21252
+ state.lastInterceptedModel = modelName;
21253
+ }
21254
+ if (typeof event.headers.delete === "function") {
21255
+ event.headers.delete("x-goog-api-key");
21256
+ event.headers.delete("api-key");
21257
+ } else {
21258
+ for (const key of Object.keys(event.headers)) {
21259
+ const lower = key.toLowerCase();
21260
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21261
+ delete event.headers[key];
21262
+ }
21263
+ }
21264
+ }
21265
+ if (event.request?.headers) {
21266
+ if (typeof event.request.headers.delete === "function") {
21267
+ event.request.headers.delete("x-goog-api-key");
21268
+ event.request.headers.delete("api-key");
21269
+ } else {
21270
+ for (const key of Object.keys(event.request.headers)) {
21271
+ const lower = key.toLowerCase();
21272
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21273
+ delete event.request.headers[key];
21274
+ }
21275
+ }
21276
+ }
21277
+ }
21278
+ let cleanUrl = rawUrl;
21279
+ try {
21280
+ const parsedUrl = new URL(rawUrl);
21281
+ let urlChanged = false;
21282
+ for (const param of ["key", "x-goog-api-key", "api-key"]) {
21283
+ if (parsedUrl.searchParams.has(param)) {
21284
+ parsedUrl.searchParams.delete(param);
21285
+ urlChanged = true;
21286
+ }
21287
+ }
21288
+ if (urlChanged) {
21289
+ cleanUrl = parsedUrl.toString();
21290
+ }
21291
+ } catch {
21292
+ }
21293
+ if (authRecord && authRecord.access) {
21294
+ let projectContext;
21295
+ try {
21296
+ projectContext = await ensureProjectContext(
21297
+ authRecord,
21298
+ { auth: { set: async () => {
21299
+ } } },
21300
+ void 0,
21301
+ modelName
21302
+ );
21303
+ } catch {
21304
+ projectContext = {
21305
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
21306
+ auth: authRecord
21307
+ };
21308
+ }
21309
+ const originalRequestedModel = modelName;
21310
+ let modifiedUrl = cleanUrl;
21311
+ if (originalRequestedModel) {
21312
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
21313
+ const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
21314
+ const resolvedBase = resolveModelTier(originalBase, { headers: initHeaders });
21315
+ if (originalBase !== resolvedBase) {
21316
+ modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
21317
+ }
21318
+ }
21319
+ let bodyPayload = event.body;
21320
+ if (bodyPayload === void 0 && event.request) {
21321
+ if (typeof event.request.clone === "function") {
21322
+ try {
21323
+ bodyPayload = await event.request.clone().text();
21324
+ } catch {
21325
+ }
21326
+ } else if (event.request.body !== void 0) {
21327
+ bodyPayload = event.request.body;
21328
+ }
21329
+ }
21330
+ let preExistingUserAgent;
21331
+ if (typeof event.headers?.get === "function") {
21332
+ preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
21333
+ } else if (event.headers && typeof event.headers === "object") {
21334
+ preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
21335
+ }
21336
+ if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
21337
+ preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
21338
+ } else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
21339
+ preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
21340
+ }
21341
+ const method = event.method || event.request?.method || "POST";
21342
+ const requestHeaders = event.headers || event.request?.headers;
21343
+ const transformed = prepareAgyRequest(
21344
+ modifiedUrl,
21345
+ {
21346
+ method,
21347
+ headers: requestHeaders,
21348
+ body: bodyPayload
21349
+ },
21350
+ authRecord.access,
21351
+ projectContext.effectiveProjectId
21352
+ );
21353
+ const targetUrl = toUrlString(transformed.request);
21354
+ if (typeof event.url === "string") {
21355
+ event.url = targetUrl;
21356
+ }
21357
+ if (event.request && typeof event.request === "object") {
21358
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21359
+ event.request = new Request(targetUrl, {
21360
+ method: transformed.init.method,
21361
+ headers: transformed.init.headers,
21362
+ body: transformed.init.body
21363
+ });
21364
+ } else if (typeof event.request.url === "string") {
21365
+ try {
21366
+ event.request.url = targetUrl;
21367
+ } catch {
21368
+ }
21369
+ }
21370
+ }
21371
+ const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
21372
+ for (const [k, v] of headerEntries) {
21373
+ const lowerK = k.toLowerCase();
21374
+ if (lowerK === "user-agent") {
21375
+ if (preExistingUserAgent) {
21376
+ continue;
21377
+ }
21378
+ if (typeof event.headers?.set === "function") {
21379
+ event.headers.set("User-Agent", v);
21380
+ } else if (event.headers) {
21381
+ event.headers["User-Agent"] = v;
21382
+ }
21383
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21384
+ event.request.headers.set("User-Agent", v);
21385
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21386
+ event.request.headers["User-Agent"] = v;
21387
+ }
21388
+ continue;
21389
+ }
21390
+ if (typeof event.headers?.set === "function") {
21391
+ event.headers.set(k, v);
21392
+ } else if (event.headers) {
21393
+ event.headers[k] = v;
21394
+ }
21395
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21396
+ event.request.headers.set(k, v);
21397
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21398
+ event.request.headers[k] = v;
21399
+ }
21400
+ }
21401
+ if (transformed.init.body !== void 0) {
21402
+ event.body = transformed.init.body;
21403
+ if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
21404
+ event.request.body = transformed.init.body;
21405
+ }
21406
+ }
21407
+ } else {
21408
+ if (typeof event.url === "string") {
21409
+ event.url = cleanUrl;
21410
+ }
21411
+ if (event.request && typeof event.request === "object") {
21412
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21413
+ event.request = new Request(cleanUrl, event.request);
21414
+ } else if (typeof event.request.url === "string") {
21415
+ try {
21416
+ event.request.url = cleanUrl;
21417
+ } catch {
21418
+ }
21419
+ }
21420
+ }
21421
+ }
21422
+ }
21423
+ if (authRecord && authRecord.access) {
21424
+ if (typeof event.headers?.set === "function") {
21425
+ event.headers.set("Authorization", `Bearer ${authRecord.access}`);
21426
+ } else if (event.headers) {
21427
+ event.headers["Authorization"] = `Bearer ${authRecord.access}`;
21428
+ }
21429
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21430
+ event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
21431
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21432
+ event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
21433
+ }
21434
+ }
21435
+ const userAgent = buildAgyCliUserAgent(modelName);
21436
+ if (typeof event.headers?.set === "function") {
21437
+ if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
21438
+ event.headers.set("User-Agent", userAgent);
21439
+ }
21440
+ } else if (event.headers) {
21441
+ if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
21442
+ event.headers["User-Agent"] = userAgent;
21443
+ }
21444
+ }
21445
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21446
+ if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
21447
+ event.request.headers.set("User-Agent", userAgent);
21448
+ }
21449
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21450
+ if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
21451
+ event.request.headers["User-Agent"] = userAgent;
21452
+ }
21453
+ }
21454
+ };
21455
+ }
21456
+ function createV2HttpResponseHook(state = {}) {
21457
+ return async (event) => {
21458
+ if (!event || !event.response) return;
21459
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21460
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21461
+ if (isInternal && event.response instanceof Response) {
21462
+ const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
21463
+ const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || state.lastInterceptedModel;
21464
+ const transformed = await transformAgyResponse(
21465
+ event.response,
21466
+ !!isStreaming,
21467
+ null,
21468
+ parsedModel,
21469
+ void 0,
21470
+ void 0
21471
+ );
21472
+ event.response = transformed;
21473
+ }
21474
+ };
21475
+ }
21476
+ function createV2RetryHook() {
21477
+ return async (event) => {
21478
+ if (!event) return;
21479
+ const response = event.response;
21480
+ if (response instanceof Response) {
21481
+ if (response.status === 429 || response.status === 503) {
21482
+ const quota = await classifyQuotaResponse(response);
21483
+ if (quota?.retryDelayMs) {
21484
+ event.retryDelayMs = quota.retryDelayMs;
21485
+ } else {
21486
+ event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
21487
+ }
21488
+ }
21489
+ } else if (event.details && Array.isArray(event.details)) {
21490
+ const retryInfo = event.details.find(
21491
+ (d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
21492
+ );
21493
+ if (retryInfo?.retryDelay) {
21494
+ const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
21495
+ if (delayMs !== null) {
21496
+ event.retryDelayMs = delayMs;
21497
+ }
21498
+ }
21499
+ }
21500
+ };
21501
+ }
21502
+ function registerV2SessionHooks(ctx) {
21503
+ const state = {};
21504
+ ctx.session.hook("http.request", createV2HttpRequestHook(state), { providerID: AGY_PROVIDER_ID });
21505
+ ctx.session.hook("http.response", createV2HttpResponseHook(state), { providerID: AGY_PROVIDER_ID });
21506
+ ctx.session.hook("retry", createV2RetryHook(), { providerID: AGY_PROVIDER_ID });
21507
+ }
21508
+
21509
+ // src/plugin/v2.ts
21510
+ async function setupOpenCodeV2(ctx) {
21511
+ const resolveVariants = (modelId) => {
21512
+ const mapping = TIER_MAPPING[modelId];
21513
+ if (!mapping) return void 0;
21514
+ const variants = [];
21515
+ if (mapping.minimal !== void 0) variants.push({ id: "minimal" });
21516
+ if (mapping.low !== void 0) variants.push({ id: "low" });
21517
+ if (mapping.medium !== void 0) variants.push({ id: "medium" });
21518
+ if (mapping.high !== void 0) variants.push({ id: "high" });
21519
+ return variants.length > 0 ? variants : void 0;
21520
+ };
21521
+ const updateProviderRecord = (p) => {
21522
+ p.name = "Antigravity CLI";
21523
+ p.activation = "enabled";
21524
+ p.package = "aisdk:@ai-sdk/google";
21525
+ p.description = "Google Gemini Antigravity Code Assist OAuth provider";
21526
+ p.settings = { ...p.settings || {}, apiKey: "dummy" };
21527
+ p.integrationID = AGY_PROVIDER_ID;
21528
+ };
21529
+ const buildModelRecord = (modelId, simple, existingModel) => {
21530
+ const isClaude = modelId.startsWith("claude-");
21531
+ const isGpt = modelId.startsWith("gpt-");
21532
+ const variants = resolveVariants(modelId);
21533
+ return {
21534
+ id: modelId,
21535
+ providerID: AGY_PROVIDER_ID,
21536
+ name: simple.name,
21537
+ description: simple.description,
21538
+ family: modelId.includes("gemini") ? "gemini" : isClaude ? "claude" : isGpt ? "gpt" : "unknown",
21539
+ reasoning: simple.reasoning,
21540
+ attachment: simple.attachment,
21541
+ tool_call: simple.toolCall,
21542
+ limit: {
21543
+ context: simple.maxTokens,
21544
+ output: simple.maxOutputTokens
21545
+ },
21546
+ cost: simple.cost || { input: 0, output: 0 },
21547
+ ...variants ? { variants } : {},
21548
+ ...existingModel || {}
21549
+ };
21550
+ };
21551
+ const updateModelRecord = (m, modelId, simple) => {
21552
+ m.name = simple.name;
21553
+ m.capabilities = {
21554
+ tools: true,
21555
+ input: ["text", "image"],
21556
+ output: ["text"]
21557
+ };
21558
+ m.limit = {
21559
+ context: simple.maxTokens,
21560
+ output: simple.maxOutputTokens
21561
+ };
21562
+ m.family = "gemini";
21563
+ if (simple.cost) {
21564
+ m.cost = simple.cost;
21565
+ }
21566
+ const variants = resolveVariants(modelId);
21567
+ if (variants) {
21568
+ m.variants = variants;
21569
+ }
21570
+ };
21571
+ if (ctx.provider?.transform) {
21572
+ ctx.provider.transform(async (editor) => {
21573
+ if (!editor) return;
21574
+ if (typeof editor.update === "function") {
21575
+ editor.update(AGY_PROVIDER_ID, updateProviderRecord);
21576
+ } else if (typeof editor.set === "function") {
21577
+ const p = { id: AGY_PROVIDER_ID };
21578
+ updateProviderRecord(p);
21579
+ editor.set(AGY_PROVIDER_ID, p);
21580
+ } else if (typeof editor === "object") {
21581
+ const p = editor[AGY_PROVIDER_ID] || { id: AGY_PROVIDER_ID };
21582
+ updateProviderRecord(p);
21583
+ editor[AGY_PROVIDER_ID] = p;
21584
+ }
21585
+ });
21586
+ }
21587
+ if (ctx.model?.transform) {
21588
+ ctx.model.transform(async (editor) => {
21589
+ if (!editor) return;
21590
+ if (typeof editor.update === "function") {
21591
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21592
+ editor.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21593
+ }
21594
+ } else if (typeof editor.set === "function") {
21595
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21596
+ const m = buildModelRecord(modelId, simple);
21597
+ editor.set(`${AGY_PROVIDER_ID}:${modelId}`, m);
21598
+ }
21599
+ } else if (typeof editor === "object") {
21600
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21601
+ const key = `${AGY_PROVIDER_ID}:${modelId}`;
21602
+ editor[key] = buildModelRecord(modelId, simple, editor[key]);
21603
+ }
21604
+ }
21605
+ });
21606
+ }
21607
+ if (ctx.catalog?.transform) {
21608
+ ctx.catalog.transform(async (editor) => {
21609
+ if (!editor) return;
21610
+ if (typeof editor?.provider?.update === "function") {
21611
+ editor.provider.update(AGY_PROVIDER_ID, updateProviderRecord);
21612
+ if (typeof editor?.model?.update === "function") {
21613
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21614
+ editor.model.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21615
+ }
21616
+ }
21617
+ return;
21618
+ }
21619
+ const catalog = editor;
21620
+ catalog.providers = catalog.providers || {};
21621
+ catalog.providers[AGY_PROVIDER_ID] = {
21622
+ id: AGY_PROVIDER_ID,
21623
+ name: "Antigravity CLI",
21624
+ npm: "aisdk:@ai-sdk/google",
21625
+ settings: { apiKey: "dummy" },
21626
+ integrationID: AGY_PROVIDER_ID,
21627
+ models: { ...catalog.providers[AGY_PROVIDER_ID]?.models || {} },
21628
+ ...catalog.providers[AGY_PROVIDER_ID]
21629
+ };
21630
+ if (catalog.providers[AGY_PROVIDER_ID].settings) {
21631
+ catalog.providers[AGY_PROVIDER_ID].settings = {
21632
+ ...catalog.providers[AGY_PROVIDER_ID].settings,
21633
+ apiKey: "dummy"
21634
+ };
21635
+ } else {
21636
+ catalog.providers[AGY_PROVIDER_ID].settings = { apiKey: "dummy" };
21637
+ }
21638
+ catalog.providers[AGY_PROVIDER_ID].integrationID = AGY_PROVIDER_ID;
21639
+ const targetModels = catalog.providers[AGY_PROVIDER_ID].models;
21640
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21641
+ targetModels[modelId] = buildModelRecord(modelId, simple, targetModels[modelId]);
21642
+ }
21643
+ });
21644
+ }
21645
+ ctx.tool.transform(async (editor) => {
21646
+ if (!editor) return;
21647
+ const quotaTool = createAgyQuotaTool({
21648
+ client: void 0,
21649
+ getAuthResolver: () => void 0,
21650
+ getConfiguredProjectId: () => void 0,
21651
+ getUserAgentModel: () => void 0
21652
+ });
21653
+ const quotaSummaryTool = createAgyQuotaSummaryTool({
21654
+ client: void 0,
21655
+ getAuthResolver: () => void 0,
21656
+ getConfiguredProjectId: () => void 0,
21657
+ getUserAgentModel: () => void 0
21658
+ });
21659
+ if (typeof editor.add === "function") {
21660
+ editor.add({
21661
+ name: AGY_QUOTA_TOOL_NAME,
21662
+ description: quotaTool.description,
21663
+ input: {},
21664
+ execute: async (args, context) => quotaTool.execute(args, context)
21665
+ });
21666
+ editor.add({
21667
+ name: AGY_QUOTA_SUMMARY_TOOL_NAME,
21668
+ description: quotaSummaryTool.description,
21669
+ input: {},
21670
+ execute: async (args, context) => quotaSummaryTool.execute(args, context)
21671
+ });
21672
+ } else if (typeof editor.set === "function") {
21673
+ editor.set(AGY_QUOTA_TOOL_NAME, quotaTool);
21674
+ editor.set(AGY_QUOTA_SUMMARY_TOOL_NAME, quotaSummaryTool);
21675
+ } else if (editor.tools && typeof editor.tools === "object") {
21676
+ editor.tools[AGY_QUOTA_TOOL_NAME] = quotaTool;
21677
+ editor.tools[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21678
+ } else if (typeof editor === "object") {
21679
+ editor[AGY_QUOTA_TOOL_NAME] = quotaTool;
21680
+ editor[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21681
+ }
21682
+ });
21683
+ ctx.command.transform(async (editor) => {
21684
+ if (!editor) return;
21685
+ const commands = {
21686
+ [AGY_V2_QUOTA_COMMAND]: {
21687
+ description: "Show Agy Code Assist quota usage",
21688
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21689
+ },
21690
+ [AGY_V2_QUOTA_SUMMARY_COMMAND]: {
21691
+ description: "Show Agy Code Assist quota summary with weekly and 5-hour limits",
21692
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21693
+ }
21694
+ };
21695
+ if (typeof editor.add === "function") {
21696
+ editor.add({
21697
+ name: AGY_V2_QUOTA_COMMAND,
21698
+ description: "Display current Antigravity quota usage",
21699
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21700
+ });
21701
+ editor.add({
21702
+ name: AGY_V2_QUOTA_SUMMARY_COMMAND,
21703
+ description: "Display Antigravity quota summary grouped by model family",
21704
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21705
+ });
21706
+ } else if (typeof editor.set === "function") {
21707
+ editor.set(AGY_V2_QUOTA_COMMAND, commands[AGY_V2_QUOTA_COMMAND]);
21708
+ editor.set(AGY_V2_QUOTA_SUMMARY_COMMAND, commands[AGY_V2_QUOTA_SUMMARY_COMMAND]);
21709
+ } else if (editor.commands && typeof editor.commands === "object") {
21710
+ editor.commands[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21711
+ editor.commands[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21712
+ } else if (typeof editor === "object") {
21713
+ editor[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21714
+ editor[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21715
+ }
21716
+ });
21717
+ ctx.integration?.transform?.((editor) => {
21718
+ if (!editor) return;
21719
+ editor.update?.(AGY_PROVIDER_ID, (integration) => {
21720
+ integration.name = "Antigravity CLI (plugin)";
21721
+ });
21722
+ editor.method?.update?.({
21723
+ integrationID: AGY_PROVIDER_ID,
21724
+ method: {
21725
+ id: "oauth",
21726
+ type: "oauth",
21727
+ label: "Antigravity CLI (OAuth)"
21728
+ },
21729
+ authorize: async () => {
21730
+ const authorization = await authorizeAgy();
21731
+ return {
21732
+ mode: "code",
21733
+ url: authorization.url,
21734
+ instructions: "Please complete Google account authorization in your browser. After authorization, copy the full redirect URL or code and paste it below:",
21735
+ callback: async (code) => {
21736
+ const trimmed = code.trim();
21737
+ const parsed = parseOAuthCallbackInput(trimmed);
21738
+ const authCode = parsed.code || trimmed;
21739
+ if (!authCode) {
21740
+ return { type: "failed", error: "Missing authorization code in callback input" };
21741
+ }
21742
+ if (parsed.state && parsed.state !== authorization.state) {
21743
+ return { type: "failed", error: "State mismatch in callback input (possible CSRF attempt)" };
21744
+ }
21745
+ const exchangeResult = await exchangeAgyWithVerifier(authCode, authorization.verifier);
21746
+ if (exchangeResult.type !== "success") {
21747
+ return exchangeResult;
21748
+ }
21749
+ const initialRefresh = formatRefreshParts({
21750
+ refreshToken: exchangeResult.refresh
21751
+ });
21752
+ let authRecord = {
21753
+ type: "oauth",
21754
+ refresh: initialRefresh,
21755
+ access: exchangeResult.access,
21756
+ expires: exchangeResult.expires
21757
+ };
21758
+ try {
21759
+ const projectContext = await ensureProjectContext(
21760
+ authRecord,
21761
+ { auth: { set: async () => {
21762
+ } } }
21763
+ );
21764
+ authRecord = {
21765
+ ...authRecord,
21766
+ refresh: projectContext.auth.refresh
21767
+ };
21768
+ } catch {
21769
+ }
21770
+ try {
21771
+ saveStoredAuthToJson(authRecord);
21772
+ } catch {
21773
+ return {
21774
+ type: "failed",
21775
+ error: "Google authentication succeeded but AGY credentials could not be stored. Check filesystem access and retry."
21776
+ };
21777
+ }
21778
+ return {
21779
+ type: "oauth",
21780
+ methodID: "oauth",
21781
+ refresh: authRecord.refresh,
21782
+ access: authRecord.access,
21783
+ expires: authRecord.expires
21784
+ };
21785
+ }
21786
+ };
21787
+ }
21788
+ });
21789
+ });
21790
+ ctx.aisdk?.hook("sdk", async (event) => {
21791
+ if (!event) return;
21792
+ const isMatchingProvider = event.providerID === AGY_PROVIDER_ID || event.model?.providerID === AGY_PROVIDER_ID;
21793
+ if (!isMatchingProvider) return;
21794
+ event.options = event.options || {};
21795
+ event.options.apiKey = "dummy";
21796
+ event.options.fetch = createV2FetchInterceptor();
21797
+ });
21798
+ registerV2SessionHooks(ctx);
21799
+ }
21800
+ var v2PluginDefinition = defineOpenCodeV2Plugin({
21801
+ id: AGY_PROVIDER_ID,
21802
+ setup: setupOpenCodeV2
21803
+ });
21804
+
20985
21805
  // index.ts
20986
- var index_default = {
20987
- id: "@anthonyhaussman/opencode-agy-auth",
21806
+ var dualPlugin = {
21807
+ ...v2PluginDefinition,
20988
21808
  server: AgyCLIOAuthPlugin
20989
21809
  };
21810
+ var index_default = dualPlugin;
20990
21811
  export {
20991
21812
  AgyCLIOAuthPlugin,
20992
21813
  GoogleOAuthPlugin,
20993
- index_default as default
21814
+ index_default as default,
21815
+ defineOpenCodeV2Plugin,
21816
+ setupOpenCodeV2,
21817
+ v2PluginDefinition
20994
21818
  };
20995
21819
  //# sourceMappingURL=index.js.map