@anthonyhaussman/opencode-agy-auth 1.2.17 → 1.3.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/README.md +13 -7
- package/dist/index.d.ts +6 -5
- package/dist/index.js +994 -170
- package/dist/index.js.map +1 -1
- package/dist/src/constants.d.ts +2 -0
- package/dist/src/plugin/headers.d.ts +7 -0
- package/dist/src/plugin/oauth-authorize.d.ts +9 -0
- package/dist/src/plugin/quota-summary.d.ts +2 -0
- package/dist/src/plugin/quota.d.ts +2 -0
- package/dist/src/plugin/tier.d.ts +28 -0
- package/dist/src/plugin/types.d.ts +35 -0
- package/dist/src/plugin/v2-fetch.d.ts +1 -0
- package/dist/src/plugin/v2-session.d.ts +7 -0
- package/dist/src/plugin/v2-storage.d.ts +3 -0
- package/dist/src/plugin/v2.d.ts +14 -0
- package/dist/src/plugin.d.ts +2 -0
- package/dist/src/sdk/agy-cli-version.d.ts +1 -1
- package/package.json +3 -3
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
16378
|
-
resetTime: "2026-10-
|
|
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.
|
|
16461
|
-
resetTime: "2026-10-
|
|
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.
|
|
16544
|
-
resetTime: "2026-10-
|
|
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.
|
|
16624
|
-
resetTime: "2026-10-
|
|
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.
|
|
16705
|
-
resetTime: "2026-10-
|
|
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.
|
|
16810
|
-
resetTime: "2026-10-
|
|
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.
|
|
16878
|
-
resetTime: "2026-10-
|
|
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.
|
|
16897
|
-
resetTime: "2026-10-
|
|
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.
|
|
16929
|
-
resetTime: "2026-10-
|
|
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.
|
|
17020
|
-
resetTime: "2026-10-
|
|
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.
|
|
17125
|
-
resetTime: "2026-10-
|
|
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.
|
|
17206
|
-
resetTime: "2026-10-
|
|
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.
|
|
17313
|
-
resetTime: "2026-10-
|
|
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.
|
|
17430
|
-
resetTime: "2026-10-
|
|
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.
|
|
17547
|
-
resetTime: "2026-10-
|
|
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.
|
|
17664
|
-
resetTime: "2026-10-
|
|
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.
|
|
17780
|
-
resetTime: "2026-10-
|
|
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.
|
|
17891
|
-
resetTime: "2026-10-
|
|
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.
|
|
18002
|
-
resetTime: "2026-10-
|
|
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.
|
|
18113
|
-
resetTime: "2026-10-
|
|
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.
|
|
18223
|
-
resetTime: "2026-10-
|
|
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.
|
|
18334
|
-
resetTime: "2026-10-
|
|
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.
|
|
18445
|
-
resetTime: "2026-10-
|
|
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.
|
|
18556
|
-
resetTime: "2026-10-
|
|
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.
|
|
18666
|
-
resetTime: "2026-10-
|
|
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.
|
|
18756
|
-
resetTime: "2026-10-
|
|
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-
|
|
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
|
-
|
|
20366
|
-
|
|
20367
|
-
|
|
20368
|
-
|
|
20369
|
-
|
|
20370
|
-
|
|
20371
|
-
|
|
20372
|
-
|
|
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
|
-
|
|
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
|
-
|
|
20975
|
-
|
|
20976
|
-
|
|
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
|
-
|
|
20979
|
-
|
|
20980
|
-
|
|
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
|
-
|
|
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
|
|
20987
|
-
|
|
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
|