codex-multi-auth 2.16.0 → 2.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codex-plugin/plugin.json +9 -9
- package/LICENSE +21 -21
- package/README.md +487 -463
- package/assets/codex-multi-auth-icon.svg +39 -39
- package/assets/readme-hero.svg +31 -31
- package/config/README.md +31 -31
- package/config/codex-legacy.json +1221 -1221
- package/config/codex-modern.json +423 -423
- package/config/minimal-codex.json +15 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/lib/account-policy.d.ts +4 -0
- package/dist/lib/account-policy.d.ts.map +1 -1
- package/dist/lib/account-policy.js +8 -0
- package/dist/lib/accounts/rate-limits.d.ts.map +1 -1
- package/dist/lib/accounts/rate-limits.js +2 -0
- package/dist/lib/accounts.d.ts +15 -3
- package/dist/lib/accounts.d.ts.map +1 -1
- package/dist/lib/accounts.js +231 -30
- package/dist/lib/api-route-store.d.ts +24 -0
- package/dist/lib/api-route-store.d.ts.map +1 -0
- package/dist/lib/api-route-store.js +145 -0
- package/dist/lib/auth/account-access.d.ts +115 -0
- package/dist/lib/auth/account-access.d.ts.map +1 -0
- package/dist/lib/auth/account-access.js +214 -0
- package/dist/lib/auth/token-utils.d.ts +54 -1
- package/dist/lib/auth/token-utils.d.ts.map +1 -1
- package/dist/lib/auth/token-utils.js +92 -7
- package/dist/lib/cli.d.ts +1 -1
- package/dist/lib/cli.d.ts.map +1 -1
- package/dist/lib/cli.js +4 -0
- package/dist/lib/codex-cli/state.d.ts +7 -0
- package/dist/lib/codex-cli/state.d.ts.map +1 -1
- package/dist/lib/codex-cli/state.js +18 -0
- package/dist/lib/codex-cli/writer.d.ts.map +1 -1
- package/dist/lib/codex-cli/writer.js +60 -8
- package/dist/lib/codex-manager/account-manager-commands.d.ts.map +1 -1
- package/dist/lib/codex-manager/account-manager-commands.js +1 -0
- package/dist/lib/codex-manager/account-pool-write.d.ts +3 -1
- package/dist/lib/codex-manager/account-pool-write.d.ts.map +1 -1
- package/dist/lib/codex-manager/account-pool-write.js +4 -0
- package/dist/lib/codex-manager/api-login-menu.d.ts +14 -0
- package/dist/lib/codex-manager/api-login-menu.d.ts.map +1 -0
- package/dist/lib/codex-manager/api-login-menu.js +224 -0
- package/dist/lib/codex-manager/commands/account.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/account.js +27 -0
- package/dist/lib/codex-manager/commands/best.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/best.js +6 -2
- package/dist/lib/codex-manager/commands/check.d.ts +7 -1
- package/dist/lib/codex-manager/commands/check.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/check.js +24 -3
- package/dist/lib/codex-manager/commands/forecast.d.ts +1 -1
- package/dist/lib/codex-manager/commands/forecast.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/forecast.js +7 -3
- package/dist/lib/codex-manager/commands/report.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/report.js +5 -1
- package/dist/lib/codex-manager/commands/resets.d.ts +2 -0
- package/dist/lib/codex-manager/commands/resets.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/resets.js +67 -0
- package/dist/lib/codex-manager/commands/rotation.d.ts +2 -2
- package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/rotation.js +63 -12
- package/dist/lib/codex-manager/commands/status.d.ts +12 -1
- package/dist/lib/codex-manager/commands/status.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/status.js +166 -22
- package/dist/lib/codex-manager/commands/uninstall.js +1 -1
- package/dist/lib/codex-manager/formatters/quota-formatters.d.ts.map +1 -1
- package/dist/lib/codex-manager/formatters/quota-formatters.js +3 -2
- package/dist/lib/codex-manager/health-check.d.ts +3 -0
- package/dist/lib/codex-manager/health-check.d.ts.map +1 -1
- package/dist/lib/codex-manager/health-check.js +57 -7
- package/dist/lib/codex-manager/help.d.ts.map +1 -1
- package/dist/lib/codex-manager/help.js +4 -2
- package/dist/lib/codex-manager/login-flow.d.ts.map +1 -1
- package/dist/lib/codex-manager/login-flow.js +69 -7
- package/dist/lib/codex-manager/login-menu-data.d.ts.map +1 -1
- package/dist/lib/codex-manager/login-menu-data.js +21 -8
- package/dist/lib/codex-manager/login-oauth.d.ts +3 -0
- package/dist/lib/codex-manager/login-oauth.d.ts.map +1 -1
- package/dist/lib/codex-manager/login-oauth.js +6 -1
- package/dist/lib/codex-manager/login-workspace-choice.d.ts +11 -0
- package/dist/lib/codex-manager/login-workspace-choice.d.ts.map +1 -0
- package/dist/lib/codex-manager/login-workspace-choice.js +37 -0
- package/dist/lib/codex-manager/persist-selected-account.d.ts.map +1 -1
- package/dist/lib/codex-manager/persist-selected-account.js +2 -1
- package/dist/lib/codex-manager/quota-cache-helpers.d.ts +7 -1
- package/dist/lib/codex-manager/quota-cache-helpers.d.ts.map +1 -1
- package/dist/lib/codex-manager/quota-cache-helpers.js +34 -19
- package/dist/lib/codex-manager/repair-commands.d.ts +13 -0
- package/dist/lib/codex-manager/repair-commands.d.ts.map +1 -1
- package/dist/lib/codex-manager/repair-commands.js +144 -9
- package/dist/lib/codex-manager.d.ts.map +1 -1
- package/dist/lib/codex-manager.js +25 -6
- package/dist/lib/concurrency.d.ts +3 -0
- package/dist/lib/concurrency.d.ts.map +1 -0
- package/dist/lib/concurrency.js +31 -0
- package/dist/lib/context-budget-response.js +8 -8
- package/dist/lib/context-overflow.js +10 -10
- package/dist/lib/model-route-policy.d.ts +52 -0
- package/dist/lib/model-route-policy.d.ts.map +1 -0
- package/dist/lib/model-route-policy.js +159 -0
- package/dist/lib/oauth-success.html +125 -125
- package/dist/lib/policy/runtime-policy.d.ts +1 -0
- package/dist/lib/policy/runtime-policy.d.ts.map +1 -1
- package/dist/lib/policy/runtime-policy.js +3 -0
- package/dist/lib/preemptive-quota-scheduler.d.ts +2 -0
- package/dist/lib/preemptive-quota-scheduler.d.ts.map +1 -1
- package/dist/lib/preemptive-quota-scheduler.js +4 -0
- package/dist/lib/prompts/codex-host-bridge.js +138 -138
- package/dist/lib/prompts/codex.js +79 -79
- package/dist/lib/quota-cache.d.ts +7 -3
- package/dist/lib/quota-cache.d.ts.map +1 -1
- package/dist/lib/quota-cache.js +91 -59
- package/dist/lib/quota-probe.d.ts +5 -0
- package/dist/lib/quota-probe.d.ts.map +1 -1
- package/dist/lib/quota-probe.js +26 -2
- package/dist/lib/quota-readiness.d.ts +7 -2
- package/dist/lib/quota-readiness.d.ts.map +1 -1
- package/dist/lib/quota-readiness.js +25 -4
- package/dist/lib/request/client-cancellation.d.ts +5 -0
- package/dist/lib/request/client-cancellation.d.ts.map +1 -0
- package/dist/lib/request/client-cancellation.js +7 -0
- package/dist/lib/request/response-outcome.d.ts +25 -0
- package/dist/lib/request/response-outcome.d.ts.map +1 -0
- package/dist/lib/request/response-outcome.js +49 -0
- package/dist/lib/request/stream-failover-runtime.d.ts +2 -1
- package/dist/lib/request/stream-failover-runtime.d.ts.map +1 -1
- package/dist/lib/request/stream-failover-runtime.js +29 -10
- package/dist/lib/runtime/account-check.d.ts.map +1 -1
- package/dist/lib/runtime/account-check.js +2 -8
- package/dist/lib/runtime/account-model-catalog.d.ts +64 -0
- package/dist/lib/runtime/account-model-catalog.d.ts.map +1 -0
- package/dist/lib/runtime/account-model-catalog.js +154 -0
- package/dist/lib/runtime/account-pool.d.ts +3 -1
- package/dist/lib/runtime/account-pool.d.ts.map +1 -1
- package/dist/lib/runtime/account-pool.js +4 -0
- package/dist/lib/runtime/account-reset-credits.d.ts +42 -0
- package/dist/lib/runtime/account-reset-credits.d.ts.map +1 -0
- package/dist/lib/runtime/account-reset-credits.js +82 -0
- package/dist/lib/runtime/api-model-capabilities.d.ts +30 -0
- package/dist/lib/runtime/api-model-capabilities.d.ts.map +1 -0
- package/dist/lib/runtime/api-model-capabilities.js +434 -0
- package/dist/lib/runtime/api-model-runtime.d.ts +42 -0
- package/dist/lib/runtime/api-model-runtime.d.ts.map +1 -0
- package/dist/lib/runtime/api-model-runtime.js +358 -0
- package/dist/lib/runtime/app-bind.d.ts +19 -1
- package/dist/lib/runtime/app-bind.d.ts.map +1 -1
- package/dist/lib/runtime/app-bind.js +89 -11
- package/dist/lib/runtime/automatic-account-checks.d.ts +35 -0
- package/dist/lib/runtime/automatic-account-checks.d.ts.map +1 -0
- package/dist/lib/runtime/automatic-account-checks.js +140 -0
- package/dist/lib/runtime/automatic-subscription-checks.d.ts +7 -0
- package/dist/lib/runtime/automatic-subscription-checks.d.ts.map +1 -0
- package/dist/lib/runtime/automatic-subscription-checks.js +54 -0
- package/dist/lib/runtime/catalog-capabilities.d.ts +8 -0
- package/dist/lib/runtime/catalog-capabilities.d.ts.map +1 -0
- package/dist/lib/runtime/catalog-capabilities.js +61 -0
- package/dist/lib/runtime/inference-activity.d.ts +15 -0
- package/dist/lib/runtime/inference-activity.d.ts.map +1 -0
- package/dist/lib/runtime/inference-activity.js +95 -0
- package/dist/lib/runtime/model-discovery-status.d.ts +100 -0
- package/dist/lib/runtime/model-discovery-status.d.ts.map +1 -0
- package/dist/lib/runtime/model-discovery-status.js +387 -0
- package/dist/lib/runtime/native-account-storage.d.ts +11 -0
- package/dist/lib/runtime/native-account-storage.d.ts.map +1 -0
- package/dist/lib/runtime/native-account-storage.js +50 -0
- package/dist/lib/runtime/native-account-sync.d.ts +19 -0
- package/dist/lib/runtime/native-account-sync.d.ts.map +1 -0
- package/dist/lib/runtime/native-account-sync.js +62 -0
- package/dist/lib/runtime/native-binding-lock.d.ts +3 -0
- package/dist/lib/runtime/native-binding-lock.d.ts.map +1 -0
- package/dist/lib/runtime/native-binding-lock.js +5 -0
- package/dist/lib/runtime/native-client-auth.d.ts +3 -0
- package/dist/lib/runtime/native-client-auth.d.ts.map +1 -0
- package/dist/lib/runtime/native-client-auth.js +42 -0
- package/dist/lib/runtime/native-provider-config.d.ts +4 -0
- package/dist/lib/runtime/native-provider-config.d.ts.map +1 -0
- package/dist/lib/runtime/native-provider-config.js +52 -0
- package/dist/lib/runtime/native-rate-limits.d.ts +18 -0
- package/dist/lib/runtime/native-rate-limits.d.ts.map +1 -0
- package/dist/lib/runtime/native-rate-limits.js +135 -0
- package/dist/lib/runtime/reset-credit-routing.d.ts +41 -0
- package/dist/lib/runtime/reset-credit-routing.d.ts.map +1 -0
- package/dist/lib/runtime/reset-credit-routing.js +66 -0
- package/dist/lib/runtime/reset-credits.d.ts +101 -0
- package/dist/lib/runtime/reset-credits.d.ts.map +1 -0
- package/dist/lib/runtime/reset-credits.js +162 -0
- package/dist/lib/runtime/response-output-history.d.ts +17 -0
- package/dist/lib/runtime/response-output-history.d.ts.map +1 -0
- package/dist/lib/runtime/response-output-history.js +85 -0
- package/dist/lib/runtime/responses-websocket.d.ts +31 -0
- package/dist/lib/runtime/responses-websocket.d.ts.map +1 -0
- package/dist/lib/runtime/responses-websocket.js +636 -0
- package/dist/lib/runtime/resume-picker.d.ts +41 -0
- package/dist/lib/runtime/resume-picker.d.ts.map +1 -0
- package/dist/lib/runtime/resume-picker.js +169 -0
- package/dist/lib/runtime/rotation-account-selection.d.ts +6 -0
- package/dist/lib/runtime/rotation-account-selection.d.ts.map +1 -1
- package/dist/lib/runtime/rotation-account-selection.js +63 -0
- package/dist/lib/runtime/rotation-proxy-state.d.ts +33 -0
- package/dist/lib/runtime/rotation-proxy-state.d.ts.map +1 -1
- package/dist/lib/runtime/rotation-server-types.d.ts +18 -0
- package/dist/lib/runtime/rotation-server-types.d.ts.map +1 -1
- package/dist/lib/runtime/runtime-capability-failures.d.ts +14 -0
- package/dist/lib/runtime/runtime-capability-failures.d.ts.map +1 -0
- package/dist/lib/runtime/runtime-capability-failures.js +76 -0
- package/dist/lib/runtime/runtime-observability.d.ts +7 -0
- package/dist/lib/runtime/runtime-observability.d.ts.map +1 -1
- package/dist/lib/runtime/runtime-observability.js +42 -2
- package/dist/lib/runtime/subscription-first-use.d.ts +10 -0
- package/dist/lib/runtime/subscription-first-use.d.ts.map +1 -0
- package/dist/lib/runtime/subscription-first-use.js +64 -0
- package/dist/lib/runtime/subscription-quota-event.d.ts +6 -0
- package/dist/lib/runtime/subscription-quota-event.d.ts.map +1 -0
- package/dist/lib/runtime/subscription-quota-event.js +31 -0
- package/dist/lib/runtime/subscription-quota-order.d.ts +17 -0
- package/dist/lib/runtime/subscription-quota-order.d.ts.map +1 -0
- package/dist/lib/runtime/subscription-quota-order.js +31 -0
- package/dist/lib/runtime/workspace-model-scopes.d.ts +15 -0
- package/dist/lib/runtime/workspace-model-scopes.d.ts.map +1 -0
- package/dist/lib/runtime/workspace-model-scopes.js +34 -0
- package/dist/lib/runtime-constants.d.ts +3 -0
- package/dist/lib/runtime-constants.d.ts.map +1 -1
- package/dist/lib/runtime-constants.js +5 -0
- package/dist/lib/runtime-paths.d.ts.map +1 -1
- package/dist/lib/runtime-paths.js +4 -1
- package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
- package/dist/lib/runtime-rotation-proxy.js +852 -42
- package/dist/lib/schemas.d.ts +20 -0
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +3 -0
- package/dist/lib/storage/credential-sidecars.d.ts +13 -0
- package/dist/lib/storage/credential-sidecars.d.ts.map +1 -0
- package/dist/lib/storage/credential-sidecars.js +52 -0
- package/dist/lib/storage/file-lock.d.ts +9 -0
- package/dist/lib/storage/file-lock.d.ts.map +1 -0
- package/dist/lib/storage/file-lock.js +186 -0
- package/dist/lib/storage/flagged-storage.d.ts.map +1 -1
- package/dist/lib/storage/flagged-storage.js +12 -0
- package/dist/lib/storage/path-state.d.ts +2 -0
- package/dist/lib/storage/path-state.d.ts.map +1 -1
- package/dist/lib/storage/path-state.js +9 -0
- package/dist/lib/storage/paths.js +4 -4
- package/dist/lib/storage/pending-auth.d.ts +18 -0
- package/dist/lib/storage/pending-auth.d.ts.map +1 -0
- package/dist/lib/storage/pending-auth.js +155 -0
- package/dist/lib/storage/public-types.d.ts +13 -0
- package/dist/lib/storage/public-types.d.ts.map +1 -1
- package/dist/lib/storage/record-identity.d.ts +16 -0
- package/dist/lib/storage/record-identity.d.ts.map +1 -0
- package/dist/lib/storage/record-identity.js +16 -0
- package/dist/lib/storage/snapshot-merge.d.ts +16 -0
- package/dist/lib/storage/snapshot-merge.d.ts.map +1 -0
- package/dist/lib/storage/snapshot-merge.js +206 -0
- package/dist/lib/storage/transactions.d.ts.map +1 -1
- package/dist/lib/storage/transactions.js +5 -4
- package/dist/lib/storage.d.ts +6 -0
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +77 -7
- package/dist/lib/ui/auth-menu-builder.d.ts +2 -0
- package/dist/lib/ui/auth-menu-builder.d.ts.map +1 -1
- package/dist/lib/ui/auth-menu-builder.js +1 -0
- package/dist/lib/ui/auth-menu.d.ts.map +1 -1
- package/dist/lib/ui/auth-menu.js +1 -0
- package/dist/lib/ui/check-progress.d.ts +8 -0
- package/dist/lib/ui/check-progress.d.ts.map +1 -0
- package/dist/lib/ui/check-progress.js +30 -0
- package/dist/lib/ui/format.d.ts +3 -1
- package/dist/lib/ui/format.d.ts.map +1 -1
- package/dist/lib/ui/format.js +8 -0
- package/dist/lib/ui/ui-copy.d.ts +2 -2
- package/dist/lib/ui/ui-copy.js +2 -2
- package/dist/lib/usage/pricing.js +2 -2
- package/dist/lib/usage/usage-extraction.d.ts +3 -1
- package/dist/lib/usage/usage-extraction.d.ts.map +1 -1
- package/dist/lib/usage/usage-extraction.js +46 -9
- package/node_modules/@codex-ai/plugin/dist/index.d.ts +2 -2
- package/node_modules/@codex-ai/plugin/dist/index.js +2 -2
- package/node_modules/@codex-ai/plugin/dist/tool.d.ts +42 -42
- package/node_modules/@codex-ai/plugin/dist/tool.js +29 -29
- package/node_modules/@codex-ai/plugin/package.json +9 -9
- package/node_modules/@codex-ai/sdk/dist/index.d.ts +4 -4
- package/node_modules/@codex-ai/sdk/dist/index.js +2 -2
- package/node_modules/@codex-ai/sdk/package.json +8 -8
- package/package.json +200 -197
- package/scripts/codex-app-launcher.js +653 -653
- package/scripts/codex-app-router.js +373 -366
- package/scripts/codex-bin-resolver.js +313 -281
- package/scripts/codex-multi-auth.js +59 -59
- package/scripts/codex-routing.js +62 -61
- package/scripts/codex.js +6642 -6564
- package/scripts/install-codex-auth-utils.js +213 -213
- package/scripts/mcodex.js +367 -367
- package/scripts/postinstall.js +114 -114
- package/scripts/preuninstall.js +265 -265
- package/vendor/codex-ai-plugin/dist/index.d.ts +2 -2
- package/vendor/codex-ai-plugin/dist/index.js +2 -2
- package/vendor/codex-ai-plugin/dist/tool.d.ts +42 -42
- package/vendor/codex-ai-plugin/dist/tool.js +29 -29
- package/vendor/codex-ai-plugin/package.json +9 -9
- package/vendor/codex-ai-sdk/dist/index.d.ts +4 -4
- package/vendor/codex-ai-sdk/dist/index.js +2 -2
- package/vendor/codex-ai-sdk/package.json +8 -8
|
@@ -1,213 +1,213 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
|
|
3
|
-
import { rename as fsRename } from "node:fs/promises";
|
|
4
|
-
import { homedir } from "node:os";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import process from "node:process";
|
|
7
|
-
|
|
8
|
-
const PLUGIN_NAME = "codex-multi-auth";
|
|
9
|
-
const LEGACY_PLUGIN_NAME = "@ndycode/codex-multi-auth";
|
|
10
|
-
const PLUGIN_NAMES = [PLUGIN_NAME, LEGACY_PLUGIN_NAME];
|
|
11
|
-
|
|
12
|
-
const TRUE_VALUES = new Set(["1", "true", "yes"]);
|
|
13
|
-
const FALSE_VALUES = new Set(["0", "false", "no"]);
|
|
14
|
-
const CI_ENV_KEYS = [
|
|
15
|
-
"CI",
|
|
16
|
-
"GITHUB_ACTIONS",
|
|
17
|
-
"GITLAB_CI",
|
|
18
|
-
"CIRCLECI",
|
|
19
|
-
"BUILDKITE",
|
|
20
|
-
"TF_BUILD",
|
|
21
|
-
"TEAMCITY_VERSION",
|
|
22
|
-
"JENKINS_URL",
|
|
23
|
-
"TRAVIS",
|
|
24
|
-
"APPVEYOR",
|
|
25
|
-
"BITBUCKET_BUILD_NUMBER",
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
/** @param {string | undefined} value */
|
|
29
|
-
function readOptionalBooleanValue(value) {
|
|
30
|
-
if (value === undefined || value.trim().length === 0) return null;
|
|
31
|
-
const normalized = value.trim().toLowerCase();
|
|
32
|
-
if (TRUE_VALUES.has(normalized)) return true;
|
|
33
|
-
if (FALSE_VALUES.has(normalized)) return false;
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** @param {NodeJS.ProcessEnv} env @param {string} key */
|
|
38
|
-
function isEnabledEnvFlag(env, key) {
|
|
39
|
-
const value = env[key];
|
|
40
|
-
if (value === undefined || value.trim().length === 0) return false;
|
|
41
|
-
return readOptionalBooleanValue(value) !== false;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** @param {NodeJS.ProcessEnv} [env] */
|
|
45
|
-
export function isCiEnvironment(env = process.env) {
|
|
46
|
-
if (readOptionalBooleanValue(env.npm_config_ignore_scripts) === true) return true;
|
|
47
|
-
return CI_ENV_KEYS.some((key) => isEnabledEnvFlag(env, key));
|
|
48
|
-
}
|
|
49
|
-
export const FILE_RETRY_CODES = new Set([
|
|
50
|
-
"EBUSY",
|
|
51
|
-
"EPERM",
|
|
52
|
-
"EAGAIN",
|
|
53
|
-
"ENOTEMPTY",
|
|
54
|
-
"EACCES",
|
|
55
|
-
]);
|
|
56
|
-
export const FILE_RETRY_MAX_ATTEMPTS = 6;
|
|
57
|
-
export const FILE_RETRY_BASE_DELAY_MS = 25;
|
|
58
|
-
export const FILE_RETRY_JITTER_MS = 20;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* @param {NodeJS.Platform} [platform]
|
|
62
|
-
* @param {NodeJS.ProcessEnv} [env]
|
|
63
|
-
* @param {string} [home]
|
|
64
|
-
*/
|
|
65
|
-
export function resolveInstallPaths(
|
|
66
|
-
platform = process.platform,
|
|
67
|
-
env = process.env,
|
|
68
|
-
home = homedir(),
|
|
69
|
-
) {
|
|
70
|
-
const isWindows = platform === "win32";
|
|
71
|
-
const appData = (env.APPDATA ?? "").trim();
|
|
72
|
-
const localAppData = (env.LOCALAPPDATA ?? appData).trim();
|
|
73
|
-
const configBase = isWindows
|
|
74
|
-
? appData || join(home, "AppData", "Roaming")
|
|
75
|
-
: join(home, ".config");
|
|
76
|
-
const cacheBase = isWindows
|
|
77
|
-
? localAppData || join(home, "AppData", "Local")
|
|
78
|
-
: join(home, ".cache");
|
|
79
|
-
const configDir = join(configBase, "Codex");
|
|
80
|
-
const configPath = join(configDir, "Codex.json");
|
|
81
|
-
const cacheDir = join(cacheBase, "Codex");
|
|
82
|
-
return {
|
|
83
|
-
configDir,
|
|
84
|
-
configPath,
|
|
85
|
-
cacheDir,
|
|
86
|
-
cacheNodeModules: join(cacheDir, "node_modules", PLUGIN_NAME),
|
|
87
|
-
cacheLegacyNodeModules: join(cacheDir, "node_modules", "@ndycode", "codex-multi-auth"),
|
|
88
|
-
cacheBunLock: join(cacheDir, "bun.lock"),
|
|
89
|
-
cachePackageJson: join(cacheDir, "package.json"),
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** @param {unknown} list */
|
|
94
|
-
export function removePluginFromList(list) {
|
|
95
|
-
const entries = Array.isArray(list) ? list.filter(Boolean) : [];
|
|
96
|
-
return entries.filter((entry) => {
|
|
97
|
-
if (typeof entry !== "string") return true;
|
|
98
|
-
return !PLUGIN_NAMES.some(
|
|
99
|
-
(pluginName) => entry === pluginName || entry.startsWith(`${pluginName}@`),
|
|
100
|
-
);
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** @param {unknown} list */
|
|
105
|
-
export function normalizePluginList(list) {
|
|
106
|
-
const entries = Array.isArray(list) ? list.filter(Boolean) : [];
|
|
107
|
-
const filtered = entries.filter((entry) => {
|
|
108
|
-
if (typeof entry !== "string") return true;
|
|
109
|
-
return !PLUGIN_NAMES.some(
|
|
110
|
-
(pluginName) => entry === pluginName || entry.startsWith(`${pluginName}@`),
|
|
111
|
-
);
|
|
112
|
-
});
|
|
113
|
-
const deduped = [];
|
|
114
|
-
const seen = new Set();
|
|
115
|
-
for (const entry of filtered) {
|
|
116
|
-
const key =
|
|
117
|
-
typeof entry === "string" ? `s:${entry}` : `j:${JSON.stringify(entry)}`;
|
|
118
|
-
if (seen.has(key)) continue;
|
|
119
|
-
seen.add(key);
|
|
120
|
-
deduped.push(entry);
|
|
121
|
-
}
|
|
122
|
-
return [...deduped, PLUGIN_NAME];
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/** @param {number} ms */
|
|
126
|
-
function sleep(ms) {
|
|
127
|
-
// Keep this helper local so installer scripts remain standalone and do not depend on lib/.
|
|
128
|
-
return new Promise((resolve) => {
|
|
129
|
-
setTimeout(resolve, ms);
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/** @param {unknown} error */
|
|
134
|
-
function shouldRetryFileOperation(error) {
|
|
135
|
-
const fileError = /** @type {NodeJS.ErrnoException | undefined} */ (error);
|
|
136
|
-
return (
|
|
137
|
-
fileError instanceof Error &&
|
|
138
|
-
typeof fileError.code === "string" &&
|
|
139
|
-
FILE_RETRY_CODES.has(fileError.code)
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/** @template T @param {() => Promise<T>} operation */
|
|
144
|
-
export async function withFileOperationRetry(operation) {
|
|
145
|
-
for (let attempt = 1; ; attempt += 1) {
|
|
146
|
-
try {
|
|
147
|
-
return await operation();
|
|
148
|
-
} catch (error) {
|
|
149
|
-
if (
|
|
150
|
-
!shouldRetryFileOperation(error) ||
|
|
151
|
-
attempt >= FILE_RETRY_MAX_ATTEMPTS
|
|
152
|
-
) {
|
|
153
|
-
throw error;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const jitter = Math.floor(Math.random() * FILE_RETRY_JITTER_MS);
|
|
157
|
-
const delayMs = FILE_RETRY_BASE_DELAY_MS * 2 ** (attempt - 1) + jitter;
|
|
158
|
-
await sleep(delayMs);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* @param {string} sourcePath
|
|
165
|
-
* @param {string} targetPath
|
|
166
|
-
* @param {{
|
|
167
|
-
* rename?: (sourcePath: string, targetPath: string) => Promise<void>,
|
|
168
|
-
* log?: (message: string) => void,
|
|
169
|
-
* maxRetries?: number,
|
|
170
|
-
* baseDelayMs?: number,
|
|
171
|
-
* jitterMs?: number,
|
|
172
|
-
* random?: () => number,
|
|
173
|
-
* sleep?: (ms: number) => Promise<void>,
|
|
174
|
-
* }} [options]
|
|
175
|
-
*/
|
|
176
|
-
export async function renameWithRetry(sourcePath, targetPath, options = {}) {
|
|
177
|
-
const {
|
|
178
|
-
rename = fsRename,
|
|
179
|
-
log = () => {},
|
|
180
|
-
maxRetries = FILE_RETRY_MAX_ATTEMPTS,
|
|
181
|
-
baseDelayMs = FILE_RETRY_BASE_DELAY_MS,
|
|
182
|
-
jitterMs = FILE_RETRY_JITTER_MS,
|
|
183
|
-
random = Math.random,
|
|
184
|
-
sleep: sleepImpl = sleep,
|
|
185
|
-
} = options;
|
|
186
|
-
|
|
187
|
-
if (!Number.isInteger(maxRetries) || maxRetries < 1) {
|
|
188
|
-
throw new RangeError("maxRetries must be an integer >= 1");
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
for (let attempt = 0; attempt < maxRetries; attempt += 1) {
|
|
192
|
-
try {
|
|
193
|
-
await rename(sourcePath, targetPath);
|
|
194
|
-
return;
|
|
195
|
-
} catch (error) {
|
|
196
|
-
const code =
|
|
197
|
-
error && typeof error === "object" && "code" in error
|
|
198
|
-
? error.code
|
|
199
|
-
: undefined;
|
|
200
|
-
const isRetryable =
|
|
201
|
-
typeof code === "string" && FILE_RETRY_CODES.has(code);
|
|
202
|
-
if (!isRetryable || attempt === maxRetries - 1) {
|
|
203
|
-
throw error;
|
|
204
|
-
}
|
|
205
|
-
const delayMs =
|
|
206
|
-
baseDelayMs * 2 ** attempt + Math.floor(random() * jitterMs);
|
|
207
|
-
log(
|
|
208
|
-
`Retrying atomic rename (${attempt + 1}/${maxRetries}) code=${code ?? "unknown"} source=${sourcePath} target=${targetPath} delayMs=${delayMs}`,
|
|
209
|
-
);
|
|
210
|
-
await sleepImpl(delayMs);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import { rename as fsRename } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import process from "node:process";
|
|
7
|
+
|
|
8
|
+
const PLUGIN_NAME = "codex-multi-auth";
|
|
9
|
+
const LEGACY_PLUGIN_NAME = "@ndycode/codex-multi-auth";
|
|
10
|
+
const PLUGIN_NAMES = [PLUGIN_NAME, LEGACY_PLUGIN_NAME];
|
|
11
|
+
|
|
12
|
+
const TRUE_VALUES = new Set(["1", "true", "yes"]);
|
|
13
|
+
const FALSE_VALUES = new Set(["0", "false", "no"]);
|
|
14
|
+
const CI_ENV_KEYS = [
|
|
15
|
+
"CI",
|
|
16
|
+
"GITHUB_ACTIONS",
|
|
17
|
+
"GITLAB_CI",
|
|
18
|
+
"CIRCLECI",
|
|
19
|
+
"BUILDKITE",
|
|
20
|
+
"TF_BUILD",
|
|
21
|
+
"TEAMCITY_VERSION",
|
|
22
|
+
"JENKINS_URL",
|
|
23
|
+
"TRAVIS",
|
|
24
|
+
"APPVEYOR",
|
|
25
|
+
"BITBUCKET_BUILD_NUMBER",
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
/** @param {string | undefined} value */
|
|
29
|
+
function readOptionalBooleanValue(value) {
|
|
30
|
+
if (value === undefined || value.trim().length === 0) return null;
|
|
31
|
+
const normalized = value.trim().toLowerCase();
|
|
32
|
+
if (TRUE_VALUES.has(normalized)) return true;
|
|
33
|
+
if (FALSE_VALUES.has(normalized)) return false;
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** @param {NodeJS.ProcessEnv} env @param {string} key */
|
|
38
|
+
function isEnabledEnvFlag(env, key) {
|
|
39
|
+
const value = env[key];
|
|
40
|
+
if (value === undefined || value.trim().length === 0) return false;
|
|
41
|
+
return readOptionalBooleanValue(value) !== false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** @param {NodeJS.ProcessEnv} [env] */
|
|
45
|
+
export function isCiEnvironment(env = process.env) {
|
|
46
|
+
if (readOptionalBooleanValue(env.npm_config_ignore_scripts) === true) return true;
|
|
47
|
+
return CI_ENV_KEYS.some((key) => isEnabledEnvFlag(env, key));
|
|
48
|
+
}
|
|
49
|
+
export const FILE_RETRY_CODES = new Set([
|
|
50
|
+
"EBUSY",
|
|
51
|
+
"EPERM",
|
|
52
|
+
"EAGAIN",
|
|
53
|
+
"ENOTEMPTY",
|
|
54
|
+
"EACCES",
|
|
55
|
+
]);
|
|
56
|
+
export const FILE_RETRY_MAX_ATTEMPTS = 6;
|
|
57
|
+
export const FILE_RETRY_BASE_DELAY_MS = 25;
|
|
58
|
+
export const FILE_RETRY_JITTER_MS = 20;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @param {NodeJS.Platform} [platform]
|
|
62
|
+
* @param {NodeJS.ProcessEnv} [env]
|
|
63
|
+
* @param {string} [home]
|
|
64
|
+
*/
|
|
65
|
+
export function resolveInstallPaths(
|
|
66
|
+
platform = process.platform,
|
|
67
|
+
env = process.env,
|
|
68
|
+
home = homedir(),
|
|
69
|
+
) {
|
|
70
|
+
const isWindows = platform === "win32";
|
|
71
|
+
const appData = (env.APPDATA ?? "").trim();
|
|
72
|
+
const localAppData = (env.LOCALAPPDATA ?? appData).trim();
|
|
73
|
+
const configBase = isWindows
|
|
74
|
+
? appData || join(home, "AppData", "Roaming")
|
|
75
|
+
: join(home, ".config");
|
|
76
|
+
const cacheBase = isWindows
|
|
77
|
+
? localAppData || join(home, "AppData", "Local")
|
|
78
|
+
: join(home, ".cache");
|
|
79
|
+
const configDir = join(configBase, "Codex");
|
|
80
|
+
const configPath = join(configDir, "Codex.json");
|
|
81
|
+
const cacheDir = join(cacheBase, "Codex");
|
|
82
|
+
return {
|
|
83
|
+
configDir,
|
|
84
|
+
configPath,
|
|
85
|
+
cacheDir,
|
|
86
|
+
cacheNodeModules: join(cacheDir, "node_modules", PLUGIN_NAME),
|
|
87
|
+
cacheLegacyNodeModules: join(cacheDir, "node_modules", "@ndycode", "codex-multi-auth"),
|
|
88
|
+
cacheBunLock: join(cacheDir, "bun.lock"),
|
|
89
|
+
cachePackageJson: join(cacheDir, "package.json"),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** @param {unknown} list */
|
|
94
|
+
export function removePluginFromList(list) {
|
|
95
|
+
const entries = Array.isArray(list) ? list.filter(Boolean) : [];
|
|
96
|
+
return entries.filter((entry) => {
|
|
97
|
+
if (typeof entry !== "string") return true;
|
|
98
|
+
return !PLUGIN_NAMES.some(
|
|
99
|
+
(pluginName) => entry === pluginName || entry.startsWith(`${pluginName}@`),
|
|
100
|
+
);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** @param {unknown} list */
|
|
105
|
+
export function normalizePluginList(list) {
|
|
106
|
+
const entries = Array.isArray(list) ? list.filter(Boolean) : [];
|
|
107
|
+
const filtered = entries.filter((entry) => {
|
|
108
|
+
if (typeof entry !== "string") return true;
|
|
109
|
+
return !PLUGIN_NAMES.some(
|
|
110
|
+
(pluginName) => entry === pluginName || entry.startsWith(`${pluginName}@`),
|
|
111
|
+
);
|
|
112
|
+
});
|
|
113
|
+
const deduped = [];
|
|
114
|
+
const seen = new Set();
|
|
115
|
+
for (const entry of filtered) {
|
|
116
|
+
const key =
|
|
117
|
+
typeof entry === "string" ? `s:${entry}` : `j:${JSON.stringify(entry)}`;
|
|
118
|
+
if (seen.has(key)) continue;
|
|
119
|
+
seen.add(key);
|
|
120
|
+
deduped.push(entry);
|
|
121
|
+
}
|
|
122
|
+
return [...deduped, PLUGIN_NAME];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** @param {number} ms */
|
|
126
|
+
function sleep(ms) {
|
|
127
|
+
// Keep this helper local so installer scripts remain standalone and do not depend on lib/.
|
|
128
|
+
return new Promise((resolve) => {
|
|
129
|
+
setTimeout(resolve, ms);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** @param {unknown} error */
|
|
134
|
+
function shouldRetryFileOperation(error) {
|
|
135
|
+
const fileError = /** @type {NodeJS.ErrnoException | undefined} */ (error);
|
|
136
|
+
return (
|
|
137
|
+
fileError instanceof Error &&
|
|
138
|
+
typeof fileError.code === "string" &&
|
|
139
|
+
FILE_RETRY_CODES.has(fileError.code)
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** @template T @param {() => Promise<T>} operation */
|
|
144
|
+
export async function withFileOperationRetry(operation) {
|
|
145
|
+
for (let attempt = 1; ; attempt += 1) {
|
|
146
|
+
try {
|
|
147
|
+
return await operation();
|
|
148
|
+
} catch (error) {
|
|
149
|
+
if (
|
|
150
|
+
!shouldRetryFileOperation(error) ||
|
|
151
|
+
attempt >= FILE_RETRY_MAX_ATTEMPTS
|
|
152
|
+
) {
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const jitter = Math.floor(Math.random() * FILE_RETRY_JITTER_MS);
|
|
157
|
+
const delayMs = FILE_RETRY_BASE_DELAY_MS * 2 ** (attempt - 1) + jitter;
|
|
158
|
+
await sleep(delayMs);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @param {string} sourcePath
|
|
165
|
+
* @param {string} targetPath
|
|
166
|
+
* @param {{
|
|
167
|
+
* rename?: (sourcePath: string, targetPath: string) => Promise<void>,
|
|
168
|
+
* log?: (message: string) => void,
|
|
169
|
+
* maxRetries?: number,
|
|
170
|
+
* baseDelayMs?: number,
|
|
171
|
+
* jitterMs?: number,
|
|
172
|
+
* random?: () => number,
|
|
173
|
+
* sleep?: (ms: number) => Promise<void>,
|
|
174
|
+
* }} [options]
|
|
175
|
+
*/
|
|
176
|
+
export async function renameWithRetry(sourcePath, targetPath, options = {}) {
|
|
177
|
+
const {
|
|
178
|
+
rename = fsRename,
|
|
179
|
+
log = () => {},
|
|
180
|
+
maxRetries = FILE_RETRY_MAX_ATTEMPTS,
|
|
181
|
+
baseDelayMs = FILE_RETRY_BASE_DELAY_MS,
|
|
182
|
+
jitterMs = FILE_RETRY_JITTER_MS,
|
|
183
|
+
random = Math.random,
|
|
184
|
+
sleep: sleepImpl = sleep,
|
|
185
|
+
} = options;
|
|
186
|
+
|
|
187
|
+
if (!Number.isInteger(maxRetries) || maxRetries < 1) {
|
|
188
|
+
throw new RangeError("maxRetries must be an integer >= 1");
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
for (let attempt = 0; attempt < maxRetries; attempt += 1) {
|
|
192
|
+
try {
|
|
193
|
+
await rename(sourcePath, targetPath);
|
|
194
|
+
return;
|
|
195
|
+
} catch (error) {
|
|
196
|
+
const code =
|
|
197
|
+
error && typeof error === "object" && "code" in error
|
|
198
|
+
? error.code
|
|
199
|
+
: undefined;
|
|
200
|
+
const isRetryable =
|
|
201
|
+
typeof code === "string" && FILE_RETRY_CODES.has(code);
|
|
202
|
+
if (!isRetryable || attempt === maxRetries - 1) {
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
const delayMs =
|
|
206
|
+
baseDelayMs * 2 ** attempt + Math.floor(random() * jitterMs);
|
|
207
|
+
log(
|
|
208
|
+
`Retrying atomic rename (${attempt + 1}/${maxRetries}) code=${code ?? "unknown"} source=${sourcePath} target=${targetPath} delayMs=${delayMs}`,
|
|
209
|
+
);
|
|
210
|
+
await sleepImpl(delayMs);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|