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,470 @@
|
|
|
1
|
+
import { existsSync, promises as fs } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { decodeJWT } from "../auth/auth.js";
|
|
5
|
+
import { extractAccountEmail, extractAccountId } from "../auth/token-utils.js";
|
|
6
|
+
import { createLogger } from "../logger.js";
|
|
7
|
+
import { sleep } from "../utils.js";
|
|
8
|
+
import { incrementCodexCliMetric, makeAccountFingerprint, } from "./observability.js";
|
|
9
|
+
const log = createLogger("codex-cli-state");
|
|
10
|
+
const CACHE_TTL_MS = 5_000;
|
|
11
|
+
const RETRYABLE_FS_CODES = new Set(["EBUSY", "EPERM"]);
|
|
12
|
+
let cache = null;
|
|
13
|
+
let cacheLoadedAt = 0;
|
|
14
|
+
let inFlightLoadPromise = null;
|
|
15
|
+
const emittedWarnings = new Set();
|
|
16
|
+
function isRetryableFsError(error) {
|
|
17
|
+
const code = error?.code;
|
|
18
|
+
return typeof code === "string" && RETRYABLE_FS_CODES.has(code);
|
|
19
|
+
}
|
|
20
|
+
async function retryFsOperation(task, attempts = 4) {
|
|
21
|
+
let lastError;
|
|
22
|
+
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
23
|
+
try {
|
|
24
|
+
return await task();
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
lastError = error;
|
|
28
|
+
if (!isRetryableFsError(error) || attempt >= attempts - 1) {
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
await sleep(10 * 2 ** attempt);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw lastError instanceof Error ? lastError : new Error("filesystem retry exhausted");
|
|
35
|
+
}
|
|
36
|
+
function isRecord(value) {
|
|
37
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
38
|
+
}
|
|
39
|
+
function readTrimmedString(value) {
|
|
40
|
+
if (typeof value !== "string")
|
|
41
|
+
return undefined;
|
|
42
|
+
const trimmed = value.trim();
|
|
43
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
44
|
+
}
|
|
45
|
+
function normalizeEmail(value) {
|
|
46
|
+
const email = readTrimmedString(value);
|
|
47
|
+
return email ? email.toLowerCase() : undefined;
|
|
48
|
+
}
|
|
49
|
+
function readBoolean(value) {
|
|
50
|
+
if (typeof value === "boolean")
|
|
51
|
+
return value;
|
|
52
|
+
if (typeof value === "string") {
|
|
53
|
+
const lc = value.trim().toLowerCase();
|
|
54
|
+
if (lc === "true" || lc === "1")
|
|
55
|
+
return true;
|
|
56
|
+
if (lc === "false" || lc === "0")
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
function readNumber(value) {
|
|
62
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
63
|
+
return value;
|
|
64
|
+
if (typeof value === "string") {
|
|
65
|
+
const parsed = Number(value);
|
|
66
|
+
if (Number.isFinite(parsed))
|
|
67
|
+
return parsed;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
function extractTokenFromRecord(record, keys) {
|
|
72
|
+
for (const key of keys) {
|
|
73
|
+
const token = readTrimmedString(record[key]);
|
|
74
|
+
if (token)
|
|
75
|
+
return token;
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
function extractAccountSnapshot(raw) {
|
|
80
|
+
if (!isRecord(raw))
|
|
81
|
+
return null;
|
|
82
|
+
const auth = isRecord(raw.auth) ? raw.auth : undefined;
|
|
83
|
+
const tokens = auth && isRecord(auth.tokens) ? auth.tokens : undefined;
|
|
84
|
+
const accessToken = extractTokenFromRecord(raw, ["accessToken", "access_token"]) ??
|
|
85
|
+
(tokens ? extractTokenFromRecord(tokens, ["access_token", "accessToken"]) : undefined);
|
|
86
|
+
const refreshToken = extractTokenFromRecord(raw, ["refreshToken", "refresh_token"]) ??
|
|
87
|
+
(tokens ? extractTokenFromRecord(tokens, ["refresh_token", "refreshToken"]) : undefined);
|
|
88
|
+
const accountId = readTrimmedString(raw.accountId) ??
|
|
89
|
+
readTrimmedString(raw.account_id) ??
|
|
90
|
+
readTrimmedString(raw.workspace_id) ??
|
|
91
|
+
readTrimmedString(raw.organization_id) ??
|
|
92
|
+
readTrimmedString(raw.id);
|
|
93
|
+
const email = normalizeEmail(raw.email) ??
|
|
94
|
+
normalizeEmail(raw.user_email) ??
|
|
95
|
+
normalizeEmail(raw.username);
|
|
96
|
+
const expiresAtRaw = readNumber(raw.expiresAt) ??
|
|
97
|
+
readNumber(raw.expires_at) ??
|
|
98
|
+
(tokens ? readNumber(tokens.expires_at) : undefined);
|
|
99
|
+
let expiresAt = expiresAtRaw;
|
|
100
|
+
if (!expiresAt && accessToken) {
|
|
101
|
+
const decoded = decodeJWT(accessToken);
|
|
102
|
+
const exp = decoded?.exp;
|
|
103
|
+
if (typeof exp === "number" && Number.isFinite(exp)) {
|
|
104
|
+
expiresAt = exp * 1000;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const isActive = readBoolean(raw.active) ??
|
|
108
|
+
readBoolean(raw.isActive) ??
|
|
109
|
+
readBoolean(raw.is_active);
|
|
110
|
+
if (!accessToken && !refreshToken) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
email,
|
|
115
|
+
accountId,
|
|
116
|
+
accessToken: accessToken ?? "",
|
|
117
|
+
refreshToken,
|
|
118
|
+
expiresAt,
|
|
119
|
+
isActive,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Determines whether Codex CLI sync is enabled based on environment variables.
|
|
124
|
+
*
|
|
125
|
+
* Checks CODEX_MULTI_AUTH_SYNC_CODEX_CLI first (explicit "1" enables, "0" disables),
|
|
126
|
+
* then falls back to the legacy CODEX_AUTH_SYNC_CODEX_CLI (also "1"/"0"). If the
|
|
127
|
+
* legacy variable is used, a single warning is emitted and a metric is incremented.
|
|
128
|
+
*
|
|
129
|
+
* Concurrency: the function may perform a one-time side effect (emitting a legacy-use
|
|
130
|
+
* warning and incrementing a metric); that side effect is guarded to run at most once
|
|
131
|
+
* per process and is safe to call from concurrent contexts.
|
|
132
|
+
*
|
|
133
|
+
* Filesystem and tokens: this function does not access the filesystem and does not
|
|
134
|
+
* read or log any tokens (no token redaction is required here).
|
|
135
|
+
*
|
|
136
|
+
* @returns `true` if sync is enabled, `false` otherwise.
|
|
137
|
+
*/
|
|
138
|
+
export function isCodexCliSyncEnabled() {
|
|
139
|
+
const override = (process.env.CODEX_MULTI_AUTH_SYNC_CODEX_CLI ?? "").trim();
|
|
140
|
+
if (override === "0")
|
|
141
|
+
return false;
|
|
142
|
+
if (override === "1")
|
|
143
|
+
return true;
|
|
144
|
+
const legacy = (process.env.CODEX_AUTH_SYNC_CODEX_CLI ?? "").trim();
|
|
145
|
+
if (legacy.length > 0 && !emittedWarnings.has("legacy-sync-env")) {
|
|
146
|
+
emittedWarnings.add("legacy-sync-env");
|
|
147
|
+
incrementCodexCliMetric("legacySyncEnvUses");
|
|
148
|
+
log.warn("Using legacy CODEX_AUTH_SYNC_CODEX_CLI. Prefer CODEX_MULTI_AUTH_SYNC_CODEX_CLI.");
|
|
149
|
+
}
|
|
150
|
+
if (legacy === "0")
|
|
151
|
+
return false;
|
|
152
|
+
if (legacy === "1")
|
|
153
|
+
return true;
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Resolves the filesystem path to the Codex CLI accounts file.
|
|
158
|
+
*
|
|
159
|
+
* If the environment variable CODEX_CLI_ACCOUNTS_PATH is set to a non-empty value it will be returned; otherwise the default is "$HOME/.codex/accounts.json".
|
|
160
|
+
*
|
|
161
|
+
* Concurrency: callers should treat the returned path as a location that may be concurrently read or written by other processes.
|
|
162
|
+
* Windows: returns a path using the platform path separators (may contain backslashes on Windows).
|
|
163
|
+
* Token redaction: this function only returns the file path; it does not read or expose token contents and callers must redact sensitive fields when logging the file contents.
|
|
164
|
+
*
|
|
165
|
+
* @returns The resolved path to the accounts JSON file, either the overridden value from CODEX_CLI_ACCOUNTS_PATH or the platform-specific "$HOME/.codex/accounts.json".
|
|
166
|
+
*/
|
|
167
|
+
export function getCodexCliAccountsPath() {
|
|
168
|
+
const override = (process.env.CODEX_CLI_ACCOUNTS_PATH ?? "").trim();
|
|
169
|
+
if (override.length > 0)
|
|
170
|
+
return override;
|
|
171
|
+
return join(homedir(), ".codex", "accounts.json");
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Resolve the filesystem path for the Codex CLI auth JSON file, allowing an environment override.
|
|
175
|
+
*
|
|
176
|
+
* If the environment variable `CODEX_CLI_AUTH_PATH` is set to a non-empty value (after trimming) that value is returned;
|
|
177
|
+
* otherwise the default path is homedir/.codex/auth.json. The returned path may reference a file containing authentication tokens—
|
|
178
|
+
* treat it as sensitive (avoid logging full paths or file contents without redaction). The function returns a platform-native path
|
|
179
|
+
* (path separators follow the current OS); callers should handle concurrent access to the file when reading or writing.
|
|
180
|
+
*
|
|
181
|
+
* @returns The resolved path to the Codex CLI `auth.json` file.
|
|
182
|
+
*/
|
|
183
|
+
export function getCodexCliAuthPath() {
|
|
184
|
+
const override = (process.env.CODEX_CLI_AUTH_PATH ?? "").trim();
|
|
185
|
+
if (override.length > 0)
|
|
186
|
+
return override;
|
|
187
|
+
return join(homedir(), ".codex", "auth.json");
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Convert a parsed Codex CLI accounts JSON payload into a CodexCliState snapshot.
|
|
191
|
+
*
|
|
192
|
+
* Parses the provided JSON object expected to contain an `accounts` array and optional metadata, producing a state object that includes accounts, active account/email if present, `syncVersion`, and the optional `sourceUpdatedAtMs`. The supplied `path` is recorded as-is and is not normalized (may be a Unix or Windows path). This function performs no synchronization or locking and may produce stale results relative to on-disk changes. Tokens are copied verbatim from the payload and are not redacted; callers must redact sensitive values before logging or exposing the returned state.
|
|
193
|
+
*
|
|
194
|
+
* @param path - Filesystem path of the source payload; path separators are preserved and not normalized.
|
|
195
|
+
* @param parsed - The already-parsed JSON value expected to contain an `accounts` array and optional metadata.
|
|
196
|
+
* @param sourceUpdatedAtMs - Optional source modification timestamp (milliseconds) to attach to the returned state.
|
|
197
|
+
* @returns A populated `CodexCliState` when `parsed` contains a valid `accounts` array, or `null` when the payload is not in the expected shape.
|
|
198
|
+
*/
|
|
199
|
+
function parseCodexCliState(path, parsed, sourceUpdatedAtMs) {
|
|
200
|
+
if (!isRecord(parsed) || !Array.isArray(parsed.accounts)) {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
const accounts = parsed.accounts
|
|
204
|
+
.map((entry) => extractAccountSnapshot(entry))
|
|
205
|
+
.filter((entry) => entry !== null);
|
|
206
|
+
let activeAccountId = readTrimmedString(parsed.activeAccountId) ??
|
|
207
|
+
readTrimmedString(parsed.active_account_id);
|
|
208
|
+
let activeEmail = normalizeEmail(parsed.activeEmail) ??
|
|
209
|
+
normalizeEmail(parsed.active_email);
|
|
210
|
+
if (!activeAccountId && !activeEmail) {
|
|
211
|
+
const activeFromList = accounts.find((account) => account.isActive);
|
|
212
|
+
if (activeFromList) {
|
|
213
|
+
activeAccountId = activeFromList.accountId;
|
|
214
|
+
activeEmail = activeFromList.email;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
path,
|
|
219
|
+
accounts,
|
|
220
|
+
activeAccountId,
|
|
221
|
+
activeEmail,
|
|
222
|
+
syncVersion: readNumber(parsed.codexMultiAuthSyncVersion),
|
|
223
|
+
sourceUpdatedAtMs,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Parse an auth-style Codex CLI payload into a CodexCliState snapshot.
|
|
228
|
+
*
|
|
229
|
+
* The returned state represents a point-in-time conversion of the provided payload and may include raw tokens
|
|
230
|
+
* and derived metadata (account id, email, expiration, sync version, and optional sourceUpdatedAtMs).
|
|
231
|
+
*
|
|
232
|
+
* Concurrency: the result reflects the payload at the time of parsing; callers should not assume it remains
|
|
233
|
+
* valid if the underlying file changes concurrently.
|
|
234
|
+
*
|
|
235
|
+
* Windows/filesystem note: filesystem-derived timestamps (sourceUpdatedAtMs) may be coarse or approximate on some
|
|
236
|
+
* platforms (notably Windows); treat them as best-effort indicators of source modification time.
|
|
237
|
+
*
|
|
238
|
+
* Token handling: the returned state includes raw access/refresh tokens. Callers must redact or avoid logging tokens
|
|
239
|
+
* or other sensitive fields when emitting logs, telemetry, or external diagnostics.
|
|
240
|
+
*
|
|
241
|
+
* @param path - Filesystem path that served as the source of `parsed`; stored verbatim on the returned state.
|
|
242
|
+
* @param parsed - The parsed JSON payload from an auth-style file; expected to contain a `tokens` object.
|
|
243
|
+
* @param sourceUpdatedAtMs - Optional best-effort source modification timestamp (milliseconds since epoch).
|
|
244
|
+
* @returns A CodexCliState built from the auth payload, or `null` if `parsed` is not a valid auth payload containing no tokens.
|
|
245
|
+
*/
|
|
246
|
+
function parseCodexCliAuthState(path, parsed, sourceUpdatedAtMs) {
|
|
247
|
+
if (!isRecord(parsed))
|
|
248
|
+
return null;
|
|
249
|
+
const tokens = isRecord(parsed.tokens) ? parsed.tokens : null;
|
|
250
|
+
if (!tokens)
|
|
251
|
+
return null;
|
|
252
|
+
const accessToken = extractTokenFromRecord(tokens, ["access_token", "accessToken"]);
|
|
253
|
+
const refreshToken = extractTokenFromRecord(tokens, ["refresh_token", "refreshToken"]);
|
|
254
|
+
if (!accessToken && !refreshToken)
|
|
255
|
+
return null;
|
|
256
|
+
const idToken = extractTokenFromRecord(tokens, ["id_token", "idToken"]);
|
|
257
|
+
const accountId = readTrimmedString(tokens.account_id) ??
|
|
258
|
+
readTrimmedString(tokens.accountId) ??
|
|
259
|
+
(accessToken ? extractAccountId(accessToken) : undefined);
|
|
260
|
+
const email = (accessToken ? extractAccountEmail(accessToken, idToken) : undefined) ??
|
|
261
|
+
normalizeEmail(parsed.email);
|
|
262
|
+
let expiresAt = undefined;
|
|
263
|
+
if (accessToken) {
|
|
264
|
+
const decoded = decodeJWT(accessToken);
|
|
265
|
+
const exp = decoded?.exp;
|
|
266
|
+
if (typeof exp === "number" && Number.isFinite(exp)) {
|
|
267
|
+
expiresAt = exp * 1000;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const snapshot = {
|
|
271
|
+
accountId,
|
|
272
|
+
email,
|
|
273
|
+
accessToken: accessToken ?? "",
|
|
274
|
+
refreshToken,
|
|
275
|
+
expiresAt,
|
|
276
|
+
isActive: true,
|
|
277
|
+
};
|
|
278
|
+
return {
|
|
279
|
+
path,
|
|
280
|
+
accounts: [snapshot],
|
|
281
|
+
activeAccountId: accountId,
|
|
282
|
+
activeEmail: email,
|
|
283
|
+
syncVersion: readNumber(parsed.codexMultiAuthSyncVersion),
|
|
284
|
+
sourceUpdatedAtMs,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Loads Codex CLI authentication state from disk, with an in-memory TTL cache and optional force refresh.
|
|
289
|
+
*
|
|
290
|
+
* Reads either the accounts JSON or the legacy auth JSON (whichever is present) and returns a normalized
|
|
291
|
+
* CodexCliState including tokens, active account, optional sync version, and source file modification time.
|
|
292
|
+
* Uses an in-memory cache valid for CACHE_TTL_MS; if `forceRefresh` is true the cache is bypassed.
|
|
293
|
+
*
|
|
294
|
+
* Concurrency: callers may race to read/update the in-memory cache; this function performs best-effort caching
|
|
295
|
+
* and does not provide external synchronization primitives.
|
|
296
|
+
*
|
|
297
|
+
* Windows filesystem notes: file modification timestamps (sourceUpdatedAtMs) are derived from fs.stat().mtimeMs
|
|
298
|
+
* and may have coarser resolution on some Windows filesystems.
|
|
299
|
+
*
|
|
300
|
+
* Token redaction: returned state may contain token values (accessToken, refreshToken); consumers should treat
|
|
301
|
+
* these values as sensitive and redact or avoid logging them.
|
|
302
|
+
*
|
|
303
|
+
* @param options - Optional settings.
|
|
304
|
+
* @param options.forceRefresh - If true, bypass the in-memory TTL cache and re-read files from disk.
|
|
305
|
+
* @returns The parsed CodexCliState when a valid accounts/auth payload is found, or `null` if sync is disabled,
|
|
306
|
+
* no valid payload exists, or a read/parse error occurred.
|
|
307
|
+
*/
|
|
308
|
+
export async function loadCodexCliState(options) {
|
|
309
|
+
if (!isCodexCliSyncEnabled()) {
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
const now = Date.now();
|
|
313
|
+
if (!options?.forceRefresh && cache && now - cacheLoadedAt < CACHE_TTL_MS) {
|
|
314
|
+
return cache;
|
|
315
|
+
}
|
|
316
|
+
if (inFlightLoadPromise) {
|
|
317
|
+
return inFlightLoadPromise;
|
|
318
|
+
}
|
|
319
|
+
const readTask = async () => {
|
|
320
|
+
const accountsPath = getCodexCliAccountsPath();
|
|
321
|
+
const authPath = getCodexCliAuthPath();
|
|
322
|
+
incrementCodexCliMetric("readAttempts");
|
|
323
|
+
const hasAccountsPath = existsSync(accountsPath);
|
|
324
|
+
const hasAuthPath = existsSync(authPath);
|
|
325
|
+
if (!hasAccountsPath && !hasAuthPath) {
|
|
326
|
+
incrementCodexCliMetric("readMisses");
|
|
327
|
+
cache = null;
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
if (hasAccountsPath) {
|
|
332
|
+
try {
|
|
333
|
+
const raw = await retryFsOperation(() => fs.readFile(accountsPath, "utf-8"));
|
|
334
|
+
const parsed = JSON.parse(raw);
|
|
335
|
+
let sourceUpdatedAtMs;
|
|
336
|
+
try {
|
|
337
|
+
sourceUpdatedAtMs = (await retryFsOperation(() => fs.stat(accountsPath))).mtimeMs;
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
sourceUpdatedAtMs = undefined;
|
|
341
|
+
}
|
|
342
|
+
const state = parseCodexCliState(accountsPath, parsed, sourceUpdatedAtMs);
|
|
343
|
+
if (state) {
|
|
344
|
+
incrementCodexCliMetric("readSuccesses");
|
|
345
|
+
log.debug("Loaded Codex CLI state", {
|
|
346
|
+
operation: "read-state",
|
|
347
|
+
outcome: "success",
|
|
348
|
+
path: accountsPath,
|
|
349
|
+
accountCount: state.accounts.length,
|
|
350
|
+
activeAccountRef: makeAccountFingerprint({
|
|
351
|
+
accountId: state.activeAccountId,
|
|
352
|
+
email: state.activeEmail,
|
|
353
|
+
}),
|
|
354
|
+
});
|
|
355
|
+
cache = state;
|
|
356
|
+
return state;
|
|
357
|
+
}
|
|
358
|
+
log.warn("Codex CLI accounts payload is malformed", {
|
|
359
|
+
operation: "read-state",
|
|
360
|
+
outcome: "malformed",
|
|
361
|
+
path: accountsPath,
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
catch (accountsError) {
|
|
365
|
+
log.warn("Failed to read Codex CLI accounts state", {
|
|
366
|
+
operation: "read-state",
|
|
367
|
+
outcome: "accounts-read-error",
|
|
368
|
+
path: accountsPath,
|
|
369
|
+
error: String(accountsError),
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (hasAuthPath) {
|
|
374
|
+
try {
|
|
375
|
+
const raw = await retryFsOperation(() => fs.readFile(authPath, "utf-8"));
|
|
376
|
+
const parsed = JSON.parse(raw);
|
|
377
|
+
let sourceUpdatedAtMs;
|
|
378
|
+
try {
|
|
379
|
+
sourceUpdatedAtMs = (await retryFsOperation(() => fs.stat(authPath))).mtimeMs;
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
sourceUpdatedAtMs = undefined;
|
|
383
|
+
}
|
|
384
|
+
const state = parseCodexCliAuthState(authPath, parsed, sourceUpdatedAtMs);
|
|
385
|
+
if (state) {
|
|
386
|
+
incrementCodexCliMetric("readSuccesses");
|
|
387
|
+
log.debug("Loaded Codex CLI auth state", {
|
|
388
|
+
operation: "read-state",
|
|
389
|
+
outcome: "success",
|
|
390
|
+
path: authPath,
|
|
391
|
+
accountCount: state.accounts.length,
|
|
392
|
+
activeAccountRef: makeAccountFingerprint({
|
|
393
|
+
accountId: state.activeAccountId,
|
|
394
|
+
email: state.activeEmail,
|
|
395
|
+
}),
|
|
396
|
+
});
|
|
397
|
+
cache = state;
|
|
398
|
+
return state;
|
|
399
|
+
}
|
|
400
|
+
log.warn("Codex CLI auth payload is malformed", {
|
|
401
|
+
operation: "read-state",
|
|
402
|
+
outcome: "malformed",
|
|
403
|
+
path: authPath,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
catch (authError) {
|
|
407
|
+
log.warn("Failed to read Codex CLI auth state", {
|
|
408
|
+
operation: "read-state",
|
|
409
|
+
outcome: "auth-read-error",
|
|
410
|
+
path: authPath,
|
|
411
|
+
error: String(authError),
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
incrementCodexCliMetric("readFailures");
|
|
416
|
+
cache = null;
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
incrementCodexCliMetric("readFailures");
|
|
421
|
+
log.warn("Failed to read Codex CLI state", {
|
|
422
|
+
operation: "read-state",
|
|
423
|
+
outcome: "error",
|
|
424
|
+
path: hasAccountsPath ? accountsPath : authPath,
|
|
425
|
+
error: String(error),
|
|
426
|
+
});
|
|
427
|
+
cache = null;
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
430
|
+
finally {
|
|
431
|
+
cacheLoadedAt = Date.now();
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
const currentLoad = readTask();
|
|
435
|
+
inFlightLoadPromise = currentLoad;
|
|
436
|
+
try {
|
|
437
|
+
return await currentLoad;
|
|
438
|
+
}
|
|
439
|
+
finally {
|
|
440
|
+
if (inFlightLoadPromise === currentLoad) {
|
|
441
|
+
inFlightLoadPromise = null;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
export async function lookupCodexCliTokensByEmail(email) {
|
|
446
|
+
const normalized = normalizeEmail(email);
|
|
447
|
+
if (!normalized)
|
|
448
|
+
return null;
|
|
449
|
+
const state = await loadCodexCliState();
|
|
450
|
+
if (!state)
|
|
451
|
+
return null;
|
|
452
|
+
const account = state.accounts.find((entry) => normalizeEmail(entry.email) === normalized);
|
|
453
|
+
if (!account?.accessToken)
|
|
454
|
+
return null;
|
|
455
|
+
return {
|
|
456
|
+
accessToken: account.accessToken,
|
|
457
|
+
expiresAt: account.expiresAt,
|
|
458
|
+
refreshToken: account.refreshToken,
|
|
459
|
+
accountId: account.accountId,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
export function clearCodexCliStateCache() {
|
|
463
|
+
cache = null;
|
|
464
|
+
cacheLoadedAt = 0;
|
|
465
|
+
inFlightLoadPromise = null;
|
|
466
|
+
}
|
|
467
|
+
export function __resetCodexCliWarningCacheForTests() {
|
|
468
|
+
emittedWarnings.clear();
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../lib/codex-cli/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type AccountStorageV3 } from "../storage.js";
|
|
2
|
+
import { type ModelFamily } from "../prompts/codex.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reconciles the provided local account storage with the Codex CLI state and returns the resulting storage and whether it changed.
|
|
5
|
+
*
|
|
6
|
+
* This operation:
|
|
7
|
+
* - Merges accounts from the Codex CLI state into a clone of `current` (or into a new empty storage when `current` is null).
|
|
8
|
+
* - May update the active account selection and per-family active indexes when the Codex CLI selection is considered applicable.
|
|
9
|
+
* - Preserves secrets and sensitive fields; any tokens written to storage are subject to the project's token-redaction rules and are not exposed in logs or metrics.
|
|
10
|
+
*
|
|
11
|
+
* Concurrency assumptions:
|
|
12
|
+
* - Caller is responsible for serializing concurrent writes to persistent storage; this function only returns an in-memory storage object and does not perform atomic file-level coordination.
|
|
13
|
+
*
|
|
14
|
+
* Windows filesystem notes:
|
|
15
|
+
* - When the caller persists the returned storage to disk on Windows, standard Windows file-locking and path-length semantics apply; this function does not perform Windows-specific path normalization.
|
|
16
|
+
*
|
|
17
|
+
* @param current - The current local AccountStorageV3, or `null` to indicate none exists.
|
|
18
|
+
* @returns An object containing:
|
|
19
|
+
* - `storage`: the reconciled AccountStorageV3 to persist (may be the original `current` when no changes were applied).
|
|
20
|
+
* - `changed`: `true` if the reconciled storage differs from `current`, `false` otherwise.
|
|
21
|
+
*/
|
|
22
|
+
export declare function syncAccountStorageFromCodexCli(current: AccountStorageV3 | null): Promise<{
|
|
23
|
+
storage: AccountStorageV3 | null;
|
|
24
|
+
changed: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function getActiveSelectionForFamily(storage: AccountStorageV3, family: ModelFamily): number;
|
|
27
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../lib/codex-cli/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,gBAAgB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAuPvE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,8BAA8B,CACnD,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAwFjE;AAED,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,WAAW,GACjB,MAAM,CAMR"}
|