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,368 @@
|
|
|
1
|
+
import { CODEX_BASE_URL } from "./constants.js";
|
|
2
|
+
import { createCodexHeaders, getUnsupportedCodexModelInfo } from "./request/fetch-helpers.js";
|
|
3
|
+
import { getCodexInstructions } from "./prompts/codex.js";
|
|
4
|
+
import { isRecord } from "./utils.js";
|
|
5
|
+
const DEFAULT_QUOTA_PROBE_MODELS = ["gpt-5-codex", "gpt-5.3-codex", "gpt-5.2-codex"];
|
|
6
|
+
/**
|
|
7
|
+
* Parse an HTTP header value and return it as a finite number.
|
|
8
|
+
*
|
|
9
|
+
* This is synchronous, has no filesystem side effects, and is safe for concurrent use.
|
|
10
|
+
* Callers are responsible for any sensitive header handling or token redaction.
|
|
11
|
+
*
|
|
12
|
+
* @param headers - The Headers object to read the header from.
|
|
13
|
+
* @param name - The header name to parse.
|
|
14
|
+
* @returns The header value parsed as a finite number, or `undefined` if the header is missing or not a finite number.
|
|
15
|
+
*/
|
|
16
|
+
function parseFiniteNumberHeader(headers, name) {
|
|
17
|
+
const raw = headers.get(name);
|
|
18
|
+
if (!raw)
|
|
19
|
+
return undefined;
|
|
20
|
+
const parsed = Number(raw);
|
|
21
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse a header value as a base-10 integer and return it if it is a finite number.
|
|
25
|
+
*
|
|
26
|
+
* This function is pure and side-effect-free, safe for concurrent use, and performs no filesystem I/O.
|
|
27
|
+
* It does not redact or log header contents; treat header values as potentially sensitive and avoid exposing them.
|
|
28
|
+
*
|
|
29
|
+
* @param headers - The Headers object to read from
|
|
30
|
+
* @param name - The header name to parse
|
|
31
|
+
* @returns The parsed integer value, or `undefined` if the header is missing or not a finite integer
|
|
32
|
+
*/
|
|
33
|
+
function parseFiniteIntHeader(headers, name) {
|
|
34
|
+
const raw = headers.get(name);
|
|
35
|
+
if (!raw)
|
|
36
|
+
return undefined;
|
|
37
|
+
const parsed = Number.parseInt(raw, 10);
|
|
38
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compute the absolute millisecond timestamp when a quota window resets from Codex response headers.
|
|
42
|
+
*
|
|
43
|
+
* @param headers - Response Headers object containing reset information (e.g., `<prefix>-reset-after-seconds` or `<prefix>-reset-at`)
|
|
44
|
+
* @param prefix - Header name prefix (for example, `"primary"` or `"secondary"`)
|
|
45
|
+
* @returns The reset time as a Unix timestamp in milliseconds, or `undefined` if no valid reset information is present.
|
|
46
|
+
*
|
|
47
|
+
* Concurrency: pure and safe for concurrent use.
|
|
48
|
+
* Filesystem: performs no filesystem I/O and behaves identically on Windows.
|
|
49
|
+
* Security: does not emit or persist header values; callers must redact any sensitive tokens before storing or logging headers.
|
|
50
|
+
*/
|
|
51
|
+
function parseResetAtMs(headers, prefix) {
|
|
52
|
+
const resetAfterSeconds = parseFiniteIntHeader(headers, `${prefix}-reset-after-seconds`);
|
|
53
|
+
if (typeof resetAfterSeconds === "number" && resetAfterSeconds > 0) {
|
|
54
|
+
return Date.now() + resetAfterSeconds * 1000;
|
|
55
|
+
}
|
|
56
|
+
const resetAtRaw = headers.get(`${prefix}-reset-at`);
|
|
57
|
+
if (!resetAtRaw)
|
|
58
|
+
return undefined;
|
|
59
|
+
const trimmed = resetAtRaw.trim();
|
|
60
|
+
if (/^\d+$/.test(trimmed)) {
|
|
61
|
+
const parsedNumber = Number.parseInt(trimmed, 10);
|
|
62
|
+
if (Number.isFinite(parsedNumber) && parsedNumber > 0) {
|
|
63
|
+
return parsedNumber < 10_000_000_000 ? parsedNumber * 1000 : parsedNumber;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const parsedDate = Date.parse(trimmed);
|
|
67
|
+
return Number.isFinite(parsedDate) ? parsedDate : undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Detects whether the provided HTTP headers include any Codex quota-related keys.
|
|
71
|
+
*
|
|
72
|
+
* Inspects only header presence (no header values are read, logged, or written to disk). Safe to call concurrently; does not interact with the filesystem. Callers must ensure any sensitive tokens in headers are redacted before external logging.
|
|
73
|
+
*
|
|
74
|
+
* @param headers - The Headers object to check for Codex quota headers
|
|
75
|
+
* @returns `true` if at least one Codex quota header is present, `false` otherwise
|
|
76
|
+
*/
|
|
77
|
+
function hasCodexQuotaHeaders(headers) {
|
|
78
|
+
const keys = [
|
|
79
|
+
"x-codex-primary-used-percent",
|
|
80
|
+
"x-codex-primary-window-minutes",
|
|
81
|
+
"x-codex-primary-reset-at",
|
|
82
|
+
"x-codex-primary-reset-after-seconds",
|
|
83
|
+
"x-codex-secondary-used-percent",
|
|
84
|
+
"x-codex-secondary-window-minutes",
|
|
85
|
+
"x-codex-secondary-reset-at",
|
|
86
|
+
"x-codex-secondary-reset-after-seconds",
|
|
87
|
+
];
|
|
88
|
+
return keys.some((key) => headers.get(key) !== null);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Parse Codex quota-related HTTP headers into a quota snapshot (excluding the model).
|
|
92
|
+
*
|
|
93
|
+
* @param headers - HTTP response headers to read quota fields from; the function does not modify headers and performs no I/O.
|
|
94
|
+
* @param status - HTTP status code associated with the response; included verbatim in the returned snapshot when present.
|
|
95
|
+
* @returns An object with `status`, optional `planType`, optional `activeLimit`, and `primary`/`secondary` quota window objects when any Codex quota headers are present; `null` if no quota headers were found.
|
|
96
|
+
*
|
|
97
|
+
* Concurrency: safe to call concurrently from multiple tasks (pure header parsing with no shared state).
|
|
98
|
+
* Filesystem: performs no filesystem operations and is unaffected by platform path semantics (Windows or otherwise).
|
|
99
|
+
* Token redaction: this function does not redact or log header values; callers must ensure any sensitive tokens in `headers` are redacted before logging or persisting.
|
|
100
|
+
*/
|
|
101
|
+
function parseQuotaSnapshotBase(headers, status) {
|
|
102
|
+
if (!hasCodexQuotaHeaders(headers))
|
|
103
|
+
return null;
|
|
104
|
+
const primaryPrefix = "x-codex-primary";
|
|
105
|
+
const secondaryPrefix = "x-codex-secondary";
|
|
106
|
+
const primary = {
|
|
107
|
+
usedPercent: parseFiniteNumberHeader(headers, `${primaryPrefix}-used-percent`),
|
|
108
|
+
windowMinutes: parseFiniteIntHeader(headers, `${primaryPrefix}-window-minutes`),
|
|
109
|
+
resetAtMs: parseResetAtMs(headers, primaryPrefix),
|
|
110
|
+
};
|
|
111
|
+
const secondary = {
|
|
112
|
+
usedPercent: parseFiniteNumberHeader(headers, `${secondaryPrefix}-used-percent`),
|
|
113
|
+
windowMinutes: parseFiniteIntHeader(headers, `${secondaryPrefix}-window-minutes`),
|
|
114
|
+
resetAtMs: parseResetAtMs(headers, secondaryPrefix),
|
|
115
|
+
};
|
|
116
|
+
const planTypeRaw = headers.get("x-codex-plan-type");
|
|
117
|
+
const planType = planTypeRaw && planTypeRaw.trim() ? planTypeRaw.trim() : undefined;
|
|
118
|
+
const activeLimit = parseFiniteIntHeader(headers, "x-codex-active-limit");
|
|
119
|
+
return { status, planType, activeLimit, primary, secondary };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Build a deduplicated, trimmed list of candidate probe model names from a primary model and fallbacks.
|
|
123
|
+
*
|
|
124
|
+
* Produces a unique array where each entry is a non-empty, trimmed model string. Empty or whitespace-only
|
|
125
|
+
* inputs are ignored and duplicates are removed while preserving the first occurrence order.
|
|
126
|
+
*
|
|
127
|
+
* Concurrency assumptions: pure and side-effect-free — safe to call concurrently.
|
|
128
|
+
* Windows filesystem behavior: no filesystem interaction.
|
|
129
|
+
* Token redaction: does not log or retain authentication tokens; callers must redact tokens when logging model names if required.
|
|
130
|
+
*
|
|
131
|
+
* @param primaryModel - Optional preferred model name to try first
|
|
132
|
+
* @param fallbackModels - Optional array of fallback model names; if omitted, a built-in default list is used
|
|
133
|
+
* @returns An array of unique, trimmed model names to probe, in priority order
|
|
134
|
+
*/
|
|
135
|
+
function normalizeProbeModels(primaryModel, fallbackModels) {
|
|
136
|
+
const base = primaryModel?.trim();
|
|
137
|
+
const merged = [
|
|
138
|
+
base,
|
|
139
|
+
...(fallbackModels ?? DEFAULT_QUOTA_PROBE_MODELS),
|
|
140
|
+
].filter((model) => typeof model === "string" && model.trim().length > 0);
|
|
141
|
+
return Array.from(new Set(merged.map((model) => model.trim())));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Extracts the most informative error message from an HTTP response body.
|
|
145
|
+
*
|
|
146
|
+
* Safe for concurrent use and performs no filesystem access (including no Windows-specific file operations).
|
|
147
|
+
* This function does not redact tokens or other sensitive values from the returned message.
|
|
148
|
+
*
|
|
149
|
+
* @param bodyText - Raw response body text
|
|
150
|
+
* @param status - HTTP status code associated with the response
|
|
151
|
+
* @returns The best available message: `error.message` or `message` from parsed JSON if present, `HTTP <status>` when the body is empty, or the trimmed raw body text otherwise
|
|
152
|
+
*/
|
|
153
|
+
function extractErrorMessage(bodyText, status) {
|
|
154
|
+
const trimmed = bodyText.trim();
|
|
155
|
+
if (!trimmed)
|
|
156
|
+
return `HTTP ${status}`;
|
|
157
|
+
try {
|
|
158
|
+
const parsed = JSON.parse(trimmed);
|
|
159
|
+
if (isRecord(parsed)) {
|
|
160
|
+
const maybeError = parsed.error;
|
|
161
|
+
if (isRecord(maybeError) && typeof maybeError.message === "string") {
|
|
162
|
+
return maybeError.message;
|
|
163
|
+
}
|
|
164
|
+
if (typeof parsed.message === "string") {
|
|
165
|
+
return parsed.message;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Fall through to raw body text.
|
|
171
|
+
}
|
|
172
|
+
return trimmed;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Produce a short human-friendly label for a quota window duration.
|
|
176
|
+
*
|
|
177
|
+
* @param windowMinutes - Duration of the quota window in minutes; if undefined, non-finite, or <= 0 a generic label is returned
|
|
178
|
+
* @returns A short label: `Nd` when `windowMinutes` is divisible by 1440 (days), `Nh` when divisible by 60 (hours), `Nm` otherwise; returns `"quota"` for unspecified or invalid input
|
|
179
|
+
*
|
|
180
|
+
* Notes: safe for concurrent use, performs no filesystem I/O, and returns no sensitive tokens (safe for logging/display).
|
|
181
|
+
*/
|
|
182
|
+
function formatQuotaWindowLabel(windowMinutes) {
|
|
183
|
+
if (!windowMinutes || !Number.isFinite(windowMinutes) || windowMinutes <= 0) {
|
|
184
|
+
return "quota";
|
|
185
|
+
}
|
|
186
|
+
if (windowMinutes % 1440 === 0)
|
|
187
|
+
return `${windowMinutes / 1440}d`;
|
|
188
|
+
if (windowMinutes % 60 === 0)
|
|
189
|
+
return `${windowMinutes / 60}h`;
|
|
190
|
+
return `${windowMinutes}m`;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Format a millisecond epoch timestamp into a concise human-readable reset time.
|
|
194
|
+
*
|
|
195
|
+
* Returns a 24-hour time "HH:MM" when the timestamp is today, otherwise "HH:MM on Mon DD".
|
|
196
|
+
*
|
|
197
|
+
* This function has no side effects, is safe for concurrent use, does not access the filesystem,
|
|
198
|
+
* and produces no sensitive token data.
|
|
199
|
+
*
|
|
200
|
+
* @param resetAtMs - Timestamp in milliseconds since epoch; if `undefined`, non-finite, or <= 0, the function returns `undefined`.
|
|
201
|
+
* @returns The formatted reset time string, or `undefined` if `resetAtMs` is invalid or not provided.
|
|
202
|
+
*/
|
|
203
|
+
function formatResetAt(resetAtMs) {
|
|
204
|
+
if (!resetAtMs || !Number.isFinite(resetAtMs) || resetAtMs <= 0)
|
|
205
|
+
return undefined;
|
|
206
|
+
const date = new Date(resetAtMs);
|
|
207
|
+
if (!Number.isFinite(date.getTime()))
|
|
208
|
+
return undefined;
|
|
209
|
+
const now = new Date();
|
|
210
|
+
const sameDay = now.getFullYear() === date.getFullYear() &&
|
|
211
|
+
now.getMonth() === date.getMonth() &&
|
|
212
|
+
now.getDate() === date.getDate();
|
|
213
|
+
const time = date.toLocaleTimeString(undefined, {
|
|
214
|
+
hour: "2-digit",
|
|
215
|
+
minute: "2-digit",
|
|
216
|
+
hour12: false,
|
|
217
|
+
});
|
|
218
|
+
if (sameDay)
|
|
219
|
+
return time;
|
|
220
|
+
const day = date.toLocaleDateString(undefined, { month: "short", day: "2-digit" });
|
|
221
|
+
return `${time} on ${day}`;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Create a short human-readable summary for a quota window.
|
|
225
|
+
*
|
|
226
|
+
* Safe for concurrent use; does not access the filesystem and never includes or exposes sensitive tokens.
|
|
227
|
+
*
|
|
228
|
+
* @param label - Human-friendly label for the window (e.g., "2h", "7d", "quota")
|
|
229
|
+
* @param window - Quota window fields used to populate the summary (e.g., `usedPercent`, `resetAtMs`)
|
|
230
|
+
* @returns A single-line summary combining the label, percent left (if available), and reset time (if available), e.g. "2h 40% left (resets 14:05)"
|
|
231
|
+
*/
|
|
232
|
+
function formatWindowSummary(label, window) {
|
|
233
|
+
const used = window.usedPercent;
|
|
234
|
+
const left = typeof used === "number" && Number.isFinite(used)
|
|
235
|
+
? Math.max(0, Math.min(100, Math.round(100 - used)))
|
|
236
|
+
: undefined;
|
|
237
|
+
const reset = formatResetAt(window.resetAtMs);
|
|
238
|
+
let summary = label;
|
|
239
|
+
if (left !== undefined)
|
|
240
|
+
summary = `${summary} ${left}% left`;
|
|
241
|
+
if (reset)
|
|
242
|
+
summary = `${summary} (resets ${reset})`;
|
|
243
|
+
return summary;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Produce a single-line human-readable summary of a Codex quota snapshot.
|
|
247
|
+
*
|
|
248
|
+
* This pure, deterministic formatter is safe for concurrent use, performs no
|
|
249
|
+
* filesystem side effects (including on Windows), and never exposes secret
|
|
250
|
+
* tokens or other sensitive values.
|
|
251
|
+
*
|
|
252
|
+
* @param snapshot - The quota snapshot to format
|
|
253
|
+
* @returns A concise, comma-separated summary describing primary and secondary windows, optional plan and active limit, and `rate-limited` when the status is 429
|
|
254
|
+
*/
|
|
255
|
+
export function formatQuotaSnapshotLine(snapshot) {
|
|
256
|
+
const primaryLabel = formatQuotaWindowLabel(snapshot.primary.windowMinutes);
|
|
257
|
+
const secondaryLabel = formatQuotaWindowLabel(snapshot.secondary.windowMinutes);
|
|
258
|
+
const parts = [
|
|
259
|
+
formatWindowSummary(primaryLabel, snapshot.primary),
|
|
260
|
+
formatWindowSummary(secondaryLabel, snapshot.secondary),
|
|
261
|
+
];
|
|
262
|
+
if (snapshot.planType)
|
|
263
|
+
parts.push(`plan:${snapshot.planType}`);
|
|
264
|
+
if (typeof snapshot.activeLimit === "number" && Number.isFinite(snapshot.activeLimit)) {
|
|
265
|
+
parts.push(`active:${snapshot.activeLimit}`);
|
|
266
|
+
}
|
|
267
|
+
if (snapshot.status === 429)
|
|
268
|
+
parts.push("rate-limited");
|
|
269
|
+
return parts.join(", ");
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Probe Codex models sequentially to obtain a quota snapshot for the specified account.
|
|
273
|
+
*
|
|
274
|
+
* Concurrency: models are probed one-at-a-time (no parallel requests).
|
|
275
|
+
* Filesystem: performs no filesystem access and makes no Windows filesystem calls.
|
|
276
|
+
* Security: `accessToken` is sent in request headers and is treated as sensitive; tokens are not persisted or written to disk.
|
|
277
|
+
*
|
|
278
|
+
* @param options - Probe options including:
|
|
279
|
+
* - accountId: account identifier used for Codex requests
|
|
280
|
+
* - accessToken: bearer token for authentication (sensitive)
|
|
281
|
+
* - model: optional preferred model name to probe first
|
|
282
|
+
* - fallbackModels: optional list of fallback model names to try
|
|
283
|
+
* - timeoutMs: optional per-model timeout in milliseconds (bounded between 1000 and 60000; default 15000)
|
|
284
|
+
* @returns The first CodexQuotaSnapshot parsed from response quota headers, augmented with the model that produced it.
|
|
285
|
+
* @throws If no candidate model produces a quota snapshot, throws the last encountered error or a generic failure error.
|
|
286
|
+
*/
|
|
287
|
+
export async function fetchCodexQuotaSnapshot(options) {
|
|
288
|
+
const models = normalizeProbeModels(options.model, options.fallbackModels);
|
|
289
|
+
const timeoutMs = Math.max(1_000, Math.min(options.timeoutMs ?? 15_000, 60_000));
|
|
290
|
+
let lastError = null;
|
|
291
|
+
for (const model of models) {
|
|
292
|
+
try {
|
|
293
|
+
const instructions = await getCodexInstructions(model);
|
|
294
|
+
const probeBody = {
|
|
295
|
+
model,
|
|
296
|
+
stream: true,
|
|
297
|
+
store: false,
|
|
298
|
+
include: ["reasoning.encrypted_content"],
|
|
299
|
+
instructions,
|
|
300
|
+
input: [
|
|
301
|
+
{
|
|
302
|
+
type: "message",
|
|
303
|
+
role: "user",
|
|
304
|
+
content: [{ type: "input_text", text: "quota ping" }],
|
|
305
|
+
},
|
|
306
|
+
],
|
|
307
|
+
reasoning: { effort: "none", summary: "auto" },
|
|
308
|
+
text: { verbosity: "low" },
|
|
309
|
+
};
|
|
310
|
+
const headers = createCodexHeaders(undefined, options.accountId, options.accessToken, {
|
|
311
|
+
model,
|
|
312
|
+
});
|
|
313
|
+
headers.set("content-type", "application/json");
|
|
314
|
+
const controller = new AbortController();
|
|
315
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
316
|
+
let response;
|
|
317
|
+
try {
|
|
318
|
+
response = await fetch(`${CODEX_BASE_URL}/codex/responses`, {
|
|
319
|
+
method: "POST",
|
|
320
|
+
headers,
|
|
321
|
+
body: JSON.stringify(probeBody),
|
|
322
|
+
signal: controller.signal,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
finally {
|
|
326
|
+
clearTimeout(timeout);
|
|
327
|
+
}
|
|
328
|
+
const snapshotBase = parseQuotaSnapshotBase(response.headers, response.status);
|
|
329
|
+
if (snapshotBase) {
|
|
330
|
+
try {
|
|
331
|
+
await response.body?.cancel();
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// Best effort cancellation.
|
|
335
|
+
}
|
|
336
|
+
return { ...snapshotBase, model };
|
|
337
|
+
}
|
|
338
|
+
if (!response.ok) {
|
|
339
|
+
const bodyText = await response.text().catch(() => "");
|
|
340
|
+
let errorBody = undefined;
|
|
341
|
+
try {
|
|
342
|
+
errorBody = bodyText ? JSON.parse(bodyText) : undefined;
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
errorBody = { error: { message: bodyText } };
|
|
346
|
+
}
|
|
347
|
+
const unsupportedInfo = getUnsupportedCodexModelInfo(errorBody);
|
|
348
|
+
if (unsupportedInfo.isUnsupported) {
|
|
349
|
+
lastError = new Error(unsupportedInfo.message ?? `Model '${model}' unsupported for this account`);
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
throw new Error(extractErrorMessage(bodyText, response.status));
|
|
353
|
+
}
|
|
354
|
+
try {
|
|
355
|
+
await response.body?.cancel();
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
// Best effort cancellation.
|
|
359
|
+
}
|
|
360
|
+
lastError = new Error("Codex response did not include quota headers");
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
throw lastError ?? new Error("Failed to fetch quotas");
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=quota-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-probe.js","sourceRoot":"","sources":["../../lib/quota-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for session recovery storage paths.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from prior recovery module patterns.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CODEX_STORAGE: string;
|
|
7
|
+
export declare const MESSAGE_STORAGE: string;
|
|
8
|
+
export declare const PART_STORAGE: string;
|
|
9
|
+
export declare const THINKING_TYPES: Set<string>;
|
|
10
|
+
export declare const META_TYPES: Set<string>;
|
|
11
|
+
export declare const CONTENT_TYPES: Set<string>;
|
|
12
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../lib/recovery/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyBH,eAAO,MAAM,aAAa,QAAyC,CAAC;AACpE,eAAO,MAAM,eAAe,QAAiC,CAAC;AAC9D,eAAO,MAAM,YAAY,QAA8B,CAAC;AAExD,eAAO,MAAM,cAAc,aAA0D,CAAC;AACtF,eAAO,MAAM,UAAU,aAAyC,CAAC;AACjE,eAAO,MAAM,aAAa,aAAuD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for session recovery storage paths.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from prior recovery module patterns.
|
|
5
|
+
*/
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
/**
|
|
9
|
+
* Determine the base XDG-style data directory used for Codex storage.
|
|
10
|
+
*
|
|
11
|
+
* This function is pure and side-effect free; it is safe to call concurrently from multiple processes.
|
|
12
|
+
* On Windows it prefers the APPDATA environment variable and falls back to the user's AppData/Roaming directory.
|
|
13
|
+
* On other platforms it prefers XDG_DATA_HOME and falls back to ~/.local/share.
|
|
14
|
+
* Returned paths may include the user's home directory; callers should redact or avoid logging any sensitive tokens contained in file names or paths.
|
|
15
|
+
*
|
|
16
|
+
* @returns The filesystem path to use as the base data directory for Codex storage.
|
|
17
|
+
*/
|
|
18
|
+
function getXdgData() {
|
|
19
|
+
const platform = process.platform;
|
|
20
|
+
if (platform === "win32") {
|
|
21
|
+
return process.env.APPDATA || join(homedir(), "AppData", "Roaming");
|
|
22
|
+
}
|
|
23
|
+
return process.env.XDG_DATA_HOME || join(homedir(), ".local", "share");
|
|
24
|
+
}
|
|
25
|
+
export const CODEX_STORAGE = join(getXdgData(), "codex", "storage");
|
|
26
|
+
export const MESSAGE_STORAGE = join(CODEX_STORAGE, "message");
|
|
27
|
+
export const PART_STORAGE = join(CODEX_STORAGE, "part");
|
|
28
|
+
export const THINKING_TYPES = new Set(["thinking", "redacted_thinking", "reasoning"]);
|
|
29
|
+
export const META_TYPES = new Set(["step-start", "step-finish"]);
|
|
30
|
+
export const CONTENT_TYPES = new Set(["text", "tool", "tool_use", "tool_result"]);
|
|
31
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../lib/recovery/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;;;;;;;GASG;AACH,SAAS,UAAU;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session recovery module for codex-multi-auth.
|
|
3
|
+
*
|
|
4
|
+
* Provides recovery from:
|
|
5
|
+
* - tool_result_missing: Interrupted tool executions
|
|
6
|
+
* - thinking_block_order: Corrupted thinking blocks
|
|
7
|
+
* - thinking_disabled_violation: Thinking in non-thinking model
|
|
8
|
+
*/
|
|
9
|
+
export * from "./types.js";
|
|
10
|
+
export * from "./constants.js";
|
|
11
|
+
export * from "./storage.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/recovery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session recovery module for codex-multi-auth.
|
|
3
|
+
*
|
|
4
|
+
* Provides recovery from:
|
|
5
|
+
* - tool_result_missing: Interrupted tool executions
|
|
6
|
+
* - thinking_block_order: Corrupted thinking blocks
|
|
7
|
+
* - thinking_disabled_violation: Thinking in non-thinking model
|
|
8
|
+
*/
|
|
9
|
+
export * from "./types.js";
|
|
10
|
+
export * from "./constants.js";
|
|
11
|
+
export * from "./storage.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/recovery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage utilities for reading OpenCode's session data.
|
|
3
|
+
*
|
|
4
|
+
* Based on opencode-antigravity-auth recovery module.
|
|
5
|
+
*/
|
|
6
|
+
import type { StoredMessageMeta, StoredPart } from "./types.js";
|
|
7
|
+
export declare function generatePartId(): string;
|
|
8
|
+
export declare function getMessageDir(sessionID: string): string;
|
|
9
|
+
export declare function readMessages(sessionID: string): StoredMessageMeta[];
|
|
10
|
+
export declare function readParts(messageID: string): StoredPart[];
|
|
11
|
+
export declare function hasContent(part: StoredPart): boolean;
|
|
12
|
+
export declare function messageHasContent(messageID: string): boolean;
|
|
13
|
+
export declare function injectTextPart(sessionID: string, messageID: string, text: string): boolean;
|
|
14
|
+
export declare function findMessagesWithThinkingBlocks(sessionID: string): string[];
|
|
15
|
+
export declare function findMessagesWithThinkingOnly(sessionID: string): string[];
|
|
16
|
+
export declare function findMessagesWithOrphanThinking(sessionID: string): string[];
|
|
17
|
+
export declare function prependThinkingPart(sessionID: string, messageID: string): boolean;
|
|
18
|
+
export declare function stripThinkingParts(messageID: string): boolean;
|
|
19
|
+
export declare function findEmptyMessages(sessionID: string): string[];
|
|
20
|
+
export declare function findEmptyMessageByIndex(sessionID: string, targetIndex: number): string | null;
|
|
21
|
+
export declare function findMessageByIndexNeedingThinking(sessionID: string, targetIndex: number): string | null;
|
|
22
|
+
export declare function replaceEmptyTextParts(messageID: string, replacementText: string): boolean;
|
|
23
|
+
export declare function findMessagesWithEmptyTextParts(sessionID: string): string[];
|
|
24
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../lib/recovery/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AAchF,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAMD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsBvD;AAMD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAyBnE;AAMD,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAqBzD;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAkBpD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG5D;AAMD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuB1F;AAMD,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAe1E;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBxE;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB1E;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAuBjF;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAyB7D;AAMD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAW7D;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB7F;AAED,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBvG;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CA+BzF;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB1E"}
|