@anthonyhaussman/opencode-agy-auth 1.2.9 → 1.2.10-alpha.1

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.9";
271
+ var AGY_CLI_VERSION = "1.2.10";
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,
@@ -16147,7 +16176,7 @@ var models_default = {
16147
16176
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16148
16177
  quotaInfo: {
16149
16178
  remainingFraction: 1,
16150
- resetTime: "2026-09-23T14:29:32Z"
16179
+ resetTime: "2026-09-24T13:14:02Z"
16151
16180
  },
16152
16181
  recommended: true,
16153
16182
  supportedMimeTypes: {
@@ -16186,7 +16215,7 @@ var models_default = {
16186
16215
  modelProvider: "MODEL_PROVIDER_ANTHROPIC",
16187
16216
  quotaInfo: {
16188
16217
  remainingFraction: 1,
16189
- resetTime: "2026-09-23T14:29:32Z"
16218
+ resetTime: "2026-09-24T13:14:02Z"
16190
16219
  },
16191
16220
  recommended: true,
16192
16221
  supportedMimeTypes: {
@@ -16222,8 +16251,8 @@ var models_default = {
16222
16251
  },
16223
16252
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16224
16253
  quotaInfo: {
16225
- remainingFraction: 0.9531947,
16226
- resetTime: "2026-09-23T14:18:13Z"
16254
+ remainingFraction: 0.9556033,
16255
+ resetTime: "2026-09-24T13:08:46Z"
16227
16256
  },
16228
16257
  recommended: true,
16229
16258
  supportedMimeTypes: {
@@ -16305,8 +16334,8 @@ var models_default = {
16305
16334
  },
16306
16335
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16307
16336
  quotaInfo: {
16308
- remainingFraction: 0.9531947,
16309
- resetTime: "2026-09-23T14:18:13Z"
16337
+ remainingFraction: 0.9556033,
16338
+ resetTime: "2026-09-24T13:08:46Z"
16310
16339
  },
16311
16340
  recommended: true,
16312
16341
  supportedMimeTypes: {
@@ -16388,8 +16417,8 @@ var models_default = {
16388
16417
  },
16389
16418
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16390
16419
  quotaInfo: {
16391
- remainingFraction: 0.9531947,
16392
- resetTime: "2026-09-23T14:18:13Z"
16420
+ remainingFraction: 0.9556033,
16421
+ resetTime: "2026-09-24T13:08:46Z"
16393
16422
  },
16394
16423
  recommended: true,
16395
16424
  supportedMimeTypes: {
@@ -16468,8 +16497,8 @@ var models_default = {
16468
16497
  },
16469
16498
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16470
16499
  quotaInfo: {
16471
- remainingFraction: 0.9531947,
16472
- resetTime: "2026-09-23T14:18:13Z"
16500
+ remainingFraction: 0.9556033,
16501
+ resetTime: "2026-09-24T13:08:46Z"
16473
16502
  },
16474
16503
  recommended: true,
16475
16504
  requiresImageOutputOutsideFunctionResponses: true,
@@ -16549,8 +16578,8 @@ var models_default = {
16549
16578
  },
16550
16579
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16551
16580
  quotaInfo: {
16552
- remainingFraction: 0.9531947,
16553
- resetTime: "2026-09-23T14:18:13Z"
16581
+ remainingFraction: 0.9556033,
16582
+ resetTime: "2026-09-24T13:08:46Z"
16554
16583
  },
16555
16584
  recommended: true,
16556
16585
  supportedMimeTypes: {
@@ -16639,7 +16668,7 @@ var models_default = {
16639
16668
  "include_subagent_snapshots": true,
16640
16669
  "include_artifact_snapshots": true,
16641
16670
  "retry_config": {
16642
- "max_retries": 0,
16671
+ "max_retries": 4,
16643
16672
  "initial_sleep_duration_ms": 1000,
16644
16673
  "exponential_multiplier": 2,
16645
16674
  "include_error_feedback": false
@@ -16654,8 +16683,8 @@ var models_default = {
16654
16683
  },
16655
16684
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16656
16685
  quotaInfo: {
16657
- remainingFraction: 0.9531947,
16658
- resetTime: "2026-09-23T14:18:13Z"
16686
+ remainingFraction: 0.9556033,
16687
+ resetTime: "2026-09-24T13:08:46Z"
16659
16688
  },
16660
16689
  recommended: true,
16661
16690
  supportedMimeTypes: {
@@ -16724,8 +16753,8 @@ var models_default = {
16724
16753
  model: "MODEL_PLACEHOLDER_M21",
16725
16754
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16726
16755
  quotaInfo: {
16727
- remainingFraction: 0.9531947,
16728
- resetTime: "2026-09-23T14:18:13Z"
16756
+ remainingFraction: 0.9556033,
16757
+ resetTime: "2026-09-24T13:08:46Z"
16729
16758
  }
16730
16759
  },
16731
16760
  "gemini-3.1-flash-lite": {
@@ -16743,8 +16772,8 @@ var models_default = {
16743
16772
  },
16744
16773
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16745
16774
  quotaInfo: {
16746
- remainingFraction: 0.9531947,
16747
- resetTime: "2026-09-23T14:18:13Z"
16775
+ remainingFraction: 0.9556033,
16776
+ resetTime: "2026-09-24T13:08:46Z"
16748
16777
  }
16749
16778
  },
16750
16779
  "gemini-3.1-pro-high": {
@@ -16775,8 +16804,8 @@ var models_default = {
16775
16804
  },
16776
16805
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16777
16806
  quotaInfo: {
16778
- remainingFraction: 0.9531947,
16779
- resetTime: "2026-09-23T14:18:13Z"
16807
+ remainingFraction: 0.9556033,
16808
+ resetTime: "2026-09-24T13:08:46Z"
16780
16809
  },
16781
16810
  recommended: true,
16782
16811
  supportedMimeTypes: {
@@ -16866,8 +16895,8 @@ var models_default = {
16866
16895
  },
16867
16896
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16868
16897
  quotaInfo: {
16869
- remainingFraction: 0.9531947,
16870
- resetTime: "2026-09-23T14:18:13Z"
16898
+ remainingFraction: 0.9556033,
16899
+ resetTime: "2026-09-24T13:08:46Z"
16871
16900
  },
16872
16901
  recommended: true,
16873
16902
  supportedMimeTypes: {
@@ -16956,7 +16985,7 @@ var models_default = {
16956
16985
  "include_subagent_snapshots": true,
16957
16986
  "include_artifact_snapshots": true,
16958
16987
  "retry_config": {
16959
- "max_retries": 0,
16988
+ "max_retries": 4,
16960
16989
  "initial_sleep_duration_ms": 1000,
16961
16990
  "exponential_multiplier": 2,
16962
16991
  "include_error_feedback": false
@@ -16971,8 +17000,8 @@ var models_default = {
16971
17000
  },
16972
17001
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16973
17002
  quotaInfo: {
16974
- remainingFraction: 0.9531947,
16975
- resetTime: "2026-09-23T14:18:13Z"
17003
+ remainingFraction: 0.9556033,
17004
+ resetTime: "2026-09-24T13:08:46Z"
16976
17005
  },
16977
17006
  recommended: true,
16978
17007
  supportedMimeTypes: {
@@ -17054,8 +17083,8 @@ var models_default = {
17054
17083
  },
17055
17084
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17056
17085
  quotaInfo: {
17057
- remainingFraction: 0.9531947,
17058
- resetTime: "2026-09-23T14:18:13Z"
17086
+ remainingFraction: 0.9556033,
17087
+ resetTime: "2026-09-24T13:08:46Z"
17059
17088
  },
17060
17089
  recommended: true,
17061
17090
  supportedMimeTypes: {
@@ -17146,7 +17175,7 @@ var models_default = {
17146
17175
  "include_subagent_snapshots": true,
17147
17176
  "include_artifact_snapshots": true,
17148
17177
  "retry_config": {
17149
- "max_retries": 0,
17178
+ "max_retries": 4,
17150
17179
  "initial_sleep_duration_ms": 1000,
17151
17180
  "exponential_multiplier": 2,
17152
17181
  "include_error_feedback": false
@@ -17161,8 +17190,8 @@ var models_default = {
17161
17190
  },
17162
17191
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17163
17192
  quotaInfo: {
17164
- remainingFraction: 0.9531947,
17165
- resetTime: "2026-09-23T14:18:13Z"
17193
+ remainingFraction: 0.9556033,
17194
+ resetTime: "2026-09-24T13:08:46Z"
17166
17195
  },
17167
17196
  recommended: true,
17168
17197
  supportedMimeTypes: {
@@ -17253,7 +17282,7 @@ var models_default = {
17253
17282
  "include_subagent_snapshots": true,
17254
17283
  "include_artifact_snapshots": true,
17255
17284
  "retry_config": {
17256
- "max_retries": 0,
17285
+ "max_retries": 4,
17257
17286
  "initial_sleep_duration_ms": 1000,
17258
17287
  "exponential_multiplier": 2,
17259
17288
  "include_error_feedback": false
@@ -17280,8 +17309,8 @@ var models_default = {
17280
17309
  },
17281
17310
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17282
17311
  quotaInfo: {
17283
- remainingFraction: 0.9531947,
17284
- resetTime: "2026-09-23T14:18:13Z"
17312
+ remainingFraction: 0.9556033,
17313
+ resetTime: "2026-09-24T13:08:46Z"
17285
17314
  },
17286
17315
  recommended: true,
17287
17316
  supportedMimeTypes: {
@@ -17372,7 +17401,7 @@ var models_default = {
17372
17401
  "include_subagent_snapshots": true,
17373
17402
  "include_artifact_snapshots": true,
17374
17403
  "retry_config": {
17375
- "max_retries": 0,
17404
+ "max_retries": 4,
17376
17405
  "initial_sleep_duration_ms": 1000,
17377
17406
  "exponential_multiplier": 2,
17378
17407
  "include_error_feedback": false
@@ -17399,8 +17428,8 @@ var models_default = {
17399
17428
  },
17400
17429
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17401
17430
  quotaInfo: {
17402
- remainingFraction: 0.9531947,
17403
- resetTime: "2026-09-23T14:18:13Z"
17431
+ remainingFraction: 0.9556033,
17432
+ resetTime: "2026-09-24T13:08:46Z"
17404
17433
  },
17405
17434
  recommended: true,
17406
17435
  supportedMimeTypes: {
@@ -17491,7 +17520,7 @@ var models_default = {
17491
17520
  "include_subagent_snapshots": true,
17492
17521
  "include_artifact_snapshots": true,
17493
17522
  "retry_config": {
17494
- "max_retries": 0,
17523
+ "max_retries": 4,
17495
17524
  "initial_sleep_duration_ms": 1000,
17496
17525
  "exponential_multiplier": 2,
17497
17526
  "include_error_feedback": false
@@ -17518,8 +17547,8 @@ var models_default = {
17518
17547
  },
17519
17548
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17520
17549
  quotaInfo: {
17521
- remainingFraction: 0.9531947,
17522
- resetTime: "2026-09-23T14:18:13Z"
17550
+ remainingFraction: 0.9556033,
17551
+ resetTime: "2026-09-24T13:08:46Z"
17523
17552
  },
17524
17553
  recommended: true,
17525
17554
  supportedMimeTypes: {
@@ -17609,7 +17638,7 @@ var models_default = {
17609
17638
  "include_subagent_snapshots": true,
17610
17639
  "include_artifact_snapshots": true,
17611
17640
  "retry_config": {
17612
- "max_retries": 0,
17641
+ "max_retries": 4,
17613
17642
  "initial_sleep_duration_ms": 1000,
17614
17643
  "exponential_multiplier": 2,
17615
17644
  "include_error_feedback": false
@@ -17636,8 +17665,8 @@ var models_default = {
17636
17665
  },
17637
17666
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17638
17667
  quotaInfo: {
17639
- remainingFraction: 0.9531947,
17640
- resetTime: "2026-09-23T14:18:13Z"
17668
+ remainingFraction: 0.9556033,
17669
+ resetTime: "2026-09-24T13:08:46Z"
17641
17670
  },
17642
17671
  recommended: true,
17643
17672
  supportedMimeTypes: {
@@ -17726,7 +17755,7 @@ var models_default = {
17726
17755
  "include_subagent_snapshots": true,
17727
17756
  "include_artifact_snapshots": true,
17728
17757
  "retry_config": {
17729
- "max_retries": 0,
17758
+ "max_retries": 4,
17730
17759
  "initial_sleep_duration_ms": 1000,
17731
17760
  "exponential_multiplier": 2,
17732
17761
  "include_error_feedback": false
@@ -17747,8 +17776,8 @@ var models_default = {
17747
17776
  },
17748
17777
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17749
17778
  quotaInfo: {
17750
- remainingFraction: 0.9531947,
17751
- resetTime: "2026-09-23T14:18:13Z"
17779
+ remainingFraction: 0.9556033,
17780
+ resetTime: "2026-09-24T13:08:46Z"
17752
17781
  },
17753
17782
  recommended: true,
17754
17783
  supportedMimeTypes: {
@@ -17839,7 +17868,7 @@ var models_default = {
17839
17868
  "include_subagent_snapshots": true,
17840
17869
  "include_artifact_snapshots": true,
17841
17870
  "retry_config": {
17842
- "max_retries": 0,
17871
+ "max_retries": 4,
17843
17872
  "initial_sleep_duration_ms": 1000,
17844
17873
  "exponential_multiplier": 2,
17845
17874
  "include_error_feedback": false
@@ -17860,8 +17889,8 @@ var models_default = {
17860
17889
  },
17861
17890
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17862
17891
  quotaInfo: {
17863
- remainingFraction: 0.9531947,
17864
- resetTime: "2026-09-23T14:18:13Z"
17892
+ remainingFraction: 0.9556033,
17893
+ resetTime: "2026-09-24T13:08:46Z"
17865
17894
  },
17866
17895
  recommended: true,
17867
17896
  supportedMimeTypes: {
@@ -17952,7 +17981,7 @@ var models_default = {
17952
17981
  "include_subagent_snapshots": true,
17953
17982
  "include_artifact_snapshots": true,
17954
17983
  "retry_config": {
17955
- "max_retries": 0,
17984
+ "max_retries": 4,
17956
17985
  "initial_sleep_duration_ms": 1000,
17957
17986
  "exponential_multiplier": 2,
17958
17987
  "include_error_feedback": false
@@ -17973,8 +18002,8 @@ var models_default = {
17973
18002
  },
17974
18003
  modelProvider: "MODEL_PROVIDER_GOOGLE",
17975
18004
  quotaInfo: {
17976
- remainingFraction: 0.9531947,
17977
- resetTime: "2026-09-23T14:18:13Z"
18005
+ remainingFraction: 0.9556033,
18006
+ resetTime: "2026-09-24T13:08:46Z"
17978
18007
  },
17979
18008
  recommended: true,
17980
18009
  supportedMimeTypes: {
@@ -18064,7 +18093,7 @@ var models_default = {
18064
18093
  "include_subagent_snapshots": true,
18065
18094
  "include_artifact_snapshots": true,
18066
18095
  "retry_config": {
18067
- "max_retries": 0,
18096
+ "max_retries": 4,
18068
18097
  "initial_sleep_duration_ms": 1000,
18069
18098
  "exponential_multiplier": 2,
18070
18099
  "include_error_feedback": false
@@ -18085,8 +18114,8 @@ var models_default = {
18085
18114
  },
18086
18115
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18087
18116
  quotaInfo: {
18088
- remainingFraction: 0.9531947,
18089
- resetTime: "2026-09-23T14:18:13Z"
18117
+ remainingFraction: 0.9556033,
18118
+ resetTime: "2026-09-24T13:08:46Z"
18090
18119
  },
18091
18120
  recommended: true,
18092
18121
  supportedMimeTypes: {
@@ -18175,7 +18204,7 @@ var models_default = {
18175
18204
  "include_subagent_snapshots": true,
18176
18205
  "include_artifact_snapshots": true,
18177
18206
  "retry_config": {
18178
- "max_retries": 0,
18207
+ "max_retries": 4,
18179
18208
  "initial_sleep_duration_ms": 1000,
18180
18209
  "exponential_multiplier": 2,
18181
18210
  "include_error_feedback": false
@@ -18196,8 +18225,8 @@ var models_default = {
18196
18225
  },
18197
18226
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18198
18227
  quotaInfo: {
18199
- remainingFraction: 0.9531947,
18200
- resetTime: "2026-09-23T14:18:13Z"
18228
+ remainingFraction: 0.9556033,
18229
+ resetTime: "2026-09-24T13:08:46Z"
18201
18230
  },
18202
18231
  recommended: true,
18203
18232
  supportedMimeTypes: {
@@ -18288,7 +18317,7 @@ var models_default = {
18288
18317
  "include_subagent_snapshots": true,
18289
18318
  "include_artifact_snapshots": true,
18290
18319
  "retry_config": {
18291
- "max_retries": 0,
18320
+ "max_retries": 4,
18292
18321
  "initial_sleep_duration_ms": 1000,
18293
18322
  "exponential_multiplier": 2,
18294
18323
  "include_error_feedback": false
@@ -18309,8 +18338,8 @@ var models_default = {
18309
18338
  },
18310
18339
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18311
18340
  quotaInfo: {
18312
- remainingFraction: 0.9531947,
18313
- resetTime: "2026-09-23T14:18:13Z"
18341
+ remainingFraction: 0.9556033,
18342
+ resetTime: "2026-09-24T13:08:46Z"
18314
18343
  },
18315
18344
  recommended: true,
18316
18345
  supportedMimeTypes: {
@@ -18401,7 +18430,7 @@ var models_default = {
18401
18430
  "include_subagent_snapshots": true,
18402
18431
  "include_artifact_snapshots": true,
18403
18432
  "retry_config": {
18404
- "max_retries": 0,
18433
+ "max_retries": 4,
18405
18434
  "initial_sleep_duration_ms": 1000,
18406
18435
  "exponential_multiplier": 2,
18407
18436
  "include_error_feedback": false
@@ -18422,8 +18451,8 @@ var models_default = {
18422
18451
  },
18423
18452
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18424
18453
  quotaInfo: {
18425
- remainingFraction: 0.9531947,
18426
- resetTime: "2026-09-23T14:18:13Z"
18454
+ remainingFraction: 0.9556033,
18455
+ resetTime: "2026-09-24T13:08:46Z"
18427
18456
  },
18428
18457
  recommended: true,
18429
18458
  supportedMimeTypes: {
@@ -18513,7 +18542,7 @@ var models_default = {
18513
18542
  "include_subagent_snapshots": true,
18514
18543
  "include_artifact_snapshots": true,
18515
18544
  "retry_config": {
18516
- "max_retries": 0,
18545
+ "max_retries": 4,
18517
18546
  "initial_sleep_duration_ms": 1000,
18518
18547
  "exponential_multiplier": 2,
18519
18548
  "include_error_feedback": false
@@ -18534,8 +18563,8 @@ var models_default = {
18534
18563
  },
18535
18564
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18536
18565
  quotaInfo: {
18537
- remainingFraction: 0.9531947,
18538
- resetTime: "2026-09-23T14:18:13Z"
18566
+ remainingFraction: 0.9556033,
18567
+ resetTime: "2026-09-24T13:08:46Z"
18539
18568
  },
18540
18569
  recommended: true,
18541
18570
  supportedMimeTypes: {
@@ -18624,8 +18653,8 @@ var models_default = {
18624
18653
  },
18625
18654
  modelProvider: "MODEL_PROVIDER_GOOGLE",
18626
18655
  quotaInfo: {
18627
- remainingFraction: 0.9531947,
18628
- resetTime: "2026-09-23T14:18:13Z"
18656
+ remainingFraction: 0.9556033,
18657
+ resetTime: "2026-09-24T13:08:46Z"
18629
18658
  },
18630
18659
  recommended: true,
18631
18660
  supportedMimeTypes: {
@@ -18702,7 +18731,7 @@ var models_default = {
18702
18731
  modelProvider: "MODEL_PROVIDER_OPENAI",
18703
18732
  quotaInfo: {
18704
18733
  remainingFraction: 1,
18705
- resetTime: "2026-09-23T14:29:32Z"
18734
+ resetTime: "2026-09-24T13:14:02Z"
18706
18735
  },
18707
18736
  recommended: true,
18708
18737
  supportsThinking: true,
@@ -19774,9 +19803,14 @@ function normalizeToolSchemaTypes(tools, toolMapper) {
19774
19803
  fn.name = toolMapper ? toolMapper.toGemini(fn.name) : sanitizeToolName(fn.name);
19775
19804
  }
19776
19805
  if (fn) {
19806
+ if (!fn.parameters) {
19807
+ fn.parameters = fn.parameters_json_schema ?? fn.parametersJsonSchema;
19808
+ }
19777
19809
  if (!fn.parameters) {
19778
19810
  fn.parameters = { type: "OBJECT", properties: {} };
19779
19811
  }
19812
+ delete fn.parameters_json_schema;
19813
+ delete fn.parametersJsonSchema;
19780
19814
  sanitizeSchema(fn.parameters);
19781
19815
  }
19782
19816
  }
@@ -20201,22 +20235,81 @@ var ChatLoggerImpl = class {
20201
20235
  }
20202
20236
  };
20203
20237
 
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.
20238
+ // src/plugin/headers.ts
20239
+ function getSafeHeader(headers, key) {
20240
+ if (!headers) {
20241
+ return void 0;
20242
+ }
20243
+ const targetKey = key.toLowerCase();
20244
+ if (typeof headers.get === "function") {
20245
+ try {
20246
+ return headers.get(targetKey) || void 0;
20247
+ } catch {
20248
+ }
20249
+ }
20250
+ if (Array.isArray(headers)) {
20251
+ const found = headers.find((item) => {
20252
+ if (Array.isArray(item) && typeof item[0] === "string") {
20253
+ return item[0].toLowerCase() === targetKey;
20254
+ }
20255
+ return false;
20256
+ });
20257
+ return found ? String(found[1]) : void 0;
20258
+ }
20259
+ if (typeof headers === "object") {
20260
+ const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
20261
+ return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
20262
+ }
20263
+ return void 0;
20264
+ }
20265
+ function setSafeHeaders(initHeaders, newHeaders) {
20266
+ if (typeof globalThis.Headers !== "undefined") {
20267
+ const headers = new globalThis.Headers(initHeaders ?? {});
20268
+ for (const [k, v] of Object.entries(newHeaders)) {
20269
+ headers.set(k, v);
20270
+ }
20271
+ return headers;
20272
+ }
20273
+ if (Array.isArray(initHeaders)) {
20274
+ const nextHeaders2 = [...initHeaders];
20275
+ for (const [k, v] of Object.entries(newHeaders)) {
20276
+ const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
20277
+ if (idx !== -1) {
20278
+ nextHeaders2[idx] = [k, v];
20279
+ } else {
20280
+ nextHeaders2.push([k, v]);
20281
+ }
20282
+ }
20283
+ return nextHeaders2;
20284
+ }
20285
+ const nextHeaders = {};
20286
+ if (initHeaders && typeof initHeaders === "object") {
20287
+ for (const [k, v] of Object.entries(initHeaders)) {
20288
+ nextHeaders[k] = String(v);
20289
+ }
20290
+ }
20291
+ for (const [k, v] of Object.entries(newHeaders)) {
20292
+ const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
20293
+ if (existingKey) {
20294
+ nextHeaders[existingKey] = v;
20295
+ } else {
20296
+ nextHeaders[k] = v;
20297
+ }
20298
+ }
20299
+ return nextHeaders;
20300
+ }
20301
+ function toUrlString(value) {
20302
+ if (typeof value === "string") {
20303
+ return value;
20304
+ }
20305
+ const candidate = value.url;
20306
+ if (candidate) {
20307
+ return candidate;
20308
+ }
20309
+ return value.toString();
20310
+ }
20213
20311
 
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;
20312
+ // src/plugin/tier.ts
20220
20313
  var STATIC_MODELS_SIMPLE = {
20221
20314
  "gemini-3.8-flash": {
20222
20315
  name: "Gemini 3.8 Flash",
@@ -20304,6 +20397,39 @@ var TIER_MAPPING = {
20304
20397
  high: "gemini-3.1-pro-high"
20305
20398
  }
20306
20399
  };
20400
+ function resolveModelTier(baseModelId, headersOrInit) {
20401
+ const parts = baseModelId.split("@");
20402
+ const base = parts[0] || "";
20403
+ const suffixTier = parts[1]?.toLowerCase();
20404
+ const mapping = TIER_MAPPING[base];
20405
+ if (!mapping) {
20406
+ return baseModelId;
20407
+ }
20408
+ const rawHeaders = headersOrInit && typeof headersOrInit === "object" && "headers" in headersOrInit ? headersOrInit.headers : headersOrInit;
20409
+ const headerTier = getSafeHeader(rawHeaders, "x-agy-tier")?.toLowerCase() || null;
20410
+ const requestedTier = headerTier || suffixTier;
20411
+ if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
20412
+ return mapping[requestedTier] || baseModelId;
20413
+ }
20414
+ return mapping["medium"] ?? mapping["high"] ?? baseModelId;
20415
+ }
20416
+
20417
+ // src/plugin.ts
20418
+ var AGY_QUOTA_COMMAND = "agyquota";
20419
+ var AGY_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
20420
+
20421
+ Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
20422
+ Do not call other tools.
20423
+ `;
20424
+ var AGY_QUOTA_SUMMARY_COMMAND = "agyquotasummary";
20425
+ 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.
20426
+
20427
+ Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
20428
+ Do not call other tools.
20429
+ `;
20430
+ var latestAgyAuthResolver;
20431
+ var latestAgyConfiguredProjectId;
20432
+ var latestAgyUserAgentModel;
20307
20433
  var buildModelFromSimple = (modelId, simple) => {
20308
20434
  const isClaude = modelId.startsWith("claude-");
20309
20435
  const isGpt = modelId.startsWith("gpt-");
@@ -20397,83 +20523,6 @@ var STATIC_MODELS = {};
20397
20523
  for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
20398
20524
  STATIC_MODELS[modelId] = buildModelFromSimple(modelId, simple);
20399
20525
  }
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
20526
  var AgyCLIOAuthPlugin = async ({ client }) => {
20478
20527
  let latestConfig;
20479
20528
  updateStaticModelsWithPricing(STATIC_MODELS);
@@ -20801,25 +20850,754 @@ async function ensureProjectContextOrThrow(authRecord, client, configuredProject
20801
20850
  throw error45;
20802
20851
  }
20803
20852
  }
20804
- function toUrlString(value) {
20805
- if (typeof value === "string") {
20806
- return value;
20853
+
20854
+ // src/plugin/types.ts
20855
+ function defineOpenCodeV2Plugin(def) {
20856
+ return def;
20857
+ }
20858
+
20859
+ // src/plugin/v2-storage.ts
20860
+ import { existsSync as existsSync6, mkdirSync as mkdirSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "fs";
20861
+ import { homedir as homedir4 } from "os";
20862
+ import { join as join6 } from "path";
20863
+ var storedAuthOverrideForTesting = void 0;
20864
+ function loadStoredAuthFromJson() {
20865
+ if (storedAuthOverrideForTesting !== void 0) {
20866
+ return storedAuthOverrideForTesting;
20867
+ }
20868
+ const authPath = join6(homedir4(), ".local", "share", "opencode", "auth.json");
20869
+ try {
20870
+ if (existsSync6(authPath)) {
20871
+ const content = readFileSync5(authPath, "utf8");
20872
+ const data = JSON.parse(content);
20873
+ return data?.[AGY_PROVIDER_ID];
20874
+ }
20875
+ } catch {
20807
20876
  }
20808
- const candidate = value.url;
20809
- if (candidate) {
20810
- return candidate;
20877
+ return void 0;
20878
+ }
20879
+ function saveStoredAuthToJson(authRecord) {
20880
+ if (process.env.NODE_ENV === "test" || process.env.VITEST || storedAuthOverrideForTesting !== void 0) {
20881
+ return;
20882
+ }
20883
+ try {
20884
+ const dirPath = join6(homedir4(), ".local", "share", "opencode");
20885
+ if (!existsSync6(dirPath)) {
20886
+ mkdirSync5(dirPath, { recursive: true });
20887
+ }
20888
+ const authPath = join6(dirPath, "auth.json");
20889
+ let data = {};
20890
+ if (existsSync6(authPath)) {
20891
+ try {
20892
+ data = JSON.parse(readFileSync5(authPath, "utf8")) || {};
20893
+ } catch {
20894
+ data = {};
20895
+ }
20896
+ }
20897
+ data[AGY_PROVIDER_ID] = {
20898
+ type: "oauth",
20899
+ refresh: authRecord.refresh,
20900
+ access: authRecord.access,
20901
+ expires: authRecord.expires
20902
+ };
20903
+ writeFileSync5(authPath, JSON.stringify(data, null, 2), "utf8");
20904
+ } catch {
20811
20905
  }
20812
- return value.toString();
20813
20906
  }
20814
20907
 
20908
+ // src/plugin/v2-fetch.ts
20909
+ function createV2FetchInterceptor(getAuthSnapshot) {
20910
+ return async function agyV2Fetch(input, init) {
20911
+ const isGL = isGenerativeLanguageRequest(input);
20912
+ const isInternal = toUrlString(input).includes("cloudcode-pa.googleapis.com");
20913
+ if (!isGL && !isInternal) {
20914
+ return (globalThis.fetch || fetch)(input, init);
20915
+ }
20916
+ let rawAuth = getAuthSnapshot ? await getAuthSnapshot() : void 0;
20917
+ if (!rawAuth) {
20918
+ rawAuth = loadStoredAuthFromJson();
20919
+ }
20920
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
20921
+ return (globalThis.fetch || fetch)(input, init);
20922
+ }
20923
+ let authRecord = resolveCachedAuth(rawAuth);
20924
+ if (accessTokenExpired(authRecord)) {
20925
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
20926
+ } } });
20927
+ if (refreshed) {
20928
+ authRecord = refreshed;
20929
+ }
20930
+ }
20931
+ if (!authRecord.access) {
20932
+ return (globalThis.fetch || fetch)(input, init);
20933
+ }
20934
+ if (isInternal) {
20935
+ const hasAuth = getSafeHeader(init?.headers, "Authorization") !== void 0;
20936
+ if (hasAuth) {
20937
+ return (globalThis.fetch || fetch)(input, init);
20938
+ }
20939
+ const userAgent = buildAgyCliUserAgent();
20940
+ const headers = setSafeHeaders(init?.headers, {
20941
+ Authorization: `Bearer ${authRecord.access}`,
20942
+ "User-Agent": userAgent
20943
+ });
20944
+ return (globalThis.fetch || fetch)(input, {
20945
+ ...init,
20946
+ headers
20947
+ });
20948
+ }
20949
+ const requestTarget = parseGenerativeLanguageRequest(input);
20950
+ const requestUserAgentModel = requestTarget?.effectiveModel;
20951
+ let projectContext;
20952
+ try {
20953
+ projectContext = await ensureProjectContext(
20954
+ authRecord,
20955
+ { auth: { set: async () => {
20956
+ } } },
20957
+ void 0,
20958
+ requestUserAgentModel
20959
+ );
20960
+ } catch {
20961
+ projectContext = {
20962
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
20963
+ auth: authRecord
20964
+ };
20965
+ }
20966
+ const originalRequestedModel = parseGenerativeLanguageRequest(input)?.effectiveModel;
20967
+ let modifiedInput = input;
20968
+ if (isGL && originalRequestedModel) {
20969
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
20970
+ const resolvedBase = resolveModelTier(originalBase, init);
20971
+ if (originalBase !== resolvedBase) {
20972
+ if (typeof modifiedInput === "string") {
20973
+ modifiedInput = modifiedInput.replace(`models/${originalBase}`, `models/${resolvedBase}`);
20974
+ } else if (typeof Request !== "undefined" && modifiedInput instanceof Request) {
20975
+ const newUrl = modifiedInput.url.replace(`models/${originalBase}`, `models/${resolvedBase}`);
20976
+ modifiedInput = new Request(newUrl, modifiedInput);
20977
+ }
20978
+ }
20979
+ }
20980
+ const transformed = prepareAgyRequest(
20981
+ modifiedInput,
20982
+ init,
20983
+ authRecord.access,
20984
+ projectContext.effectiveProjectId,
20985
+ void 0
20986
+ );
20987
+ const chatLogger = createChatLogger();
20988
+ if (chatLogger) {
20989
+ chatLogger.logRequest(
20990
+ toUrlString(transformed.request),
20991
+ transformed.init.method || "GET",
20992
+ transformed.init.headers,
20993
+ transformed.init.body
20994
+ );
20995
+ }
20996
+ const response = await fetchWithRetry(transformed.request, transformed.init);
20997
+ return transformAgyResponse(
20998
+ response,
20999
+ transformed.streaming,
21000
+ null,
21001
+ transformed.requestedModel,
21002
+ transformed.sessionId,
21003
+ chatLogger
21004
+ );
21005
+ };
21006
+ }
21007
+
21008
+ // src/plugin/v2-session.ts
21009
+ function createV2HttpRequestHook(state = {}) {
21010
+ return async (event) => {
21011
+ if (!event) return;
21012
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21013
+ const isGL = isGenerativeLanguageRequest(rawUrl);
21014
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21015
+ if (!isGL && !isInternal) {
21016
+ return;
21017
+ }
21018
+ event.headers = event.headers || {};
21019
+ let modelName;
21020
+ let rawAuth = event.auth;
21021
+ if (rawAuth && !rawAuth.type) {
21022
+ const tokenVal = rawAuth.access || rawAuth.token;
21023
+ if (tokenVal || rawAuth.refresh) {
21024
+ rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
21025
+ }
21026
+ }
21027
+ if (!rawAuth || !isOAuthAuth(rawAuth)) {
21028
+ rawAuth = loadStoredAuthFromJson();
21029
+ }
21030
+ let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
21031
+ if (authRecord && accessTokenExpired(authRecord)) {
21032
+ const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
21033
+ } } });
21034
+ if (refreshed) {
21035
+ authRecord = refreshed;
21036
+ saveStoredAuthToJson(refreshed);
21037
+ }
21038
+ }
21039
+ if (isGL) {
21040
+ const parsed = parseGenerativeLanguageRequest(rawUrl);
21041
+ modelName = parsed?.effectiveModel;
21042
+ if (modelName) {
21043
+ state.lastInterceptedModel = modelName;
21044
+ }
21045
+ if (typeof event.headers.delete === "function") {
21046
+ event.headers.delete("x-goog-api-key");
21047
+ event.headers.delete("api-key");
21048
+ } else {
21049
+ for (const key of Object.keys(event.headers)) {
21050
+ const lower = key.toLowerCase();
21051
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21052
+ delete event.headers[key];
21053
+ }
21054
+ }
21055
+ }
21056
+ if (event.request?.headers) {
21057
+ if (typeof event.request.headers.delete === "function") {
21058
+ event.request.headers.delete("x-goog-api-key");
21059
+ event.request.headers.delete("api-key");
21060
+ } else {
21061
+ for (const key of Object.keys(event.request.headers)) {
21062
+ const lower = key.toLowerCase();
21063
+ if (lower === "x-goog-api-key" || lower === "api-key") {
21064
+ delete event.request.headers[key];
21065
+ }
21066
+ }
21067
+ }
21068
+ }
21069
+ let cleanUrl = rawUrl;
21070
+ try {
21071
+ const parsedUrl = new URL(rawUrl);
21072
+ let urlChanged = false;
21073
+ for (const param of ["key", "x-goog-api-key", "api-key"]) {
21074
+ if (parsedUrl.searchParams.has(param)) {
21075
+ parsedUrl.searchParams.delete(param);
21076
+ urlChanged = true;
21077
+ }
21078
+ }
21079
+ if (urlChanged) {
21080
+ cleanUrl = parsedUrl.toString();
21081
+ }
21082
+ } catch {
21083
+ }
21084
+ if (authRecord && authRecord.access) {
21085
+ let projectContext;
21086
+ try {
21087
+ projectContext = await ensureProjectContext(
21088
+ authRecord,
21089
+ { auth: { set: async () => {
21090
+ } } },
21091
+ void 0,
21092
+ modelName
21093
+ );
21094
+ } catch {
21095
+ projectContext = {
21096
+ effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
21097
+ auth: authRecord
21098
+ };
21099
+ }
21100
+ const originalRequestedModel = modelName;
21101
+ let modifiedUrl = cleanUrl;
21102
+ if (originalRequestedModel) {
21103
+ const originalBase = originalRequestedModel.replace("google-agy/", "");
21104
+ const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
21105
+ const resolvedBase = resolveModelTier(originalBase, { headers: initHeaders });
21106
+ if (originalBase !== resolvedBase) {
21107
+ modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
21108
+ }
21109
+ }
21110
+ let bodyPayload = event.body;
21111
+ if (bodyPayload === void 0 && event.request) {
21112
+ if (typeof event.request.clone === "function") {
21113
+ try {
21114
+ bodyPayload = await event.request.clone().text();
21115
+ } catch {
21116
+ }
21117
+ } else if (event.request.body !== void 0) {
21118
+ bodyPayload = event.request.body;
21119
+ }
21120
+ }
21121
+ let preExistingUserAgent;
21122
+ if (typeof event.headers?.get === "function") {
21123
+ preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
21124
+ } else if (event.headers && typeof event.headers === "object") {
21125
+ preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
21126
+ }
21127
+ if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
21128
+ preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
21129
+ } else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
21130
+ preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
21131
+ }
21132
+ const method = event.method || event.request?.method || "POST";
21133
+ const requestHeaders = event.headers || event.request?.headers;
21134
+ const transformed = prepareAgyRequest(
21135
+ modifiedUrl,
21136
+ {
21137
+ method,
21138
+ headers: requestHeaders,
21139
+ body: bodyPayload
21140
+ },
21141
+ authRecord.access,
21142
+ projectContext.effectiveProjectId
21143
+ );
21144
+ const targetUrl = toUrlString(transformed.request);
21145
+ if (typeof event.url === "string") {
21146
+ event.url = targetUrl;
21147
+ }
21148
+ if (event.request && typeof event.request === "object") {
21149
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21150
+ event.request = new Request(targetUrl, {
21151
+ method: transformed.init.method,
21152
+ headers: transformed.init.headers,
21153
+ body: transformed.init.body
21154
+ });
21155
+ } else if (typeof event.request.url === "string") {
21156
+ try {
21157
+ event.request.url = targetUrl;
21158
+ } catch {
21159
+ }
21160
+ }
21161
+ }
21162
+ const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
21163
+ for (const [k, v] of headerEntries) {
21164
+ const lowerK = k.toLowerCase();
21165
+ if (lowerK === "user-agent") {
21166
+ if (preExistingUserAgent) {
21167
+ continue;
21168
+ }
21169
+ if (typeof event.headers?.set === "function") {
21170
+ event.headers.set("User-Agent", v);
21171
+ } else if (event.headers) {
21172
+ event.headers["User-Agent"] = v;
21173
+ }
21174
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21175
+ event.request.headers.set("User-Agent", v);
21176
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21177
+ event.request.headers["User-Agent"] = v;
21178
+ }
21179
+ continue;
21180
+ }
21181
+ if (typeof event.headers?.set === "function") {
21182
+ event.headers.set(k, v);
21183
+ } else if (event.headers) {
21184
+ event.headers[k] = v;
21185
+ }
21186
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21187
+ event.request.headers.set(k, v);
21188
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21189
+ event.request.headers[k] = v;
21190
+ }
21191
+ }
21192
+ if (transformed.init.body !== void 0) {
21193
+ event.body = transformed.init.body;
21194
+ if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
21195
+ event.request.body = transformed.init.body;
21196
+ }
21197
+ }
21198
+ } else {
21199
+ if (typeof event.url === "string") {
21200
+ event.url = cleanUrl;
21201
+ }
21202
+ if (event.request && typeof event.request === "object") {
21203
+ if (typeof Request !== "undefined" && event.request instanceof Request) {
21204
+ event.request = new Request(cleanUrl, event.request);
21205
+ } else if (typeof event.request.url === "string") {
21206
+ try {
21207
+ event.request.url = cleanUrl;
21208
+ } catch {
21209
+ }
21210
+ }
21211
+ }
21212
+ }
21213
+ }
21214
+ if (authRecord && authRecord.access) {
21215
+ if (typeof event.headers?.set === "function") {
21216
+ event.headers.set("Authorization", `Bearer ${authRecord.access}`);
21217
+ } else if (event.headers) {
21218
+ event.headers["Authorization"] = `Bearer ${authRecord.access}`;
21219
+ }
21220
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21221
+ event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
21222
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21223
+ event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
21224
+ }
21225
+ }
21226
+ const userAgent = buildAgyCliUserAgent(modelName);
21227
+ if (typeof event.headers?.set === "function") {
21228
+ if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
21229
+ event.headers.set("User-Agent", userAgent);
21230
+ }
21231
+ } else if (event.headers) {
21232
+ if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
21233
+ event.headers["User-Agent"] = userAgent;
21234
+ }
21235
+ }
21236
+ if (event.request?.headers && typeof event.request.headers.set === "function") {
21237
+ if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
21238
+ event.request.headers.set("User-Agent", userAgent);
21239
+ }
21240
+ } else if (event.request?.headers && typeof event.request.headers === "object") {
21241
+ if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
21242
+ event.request.headers["User-Agent"] = userAgent;
21243
+ }
21244
+ }
21245
+ };
21246
+ }
21247
+ function createV2HttpResponseHook(state = {}) {
21248
+ return async (event) => {
21249
+ if (!event || !event.response) return;
21250
+ const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
21251
+ const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
21252
+ if (isInternal && event.response instanceof Response) {
21253
+ const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
21254
+ const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || state.lastInterceptedModel;
21255
+ const transformed = await transformAgyResponse(
21256
+ event.response,
21257
+ !!isStreaming,
21258
+ null,
21259
+ parsedModel,
21260
+ void 0,
21261
+ void 0
21262
+ );
21263
+ event.response = transformed;
21264
+ }
21265
+ };
21266
+ }
21267
+ function createV2RetryHook() {
21268
+ return async (event) => {
21269
+ if (!event) return;
21270
+ const response = event.response;
21271
+ if (response instanceof Response) {
21272
+ if (response.status === 429 || response.status === 503) {
21273
+ const quota = await classifyQuotaResponse(response);
21274
+ if (quota?.retryDelayMs) {
21275
+ event.retryDelayMs = quota.retryDelayMs;
21276
+ } else {
21277
+ event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
21278
+ }
21279
+ }
21280
+ } else if (event.details && Array.isArray(event.details)) {
21281
+ const retryInfo = event.details.find(
21282
+ (d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
21283
+ );
21284
+ if (retryInfo?.retryDelay) {
21285
+ const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
21286
+ if (delayMs !== null) {
21287
+ event.retryDelayMs = delayMs;
21288
+ }
21289
+ }
21290
+ }
21291
+ };
21292
+ }
21293
+ function registerV2SessionHooks(ctx) {
21294
+ const state = {};
21295
+ ctx.session.hook("http.request", createV2HttpRequestHook(state), { providerID: AGY_PROVIDER_ID });
21296
+ ctx.session.hook("http.response", createV2HttpResponseHook(state), { providerID: AGY_PROVIDER_ID });
21297
+ ctx.session.hook("retry", createV2RetryHook(), { providerID: AGY_PROVIDER_ID });
21298
+ }
21299
+
21300
+ // src/plugin/v2.ts
21301
+ async function setupOpenCodeV2(ctx) {
21302
+ const resolveVariants = (modelId) => {
21303
+ const mapping = TIER_MAPPING[modelId];
21304
+ if (!mapping) return void 0;
21305
+ const variants = [];
21306
+ if (mapping.minimal !== void 0) variants.push({ id: "minimal" });
21307
+ if (mapping.low !== void 0) variants.push({ id: "low" });
21308
+ if (mapping.medium !== void 0) variants.push({ id: "medium" });
21309
+ if (mapping.high !== void 0) variants.push({ id: "high" });
21310
+ return variants.length > 0 ? variants : void 0;
21311
+ };
21312
+ const updateProviderRecord = (p) => {
21313
+ p.name = "Antigravity CLI";
21314
+ p.activation = "enabled";
21315
+ p.package = "aisdk:@ai-sdk/google";
21316
+ p.description = "Google Gemini Antigravity Code Assist OAuth provider";
21317
+ p.settings = { ...p.settings || {}, apiKey: "dummy" };
21318
+ p.integrationID = AGY_PROVIDER_ID;
21319
+ };
21320
+ const buildModelRecord = (modelId, simple, existingModel) => {
21321
+ const isClaude = modelId.startsWith("claude-");
21322
+ const isGpt = modelId.startsWith("gpt-");
21323
+ const variants = resolveVariants(modelId);
21324
+ return {
21325
+ id: modelId,
21326
+ providerID: AGY_PROVIDER_ID,
21327
+ name: simple.name,
21328
+ description: simple.description,
21329
+ family: modelId.includes("gemini") ? "gemini" : isClaude ? "claude" : isGpt ? "gpt" : "unknown",
21330
+ reasoning: simple.reasoning,
21331
+ attachment: simple.attachment,
21332
+ tool_call: simple.toolCall,
21333
+ limit: {
21334
+ context: simple.maxTokens,
21335
+ output: simple.maxOutputTokens
21336
+ },
21337
+ cost: simple.cost || { input: 0, output: 0 },
21338
+ ...variants ? { variants } : {},
21339
+ ...existingModel || {}
21340
+ };
21341
+ };
21342
+ const updateModelRecord = (m, modelId, simple) => {
21343
+ m.name = simple.name;
21344
+ m.capabilities = {
21345
+ tools: true,
21346
+ input: ["text", "image"],
21347
+ output: ["text"]
21348
+ };
21349
+ m.limit = {
21350
+ context: simple.maxTokens,
21351
+ output: simple.maxOutputTokens
21352
+ };
21353
+ m.family = "gemini";
21354
+ if (simple.cost) {
21355
+ m.cost = simple.cost;
21356
+ }
21357
+ const variants = resolveVariants(modelId);
21358
+ if (variants) {
21359
+ m.variants = variants;
21360
+ }
21361
+ };
21362
+ if (ctx.provider?.transform) {
21363
+ ctx.provider.transform(async (editor) => {
21364
+ if (!editor) return;
21365
+ if (typeof editor.update === "function") {
21366
+ editor.update(AGY_PROVIDER_ID, updateProviderRecord);
21367
+ } else if (typeof editor.set === "function") {
21368
+ const p = { id: AGY_PROVIDER_ID };
21369
+ updateProviderRecord(p);
21370
+ editor.set(AGY_PROVIDER_ID, p);
21371
+ } else if (typeof editor === "object") {
21372
+ const p = editor[AGY_PROVIDER_ID] || { id: AGY_PROVIDER_ID };
21373
+ updateProviderRecord(p);
21374
+ editor[AGY_PROVIDER_ID] = p;
21375
+ }
21376
+ });
21377
+ }
21378
+ if (ctx.model?.transform) {
21379
+ ctx.model.transform(async (editor) => {
21380
+ if (!editor) return;
21381
+ if (typeof editor.update === "function") {
21382
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21383
+ editor.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21384
+ }
21385
+ } else if (typeof editor.set === "function") {
21386
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21387
+ const m = buildModelRecord(modelId, simple);
21388
+ editor.set(`${AGY_PROVIDER_ID}:${modelId}`, m);
21389
+ }
21390
+ } else if (typeof editor === "object") {
21391
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21392
+ const key = `${AGY_PROVIDER_ID}:${modelId}`;
21393
+ editor[key] = buildModelRecord(modelId, simple, editor[key]);
21394
+ }
21395
+ }
21396
+ });
21397
+ }
21398
+ if (ctx.catalog?.transform) {
21399
+ ctx.catalog.transform(async (editor) => {
21400
+ if (!editor) return;
21401
+ if (typeof editor?.provider?.update === "function") {
21402
+ editor.provider.update(AGY_PROVIDER_ID, updateProviderRecord);
21403
+ if (typeof editor?.model?.update === "function") {
21404
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21405
+ editor.model.update(AGY_PROVIDER_ID, modelId, (m) => updateModelRecord(m, modelId, simple));
21406
+ }
21407
+ }
21408
+ return;
21409
+ }
21410
+ const catalog = editor;
21411
+ catalog.providers = catalog.providers || {};
21412
+ catalog.providers[AGY_PROVIDER_ID] = {
21413
+ id: AGY_PROVIDER_ID,
21414
+ name: "Antigravity CLI",
21415
+ npm: "aisdk:@ai-sdk/google",
21416
+ settings: { apiKey: "dummy" },
21417
+ integrationID: AGY_PROVIDER_ID,
21418
+ models: { ...catalog.providers[AGY_PROVIDER_ID]?.models || {} },
21419
+ ...catalog.providers[AGY_PROVIDER_ID]
21420
+ };
21421
+ if (catalog.providers[AGY_PROVIDER_ID].settings) {
21422
+ catalog.providers[AGY_PROVIDER_ID].settings = {
21423
+ ...catalog.providers[AGY_PROVIDER_ID].settings,
21424
+ apiKey: "dummy"
21425
+ };
21426
+ } else {
21427
+ catalog.providers[AGY_PROVIDER_ID].settings = { apiKey: "dummy" };
21428
+ }
21429
+ catalog.providers[AGY_PROVIDER_ID].integrationID = AGY_PROVIDER_ID;
21430
+ const targetModels = catalog.providers[AGY_PROVIDER_ID].models;
21431
+ for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
21432
+ targetModels[modelId] = buildModelRecord(modelId, simple, targetModels[modelId]);
21433
+ }
21434
+ });
21435
+ }
21436
+ ctx.tool.transform(async (editor) => {
21437
+ if (!editor) return;
21438
+ const quotaTool = createAgyQuotaTool({
21439
+ client: void 0,
21440
+ getAuthResolver: () => void 0,
21441
+ getConfiguredProjectId: () => void 0,
21442
+ getUserAgentModel: () => void 0
21443
+ });
21444
+ const quotaSummaryTool = createAgyQuotaSummaryTool({
21445
+ client: void 0,
21446
+ getAuthResolver: () => void 0,
21447
+ getConfiguredProjectId: () => void 0,
21448
+ getUserAgentModel: () => void 0
21449
+ });
21450
+ if (typeof editor.add === "function") {
21451
+ editor.add({
21452
+ name: AGY_QUOTA_TOOL_NAME,
21453
+ description: quotaTool.description,
21454
+ input: {},
21455
+ execute: async (args, context) => quotaTool.execute(args, context)
21456
+ });
21457
+ editor.add({
21458
+ name: AGY_QUOTA_SUMMARY_TOOL_NAME,
21459
+ description: quotaSummaryTool.description,
21460
+ input: {},
21461
+ execute: async (args, context) => quotaSummaryTool.execute(args, context)
21462
+ });
21463
+ } else if (typeof editor.set === "function") {
21464
+ editor.set(AGY_QUOTA_TOOL_NAME, quotaTool);
21465
+ editor.set(AGY_QUOTA_SUMMARY_TOOL_NAME, quotaSummaryTool);
21466
+ } else if (editor.tools && typeof editor.tools === "object") {
21467
+ editor.tools[AGY_QUOTA_TOOL_NAME] = quotaTool;
21468
+ editor.tools[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21469
+ } else if (typeof editor === "object") {
21470
+ editor[AGY_QUOTA_TOOL_NAME] = quotaTool;
21471
+ editor[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
21472
+ }
21473
+ });
21474
+ ctx.command.transform(async (editor) => {
21475
+ if (!editor) return;
21476
+ const commands = {
21477
+ [AGY_V2_QUOTA_COMMAND]: {
21478
+ description: "Show Agy Code Assist quota usage",
21479
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21480
+ },
21481
+ [AGY_V2_QUOTA_SUMMARY_COMMAND]: {
21482
+ description: "Show Agy Code Assist quota summary with weekly and 5-hour limits",
21483
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21484
+ }
21485
+ };
21486
+ if (typeof editor.add === "function") {
21487
+ editor.add({
21488
+ name: AGY_V2_QUOTA_COMMAND,
21489
+ description: "Display current Antigravity quota usage",
21490
+ template: AGY_V2_QUOTA_COMMAND_TEMPLATE
21491
+ });
21492
+ editor.add({
21493
+ name: AGY_V2_QUOTA_SUMMARY_COMMAND,
21494
+ description: "Display Antigravity quota summary grouped by model family",
21495
+ template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
21496
+ });
21497
+ } else if (typeof editor.set === "function") {
21498
+ editor.set(AGY_V2_QUOTA_COMMAND, commands[AGY_V2_QUOTA_COMMAND]);
21499
+ editor.set(AGY_V2_QUOTA_SUMMARY_COMMAND, commands[AGY_V2_QUOTA_SUMMARY_COMMAND]);
21500
+ } else if (editor.commands && typeof editor.commands === "object") {
21501
+ editor.commands[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21502
+ editor.commands[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21503
+ } else if (typeof editor === "object") {
21504
+ editor[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
21505
+ editor[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
21506
+ }
21507
+ });
21508
+ ctx.integration?.transform?.((editor) => {
21509
+ if (!editor) return;
21510
+ editor.update?.(AGY_PROVIDER_ID, (integration) => {
21511
+ integration.name = "Antigravity CLI (plugin)";
21512
+ });
21513
+ editor.method?.update?.({
21514
+ integrationID: AGY_PROVIDER_ID,
21515
+ method: {
21516
+ id: "oauth",
21517
+ type: "oauth",
21518
+ label: "Antigravity CLI (OAuth)"
21519
+ },
21520
+ authorize: async () => {
21521
+ const authorization = await authorizeAgy();
21522
+ return {
21523
+ mode: "code",
21524
+ url: authorization.url,
21525
+ instructions: "Please complete Google account authorization in your browser. After authorization, copy the full redirect URL or code and paste it below:",
21526
+ callback: async (code) => {
21527
+ const trimmed = code.trim();
21528
+ const parsed = parseOAuthCallbackInput(trimmed);
21529
+ const authCode = parsed.code || trimmed;
21530
+ if (!authCode) {
21531
+ return { type: "failed", error: "Missing authorization code in callback input" };
21532
+ }
21533
+ if (parsed.state && parsed.state !== authorization.state) {
21534
+ return { type: "failed", error: "State mismatch in callback input (possible CSRF attempt)" };
21535
+ }
21536
+ const exchangeResult = await exchangeAgyWithVerifier(authCode, authorization.verifier);
21537
+ if (exchangeResult.type !== "success") {
21538
+ return exchangeResult;
21539
+ }
21540
+ const initialRefresh = formatRefreshParts({
21541
+ refreshToken: exchangeResult.refresh
21542
+ });
21543
+ let authRecord = {
21544
+ type: "oauth",
21545
+ refresh: initialRefresh,
21546
+ access: exchangeResult.access,
21547
+ expires: exchangeResult.expires
21548
+ };
21549
+ try {
21550
+ const projectContext = await ensureProjectContext(
21551
+ authRecord,
21552
+ { auth: { set: async () => {
21553
+ } } }
21554
+ );
21555
+ authRecord = {
21556
+ ...authRecord,
21557
+ refresh: projectContext.auth.refresh
21558
+ };
21559
+ } catch {
21560
+ }
21561
+ saveStoredAuthToJson(authRecord);
21562
+ return {
21563
+ type: "oauth",
21564
+ methodID: "oauth",
21565
+ refresh: authRecord.refresh,
21566
+ access: authRecord.access,
21567
+ expires: authRecord.expires
21568
+ };
21569
+ }
21570
+ };
21571
+ }
21572
+ });
21573
+ });
21574
+ ctx.aisdk?.hook("sdk", async (event) => {
21575
+ if (!event) return;
21576
+ const isMatchingProvider = event.providerID === AGY_PROVIDER_ID || event.model?.providerID === AGY_PROVIDER_ID;
21577
+ if (!isMatchingProvider) return;
21578
+ event.options = event.options || {};
21579
+ event.options.apiKey = "dummy";
21580
+ event.options.fetch = createV2FetchInterceptor();
21581
+ });
21582
+ registerV2SessionHooks(ctx);
21583
+ }
21584
+ var v2PluginDefinition = defineOpenCodeV2Plugin({
21585
+ id: AGY_PROVIDER_ID,
21586
+ setup: setupOpenCodeV2
21587
+ });
21588
+
20815
21589
  // index.ts
20816
- var index_default = {
20817
- id: "@anthonyhaussman/opencode-agy-auth",
21590
+ var dualPlugin = {
21591
+ ...v2PluginDefinition,
20818
21592
  server: AgyCLIOAuthPlugin
20819
21593
  };
21594
+ var index_default = dualPlugin;
20820
21595
  export {
20821
21596
  AgyCLIOAuthPlugin,
20822
21597
  GoogleOAuthPlugin,
20823
- index_default as default
21598
+ index_default as default,
21599
+ defineOpenCodeV2Plugin,
21600
+ setupOpenCodeV2,
21601
+ v2PluginDefinition
20824
21602
  };
20825
21603
  //# sourceMappingURL=index.js.map