codex-multi-auth 0.1.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/LICENSE +1 -0
- package/README.md +162 -0
- package/assets/opencode-logo-ornate-dark.svg +18 -0
- package/assets/readme-hero.svg +31 -0
- package/config/README.md +87 -0
- package/config/minimal-opencode.json +13 -0
- package/config/opencode-legacy.json +571 -0
- package/config/opencode-modern.json +239 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3160 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accounts/rate-limits.d.ts +22 -0
- package/dist/lib/accounts/rate-limits.d.ts.map +1 -0
- package/dist/lib/accounts/rate-limits.js +63 -0
- package/dist/lib/accounts/rate-limits.js.map +1 -0
- package/dist/lib/accounts.d.ts +95 -0
- package/dist/lib/accounts.d.ts.map +1 -0
- package/dist/lib/accounts.js +668 -0
- package/dist/lib/accounts.js.map +1 -0
- package/dist/lib/audit.d.ts +45 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +131 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +56 -0
- package/dist/lib/auth/auth.d.ts.map +1 -0
- package/dist/lib/auth/auth.js +214 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/browser.d.ts +34 -0
- package/dist/lib/auth/browser.d.ts.map +1 -0
- package/dist/lib/auth/browser.js +185 -0
- package/dist/lib/auth/browser.js.map +1 -0
- package/dist/lib/auth/server.d.ts +24 -0
- package/dist/lib/auth/server.d.ts.map +1 -0
- package/dist/lib/auth/server.js +116 -0
- package/dist/lib/auth/server.js.map +1 -0
- package/dist/lib/auth/token-utils.d.ts +59 -0
- package/dist/lib/auth/token-utils.d.ts.map +1 -0
- package/dist/lib/auth/token-utils.js +331 -0
- package/dist/lib/auth/token-utils.js.map +1 -0
- package/dist/lib/auth-rate-limit.d.ts +20 -0
- package/dist/lib/auth-rate-limit.d.ts.map +1 -0
- package/dist/lib/auth-rate-limit.js +91 -0
- package/dist/lib/auth-rate-limit.js.map +1 -0
- package/dist/lib/auto-update-checker.d.ts +10 -0
- package/dist/lib/auto-update-checker.d.ts.map +1 -0
- package/dist/lib/auto-update-checker.js +216 -0
- package/dist/lib/auto-update-checker.js.map +1 -0
- package/dist/lib/capability-policy.d.ts +18 -0
- package/dist/lib/capability-policy.d.ts.map +1 -0
- package/dist/lib/capability-policy.js +150 -0
- package/dist/lib/capability-policy.js.map +1 -0
- package/dist/lib/circuit-breaker.d.ts +34 -0
- package/dist/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.js +124 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/cli.d.ts +64 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/cli.js +274 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/codex-cli/observability.d.ts +22 -0
- package/dist/lib/codex-cli/observability.d.ts.map +1 -0
- package/dist/lib/codex-cli/observability.js +36 -0
- package/dist/lib/codex-cli/observability.js.map +1 -0
- package/dist/lib/codex-cli/state.d.ts +86 -0
- package/dist/lib/codex-cli/state.d.ts.map +1 -0
- package/dist/lib/codex-cli/state.js +470 -0
- package/dist/lib/codex-cli/state.js.map +1 -0
- package/dist/lib/codex-cli/sync.d.ts +27 -0
- package/dist/lib/codex-cli/sync.d.ts.map +1 -0
- package/dist/lib/codex-cli/sync.js +325 -0
- package/dist/lib/codex-cli/sync.js.map +1 -0
- package/dist/lib/codex-cli/writer.d.ts +12 -0
- package/dist/lib/codex-cli/writer.d.ts.map +1 -0
- package/dist/lib/codex-cli/writer.js +388 -0
- package/dist/lib/codex-cli/writer.js.map +1 -0
- package/dist/lib/codex-manager.d.ts +2 -0
- package/dist/lib/codex-manager.d.ts.map +1 -0
- package/dist/lib/codex-manager.js +4841 -0
- package/dist/lib/codex-manager.js.map +1 -0
- package/dist/lib/config.d.ts +269 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +789 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +78 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +78 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/context-overflow.d.ts +27 -0
- package/dist/lib/context-overflow.d.ts.map +1 -0
- package/dist/lib/context-overflow.js +124 -0
- package/dist/lib/context-overflow.js.map +1 -0
- package/dist/lib/dashboard-settings.d.ts +90 -0
- package/dist/lib/dashboard-settings.d.ts.map +1 -0
- package/dist/lib/dashboard-settings.js +327 -0
- package/dist/lib/dashboard-settings.js.map +1 -0
- package/dist/lib/entitlement-cache.d.ts +41 -0
- package/dist/lib/entitlement-cache.d.ts.map +1 -0
- package/dist/lib/entitlement-cache.js +137 -0
- package/dist/lib/entitlement-cache.js.map +1 -0
- package/dist/lib/errors.d.ts +113 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +103 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/forecast.d.ts +42 -0
- package/dist/lib/forecast.d.ts.map +1 -0
- package/dist/lib/forecast.js +256 -0
- package/dist/lib/forecast.js.map +1 -0
- package/dist/lib/health.d.ts +33 -0
- package/dist/lib/health.d.ts.map +1 -0
- package/dist/lib/health.js +70 -0
- package/dist/lib/health.js.map +1 -0
- package/dist/lib/index.d.ts +32 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +32 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/live-account-sync.d.ts +39 -0
- package/dist/lib/live-account-sync.d.ts.map +1 -0
- package/dist/lib/live-account-sync.js +196 -0
- package/dist/lib/live-account-sync.js.map +1 -0
- package/dist/lib/logger.d.ts +40 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +364 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/oauth-success.html +338 -0
- package/dist/lib/parallel-probe.d.ts +28 -0
- package/dist/lib/parallel-probe.d.ts.map +1 -0
- package/dist/lib/parallel-probe.js +97 -0
- package/dist/lib/parallel-probe.js.map +1 -0
- package/dist/lib/preemptive-quota-scheduler.d.ts +53 -0
- package/dist/lib/preemptive-quota-scheduler.d.ts.map +1 -0
- package/dist/lib/preemptive-quota-scheduler.js +220 -0
- package/dist/lib/preemptive-quota-scheduler.js.map +1 -0
- package/dist/lib/proactive-refresh.d.ts +66 -0
- package/dist/lib/proactive-refresh.d.ts.map +1 -0
- package/dist/lib/proactive-refresh.js +143 -0
- package/dist/lib/proactive-refresh.js.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.js +169 -0
- package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts +41 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +383 -0
- package/dist/lib/prompts/codex.js.map +1 -0
- package/dist/lib/prompts/opencode-codex.d.ts +25 -0
- package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-codex.js +270 -0
- package/dist/lib/prompts/opencode-codex.js.map +1 -0
- package/dist/lib/quota-cache.d.ts +68 -0
- package/dist/lib/quota-cache.d.ts.map +1 -0
- package/dist/lib/quota-cache.js +224 -0
- package/dist/lib/quota-cache.js.map +1 -0
- package/dist/lib/quota-probe.d.ts +49 -0
- package/dist/lib/quota-probe.d.ts.map +1 -0
- package/dist/lib/quota-probe.js +368 -0
- package/dist/lib/quota-probe.js.map +1 -0
- package/dist/lib/recovery/constants.d.ts +12 -0
- package/dist/lib/recovery/constants.d.ts.map +1 -0
- package/dist/lib/recovery/constants.js +31 -0
- package/dist/lib/recovery/constants.js.map +1 -0
- package/dist/lib/recovery/index.d.ts +12 -0
- package/dist/lib/recovery/index.d.ts.map +1 -0
- package/dist/lib/recovery/index.js +12 -0
- package/dist/lib/recovery/index.js.map +1 -0
- package/dist/lib/recovery/storage.d.ts +24 -0
- package/dist/lib/recovery/storage.d.ts.map +1 -0
- package/dist/lib/recovery/storage.js +362 -0
- package/dist/lib/recovery/storage.js.map +1 -0
- package/dist/lib/recovery/types.d.ts +116 -0
- package/dist/lib/recovery/types.d.ts.map +1 -0
- package/dist/lib/recovery/types.js +7 -0
- package/dist/lib/recovery/types.js.map +1 -0
- package/dist/lib/recovery.d.ts +31 -0
- package/dist/lib/recovery.d.ts.map +1 -0
- package/dist/lib/recovery.js +313 -0
- package/dist/lib/recovery.js.map +1 -0
- package/dist/lib/refresh-guardian.d.ts +31 -0
- package/dist/lib/refresh-guardian.d.ts.map +1 -0
- package/dist/lib/refresh-guardian.js +151 -0
- package/dist/lib/refresh-guardian.js.map +1 -0
- package/dist/lib/refresh-lease.d.ts +37 -0
- package/dist/lib/refresh-lease.d.ts.map +1 -0
- package/dist/lib/refresh-lease.js +335 -0
- package/dist/lib/refresh-lease.js.map +1 -0
- package/dist/lib/refresh-queue.d.ts +117 -0
- package/dist/lib/refresh-queue.d.ts.map +1 -0
- package/dist/lib/refresh-queue.js +297 -0
- package/dist/lib/refresh-queue.js.map +1 -0
- package/dist/lib/request/failure-policy.d.ts +42 -0
- package/dist/lib/request/failure-policy.d.ts.map +1 -0
- package/dist/lib/request/failure-policy.js +133 -0
- package/dist/lib/request/failure-policy.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +152 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +704 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/helpers/input-utils.d.ts +7 -0
- package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/input-utils.js +214 -0
- package/dist/lib/request/helpers/input-utils.js.map +1 -0
- package/dist/lib/request/helpers/model-map.d.ts +28 -0
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
- package/dist/lib/request/helpers/model-map.js +133 -0
- package/dist/lib/request/helpers/model-map.js.map +1 -0
- package/dist/lib/request/helpers/tool-utils.d.ts +29 -0
- package/dist/lib/request/helpers/tool-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/tool-utils.js +117 -0
- package/dist/lib/request/helpers/tool-utils.js.map +1 -0
- package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
- package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
- package/dist/lib/request/rate-limit-backoff.js +83 -0
- package/dist/lib/request/rate-limit-backoff.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +107 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +814 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +23 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +155 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/request/stream-failover.d.ts +21 -0
- package/dist/lib/request/stream-failover.d.ts.map +1 -0
- package/dist/lib/request/stream-failover.js +204 -0
- package/dist/lib/request/stream-failover.js.map +1 -0
- package/dist/lib/rotation.d.ts +146 -0
- package/dist/lib/rotation.d.ts.map +1 -0
- package/dist/lib/rotation.js +321 -0
- package/dist/lib/rotation.js.map +1 -0
- package/dist/lib/runtime-paths.d.ts +58 -0
- package/dist/lib/runtime-paths.d.ts.map +1 -0
- package/dist/lib/runtime-paths.js +164 -0
- package/dist/lib/runtime-paths.js.map +1 -0
- package/dist/lib/schemas.d.ts +435 -0
- package/dist/lib/schemas.d.ts.map +1 -0
- package/dist/lib/schemas.js +268 -0
- package/dist/lib/schemas.js.map +1 -0
- package/dist/lib/session-affinity.d.ts +23 -0
- package/dist/lib/session-affinity.d.ts.map +1 -0
- package/dist/lib/session-affinity.js +127 -0
- package/dist/lib/session-affinity.js.map +1 -0
- package/dist/lib/shutdown.d.ts +7 -0
- package/dist/lib/shutdown.d.ts.map +1 -0
- package/dist/lib/shutdown.js +43 -0
- package/dist/lib/shutdown.js.map +1 -0
- package/dist/lib/storage/migrations.d.ts +59 -0
- package/dist/lib/storage/migrations.d.ts.map +1 -0
- package/dist/lib/storage/migrations.js +41 -0
- package/dist/lib/storage/migrations.js.map +1 -0
- package/dist/lib/storage/paths.d.ts +51 -0
- package/dist/lib/storage/paths.d.ts.map +1 -0
- package/dist/lib/storage/paths.js +152 -0
- package/dist/lib/storage/paths.js.map +1 -0
- package/dist/lib/storage.d.ts +106 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +896 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/table-formatter.d.ts +32 -0
- package/dist/lib/table-formatter.d.ts.map +1 -0
- package/dist/lib/table-formatter.js +44 -0
- package/dist/lib/table-formatter.js.map +1 -0
- package/dist/lib/tools/hashline-tools.d.ts +51 -0
- package/dist/lib/tools/hashline-tools.d.ts.map +1 -0
- package/dist/lib/tools/hashline-tools.js +456 -0
- package/dist/lib/tools/hashline-tools.js.map +1 -0
- package/dist/lib/types.d.ts +130 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/ui/ansi.d.ts +40 -0
- package/dist/lib/ui/ansi.d.ts.map +1 -0
- package/dist/lib/ui/ansi.js +68 -0
- package/dist/lib/ui/ansi.js.map +1 -0
- package/dist/lib/ui/auth-menu.d.ts +76 -0
- package/dist/lib/ui/auth-menu.d.ts.map +1 -0
- package/dist/lib/ui/auth-menu.js +590 -0
- package/dist/lib/ui/auth-menu.js.map +1 -0
- package/dist/lib/ui/confirm.d.ts +11 -0
- package/dist/lib/ui/confirm.d.ts.map +1 -0
- package/dist/lib/ui/confirm.js +29 -0
- package/dist/lib/ui/confirm.js.map +1 -0
- package/dist/lib/ui/copy.d.ts +123 -0
- package/dist/lib/ui/copy.d.ts.map +1 -0
- package/dist/lib/ui/copy.js +127 -0
- package/dist/lib/ui/copy.js.map +1 -0
- package/dist/lib/ui/format.d.ts +62 -0
- package/dist/lib/ui/format.d.ts.map +1 -0
- package/dist/lib/ui/format.js +205 -0
- package/dist/lib/ui/format.js.map +1 -0
- package/dist/lib/ui/runtime.d.ts +43 -0
- package/dist/lib/ui/runtime.d.ts.map +1 -0
- package/dist/lib/ui/runtime.js +69 -0
- package/dist/lib/ui/runtime.js.map +1 -0
- package/dist/lib/ui/select.d.ts +60 -0
- package/dist/lib/ui/select.d.ts.map +1 -0
- package/dist/lib/ui/select.js +467 -0
- package/dist/lib/ui/select.js.map +1 -0
- package/dist/lib/ui/theme.d.ts +56 -0
- package/dist/lib/ui/theme.d.ts.map +1 -0
- package/dist/lib/ui/theme.js +186 -0
- package/dist/lib/ui/theme.js.map +1 -0
- package/dist/lib/unified-settings.d.ts +71 -0
- package/dist/lib/unified-settings.d.ts.map +1 -0
- package/dist/lib/unified-settings.js +299 -0
- package/dist/lib/unified-settings.js.map +1 -0
- package/dist/lib/utils.d.ts +29 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +54 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +115 -0
- package/scripts/audit-dev-allowlist.js +128 -0
- package/scripts/bench-format/hashline-v2.mjs +642 -0
- package/scripts/bench-format/models.mjs +105 -0
- package/scripts/bench-format/opencode.mjs +205 -0
- package/scripts/bench-format/render.mjs +496 -0
- package/scripts/bench-format/stats.mjs +54 -0
- package/scripts/bench-format/tasks.mjs +151 -0
- package/scripts/benchmark-edit-formats.mjs +1161 -0
- package/scripts/benchmark-render-dashboard.mjs +49 -0
- package/scripts/codex-multi-auth.js +6 -0
- package/scripts/codex-routing.js +34 -0
- package/scripts/codex.js +122 -0
- package/scripts/copy-oauth-success.js +37 -0
- package/scripts/install-opencode-codex-auth.js +193 -0
- package/scripts/test-all-models.sh +7 -0
- package/scripts/test-model-matrix.js +424 -0
- package/scripts/validate-model-map.sh +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-transformer.js","sourceRoot":"","sources":["../../../lib/request/request-transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert SSE stream response to JSON for generateText()
|
|
3
|
+
* @param response - Fetch response with SSE stream
|
|
4
|
+
* @param headers - Response headers
|
|
5
|
+
* @returns Response with JSON body
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertSseToJson(response: Response, headers: Headers, options?: {
|
|
8
|
+
streamStallTimeoutMs?: number;
|
|
9
|
+
}): Promise<Response>;
|
|
10
|
+
/**
|
|
11
|
+
* Ensure response has content-type header
|
|
12
|
+
* @param headers - Response headers
|
|
13
|
+
* @returns Headers with content-type set
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensureContentType(headers: Headers): Headers;
|
|
16
|
+
/**
|
|
17
|
+
* Check if a non-streaming response is empty or malformed.
|
|
18
|
+
* Returns true if the response body is empty, null, or lacks meaningful content.
|
|
19
|
+
* @param body - Parsed JSON body from the response
|
|
20
|
+
* @returns True if response should be considered empty/malformed
|
|
21
|
+
*/
|
|
22
|
+
export declare function isEmptyResponse(body: unknown): boolean;
|
|
23
|
+
//# sourceMappingURL=response-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-handler.d.ts","sourceRoot":"","sources":["../../../lib/request/response-handler.ts"],"names":[],"mappings":"AA4CA;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACrC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,QAAQ,CAAC,CAiEnB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAQ3D;AA2BD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAoBtD"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { createLogger, logRequest, LOGGING_ENABLED } from "../logger.js";
|
|
2
|
+
import { PLUGIN_NAME } from "../constants.js";
|
|
3
|
+
const log = createLogger("response-handler");
|
|
4
|
+
const MAX_SSE_SIZE = 10 * 1024 * 1024; // 10MB limit to prevent memory exhaustion
|
|
5
|
+
const DEFAULT_STREAM_STALL_TIMEOUT_MS = 45_000;
|
|
6
|
+
/**
|
|
7
|
+
|
|
8
|
+
* Parse SSE stream to extract final response
|
|
9
|
+
* @param sseText - Complete SSE stream text
|
|
10
|
+
* @returns Final response object or null if not found
|
|
11
|
+
*/
|
|
12
|
+
function parseSseStream(sseText) {
|
|
13
|
+
const lines = sseText.split(/\r?\n/);
|
|
14
|
+
for (const line of lines) {
|
|
15
|
+
const trimmedLine = line.trim();
|
|
16
|
+
if (trimmedLine.startsWith('data: ')) {
|
|
17
|
+
const payload = trimmedLine.substring(6).trim();
|
|
18
|
+
if (!payload || payload === '[DONE]')
|
|
19
|
+
continue;
|
|
20
|
+
try {
|
|
21
|
+
const data = JSON.parse(payload);
|
|
22
|
+
if (data.type === 'error') {
|
|
23
|
+
log.error("SSE error event received", { error: data });
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
if (data.type === 'response.done' || data.type === 'response.completed') {
|
|
27
|
+
return data.response;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Skip malformed JSON
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Convert SSE stream response to JSON for generateText()
|
|
39
|
+
* @param response - Fetch response with SSE stream
|
|
40
|
+
* @param headers - Response headers
|
|
41
|
+
* @returns Response with JSON body
|
|
42
|
+
*/
|
|
43
|
+
export async function convertSseToJson(response, headers, options) {
|
|
44
|
+
if (!response.body) {
|
|
45
|
+
throw new Error(`[${PLUGIN_NAME}] Response has no body`);
|
|
46
|
+
}
|
|
47
|
+
const reader = response.body.getReader();
|
|
48
|
+
const decoder = new TextDecoder();
|
|
49
|
+
let fullText = '';
|
|
50
|
+
const streamStallTimeoutMs = Math.max(1_000, Math.floor(options?.streamStallTimeoutMs ?? DEFAULT_STREAM_STALL_TIMEOUT_MS));
|
|
51
|
+
try {
|
|
52
|
+
// Consume the entire stream
|
|
53
|
+
while (true) {
|
|
54
|
+
const { done, value } = await readWithTimeout(reader, streamStallTimeoutMs);
|
|
55
|
+
if (done)
|
|
56
|
+
break;
|
|
57
|
+
fullText += decoder.decode(value, { stream: true });
|
|
58
|
+
if (fullText.length > MAX_SSE_SIZE) {
|
|
59
|
+
throw new Error(`SSE response exceeds ${MAX_SSE_SIZE} bytes limit`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (LOGGING_ENABLED) {
|
|
63
|
+
logRequest("stream-full", { fullContent: fullText });
|
|
64
|
+
}
|
|
65
|
+
// Parse SSE events to extract the final response
|
|
66
|
+
const finalResponse = parseSseStream(fullText);
|
|
67
|
+
if (!finalResponse) {
|
|
68
|
+
log.warn("Could not find final response in SSE stream");
|
|
69
|
+
logRequest("stream-error", { error: "No response.done event found" });
|
|
70
|
+
// Return original stream if we can't parse
|
|
71
|
+
return new Response(fullText, {
|
|
72
|
+
status: response.status,
|
|
73
|
+
statusText: response.statusText,
|
|
74
|
+
headers: headers,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Return as plain JSON (not SSE)
|
|
78
|
+
const jsonHeaders = new Headers(headers);
|
|
79
|
+
jsonHeaders.set('content-type', 'application/json; charset=utf-8');
|
|
80
|
+
return new Response(JSON.stringify(finalResponse), {
|
|
81
|
+
status: response.status,
|
|
82
|
+
statusText: response.statusText,
|
|
83
|
+
headers: jsonHeaders,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
log.error("Error converting stream", { error: String(error) });
|
|
88
|
+
logRequest("stream-error", { error: String(error) });
|
|
89
|
+
if (typeof reader.cancel === "function") {
|
|
90
|
+
await reader.cancel(String(error)).catch(() => { });
|
|
91
|
+
}
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
// Release the reader lock to prevent resource leaks
|
|
96
|
+
reader.releaseLock();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Ensure response has content-type header
|
|
101
|
+
* @param headers - Response headers
|
|
102
|
+
* @returns Headers with content-type set
|
|
103
|
+
*/
|
|
104
|
+
export function ensureContentType(headers) {
|
|
105
|
+
const responseHeaders = new Headers(headers);
|
|
106
|
+
if (!responseHeaders.has('content-type')) {
|
|
107
|
+
responseHeaders.set('content-type', 'text/event-stream; charset=utf-8');
|
|
108
|
+
}
|
|
109
|
+
return responseHeaders;
|
|
110
|
+
}
|
|
111
|
+
async function readWithTimeout(reader, timeoutMs) {
|
|
112
|
+
let timeoutId;
|
|
113
|
+
try {
|
|
114
|
+
return await Promise.race([
|
|
115
|
+
reader.read(),
|
|
116
|
+
new Promise((_, reject) => {
|
|
117
|
+
timeoutId = setTimeout(() => {
|
|
118
|
+
reject(new Error(`SSE stream stalled for ${timeoutMs}ms while waiting for response.done`));
|
|
119
|
+
}, timeoutMs);
|
|
120
|
+
}),
|
|
121
|
+
]);
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
if (timeoutId !== undefined) {
|
|
125
|
+
clearTimeout(timeoutId);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if a non-streaming response is empty or malformed.
|
|
131
|
+
* Returns true if the response body is empty, null, or lacks meaningful content.
|
|
132
|
+
* @param body - Parsed JSON body from the response
|
|
133
|
+
* @returns True if response should be considered empty/malformed
|
|
134
|
+
*/
|
|
135
|
+
export function isEmptyResponse(body) {
|
|
136
|
+
if (body === null || body === undefined)
|
|
137
|
+
return true;
|
|
138
|
+
if (typeof body === 'string' && body.trim() === '')
|
|
139
|
+
return true;
|
|
140
|
+
if (typeof body !== 'object')
|
|
141
|
+
return false;
|
|
142
|
+
const obj = body;
|
|
143
|
+
if (Object.keys(obj).length === 0)
|
|
144
|
+
return true;
|
|
145
|
+
const hasOutput = 'output' in obj && obj.output !== null && obj.output !== undefined;
|
|
146
|
+
const hasChoices = 'choices' in obj && Array.isArray(obj.choices) &&
|
|
147
|
+
obj.choices.some(c => c !== null && c !== undefined && typeof c === 'object' && Object.keys(c).length > 0);
|
|
148
|
+
const hasContent = 'content' in obj && obj.content !== null && obj.content !== undefined &&
|
|
149
|
+
(typeof obj.content !== 'string' || obj.content.trim() !== '');
|
|
150
|
+
if ('id' in obj || 'object' in obj || 'model' in obj) {
|
|
151
|
+
return !hasOutput && !hasChoices && !hasContent;
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=response-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-handler.js","sourceRoot":"","sources":["../../../lib/request/response-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface StreamFailoverOptions {
|
|
2
|
+
maxFailovers?: number;
|
|
3
|
+
stallTimeoutMs?: number;
|
|
4
|
+
softTimeoutMs?: number;
|
|
5
|
+
hardTimeoutMs?: number;
|
|
6
|
+
requestInstanceId?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Wraps an SSE-like streaming Response so the stream can switch to fallback sources on stalls or errors to keep the client session alive.
|
|
10
|
+
*
|
|
11
|
+
* The returned Response streams bytes from the initialResponse body and, when the stream stalls or errors, will attempt up to `maxFailovers` failovers by calling `getFallbackResponse(attempt, emittedBytes)`. On each successful failover a textual marker is injected into the stream identifying the failover attempt (and `requestInstanceId` when provided). The function performs best-effort cleanup of underlying readers and enforces soft/hard read timeouts as configured via `options`.
|
|
12
|
+
*
|
|
13
|
+
* Concurrency assumptions: the implementation expects a single consumer reading the returned Response body; callers must not concurrently read the same stream body from multiple consumers. Filesystem/platform note: behavior is platform-agnostic; no filesystem access is performed (Windows-specific filesystem semantics do not apply). Token redaction: any request identifiers embedded in the injected marker are limited to the normalized `requestInstanceId` (trimmed and truncated to 64 chars) to avoid leaking long tokens.
|
|
14
|
+
*
|
|
15
|
+
* @param initialResponse - The original Response whose body will be streamed and monitored for stalls/errors.
|
|
16
|
+
* @param getFallbackResponse - Async function invoked for each failover attempt with the 1-based attempt number and total emitted bytes; should return a Response with a streaming body to switch to, or `null`/a Response without a body to indicate no fallback.
|
|
17
|
+
* @param options - Optional failover configuration (maxFailovers, stall/soft/hard timeout overrides, requestInstanceId). `requestInstanceId` will be normalized and truncated to 64 characters.
|
|
18
|
+
* @returns A new Response that streams data from the initial response but may switch to fallback responses on stall/error, preserving the original status, statusText, and content-type header.
|
|
19
|
+
*/
|
|
20
|
+
export declare function withStreamingFailover(initialResponse: Response, getFallbackResponse: (attempt: number, emittedBytes: number) => Promise<Response | null>, options?: StreamFailoverOptions): Response;
|
|
21
|
+
//# sourceMappingURL=stream-failover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-failover.d.ts","sourceRoot":"","sources":["../../../lib/request/stream-failover.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA8FD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACpC,eAAe,EAAE,QAAQ,EACzB,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,EACxF,OAAO,GAAE,qBAA0B,GACjC,QAAQ,CAmHV"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { ensureContentType } from "./response-handler.js";
|
|
2
|
+
const DEFAULT_MAX_FAILOVERS = 1;
|
|
3
|
+
const DEFAULT_STALL_TIMEOUT_MS = 45_000;
|
|
4
|
+
const DEFAULT_SOFT_TIMEOUT_MS = 15_000;
|
|
5
|
+
const MAX_REQUEST_INSTANCE_ID_LENGTH = 64;
|
|
6
|
+
class StallTimeoutError extends Error {
|
|
7
|
+
isStallTimeout = true;
|
|
8
|
+
constructor(timeoutMs) {
|
|
9
|
+
super(`SSE stream stalled for ${timeoutMs}ms`);
|
|
10
|
+
this.name = "StallTimeoutError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Read a single chunk from `reader`, rejecting if no chunk is produced within `timeoutMs`.
|
|
15
|
+
*
|
|
16
|
+
* Assumes the provided reader is not read concurrently by other callers. This function performs no filesystem I/O (behavior is unaffected by Windows filesystem semantics) and does not perform token redaction or logging of stream contents.
|
|
17
|
+
*
|
|
18
|
+
* @param reader - The ReadableStreamDefaultReader to read from.
|
|
19
|
+
* @param timeoutMs - Maximum time in milliseconds to wait for a chunk before rejecting.
|
|
20
|
+
* @returns The result of `reader.read()`: an object with `done` and `value` (`Uint8Array | undefined`).
|
|
21
|
+
*/
|
|
22
|
+
async function readChunkWithTimeout(readPromise, timeoutMs) {
|
|
23
|
+
let timeoutId;
|
|
24
|
+
try {
|
|
25
|
+
return await Promise.race([
|
|
26
|
+
readPromise,
|
|
27
|
+
new Promise((_, reject) => {
|
|
28
|
+
timeoutId = setTimeout(() => {
|
|
29
|
+
reject(new StallTimeoutError(timeoutMs));
|
|
30
|
+
}, timeoutMs);
|
|
31
|
+
}),
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
if (timeoutId !== undefined) {
|
|
36
|
+
clearTimeout(timeoutId);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Determines whether an error indicates an SSE stream stall timeout.
|
|
42
|
+
*
|
|
43
|
+
* Concurrency: safe to call from multiple async contexts. Windows filesystem: not applicable. Token redaction: this function only inspects the error message and does not log or expose sensitive tokens.
|
|
44
|
+
*
|
|
45
|
+
* @param error - The value to inspect for a stall-timeout error
|
|
46
|
+
* @returns `true` if `error` is an `Error` whose message contains "SSE stream stalled for", `false` otherwise.
|
|
47
|
+
*/
|
|
48
|
+
function isStallTimeoutError(error) {
|
|
49
|
+
if (error instanceof StallTimeoutError)
|
|
50
|
+
return true;
|
|
51
|
+
if (!error || typeof error !== "object")
|
|
52
|
+
return false;
|
|
53
|
+
const candidate = error;
|
|
54
|
+
if (candidate.isStallTimeout === true)
|
|
55
|
+
return true;
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Normalize a request instance identifier by trimming whitespace and enforcing a maximum length.
|
|
60
|
+
*
|
|
61
|
+
* This function is pure and safe for concurrent use; it performs no I/O or filesystem operations (behavior is OS-independent, including Windows). It truncates long identifiers to MAX_REQUEST_INSTANCE_ID_LENGTH but does not mask or redact content — callers should apply any token-redaction or masking required for logs or telemetry.
|
|
62
|
+
*
|
|
63
|
+
* @param value - The raw identifier value which may be undefined or contain surrounding whitespace
|
|
64
|
+
* @returns The trimmed identifier if non-empty and within the length limit, a truncated identifier if longer than the limit, or `null` if the input is undefined or empty after trimming
|
|
65
|
+
*/
|
|
66
|
+
function normalizeRequestInstanceId(value) {
|
|
67
|
+
if (!value)
|
|
68
|
+
return null;
|
|
69
|
+
const trimmed = value.trim();
|
|
70
|
+
if (!trimmed)
|
|
71
|
+
return null;
|
|
72
|
+
if (trimmed.length <= MAX_REQUEST_INSTANCE_ID_LENGTH)
|
|
73
|
+
return trimmed;
|
|
74
|
+
return trimmed.slice(0, MAX_REQUEST_INSTANCE_ID_LENGTH);
|
|
75
|
+
}
|
|
76
|
+
async function readChunkWithSoftHardTimeout(reader, softTimeoutMs, hardTimeoutMs) {
|
|
77
|
+
const readPromise = reader.read();
|
|
78
|
+
try {
|
|
79
|
+
return await readChunkWithTimeout(readPromise, softTimeoutMs);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (!isStallTimeoutError(error) || hardTimeoutMs <= softTimeoutMs) {
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
return readChunkWithTimeout(readPromise, hardTimeoutMs - softTimeoutMs);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Wraps an SSE-like streaming Response so the stream can switch to fallback sources on stalls or errors to keep the client session alive.
|
|
90
|
+
*
|
|
91
|
+
* The returned Response streams bytes from the initialResponse body and, when the stream stalls or errors, will attempt up to `maxFailovers` failovers by calling `getFallbackResponse(attempt, emittedBytes)`. On each successful failover a textual marker is injected into the stream identifying the failover attempt (and `requestInstanceId` when provided). The function performs best-effort cleanup of underlying readers and enforces soft/hard read timeouts as configured via `options`.
|
|
92
|
+
*
|
|
93
|
+
* Concurrency assumptions: the implementation expects a single consumer reading the returned Response body; callers must not concurrently read the same stream body from multiple consumers. Filesystem/platform note: behavior is platform-agnostic; no filesystem access is performed (Windows-specific filesystem semantics do not apply). Token redaction: any request identifiers embedded in the injected marker are limited to the normalized `requestInstanceId` (trimmed and truncated to 64 chars) to avoid leaking long tokens.
|
|
94
|
+
*
|
|
95
|
+
* @param initialResponse - The original Response whose body will be streamed and monitored for stalls/errors.
|
|
96
|
+
* @param getFallbackResponse - Async function invoked for each failover attempt with the 1-based attempt number and total emitted bytes; should return a Response with a streaming body to switch to, or `null`/a Response without a body to indicate no fallback.
|
|
97
|
+
* @param options - Optional failover configuration (maxFailovers, stall/soft/hard timeout overrides, requestInstanceId). `requestInstanceId` will be normalized and truncated to 64 characters.
|
|
98
|
+
* @returns A new Response that streams data from the initial response but may switch to fallback responses on stall/error, preserving the original status, statusText, and content-type header.
|
|
99
|
+
*/
|
|
100
|
+
export function withStreamingFailover(initialResponse, getFallbackResponse, options = {}) {
|
|
101
|
+
const maxFailovers = Math.max(0, Math.floor(options.maxFailovers ?? DEFAULT_MAX_FAILOVERS));
|
|
102
|
+
const defaultHardTimeoutMs = options.stallTimeoutMs ?? DEFAULT_STALL_TIMEOUT_MS;
|
|
103
|
+
const softTimeoutMs = Math.max(1_000, Math.floor(options.softTimeoutMs ?? Math.min(defaultHardTimeoutMs, DEFAULT_SOFT_TIMEOUT_MS)));
|
|
104
|
+
const hardTimeoutMs = Math.max(softTimeoutMs, Math.floor(options.hardTimeoutMs ?? defaultHardTimeoutMs));
|
|
105
|
+
const requestInstanceId = normalizeRequestInstanceId(options.requestInstanceId);
|
|
106
|
+
const headers = ensureContentType(initialResponse.headers);
|
|
107
|
+
if (!initialResponse.body || maxFailovers <= 0) {
|
|
108
|
+
return initialResponse;
|
|
109
|
+
}
|
|
110
|
+
let closed = false;
|
|
111
|
+
let releaseCurrentReaderForCancel = null;
|
|
112
|
+
const body = new ReadableStream({
|
|
113
|
+
start(controller) {
|
|
114
|
+
let currentReader = initialResponse.body?.getReader() ?? null;
|
|
115
|
+
let failoverAttempt = 0;
|
|
116
|
+
let emittedBytes = 0;
|
|
117
|
+
const releaseCurrentReader = async () => {
|
|
118
|
+
if (!currentReader)
|
|
119
|
+
return;
|
|
120
|
+
try {
|
|
121
|
+
await currentReader.cancel();
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Best effort.
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
currentReader.releaseLock();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Best effort.
|
|
131
|
+
}
|
|
132
|
+
currentReader = null;
|
|
133
|
+
};
|
|
134
|
+
releaseCurrentReaderForCancel = releaseCurrentReader;
|
|
135
|
+
const tryFailover = async () => {
|
|
136
|
+
if (failoverAttempt >= maxFailovers) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
failoverAttempt += 1;
|
|
140
|
+
const fallback = await getFallbackResponse(failoverAttempt, emittedBytes);
|
|
141
|
+
if (!fallback?.body) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
await releaseCurrentReader();
|
|
145
|
+
const markerLabel = requestInstanceId
|
|
146
|
+
? `: codex-multi-auth failover ${failoverAttempt} req:${requestInstanceId}\n\n`
|
|
147
|
+
: `: codex-multi-auth failover ${failoverAttempt}\n\n`;
|
|
148
|
+
const marker = new TextEncoder().encode(markerLabel);
|
|
149
|
+
controller.enqueue(marker);
|
|
150
|
+
currentReader = fallback.body.getReader();
|
|
151
|
+
return true;
|
|
152
|
+
};
|
|
153
|
+
const pump = async () => {
|
|
154
|
+
while (!closed && currentReader) {
|
|
155
|
+
try {
|
|
156
|
+
const result = await readChunkWithSoftHardTimeout(currentReader, softTimeoutMs, hardTimeoutMs);
|
|
157
|
+
if (result.done) {
|
|
158
|
+
closed = true;
|
|
159
|
+
controller.close();
|
|
160
|
+
await releaseCurrentReader();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (result.value && result.value.byteLength > 0) {
|
|
164
|
+
emittedBytes += result.value.byteLength;
|
|
165
|
+
controller.enqueue(result.value);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
let switched = false;
|
|
170
|
+
try {
|
|
171
|
+
switched = await tryFailover();
|
|
172
|
+
}
|
|
173
|
+
catch (failoverError) {
|
|
174
|
+
closed = true;
|
|
175
|
+
await releaseCurrentReader();
|
|
176
|
+
controller.error(failoverError);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (switched) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
closed = true;
|
|
183
|
+
await releaseCurrentReader();
|
|
184
|
+
controller.error(error);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
void pump();
|
|
190
|
+
},
|
|
191
|
+
cancel() {
|
|
192
|
+
closed = true;
|
|
193
|
+
if (releaseCurrentReaderForCancel) {
|
|
194
|
+
void releaseCurrentReaderForCancel();
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
return new Response(body, {
|
|
199
|
+
status: initialResponse.status,
|
|
200
|
+
statusText: initialResponse.statusText,
|
|
201
|
+
headers,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=stream-failover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-failover.js","sourceRoot":"","sources":["../../../lib/request/stream-failover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rotation Strategy Module
|
|
3
|
+
*
|
|
4
|
+
* Implements health-based account selection with token bucket rate limiting.
|
|
5
|
+
* Ported from antigravity-auth rotation logic for optimal account rotation
|
|
6
|
+
* when rate limits are encountered.
|
|
7
|
+
*/
|
|
8
|
+
export interface HealthScoreConfig {
|
|
9
|
+
/** Points added on successful request */
|
|
10
|
+
successDelta: number;
|
|
11
|
+
/** Points deducted on rate limit (negative) */
|
|
12
|
+
rateLimitDelta: number;
|
|
13
|
+
/** Points deducted on other failures (negative) */
|
|
14
|
+
failureDelta: number;
|
|
15
|
+
/** Maximum health score */
|
|
16
|
+
maxScore: number;
|
|
17
|
+
/** Minimum health score */
|
|
18
|
+
minScore: number;
|
|
19
|
+
/** Points recovered per hour of inactivity */
|
|
20
|
+
passiveRecoveryPerHour: number;
|
|
21
|
+
}
|
|
22
|
+
export declare const DEFAULT_HEALTH_SCORE_CONFIG: HealthScoreConfig;
|
|
23
|
+
/**
|
|
24
|
+
* Tracks health scores for accounts to prioritize healthy accounts.
|
|
25
|
+
* Accounts with higher health scores are preferred for selection.
|
|
26
|
+
*/
|
|
27
|
+
export declare class HealthScoreTracker {
|
|
28
|
+
private entries;
|
|
29
|
+
private config;
|
|
30
|
+
constructor(config?: Partial<HealthScoreConfig>);
|
|
31
|
+
private getKey;
|
|
32
|
+
private applyPassiveRecovery;
|
|
33
|
+
getScore(accountIndex: number, quotaKey?: string): number;
|
|
34
|
+
getConsecutiveFailures(accountIndex: number, quotaKey?: string): number;
|
|
35
|
+
recordSuccess(accountIndex: number, quotaKey?: string): void;
|
|
36
|
+
recordRateLimit(accountIndex: number, quotaKey?: string): void;
|
|
37
|
+
recordFailure(accountIndex: number, quotaKey?: string): void;
|
|
38
|
+
reset(accountIndex: number, quotaKey?: string): void;
|
|
39
|
+
clear(): void;
|
|
40
|
+
}
|
|
41
|
+
export interface TokenBucketConfig {
|
|
42
|
+
/** Maximum tokens in bucket */
|
|
43
|
+
maxTokens: number;
|
|
44
|
+
/** Tokens regenerated per minute */
|
|
45
|
+
tokensPerMinute: number;
|
|
46
|
+
}
|
|
47
|
+
export declare const DEFAULT_TOKEN_BUCKET_CONFIG: TokenBucketConfig;
|
|
48
|
+
/**
|
|
49
|
+
* Client-side token bucket for rate limiting requests per account.
|
|
50
|
+
* Prevents sending requests to accounts that are likely to be rate-limited.
|
|
51
|
+
*/
|
|
52
|
+
export declare class TokenBucketTracker {
|
|
53
|
+
private buckets;
|
|
54
|
+
private config;
|
|
55
|
+
constructor(config?: Partial<TokenBucketConfig>);
|
|
56
|
+
private getKey;
|
|
57
|
+
private refillTokens;
|
|
58
|
+
getTokens(accountIndex: number, quotaKey?: string): number;
|
|
59
|
+
/**
|
|
60
|
+
* Attempt to consume a token. Returns true if successful, false if bucket is empty.
|
|
61
|
+
*/
|
|
62
|
+
tryConsume(accountIndex: number, quotaKey?: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Attempt to refund a token consumed within the refund window.
|
|
65
|
+
* Use this when a request fails due to network errors (not rate limits).
|
|
66
|
+
* @returns true if refund was successful, false if no valid consumption found
|
|
67
|
+
*/
|
|
68
|
+
refundToken(accountIndex: number, quotaKey?: string): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Drain tokens on rate limit to prevent immediate retries.
|
|
71
|
+
*/
|
|
72
|
+
drain(accountIndex: number, quotaKey?: string, drainAmount?: number): void;
|
|
73
|
+
reset(accountIndex: number, quotaKey?: string): void;
|
|
74
|
+
clear(): void;
|
|
75
|
+
}
|
|
76
|
+
export interface AccountWithMetrics {
|
|
77
|
+
index: number;
|
|
78
|
+
isAvailable: boolean;
|
|
79
|
+
lastUsed: number;
|
|
80
|
+
}
|
|
81
|
+
export interface HybridSelectionConfig {
|
|
82
|
+
/** Weight for health score (default: 2) */
|
|
83
|
+
healthWeight: number;
|
|
84
|
+
/** Weight for token count (default: 5) */
|
|
85
|
+
tokenWeight: number;
|
|
86
|
+
/** Weight for freshness/last used (default: 0.1) */
|
|
87
|
+
freshnessWeight: number;
|
|
88
|
+
}
|
|
89
|
+
export declare const DEFAULT_HYBRID_SELECTION_CONFIG: HybridSelectionConfig;
|
|
90
|
+
/**
|
|
91
|
+
* Selects the best account using a hybrid scoring strategy.
|
|
92
|
+
*
|
|
93
|
+
* Score = (health * healthWeight) + (tokens * tokenWeight) + (freshness * freshnessWeight)
|
|
94
|
+
*
|
|
95
|
+
* Where:
|
|
96
|
+
* - health: Account health score (0-100)
|
|
97
|
+
* - tokens: Available tokens in bucket (0-maxTokens)
|
|
98
|
+
* - freshness: Hours since last used (higher = more fresh for rotation)
|
|
99
|
+
*/
|
|
100
|
+
export interface HybridSelectionOptions {
|
|
101
|
+
pidOffsetEnabled?: boolean;
|
|
102
|
+
scoreBoostByAccount?: Record<number, number>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Selects the best account from a set using a weighted hybrid score composed of health, token availability, and freshness.
|
|
106
|
+
*
|
|
107
|
+
* @param accounts - Candidate accounts with availability (`isAvailable`) and last-used timestamp (`lastUsed`); when none are available the least-recently-used account is returned.
|
|
108
|
+
* @param healthTracker - Tracker used to obtain per-account health scores (scoped by `quotaKey` when provided).
|
|
109
|
+
* @param tokenTracker - Tracker used to obtain per-account token counts (scoped by `quotaKey` when provided). Logged token values are rounded for telemetry and sensitive tokens are not emitted.
|
|
110
|
+
* @param quotaKey - Optional quota key to scope health and token lookups.
|
|
111
|
+
* @param config - Partial selection weights that override defaults (healthWeight, tokenWeight, freshnessWeight).
|
|
112
|
+
* @param options - Selection options. `pidOffsetEnabled` adds a small PID-based deterministic offset to distribute selection across processes. `scoreBoostByAccount` is an optional per-account numeric boost keyed by account index.
|
|
113
|
+
* @returns The chosen AccountWithMetrics for the next request, or `null` if no accounts exist.
|
|
114
|
+
*
|
|
115
|
+
* Concurrency & environment notes:
|
|
116
|
+
* - Selection is deterministic given the same inputs except when `pidOffsetEnabled` is used to bias selection per-process.
|
|
117
|
+
* - The function is purely in-memory and performs no filesystem operations (no Windows filesystem considerations).
|
|
118
|
+
*/
|
|
119
|
+
export declare function selectHybridAccount(accounts: AccountWithMetrics[], healthTracker: HealthScoreTracker, tokenTracker: TokenBucketTracker, quotaKey?: string, config?: Partial<HybridSelectionConfig>, options?: HybridSelectionOptions): AccountWithMetrics | null;
|
|
120
|
+
/**
|
|
121
|
+
* Adds random jitter to a delay value.
|
|
122
|
+
* @param baseMs - Base delay in milliseconds
|
|
123
|
+
* @param jitterFactor - Jitter factor (0-1), default 0.1 (10%)
|
|
124
|
+
* @returns Delay with jitter applied
|
|
125
|
+
*/
|
|
126
|
+
export declare function addJitter(baseMs: number, jitterFactor?: number): number;
|
|
127
|
+
/**
|
|
128
|
+
* Returns a random delay within a range.
|
|
129
|
+
* @param minMs - Minimum delay in milliseconds
|
|
130
|
+
* @param maxMs - Maximum delay in milliseconds
|
|
131
|
+
* @returns Random delay within range
|
|
132
|
+
*/
|
|
133
|
+
export declare function randomDelay(minMs: number, maxMs: number): number;
|
|
134
|
+
/**
|
|
135
|
+
* Calculates exponential backoff with jitter.
|
|
136
|
+
* @param attempt - Attempt number (1-based)
|
|
137
|
+
* @param baseMs - Base delay in milliseconds
|
|
138
|
+
* @param maxMs - Maximum delay in milliseconds
|
|
139
|
+
* @param jitterFactor - Jitter factor (0-1)
|
|
140
|
+
* @returns Backoff delay with jitter
|
|
141
|
+
*/
|
|
142
|
+
export declare function exponentialBackoff(attempt: number, baseMs?: number, maxMs?: number, jitterFactor?: number): number;
|
|
143
|
+
export declare function getHealthTracker(config?: Partial<HealthScoreConfig>): HealthScoreTracker;
|
|
144
|
+
export declare function getTokenTracker(config?: Partial<TokenBucketConfig>): TokenBucketTracker;
|
|
145
|
+
export declare function resetTrackers(): void;
|
|
146
|
+
//# sourceMappingURL=rotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotation.d.ts","sourceRoot":"","sources":["../../lib/rotation.ts"],"names":[],"mappings":"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"}
|