@anthonyhaussman/opencode-agy-auth 1.2.3 → 1.2.5-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +867 -65
- package/dist/index.js.map +1 -1
- package/dist/src/constants.d.ts +2 -0
- package/dist/src/plugin/oauth-authorize.d.ts +9 -0
- package/dist/src/plugin/types.d.ts +33 -0
- package/dist/src/plugin/v2.d.ts +22 -0
- package/dist/src/plugin.d.ts +23 -0
- package/dist/src/sdk/agy-cli-version.d.ts +1 -1
- package/package.json +4 -4
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.
|
|
271
|
+
var AGY_CLI_VERSION = "1.2.4";
|
|
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
|
}
|
|
@@ -16147,7 +16164,7 @@ var models_default = {
|
|
|
16147
16164
|
modelProvider: "MODEL_PROVIDER_ANTHROPIC",
|
|
16148
16165
|
quotaInfo: {
|
|
16149
16166
|
remainingFraction: 1,
|
|
16150
|
-
resetTime: "2026-09-
|
|
16167
|
+
resetTime: "2026-09-16T09:06:33Z"
|
|
16151
16168
|
},
|
|
16152
16169
|
recommended: true,
|
|
16153
16170
|
supportedMimeTypes: {
|
|
@@ -16186,7 +16203,7 @@ var models_default = {
|
|
|
16186
16203
|
modelProvider: "MODEL_PROVIDER_ANTHROPIC",
|
|
16187
16204
|
quotaInfo: {
|
|
16188
16205
|
remainingFraction: 1,
|
|
16189
|
-
resetTime: "2026-09-
|
|
16206
|
+
resetTime: "2026-09-16T09:06:33Z"
|
|
16190
16207
|
},
|
|
16191
16208
|
recommended: true,
|
|
16192
16209
|
supportedMimeTypes: {
|
|
@@ -16222,8 +16239,8 @@ var models_default = {
|
|
|
16222
16239
|
},
|
|
16223
16240
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16224
16241
|
quotaInfo: {
|
|
16225
|
-
remainingFraction: 0.
|
|
16226
|
-
resetTime: "2026-09-
|
|
16242
|
+
remainingFraction: 0.9615639,
|
|
16243
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16227
16244
|
},
|
|
16228
16245
|
recommended: true,
|
|
16229
16246
|
supportedMimeTypes: {
|
|
@@ -16299,8 +16316,8 @@ var models_default = {
|
|
|
16299
16316
|
},
|
|
16300
16317
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16301
16318
|
quotaInfo: {
|
|
16302
|
-
remainingFraction: 0.
|
|
16303
|
-
resetTime: "2026-09-
|
|
16319
|
+
remainingFraction: 0.9615639,
|
|
16320
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16304
16321
|
},
|
|
16305
16322
|
recommended: true,
|
|
16306
16323
|
supportedMimeTypes: {
|
|
@@ -16376,8 +16393,8 @@ var models_default = {
|
|
|
16376
16393
|
},
|
|
16377
16394
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16378
16395
|
quotaInfo: {
|
|
16379
|
-
remainingFraction: 0.
|
|
16380
|
-
resetTime: "2026-09-
|
|
16396
|
+
remainingFraction: 0.9615639,
|
|
16397
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16381
16398
|
},
|
|
16382
16399
|
recommended: true,
|
|
16383
16400
|
supportedMimeTypes: {
|
|
@@ -16450,8 +16467,8 @@ var models_default = {
|
|
|
16450
16467
|
},
|
|
16451
16468
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16452
16469
|
quotaInfo: {
|
|
16453
|
-
remainingFraction: 0.
|
|
16454
|
-
resetTime: "2026-09-
|
|
16470
|
+
remainingFraction: 0.9615639,
|
|
16471
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16455
16472
|
},
|
|
16456
16473
|
recommended: true,
|
|
16457
16474
|
requiresImageOutputOutsideFunctionResponses: true,
|
|
@@ -16525,8 +16542,8 @@ var models_default = {
|
|
|
16525
16542
|
},
|
|
16526
16543
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16527
16544
|
quotaInfo: {
|
|
16528
|
-
remainingFraction: 0.
|
|
16529
|
-
resetTime: "2026-09-
|
|
16545
|
+
remainingFraction: 0.9615639,
|
|
16546
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16530
16547
|
},
|
|
16531
16548
|
recommended: true,
|
|
16532
16549
|
supportedMimeTypes: {
|
|
@@ -16624,8 +16641,8 @@ var models_default = {
|
|
|
16624
16641
|
},
|
|
16625
16642
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16626
16643
|
quotaInfo: {
|
|
16627
|
-
remainingFraction: 0.
|
|
16628
|
-
resetTime: "2026-09-
|
|
16644
|
+
remainingFraction: 0.9615639,
|
|
16645
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16629
16646
|
},
|
|
16630
16647
|
recommended: true,
|
|
16631
16648
|
supportedMimeTypes: {
|
|
@@ -16688,8 +16705,8 @@ var models_default = {
|
|
|
16688
16705
|
model: "MODEL_PLACEHOLDER_M21",
|
|
16689
16706
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16690
16707
|
quotaInfo: {
|
|
16691
|
-
remainingFraction: 0.
|
|
16692
|
-
resetTime: "2026-09-
|
|
16708
|
+
remainingFraction: 0.9615639,
|
|
16709
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16693
16710
|
}
|
|
16694
16711
|
},
|
|
16695
16712
|
"gemini-3.1-flash-lite": {
|
|
@@ -16707,8 +16724,8 @@ var models_default = {
|
|
|
16707
16724
|
},
|
|
16708
16725
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16709
16726
|
quotaInfo: {
|
|
16710
|
-
remainingFraction: 0.
|
|
16711
|
-
resetTime: "2026-09-
|
|
16727
|
+
remainingFraction: 0.9615639,
|
|
16728
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16712
16729
|
}
|
|
16713
16730
|
},
|
|
16714
16731
|
"gemini-3.1-pro-high": {
|
|
@@ -16739,8 +16756,8 @@ var models_default = {
|
|
|
16739
16756
|
},
|
|
16740
16757
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16741
16758
|
quotaInfo: {
|
|
16742
|
-
remainingFraction: 0.
|
|
16743
|
-
resetTime: "2026-09-
|
|
16759
|
+
remainingFraction: 0.9615639,
|
|
16760
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16744
16761
|
},
|
|
16745
16762
|
recommended: true,
|
|
16746
16763
|
supportedMimeTypes: {
|
|
@@ -16824,8 +16841,8 @@ var models_default = {
|
|
|
16824
16841
|
},
|
|
16825
16842
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16826
16843
|
quotaInfo: {
|
|
16827
|
-
remainingFraction: 0.
|
|
16828
|
-
resetTime: "2026-09-
|
|
16844
|
+
remainingFraction: 0.9615639,
|
|
16845
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16829
16846
|
},
|
|
16830
16847
|
recommended: true,
|
|
16831
16848
|
supportedMimeTypes: {
|
|
@@ -16923,8 +16940,8 @@ var models_default = {
|
|
|
16923
16940
|
},
|
|
16924
16941
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
16925
16942
|
quotaInfo: {
|
|
16926
|
-
remainingFraction: 0.
|
|
16927
|
-
resetTime: "2026-09-
|
|
16943
|
+
remainingFraction: 0.9615639,
|
|
16944
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
16928
16945
|
},
|
|
16929
16946
|
recommended: true,
|
|
16930
16947
|
supportedMimeTypes: {
|
|
@@ -17000,8 +17017,8 @@ var models_default = {
|
|
|
17000
17017
|
},
|
|
17001
17018
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17002
17019
|
quotaInfo: {
|
|
17003
|
-
remainingFraction: 0.
|
|
17004
|
-
resetTime: "2026-09-
|
|
17020
|
+
remainingFraction: 0.9615639,
|
|
17021
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17005
17022
|
},
|
|
17006
17023
|
recommended: true,
|
|
17007
17024
|
supportedMimeTypes: {
|
|
@@ -17101,8 +17118,8 @@ var models_default = {
|
|
|
17101
17118
|
},
|
|
17102
17119
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17103
17120
|
quotaInfo: {
|
|
17104
|
-
remainingFraction: 0.
|
|
17105
|
-
resetTime: "2026-09-
|
|
17121
|
+
remainingFraction: 0.9615639,
|
|
17122
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17106
17123
|
},
|
|
17107
17124
|
recommended: true,
|
|
17108
17125
|
supportedMimeTypes: {
|
|
@@ -17214,8 +17231,8 @@ var models_default = {
|
|
|
17214
17231
|
},
|
|
17215
17232
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17216
17233
|
quotaInfo: {
|
|
17217
|
-
remainingFraction: 0.
|
|
17218
|
-
resetTime: "2026-09-
|
|
17234
|
+
remainingFraction: 0.9615639,
|
|
17235
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17219
17236
|
},
|
|
17220
17237
|
recommended: true,
|
|
17221
17238
|
supportedMimeTypes: {
|
|
@@ -17327,8 +17344,8 @@ var models_default = {
|
|
|
17327
17344
|
},
|
|
17328
17345
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17329
17346
|
quotaInfo: {
|
|
17330
|
-
remainingFraction: 0.
|
|
17331
|
-
resetTime: "2026-09-
|
|
17347
|
+
remainingFraction: 0.9615639,
|
|
17348
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17332
17349
|
},
|
|
17333
17350
|
recommended: true,
|
|
17334
17351
|
supportedMimeTypes: {
|
|
@@ -17440,8 +17457,8 @@ var models_default = {
|
|
|
17440
17457
|
},
|
|
17441
17458
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17442
17459
|
quotaInfo: {
|
|
17443
|
-
remainingFraction: 0.
|
|
17444
|
-
resetTime: "2026-09-
|
|
17460
|
+
remainingFraction: 0.9615639,
|
|
17461
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17445
17462
|
},
|
|
17446
17463
|
recommended: true,
|
|
17447
17464
|
supportedMimeTypes: {
|
|
@@ -17552,8 +17569,8 @@ var models_default = {
|
|
|
17552
17569
|
},
|
|
17553
17570
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17554
17571
|
quotaInfo: {
|
|
17555
|
-
remainingFraction: 0.
|
|
17556
|
-
resetTime: "2026-09-
|
|
17572
|
+
remainingFraction: 0.9615639,
|
|
17573
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17557
17574
|
},
|
|
17558
17575
|
recommended: true,
|
|
17559
17576
|
supportedMimeTypes: {
|
|
@@ -17657,8 +17674,8 @@ var models_default = {
|
|
|
17657
17674
|
},
|
|
17658
17675
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17659
17676
|
quotaInfo: {
|
|
17660
|
-
remainingFraction: 0.
|
|
17661
|
-
resetTime: "2026-09-
|
|
17677
|
+
remainingFraction: 0.9615639,
|
|
17678
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17662
17679
|
},
|
|
17663
17680
|
recommended: true,
|
|
17664
17681
|
supportedMimeTypes: {
|
|
@@ -17764,8 +17781,8 @@ var models_default = {
|
|
|
17764
17781
|
},
|
|
17765
17782
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17766
17783
|
quotaInfo: {
|
|
17767
|
-
remainingFraction: 0.
|
|
17768
|
-
resetTime: "2026-09-
|
|
17784
|
+
remainingFraction: 0.9615639,
|
|
17785
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17769
17786
|
},
|
|
17770
17787
|
recommended: true,
|
|
17771
17788
|
supportedMimeTypes: {
|
|
@@ -17871,8 +17888,8 @@ var models_default = {
|
|
|
17871
17888
|
},
|
|
17872
17889
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17873
17890
|
quotaInfo: {
|
|
17874
|
-
remainingFraction: 0.
|
|
17875
|
-
resetTime: "2026-09-
|
|
17891
|
+
remainingFraction: 0.9615639,
|
|
17892
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17876
17893
|
},
|
|
17877
17894
|
recommended: true,
|
|
17878
17895
|
supportedMimeTypes: {
|
|
@@ -17977,8 +17994,8 @@ var models_default = {
|
|
|
17977
17994
|
},
|
|
17978
17995
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
17979
17996
|
quotaInfo: {
|
|
17980
|
-
remainingFraction: 0.
|
|
17981
|
-
resetTime: "2026-09-
|
|
17997
|
+
remainingFraction: 0.9615639,
|
|
17998
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
17982
17999
|
},
|
|
17983
18000
|
recommended: true,
|
|
17984
18001
|
supportedMimeTypes: {
|
|
@@ -18082,8 +18099,8 @@ var models_default = {
|
|
|
18082
18099
|
},
|
|
18083
18100
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
18084
18101
|
quotaInfo: {
|
|
18085
|
-
remainingFraction: 0.
|
|
18086
|
-
resetTime: "2026-09-
|
|
18102
|
+
remainingFraction: 0.9615639,
|
|
18103
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
18087
18104
|
},
|
|
18088
18105
|
recommended: true,
|
|
18089
18106
|
supportedMimeTypes: {
|
|
@@ -18189,8 +18206,8 @@ var models_default = {
|
|
|
18189
18206
|
},
|
|
18190
18207
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
18191
18208
|
quotaInfo: {
|
|
18192
|
-
remainingFraction: 0.
|
|
18193
|
-
resetTime: "2026-09-
|
|
18209
|
+
remainingFraction: 0.9615639,
|
|
18210
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
18194
18211
|
},
|
|
18195
18212
|
recommended: true,
|
|
18196
18213
|
supportedMimeTypes: {
|
|
@@ -18296,8 +18313,8 @@ var models_default = {
|
|
|
18296
18313
|
},
|
|
18297
18314
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
18298
18315
|
quotaInfo: {
|
|
18299
|
-
remainingFraction: 0.
|
|
18300
|
-
resetTime: "2026-09-
|
|
18316
|
+
remainingFraction: 0.9615639,
|
|
18317
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
18301
18318
|
},
|
|
18302
18319
|
recommended: true,
|
|
18303
18320
|
supportedMimeTypes: {
|
|
@@ -18402,8 +18419,8 @@ var models_default = {
|
|
|
18402
18419
|
},
|
|
18403
18420
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
18404
18421
|
quotaInfo: {
|
|
18405
|
-
remainingFraction: 0.
|
|
18406
|
-
resetTime: "2026-09-
|
|
18422
|
+
remainingFraction: 0.9615639,
|
|
18423
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
18407
18424
|
},
|
|
18408
18425
|
recommended: true,
|
|
18409
18426
|
supportedMimeTypes: {
|
|
@@ -18486,8 +18503,8 @@ var models_default = {
|
|
|
18486
18503
|
},
|
|
18487
18504
|
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
18488
18505
|
quotaInfo: {
|
|
18489
|
-
remainingFraction: 0.
|
|
18490
|
-
resetTime: "2026-09-
|
|
18506
|
+
remainingFraction: 0.9615639,
|
|
18507
|
+
resetTime: "2026-09-16T08:58:14Z"
|
|
18491
18508
|
},
|
|
18492
18509
|
recommended: true,
|
|
18493
18510
|
supportedMimeTypes: {
|
|
@@ -18558,7 +18575,7 @@ var models_default = {
|
|
|
18558
18575
|
modelProvider: "MODEL_PROVIDER_OPENAI",
|
|
18559
18576
|
quotaInfo: {
|
|
18560
18577
|
remainingFraction: 1,
|
|
18561
|
-
resetTime: "2026-09-
|
|
18578
|
+
resetTime: "2026-09-16T09:06:33Z"
|
|
18562
18579
|
},
|
|
18563
18580
|
recommended: true,
|
|
18564
18581
|
supportsThinking: true,
|
|
@@ -20668,14 +20685,799 @@ function toUrlString(value) {
|
|
|
20668
20685
|
return value.toString();
|
|
20669
20686
|
}
|
|
20670
20687
|
|
|
20688
|
+
// src/plugin/types.ts
|
|
20689
|
+
function defineOpenCodeV2Plugin(def) {
|
|
20690
|
+
return def;
|
|
20691
|
+
}
|
|
20692
|
+
|
|
20693
|
+
// src/plugin/v2.ts
|
|
20694
|
+
import { homedir as homedir4 } from "os";
|
|
20695
|
+
import { join as join6 } from "path";
|
|
20696
|
+
import { existsSync as existsSync6, mkdirSync as mkdirSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "fs";
|
|
20697
|
+
import "http";
|
|
20698
|
+
var AGY_V2_QUOTA_COMMAND = "agy-quota";
|
|
20699
|
+
var AGY_V2_QUOTA_SUMMARY_COMMAND = "agy-quota-summary";
|
|
20700
|
+
var AGY_V2_QUOTA_COMMAND_TEMPLATE = `Retrieve Agy Code Assist quota usage for the current authenticated account.
|
|
20701
|
+
|
|
20702
|
+
Immediately call \`${AGY_QUOTA_TOOL_NAME}\` with no arguments and return its output verbatim.
|
|
20703
|
+
Do not call other tools.
|
|
20704
|
+
`;
|
|
20705
|
+
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.
|
|
20706
|
+
|
|
20707
|
+
Immediately call \`${AGY_QUOTA_SUMMARY_TOOL_NAME}\` with no arguments and return its output verbatim.
|
|
20708
|
+
Do not call other tools.
|
|
20709
|
+
`;
|
|
20710
|
+
function getSafeHeader2(headers, key) {
|
|
20711
|
+
if (!headers) {
|
|
20712
|
+
return void 0;
|
|
20713
|
+
}
|
|
20714
|
+
const targetKey = key.toLowerCase();
|
|
20715
|
+
if (typeof headers.get === "function") {
|
|
20716
|
+
try {
|
|
20717
|
+
return headers.get(targetKey) || void 0;
|
|
20718
|
+
} catch {
|
|
20719
|
+
}
|
|
20720
|
+
}
|
|
20721
|
+
if (Array.isArray(headers)) {
|
|
20722
|
+
const found = headers.find((item) => {
|
|
20723
|
+
if (Array.isArray(item) && typeof item[0] === "string") {
|
|
20724
|
+
return item[0].toLowerCase() === targetKey;
|
|
20725
|
+
}
|
|
20726
|
+
return false;
|
|
20727
|
+
});
|
|
20728
|
+
return found ? String(found[1]) : void 0;
|
|
20729
|
+
}
|
|
20730
|
+
if (typeof headers === "object") {
|
|
20731
|
+
const foundKey = Object.keys(headers).find((k) => k.toLowerCase() === targetKey);
|
|
20732
|
+
return foundKey ? headers[foundKey] !== void 0 ? String(headers[foundKey]) : void 0 : void 0;
|
|
20733
|
+
}
|
|
20734
|
+
return void 0;
|
|
20735
|
+
}
|
|
20736
|
+
function setSafeHeaders2(initHeaders, newHeaders) {
|
|
20737
|
+
if (typeof globalThis.Headers !== "undefined") {
|
|
20738
|
+
const headers = new globalThis.Headers(initHeaders ?? {});
|
|
20739
|
+
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20740
|
+
headers.set(k, v);
|
|
20741
|
+
}
|
|
20742
|
+
return headers;
|
|
20743
|
+
}
|
|
20744
|
+
if (Array.isArray(initHeaders)) {
|
|
20745
|
+
const nextHeaders2 = [...initHeaders];
|
|
20746
|
+
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20747
|
+
const idx = nextHeaders2.findIndex((item) => Array.isArray(item) && typeof item[0] === "string" && item[0].toLowerCase() === k.toLowerCase());
|
|
20748
|
+
if (idx !== -1) {
|
|
20749
|
+
nextHeaders2[idx] = [k, v];
|
|
20750
|
+
} else {
|
|
20751
|
+
nextHeaders2.push([k, v]);
|
|
20752
|
+
}
|
|
20753
|
+
}
|
|
20754
|
+
return nextHeaders2;
|
|
20755
|
+
}
|
|
20756
|
+
const nextHeaders = {};
|
|
20757
|
+
if (initHeaders && typeof initHeaders === "object") {
|
|
20758
|
+
for (const [k, v] of Object.entries(initHeaders)) {
|
|
20759
|
+
nextHeaders[k] = String(v);
|
|
20760
|
+
}
|
|
20761
|
+
}
|
|
20762
|
+
for (const [k, v] of Object.entries(newHeaders)) {
|
|
20763
|
+
const existingKey = Object.keys(nextHeaders).find((key) => key.toLowerCase() === k.toLowerCase());
|
|
20764
|
+
if (existingKey) {
|
|
20765
|
+
nextHeaders[existingKey] = v;
|
|
20766
|
+
} else {
|
|
20767
|
+
nextHeaders[k] = v;
|
|
20768
|
+
}
|
|
20769
|
+
}
|
|
20770
|
+
return nextHeaders;
|
|
20771
|
+
}
|
|
20772
|
+
function toUrlString2(value) {
|
|
20773
|
+
if (typeof value === "string") {
|
|
20774
|
+
return value;
|
|
20775
|
+
}
|
|
20776
|
+
const candidate = value.url;
|
|
20777
|
+
if (candidate) {
|
|
20778
|
+
return candidate;
|
|
20779
|
+
}
|
|
20780
|
+
return value.toString();
|
|
20781
|
+
}
|
|
20782
|
+
function resolveModelTier2(baseModelId, init) {
|
|
20783
|
+
const parts = baseModelId.split("@");
|
|
20784
|
+
const base = parts[0] || "";
|
|
20785
|
+
const suffixTier = parts[1]?.toLowerCase();
|
|
20786
|
+
const mapping = TIER_MAPPING[base];
|
|
20787
|
+
if (!mapping) {
|
|
20788
|
+
return baseModelId;
|
|
20789
|
+
}
|
|
20790
|
+
const headerTier = getSafeHeader2(init?.headers, "x-agy-tier")?.toLowerCase() || null;
|
|
20791
|
+
const requestedTier = headerTier || suffixTier;
|
|
20792
|
+
if (requestedTier && Object.prototype.hasOwnProperty.call(mapping, requestedTier)) {
|
|
20793
|
+
return mapping[requestedTier] || baseModelId;
|
|
20794
|
+
}
|
|
20795
|
+
return mapping["medium"] ?? mapping["high"];
|
|
20796
|
+
}
|
|
20797
|
+
var storedAuthOverrideForTesting = void 0;
|
|
20798
|
+
function loadStoredAuthFromJson() {
|
|
20799
|
+
if (storedAuthOverrideForTesting !== void 0) {
|
|
20800
|
+
return storedAuthOverrideForTesting;
|
|
20801
|
+
}
|
|
20802
|
+
const authPath = join6(homedir4(), ".local", "share", "opencode", "auth.json");
|
|
20803
|
+
try {
|
|
20804
|
+
if (existsSync6(authPath)) {
|
|
20805
|
+
const content = readFileSync5(authPath, "utf8");
|
|
20806
|
+
const data = JSON.parse(content);
|
|
20807
|
+
return data?.[AGY_PROVIDER_ID];
|
|
20808
|
+
}
|
|
20809
|
+
} catch {
|
|
20810
|
+
}
|
|
20811
|
+
return void 0;
|
|
20812
|
+
}
|
|
20813
|
+
function saveStoredAuthToJson(authRecord) {
|
|
20814
|
+
if (process.env.NODE_ENV === "test" || process.env.VITEST || storedAuthOverrideForTesting !== void 0) {
|
|
20815
|
+
return;
|
|
20816
|
+
}
|
|
20817
|
+
try {
|
|
20818
|
+
const dirPath = join6(homedir4(), ".local", "share", "opencode");
|
|
20819
|
+
if (!existsSync6(dirPath)) {
|
|
20820
|
+
mkdirSync5(dirPath, { recursive: true });
|
|
20821
|
+
}
|
|
20822
|
+
const authPath = join6(dirPath, "auth.json");
|
|
20823
|
+
let data = {};
|
|
20824
|
+
if (existsSync6(authPath)) {
|
|
20825
|
+
try {
|
|
20826
|
+
data = JSON.parse(readFileSync5(authPath, "utf8")) || {};
|
|
20827
|
+
} catch {
|
|
20828
|
+
data = {};
|
|
20829
|
+
}
|
|
20830
|
+
}
|
|
20831
|
+
data[AGY_PROVIDER_ID] = {
|
|
20832
|
+
type: "oauth",
|
|
20833
|
+
refresh: authRecord.refresh,
|
|
20834
|
+
access: authRecord.access,
|
|
20835
|
+
expires: authRecord.expires
|
|
20836
|
+
};
|
|
20837
|
+
writeFileSync5(authPath, JSON.stringify(data, null, 2), "utf8");
|
|
20838
|
+
} catch {
|
|
20839
|
+
}
|
|
20840
|
+
}
|
|
20841
|
+
function createV2FetchInterceptor(getAuthSnapshot) {
|
|
20842
|
+
return async function agyV2Fetch(input, init) {
|
|
20843
|
+
const isGL = isGenerativeLanguageRequest(input);
|
|
20844
|
+
const isInternal = toUrlString2(input).includes("cloudcode-pa.googleapis.com");
|
|
20845
|
+
if (!isGL && !isInternal) {
|
|
20846
|
+
return agyFetch(input, init);
|
|
20847
|
+
}
|
|
20848
|
+
let rawAuth = getAuthSnapshot ? await getAuthSnapshot() : void 0;
|
|
20849
|
+
if (!rawAuth) {
|
|
20850
|
+
rawAuth = loadStoredAuthFromJson();
|
|
20851
|
+
}
|
|
20852
|
+
if (!rawAuth || !isOAuthAuth(rawAuth)) {
|
|
20853
|
+
return agyFetch(input, init);
|
|
20854
|
+
}
|
|
20855
|
+
let authRecord = resolveCachedAuth(rawAuth);
|
|
20856
|
+
if (accessTokenExpired(authRecord)) {
|
|
20857
|
+
const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
|
|
20858
|
+
} } });
|
|
20859
|
+
if (refreshed) {
|
|
20860
|
+
authRecord = refreshed;
|
|
20861
|
+
}
|
|
20862
|
+
}
|
|
20863
|
+
if (!authRecord.access) {
|
|
20864
|
+
return agyFetch(input, init);
|
|
20865
|
+
}
|
|
20866
|
+
if (isInternal) {
|
|
20867
|
+
const hasAuth = getSafeHeader2(init?.headers, "Authorization") !== void 0;
|
|
20868
|
+
if (hasAuth) {
|
|
20869
|
+
return agyFetch(input, init);
|
|
20870
|
+
}
|
|
20871
|
+
const userAgent = buildAgyCliUserAgent();
|
|
20872
|
+
const headers = setSafeHeaders2(init?.headers, {
|
|
20873
|
+
Authorization: `Bearer ${authRecord.access}`,
|
|
20874
|
+
"User-Agent": userAgent
|
|
20875
|
+
});
|
|
20876
|
+
return agyFetch(input, {
|
|
20877
|
+
...init,
|
|
20878
|
+
headers
|
|
20879
|
+
});
|
|
20880
|
+
}
|
|
20881
|
+
const requestTarget = parseGenerativeLanguageRequest(input);
|
|
20882
|
+
const requestUserAgentModel = requestTarget?.effectiveModel;
|
|
20883
|
+
let projectContext;
|
|
20884
|
+
try {
|
|
20885
|
+
projectContext = await ensureProjectContext(
|
|
20886
|
+
authRecord,
|
|
20887
|
+
{ auth: { set: async () => {
|
|
20888
|
+
} } },
|
|
20889
|
+
void 0,
|
|
20890
|
+
requestUserAgentModel
|
|
20891
|
+
);
|
|
20892
|
+
} catch {
|
|
20893
|
+
projectContext = {
|
|
20894
|
+
effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
|
|
20895
|
+
auth: authRecord
|
|
20896
|
+
};
|
|
20897
|
+
}
|
|
20898
|
+
const originalRequestedModel = parseGenerativeLanguageRequest(input)?.effectiveModel;
|
|
20899
|
+
let modifiedInput = input;
|
|
20900
|
+
if (isGL && originalRequestedModel) {
|
|
20901
|
+
const originalBase = originalRequestedModel.replace("google-agy/", "");
|
|
20902
|
+
const resolvedBase = resolveModelTier2(originalBase, init);
|
|
20903
|
+
if (originalBase !== resolvedBase) {
|
|
20904
|
+
if (typeof modifiedInput === "string") {
|
|
20905
|
+
modifiedInput = modifiedInput.replace(`models/${originalBase}`, `models/${resolvedBase}`);
|
|
20906
|
+
} else if (typeof Request !== "undefined" && modifiedInput instanceof Request) {
|
|
20907
|
+
const newUrl = modifiedInput.url.replace(`models/${originalBase}`, `models/${resolvedBase}`);
|
|
20908
|
+
modifiedInput = new Request(newUrl, modifiedInput);
|
|
20909
|
+
}
|
|
20910
|
+
}
|
|
20911
|
+
}
|
|
20912
|
+
const transformed = prepareAgyRequest(
|
|
20913
|
+
modifiedInput,
|
|
20914
|
+
init,
|
|
20915
|
+
authRecord.access,
|
|
20916
|
+
projectContext.effectiveProjectId,
|
|
20917
|
+
void 0
|
|
20918
|
+
);
|
|
20919
|
+
const chatLogger = createChatLogger();
|
|
20920
|
+
if (chatLogger) {
|
|
20921
|
+
chatLogger.logRequest(
|
|
20922
|
+
toUrlString2(transformed.request),
|
|
20923
|
+
transformed.init.method || "GET",
|
|
20924
|
+
transformed.init.headers,
|
|
20925
|
+
transformed.init.body
|
|
20926
|
+
);
|
|
20927
|
+
}
|
|
20928
|
+
const response = await fetchWithRetry(transformed.request, transformed.init);
|
|
20929
|
+
return transformAgyResponse(
|
|
20930
|
+
response,
|
|
20931
|
+
transformed.streaming,
|
|
20932
|
+
null,
|
|
20933
|
+
transformed.requestedModel,
|
|
20934
|
+
transformed.sessionId,
|
|
20935
|
+
chatLogger
|
|
20936
|
+
);
|
|
20937
|
+
};
|
|
20938
|
+
}
|
|
20939
|
+
async function setupOpenCodeV2(ctx) {
|
|
20940
|
+
ctx.catalog.transform(async (editor) => {
|
|
20941
|
+
if (!editor) return;
|
|
20942
|
+
const resolveVariants = (modelId) => {
|
|
20943
|
+
const mapping = TIER_MAPPING[modelId];
|
|
20944
|
+
if (!mapping) return void 0;
|
|
20945
|
+
const variants = [];
|
|
20946
|
+
if (mapping.minimal !== void 0) variants.push({ id: "minimal" });
|
|
20947
|
+
if (mapping.low !== void 0) variants.push({ id: "low" });
|
|
20948
|
+
if (mapping.medium !== void 0) variants.push({ id: "medium" });
|
|
20949
|
+
if (mapping.high !== void 0) variants.push({ id: "high" });
|
|
20950
|
+
return variants.length > 0 ? variants : void 0;
|
|
20951
|
+
};
|
|
20952
|
+
if (typeof editor?.provider?.update === "function") {
|
|
20953
|
+
editor.provider.update(AGY_PROVIDER_ID, (p) => {
|
|
20954
|
+
p.name = "Antigravity CLI";
|
|
20955
|
+
p.activation = "enabled";
|
|
20956
|
+
p.package = "aisdk:@ai-sdk/google";
|
|
20957
|
+
p.description = "Google Gemini Antigravity Code Assist OAuth provider";
|
|
20958
|
+
p.settings = { ...p.settings || {}, apiKey: "dummy" };
|
|
20959
|
+
p.integrationID = AGY_PROVIDER_ID;
|
|
20960
|
+
});
|
|
20961
|
+
if (typeof editor?.model?.update === "function") {
|
|
20962
|
+
for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
|
|
20963
|
+
editor.model.update(AGY_PROVIDER_ID, modelId, (m) => {
|
|
20964
|
+
m.name = simple.name;
|
|
20965
|
+
m.capabilities = {
|
|
20966
|
+
tools: true,
|
|
20967
|
+
input: ["text", "image"],
|
|
20968
|
+
output: ["text"]
|
|
20969
|
+
};
|
|
20970
|
+
m.limit = {
|
|
20971
|
+
context: simple.maxTokens,
|
|
20972
|
+
output: simple.maxOutputTokens
|
|
20973
|
+
};
|
|
20974
|
+
m.family = "gemini";
|
|
20975
|
+
if (simple.cost) {
|
|
20976
|
+
m.cost = simple.cost;
|
|
20977
|
+
}
|
|
20978
|
+
const variants = resolveVariants(modelId);
|
|
20979
|
+
if (variants) {
|
|
20980
|
+
m.variants = variants;
|
|
20981
|
+
}
|
|
20982
|
+
});
|
|
20983
|
+
}
|
|
20984
|
+
}
|
|
20985
|
+
return;
|
|
20986
|
+
}
|
|
20987
|
+
const catalog = editor;
|
|
20988
|
+
catalog.providers = catalog.providers || {};
|
|
20989
|
+
catalog.providers[AGY_PROVIDER_ID] = {
|
|
20990
|
+
id: AGY_PROVIDER_ID,
|
|
20991
|
+
name: "Antigravity CLI",
|
|
20992
|
+
npm: "aisdk:@ai-sdk/google",
|
|
20993
|
+
settings: { apiKey: "dummy" },
|
|
20994
|
+
integrationID: AGY_PROVIDER_ID,
|
|
20995
|
+
models: { ...catalog.providers[AGY_PROVIDER_ID]?.models || {} },
|
|
20996
|
+
...catalog.providers[AGY_PROVIDER_ID]
|
|
20997
|
+
};
|
|
20998
|
+
if (catalog.providers[AGY_PROVIDER_ID].settings) {
|
|
20999
|
+
catalog.providers[AGY_PROVIDER_ID].settings = {
|
|
21000
|
+
...catalog.providers[AGY_PROVIDER_ID].settings,
|
|
21001
|
+
apiKey: "dummy"
|
|
21002
|
+
};
|
|
21003
|
+
} else {
|
|
21004
|
+
catalog.providers[AGY_PROVIDER_ID].settings = { apiKey: "dummy" };
|
|
21005
|
+
}
|
|
21006
|
+
catalog.providers[AGY_PROVIDER_ID].integrationID = AGY_PROVIDER_ID;
|
|
21007
|
+
const targetModels = catalog.providers[AGY_PROVIDER_ID].models;
|
|
21008
|
+
for (const [modelId, simple] of Object.entries(STATIC_MODELS_SIMPLE)) {
|
|
21009
|
+
const isClaude = modelId.startsWith("claude-");
|
|
21010
|
+
const isGpt = modelId.startsWith("gpt-");
|
|
21011
|
+
const variants = resolveVariants(modelId);
|
|
21012
|
+
targetModels[modelId] = {
|
|
21013
|
+
id: modelId,
|
|
21014
|
+
providerID: AGY_PROVIDER_ID,
|
|
21015
|
+
name: simple.name,
|
|
21016
|
+
description: simple.description,
|
|
21017
|
+
family: modelId.includes("gemini") ? "gemini" : isClaude ? "claude" : isGpt ? "gpt" : "unknown",
|
|
21018
|
+
reasoning: simple.reasoning,
|
|
21019
|
+
attachment: simple.attachment,
|
|
21020
|
+
tool_call: simple.toolCall,
|
|
21021
|
+
limit: {
|
|
21022
|
+
context: simple.maxTokens,
|
|
21023
|
+
output: simple.maxOutputTokens
|
|
21024
|
+
},
|
|
21025
|
+
cost: simple.cost || { input: 0, output: 0 },
|
|
21026
|
+
...variants ? { variants } : {},
|
|
21027
|
+
...targetModels[modelId] || {}
|
|
21028
|
+
};
|
|
21029
|
+
}
|
|
21030
|
+
});
|
|
21031
|
+
ctx.tool.transform(async (editor) => {
|
|
21032
|
+
if (!editor) return;
|
|
21033
|
+
const quotaTool = createAgyQuotaTool({
|
|
21034
|
+
client: void 0,
|
|
21035
|
+
getAuthResolver: () => void 0,
|
|
21036
|
+
getConfiguredProjectId: () => void 0,
|
|
21037
|
+
getUserAgentModel: () => void 0
|
|
21038
|
+
});
|
|
21039
|
+
const quotaSummaryTool = createAgyQuotaSummaryTool({
|
|
21040
|
+
client: void 0,
|
|
21041
|
+
getAuthResolver: () => void 0,
|
|
21042
|
+
getConfiguredProjectId: () => void 0,
|
|
21043
|
+
getUserAgentModel: () => void 0
|
|
21044
|
+
});
|
|
21045
|
+
if (typeof editor.add === "function") {
|
|
21046
|
+
editor.add({
|
|
21047
|
+
name: AGY_QUOTA_TOOL_NAME,
|
|
21048
|
+
description: quotaTool.description,
|
|
21049
|
+
input: {},
|
|
21050
|
+
execute: async (args, context) => quotaTool.execute(args, context)
|
|
21051
|
+
});
|
|
21052
|
+
editor.add({
|
|
21053
|
+
name: AGY_QUOTA_SUMMARY_TOOL_NAME,
|
|
21054
|
+
description: quotaSummaryTool.description,
|
|
21055
|
+
input: {},
|
|
21056
|
+
execute: async (args, context) => quotaSummaryTool.execute(args, context)
|
|
21057
|
+
});
|
|
21058
|
+
} else if (typeof editor.set === "function") {
|
|
21059
|
+
editor.set(AGY_QUOTA_TOOL_NAME, quotaTool);
|
|
21060
|
+
editor.set(AGY_QUOTA_SUMMARY_TOOL_NAME, quotaSummaryTool);
|
|
21061
|
+
} else if (editor.tools && typeof editor.tools === "object") {
|
|
21062
|
+
editor.tools[AGY_QUOTA_TOOL_NAME] = quotaTool;
|
|
21063
|
+
editor.tools[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
|
|
21064
|
+
} else if (typeof editor === "object") {
|
|
21065
|
+
editor[AGY_QUOTA_TOOL_NAME] = quotaTool;
|
|
21066
|
+
editor[AGY_QUOTA_SUMMARY_TOOL_NAME] = quotaSummaryTool;
|
|
21067
|
+
}
|
|
21068
|
+
});
|
|
21069
|
+
ctx.command.transform(async (editor) => {
|
|
21070
|
+
if (!editor) return;
|
|
21071
|
+
const commands = {
|
|
21072
|
+
[AGY_V2_QUOTA_COMMAND]: {
|
|
21073
|
+
description: "Show Agy Code Assist quota usage",
|
|
21074
|
+
template: AGY_V2_QUOTA_COMMAND_TEMPLATE
|
|
21075
|
+
},
|
|
21076
|
+
[AGY_V2_QUOTA_SUMMARY_COMMAND]: {
|
|
21077
|
+
description: "Show Agy Code Assist quota summary with weekly and 5-hour limits",
|
|
21078
|
+
template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
|
|
21079
|
+
}
|
|
21080
|
+
};
|
|
21081
|
+
if (typeof editor.add === "function") {
|
|
21082
|
+
editor.add({
|
|
21083
|
+
name: AGY_V2_QUOTA_COMMAND,
|
|
21084
|
+
description: "Display current Antigravity quota usage",
|
|
21085
|
+
template: AGY_V2_QUOTA_COMMAND_TEMPLATE
|
|
21086
|
+
});
|
|
21087
|
+
editor.add({
|
|
21088
|
+
name: AGY_V2_QUOTA_SUMMARY_COMMAND,
|
|
21089
|
+
description: "Display Antigravity quota summary grouped by model family",
|
|
21090
|
+
template: AGY_V2_QUOTA_SUMMARY_COMMAND_TEMPLATE
|
|
21091
|
+
});
|
|
21092
|
+
} else if (typeof editor.set === "function") {
|
|
21093
|
+
editor.set(AGY_V2_QUOTA_COMMAND, commands[AGY_V2_QUOTA_COMMAND]);
|
|
21094
|
+
editor.set(AGY_V2_QUOTA_SUMMARY_COMMAND, commands[AGY_V2_QUOTA_SUMMARY_COMMAND]);
|
|
21095
|
+
} else if (editor.commands && typeof editor.commands === "object") {
|
|
21096
|
+
editor.commands[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
|
|
21097
|
+
editor.commands[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
|
|
21098
|
+
} else if (typeof editor === "object") {
|
|
21099
|
+
editor[AGY_V2_QUOTA_COMMAND] = commands[AGY_V2_QUOTA_COMMAND];
|
|
21100
|
+
editor[AGY_V2_QUOTA_SUMMARY_COMMAND] = commands[AGY_V2_QUOTA_SUMMARY_COMMAND];
|
|
21101
|
+
}
|
|
21102
|
+
});
|
|
21103
|
+
ctx.integration?.transform?.((editor) => {
|
|
21104
|
+
if (!editor) return;
|
|
21105
|
+
editor.update?.(AGY_PROVIDER_ID, (integration) => {
|
|
21106
|
+
integration.name = "Antigravity CLI (plugin)";
|
|
21107
|
+
});
|
|
21108
|
+
editor.method?.update?.({
|
|
21109
|
+
integrationID: AGY_PROVIDER_ID,
|
|
21110
|
+
method: {
|
|
21111
|
+
id: "oauth",
|
|
21112
|
+
type: "oauth",
|
|
21113
|
+
label: "Antigravity CLI (OAuth)"
|
|
21114
|
+
},
|
|
21115
|
+
authorize: async () => {
|
|
21116
|
+
const authorization = await authorizeAgy();
|
|
21117
|
+
return {
|
|
21118
|
+
mode: "code",
|
|
21119
|
+
url: authorization.url,
|
|
21120
|
+
instructions: "Please complete Google account authorization in your browser. After authorization, copy the full redirect URL or code and paste it below:",
|
|
21121
|
+
callback: async (code) => {
|
|
21122
|
+
const trimmed = code.trim();
|
|
21123
|
+
const parsed = parseOAuthCallbackInput(trimmed);
|
|
21124
|
+
const authCode = parsed.code || trimmed;
|
|
21125
|
+
if (!authCode) {
|
|
21126
|
+
return { type: "failed", error: "Missing authorization code in callback input" };
|
|
21127
|
+
}
|
|
21128
|
+
if (parsed.state && parsed.state !== authorization.state) {
|
|
21129
|
+
return { type: "failed", error: "State mismatch in callback input (possible CSRF attempt)" };
|
|
21130
|
+
}
|
|
21131
|
+
const exchangeResult = await exchangeAgyWithVerifier(authCode, authorization.verifier);
|
|
21132
|
+
if (exchangeResult.type !== "success") {
|
|
21133
|
+
return exchangeResult;
|
|
21134
|
+
}
|
|
21135
|
+
const initialRefresh = formatRefreshParts({
|
|
21136
|
+
refreshToken: exchangeResult.refresh
|
|
21137
|
+
});
|
|
21138
|
+
let authRecord = {
|
|
21139
|
+
type: "oauth",
|
|
21140
|
+
refresh: initialRefresh,
|
|
21141
|
+
access: exchangeResult.access,
|
|
21142
|
+
expires: exchangeResult.expires
|
|
21143
|
+
};
|
|
21144
|
+
try {
|
|
21145
|
+
const projectContext = await ensureProjectContext(
|
|
21146
|
+
authRecord,
|
|
21147
|
+
{ auth: { set: async () => {
|
|
21148
|
+
} } }
|
|
21149
|
+
);
|
|
21150
|
+
authRecord = {
|
|
21151
|
+
...authRecord,
|
|
21152
|
+
refresh: projectContext.auth.refresh
|
|
21153
|
+
};
|
|
21154
|
+
} catch {
|
|
21155
|
+
}
|
|
21156
|
+
saveStoredAuthToJson(authRecord);
|
|
21157
|
+
return {
|
|
21158
|
+
type: "oauth",
|
|
21159
|
+
methodID: "oauth",
|
|
21160
|
+
refresh: authRecord.refresh,
|
|
21161
|
+
access: authRecord.access,
|
|
21162
|
+
expires: authRecord.expires
|
|
21163
|
+
};
|
|
21164
|
+
}
|
|
21165
|
+
};
|
|
21166
|
+
}
|
|
21167
|
+
});
|
|
21168
|
+
});
|
|
21169
|
+
ctx.aisdk?.hook("sdk", async (event) => {
|
|
21170
|
+
if (!event) return;
|
|
21171
|
+
const isMatchingProvider = event.providerID === AGY_PROVIDER_ID || event.model?.providerID === AGY_PROVIDER_ID;
|
|
21172
|
+
if (!isMatchingProvider) return;
|
|
21173
|
+
event.options = event.options || {};
|
|
21174
|
+
event.options.apiKey = "dummy";
|
|
21175
|
+
event.options.fetch = createV2FetchInterceptor();
|
|
21176
|
+
});
|
|
21177
|
+
let lastInterceptedModel;
|
|
21178
|
+
ctx.session.hook(
|
|
21179
|
+
"http.request",
|
|
21180
|
+
async (event) => {
|
|
21181
|
+
if (!event) return;
|
|
21182
|
+
const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
|
|
21183
|
+
const isGL = isGenerativeLanguageRequest(rawUrl);
|
|
21184
|
+
const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
|
|
21185
|
+
if (!isGL && !isInternal) {
|
|
21186
|
+
return;
|
|
21187
|
+
}
|
|
21188
|
+
event.headers = event.headers || {};
|
|
21189
|
+
let modelName;
|
|
21190
|
+
let rawAuth = event.auth;
|
|
21191
|
+
if (rawAuth && !rawAuth.type) {
|
|
21192
|
+
const tokenVal = rawAuth.access || rawAuth.token;
|
|
21193
|
+
if (tokenVal || rawAuth.refresh) {
|
|
21194
|
+
rawAuth = { type: "oauth", access: tokenVal, ...rawAuth };
|
|
21195
|
+
}
|
|
21196
|
+
}
|
|
21197
|
+
if (!rawAuth || !isOAuthAuth(rawAuth)) {
|
|
21198
|
+
rawAuth = loadStoredAuthFromJson();
|
|
21199
|
+
}
|
|
21200
|
+
let authRecord = rawAuth && isOAuthAuth(rawAuth) ? resolveCachedAuth(rawAuth) : void 0;
|
|
21201
|
+
if (authRecord && accessTokenExpired(authRecord)) {
|
|
21202
|
+
const refreshed = await refreshAccessToken(authRecord, { auth: { set: async () => {
|
|
21203
|
+
} } });
|
|
21204
|
+
if (refreshed) {
|
|
21205
|
+
authRecord = refreshed;
|
|
21206
|
+
saveStoredAuthToJson(refreshed);
|
|
21207
|
+
}
|
|
21208
|
+
}
|
|
21209
|
+
if (isGL) {
|
|
21210
|
+
const parsed = parseGenerativeLanguageRequest(rawUrl);
|
|
21211
|
+
modelName = parsed?.effectiveModel;
|
|
21212
|
+
if (modelName) {
|
|
21213
|
+
lastInterceptedModel = modelName;
|
|
21214
|
+
}
|
|
21215
|
+
if (typeof event.headers.delete === "function") {
|
|
21216
|
+
event.headers.delete("x-goog-api-key");
|
|
21217
|
+
event.headers.delete("api-key");
|
|
21218
|
+
} else {
|
|
21219
|
+
for (const key of Object.keys(event.headers)) {
|
|
21220
|
+
const lower = key.toLowerCase();
|
|
21221
|
+
if (lower === "x-goog-api-key" || lower === "api-key") {
|
|
21222
|
+
delete event.headers[key];
|
|
21223
|
+
}
|
|
21224
|
+
}
|
|
21225
|
+
}
|
|
21226
|
+
if (event.request?.headers) {
|
|
21227
|
+
if (typeof event.request.headers.delete === "function") {
|
|
21228
|
+
event.request.headers.delete("x-goog-api-key");
|
|
21229
|
+
event.request.headers.delete("api-key");
|
|
21230
|
+
} else {
|
|
21231
|
+
for (const key of Object.keys(event.request.headers)) {
|
|
21232
|
+
const lower = key.toLowerCase();
|
|
21233
|
+
if (lower === "x-goog-api-key" || lower === "api-key") {
|
|
21234
|
+
delete event.request.headers[key];
|
|
21235
|
+
}
|
|
21236
|
+
}
|
|
21237
|
+
}
|
|
21238
|
+
}
|
|
21239
|
+
let cleanUrl = rawUrl;
|
|
21240
|
+
try {
|
|
21241
|
+
const parsedUrl = new URL(rawUrl);
|
|
21242
|
+
let urlChanged = false;
|
|
21243
|
+
for (const param of ["key", "x-goog-api-key", "api-key"]) {
|
|
21244
|
+
if (parsedUrl.searchParams.has(param)) {
|
|
21245
|
+
parsedUrl.searchParams.delete(param);
|
|
21246
|
+
urlChanged = true;
|
|
21247
|
+
}
|
|
21248
|
+
}
|
|
21249
|
+
if (urlChanged) {
|
|
21250
|
+
cleanUrl = parsedUrl.toString();
|
|
21251
|
+
}
|
|
21252
|
+
} catch {
|
|
21253
|
+
}
|
|
21254
|
+
if (authRecord && authRecord.access) {
|
|
21255
|
+
let projectContext;
|
|
21256
|
+
try {
|
|
21257
|
+
projectContext = await ensureProjectContext(
|
|
21258
|
+
authRecord,
|
|
21259
|
+
{ auth: { set: async () => {
|
|
21260
|
+
} } },
|
|
21261
|
+
void 0,
|
|
21262
|
+
modelName
|
|
21263
|
+
);
|
|
21264
|
+
} catch {
|
|
21265
|
+
projectContext = {
|
|
21266
|
+
effectiveProjectId: parseRefreshParts(authRecord.refresh).projectId || "antigravity",
|
|
21267
|
+
auth: authRecord
|
|
21268
|
+
};
|
|
21269
|
+
}
|
|
21270
|
+
const originalRequestedModel = modelName;
|
|
21271
|
+
let modifiedUrl = cleanUrl;
|
|
21272
|
+
if (originalRequestedModel) {
|
|
21273
|
+
const originalBase = originalRequestedModel.replace("google-agy/", "");
|
|
21274
|
+
const initHeaders = event.headers instanceof Headers ? event.headers : event.request?.headers;
|
|
21275
|
+
const resolvedBase = resolveModelTier2(originalBase, { headers: initHeaders });
|
|
21276
|
+
if (originalBase !== resolvedBase) {
|
|
21277
|
+
modifiedUrl = modifiedUrl.replace(`models/${originalBase}`, `models/${resolvedBase}`);
|
|
21278
|
+
}
|
|
21279
|
+
}
|
|
21280
|
+
let bodyPayload = event.body;
|
|
21281
|
+
if (bodyPayload === void 0 && event.request) {
|
|
21282
|
+
if (typeof event.request.clone === "function") {
|
|
21283
|
+
try {
|
|
21284
|
+
bodyPayload = await event.request.clone().text();
|
|
21285
|
+
} catch {
|
|
21286
|
+
}
|
|
21287
|
+
} else if (event.request.body !== void 0) {
|
|
21288
|
+
bodyPayload = event.request.body;
|
|
21289
|
+
}
|
|
21290
|
+
}
|
|
21291
|
+
let preExistingUserAgent;
|
|
21292
|
+
if (typeof event.headers?.get === "function") {
|
|
21293
|
+
preExistingUserAgent = event.headers.get("user-agent") || event.headers.get("User-Agent") || void 0;
|
|
21294
|
+
} else if (event.headers && typeof event.headers === "object") {
|
|
21295
|
+
preExistingUserAgent = event.headers["user-agent"] || event.headers["User-Agent"] || void 0;
|
|
21296
|
+
}
|
|
21297
|
+
if (!preExistingUserAgent && typeof event.request?.headers?.get === "function") {
|
|
21298
|
+
preExistingUserAgent = event.request.headers.get("user-agent") || event.request.headers.get("User-Agent") || void 0;
|
|
21299
|
+
} else if (!preExistingUserAgent && event.request?.headers && typeof event.request.headers === "object") {
|
|
21300
|
+
preExistingUserAgent = event.request.headers["user-agent"] || event.request.headers["User-Agent"] || void 0;
|
|
21301
|
+
}
|
|
21302
|
+
const method = event.method || event.request?.method || "POST";
|
|
21303
|
+
const requestHeaders = event.headers || event.request?.headers;
|
|
21304
|
+
const transformed = prepareAgyRequest(
|
|
21305
|
+
modifiedUrl,
|
|
21306
|
+
{
|
|
21307
|
+
method,
|
|
21308
|
+
headers: requestHeaders,
|
|
21309
|
+
body: bodyPayload
|
|
21310
|
+
},
|
|
21311
|
+
authRecord.access,
|
|
21312
|
+
projectContext.effectiveProjectId
|
|
21313
|
+
);
|
|
21314
|
+
const targetUrl = toUrlString2(transformed.request);
|
|
21315
|
+
if (typeof event.url === "string") {
|
|
21316
|
+
event.url = targetUrl;
|
|
21317
|
+
}
|
|
21318
|
+
if (event.request && typeof event.request === "object") {
|
|
21319
|
+
if (typeof Request !== "undefined" && event.request instanceof Request) {
|
|
21320
|
+
event.request = new Request(targetUrl, {
|
|
21321
|
+
method: transformed.init.method,
|
|
21322
|
+
headers: transformed.init.headers,
|
|
21323
|
+
body: transformed.init.body
|
|
21324
|
+
});
|
|
21325
|
+
} else if (typeof event.request.url === "string") {
|
|
21326
|
+
try {
|
|
21327
|
+
event.request.url = targetUrl;
|
|
21328
|
+
} catch {
|
|
21329
|
+
}
|
|
21330
|
+
}
|
|
21331
|
+
}
|
|
21332
|
+
const headerEntries = transformed.init.headers instanceof Headers ? Array.from(transformed.init.headers.entries()) : Object.entries(transformed.init.headers || {});
|
|
21333
|
+
for (const [k, v] of headerEntries) {
|
|
21334
|
+
const lowerK = k.toLowerCase();
|
|
21335
|
+
if (lowerK === "user-agent") {
|
|
21336
|
+
if (preExistingUserAgent) {
|
|
21337
|
+
continue;
|
|
21338
|
+
}
|
|
21339
|
+
if (typeof event.headers?.set === "function") {
|
|
21340
|
+
event.headers.set("User-Agent", v);
|
|
21341
|
+
} else if (event.headers) {
|
|
21342
|
+
event.headers["User-Agent"] = v;
|
|
21343
|
+
}
|
|
21344
|
+
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21345
|
+
event.request.headers.set("User-Agent", v);
|
|
21346
|
+
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21347
|
+
event.request.headers["User-Agent"] = v;
|
|
21348
|
+
}
|
|
21349
|
+
continue;
|
|
21350
|
+
}
|
|
21351
|
+
if (typeof event.headers?.set === "function") {
|
|
21352
|
+
event.headers.set(k, v);
|
|
21353
|
+
} else if (event.headers) {
|
|
21354
|
+
event.headers[k] = v;
|
|
21355
|
+
}
|
|
21356
|
+
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21357
|
+
event.request.headers.set(k, v);
|
|
21358
|
+
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21359
|
+
event.request.headers[k] = v;
|
|
21360
|
+
}
|
|
21361
|
+
}
|
|
21362
|
+
if (transformed.init.body !== void 0) {
|
|
21363
|
+
event.body = transformed.init.body;
|
|
21364
|
+
if (event.request && typeof event.request === "object" && !(event.request instanceof Request)) {
|
|
21365
|
+
event.request.body = transformed.init.body;
|
|
21366
|
+
}
|
|
21367
|
+
}
|
|
21368
|
+
} else {
|
|
21369
|
+
if (typeof event.url === "string") {
|
|
21370
|
+
event.url = cleanUrl;
|
|
21371
|
+
}
|
|
21372
|
+
if (event.request && typeof event.request === "object") {
|
|
21373
|
+
if (typeof event.request.url === "string") {
|
|
21374
|
+
event.request.url = cleanUrl;
|
|
21375
|
+
}
|
|
21376
|
+
}
|
|
21377
|
+
}
|
|
21378
|
+
}
|
|
21379
|
+
if (authRecord && authRecord.access) {
|
|
21380
|
+
if (typeof event.headers?.set === "function") {
|
|
21381
|
+
event.headers.set("Authorization", `Bearer ${authRecord.access}`);
|
|
21382
|
+
} else if (event.headers) {
|
|
21383
|
+
event.headers["Authorization"] = `Bearer ${authRecord.access}`;
|
|
21384
|
+
}
|
|
21385
|
+
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21386
|
+
event.request.headers.set("Authorization", `Bearer ${authRecord.access}`);
|
|
21387
|
+
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21388
|
+
event.request.headers["Authorization"] = `Bearer ${authRecord.access}`;
|
|
21389
|
+
}
|
|
21390
|
+
}
|
|
21391
|
+
const userAgent = buildAgyCliUserAgent(modelName);
|
|
21392
|
+
if (typeof event.headers?.set === "function") {
|
|
21393
|
+
if (!event.headers.get("User-Agent") && !event.headers.get("user-agent")) {
|
|
21394
|
+
event.headers.set("User-Agent", userAgent);
|
|
21395
|
+
}
|
|
21396
|
+
} else if (event.headers) {
|
|
21397
|
+
if (!event.headers["User-Agent"] && !event.headers["user-agent"]) {
|
|
21398
|
+
event.headers["User-Agent"] = userAgent;
|
|
21399
|
+
}
|
|
21400
|
+
}
|
|
21401
|
+
if (event.request?.headers && typeof event.request.headers.set === "function") {
|
|
21402
|
+
if (!event.request.headers.get("User-Agent") && !event.request.headers.get("user-agent")) {
|
|
21403
|
+
event.request.headers.set("User-Agent", userAgent);
|
|
21404
|
+
}
|
|
21405
|
+
} else if (event.request?.headers && typeof event.request.headers === "object") {
|
|
21406
|
+
if (!event.request.headers["User-Agent"] && !event.request.headers["user-agent"]) {
|
|
21407
|
+
event.request.headers["User-Agent"] = userAgent;
|
|
21408
|
+
}
|
|
21409
|
+
}
|
|
21410
|
+
},
|
|
21411
|
+
{ providerID: AGY_PROVIDER_ID }
|
|
21412
|
+
);
|
|
21413
|
+
ctx.session.hook(
|
|
21414
|
+
"http.response",
|
|
21415
|
+
async (event) => {
|
|
21416
|
+
if (!event || !event.response) return;
|
|
21417
|
+
const rawUrl = typeof event.url === "string" ? event.url : event.request?.url || "";
|
|
21418
|
+
const isInternal = rawUrl.includes("cloudcode-pa.googleapis.com");
|
|
21419
|
+
if (isInternal && event.response instanceof Response) {
|
|
21420
|
+
const isStreaming = rawUrl.includes(":streamGenerateCode") || event.response.headers.get("content-type")?.includes("text/event-stream");
|
|
21421
|
+
const parsedModel = parseGenerativeLanguageRequest(rawUrl)?.effectiveModel || lastInterceptedModel;
|
|
21422
|
+
const transformed = await transformAgyResponse(
|
|
21423
|
+
event.response,
|
|
21424
|
+
!!isStreaming,
|
|
21425
|
+
null,
|
|
21426
|
+
parsedModel,
|
|
21427
|
+
void 0,
|
|
21428
|
+
void 0
|
|
21429
|
+
);
|
|
21430
|
+
event.response = transformed;
|
|
21431
|
+
}
|
|
21432
|
+
},
|
|
21433
|
+
{ providerID: AGY_PROVIDER_ID }
|
|
21434
|
+
);
|
|
21435
|
+
ctx.session.hook(
|
|
21436
|
+
"retry",
|
|
21437
|
+
async (event) => {
|
|
21438
|
+
if (!event) return;
|
|
21439
|
+
const response = event.response;
|
|
21440
|
+
if (response instanceof Response) {
|
|
21441
|
+
if (response.status === 429 || response.status === 503) {
|
|
21442
|
+
const quota = await classifyQuotaResponse(response);
|
|
21443
|
+
if (quota?.retryDelayMs) {
|
|
21444
|
+
event.retryDelayMs = quota.retryDelayMs;
|
|
21445
|
+
} else {
|
|
21446
|
+
event.retryDelayMs = await resolveRetryDelayMs(response, event.attempt || 1);
|
|
21447
|
+
}
|
|
21448
|
+
}
|
|
21449
|
+
} else if (event.details && Array.isArray(event.details)) {
|
|
21450
|
+
const retryInfo = event.details.find(
|
|
21451
|
+
(d) => d && d["@type"] === "type.googleapis.com/google.rpc.RetryInfo"
|
|
21452
|
+
);
|
|
21453
|
+
if (retryInfo?.retryDelay) {
|
|
21454
|
+
const delayMs = retryInternals.parseRetryDelayValue(retryInfo.retryDelay);
|
|
21455
|
+
if (delayMs !== null) {
|
|
21456
|
+
event.retryDelayMs = delayMs;
|
|
21457
|
+
}
|
|
21458
|
+
}
|
|
21459
|
+
}
|
|
21460
|
+
},
|
|
21461
|
+
{ providerID: AGY_PROVIDER_ID }
|
|
21462
|
+
);
|
|
21463
|
+
}
|
|
21464
|
+
var v2PluginDefinition = defineOpenCodeV2Plugin({
|
|
21465
|
+
id: AGY_PROVIDER_ID,
|
|
21466
|
+
setup: setupOpenCodeV2
|
|
21467
|
+
});
|
|
21468
|
+
|
|
20671
21469
|
// index.ts
|
|
20672
|
-
var
|
|
20673
|
-
|
|
21470
|
+
var dualPlugin = {
|
|
21471
|
+
...v2PluginDefinition,
|
|
20674
21472
|
server: AgyCLIOAuthPlugin
|
|
20675
21473
|
};
|
|
21474
|
+
var index_default = dualPlugin;
|
|
20676
21475
|
export {
|
|
20677
21476
|
AgyCLIOAuthPlugin,
|
|
20678
21477
|
GoogleOAuthPlugin,
|
|
20679
|
-
index_default as default
|
|
21478
|
+
index_default as default,
|
|
21479
|
+
defineOpenCodeV2Plugin,
|
|
21480
|
+
setupOpenCodeV2,
|
|
21481
|
+
v2PluginDefinition
|
|
20680
21482
|
};
|
|
20681
21483
|
//# sourceMappingURL=index.js.map
|