@anthonyhaussman/opencode-agy-auth 1.1.14-alpha.0 → 1.1.14-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +104 -7
- package/dist/index.js.map +1 -1
- package/dist/src/sdk/retry/quota.d.ts +9 -0
- package/package.json +7 -2
package/dist/index.js
CHANGED
|
@@ -516,6 +516,69 @@ function normalizeErrorEnvelope(parsed) {
|
|
|
516
516
|
}
|
|
517
517
|
return isObject(parsed) ? parsed : null;
|
|
518
518
|
}
|
|
519
|
+
var MAX_QUOTA_RESET_WAIT_MS = 72e5;
|
|
520
|
+
function findResetTimeForModel(summary, model) {
|
|
521
|
+
if (!summary) return null;
|
|
522
|
+
const normalize2 = (str) => str.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
523
|
+
const modelNorm = model ? normalize2(model) : "";
|
|
524
|
+
let targetGroups = summary.groups ?? [];
|
|
525
|
+
if (modelNorm && targetGroups.length > 0) {
|
|
526
|
+
const matched = targetGroups.filter((g) => {
|
|
527
|
+
const gName = normalize2(g.displayName ?? "");
|
|
528
|
+
return gName.includes(modelNorm) || modelNorm.includes(gName);
|
|
529
|
+
});
|
|
530
|
+
if (matched.length > 0) {
|
|
531
|
+
targetGroups = matched;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
const allBuckets = [];
|
|
535
|
+
for (const group of targetGroups) {
|
|
536
|
+
if (group.buckets) {
|
|
537
|
+
allBuckets.push(...group.buckets);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
if (allBuckets.length === 0 && summary.buckets) {
|
|
541
|
+
allBuckets.push(...summary.buckets);
|
|
542
|
+
}
|
|
543
|
+
const now = Date.now();
|
|
544
|
+
const validResetBuckets = allBuckets.filter((b) => {
|
|
545
|
+
if (!b.resetTime) return false;
|
|
546
|
+
const t = new Date(b.resetTime).getTime();
|
|
547
|
+
return !Number.isNaN(t) && t > now;
|
|
548
|
+
});
|
|
549
|
+
if (validResetBuckets.length === 0) {
|
|
550
|
+
return null;
|
|
551
|
+
}
|
|
552
|
+
const exhaustedFiveHour = validResetBuckets.find(
|
|
553
|
+
(b) => (b.remainingFraction === 0 || b.disabled) && b.window?.toUpperCase() === "FIVE_HOUR"
|
|
554
|
+
);
|
|
555
|
+
if (exhaustedFiveHour?.resetTime) return exhaustedFiveHour.resetTime;
|
|
556
|
+
const exhaustedAny = validResetBuckets.find((b) => b.remainingFraction === 0 || b.disabled);
|
|
557
|
+
if (exhaustedAny?.resetTime) return exhaustedAny.resetTime;
|
|
558
|
+
const fiveHour = validResetBuckets.find((b) => b.window?.toUpperCase() === "FIVE_HOUR");
|
|
559
|
+
if (fiveHour?.resetTime) return fiveHour.resetTime;
|
|
560
|
+
validResetBuckets.sort(
|
|
561
|
+
(a, b) => new Date(a.resetTime).getTime() - new Date(b.resetTime).getTime()
|
|
562
|
+
);
|
|
563
|
+
return validResetBuckets[0]?.resetTime ?? null;
|
|
564
|
+
}
|
|
565
|
+
async function resolveQuotaResetDelay(accessToken, projectId, model, userAgentModel) {
|
|
566
|
+
try {
|
|
567
|
+
const summary = await retrieveUserQuotaSummary(accessToken, projectId, userAgentModel);
|
|
568
|
+
if (!summary) return null;
|
|
569
|
+
const resetTime = findResetTimeForModel(summary, model);
|
|
570
|
+
if (!resetTime) return null;
|
|
571
|
+
const resetTimestamp = new Date(resetTime).getTime();
|
|
572
|
+
if (Number.isNaN(resetTimestamp)) return null;
|
|
573
|
+
const waitMs = resetTimestamp - Date.now() + 1e3;
|
|
574
|
+
if (waitMs <= 0 || waitMs > MAX_QUOTA_RESET_WAIT_MS) {
|
|
575
|
+
return null;
|
|
576
|
+
}
|
|
577
|
+
return { waitMs, resetTime };
|
|
578
|
+
} catch {
|
|
579
|
+
return null;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
519
582
|
|
|
520
583
|
// src/sdk/retry/helpers.ts
|
|
521
584
|
var DEFAULT_MAX_ATTEMPTS = 3;
|
|
@@ -812,6 +875,7 @@ async function fetchWithRetry(input, init) {
|
|
|
812
875
|
const throttleKey = buildRetryThrottleKey(input, retryInit);
|
|
813
876
|
await waitForRetryCooldown(throttleKey, retryInit.signal);
|
|
814
877
|
let attempt = 1;
|
|
878
|
+
let hasRetriedQuotaReset = false;
|
|
815
879
|
const url2 = readRequestUrl(input);
|
|
816
880
|
while (attempt <= DEFAULT_MAX_ATTEMPTS) {
|
|
817
881
|
let response;
|
|
@@ -837,6 +901,25 @@ async function fetchWithRetry(input, init) {
|
|
|
837
901
|
if (quotaContext.reason === "MODEL_CAPACITY_EXHAUSTED") {
|
|
838
902
|
const cooldownMs = quotaContext.retryDelayMs ?? MODEL_CAPACITY_COOLDOWN_MS;
|
|
839
903
|
setRetryCooldown(throttleKey, cooldownMs);
|
|
904
|
+
return response;
|
|
905
|
+
}
|
|
906
|
+
if (quotaContext.reason === "QUOTA_EXHAUSTED" && !hasRetriedQuotaReset && !retryInit.signal?.aborted) {
|
|
907
|
+
const body = typeof retryInit.body === "string" ? safeParseBody(retryInit.body) : null;
|
|
908
|
+
const project = readString(body?.project);
|
|
909
|
+
const model = readString(body?.model);
|
|
910
|
+
const token = extractAuthToken(retryInit.headers);
|
|
911
|
+
if (token && project) {
|
|
912
|
+
const resetInfo = await resolveQuotaResetDelay(token, project, model);
|
|
913
|
+
if (resetInfo && resetInfo.waitMs > 0 && resetInfo.waitMs <= MAX_QUOTA_RESET_WAIT_MS) {
|
|
914
|
+
hasRetriedQuotaReset = true;
|
|
915
|
+
setRetryCooldown(throttleKey, resetInfo.waitMs);
|
|
916
|
+
await wait(resetInfo.waitMs);
|
|
917
|
+
if (retryInit.signal?.aborted) {
|
|
918
|
+
return response;
|
|
919
|
+
}
|
|
920
|
+
continue;
|
|
921
|
+
}
|
|
922
|
+
}
|
|
840
923
|
}
|
|
841
924
|
return response;
|
|
842
925
|
}
|
|
@@ -922,6 +1005,14 @@ function safeParseBody(body) {
|
|
|
922
1005
|
function readString(value) {
|
|
923
1006
|
return typeof value === "string" && value.trim() ? value : void 0;
|
|
924
1007
|
}
|
|
1008
|
+
function extractAuthToken(headers) {
|
|
1009
|
+
if (!headers) return void 0;
|
|
1010
|
+
const h = new Headers(headers);
|
|
1011
|
+
const auth = h.get("authorization") || h.get("Authorization");
|
|
1012
|
+
if (!auth) return void 0;
|
|
1013
|
+
const match = auth.match(/^Bearer\s+(.+)$/i);
|
|
1014
|
+
return match?.[1]?.trim() || auth.trim();
|
|
1015
|
+
}
|
|
925
1016
|
|
|
926
1017
|
// src/sdk/terminal-hyperlink.ts
|
|
927
1018
|
var OSC8_OPEN = "\x1B]8;;";
|
|
@@ -18448,20 +18539,26 @@ function injectMissingToolCallIds(contents) {
|
|
|
18448
18539
|
}
|
|
18449
18540
|
}
|
|
18450
18541
|
function applyLatestSignature(contents, latestSig) {
|
|
18451
|
-
const
|
|
18542
|
+
const allFunctionParts = [];
|
|
18452
18543
|
for (const content of contents) {
|
|
18453
18544
|
if (content && typeof content === "object" && Array.isArray(content.parts)) {
|
|
18454
18545
|
for (const part of content.parts) {
|
|
18455
18546
|
if (part && typeof part === "object" && part.functionCall) {
|
|
18456
|
-
|
|
18547
|
+
if (part.functionCall.thoughtSignature) {
|
|
18548
|
+
if (!part.thoughtSignature || part.thoughtSignature === "skip_thought_signature_validator") {
|
|
18549
|
+
part.thoughtSignature = part.functionCall.thoughtSignature;
|
|
18550
|
+
}
|
|
18551
|
+
delete part.functionCall.thoughtSignature;
|
|
18552
|
+
}
|
|
18553
|
+
allFunctionParts.push(part);
|
|
18457
18554
|
}
|
|
18458
18555
|
}
|
|
18459
18556
|
}
|
|
18460
18557
|
}
|
|
18461
|
-
if (
|
|
18462
|
-
const
|
|
18463
|
-
if (!
|
|
18464
|
-
|
|
18558
|
+
if (allFunctionParts.length > 0 && latestSig) {
|
|
18559
|
+
const lastPart = allFunctionParts[allFunctionParts.length - 1];
|
|
18560
|
+
if (!lastPart.thoughtSignature || lastPart.thoughtSignature === "skip_thought_signature_validator") {
|
|
18561
|
+
lastPart.thoughtSignature = latestSig;
|
|
18465
18562
|
}
|
|
18466
18563
|
}
|
|
18467
18564
|
}
|
|
@@ -19315,7 +19412,7 @@ function resolveThinkingConfigDefaults(provider) {
|
|
|
19315
19412
|
const providerOptions = provider && typeof provider === "object" ? provider.options ?? void 0 : void 0;
|
|
19316
19413
|
const providerThinkingConfig = providerOptions?.thinkingConfig;
|
|
19317
19414
|
const modelThinkingConfigByModel = {};
|
|
19318
|
-
for (const [modelId, model] of Object.entries(provider
|
|
19415
|
+
for (const [modelId, model] of Object.entries(provider?.models ?? {})) {
|
|
19319
19416
|
if (!model || typeof model !== "object") {
|
|
19320
19417
|
continue;
|
|
19321
19418
|
}
|