@mostok/codexes 0.1.0 → 0.3.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.
Files changed (32) hide show
  1. package/README.md +10 -4
  2. package/dist/cli.js +2072 -1385
  3. package/dist/cli.js.map +4 -4
  4. package/dist/commands/account-list/run-account-list-command.js +36 -18
  5. package/dist/commands/account-list/run-account-list-command.js.map +1 -1
  6. package/dist/commands/root/run-root-command.js +54 -6
  7. package/dist/commands/root/run-root-command.js.map +1 -1
  8. package/dist/config/wrapper-config.d.ts +2 -1
  9. package/dist/config/wrapper-config.js +66 -17
  10. package/dist/config/wrapper-config.js.map +1 -1
  11. package/dist/core/context.d.ts +3 -0
  12. package/dist/core/context.js +3 -0
  13. package/dist/core/context.js.map +1 -1
  14. package/dist/selection/format-selection-summary.d.ts +12 -0
  15. package/dist/selection/format-selection-summary.js +182 -0
  16. package/dist/selection/format-selection-summary.js.map +1 -0
  17. package/dist/selection/select-account.js +7 -163
  18. package/dist/selection/select-account.js.map +1 -1
  19. package/dist/selection/selection-summary.d.ts +38 -0
  20. package/dist/selection/selection-summary.js +405 -0
  21. package/dist/selection/selection-summary.js.map +1 -0
  22. package/dist/selection/usage-cache.js +23 -0
  23. package/dist/selection/usage-cache.js.map +1 -1
  24. package/dist/selection/usage-normalize.js +182 -19
  25. package/dist/selection/usage-normalize.js.map +1 -1
  26. package/dist/selection/usage-probe-coordinator.js +13 -0
  27. package/dist/selection/usage-probe-coordinator.js.map +1 -1
  28. package/dist/selection/usage-types.d.ts +18 -2
  29. package/package.json +1 -1
  30. package/dist/accounts/resolve-active-account.d.ts +0 -6
  31. package/dist/accounts/resolve-active-account.js +0 -32
  32. package/dist/accounts/resolve-active-account.js.map +0 -1
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/logging/logger.ts", "../src/config/wrapper-config.ts", "../src/core/paths.ts", "../src/process/find-codex-binary.ts", "../src/runtime/init/initialize-runtime.ts", "../src/accounts/account-registry.ts", "../src/core/context.ts", "../src/runtime/runtime-contract.ts", "../src/commands/account-add/run-account-add-command.ts", "../src/runtime/login-workspace.ts", "../src/process/run-codex-login.ts", "../src/process/codex-launch-spec.ts", "../src/accounts/account-resolution.ts", "../src/commands/account-list/run-account-list-command.ts", "../src/commands/account-remove/run-account-remove-command.ts", "../src/commands/account-use/run-account-use-command.ts", "../src/runtime/lock/runtime-lock.ts", "../src/runtime/activate-account/activate-account.ts", "../src/process/spawn-codex-command.ts", "../src/selection/account-auth-state.ts", "../src/selection/usage-normalize.ts", "../src/selection/usage-client.ts", "../src/selection/usage-cache.ts", "../src/selection/usage-probe-coordinator.ts", "../src/selection/select-account.ts", "../src/commands/root/run-root-command.ts", "../src/core/bootstrap.ts", "../src/cli.ts"],
4
- "sourcesContent": ["type LogLevel = \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\";\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n DEBUG: 10,\n INFO: 20,\n WARN: 30,\n ERROR: 40,\n};\n\nexport interface LogSink {\n write(level: LogLevel, event: string, details?: Record<string, unknown>): void;\n}\n\nexport interface Logger {\n debug(event: string, details?: Record<string, unknown>): void;\n info(event: string, details?: Record<string, unknown>): void;\n warn(event: string, details?: Record<string, unknown>): void;\n error(event: string, details?: Record<string, unknown>): void;\n}\n\nexport function resolveLogLevel(value: string | undefined): LogLevel {\n switch (value?.toUpperCase()) {\n case \"ERROR\":\n return \"ERROR\";\n case \"WARN\":\n return \"WARN\";\n case \"INFO\":\n return \"INFO\";\n case \"DEBUG\":\n return \"DEBUG\";\n default:\n return \"ERROR\";\n }\n}\n\nexport function createLogSink(\n stream: Pick<NodeJS.WriteStream, \"write\">,\n): LogSink {\n return {\n write(level, event, details = {}) {\n stream.write(\n `${JSON.stringify({\n ts: new Date().toISOString(),\n level,\n event,\n details,\n })}\\n`,\n );\n },\n };\n}\n\nexport function createLogger(input: {\n level: string;\n name: string;\n sink: LogSink;\n}): Logger {\n const configuredLevel = resolveLogLevel(input.level);\n\n return {\n debug(event, details) {\n logWithLevel(\"DEBUG\", input.name, configuredLevel, input.sink, event, details);\n },\n info(event, details) {\n logWithLevel(\"INFO\", input.name, configuredLevel, input.sink, event, details);\n },\n warn(event, details) {\n logWithLevel(\"WARN\", input.name, configuredLevel, input.sink, event, details);\n },\n error(event, details) {\n logWithLevel(\"ERROR\", input.name, configuredLevel, input.sink, event, details);\n },\n };\n}\n\nfunction logWithLevel(\n level: LogLevel,\n name: string,\n configuredLevel: LogLevel,\n sink: LogSink,\n event: string,\n details?: Record<string, unknown>,\n): void {\n if (LOG_LEVEL_ORDER[level] < LOG_LEVEL_ORDER[configuredLevel]) {\n return;\n }\n\n sink.write(level, `${name}.${event}`, details);\n}\n", "import { mkdir, readFile } from \"node:fs/promises\";\nimport type { Logger } from \"../logging/logger.js\";\nimport type { ResolvedPaths } from \"../core/paths.js\";\n\nexport type CredentialStoreMode = \"file\" | \"keyring\" | \"auto\" | \"missing\" | \"unknown\";\nexport type AccountSelectionStrategy =\n | \"manual-default\"\n | \"single-account\"\n | \"remaining-limit-experimental\";\n\nexport interface WrapperConfig {\n configFilePath: string;\n codexConfigFilePath: string;\n selectionCacheFilePath: string;\n credentialStoreMode: CredentialStoreMode;\n credentialStorePolicyReason: string;\n accountSelectionStrategy: AccountSelectionStrategy;\n experimentalSelection: ExperimentalSelectionConfig;\n}\n\nexport interface ExperimentalSelectionConfig {\n enabled: boolean;\n probeTimeoutMs: number;\n cacheTtlMs: number;\n useAccountIdHeader: boolean;\n}\n\nconst DEFAULT_EXPERIMENTAL_PROBE_TIMEOUT_MS = 3_500;\nconst DEFAULT_EXPERIMENTAL_CACHE_TTL_MS = 60_000;\n\nexport async function resolveWrapperConfig(input: {\n env: NodeJS.ProcessEnv;\n logger: Logger;\n paths: ResolvedPaths;\n}): Promise<WrapperConfig> {\n await mkdir(input.paths.dataRoot, { recursive: true });\n\n const credentialStoreMode = await detectCredentialStoreMode(\n input.paths.codexConfigFile,\n input.logger,\n );\n\n const resolved = {\n configFilePath: input.paths.wrapperConfigFile,\n codexConfigFilePath: input.paths.codexConfigFile,\n selectionCacheFilePath: input.paths.selectionCacheFile,\n credentialStoreMode,\n credentialStorePolicyReason:\n credentialStoreMode === \"file\"\n ? \"file mode detected in Codex config\"\n : \"codexes currently supports only file-backed auth storage\",\n accountSelectionStrategy: resolveAccountSelectionStrategy(input.env),\n experimentalSelection: resolveExperimentalSelectionConfig(input.env, input.logger),\n } satisfies WrapperConfig;\n\n input.logger.info(\"wrapper_config.resolved\", {\n configFilePath: resolved.configFilePath,\n codexConfigFilePath: resolved.codexConfigFilePath,\n selectionCacheFilePath: resolved.selectionCacheFilePath,\n credentialStoreMode: resolved.credentialStoreMode,\n accountSelectionStrategy: resolved.accountSelectionStrategy,\n experimentalSelection: resolved.experimentalSelection,\n });\n\n return resolved;\n}\n\nfunction resolveExperimentalSelectionConfig(\n env: NodeJS.ProcessEnv,\n logger: Logger,\n): ExperimentalSelectionConfig {\n const probeTimeoutMs = resolvePositiveIntegerEnv({\n defaultValue: DEFAULT_EXPERIMENTAL_PROBE_TIMEOUT_MS,\n env,\n envKey: \"CODEXES_EXPERIMENTAL_SELECTION_TIMEOUT_MS\",\n logger,\n });\n const cacheTtlMs = resolvePositiveIntegerEnv({\n defaultValue: DEFAULT_EXPERIMENTAL_CACHE_TTL_MS,\n env,\n envKey: \"CODEXES_EXPERIMENTAL_SELECTION_CACHE_TTL_MS\",\n logger,\n });\n const useAccountIdHeader = resolveBooleanEnv(\n env.CODEXES_EXPERIMENTAL_SELECTION_USE_ACCOUNT_ID_HEADER,\n );\n const enabled =\n resolveAccountSelectionStrategy(env) === \"remaining-limit-experimental\";\n\n logger.debug(\"wrapper_config.experimental_selection_resolved\", {\n enabled,\n probeTimeoutMs,\n cacheTtlMs,\n useAccountIdHeader,\n });\n\n return {\n enabled,\n probeTimeoutMs,\n cacheTtlMs,\n useAccountIdHeader,\n };\n}\n\nfunction resolveAccountSelectionStrategy(\n env: NodeJS.ProcessEnv,\n): AccountSelectionStrategy {\n switch (env.CODEXES_ACCOUNT_SELECTION_STRATEGY?.trim().toLowerCase()) {\n case \"single-account\":\n return \"single-account\";\n case \"remaining-limit-experimental\":\n return \"remaining-limit-experimental\";\n case \"manual-default\":\n case undefined:\n case \"\":\n return \"manual-default\";\n default:\n return \"manual-default\";\n }\n}\n\nasync function detectCredentialStoreMode(\n configFile: string,\n logger: Logger,\n): Promise<CredentialStoreMode> {\n try {\n const rawConfig = await readFile(configFile, \"utf8\");\n const mode = parseCredentialStoreMode(rawConfig);\n\n logger.debug(\"credential_store.detected\", {\n configFile,\n credentialStoreMode: mode,\n });\n\n return mode;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n logger.warn(\"credential_store.config_missing\", {\n configFile,\n fallbackMode: \"missing\",\n });\n return \"missing\";\n }\n\n logger.error(\"credential_store.read_failed\", {\n configFile,\n message: error instanceof Error ? error.message : String(error),\n });\n\n return \"unknown\";\n }\n}\n\nfunction parseCredentialStoreMode(rawConfig: string): CredentialStoreMode {\n const match = rawConfig.match(/^\\s*cli_auth_credentials_store\\s*=\\s*\"([^\"]+)\"/m);\n\n if (!match) {\n return \"missing\";\n }\n\n const configuredValue = match[1];\n\n if (!configuredValue) {\n return \"unknown\";\n }\n\n switch (configuredValue.trim().toLowerCase()) {\n case \"file\":\n return \"file\";\n case \"keyring\":\n return \"keyring\";\n case \"auto\":\n return \"auto\";\n default:\n return \"unknown\";\n }\n}\n\nfunction resolvePositiveIntegerEnv(input: {\n defaultValue: number;\n env: NodeJS.ProcessEnv;\n envKey: string;\n logger: Logger;\n}): number {\n const raw = input.env[input.envKey]?.trim();\n if (!raw) {\n return input.defaultValue;\n }\n\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n input.logger.warn(\"wrapper_config.invalid_env_override\", {\n envKey: input.envKey,\n rawValue: raw,\n fallbackValue: input.defaultValue,\n });\n return input.defaultValue;\n }\n\n return parsed;\n}\n\nfunction resolveBooleanEnv(value: string | undefined): boolean {\n switch (value?.trim().toLowerCase()) {\n case \"1\":\n case \"true\":\n case \"yes\":\n case \"on\":\n return true;\n default:\n return false;\n }\n}\n", "import path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface ResolvedPaths {\n projectRoot: string;\n dataRoot: string;\n sharedCodexHome: string;\n accountRoot: string;\n runtimeRoot: string;\n registryFile: string;\n wrapperConfigFile: string;\n codexConfigFile: string;\n selectionCacheFile: string;\n}\n\nexport function resolvePaths(\n cwd: string,\n env: NodeJS.ProcessEnv,\n): ResolvedPaths {\n const baseDataDir = resolveBaseDataDir(env);\n\n return {\n projectRoot: cwd,\n dataRoot: baseDataDir,\n sharedCodexHome: env.CODEX_HOME ?? path.join(baseDataDir, \"shared-home\"),\n accountRoot: path.join(baseDataDir, \"accounts\"),\n runtimeRoot: path.join(baseDataDir, \"runtime\"),\n registryFile: path.join(baseDataDir, \"registry.json\"),\n wrapperConfigFile: path.join(baseDataDir, \"codexes.json\"),\n codexConfigFile: path.join(env.CODEX_HOME ?? path.join(baseDataDir, \"shared-home\"), \"config.toml\"),\n selectionCacheFile: path.join(baseDataDir, \"selection-cache.json\"),\n };\n}\n\nfunction resolveBaseDataDir(env: NodeJS.ProcessEnv): string {\n if (process.platform === \"win32\") {\n return path.join(\n env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\"),\n \"codexes\",\n );\n }\n\n if (process.platform === \"darwin\") {\n return path.join(\n env.HOME ?? os.homedir(),\n \"Library\",\n \"Application Support\",\n \"codexes\",\n );\n }\n\n const xdgStateHome = env.XDG_STATE_HOME;\n\n if (xdgStateHome) {\n return path.join(xdgStateHome, \"codexes\");\n }\n\n return path.join(env.HOME ?? os.homedir(), \".local\", \"state\", \"codexes\");\n}\n", "import { access, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Logger } from \"../logging/logger.js\";\n\nexport interface CodexBinaryResolution {\n path: string | null;\n candidates: string[];\n rejectedCandidates: Array<{ candidate: string; reason: string }>;\n}\n\nexport async function findCodexBinary(input: {\n env: NodeJS.ProcessEnv;\n logger: Logger;\n wrapperExecutablePath: string;\n}): Promise<CodexBinaryResolution> {\n const candidates = buildCandidates(input.env);\n const rejectedCandidates: Array<{ candidate: string; reason: string }> = [];\n\n input.logger.debug(\"binary_resolution.start\", {\n wrapperExecutablePath: input.wrapperExecutablePath,\n candidateCount: candidates.length,\n });\n\n for (const candidate of candidates) {\n const reason = await getRejectionReason(candidate, input.wrapperExecutablePath);\n\n if (reason) {\n rejectedCandidates.push({ candidate, reason });\n input.logger.debug(\"binary_resolution.rejected\", { candidate, reason });\n continue;\n }\n\n input.logger.info(\"binary_resolution.selected\", { candidate });\n\n return {\n path: candidate,\n candidates,\n rejectedCandidates,\n };\n }\n\n input.logger.warn(\"binary_resolution.missing\", {\n wrapperExecutablePath: input.wrapperExecutablePath,\n rejectedCandidates,\n });\n\n return {\n path: null,\n candidates,\n rejectedCandidates,\n };\n}\n\nfunction buildCandidates(env: NodeJS.ProcessEnv): string[] {\n const pathValue = env.PATH ?? \"\";\n const pathEntries = pathValue\n .split(path.delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean);\n const executableNames = process.platform === \"win32\"\n ? [\"codex.cmd\", \"codex.exe\", \"codex.bat\"]\n : [\"codex\"];\n\n return Array.from(\n new Set(\n pathEntries.flatMap((entry) =>\n executableNames.map((executableName) => path.join(entry, executableName)),\n ),\n ),\n );\n}\n\nasync function getRejectionReason(\n candidate: string,\n wrapperExecutablePath: string,\n): Promise<string | null> {\n try {\n await access(candidate);\n } catch {\n return \"not_accessible\";\n }\n\n const [candidateStat, wrapperStat] = await Promise.all([\n stat(candidate).catch(() => null),\n stat(wrapperExecutablePath).catch(() => null),\n ]);\n\n if (!candidateStat || !candidateStat.isFile()) {\n return \"not_a_file\";\n }\n\n if (wrapperStat && isSameFile(candidate, wrapperExecutablePath, candidateStat, wrapperStat)) {\n return \"self_recursive_wrapper_path\";\n }\n\n if (path.basename(candidate).toLowerCase().startsWith(\"codexes\")) {\n return \"wrapper_named_binary\";\n }\n\n return null;\n}\n\nfunction isSameFile(\n candidate: string,\n wrapperExecutablePath: string,\n candidateStat: Awaited<ReturnType<typeof stat>>,\n wrapperStat: Awaited<ReturnType<typeof stat>>,\n): boolean {\n if (path.resolve(candidate) === path.resolve(wrapperExecutablePath)) {\n return true;\n }\n\n return candidateStat.ino === wrapperStat.ino && candidateStat.dev === wrapperStat.dev;\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport {\n copyFile,\n cp,\n mkdir,\n readFile,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport type { Logger } from \"../../logging/logger.js\";\nimport type { ResolvedPaths } from \"../../core/paths.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\n\nexport interface RuntimeInitializationResult {\n firstRun: boolean;\n legacyCodexHome: string;\n sharedCodexHome: string;\n createdDirectories: string[];\n createdFiles: string[];\n copiedSharedArtifacts: string[];\n skippedArtifacts: Array<{\n path: string;\n reason: string;\n }>;\n}\n\nexport async function initializeRuntimeEnvironment(input: {\n env: NodeJS.ProcessEnv;\n logger: Logger;\n paths: ResolvedPaths;\n}): Promise<RuntimeInitializationResult> {\n const legacyCodexHome = path.join(os.homedir(), \".codex\");\n const firstRun = !(await pathExists(input.paths.sharedCodexHome));\n const createdDirectories: string[] = [];\n const createdFiles: string[] = [];\n const copiedSharedArtifacts: string[] = [];\n const skippedArtifacts: RuntimeInitializationResult[\"skippedArtifacts\"] = [];\n\n input.logger.info(\"runtime_init.start\", {\n dataRoot: input.paths.dataRoot,\n sharedCodexHome: input.paths.sharedCodexHome,\n legacyCodexHome,\n firstRun,\n });\n\n for (const directory of [\n input.paths.dataRoot,\n input.paths.sharedCodexHome,\n input.paths.accountRoot,\n input.paths.runtimeRoot,\n path.join(input.paths.runtimeRoot, \"backups\"),\n path.join(input.paths.runtimeRoot, \"tmp\"),\n path.dirname(input.paths.registryFile),\n ]) {\n if (!(await pathExists(directory))) {\n createdDirectories.push(directory);\n input.logger.info(\"runtime_init.directory_create\", { directory });\n } else {\n input.logger.debug(\"runtime_init.directory_exists\", { directory });\n }\n\n await mkdir(directory, { recursive: true });\n }\n\n const configResult = await ensureSharedConfigToml({\n legacyCodexHome,\n logger: input.logger,\n sharedCodexHome: input.paths.sharedCodexHome,\n });\n createdFiles.push(...configResult.createdFiles);\n copiedSharedArtifacts.push(...configResult.copiedArtifacts);\n skippedArtifacts.push(...configResult.skippedArtifacts);\n\n const mcpResult = await ensureSharedFileCopy({\n artifactName: \"mcp.json\",\n logger: input.logger,\n sharedCodexHome: input.paths.sharedCodexHome,\n sourceCodexHome: legacyCodexHome,\n });\n createdFiles.push(...mcpResult.createdFiles);\n copiedSharedArtifacts.push(...mcpResult.copiedArtifacts);\n skippedArtifacts.push(...mcpResult.skippedArtifacts);\n\n const trustResult = await ensureSharedDirectoryCopy({\n artifactName: \"trust\",\n logger: input.logger,\n sharedCodexHome: input.paths.sharedCodexHome,\n sourceCodexHome: legacyCodexHome,\n });\n copiedSharedArtifacts.push(...trustResult.copiedArtifacts);\n skippedArtifacts.push(...trustResult.skippedArtifacts);\n\n // Registry creation is part of first-run runtime setup but must not create account auth state.\n const registry = createAccountRegistry({\n accountRoot: input.paths.accountRoot,\n logger: input.logger,\n registryFile: input.paths.registryFile,\n });\n if (!(await pathExists(input.paths.registryFile))) {\n createdFiles.push(input.paths.registryFile);\n input.logger.info(\"runtime_init.registry_bootstrap\", {\n registryFile: input.paths.registryFile,\n });\n } else {\n input.logger.debug(\"runtime_init.registry_exists\", {\n registryFile: input.paths.registryFile,\n });\n }\n await registry.listAccounts();\n\n const result: RuntimeInitializationResult = {\n firstRun,\n legacyCodexHome,\n sharedCodexHome: input.paths.sharedCodexHome,\n createdDirectories,\n createdFiles,\n copiedSharedArtifacts,\n skippedArtifacts,\n };\n\n input.logger.info(\"runtime_init.complete\", {\n firstRun: result.firstRun,\n createdDirectories: result.createdDirectories,\n createdFiles: result.createdFiles,\n copiedSharedArtifacts: result.copiedSharedArtifacts,\n skippedArtifacts: result.skippedArtifacts,\n });\n\n return result;\n}\n\nasync function ensureSharedConfigToml(input: {\n legacyCodexHome: string;\n logger: Logger;\n sharedCodexHome: string;\n}): Promise<SharedArtifactResult> {\n const targetPath = path.join(input.sharedCodexHome, \"config.toml\");\n const sourcePath = path.join(input.legacyCodexHome, \"config.toml\");\n\n if (await pathExists(targetPath)) {\n const existingConfig = await readFile(targetPath, \"utf8\");\n const existingMode = detectCredentialStoreMode(existingConfig);\n\n input.logger.debug(\"runtime_init.config_exists\", {\n targetPath,\n credentialStoreMode: existingMode,\n });\n\n if (existingMode === \"missing\") {\n await writeFile(targetPath, pinFileCredentialStore(existingConfig), \"utf8\");\n input.logger.info(\"runtime_init.config_file_mode_pinned\", {\n targetPath,\n });\n } else if (existingMode !== \"file\") {\n input.logger.warn(\"runtime_init.config_mode_unsupported\", {\n targetPath,\n credentialStoreMode: existingMode,\n });\n }\n\n return emptyArtifactResult();\n }\n\n if (await pathExists(sourcePath) && !samePath(sourcePath, targetPath)) {\n const sourceConfig = await readFile(sourcePath, \"utf8\");\n const pinnedConfig = pinFileCredentialStore(sourceConfig);\n await writeFile(targetPath, pinnedConfig, \"utf8\");\n\n input.logger.info(\"runtime_init.config_imported\", {\n sourcePath,\n targetPath,\n sourceCredentialStoreMode: detectCredentialStoreMode(sourceConfig),\n targetCredentialStoreMode: detectCredentialStoreMode(pinnedConfig),\n });\n\n return {\n copiedArtifacts: [\"config.toml\"],\n createdFiles: [targetPath],\n skippedArtifacts: [],\n };\n }\n\n await writeFile(\n targetPath,\n [\n \"cli_auth_credentials_store = \\\"file\\\"\",\n \"\",\n \"# Wrapper-owned shared Codex home for codexes.\",\n \"# Add MCP and trust configuration here as needed.\",\n \"\",\n ].join(\"\\n\"),\n \"utf8\",\n );\n input.logger.info(\"runtime_init.config_created\", {\n targetPath,\n });\n\n return {\n copiedArtifacts: [],\n createdFiles: [targetPath],\n skippedArtifacts: [],\n };\n}\n\nasync function ensureSharedFileCopy(input: {\n artifactName: string;\n logger: Logger;\n sharedCodexHome: string;\n sourceCodexHome: string;\n}): Promise<SharedArtifactResult> {\n const targetPath = path.join(input.sharedCodexHome, input.artifactName);\n const sourcePath = path.join(input.sourceCodexHome, input.artifactName);\n\n if (await pathExists(targetPath)) {\n input.logger.debug(\"runtime_init.file_exists\", {\n artifactName: input.artifactName,\n targetPath,\n });\n return emptyArtifactResult();\n }\n\n if (!(await pathExists(sourcePath)) || samePath(sourcePath, targetPath)) {\n input.logger.debug(\"runtime_init.file_skip\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n reason: \"source_missing_or_same_path\",\n });\n return {\n copiedArtifacts: [],\n createdFiles: [],\n skippedArtifacts: [\n {\n path: input.artifactName,\n reason: \"source_missing_or_same_path\",\n },\n ],\n };\n }\n\n await copyFile(sourcePath, targetPath);\n input.logger.info(\"runtime_init.file_copied\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n });\n\n return {\n copiedArtifacts: [input.artifactName],\n createdFiles: [targetPath],\n skippedArtifacts: [],\n };\n}\n\nasync function ensureSharedDirectoryCopy(input: {\n artifactName: string;\n logger: Logger;\n sharedCodexHome: string;\n sourceCodexHome: string;\n}): Promise<SharedArtifactResult> {\n const targetPath = path.join(input.sharedCodexHome, input.artifactName);\n const sourcePath = path.join(input.sourceCodexHome, input.artifactName);\n\n if (await pathExists(targetPath)) {\n input.logger.debug(\"runtime_init.directory_artifact_exists\", {\n artifactName: input.artifactName,\n targetPath,\n });\n return emptyArtifactResult();\n }\n\n if (!(await pathExists(sourcePath)) || samePath(sourcePath, targetPath)) {\n input.logger.debug(\"runtime_init.directory_artifact_skip\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n reason: \"source_missing_or_same_path\",\n });\n return {\n copiedArtifacts: [],\n createdFiles: [],\n skippedArtifacts: [\n {\n path: input.artifactName,\n reason: \"source_missing_or_same_path\",\n },\n ],\n };\n }\n\n await cp(sourcePath, targetPath, { recursive: true });\n input.logger.info(\"runtime_init.directory_artifact_copied\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n });\n\n return {\n copiedArtifacts: [input.artifactName],\n createdFiles: [],\n skippedArtifacts: [],\n };\n}\n\nfunction detectCredentialStoreMode(rawConfig: string): string {\n const match = rawConfig.match(/^\\s*cli_auth_credentials_store\\s*=\\s*\"([^\"]+)\"/m);\n return match?.[1]?.trim().toLowerCase() ?? \"missing\";\n}\n\nfunction pinFileCredentialStore(rawConfig: string): string {\n if (/^\\s*cli_auth_credentials_store\\s*=\\s*\"file\"/m.test(rawConfig)) {\n return rawConfig;\n }\n\n if (/^\\s*cli_auth_credentials_store\\s*=\\s*\"[^\"]+\"/m.test(rawConfig)) {\n return rawConfig.replace(\n /^\\s*cli_auth_credentials_store\\s*=\\s*\"[^\"]+\"/m,\n 'cli_auth_credentials_store = \"file\"',\n );\n }\n\n const trimmed = rawConfig.trim();\n if (!trimmed) {\n return 'cli_auth_credentials_store = \"file\"\\n';\n }\n\n return ['cli_auth_credentials_store = \"file\"', \"\", trimmed, \"\"].join(\"\\n\");\n}\n\nfunction samePath(left: string, right: string): boolean {\n return path.resolve(left) === path.resolve(right);\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n\n throw error;\n }\n}\n\ninterface SharedArtifactResult {\n copiedArtifacts: string[];\n createdFiles: string[];\n skippedArtifacts: Array<{\n path: string;\n reason: string;\n }>;\n}\n\nfunction emptyArtifactResult(): SharedArtifactResult {\n return {\n copiedArtifacts: [],\n createdFiles: [],\n skippedArtifacts: [],\n };\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Logger } from \"../logging/logger.js\";\n\nconst REGISTRY_SCHEMA_VERSION = 1;\n\nexport interface AccountRecord {\n id: string;\n label: string;\n authDirectory: string;\n createdAt: string;\n updatedAt: string;\n lastUsedAt: string | null;\n}\n\nexport interface AccountRegistryDocument {\n schemaVersion: number;\n defaultAccountId: string | null;\n accounts: AccountRecord[];\n}\n\nexport interface AccountRegistry {\n addAccount(input: { label: string; authDirectory?: string }): Promise<AccountRecord>;\n getDefaultAccount(): Promise<AccountRecord | null>;\n listAccounts(): Promise<AccountRecord[]>;\n removeAccount(accountId: string): Promise<AccountRecord>;\n selectAccount(accountId: string): Promise<AccountRecord>;\n}\n\nexport function createAccountRegistry(input: {\n accountRoot: string;\n logger: Logger;\n registryFile: string;\n}): AccountRegistry {\n return {\n addAccount(details) {\n return withRegistryMutation(input, \"registry.add\", async (document, now) => {\n const normalizedLabel = normalizeLabel(details.label);\n const duplicate = document.accounts.find(\n (account) => account.label.toLowerCase() === normalizedLabel.toLowerCase(),\n );\n\n if (duplicate) {\n input.logger.warn(\"registry.duplicate_label\", {\n label: normalizedLabel,\n existingAccountId: duplicate.id,\n });\n throw new Error(`An account named \"${normalizedLabel}\" already exists.`);\n }\n\n const accountId = randomUUID();\n const record: AccountRecord = {\n id: accountId,\n label: normalizedLabel,\n authDirectory: details.authDirectory ?? path.join(input.accountRoot, accountId),\n createdAt: now,\n updatedAt: now,\n lastUsedAt: null,\n };\n\n document.accounts.push(record);\n if (!document.defaultAccountId) {\n document.defaultAccountId = record.id;\n }\n\n input.logger.info(\"registry.account_added\", {\n accountId: record.id,\n label: record.label,\n authDirectory: record.authDirectory,\n defaultAccountId: document.defaultAccountId,\n });\n\n return record;\n });\n },\n async getDefaultAccount() {\n const document = await readRegistryDocument(input);\n const account = document.defaultAccountId\n ? document.accounts.find((entry) => entry.id === document.defaultAccountId) ?? null\n : null;\n\n input.logger.debug(\"registry.default_loaded\", {\n defaultAccountId: document.defaultAccountId,\n resolvedAccountId: account?.id ?? null,\n });\n\n return account;\n },\n async listAccounts() {\n const document = await readRegistryDocument(input);\n\n input.logger.debug(\"registry.list_loaded\", {\n accountCount: document.accounts.length,\n defaultAccountId: document.defaultAccountId,\n });\n\n return [...document.accounts];\n },\n removeAccount(accountId) {\n return withRegistryMutation(input, \"registry.remove\", async (document, now) => {\n const record = document.accounts.find((account) => account.id === accountId);\n\n if (!record) {\n input.logger.warn(\"registry.remove_missing\", { accountId });\n throw new Error(`Account \"${accountId}\" was not found.`);\n }\n\n document.accounts = document.accounts.filter((account) => account.id !== accountId);\n if (document.defaultAccountId === accountId) {\n document.defaultAccountId = document.accounts[0]?.id ?? null;\n }\n\n record.updatedAt = now;\n\n input.logger.info(\"registry.account_removed\", {\n accountId,\n nextDefaultAccountId: document.defaultAccountId,\n });\n\n return record;\n });\n },\n selectAccount(accountId) {\n return withRegistryMutation(input, \"registry.select\", async (document, now) => {\n const record = document.accounts.find((account) => account.id === accountId);\n\n if (!record) {\n input.logger.warn(\"registry.select_missing\", { accountId });\n throw new Error(`Account \"${accountId}\" was not found.`);\n }\n\n document.defaultAccountId = record.id;\n record.updatedAt = now;\n record.lastUsedAt = now;\n\n input.logger.info(\"registry.account_selected\", {\n accountId,\n label: record.label,\n });\n\n return record;\n });\n },\n };\n}\n\nasync function withRegistryMutation<T>(\n input: {\n accountRoot: string;\n logger: Logger;\n registryFile: string;\n },\n operation: string,\n mutate: (document: AccountRegistryDocument, now: string) => Promise<T> | T,\n): Promise<T> {\n await mkdir(input.accountRoot, { recursive: true });\n await mkdir(path.dirname(input.registryFile), { recursive: true });\n\n const document = await readRegistryDocument(input);\n const now = new Date().toISOString();\n\n input.logger.debug(`${operation}.start`, {\n registryFile: input.registryFile,\n accountRoot: input.accountRoot,\n accountCount: document.accounts.length,\n });\n\n const result = await mutate(document, now);\n\n await persistRegistryDocument(input, document);\n\n input.logger.debug(`${operation}.complete`, {\n registryFile: input.registryFile,\n accountCount: document.accounts.length,\n defaultAccountId: document.defaultAccountId,\n });\n\n return result;\n}\n\nasync function readRegistryDocument(input: {\n accountRoot: string;\n logger: Logger;\n registryFile: string;\n}): Promise<AccountRegistryDocument> {\n await mkdir(input.accountRoot, { recursive: true });\n await mkdir(path.dirname(input.registryFile), { recursive: true });\n\n try {\n const raw = await readFile(input.registryFile, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const migrated = migrateRegistryDocument(parsed, input.logger, input.registryFile);\n\n input.logger.debug(\"registry.read_success\", {\n registryFile: input.registryFile,\n schemaVersion: migrated.schemaVersion,\n accountCount: migrated.accounts.length,\n });\n\n return migrated;\n } catch (error) {\n if (isFileMissing(error)) {\n const emptyDocument = createEmptyRegistryDocument();\n input.logger.info(\"registry.read_missing\", {\n registryFile: input.registryFile,\n action: \"create_empty_registry\",\n });\n await persistRegistryDocument(input, emptyDocument);\n return emptyDocument;\n }\n\n const normalized = normalizeUnknownError(error);\n const corruptionBackupPath = `${input.registryFile}.corrupt-${Date.now()}`;\n\n input.logger.warn(\"registry.read_corrupt\", {\n registryFile: input.registryFile,\n corruptionBackupPath,\n message: normalized.message,\n });\n\n await rename(input.registryFile, corruptionBackupPath).catch(() => undefined);\n\n const emptyDocument = createEmptyRegistryDocument();\n await persistRegistryDocument(input, emptyDocument);\n\n return emptyDocument;\n }\n}\n\nasync function persistRegistryDocument(\n input: {\n logger: Logger;\n registryFile: string;\n },\n document: AccountRegistryDocument,\n): Promise<void> {\n const tempFile = `${input.registryFile}.tmp`;\n const serialized = JSON.stringify(document, null, 2);\n\n await writeFile(tempFile, serialized, \"utf8\");\n await rename(tempFile, input.registryFile);\n\n input.logger.debug(\"registry.write_success\", {\n registryFile: input.registryFile,\n bytes: Buffer.byteLength(serialized, \"utf8\"),\n schemaVersion: document.schemaVersion,\n defaultAccountId: document.defaultAccountId,\n });\n}\n\nfunction migrateRegistryDocument(\n value: unknown,\n logger: Logger,\n registryFile: string,\n): AccountRegistryDocument {\n if (!isObject(value)) {\n throw new Error(\"Registry document is not a JSON object.\");\n }\n\n const schemaVersion = typeof value.schemaVersion === \"number\" ? value.schemaVersion : 0;\n\n logger.debug(\"registry.migration_check\", {\n registryFile,\n schemaVersion,\n targetSchemaVersion: REGISTRY_SCHEMA_VERSION,\n });\n\n if (schemaVersion > REGISTRY_SCHEMA_VERSION) {\n throw new Error(\n `Registry schema ${schemaVersion} is newer than supported schema ${REGISTRY_SCHEMA_VERSION}.`,\n );\n }\n\n if (schemaVersion === REGISTRY_SCHEMA_VERSION) {\n return normalizeRegistryDocument(value);\n }\n\n if (schemaVersion === 0) {\n const migrated = normalizeRegistryDocument({\n schemaVersion: REGISTRY_SCHEMA_VERSION,\n defaultAccountId: value.defaultAccountId ?? null,\n accounts: value.accounts ?? [],\n });\n\n logger.info(\"registry.migration_applied\", {\n registryFile,\n fromSchemaVersion: 0,\n toSchemaVersion: REGISTRY_SCHEMA_VERSION,\n });\n\n return migrated;\n }\n\n throw new Error(`Unsupported registry schema version ${schemaVersion}.`);\n}\n\nfunction normalizeRegistryDocument(value: Record<string, unknown>): AccountRegistryDocument {\n const accounts = Array.isArray(value.accounts)\n ? value.accounts.map(normalizeAccountRecord)\n : [];\n const defaultAccountId = typeof value.defaultAccountId === \"string\"\n ? value.defaultAccountId\n : null;\n\n return {\n schemaVersion: REGISTRY_SCHEMA_VERSION,\n defaultAccountId:\n defaultAccountId && accounts.some((account) => account.id === defaultAccountId)\n ? defaultAccountId\n : accounts[0]?.id ?? null,\n accounts,\n };\n}\n\nfunction normalizeAccountRecord(value: unknown): AccountRecord {\n if (!isObject(value)) {\n throw new Error(\"Account record is not an object.\");\n }\n\n const id = typeof value.id === \"string\" ? value.id : randomUUID();\n const createdAt = typeof value.createdAt === \"string\" ? value.createdAt : new Date(0).toISOString();\n const updatedAt = typeof value.updatedAt === \"string\" ? value.updatedAt : createdAt;\n\n return {\n id,\n label: normalizeLabel(typeof value.label === \"string\" ? value.label : id),\n authDirectory:\n typeof value.authDirectory === \"string\" ? value.authDirectory : path.join(\"accounts\", id),\n createdAt,\n updatedAt,\n lastUsedAt: typeof value.lastUsedAt === \"string\" ? value.lastUsedAt : null,\n };\n}\n\nfunction createEmptyRegistryDocument(): AccountRegistryDocument {\n return {\n schemaVersion: REGISTRY_SCHEMA_VERSION,\n defaultAccountId: null,\n accounts: [],\n };\n}\n\nfunction normalizeLabel(label: string): string {\n const normalized = label.trim();\n\n if (!normalized) {\n throw new Error(\"Account label cannot be empty.\");\n }\n\n return normalized;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFileMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nfunction normalizeUnknownError(error: unknown): { message: string } {\n if (error instanceof Error) {\n return { message: error.message };\n }\n\n return { message: String(error) };\n}\n\nexport async function deleteRegistryFile(registryFile: string): Promise<void> {\n const fileStats = await stat(registryFile).catch(() => null);\n\n if (!fileStats) {\n return;\n }\n\n await rm(registryFile, { force: true });\n}\n", "import { createLogSink, createLogger, resolveLogLevel } from \"../logging/logger.js\";\nimport { resolveWrapperConfig } from \"../config/wrapper-config.js\";\nimport { resolvePaths } from \"./paths.js\";\nimport { findCodexBinary } from \"../process/find-codex-binary.js\";\nimport { initializeRuntimeEnvironment } from \"../runtime/init/initialize-runtime.js\";\n\nexport interface AppContext {\n argv: string[];\n executablePath: string;\n environment: {\n cwd: string;\n platform: NodeJS.Platform;\n runtime: string;\n };\n io: {\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n };\n logging: {\n level: string;\n sink: ReturnType<typeof createLogSink>;\n };\n paths: ReturnType<typeof resolvePaths>;\n runtimeInitialization: Awaited<ReturnType<typeof initializeRuntimeEnvironment>>;\n wrapperConfig: Awaited<ReturnType<typeof resolveWrapperConfig>>;\n codexBinary: Awaited<ReturnType<typeof findCodexBinary>>;\n}\n\nexport async function buildAppContext(\n argv: string[],\n io: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n executablePath: string;\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n },\n): Promise<AppContext> {\n const logLevel = resolveLogLevel(io.env.LOG_LEVEL);\n const sink = createLogSink(io.stderr);\n const paths = resolvePaths(io.cwd, io.env);\n const runtimeInitialization = await initializeRuntimeEnvironment({\n env: io.env,\n logger: createLogger({\n level: logLevel,\n name: \"runtime\",\n sink,\n }),\n paths,\n });\n const wrapperConfig = await resolveWrapperConfig({\n env: io.env,\n logger: createLogger({\n level: logLevel,\n name: \"config\",\n sink,\n }),\n paths,\n });\n const codexBinary = await findCodexBinary({\n env: io.env,\n logger: createLogger({\n level: logLevel,\n name: \"process\",\n sink,\n }),\n wrapperExecutablePath: io.executablePath,\n });\n\n createLogger({\n level: logLevel,\n name: \"context\",\n sink,\n }).debug(\"initialized\", {\n argv,\n cwd: io.cwd,\n logLevel,\n paths,\n runtimeInitialization,\n wrapperConfig,\n codexBinary,\n });\n\n return {\n argv,\n executablePath: io.executablePath,\n environment: {\n cwd: io.cwd,\n platform: process.platform,\n runtime: process.version,\n },\n io: {\n stdout: io.stdout,\n stderr: io.stderr,\n },\n logging: {\n level: logLevel,\n sink,\n },\n paths,\n runtimeInitialization,\n wrapperConfig,\n codexBinary,\n };\n}\n", "import path from \"node:path\";\nimport type { CredentialStoreMode } from \"../config/wrapper-config.js\";\nimport type { Logger } from \"../logging/logger.js\";\n\nexport type RuntimeFileClass =\n | \"shared\"\n | \"account\"\n | \"ephemeral\"\n | \"protected\";\n\nexport interface RuntimeFileRule {\n pathPattern: string;\n classification: RuntimeFileClass;\n syncBack: \"never\" | \"if-changed\" | \"account-to-runtime-only\";\n reason: string;\n}\n\nexport interface RuntimeContract {\n credentialStoreMode: CredentialStoreMode;\n sharedCodexHome: string;\n runtimeRoot: string;\n perAccountRoot: string;\n supported: boolean;\n fileRules: RuntimeFileRule[];\n syncBackStrategy: {\n whenChildProcessSucceeds: string;\n whenChildProcessFails: string;\n compareStrategy: string;\n };\n}\n\nexport function createRuntimeContract(input: {\n accountRoot: string;\n credentialStoreMode: CredentialStoreMode;\n logger: Logger;\n runtimeRoot: string;\n sharedCodexHome: string;\n}): RuntimeContract {\n const contract: RuntimeContract = {\n credentialStoreMode: input.credentialStoreMode,\n sharedCodexHome: input.sharedCodexHome,\n runtimeRoot: input.runtimeRoot,\n perAccountRoot: input.accountRoot,\n supported: input.credentialStoreMode === \"file\",\n fileRules: [\n createRule(\"config.toml\", \"shared\", \"never\", \"Shared CLI behavior and MCP config should remain common.\"),\n createRule(\"mcp.json\", \"shared\", \"never\", \"MCP topology is shared across accounts.\"),\n createRule(\"trust/**\", \"shared\", \"never\", \"Trust metadata should not be overwritten per account.\"),\n createRule(\n \"auth.json\",\n \"account\",\n \"if-changed\",\n \"Windows probe evidence shows auth.json is sufficient for `codex login status`, so it belongs to the active account profile.\",\n ),\n createRule(\n \"sessions/**\",\n \"account\",\n \"if-changed\",\n \"Session refresh artifacts are still treated as account-scoped until a real token-refresh probe proves otherwise.\",\n ),\n createRule(\"cache/**\", \"ephemeral\", \"never\", \"Transient caches should be recreated instead of copied.\"),\n createRule(\"logs/**\", \"ephemeral\", \"never\", \"Runtime logs are diagnostic and should not sync back.\"),\n createRule(\"history.jsonl\", \"ephemeral\", \"never\", \"Conversation history should stay local to each runtime session.\"),\n createRule(\"models_cache.json\", \"ephemeral\", \"never\", \"Model cache data can be rebuilt and should not drive account switching.\"),\n createRule(\"tmp/**\", \"ephemeral\", \"never\", \"Temporary files should be discarded after each run.\"),\n createRule(\n \"state_*.sqlite*\",\n \"protected\",\n \"never\",\n \"Observed SQLite runtime state exists in the live Codex home and remains unproven for cross-account merge or sync-back.\",\n ),\n createRule(\n \"logs_*.sqlite*\",\n \"protected\",\n \"never\",\n \"SQLite-backed log databases should stay isolated until a dedicated write-heavy probe proves they are safe to discard or share.\",\n ),\n createRule(\"keyring/**\", \"protected\", \"never\", \"External credential stores are explicitly unsupported for MVP.\"),\n ],\n syncBackStrategy: {\n whenChildProcessSucceeds:\n \"Compare allowed account-classified files and sync only changed files back to the owning account profile.\",\n whenChildProcessFails:\n \"Restore pre-launch runtime state and avoid syncing ambiguous mutations unless the failure is known-safe.\",\n compareStrategy:\n \"Use file existence, modified time, and content hash checks before any sync-back write.\",\n },\n };\n\n input.logger.info(\"runtime.contract_created\", {\n sharedCodexHome: contract.sharedCodexHome,\n runtimeRoot: contract.runtimeRoot,\n perAccountRoot: contract.perAccountRoot,\n credentialStoreMode: contract.credentialStoreMode,\n supported: contract.supported,\n });\n\n input.logger.debug(\"runtime.file_rules\", {\n fileRules: contract.fileRules,\n syncBackStrategy: contract.syncBackStrategy,\n });\n\n return contract;\n}\n\nexport function resolveAccountRuntimePaths(contract: RuntimeContract, accountId: string) {\n const accountDirectory = path.join(contract.perAccountRoot, accountId);\n\n return {\n accountDirectory,\n accountStateDirectory: path.join(accountDirectory, \"state\"),\n accountMetadataFile: path.join(accountDirectory, \"account.json\"),\n runtimeBackupDirectory: path.join(contract.runtimeRoot, \"backups\", accountId),\n runtimeTempDirectory: path.join(contract.runtimeRoot, \"tmp\", accountId),\n };\n}\n\nexport function summarizeRuntimeContract(contract: RuntimeContract) {\n return {\n supported: contract.supported,\n credentialStoreMode: contract.credentialStoreMode,\n sharedCodexHome: contract.sharedCodexHome,\n runtimeRoot: contract.runtimeRoot,\n perAccountRoot: contract.perAccountRoot,\n classifications: contract.fileRules.reduce<Record<RuntimeFileClass, number>>(\n (accumulator, rule) => {\n accumulator[rule.classification] += 1;\n return accumulator;\n },\n {\n shared: 0,\n account: 0,\n ephemeral: 0,\n protected: 0,\n },\n ),\n };\n}\n\nfunction createRule(\n pathPattern: string,\n classification: RuntimeFileClass,\n syncBack: RuntimeFileRule[\"syncBack\"],\n reason: string,\n): RuntimeFileRule {\n return {\n pathPattern,\n classification,\n syncBack,\n reason,\n };\n}\n", "import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport {\n createRuntimeContract,\n resolveAccountRuntimePaths,\n} from \"../../runtime/runtime-contract.js\";\nimport {\n copyAccountScopedAuthArtifacts,\n prepareLoginWorkspace,\n type LoginWorkspace,\n} from \"../../runtime/login-workspace.js\";\nimport {\n runInteractiveCodexLogin,\n type CodexLoginResult,\n} from \"../../process/run-codex-login.js\";\n\nconst DEFAULT_LOGIN_TIMEOUT_MS = 10 * 60 * 1000;\nconst ACCOUNT_METADATA_SCHEMA_VERSION = 1;\n\ninterface ParsedAccountAddArgs {\n label: string;\n timeoutMs: number;\n}\n\ninterface AccountAuthMetadata {\n schemaVersion: number;\n accountId: string;\n label: string;\n capturedAt: string;\n authMode: string | null;\n authAccountId: string | null;\n lastRefresh: string | null;\n loginStatus: \"succeeded\";\n}\n\nexport async function runAccountAddCommand(\n context: AppContext,\n argv: string[],\n): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"account_add\",\n sink: context.logging.sink,\n });\n if (argv.includes(\"--help\")) {\n context.io.stdout.write(`${buildAccountAddHelpText()}\\n`);\n logger.info(\"help.rendered\");\n return 0;\n }\n const parsed = parseAccountAddArgs(argv);\n\n logger.info(\"command.start\", {\n requestedLabel: parsed.label,\n timeoutMs: parsed.timeoutMs,\n codexBinaryPath: context.codexBinary.path,\n sharedCodexHome: context.paths.sharedCodexHome,\n accountRoot: context.paths.accountRoot,\n runtimeRoot: context.paths.runtimeRoot,\n });\n\n if (!context.codexBinary.path) {\n logger.error(\"command.binary_missing\", {\n candidates: context.codexBinary.candidates,\n rejectedCandidates: context.codexBinary.rejectedCandidates,\n });\n throw new Error(\"Could not find the real `codex` binary on PATH.\");\n }\n\n if (context.wrapperConfig.credentialStoreMode !== \"file\") {\n logger.error(\"command.unsupported_credential_store\", {\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n configFilePath: context.wrapperConfig.codexConfigFilePath,\n reason: context.wrapperConfig.credentialStorePolicyReason,\n });\n throw new Error(\n `codexes account add requires cli_auth_credentials_store = \"file\"; detected ${context.wrapperConfig.credentialStoreMode}.`,\n );\n }\n\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n const existingAccounts = await registry.listAccounts();\n const duplicate = existingAccounts.find(\n (account) => account.label.toLowerCase() === parsed.label.toLowerCase(),\n );\n\n if (duplicate) {\n logger.warn(\"command.duplicate_label\", {\n requestedLabel: parsed.label,\n existingAccountId: duplicate.id,\n });\n throw new Error(`An account named \"${parsed.label}\" already exists.`);\n }\n\n const runtimeContract = createRuntimeContract({\n accountRoot: context.paths.accountRoot,\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n logger,\n runtimeRoot: context.paths.runtimeRoot,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n const workspace = await prepareLoginWorkspace({\n logger,\n runtimeRoot: context.paths.runtimeRoot,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n\n let loginResult: CodexLoginResult | null = null;\n\n try {\n loginResult = await runInteractiveCodexLogin({\n codexBinaryPath: context.codexBinary.path,\n codexHome: workspace.codexHome,\n logger,\n timeoutMs: parsed.timeoutMs,\n });\n\n if (loginResult.exitCode !== 0) {\n logger.warn(\"command.login_failed\", {\n exitCode: loginResult.exitCode,\n signal: loginResult.signal,\n timedOut: loginResult.timedOut,\n timeoutMs: loginResult.timeoutMs,\n cancelledBySignal: loginResult.cancelledBySignal,\n });\n context.io.stderr.write(buildLoginFailureMessage(loginResult));\n return loginResult.exitCode ?? 1;\n }\n\n const authSummary = await readAuthSummary(workspace.codexHome, logger);\n if (!authSummary.present) {\n logger.error(\"command.auth_missing_after_login\", {\n codexHome: workspace.codexHome,\n });\n throw new Error(\n \"codex login completed without creating auth.json in the isolated workspace.\",\n );\n }\n\n const account = await registry.addAccount({ label: parsed.label });\n\n try {\n const runtimePaths = resolveAccountRuntimePaths(runtimeContract, account.id);\n await mkdir(runtimePaths.accountDirectory, { recursive: true });\n await copyAccountScopedAuthArtifacts({\n accountId: account.id,\n destinationRoot: runtimePaths.accountStateDirectory,\n logger,\n runtimeContract,\n sourceCodexHome: workspace.codexHome,\n });\n await writeAccountMetadata({\n capturedAt: new Date().toISOString(),\n destinationFile: runtimePaths.accountMetadataFile,\n label: account.label,\n logger,\n recordId: account.id,\n summary: authSummary,\n });\n\n logger.info(\"command.complete\", {\n accountId: account.id,\n label: account.label,\n authDirectory: account.authDirectory,\n authAccountId: authSummary.accountId,\n });\n\n context.io.stdout.write(\n [\n `Added account \"${account.label}\"`,\n ` id: ${account.id}`,\n ` auth state: ${runtimePaths.accountStateDirectory}`,\n authSummary.accountId ? ` auth account id: ${authSummary.accountId}` : null,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\") + \"\\n\",\n );\n\n return 0;\n } catch (error) {\n logger.error(\"command.persist_failed\", {\n message: error instanceof Error ? error.message : String(error),\n accountLabel: parsed.label,\n });\n await cleanupFailedAccountRecord(registry, logger, parsed.label);\n throw error;\n }\n } finally {\n await cleanupWorkspace(workspace, logger, loginResult);\n }\n}\n\nfunction parseAccountAddArgs(argv: string[]): ParsedAccountAddArgs {\n let label: string | null = null;\n let timeoutMs = DEFAULT_LOGIN_TIMEOUT_MS;\n\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token) {\n continue;\n }\n\n if (token === \"--timeout-ms\") {\n const next = argv[index + 1];\n if (!next) {\n throw new Error(\"Expected a number after --timeout-ms.\");\n }\n const parsedTimeout = Number.parseInt(next, 10);\n if (!Number.isFinite(parsedTimeout) || parsedTimeout <= 0) {\n throw new Error(`Invalid timeout: ${next}`);\n }\n timeoutMs = parsedTimeout;\n index += 1;\n continue;\n }\n\n if (token.startsWith(\"--timeout-ms=\")) {\n const raw = token.slice(\"--timeout-ms=\".length);\n const parsedTimeout = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsedTimeout) || parsedTimeout <= 0) {\n throw new Error(`Invalid timeout: ${raw}`);\n }\n timeoutMs = parsedTimeout;\n continue;\n }\n\n if (token.startsWith(\"--\")) {\n throw new Error(`Unknown option for account add: ${token}`);\n }\n\n if (label) {\n throw new Error(`Unexpected argument for account add: ${token}`);\n }\n\n label = token.trim();\n }\n\n if (!label) {\n throw new Error(buildAccountAddHelpText());\n }\n\n return { label, timeoutMs };\n}\n\nfunction buildAccountAddHelpText(): string {\n return [\n \"Usage:\",\n \" codexes account add <label> [--timeout-ms <milliseconds>]\",\n \"\",\n \"Examples:\",\n \" codexes account add work\",\n \" codexes account add personal --timeout-ms 900000\",\n ].join(\"\\n\");\n}\n\nasync function readAuthSummary(\n codexHome: string,\n logger: ReturnType<typeof createLogger>,\n): Promise<{\n present: boolean;\n authMode: string | null;\n accountId: string | null;\n lastRefresh: string | null;\n}> {\n const authFile = path.join(codexHome, \"auth.json\");\n\n try {\n const raw = await readFile(authFile, \"utf8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const tokens =\n typeof parsed.tokens === \"object\" && parsed.tokens !== null\n ? (parsed.tokens as Record<string, unknown>)\n : null;\n\n const summary = {\n present: true,\n authMode: typeof parsed.auth_mode === \"string\" ? parsed.auth_mode : null,\n accountId: typeof tokens?.account_id === \"string\" ? tokens.account_id : null,\n lastRefresh: typeof parsed.last_refresh === \"string\" ? parsed.last_refresh : null,\n };\n\n logger.debug(\"auth_summary.loaded\", {\n authFile,\n authMode: summary.authMode,\n accountId: summary.accountId,\n lastRefresh: summary.lastRefresh,\n });\n\n return summary;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n logger.warn(\"auth_summary.missing\", { authFile });\n return {\n present: false,\n authMode: null,\n accountId: null,\n lastRefresh: null,\n };\n }\n\n logger.error(\"auth_summary.failed\", {\n authFile,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n\nasync function writeAccountMetadata(input: {\n capturedAt: string;\n destinationFile: string;\n label: string;\n logger: ReturnType<typeof createLogger>;\n recordId: string;\n summary: {\n authMode: string | null;\n accountId: string | null;\n lastRefresh: string | null;\n };\n}): Promise<void> {\n const metadata: AccountAuthMetadata = {\n schemaVersion: ACCOUNT_METADATA_SCHEMA_VERSION,\n accountId: input.recordId,\n label: input.label,\n capturedAt: input.capturedAt,\n authMode: input.summary.authMode,\n authAccountId: input.summary.accountId,\n lastRefresh: input.summary.lastRefresh,\n loginStatus: \"succeeded\",\n };\n\n await writeFile(input.destinationFile, JSON.stringify(metadata, null, 2), \"utf8\");\n\n input.logger.info(\"account_metadata.written\", {\n destinationFile: input.destinationFile,\n accountId: metadata.accountId,\n authAccountId: metadata.authAccountId,\n });\n}\n\nasync function cleanupFailedAccountRecord(\n registry: ReturnType<typeof createAccountRegistry>,\n logger: ReturnType<typeof createLogger>,\n label: string,\n): Promise<void> {\n const accounts = await registry.listAccounts();\n const account = [...accounts]\n .reverse()\n .find((entry) => entry.label.toLowerCase() === label.toLowerCase());\n\n if (!account) {\n return;\n }\n\n await registry.removeAccount(account.id).catch(() => undefined);\n await rm(account.authDirectory, { force: true, recursive: true }).catch(() => undefined);\n\n logger.warn(\"command.rollback_account_record\", {\n accountId: account.id,\n label: account.label,\n });\n}\n\nasync function cleanupWorkspace(\n workspace: LoginWorkspace,\n logger: ReturnType<typeof createLogger>,\n loginResult: CodexLoginResult | null,\n): Promise<void> {\n logger.debug(\"workspace.cleanup.start\", {\n workspaceRoot: workspace.workspaceRoot,\n codexHome: workspace.codexHome,\n loginExitCode: loginResult?.exitCode ?? null,\n });\n\n await rm(workspace.workspaceRoot, {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n\n logger.debug(\"workspace.cleanup.complete\", {\n workspaceRoot: workspace.workspaceRoot,\n });\n}\n\nfunction buildLoginFailureMessage(loginResult: CodexLoginResult): string {\n if (loginResult.timedOut) {\n return `codexes: account login timed out after ${loginResult.timeoutMs}ms.\\n`;\n }\n\n if (loginResult.cancelledBySignal) {\n return \"codexes: account login was cancelled.\\n\";\n }\n\n return `codexes: account login failed with exit code ${loginResult.exitCode ?? \"unknown\"}.\\n`;\n}\n", "import { copyFile, cp, mkdir, mkdtemp, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Logger } from \"../logging/logger.js\";\nimport type { RuntimeContract, RuntimeFileRule } from \"./runtime-contract.js\";\n\nexport interface LoginWorkspace {\n workspaceRoot: string;\n codexHome: string;\n}\n\nexport async function prepareLoginWorkspace(input: {\n logger: Logger;\n runtimeRoot: string;\n sharedCodexHome: string;\n}): Promise<LoginWorkspace> {\n const workspaceParent = path.join(input.runtimeRoot, \"tmp\");\n await mkdir(workspaceParent, { recursive: true });\n const workspaceRoot = await mkdtemp(path.join(workspaceParent, \"account-add-\"));\n const codexHome = path.join(workspaceRoot, \"codex-home\");\n\n await mkdir(codexHome, { recursive: true });\n input.logger.info(\"login_workspace.created\", {\n workspaceRoot,\n codexHome,\n sharedCodexHome: input.sharedCodexHome,\n });\n\n await ensurePinnedFileConfig({\n codexHome,\n logger: input.logger,\n sharedCodexHome: input.sharedCodexHome,\n });\n await copySharedArtifactIfPresent({\n artifactName: \"mcp.json\",\n codexHome,\n logger: input.logger,\n sharedCodexHome: input.sharedCodexHome,\n });\n await copySharedDirectoryIfPresent({\n artifactName: \"trust\",\n codexHome,\n logger: input.logger,\n sharedCodexHome: input.sharedCodexHome,\n });\n await mkdir(path.join(codexHome, \"sessions\"), { recursive: true });\n\n return { workspaceRoot, codexHome };\n}\n\nexport async function copyAccountScopedAuthArtifacts(input: {\n accountId: string;\n destinationRoot: string;\n logger: Logger;\n runtimeContract: RuntimeContract;\n sourceCodexHome: string;\n}): Promise<void> {\n const accountRules = input.runtimeContract.fileRules.filter(\n (rule) => rule.classification === \"account\",\n );\n\n input.logger.info(\"login_workspace.copy_account_artifacts.start\", {\n accountId: input.accountId,\n destinationRoot: input.destinationRoot,\n sourceCodexHome: input.sourceCodexHome,\n allowedPatterns: accountRules.map((rule) => rule.pathPattern),\n });\n\n await mkdir(input.destinationRoot, { recursive: true });\n\n for (const rule of accountRules) {\n await copyRuleArtifacts({\n destinationRoot: input.destinationRoot,\n logger: input.logger,\n rule,\n sourceCodexHome: input.sourceCodexHome,\n });\n }\n\n input.logger.info(\"login_workspace.copy_account_artifacts.complete\", {\n accountId: input.accountId,\n destinationRoot: input.destinationRoot,\n });\n}\n\nasync function ensurePinnedFileConfig(input: {\n codexHome: string;\n logger: Logger;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourceConfigPath = path.join(input.sharedCodexHome, \"config.toml\");\n const targetConfigPath = path.join(input.codexHome, \"config.toml\");\n const configContents = await readFile(sourceConfigPath, \"utf8\").catch(() => \"\");\n const pinnedConfig = pinFileCredentialStore(configContents);\n\n await writeFile(targetConfigPath, pinnedConfig, \"utf8\");\n input.logger.info(\"login_workspace.config_prepared\", {\n sourceConfigPath,\n targetConfigPath,\n credentialStoreMode: \"file\",\n });\n}\n\nasync function copySharedArtifactIfPresent(input: {\n artifactName: string;\n codexHome: string;\n logger: Logger;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.sharedCodexHome, input.artifactName);\n const targetPath = path.join(input.codexHome, input.artifactName);\n\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"login_workspace.shared_file_skipped\", {\n artifactName: input.artifactName,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n await copyFile(sourcePath, targetPath);\n input.logger.debug(\"login_workspace.shared_file_copied\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n });\n}\n\nasync function copySharedDirectoryIfPresent(input: {\n artifactName: string;\n codexHome: string;\n logger: Logger;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.sharedCodexHome, input.artifactName);\n const targetPath = path.join(input.codexHome, input.artifactName);\n\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"login_workspace.shared_directory_skipped\", {\n artifactName: input.artifactName,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n await cp(sourcePath, targetPath, { recursive: true });\n input.logger.debug(\"login_workspace.shared_directory_copied\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n });\n}\n\nasync function copyRuleArtifacts(input: {\n destinationRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sourceCodexHome: string;\n}): Promise<void> {\n if (input.rule.pathPattern.endsWith(\"/**\")) {\n const relativeDirectory = input.rule.pathPattern.slice(0, -3);\n const sourceDirectory = path.join(input.sourceCodexHome, relativeDirectory);\n const targetDirectory = path.join(input.destinationRoot, relativeDirectory);\n\n if (!(await pathExists(sourceDirectory))) {\n input.logger.debug(\"login_workspace.account_directory_skipped\", {\n pathPattern: input.rule.pathPattern,\n sourceDirectory,\n reason: \"missing\",\n });\n return;\n }\n\n await cp(sourceDirectory, targetDirectory, { recursive: true });\n input.logger.debug(\"login_workspace.account_directory_copied\", {\n pathPattern: input.rule.pathPattern,\n sourceDirectory,\n targetDirectory,\n });\n return;\n }\n\n const sourceFile = path.join(input.sourceCodexHome, input.rule.pathPattern);\n const targetFile = path.join(input.destinationRoot, input.rule.pathPattern);\n\n if (!(await pathExists(sourceFile))) {\n input.logger.debug(\"login_workspace.account_file_skipped\", {\n pathPattern: input.rule.pathPattern,\n sourceFile,\n reason: \"missing\",\n });\n return;\n }\n\n await mkdir(path.dirname(targetFile), { recursive: true });\n await copyFile(sourceFile, targetFile);\n input.logger.debug(\"login_workspace.account_file_copied\", {\n pathPattern: input.rule.pathPattern,\n sourceFile,\n targetFile,\n });\n}\n\nfunction pinFileCredentialStore(rawConfig: string): string {\n if (/^\\s*cli_auth_credentials_store\\s*=\\s*\"file\"/m.test(rawConfig)) {\n return rawConfig;\n }\n\n if (/^\\s*cli_auth_credentials_store\\s*=\\s*\"[^\"]+\"/m.test(rawConfig)) {\n return rawConfig.replace(\n /^\\s*cli_auth_credentials_store\\s*=\\s*\"[^\"]+\"/m,\n 'cli_auth_credentials_store = \"file\"',\n );\n }\n\n const trimmed = rawConfig.trim();\n if (!trimmed) {\n return 'cli_auth_credentials_store = \"file\"\\n';\n }\n\n return ['cli_auth_credentials_store = \"file\"', \"\", trimmed, \"\"].join(\"\\n\");\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n\n throw error;\n }\n}\n", "import { spawn } from \"node:child_process\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { resolveCodexLaunchSpec } from \"./codex-launch-spec.js\";\n\nexport interface CodexLoginResult {\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n timedOut: boolean;\n timeoutMs: number;\n cancelledBySignal: boolean;\n}\n\nexport async function runInteractiveCodexLogin(input: {\n codexBinaryPath: string;\n codexHome: string;\n logger: Logger;\n timeoutMs: number;\n}): Promise<CodexLoginResult> {\n const launchSpec = await resolveCodexLaunchSpec(input.codexBinaryPath, [\"login\"]);\n\n input.logger.info(\"login.spawn.start\", {\n codexBinaryPath: input.codexBinaryPath,\n resolvedCommand: launchSpec.command,\n codexHome: input.codexHome,\n argv: launchSpec.args,\n timeoutMs: input.timeoutMs,\n });\n\n return new Promise((resolve, reject) => {\n const child = spawn(launchSpec.command, launchSpec.args, {\n env: {\n ...process.env,\n CODEX_HOME: input.codexHome,\n },\n shell: false,\n stdio: \"inherit\",\n windowsHide: false,\n });\n let timedOut = false;\n let cancelledBySignal = false;\n let settled = false;\n\n const timeoutHandle = setTimeout(() => {\n timedOut = true;\n input.logger.warn(\"login.spawn.timeout\", {\n codexBinaryPath: input.codexBinaryPath,\n codexHome: input.codexHome,\n timeoutMs: input.timeoutMs,\n });\n terminateChild(child);\n }, input.timeoutMs);\n\n const forwardSignal = (signal: NodeJS.Signals) => {\n cancelledBySignal = true;\n input.logger.warn(\"login.spawn.parent_signal\", {\n signal,\n pid: child.pid ?? null,\n });\n child.kill(signal);\n };\n\n const signalHandlers = {\n SIGINT: () => forwardSignal(\"SIGINT\"),\n SIGTERM: () => forwardSignal(\"SIGTERM\"),\n } satisfies Partial<Record<NodeJS.Signals, () => void>>;\n\n process.on(\"SIGINT\", signalHandlers.SIGINT);\n process.on(\"SIGTERM\", signalHandlers.SIGTERM);\n\n const cleanup = () => {\n clearTimeout(timeoutHandle);\n process.off(\"SIGINT\", signalHandlers.SIGINT);\n process.off(\"SIGTERM\", signalHandlers.SIGTERM);\n };\n\n child.on(\"error\", (error) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n input.logger.error(\"login.spawn.error\", {\n codexBinaryPath: input.codexBinaryPath,\n codexHome: input.codexHome,\n message: error.message,\n });\n reject(error);\n });\n\n child.on(\"exit\", (exitCode, signal) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n\n input.logger.info(\"login.spawn.complete\", {\n codexBinaryPath: input.codexBinaryPath,\n codexHome: input.codexHome,\n exitCode,\n signal,\n timedOut,\n cancelledBySignal,\n });\n\n resolve({\n exitCode,\n signal,\n timedOut,\n timeoutMs: input.timeoutMs,\n cancelledBySignal,\n });\n });\n });\n}\n\nfunction terminateChild(child: ReturnType<typeof spawn>): void {\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n\n child.kill(\"SIGTERM\");\n}\n", "import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface CodexLaunchSpec {\n args: string[];\n command: string;\n}\n\nexport async function resolveCodexLaunchSpec(\n codexBinaryPath: string,\n args: string[],\n): Promise<CodexLaunchSpec> {\n if (process.platform !== \"win32\") {\n return {\n command: codexBinaryPath,\n args,\n };\n }\n\n const npmShim = await resolveNpmCodexShim(codexBinaryPath);\n if (npmShim) {\n return {\n command: npmShim.nodeBinary,\n args: [npmShim.codexScript, ...args],\n };\n }\n\n if (/\\.(cmd|bat)$/i.test(codexBinaryPath)) {\n return {\n command: process.env.ComSpec ?? \"cmd.exe\",\n args: [\"/d\", \"/s\", \"/c\", buildCmdInvocation(codexBinaryPath, args)],\n };\n }\n\n if (/\\.ps1$/i.test(codexBinaryPath)) {\n return {\n command: process.env.ComSpec\n ? \"powershell.exe\"\n : \"pwsh\",\n args: [\n \"-NoProfile\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-File\",\n codexBinaryPath,\n ...args,\n ],\n };\n }\n\n return {\n command: codexBinaryPath,\n args,\n };\n}\n\nfunction buildCmdInvocation(binaryPath: string, args: string[]): string {\n return [quoteForCmd(binaryPath), ...args.map(quoteForCmd)].join(\" \");\n}\n\nfunction quoteForCmd(value: string): string {\n if (value.length === 0) {\n return '\"\"';\n }\n\n if (!/[\\s\"]/u.test(value)) {\n return value;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nasync function resolveNpmCodexShim(\n codexBinaryPath: string,\n): Promise<{ codexScript: string; nodeBinary: string } | null> {\n const basename = path.basename(codexBinaryPath).toLowerCase();\n if (![\"codex\", \"codex.cmd\", \"codex.bat\", \"codex.ps1\"].includes(basename)) {\n return null;\n }\n\n const directory = path.dirname(codexBinaryPath);\n const codexScript = path.join(directory, \"node_modules\", \"@openai\", \"codex\", \"bin\", \"codex.js\");\n\n if (!(await pathExists(codexScript))) {\n return null;\n }\n\n const bundledNode = path.join(directory, \"node.exe\");\n return {\n codexScript,\n nodeBinary: (await pathExists(bundledNode)) ? bundledNode : \"node\",\n };\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n", "import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AccountRecord } from \"./account-registry.js\";\nimport type { Logger } from \"../logging/logger.js\";\n\nexport interface AccountPresentation {\n account: AccountRecord;\n authAccountId: string | null;\n authMode: string | null;\n}\n\nexport function resolveAccountBySelector(input: {\n accounts: AccountRecord[];\n logger: Logger;\n selector: string;\n}): AccountRecord {\n const normalizedSelector = input.selector.trim();\n const matches = input.accounts.filter(\n (account) =>\n account.id === normalizedSelector ||\n account.label.toLowerCase() === normalizedSelector.toLowerCase(),\n );\n\n input.logger.debug(\"account_resolution.lookup\", {\n selector: normalizedSelector,\n accountCount: input.accounts.length,\n matchCount: matches.length,\n matchedAccountIds: matches.map((account) => account.id),\n });\n\n if (matches.length === 0) {\n throw new Error(`No account matches \"${normalizedSelector}\".`);\n }\n\n if (matches.length > 1) {\n throw new Error(\n `Selector \"${normalizedSelector}\" matched multiple accounts; use the account id instead.`,\n );\n }\n\n const [match] = matches;\n if (!match) {\n throw new Error(`No account matches \"${normalizedSelector}\".`);\n }\n\n return match;\n}\n\nexport async function buildAccountPresentations(input: {\n accounts: AccountRecord[];\n logger: Logger;\n}): Promise<AccountPresentation[]> {\n const presentations: AccountPresentation[] = [];\n\n for (const account of input.accounts) {\n presentations.push({\n account,\n ...(await readAccountMetadataSummary(account, input.logger)),\n });\n }\n\n return presentations;\n}\n\nasync function readAccountMetadataSummary(\n account: AccountRecord,\n logger: Logger,\n): Promise<Pick<AccountPresentation, \"authAccountId\" | \"authMode\">> {\n const metadataFile = path.join(account.authDirectory, \"account.json\");\n\n try {\n const raw = await readFile(metadataFile, \"utf8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const summary = {\n authAccountId:\n typeof parsed.authAccountId === \"string\" ? parsed.authAccountId : null,\n authMode: typeof parsed.authMode === \"string\" ? parsed.authMode : null,\n };\n\n logger.debug(\"account_resolution.metadata_loaded\", {\n accountId: account.id,\n metadataFile,\n authAccountId: summary.authAccountId,\n authMode: summary.authMode,\n });\n\n return summary;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n logger.debug(\"account_resolution.metadata_missing\", {\n accountId: account.id,\n metadataFile,\n });\n return { authAccountId: null, authMode: null };\n }\n\n logger.warn(\"account_resolution.metadata_failed\", {\n accountId: account.id,\n metadataFile,\n message: error instanceof Error ? error.message : String(error),\n });\n\n return { authAccountId: null, authMode: null };\n }\n}\n", "import { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport { buildAccountPresentations } from \"../../accounts/account-resolution.js\";\n\nexport async function runAccountListCommand(context: AppContext): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"account_list\",\n sink: context.logging.sink,\n });\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n const [accounts, defaultAccount] = await Promise.all([\n registry.listAccounts(),\n registry.getDefaultAccount(),\n ]);\n\n logger.info(\"command.start\", {\n accountCount: accounts.length,\n defaultAccountId: defaultAccount?.id ?? null,\n });\n\n if (accounts.length === 0) {\n context.io.stdout.write(\n [\n \"No accounts configured.\",\n \"Add one with: codexes account add <label>\",\n ].join(\"\\n\") + \"\\n\",\n );\n logger.info(\"command.empty\");\n return 0;\n }\n\n const presentations = await buildAccountPresentations({ accounts, logger });\n const lines = presentations.map(({ account, authAccountId, authMode }) => {\n const markers = [\n defaultAccount?.id === account.id ? \"default\" : null,\n authMode ? `auth=${authMode}` : null,\n authAccountId ? `authAccountId=${authAccountId}` : null,\n ]\n .filter((value): value is string => Boolean(value))\n .join(\", \");\n\n return `${defaultAccount?.id === account.id ? \"*\" : \" \"} ${account.label} (${account.id})${markers ? ` [${markers}]` : \"\"}`;\n });\n\n context.io.stdout.write(`${lines.join(\"\\n\")}\\n`);\n logger.info(\"command.complete\", {\n accountIds: presentations.map(({ account }) => account.id),\n });\n\n return 0;\n}\n", "import { rm } from \"node:fs/promises\";\nimport { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport { resolveAccountBySelector } from \"../../accounts/account-resolution.js\";\n\nexport async function runAccountRemoveCommand(\n context: AppContext,\n argv: string[],\n): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"account_remove\",\n sink: context.logging.sink,\n });\n\n if (argv.includes(\"--help\")) {\n context.io.stdout.write(`${buildAccountRemoveHelpText()}\\n`);\n logger.info(\"help.rendered\");\n return 0;\n }\n\n const selector = argv[0]?.trim();\n if (!selector || argv.length > 1) {\n throw new Error(buildAccountRemoveHelpText());\n }\n\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n const accounts = await registry.listAccounts();\n\n if (accounts.length === 0) {\n context.io.stdout.write(\"No accounts configured.\\n\");\n logger.info(\"command.empty\");\n return 0;\n }\n\n const account = resolveAccountBySelector({ accounts, logger, selector });\n\n logger.info(\"command.start\", {\n requestedSelector: selector,\n resolvedAccountId: account.id,\n label: account.label,\n });\n\n await registry.removeAccount(account.id);\n await rm(account.authDirectory, { force: true, recursive: true });\n\n context.io.stdout.write(`Removed account \"${account.label}\" (${account.id}).\\n`);\n logger.info(\"command.complete\", {\n requestedSelector: selector,\n resolvedAccountId: account.id,\n });\n\n return 0;\n}\n\nfunction buildAccountRemoveHelpText(): string {\n return [\n \"Usage:\",\n \" codexes account remove <account-id-or-label>\",\n ].join(\"\\n\");\n}\n", "import { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport { resolveAccountBySelector } from \"../../accounts/account-resolution.js\";\n\nexport async function runAccountUseCommand(\n context: AppContext,\n argv: string[],\n): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"account_use\",\n sink: context.logging.sink,\n });\n\n if (argv.includes(\"--help\")) {\n context.io.stdout.write(`${buildAccountUseHelpText()}\\n`);\n logger.info(\"help.rendered\");\n return 0;\n }\n\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n const accounts = await registry.listAccounts();\n\n if (accounts.length === 0) {\n context.io.stdout.write(\n [\n \"No accounts configured.\",\n \"Add one with: codexes account add <label>\",\n ].join(\"\\n\") + \"\\n\",\n );\n logger.info(\"command.empty\");\n return 0;\n }\n\n const selector = argv[0]?.trim() ?? null;\n if (argv.length > 1) {\n throw new Error(buildAccountUseHelpText());\n }\n\n let targetAccount = null;\n if (!selector) {\n if (accounts.length === 1) {\n const [singleAccount] = accounts;\n if (!singleAccount) {\n throw new Error(\"No accounts configured.\");\n }\n targetAccount = singleAccount;\n logger.info(\"command.single_account_default\", {\n resolvedAccountId: targetAccount.id,\n label: targetAccount.label,\n });\n } else {\n throw new Error(\n \"Multiple accounts exist. Specify which one to use: codexes account use <account-id-or-label>\",\n );\n }\n } else {\n targetAccount = resolveAccountBySelector({ accounts, logger, selector });\n }\n\n if (!targetAccount) {\n throw new Error(\"Could not resolve the account to use.\");\n }\n\n logger.info(\"command.start\", {\n requestedSelector: selector,\n resolvedAccountId: targetAccount.id,\n label: targetAccount.label,\n });\n\n const selectedAccount = await registry.selectAccount(targetAccount.id);\n\n context.io.stdout.write(\n `Using account \"${selectedAccount.label}\" (${selectedAccount.id}) as the default.\\n`,\n );\n logger.info(\"command.complete\", {\n requestedSelector: selector,\n resolvedAccountId: selectedAccount.id,\n });\n\n return 0;\n}\n\nfunction buildAccountUseHelpText(): string {\n return [\n \"Usage:\",\n \" codexes account use <account-id-or-label>\",\n \" codexes account use\",\n \"\",\n \"When only one account exists, `codexes account use` selects it automatically.\",\n ].join(\"\\n\");\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport type { Logger } from \"../../logging/logger.js\";\n\nconst DEFAULT_WAIT_TIMEOUT_MS = 15_000;\nconst DEFAULT_STALE_LOCK_MS = 5 * 60 * 1000;\nconst DEFAULT_POLL_INTERVAL_MS = 250;\n\nexport interface RuntimeLock {\n release(): Promise<void>;\n}\n\nexport async function acquireRuntimeLock(input: {\n logger: Logger;\n runtimeRoot: string;\n pollIntervalMs?: number;\n staleLockMs?: number;\n waitTimeoutMs?: number;\n}): Promise<RuntimeLock> {\n const lockRoot = path.join(input.runtimeRoot, \"lock\");\n const ownerFile = path.join(lockRoot, \"owner.json\");\n const waitTimeoutMs = input.waitTimeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS;\n const staleLockMs = input.staleLockMs ?? DEFAULT_STALE_LOCK_MS;\n const pollIntervalMs = input.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const startedAt = Date.now();\n\n input.logger.info(\"runtime_lock.acquire.start\", {\n lockRoot,\n waitTimeoutMs,\n staleLockMs,\n pollIntervalMs,\n });\n\n while (true) {\n try {\n await mkdir(lockRoot);\n const owner = {\n pid: process.pid,\n host: os.hostname(),\n createdAt: new Date().toISOString(),\n };\n await writeFile(ownerFile, JSON.stringify(owner, null, 2), \"utf8\");\n\n input.logger.info(\"runtime_lock.acquire.complete\", {\n lockRoot,\n waitedMs: Date.now() - startedAt,\n owner,\n });\n\n return {\n async release() {\n input.logger.info(\"runtime_lock.release.start\", { lockRoot });\n await rm(lockRoot, { force: true, recursive: true }).catch(() => undefined);\n input.logger.info(\"runtime_lock.release.complete\", { lockRoot });\n },\n };\n } catch (error) {\n if (!isAlreadyExistsError(error)) {\n input.logger.error(\"runtime_lock.acquire.failed\", {\n lockRoot,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n const lockAgeMs = await readLockAgeMs(lockRoot, ownerFile);\n if (lockAgeMs !== null && lockAgeMs > staleLockMs) {\n input.logger.warn(\"runtime_lock.stale_detected\", {\n lockRoot,\n lockAgeMs,\n });\n await rm(lockRoot, { force: true, recursive: true }).catch(() => undefined);\n continue;\n }\n\n const waitedMs = Date.now() - startedAt;\n input.logger.debug(\"runtime_lock.acquire.waiting\", {\n lockRoot,\n waitedMs,\n lockAgeMs,\n });\n\n if (waitedMs >= waitTimeoutMs) {\n input.logger.error(\"runtime_lock.acquire.timeout\", {\n lockRoot,\n waitedMs,\n lockAgeMs,\n });\n throw new Error(\n `Timed out waiting for the shared runtime lock after ${waitTimeoutMs}ms.`,\n );\n }\n\n await sleep(pollIntervalMs);\n }\n}\n\nasync function readLockAgeMs(lockRoot: string, ownerFile: string): Promise<number | null> {\n const ownerContents = await readFile(ownerFile, \"utf8\").catch(() => null);\n if (ownerContents) {\n const parsed = JSON.parse(ownerContents) as Record<string, unknown>;\n if (typeof parsed.createdAt === \"string\") {\n return Date.now() - new Date(parsed.createdAt).getTime();\n }\n }\n\n const lockStats = await stat(lockRoot).catch(() => null);\n return lockStats ? Date.now() - lockStats.mtimeMs : null;\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"EEXIST\"\n );\n}\n\nfunction sleep(durationMs: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, durationMs);\n });\n}\n", "import { copyFile, cp, mkdir, readFile, rm, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport type { AccountRecord } from \"../../accounts/account-registry.js\";\nimport type { Logger } from \"../../logging/logger.js\";\nimport type { RuntimeContract, RuntimeFileRule } from \"../runtime-contract.js\";\nimport { resolveAccountRuntimePaths } from \"../runtime-contract.js\";\n\nexport interface ActivatedAccountSession {\n account: AccountRecord;\n backupRoot: string;\n runtimeContract: RuntimeContract;\n sharedCodexHome: string;\n sourceAccountStateRoot: string;\n}\n\nexport async function activateAccountIntoSharedRuntime(input: {\n account: AccountRecord;\n logger: Logger;\n runtimeContract: RuntimeContract;\n sharedCodexHome: string;\n}): Promise<ActivatedAccountSession> {\n const runtimePaths = resolveAccountRuntimePaths(input.runtimeContract, input.account.id);\n const accountStateRoot = runtimePaths.accountStateDirectory;\n const backupRoot = path.join(runtimePaths.runtimeBackupDirectory, \"active\");\n\n input.logger.info(\"account_activation.start\", {\n accountId: input.account.id,\n label: input.account.label,\n accountStateRoot,\n sharedCodexHome: input.sharedCodexHome,\n backupRoot,\n });\n\n await rm(backupRoot, { force: true, recursive: true }).catch(() => undefined);\n await mkdir(backupRoot, { recursive: true });\n\n const accountRules = input.runtimeContract.fileRules.filter(\n (rule) => rule.classification === \"account\",\n );\n const authSourcePath = path.join(accountStateRoot, \"auth.json\");\n if (!(await pathExists(authSourcePath))) {\n input.logger.error(\"account_activation.missing_auth\", {\n accountId: input.account.id,\n authSourcePath,\n });\n throw new Error(\n `Account \"${input.account.label}\" has no stored auth.json; add the account again.`,\n );\n }\n\n try {\n for (const rule of accountRules) {\n await backupRuntimeArtifact({\n backupRoot,\n logger: input.logger,\n rule,\n sharedCodexHome: input.sharedCodexHome,\n });\n await replaceRuntimeArtifact({\n accountStateRoot,\n logger: input.logger,\n rule,\n sharedCodexHome: input.sharedCodexHome,\n });\n }\n } catch (error) {\n input.logger.error(\"account_activation.failed\", {\n accountId: input.account.id,\n message: error instanceof Error ? error.message : String(error),\n });\n await restoreSharedRuntimeFromBackup({\n account: input.account,\n backupRoot,\n logger: input.logger,\n runtimeContract: input.runtimeContract,\n sharedCodexHome: input.sharedCodexHome,\n });\n throw error;\n }\n\n input.logger.info(\"account_activation.complete\", {\n accountId: input.account.id,\n sharedCodexHome: input.sharedCodexHome,\n });\n\n return {\n account: input.account,\n backupRoot,\n runtimeContract: input.runtimeContract,\n sharedCodexHome: input.sharedCodexHome,\n sourceAccountStateRoot: accountStateRoot,\n };\n}\n\nexport async function syncSharedRuntimeBackToAccount(input: {\n logger: Logger;\n session: ActivatedAccountSession;\n}): Promise<void> {\n const accountRules = input.session.runtimeContract.fileRules.filter(\n (rule) => rule.classification === \"account\",\n );\n\n input.logger.info(\"account_sync.start\", {\n accountId: input.session.account.id,\n sharedCodexHome: input.session.sharedCodexHome,\n accountStateRoot: input.session.sourceAccountStateRoot,\n });\n\n for (const rule of accountRules) {\n await syncRuntimeArtifact({\n accountStateRoot: input.session.sourceAccountStateRoot,\n logger: input.logger,\n rule,\n sharedCodexHome: input.session.sharedCodexHome,\n });\n }\n\n input.logger.info(\"account_sync.complete\", {\n accountId: input.session.account.id,\n });\n}\n\nexport async function restoreSharedRuntimeFromBackup(input: {\n account: AccountRecord;\n backupRoot: string;\n logger: Logger;\n runtimeContract: RuntimeContract;\n sharedCodexHome: string;\n}): Promise<void> {\n const accountRules = input.runtimeContract.fileRules.filter(\n (rule) => rule.classification === \"account\",\n );\n\n input.logger.warn(\"account_activation.restore.start\", {\n accountId: input.account.id,\n backupRoot: input.backupRoot,\n sharedCodexHome: input.sharedCodexHome,\n });\n\n for (const rule of accountRules) {\n await restoreRuntimeArtifact({\n backupRoot: input.backupRoot,\n logger: input.logger,\n rule,\n sharedCodexHome: input.sharedCodexHome,\n });\n }\n\n input.logger.warn(\"account_activation.restore.complete\", {\n accountId: input.account.id,\n });\n}\n\nasync function backupRuntimeArtifact(input: {\n backupRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.sharedCodexHome, normalizedPattern(input.rule.pathPattern));\n const backupPath = path.join(input.backupRoot, normalizedPattern(input.rule.pathPattern));\n\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"account_activation.backup.skip\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n await mkdir(path.dirname(backupPath), { recursive: true });\n if (isDirectoryPattern(input.rule)) {\n await cp(sourcePath, backupPath, { recursive: true });\n } else {\n await copyFile(sourcePath, backupPath);\n }\n\n input.logger.debug(\"account_activation.backup.complete\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n backupPath,\n });\n}\n\nasync function replaceRuntimeArtifact(input: {\n accountStateRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.accountStateRoot, normalizedPattern(input.rule.pathPattern));\n const targetPath = path.join(input.sharedCodexHome, normalizedPattern(input.rule.pathPattern));\n\n await rm(targetPath, { force: true, recursive: true }).catch(() => undefined);\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"account_activation.replace.skip\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n await mkdir(path.dirname(targetPath), { recursive: true });\n if (isDirectoryPattern(input.rule)) {\n await cp(sourcePath, targetPath, { recursive: true });\n } else {\n await copyFile(sourcePath, targetPath);\n }\n\n input.logger.debug(\"account_activation.replace.complete\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n targetPath,\n });\n}\n\nasync function syncRuntimeArtifact(input: {\n accountStateRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.sharedCodexHome, normalizedPattern(input.rule.pathPattern));\n const targetPath = path.join(input.accountStateRoot, normalizedPattern(input.rule.pathPattern));\n\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"account_sync.skip\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n const changed = await hasArtifactChanged(sourcePath, targetPath, isDirectoryPattern(input.rule));\n if (!changed) {\n input.logger.debug(\"account_sync.no_change\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n targetPath,\n });\n return;\n }\n\n await rm(targetPath, { force: true, recursive: true }).catch(() => undefined);\n await mkdir(path.dirname(targetPath), { recursive: true });\n if (isDirectoryPattern(input.rule)) {\n await cp(sourcePath, targetPath, { recursive: true });\n } else {\n await copyFile(sourcePath, targetPath);\n }\n\n input.logger.info(\"account_sync.updated\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n targetPath,\n });\n}\n\nasync function restoreRuntimeArtifact(input: {\n backupRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sharedCodexHome: string;\n}): Promise<void> {\n const backupPath = path.join(input.backupRoot, normalizedPattern(input.rule.pathPattern));\n const targetPath = path.join(input.sharedCodexHome, normalizedPattern(input.rule.pathPattern));\n\n await rm(targetPath, { force: true, recursive: true }).catch(() => undefined);\n\n if (!(await pathExists(backupPath))) {\n input.logger.debug(\"account_activation.restore.skip\", {\n pathPattern: input.rule.pathPattern,\n backupPath,\n reason: \"missing\",\n });\n return;\n }\n\n await mkdir(path.dirname(targetPath), { recursive: true });\n if (isDirectoryPattern(input.rule)) {\n await cp(backupPath, targetPath, { recursive: true });\n } else {\n await copyFile(backupPath, targetPath);\n }\n\n input.logger.debug(\"account_activation.restore.complete_artifact\", {\n pathPattern: input.rule.pathPattern,\n backupPath,\n targetPath,\n });\n}\n\nfunction isDirectoryPattern(rule: RuntimeFileRule): boolean {\n return rule.pathPattern.endsWith(\"/**\");\n}\n\nfunction normalizedPattern(pattern: string): string {\n return pattern.endsWith(\"/**\") ? pattern.slice(0, -3) : pattern;\n}\n\nasync function hasArtifactChanged(\n sourcePath: string,\n targetPath: string,\n isDirectory: boolean,\n): Promise<boolean> {\n if (!(await pathExists(targetPath))) {\n return true;\n }\n\n if (isDirectory) {\n const [sourceHash, targetHash] = await Promise.all([\n hashDirectory(sourcePath),\n hashDirectory(targetPath),\n ]);\n return sourceHash !== targetHash;\n }\n\n const [sourceHash, targetHash] = await Promise.all([\n hashFile(sourcePath),\n hashFile(targetPath),\n ]);\n return sourceHash !== targetHash;\n}\n\nasync function hashFile(filePath: string): Promise<string> {\n const content = await readFile(filePath);\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nasync function hashDirectory(directoryPath: string): Promise<string> {\n const entries = await collectFiles(directoryPath);\n const hash = createHash(\"sha256\");\n\n for (const entry of entries.sort()) {\n hash.update(entry.relativePath);\n hash.update(await readFile(entry.absolutePath));\n }\n\n return hash.digest(\"hex\");\n}\n\nasync function collectFiles(root: string): Promise<Array<{ absolutePath: string; relativePath: string }>> {\n const rootStats = await stat(root).catch(() => null);\n if (!rootStats) {\n return [];\n }\n\n if (!rootStats.isDirectory()) {\n return [{ absolutePath: root, relativePath: path.basename(root) }];\n }\n\n const results: Array<{ absolutePath: string; relativePath: string }> = [];\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) {\n continue;\n }\n\n const entries = await import(\"node:fs/promises\").then((fs) =>\n fs.readdir(current, { withFileTypes: true }),\n );\n for (const entry of entries) {\n const absolutePath = path.join(current, entry.name);\n if (entry.isDirectory()) {\n stack.push(absolutePath);\n continue;\n }\n\n if (entry.isFile()) {\n results.push({\n absolutePath,\n relativePath: path.relative(root, absolutePath).split(path.sep).join(\"/\"),\n });\n }\n }\n }\n\n return results;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n\n throw error;\n }\n}\n", "import { spawn } from \"node:child_process\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { resolveCodexLaunchSpec } from \"./codex-launch-spec.js\";\n\nexport async function spawnCodexCommand(input: {\n argv: string[];\n codexBinaryPath: string;\n codexHome: string;\n logger: Logger;\n}): Promise<number> {\n const launchSpec = await resolveCodexLaunchSpec(input.codexBinaryPath, input.argv);\n\n input.logger.info(\"spawn_codex.start\", {\n codexBinaryPath: input.codexBinaryPath,\n resolvedCommand: launchSpec.command,\n codexHome: input.codexHome,\n argv: launchSpec.args,\n stdinIsTTY: process.stdin.isTTY ?? false,\n stdoutIsTTY: process.stdout.isTTY ?? false,\n stderrIsTTY: process.stderr.isTTY ?? false,\n });\n\n return new Promise((resolve, reject) => {\n const child = spawn(launchSpec.command, launchSpec.args, {\n env: {\n ...process.env,\n CODEX_HOME: input.codexHome,\n },\n shell: false,\n stdio: \"inherit\",\n windowsHide: false,\n });\n let settled = false;\n\n const forwardSignal = (signal: NodeJS.Signals) => {\n input.logger.warn(\"spawn_codex.parent_signal\", {\n signal,\n pid: child.pid ?? null,\n });\n child.kill(signal);\n };\n\n const signalHandlers = {\n SIGINT: () => forwardSignal(\"SIGINT\"),\n SIGTERM: () => forwardSignal(\"SIGTERM\"),\n } satisfies Partial<Record<NodeJS.Signals, () => void>>;\n\n process.on(\"SIGINT\", signalHandlers.SIGINT);\n process.on(\"SIGTERM\", signalHandlers.SIGTERM);\n\n const cleanup = () => {\n process.off(\"SIGINT\", signalHandlers.SIGINT);\n process.off(\"SIGTERM\", signalHandlers.SIGTERM);\n };\n\n child.on(\"error\", (error) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n input.logger.error(\"spawn_codex.error\", {\n codexBinaryPath: input.codexBinaryPath,\n message: error.message,\n });\n reject(error);\n });\n\n child.on(\"exit\", (exitCode, signal) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n input.logger.info(\"spawn_codex.complete\", {\n codexBinaryPath: input.codexBinaryPath,\n exitCode,\n signal,\n });\n resolve(exitCode ?? 1);\n });\n });\n}\n", "import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AccountRecord } from \"../accounts/account-registry.js\";\nimport type { Logger } from \"../logging/logger.js\";\n\nexport type AccountAuthStateFailureCategory =\n | \"missing-file\"\n | \"malformed-json\"\n | \"missing-access-token\"\n | \"unsupported-auth-shape\";\n\nexport interface AccountAuthState {\n accessToken: string;\n accountId: string | null;\n authMode: string | null;\n lastRefresh: string | null;\n}\n\nexport type AccountAuthStateReadResult =\n | {\n ok: true;\n filePath: string;\n state: AccountAuthState;\n }\n | {\n ok: false;\n category: AccountAuthStateFailureCategory;\n filePath: string;\n message: string;\n };\n\nexport async function readAccountAuthState(input: {\n account: AccountRecord;\n logger: Logger;\n}): Promise<AccountAuthStateReadResult> {\n const filePath = path.join(input.account.authDirectory, \"state\", \"auth.json\");\n\n input.logger.debug(\"selection.account_auth_state.read_start\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n });\n\n try {\n const raw = await readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (!isRecord(parsed)) {\n input.logger.warn(\"selection.account_auth_state.unsupported_shape\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n topLevelType: typeof parsed,\n });\n\n return {\n ok: false,\n category: \"unsupported-auth-shape\",\n filePath,\n message: \"auth.json is not a JSON object.\",\n };\n }\n\n const accessToken = resolveString(\n parsed.access_token,\n getNestedString(parsed, [\"tokens\", \"access_token\"]),\n getNestedString(parsed, [\"tokens\", \"accessToken\"]),\n );\n if (!accessToken) {\n input.logger.warn(\"selection.account_auth_state.access_token_missing\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n hasTokensObject: isRecord(parsed.tokens),\n });\n\n return {\n ok: false,\n category: \"missing-access-token\",\n filePath,\n message: \"auth.json does not contain an access_token.\",\n };\n }\n\n const result: AccountAuthStateReadResult = {\n ok: true,\n filePath,\n state: {\n accessToken,\n accountId: resolveString(\n parsed.account_id,\n parsed.accountId,\n getNestedString(parsed, [\"tokens\", \"account_id\"]),\n getNestedString(parsed, [\"tokens\", \"accountId\"]),\n ),\n authMode: resolveString(\n parsed.auth_mode,\n parsed.authMode,\n getNestedString(parsed, [\"tokens\", \"auth_mode\"]),\n getNestedString(parsed, [\"tokens\", \"authMode\"]),\n ),\n lastRefresh: resolveString(\n parsed.last_refresh,\n parsed.lastRefresh,\n parsed.refresh_at,\n parsed.refreshAt,\n ),\n },\n };\n\n input.logger.debug(\"selection.account_auth_state.read_complete\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n hasAccessToken: true,\n authAccountId: result.state.accountId,\n authMode: result.state.authMode,\n hasRefreshMetadata: result.state.lastRefresh !== null,\n });\n\n return result;\n } catch (error) {\n if (isNodeErrorWithCode(error, \"ENOENT\")) {\n input.logger.warn(\"selection.account_auth_state.missing_file\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n });\n return {\n ok: false,\n category: \"missing-file\",\n filePath,\n message: \"auth.json was not found for the account profile.\",\n };\n }\n\n if (error instanceof SyntaxError) {\n input.logger.warn(\"selection.account_auth_state.malformed_json\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n message: error.message,\n });\n return {\n ok: false,\n category: \"malformed-json\",\n filePath,\n message: error.message,\n };\n }\n\n input.logger.warn(\"selection.account_auth_state.unsupported_shape\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n message: error instanceof Error ? error.message : String(error),\n });\n return {\n ok: false,\n category: \"unsupported-auth-shape\",\n filePath,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction getNestedString(value: Record<string, unknown>, pathParts: string[]): string | null {\n let current: unknown = value;\n\n for (const part of pathParts) {\n if (!isRecord(current) || typeof current[part] === \"undefined\") {\n return null;\n }\n\n current = current[part];\n }\n\n return typeof current === \"string\" && current.trim().length > 0 ? current : null;\n}\n\nfunction resolveString(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isNodeErrorWithCode(error: unknown, code: string): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n", "import type { Logger } from \"../logging/logger.js\";\nimport type {\n NormalizedUsageSnapshot,\n NormalizedUsageWindow,\n UsageQuotaWindowRaw,\n UsageSnapshotStatus,\n WhamUsageResponseRaw,\n} from \"./usage-types.js\";\n\nexport function normalizeWhamUsageResponse(input: {\n accountIdHint?: string | null;\n logger: Logger;\n raw: WhamUsageResponseRaw;\n}): NormalizedUsageSnapshot {\n input.logger.debug(\"selection.usage_normalize.start\", {\n accountIdHint: input.accountIdHint ?? null,\n topLevelKeys: Object.keys(input.raw).sort(),\n });\n\n const daily = normalizeUsageWindow({\n accountIdHint: input.accountIdHint,\n logger: input.logger,\n raw: resolveUsageWindow(input.raw, \"daily\"),\n window: \"daily\",\n });\n const weekly = normalizeUsageWindow({\n accountIdHint: input.accountIdHint,\n logger: input.logger,\n raw: resolveUsageWindow(input.raw, \"weekly\"),\n window: \"weekly\",\n });\n const accountId = pickString(input.raw.account_id, input.raw.accountId, input.accountIdHint);\n const allowed = typeof input.raw.allowed === \"boolean\" ? input.raw.allowed : true;\n const limitReached =\n typeof input.raw.limit_reached === \"boolean\"\n ? input.raw.limit_reached\n : daily.limitReached || weekly.limitReached;\n const status = classifyUsageStatus({\n allowed,\n dailyRemaining: daily.remaining,\n limitReached,\n weeklyRemaining: weekly.remaining,\n });\n const snapshot: NormalizedUsageSnapshot = {\n accountId,\n allowed,\n limitReached,\n dailyRemaining: daily.remaining,\n weeklyRemaining: weekly.remaining,\n dailyResetsAt: daily.resetsAt,\n weeklyResetsAt: weekly.resetsAt,\n dailyPercentUsed: daily.percentUsed,\n weeklyPercentUsed: weekly.percentUsed,\n observedAt: new Date().toISOString(),\n status,\n statusReason: describeUsageStatus(status),\n windows: {\n daily,\n weekly,\n },\n };\n\n input.logger.debug(\"selection.usage_normalize.complete\", {\n accountId: snapshot.accountId,\n allowed: snapshot.allowed,\n limitReached: snapshot.limitReached,\n dailyRemaining: snapshot.dailyRemaining,\n weeklyRemaining: snapshot.weeklyRemaining,\n dailyResetsAt: snapshot.dailyResetsAt,\n weeklyResetsAt: snapshot.weeklyResetsAt,\n status: snapshot.status,\n statusReason: snapshot.statusReason,\n });\n\n return snapshot;\n}\n\nfunction normalizeUsageWindow(input: {\n accountIdHint?: string | null;\n logger: Logger;\n raw: UsageQuotaWindowRaw | null;\n window: \"daily\" | \"weekly\";\n}): NormalizedUsageWindow {\n if (!input.raw) {\n input.logger.debug(\"selection.usage_normalize.window_missing\", {\n accountIdHint: input.accountIdHint ?? null,\n window: input.window,\n });\n\n return {\n limit: null,\n used: null,\n remaining: null,\n limitReached: false,\n resetsAt: null,\n percentUsed: null,\n source: null,\n };\n }\n\n const limit = pickNumber(input.raw.limit);\n const used = pickNumber(input.raw.used, calculateUsed(limit, pickNumber(input.raw.remaining)));\n const remaining = pickNumber(\n input.raw.remaining,\n calculateRemaining(limit, used),\n );\n const limitReached =\n typeof input.raw.limit_reached === \"boolean\"\n ? input.raw.limit_reached\n : remaining !== null\n ? remaining <= 0\n : false;\n const percentUsed = pickNumber(\n input.raw.percent_used,\n input.raw.percentage_used,\n calculatePercentUsed(limit, used, remaining),\n );\n const resetsAt = normalizeTimestamp(\n input.raw.reset_at,\n input.raw.resets_at,\n input.raw.next_reset_at,\n );\n const source = resolveWindowSource(input.raw);\n\n input.logger.debug(\"selection.usage_normalize.window_complete\", {\n accountIdHint: input.accountIdHint ?? null,\n window: input.window,\n limit,\n used,\n remaining,\n limitReached,\n percentUsed,\n resetsAt,\n source,\n });\n\n return {\n limit,\n used,\n remaining,\n limitReached,\n resetsAt,\n percentUsed,\n source,\n };\n}\n\nfunction resolveUsageWindow(\n raw: WhamUsageResponseRaw,\n window: \"daily\" | \"weekly\",\n): UsageQuotaWindowRaw | null {\n const candidates = [raw[window], raw.usage?.[window], raw.quotas?.[window]];\n\n for (const candidate of candidates) {\n if (isRecord(candidate)) {\n return candidate as UsageQuotaWindowRaw;\n }\n }\n\n return null;\n}\n\nfunction resolveWindowSource(raw: UsageQuotaWindowRaw): string | null {\n if (typeof raw.source === \"string\") {\n return raw.source;\n }\n\n if (typeof raw.kind === \"string\") {\n return raw.kind;\n }\n\n return null;\n}\n\nfunction classifyUsageStatus(input: {\n allowed: boolean;\n dailyRemaining: number | null;\n limitReached: boolean;\n weeklyRemaining: number | null;\n}): UsageSnapshotStatus {\n if (!input.allowed) {\n return \"not-allowed\";\n }\n\n if (input.limitReached) {\n return \"limit-reached\";\n }\n\n if (input.dailyRemaining === null && input.weeklyRemaining === null) {\n return \"missing-usage-data\";\n }\n\n return \"usable\";\n}\n\nfunction describeUsageStatus(status: UsageSnapshotStatus): string {\n switch (status) {\n case \"not-allowed\":\n return \"usage endpoint reported that the account is not allowed to launch\";\n case \"limit-reached\":\n return \"usage endpoint reported an exhausted limit window\";\n case \"missing-usage-data\":\n return \"usage endpoint did not expose enough quota fields to rank this account\";\n case \"usable\":\n return \"usage endpoint exposed enough quota fields to rank this account\";\n }\n}\n\nfunction normalizeTimestamp(...values: Array<number | string | null | undefined>): string | null {\n for (const value of values) {\n if (typeof value === \"string\") {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.valueOf())) {\n return parsed.toISOString();\n }\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n const normalizedValue = value > 10_000_000_000 ? value : value * 1_000;\n const parsed = new Date(normalizedValue);\n if (!Number.isNaN(parsed.valueOf())) {\n return parsed.toISOString();\n }\n }\n }\n\n return null;\n}\n\nfunction calculateRemaining(\n limit: number | null,\n used: number | null,\n): number | null {\n if (limit === null || used === null) {\n return null;\n }\n\n return limit - used;\n}\n\nfunction calculateUsed(\n limit: number | null,\n remaining: number | null,\n): number | null {\n if (limit === null || remaining === null) {\n return null;\n }\n\n return limit - remaining;\n}\n\nfunction calculatePercentUsed(\n limit: number | null,\n used: number | null,\n remaining: number | null,\n): number | null {\n if (limit === null || limit <= 0) {\n return null;\n }\n\n const numerator = used ?? calculateUsed(limit, remaining);\n if (numerator === null) {\n return null;\n }\n\n return Number(((numerator / limit) * 100).toFixed(2));\n}\n\nfunction pickString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction pickNumber(\n ...values: Array<number | null | undefined>\n): number | null {\n for (const value of values) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n", "import type { AccountRecord } from \"../accounts/account-registry.js\";\nimport type { ExperimentalSelectionConfig } from \"../config/wrapper-config.js\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { readAccountAuthState } from \"./account-auth-state.js\";\nimport { normalizeWhamUsageResponse } from \"./usage-normalize.js\";\nimport type { NormalizedUsageSnapshot, WhamUsageResponseRaw } from \"./usage-types.js\";\n\nconst WHAM_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\n\nexport type UsageProbeFailureCategory =\n | \"auth-missing\"\n | \"timeout\"\n | \"http-error\"\n | \"invalid-response\";\n\nexport type AccountUsageProbeResult =\n | {\n ok: true;\n account: AccountRecord;\n snapshot: NormalizedUsageSnapshot;\n source: \"fresh\";\n }\n | {\n ok: false;\n account: AccountRecord;\n category: UsageProbeFailureCategory;\n message: string;\n source: \"fresh\";\n };\n\nexport async function probeAccountUsage(input: {\n account: AccountRecord;\n fetchImpl?: typeof fetch;\n logger: Logger;\n probeConfig: ExperimentalSelectionConfig;\n}): Promise<AccountUsageProbeResult> {\n const fetchImpl = input.fetchImpl ?? fetch;\n\n input.logger.info(\"selection.usage_probe.start\", {\n accountId: input.account.id,\n label: input.account.label,\n timeoutMs: input.probeConfig.probeTimeoutMs,\n useAccountIdHeader: input.probeConfig.useAccountIdHeader,\n });\n\n const authState = await readAccountAuthState({\n account: input.account,\n logger: input.logger,\n });\n if (!authState.ok) {\n input.logger.warn(\"selection.usage_probe.auth_missing\", {\n accountId: input.account.id,\n label: input.account.label,\n category: authState.category,\n filePath: authState.filePath,\n });\n\n return {\n ok: false,\n account: input.account,\n category: \"auth-missing\",\n message: authState.message,\n source: \"fresh\",\n };\n }\n\n try {\n const response = await fetchImpl(WHAM_USAGE_URL, {\n method: \"GET\",\n headers: buildUsageHeaders({\n accessToken: authState.state.accessToken,\n accountId: authState.state.accountId,\n useAccountIdHeader: input.probeConfig.useAccountIdHeader,\n }),\n signal: AbortSignal.timeout(input.probeConfig.probeTimeoutMs),\n });\n\n input.logger.debug(\"selection.usage_probe.http_complete\", {\n accountId: input.account.id,\n label: input.account.label,\n status: response.status,\n ok: response.ok,\n });\n\n if (!response.ok) {\n input.logger.warn(\"selection.usage_probe.http_error\", {\n accountId: input.account.id,\n label: input.account.label,\n status: response.status,\n });\n return {\n ok: false,\n account: input.account,\n category: \"http-error\",\n message: `Usage probe returned HTTP ${response.status}.`,\n source: \"fresh\",\n };\n }\n\n const body = (await response.json()) as unknown;\n if (!isRecord(body)) {\n input.logger.warn(\"selection.usage_probe.invalid_response\", {\n accountId: input.account.id,\n label: input.account.label,\n bodyType: typeof body,\n });\n return {\n ok: false,\n account: input.account,\n category: \"invalid-response\",\n message: \"Usage probe returned a non-object JSON payload.\",\n source: \"fresh\",\n };\n }\n\n const snapshot = normalizeWhamUsageResponse({\n accountIdHint: authState.state.accountId ?? input.account.id,\n logger: input.logger,\n raw: body as WhamUsageResponseRaw,\n });\n\n input.logger.info(\"selection.usage_probe.success\", {\n accountId: input.account.id,\n label: input.account.label,\n snapshotStatus: snapshot.status,\n dailyRemaining: snapshot.dailyRemaining,\n weeklyRemaining: snapshot.weeklyRemaining,\n limitReached: snapshot.limitReached,\n });\n\n return {\n ok: true,\n account: input.account,\n snapshot,\n source: \"fresh\",\n };\n } catch (error) {\n if (isAbortError(error)) {\n input.logger.warn(\"selection.usage_probe.timeout\", {\n accountId: input.account.id,\n label: input.account.label,\n timeoutMs: input.probeConfig.probeTimeoutMs,\n });\n return {\n ok: false,\n account: input.account,\n category: \"timeout\",\n message: `Usage probe timed out after ${input.probeConfig.probeTimeoutMs}ms.`,\n source: \"fresh\",\n };\n }\n\n input.logger.error(\"selection.usage_probe.request_failed\", {\n accountId: input.account.id,\n label: input.account.label,\n message: error instanceof Error ? error.message : String(error),\n });\n return {\n ok: false,\n account: input.account,\n category: \"invalid-response\",\n message: error instanceof Error ? error.message : String(error),\n source: \"fresh\",\n };\n }\n}\n\nfunction buildUsageHeaders(input: {\n accessToken: string;\n accountId: string | null;\n useAccountIdHeader: boolean;\n}): Headers {\n const headers = new Headers({\n accept: \"application/json\",\n authorization: `Bearer ${input.accessToken}`,\n \"user-agent\": \"codexes/0.1 experimental-usage-probe\",\n });\n\n if (input.useAccountIdHeader && input.accountId) {\n headers.set(\"OpenAI-Account-ID\", input.accountId);\n }\n\n return headers;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n", "import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Logger } from \"../logging/logger.js\";\nimport type { NormalizedUsageSnapshot } from \"./usage-types.js\";\n\nconst USAGE_CACHE_SCHEMA_VERSION = 1;\n\nexport interface UsageCacheEntry {\n accountId: string;\n accountLabel: string;\n cachedAt: string;\n snapshot: NormalizedUsageSnapshot;\n}\n\ninterface UsageCacheDocument {\n schemaVersion: number;\n entries: UsageCacheEntry[];\n}\n\nexport async function loadUsageCache(input: {\n cacheFilePath: string;\n logger: Logger;\n}): Promise<UsageCacheEntry[]> {\n try {\n const raw = await readFile(input.cacheFilePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const normalized = normalizeUsageCacheDocument(parsed);\n\n input.logger.debug(\"selection.usage_cache.load_success\", {\n cacheFilePath: input.cacheFilePath,\n entryCount: normalized.entries.length,\n });\n\n return normalized.entries;\n } catch (error) {\n if (isNodeErrorWithCode(error, \"ENOENT\")) {\n input.logger.debug(\"selection.usage_cache.missing\", {\n cacheFilePath: input.cacheFilePath,\n });\n return [];\n }\n\n const backupPath = `${input.cacheFilePath}.corrupt-${Date.now()}`;\n await rename(input.cacheFilePath, backupPath).catch(() => undefined);\n\n input.logger.warn(\"selection.usage_cache.corrupt\", {\n cacheFilePath: input.cacheFilePath,\n backupPath,\n message: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n}\n\nexport async function persistUsageCache(input: {\n cacheFilePath: string;\n entries: UsageCacheEntry[];\n logger: Logger;\n}): Promise<void> {\n await mkdir(path.dirname(input.cacheFilePath), { recursive: true });\n\n const document: UsageCacheDocument = {\n schemaVersion: USAGE_CACHE_SCHEMA_VERSION,\n entries: input.entries,\n };\n const tempFile = `${input.cacheFilePath}.tmp`;\n const serialized = JSON.stringify(document, null, 2);\n\n await writeFile(tempFile, serialized, \"utf8\");\n await rename(tempFile, input.cacheFilePath);\n\n input.logger.debug(\"selection.usage_cache.persisted\", {\n cacheFilePath: input.cacheFilePath,\n entryCount: input.entries.length,\n });\n}\n\nexport function resolveFreshUsageCacheEntry(input: {\n accountId: string;\n entries: UsageCacheEntry[];\n logger: Logger;\n now: number;\n ttlMs: number;\n}): UsageCacheEntry | null {\n const entry = input.entries.find((candidate) => candidate.accountId === input.accountId) ?? null;\n if (!entry) {\n input.logger.debug(\"selection.usage_cache.miss\", {\n accountId: input.accountId,\n ttlMs: input.ttlMs,\n });\n return null;\n }\n\n const ageMs = input.now - new Date(entry.cachedAt).valueOf();\n if (!Number.isFinite(ageMs) || ageMs > input.ttlMs) {\n input.logger.debug(\"selection.usage_cache.expired\", {\n accountId: input.accountId,\n cachedAt: entry.cachedAt,\n ageMs: Number.isFinite(ageMs) ? ageMs : null,\n ttlMs: input.ttlMs,\n });\n return null;\n }\n\n input.logger.debug(\"selection.usage_cache.hit\", {\n accountId: input.accountId,\n cachedAt: entry.cachedAt,\n ageMs,\n ttlMs: input.ttlMs,\n });\n return entry;\n}\n\nfunction normalizeUsageCacheDocument(value: unknown): UsageCacheDocument {\n if (!isRecord(value)) {\n throw new Error(\"Usage cache document is not an object.\");\n }\n\n const schemaVersion =\n typeof value.schemaVersion === \"number\" ? value.schemaVersion : USAGE_CACHE_SCHEMA_VERSION;\n if (schemaVersion !== USAGE_CACHE_SCHEMA_VERSION) {\n throw new Error(`Unsupported usage cache schema version ${schemaVersion}.`);\n }\n\n const entries = Array.isArray(value.entries)\n ? value.entries.filter(isUsageCacheEntry)\n : [];\n\n return {\n schemaVersion: USAGE_CACHE_SCHEMA_VERSION,\n entries,\n };\n}\n\nfunction isUsageCacheEntry(value: unknown): value is UsageCacheEntry {\n return (\n isRecord(value) &&\n typeof value.accountId === \"string\" &&\n typeof value.accountLabel === \"string\" &&\n typeof value.cachedAt === \"string\" &&\n isRecord(value.snapshot)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isNodeErrorWithCode(error: unknown, code: string): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n", "import type { AccountRecord } from \"../accounts/account-registry.js\";\nimport type { ExperimentalSelectionConfig } from \"../config/wrapper-config.js\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { probeAccountUsage, type AccountUsageProbeResult } from \"./usage-client.js\";\nimport {\n loadUsageCache,\n persistUsageCache,\n resolveFreshUsageCacheEntry,\n type UsageCacheEntry,\n} from \"./usage-cache.js\";\nimport type { NormalizedUsageSnapshot } from \"./usage-types.js\";\n\nexport type AccountUsageResolution =\n | {\n ok: true;\n account: AccountRecord;\n snapshot: NormalizedUsageSnapshot;\n source: \"cache\" | \"fresh\";\n }\n | AccountUsageProbeResult;\n\nexport async function resolveAccountUsageSnapshots(input: {\n accounts: AccountRecord[];\n cacheFilePath: string;\n fetchImpl?: typeof fetch;\n logger: Logger;\n probeConfig: ExperimentalSelectionConfig;\n}): Promise<AccountUsageResolution[]> {\n const now = Date.now();\n\n input.logger.info(\"selection.usage_probe_coordinator.start\", {\n accountCount: input.accounts.length,\n cacheFilePath: input.cacheFilePath,\n cacheTtlMs: input.probeConfig.cacheTtlMs,\n timeoutMs: input.probeConfig.probeTimeoutMs,\n });\n\n const cacheEntries = await loadUsageCache({\n cacheFilePath: input.cacheFilePath,\n logger: input.logger,\n });\n const freshCacheEntries: UsageCacheEntry[] = [...cacheEntries];\n const resolutions = await Promise.all(\n input.accounts.map(async (account) => {\n const cached = resolveFreshUsageCacheEntry({\n accountId: account.id,\n entries: freshCacheEntries,\n logger: input.logger,\n now,\n ttlMs: input.probeConfig.cacheTtlMs,\n });\n if (cached) {\n return {\n ok: true as const,\n account,\n snapshot: cached.snapshot,\n source: \"cache\" as const,\n };\n }\n\n const fresh = await probeAccountUsage({\n account,\n fetchImpl: input.fetchImpl,\n logger: input.logger,\n probeConfig: input.probeConfig,\n });\n if (fresh.ok) {\n upsertCacheEntry(freshCacheEntries, {\n accountId: account.id,\n accountLabel: account.label,\n cachedAt: new Date(now).toISOString(),\n snapshot: fresh.snapshot,\n });\n }\n\n return fresh;\n }),\n );\n\n await persistUsageCache({\n cacheFilePath: input.cacheFilePath,\n entries: freshCacheEntries,\n logger: input.logger,\n });\n\n input.logger.info(\"selection.usage_probe_coordinator.complete\", {\n accountCount: input.accounts.length,\n cacheHitCount: resolutions.filter((entry) => entry.ok && entry.source === \"cache\").length,\n freshSuccessCount: resolutions.filter((entry) => entry.ok && entry.source === \"fresh\").length,\n failureCount: resolutions.filter((entry) => !entry.ok).length,\n });\n\n return resolutions;\n}\n\nfunction upsertCacheEntry(entries: UsageCacheEntry[], nextEntry: UsageCacheEntry): void {\n const existingIndex = entries.findIndex((entry) => entry.accountId === nextEntry.accountId);\n if (existingIndex >= 0) {\n entries.splice(existingIndex, 1, nextEntry);\n return;\n }\n\n entries.push(nextEntry);\n}\n", "import type { AccountRegistry, AccountRecord } from \"../accounts/account-registry.js\";\nimport type {\n AccountSelectionStrategy,\n ExperimentalSelectionConfig,\n} from \"../config/wrapper-config.js\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { resolveAccountUsageSnapshots } from \"./usage-probe-coordinator.js\";\n\nexport async function selectAccountForExecution(input: {\n experimentalSelection?: ExperimentalSelectionConfig;\n fetchImpl?: typeof fetch;\n logger: Logger;\n registry: AccountRegistry;\n selectionCacheFilePath?: string;\n strategy: AccountSelectionStrategy;\n}): Promise<AccountRecord> {\n const accounts = await input.registry.listAccounts();\n\n input.logger.info(\"selection.start\", {\n strategy: input.strategy,\n accountCount: accounts.length,\n });\n\n if (accounts.length === 0) {\n input.logger.warn(\"selection.none\");\n throw new Error(\"No accounts configured. Add one with `codexes account add <label>`.\");\n }\n\n switch (input.strategy) {\n case \"manual-default\":\n return selectManualDefaultAccount(input.registry, input.logger, accounts);\n case \"single-account\":\n return selectSingleAccountOnly(input.registry, input.logger, accounts);\n case \"remaining-limit-experimental\":\n return selectExperimentalRemainingLimitAccount({\n accounts,\n experimentalSelection: input.experimentalSelection,\n fetchImpl: input.fetchImpl,\n logger: input.logger,\n registry: input.registry,\n selectionCacheFilePath: input.selectionCacheFilePath,\n });\n }\n}\n\nasync function selectManualDefaultAccount(\n registry: AccountRegistry,\n logger: Logger,\n accounts: AccountRecord[],\n): Promise<AccountRecord> {\n const defaultAccount = await registry.getDefaultAccount();\n if (defaultAccount) {\n logger.info(\"selection.manual_default\", {\n accountId: defaultAccount.id,\n label: defaultAccount.label,\n });\n return defaultAccount;\n }\n\n if (accounts.length === 1) {\n const [singleAccount] = accounts;\n if (!singleAccount) {\n throw new Error(\"No accounts configured.\");\n }\n\n logger.info(\"selection.manual_default_fallback_single\", {\n accountId: singleAccount.id,\n label: singleAccount.label,\n });\n return registry.selectAccount(singleAccount.id);\n }\n\n logger.warn(\"selection.manual_default_missing\", {\n accountCount: accounts.length,\n });\n throw new Error(\n \"Multiple accounts are configured but no default account is selected. Use `codexes account use <account-id-or-label>` first.\",\n );\n}\n\nasync function selectSingleAccountOnly(\n registry: AccountRegistry,\n logger: Logger,\n accounts: AccountRecord[],\n): Promise<AccountRecord> {\n if (accounts.length !== 1) {\n logger.warn(\"selection.single_account_invalid\", {\n accountCount: accounts.length,\n });\n throw new Error(\n \"The single-account strategy requires exactly one configured account.\",\n );\n }\n\n const [singleAccount] = accounts;\n if (!singleAccount) {\n throw new Error(\"No accounts configured.\");\n }\n\n logger.info(\"selection.single_account\", {\n accountId: singleAccount.id,\n label: singleAccount.label,\n });\n\n const defaultAccount = await registry.getDefaultAccount();\n if (defaultAccount?.id === singleAccount.id) {\n return singleAccount;\n }\n\n return registry.selectAccount(singleAccount.id);\n}\n\nasync function selectExperimentalRemainingLimitAccount(input: {\n accounts: AccountRecord[];\n experimentalSelection?: ExperimentalSelectionConfig;\n fetchImpl?: typeof fetch;\n logger: Logger;\n registry: AccountRegistry;\n selectionCacheFilePath?: string;\n}): Promise<AccountRecord> {\n if (!input.experimentalSelection?.enabled || !input.selectionCacheFilePath) {\n input.logger.warn(\"selection.experimental_config_missing\", {\n enabled: input.experimentalSelection?.enabled ?? false,\n hasSelectionCacheFilePath: Boolean(input.selectionCacheFilePath),\n });\n return selectManualDefaultAccount(input.registry, input.logger, input.accounts);\n }\n\n const defaultAccount = await input.registry.getDefaultAccount();\n const probeResults = await resolveAccountUsageSnapshots({\n accounts: input.accounts,\n cacheFilePath: input.selectionCacheFilePath,\n fetchImpl: input.fetchImpl,\n logger: input.logger,\n probeConfig: input.experimentalSelection,\n });\n\n const failedProbes = probeResults.filter((entry) => !entry.ok);\n if (failedProbes.length > 0) {\n const eventName =\n failedProbes.length === probeResults.length\n ? \"selection.experimental_fallback_all_probes_failed\"\n : \"selection.experimental_fallback_mixed_probe_outcomes\";\n input.logger.warn(eventName, {\n failedAccountIds: failedProbes.map((entry) => entry.account.id),\n failureCategories: failedProbes.map((entry) => entry.category),\n successfulAccountIds: probeResults\n .filter((entry) => entry.ok)\n .map((entry) => entry.account.id),\n });\n return selectManualDefaultAccount(input.registry, input.logger, input.accounts);\n }\n\n const successfulProbes = probeResults.filter((entry) => entry.ok);\n const candidates = successfulProbes\n .filter((entry) => entry.snapshot.status === \"usable\")\n .sort((left, right) =>\n compareExperimentalCandidates({\n defaultAccountId: defaultAccount?.id ?? null,\n left,\n right,\n registryOrder: input.accounts,\n }),\n );\n\n input.logger.info(\"selection.experimental_ranked\", {\n candidateOrder: candidates.map((entry) => ({\n accountId: entry.account.id,\n label: entry.account.label,\n dailyRemaining: entry.snapshot.dailyRemaining,\n weeklyRemaining: entry.snapshot.weeklyRemaining,\n source: entry.source,\n })),\n defaultAccountId: defaultAccount?.id ?? null,\n });\n\n const selected = candidates[0];\n if (!selected) {\n const allExhausted = successfulProbes.every(\n (entry) => entry.snapshot.limitReached || entry.snapshot.status === \"limit-reached\",\n );\n input.logger.warn(\n allExhausted\n ? \"selection.experimental_fallback_all_accounts_exhausted\"\n : \"selection.experimental_fallback_ambiguous_usage\",\n {\n usableProbeCount: candidates.length,\n probeStatuses: successfulProbes.map((entry) => ({\n accountId: entry.account.id,\n snapshotStatus: entry.snapshot.status,\n limitReached: entry.snapshot.limitReached,\n dailyRemaining: entry.snapshot.dailyRemaining,\n weeklyRemaining: entry.snapshot.weeklyRemaining,\n })),\n },\n );\n return selectManualDefaultAccount(input.registry, input.logger, input.accounts);\n }\n\n input.logger.info(\"selection.experimental_selected\", {\n accountId: selected.account.id,\n label: selected.account.label,\n dailyRemaining: selected.snapshot.dailyRemaining,\n weeklyRemaining: selected.snapshot.weeklyRemaining,\n source: selected.source,\n });\n\n return selected.account;\n}\n\nfunction compareExperimentalCandidates(input: {\n defaultAccountId: string | null;\n left: {\n account: AccountRecord;\n snapshot: {\n dailyRemaining: number | null;\n weeklyRemaining: number | null;\n };\n };\n registryOrder: AccountRecord[];\n right: {\n account: AccountRecord;\n snapshot: {\n dailyRemaining: number | null;\n weeklyRemaining: number | null;\n };\n };\n}): number {\n const dailyDelta =\n (input.right.snapshot.dailyRemaining ?? Number.NEGATIVE_INFINITY) -\n (input.left.snapshot.dailyRemaining ?? Number.NEGATIVE_INFINITY);\n if (dailyDelta !== 0) {\n return dailyDelta;\n }\n\n const weeklyDelta =\n (input.right.snapshot.weeklyRemaining ?? Number.NEGATIVE_INFINITY) -\n (input.left.snapshot.weeklyRemaining ?? Number.NEGATIVE_INFINITY);\n if (weeklyDelta !== 0) {\n return weeklyDelta;\n }\n\n const leftIsDefault = input.left.account.id === input.defaultAccountId;\n const rightIsDefault = input.right.account.id === input.defaultAccountId;\n if (leftIsDefault !== rightIsDefault) {\n return leftIsDefault ? -1 : 1;\n }\n\n return (\n input.registryOrder.findIndex((account) => account.id === input.left.account.id) -\n input.registryOrder.findIndex((account) => account.id === input.right.account.id)\n );\n}\n", "import { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport {\n createRuntimeContract,\n summarizeRuntimeContract,\n} from \"../../runtime/runtime-contract.js\";\nimport { runAccountAddCommand } from \"../account-add/run-account-add-command.js\";\nimport { runAccountListCommand } from \"../account-list/run-account-list-command.js\";\nimport { runAccountRemoveCommand } from \"../account-remove/run-account-remove-command.js\";\nimport { runAccountUseCommand } from \"../account-use/run-account-use-command.js\";\nimport { acquireRuntimeLock } from \"../../runtime/lock/runtime-lock.js\";\nimport {\n activateAccountIntoSharedRuntime,\n restoreSharedRuntimeFromBackup,\n syncSharedRuntimeBackToAccount,\n} from \"../../runtime/activate-account/activate-account.js\";\nimport { spawnCodexCommand } from \"../../process/spawn-codex-command.js\";\nimport { selectAccountForExecution } from \"../../selection/select-account.js\";\n\nexport async function runRootCommand(context: AppContext): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"root\",\n sink: context.logging.sink,\n });\n\n logger.debug(\"argv.received\", { argv: context.argv });\n logger.debug(\"runtime.detected\", {\n sharedCodexHome: context.paths.sharedCodexHome,\n accountRoot: context.paths.accountRoot,\n runtimeRoot: context.paths.runtimeRoot,\n registryFile: context.paths.registryFile,\n wrapperConfigFile: context.paths.wrapperConfigFile,\n selectionCacheFile: context.paths.selectionCacheFile,\n firstRun: context.runtimeInitialization.firstRun,\n copiedSharedArtifacts: context.runtimeInitialization.copiedSharedArtifacts,\n createdRuntimeFiles: context.runtimeInitialization.createdFiles,\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n accountSelectionStrategy: context.wrapperConfig.accountSelectionStrategy,\n experimentalSelection: context.wrapperConfig.experimentalSelection,\n codexBinaryPath: context.codexBinary.path,\n recursionGuardSource: context.executablePath,\n });\n\n const runtimeContract = createRuntimeContract({\n accountRoot: context.paths.accountRoot,\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n logger,\n runtimeRoot: context.paths.runtimeRoot,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n const runtimeSummary = summarizeRuntimeContract(runtimeContract);\n\n logger.debug(\"runtime.contract_ready\", runtimeSummary);\n\n if (context.wrapperConfig.credentialStoreMode !== \"file\") {\n logger.warn(\"credential_store.unsupported\", {\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n codexConfigFile: context.paths.codexConfigFile,\n reason: context.wrapperConfig.credentialStorePolicyReason,\n });\n }\n\n if (context.argv[0] === \"account\" && context.argv[1] === \"add\") {\n logger.info(\"command.dispatch\", {\n command: \"account add\",\n argv: context.argv.slice(2),\n });\n return runAccountAddCommand(context, context.argv.slice(2));\n }\n\n if (context.argv[0] === \"account\" && context.argv[1] === \"list\") {\n logger.info(\"command.dispatch\", {\n command: \"account list\",\n argv: context.argv.slice(2),\n });\n return runAccountListCommand(context);\n }\n\n if (context.argv[0] === \"account\" && context.argv[1] === \"remove\") {\n logger.info(\"command.dispatch\", {\n command: \"account remove\",\n argv: context.argv.slice(2),\n });\n return runAccountRemoveCommand(context, context.argv.slice(2));\n }\n\n if (context.argv[0] === \"account\" && context.argv[1] === \"use\") {\n logger.info(\"command.dispatch\", {\n command: \"account use\",\n argv: context.argv.slice(2),\n });\n return runAccountUseCommand(context, context.argv.slice(2));\n }\n\n if (context.argv.includes(\"--help\")) {\n context.io.stdout.write(`${buildHelpText()}\\n`);\n logger.info(\"help.rendered\");\n\n return 0;\n }\n\n if (!context.codexBinary.path) {\n logger.error(\"command.binary_missing\", {\n candidates: context.codexBinary.candidates,\n rejectedCandidates: context.codexBinary.rejectedCandidates,\n });\n throw new Error(\"Could not find the real `codex` binary on PATH.\");\n }\n\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n if (context.wrapperConfig.accountSelectionStrategy === \"remaining-limit-experimental\") {\n logger.warn(\"selection.experimental_enabled\", {\n endpoint: \"https://chatgpt.com/backend-api/wham/usage\",\n fallbackStrategy: \"manual-default\",\n timeoutMs: context.wrapperConfig.experimentalSelection.probeTimeoutMs,\n cacheTtlMs: context.wrapperConfig.experimentalSelection.cacheTtlMs,\n useAccountIdHeader: context.wrapperConfig.experimentalSelection.useAccountIdHeader,\n });\n }\n const activeAccount = await selectAccountForExecution({\n experimentalSelection: context.wrapperConfig.experimentalSelection,\n fetchImpl: fetch,\n logger,\n registry,\n selectionCacheFilePath: context.paths.selectionCacheFile,\n strategy: context.wrapperConfig.accountSelectionStrategy,\n });\n const lock = await acquireRuntimeLock({\n logger,\n runtimeRoot: context.paths.runtimeRoot,\n });\n\n try {\n const activation = await activateAccountIntoSharedRuntime({\n account: activeAccount,\n logger,\n runtimeContract,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n\n try {\n const exitCode = await spawnCodexCommand({\n argv: context.argv,\n codexBinaryPath: context.codexBinary.path,\n codexHome: context.paths.sharedCodexHome,\n logger,\n });\n\n await syncSharedRuntimeBackToAccount({\n logger,\n session: activation,\n });\n\n return exitCode;\n } catch (error) {\n await restoreSharedRuntimeFromBackup({\n account: activeAccount,\n backupRoot: activation.backupRoot,\n logger,\n runtimeContract,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n throw error;\n }\n } finally {\n await lock.release();\n }\n}\n\nfunction buildHelpText(): string {\n return [\n \"codexes\",\n \"\",\n \"Transparent multi-account wrapper around the Codex CLI.\",\n \"\",\n \"Usage:\",\n \" codexes [args...]\",\n \" codexes account add <label> [--timeout-ms <milliseconds>]\",\n \" codexes account list\",\n \" codexes account use <account-id-or-label>\",\n \" codexes account remove <account-id-or-label>\",\n \"\",\n \"Runtime model:\",\n \" Shared CODEX_HOME is preserved in a wrapper-owned runtime root.\",\n \" Account auth state is stored per account and synced back selectively.\",\n \"\",\n \"Current status:\",\n \" Account management and default Codex passthrough are implemented.\",\n \" Selection strategies: manual-default, single-account, remaining-limit-experimental.\",\n \" Experimental mode probes https://chatgpt.com/backend-api/wham/usage and falls back to manual-default when ranking is unreliable.\",\n ].join(\"\\n\");\n}\n", "import { buildAppContext } from \"./context.js\";\nimport { createLogger } from \"../logging/logger.js\";\nimport { runRootCommand } from \"../commands/root/run-root-command.js\";\n\nexport interface BootstrapIo {\n cwd: string;\n env: NodeJS.ProcessEnv;\n executablePath: string;\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n}\n\nexport async function runCli(argv: string[], io: BootstrapIo): Promise<number> {\n const context = await buildAppContext(argv, io);\n const logger = createLogger({\n level: context.logging.level,\n name: \"bootstrap\",\n sink: context.logging.sink,\n });\n\n logger.debug(\"bootstrap.start\", {\n argv,\n cwd: context.environment.cwd,\n platform: context.environment.platform,\n runtime: context.environment.runtime,\n });\n\n try {\n const exitCode = await runRootCommand(context);\n\n logger.debug(\"bootstrap.exit\", { exitCode });\n\n return exitCode;\n } catch (error) {\n const normalized = error instanceof Error ? error : new Error(String(error));\n\n logger.error(\"bootstrap.fatal\", {\n message: normalized.message,\n stack: normalized.stack,\n });\n\n context.io.stderr.write(`codexes: ${normalized.message}\\n`);\n\n return 1;\n }\n}\n", "import { runCli } from \"./core/bootstrap.js\";\n\nconst exitCode = await runCli(process.argv.slice(2), {\n cwd: process.cwd(),\n env: process.env,\n executablePath: process.argv[1] ?? process.execPath,\n stderr: process.stderr,\n stdout: process.stdout,\n});\n\nprocess.exit(exitCode);\n"],
5
- "mappings": "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",
6
- "names": ["path", "os", "path", "mkdir", "readFile", "stat", "writeFile", "mkdir", "readFile", "stat", "path", "emptyDocument", "path", "os", "mkdir", "readFile", "detectCredentialStoreMode", "writeFile", "stat", "path", "mkdir", "readFile", "rm", "writeFile", "path", "copyFile", "cp", "mkdir", "readFile", "stat", "writeFile", "path", "pinFileCredentialStore", "pathExists", "access", "path", "pathExists", "exitCode", "mkdir", "path", "readFile", "writeFile", "rm", "readFile", "path", "rm", "rm", "os", "path", "mkdir", "readFile", "rm", "stat", "writeFile", "copyFile", "cp", "mkdir", "readFile", "rm", "stat", "path", "path", "rm", "mkdir", "pathExists", "cp", "copyFile", "sourceHash", "targetHash", "readFile", "stat", "spawn", "spawn", "exitCode", "readFile", "path", "isRecord", "isRecord", "mkdir", "readFile", "rename", "writeFile", "path", "isNodeErrorWithCode", "isRecord", "exitCode", "exitCode"]
3
+ "sources": ["../src/logging/logger.ts", "../src/config/wrapper-config.ts", "../src/core/paths.ts", "../src/process/find-codex-binary.ts", "../src/runtime/init/initialize-runtime.ts", "../src/accounts/account-registry.ts", "../src/core/context.ts", "../src/runtime/runtime-contract.ts", "../src/commands/account-add/run-account-add-command.ts", "../src/runtime/login-workspace.ts", "../src/process/run-codex-login.ts", "../src/process/codex-launch-spec.ts", "../src/selection/format-selection-summary.ts", "../src/selection/account-auth-state.ts", "../src/selection/usage-normalize.ts", "../src/selection/usage-client.ts", "../src/selection/usage-cache.ts", "../src/selection/usage-probe-coordinator.ts", "../src/selection/selection-summary.ts", "../src/commands/account-list/run-account-list-command.ts", "../src/commands/account-remove/run-account-remove-command.ts", "../src/accounts/account-resolution.ts", "../src/commands/account-use/run-account-use-command.ts", "../src/runtime/lock/runtime-lock.ts", "../src/runtime/activate-account/activate-account.ts", "../src/process/spawn-codex-command.ts", "../src/commands/root/run-root-command.ts", "../src/core/bootstrap.ts", "../src/cli.ts"],
4
+ "sourcesContent": ["type LogLevel = \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\";\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n DEBUG: 10,\n INFO: 20,\n WARN: 30,\n ERROR: 40,\n};\n\nexport interface LogSink {\n write(level: LogLevel, event: string, details?: Record<string, unknown>): void;\n}\n\nexport interface Logger {\n debug(event: string, details?: Record<string, unknown>): void;\n info(event: string, details?: Record<string, unknown>): void;\n warn(event: string, details?: Record<string, unknown>): void;\n error(event: string, details?: Record<string, unknown>): void;\n}\n\nexport function resolveLogLevel(value: string | undefined): LogLevel {\n switch (value?.toUpperCase()) {\n case \"ERROR\":\n return \"ERROR\";\n case \"WARN\":\n return \"WARN\";\n case \"INFO\":\n return \"INFO\";\n case \"DEBUG\":\n return \"DEBUG\";\n default:\n return \"ERROR\";\n }\n}\n\nexport function createLogSink(\n stream: Pick<NodeJS.WriteStream, \"write\">,\n): LogSink {\n return {\n write(level, event, details = {}) {\n stream.write(\n `${JSON.stringify({\n ts: new Date().toISOString(),\n level,\n event,\n details,\n })}\\n`,\n );\n },\n };\n}\n\nexport function createLogger(input: {\n level: string;\n name: string;\n sink: LogSink;\n}): Logger {\n const configuredLevel = resolveLogLevel(input.level);\n\n return {\n debug(event, details) {\n logWithLevel(\"DEBUG\", input.name, configuredLevel, input.sink, event, details);\n },\n info(event, details) {\n logWithLevel(\"INFO\", input.name, configuredLevel, input.sink, event, details);\n },\n warn(event, details) {\n logWithLevel(\"WARN\", input.name, configuredLevel, input.sink, event, details);\n },\n error(event, details) {\n logWithLevel(\"ERROR\", input.name, configuredLevel, input.sink, event, details);\n },\n };\n}\n\nfunction logWithLevel(\n level: LogLevel,\n name: string,\n configuredLevel: LogLevel,\n sink: LogSink,\n event: string,\n details?: Record<string, unknown>,\n): void {\n if (LOG_LEVEL_ORDER[level] < LOG_LEVEL_ORDER[configuredLevel]) {\n return;\n }\n\n sink.write(level, `${name}.${event}`, details);\n}\n", "import { mkdir, readFile } from \"node:fs/promises\";\nimport type { Logger } from \"../logging/logger.js\";\nimport type { ResolvedPaths } from \"../core/paths.js\";\n\nexport type CredentialStoreMode = \"file\" | \"keyring\" | \"auto\" | \"missing\" | \"unknown\";\nexport type AccountSelectionStrategy =\n | \"manual-default\"\n | \"single-account\"\n | \"remaining-limit\"\n | \"remaining-limit-experimental\";\n\nexport interface WrapperConfig {\n configFilePath: string;\n codexConfigFilePath: string;\n selectionCacheFilePath: string;\n credentialStoreMode: CredentialStoreMode;\n credentialStorePolicyReason: string;\n accountSelectionStrategy: AccountSelectionStrategy;\n accountSelectionStrategySource: \"default\" | \"env-override\" | \"invalid-env-fallback\";\n experimentalSelection: ExperimentalSelectionConfig;\n}\n\nexport interface ExperimentalSelectionConfig {\n enabled: boolean;\n probeTimeoutMs: number;\n cacheTtlMs: number;\n useAccountIdHeader: boolean;\n}\n\nconst DEFAULT_EXPERIMENTAL_PROBE_TIMEOUT_MS = 3_500;\nconst DEFAULT_EXPERIMENTAL_CACHE_TTL_MS = 60_000;\n\nexport async function resolveWrapperConfig(input: {\n env: NodeJS.ProcessEnv;\n logger: Logger;\n paths: ResolvedPaths;\n}): Promise<WrapperConfig> {\n await mkdir(input.paths.dataRoot, { recursive: true });\n\n const credentialStoreMode = await detectCredentialStoreMode(\n input.paths.codexConfigFile,\n input.logger,\n );\n\n const selectionStrategy = resolveAccountSelectionStrategy(input.env, input.logger);\n const resolved = {\n configFilePath: input.paths.wrapperConfigFile,\n codexConfigFilePath: input.paths.codexConfigFile,\n selectionCacheFilePath: input.paths.selectionCacheFile,\n credentialStoreMode,\n credentialStorePolicyReason:\n credentialStoreMode === \"file\"\n ? \"file mode detected in Codex config\"\n : \"codexes currently supports only file-backed auth storage\",\n accountSelectionStrategy: selectionStrategy.strategy,\n accountSelectionStrategySource: selectionStrategy.source,\n experimentalSelection: resolveExperimentalSelectionConfig({\n env: input.env,\n logger: input.logger,\n strategy: selectionStrategy.strategy,\n }),\n } satisfies WrapperConfig;\n\n input.logger.info(\"wrapper_config.resolved\", {\n configFilePath: resolved.configFilePath,\n codexConfigFilePath: resolved.codexConfigFilePath,\n selectionCacheFilePath: resolved.selectionCacheFilePath,\n credentialStoreMode: resolved.credentialStoreMode,\n accountSelectionStrategy: resolved.accountSelectionStrategy,\n accountSelectionStrategySource: resolved.accountSelectionStrategySource,\n experimentalSelection: resolved.experimentalSelection,\n });\n\n return resolved;\n}\n\nfunction resolveExperimentalSelectionConfig(input: {\n env: NodeJS.ProcessEnv;\n logger: Logger;\n strategy: AccountSelectionStrategy;\n}): ExperimentalSelectionConfig {\n const probeTimeoutMs = resolvePositiveIntegerEnv({\n defaultValue: DEFAULT_EXPERIMENTAL_PROBE_TIMEOUT_MS,\n env: input.env,\n envKey: \"CODEXES_EXPERIMENTAL_SELECTION_TIMEOUT_MS\",\n logger: input.logger,\n });\n const cacheTtlMs = resolvePositiveIntegerEnv({\n defaultValue: DEFAULT_EXPERIMENTAL_CACHE_TTL_MS,\n env: input.env,\n envKey: \"CODEXES_EXPERIMENTAL_SELECTION_CACHE_TTL_MS\",\n logger: input.logger,\n });\n const useAccountIdHeader = resolveBooleanEnv(\n input.env.CODEXES_EXPERIMENTAL_SELECTION_USE_ACCOUNT_ID_HEADER,\n );\n const enabled =\n input.strategy === \"remaining-limit\" ||\n input.strategy === \"remaining-limit-experimental\";\n\n input.logger.debug(\"wrapper_config.experimental_selection_resolved\", {\n enabled,\n probeTimeoutMs,\n cacheTtlMs,\n useAccountIdHeader,\n });\n\n return {\n enabled,\n probeTimeoutMs,\n cacheTtlMs,\n useAccountIdHeader,\n };\n}\n\nfunction resolveAccountSelectionStrategy(\n env: NodeJS.ProcessEnv,\n logger: Logger,\n): {\n source: \"default\" | \"env-override\" | \"invalid-env-fallback\";\n strategy: AccountSelectionStrategy;\n} {\n const rawOverride = env.CODEXES_ACCOUNT_SELECTION_STRATEGY?.trim().toLowerCase();\n\n switch (rawOverride) {\n case \"single-account\":\n logger.info(\"wrapper_config.selection_strategy_override_applied\", {\n envKey: \"CODEXES_ACCOUNT_SELECTION_STRATEGY\",\n requestedStrategy: rawOverride,\n resolvedStrategy: \"single-account\",\n });\n return {\n source: \"env-override\",\n strategy: \"single-account\",\n };\n case \"remaining-limit\":\n case \"remaining-limit-experimental\":\n logger.info(\"wrapper_config.selection_strategy_override_applied\", {\n envKey: \"CODEXES_ACCOUNT_SELECTION_STRATEGY\",\n requestedStrategy: rawOverride,\n resolvedStrategy: \"remaining-limit\",\n });\n return {\n source: \"env-override\",\n strategy: \"remaining-limit\",\n };\n case undefined:\n case \"\":\n logger.info(\"wrapper_config.selection_strategy_default_applied\", {\n defaultStrategy: \"remaining-limit\",\n });\n return {\n source: \"default\",\n strategy: \"remaining-limit\",\n };\n case \"manual-default\":\n logger.info(\"wrapper_config.selection_strategy_override_applied\", {\n envKey: \"CODEXES_ACCOUNT_SELECTION_STRATEGY\",\n requestedStrategy: rawOverride,\n resolvedStrategy: \"manual-default\",\n });\n return {\n source: \"env-override\",\n strategy: \"manual-default\",\n };\n default:\n logger.warn(\"wrapper_config.selection_strategy_invalid_override\", {\n envKey: \"CODEXES_ACCOUNT_SELECTION_STRATEGY\",\n rawValue: rawOverride,\n fallbackStrategy: \"remaining-limit\",\n });\n return {\n source: \"invalid-env-fallback\",\n strategy: \"remaining-limit\",\n };\n }\n}\n\nasync function detectCredentialStoreMode(\n configFile: string,\n logger: Logger,\n): Promise<CredentialStoreMode> {\n try {\n const rawConfig = await readFile(configFile, \"utf8\");\n const mode = parseCredentialStoreMode(rawConfig);\n\n logger.debug(\"credential_store.detected\", {\n configFile,\n credentialStoreMode: mode,\n });\n\n return mode;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n logger.warn(\"credential_store.config_missing\", {\n configFile,\n fallbackMode: \"missing\",\n });\n return \"missing\";\n }\n\n logger.error(\"credential_store.read_failed\", {\n configFile,\n message: error instanceof Error ? error.message : String(error),\n });\n\n return \"unknown\";\n }\n}\n\nfunction parseCredentialStoreMode(rawConfig: string): CredentialStoreMode {\n const match = rawConfig.match(/^\\s*cli_auth_credentials_store\\s*=\\s*\"([^\"]+)\"/m);\n\n if (!match) {\n return \"missing\";\n }\n\n const configuredValue = match[1];\n\n if (!configuredValue) {\n return \"unknown\";\n }\n\n switch (configuredValue.trim().toLowerCase()) {\n case \"file\":\n return \"file\";\n case \"keyring\":\n return \"keyring\";\n case \"auto\":\n return \"auto\";\n default:\n return \"unknown\";\n }\n}\n\nfunction resolvePositiveIntegerEnv(input: {\n defaultValue: number;\n env: NodeJS.ProcessEnv;\n envKey: string;\n logger: Logger;\n}): number {\n const raw = input.env[input.envKey]?.trim();\n if (!raw) {\n return input.defaultValue;\n }\n\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n input.logger.warn(\"wrapper_config.invalid_env_override\", {\n envKey: input.envKey,\n rawValue: raw,\n fallbackValue: input.defaultValue,\n });\n return input.defaultValue;\n }\n\n return parsed;\n}\n\nfunction resolveBooleanEnv(value: string | undefined): boolean {\n switch (value?.trim().toLowerCase()) {\n case \"1\":\n case \"true\":\n case \"yes\":\n case \"on\":\n return true;\n default:\n return false;\n }\n}\n", "import path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface ResolvedPaths {\n projectRoot: string;\n dataRoot: string;\n sharedCodexHome: string;\n accountRoot: string;\n runtimeRoot: string;\n registryFile: string;\n wrapperConfigFile: string;\n codexConfigFile: string;\n selectionCacheFile: string;\n}\n\nexport function resolvePaths(\n cwd: string,\n env: NodeJS.ProcessEnv,\n): ResolvedPaths {\n const baseDataDir = resolveBaseDataDir(env);\n\n return {\n projectRoot: cwd,\n dataRoot: baseDataDir,\n sharedCodexHome: env.CODEX_HOME ?? path.join(baseDataDir, \"shared-home\"),\n accountRoot: path.join(baseDataDir, \"accounts\"),\n runtimeRoot: path.join(baseDataDir, \"runtime\"),\n registryFile: path.join(baseDataDir, \"registry.json\"),\n wrapperConfigFile: path.join(baseDataDir, \"codexes.json\"),\n codexConfigFile: path.join(env.CODEX_HOME ?? path.join(baseDataDir, \"shared-home\"), \"config.toml\"),\n selectionCacheFile: path.join(baseDataDir, \"selection-cache.json\"),\n };\n}\n\nfunction resolveBaseDataDir(env: NodeJS.ProcessEnv): string {\n if (process.platform === \"win32\") {\n return path.join(\n env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\"),\n \"codexes\",\n );\n }\n\n if (process.platform === \"darwin\") {\n return path.join(\n env.HOME ?? os.homedir(),\n \"Library\",\n \"Application Support\",\n \"codexes\",\n );\n }\n\n const xdgStateHome = env.XDG_STATE_HOME;\n\n if (xdgStateHome) {\n return path.join(xdgStateHome, \"codexes\");\n }\n\n return path.join(env.HOME ?? os.homedir(), \".local\", \"state\", \"codexes\");\n}\n", "import { access, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Logger } from \"../logging/logger.js\";\n\nexport interface CodexBinaryResolution {\n path: string | null;\n candidates: string[];\n rejectedCandidates: Array<{ candidate: string; reason: string }>;\n}\n\nexport async function findCodexBinary(input: {\n env: NodeJS.ProcessEnv;\n logger: Logger;\n wrapperExecutablePath: string;\n}): Promise<CodexBinaryResolution> {\n const candidates = buildCandidates(input.env);\n const rejectedCandidates: Array<{ candidate: string; reason: string }> = [];\n\n input.logger.debug(\"binary_resolution.start\", {\n wrapperExecutablePath: input.wrapperExecutablePath,\n candidateCount: candidates.length,\n });\n\n for (const candidate of candidates) {\n const reason = await getRejectionReason(candidate, input.wrapperExecutablePath);\n\n if (reason) {\n rejectedCandidates.push({ candidate, reason });\n input.logger.debug(\"binary_resolution.rejected\", { candidate, reason });\n continue;\n }\n\n input.logger.info(\"binary_resolution.selected\", { candidate });\n\n return {\n path: candidate,\n candidates,\n rejectedCandidates,\n };\n }\n\n input.logger.warn(\"binary_resolution.missing\", {\n wrapperExecutablePath: input.wrapperExecutablePath,\n rejectedCandidates,\n });\n\n return {\n path: null,\n candidates,\n rejectedCandidates,\n };\n}\n\nfunction buildCandidates(env: NodeJS.ProcessEnv): string[] {\n const pathValue = env.PATH ?? \"\";\n const pathEntries = pathValue\n .split(path.delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean);\n const executableNames = process.platform === \"win32\"\n ? [\"codex.cmd\", \"codex.exe\", \"codex.bat\"]\n : [\"codex\"];\n\n return Array.from(\n new Set(\n pathEntries.flatMap((entry) =>\n executableNames.map((executableName) => path.join(entry, executableName)),\n ),\n ),\n );\n}\n\nasync function getRejectionReason(\n candidate: string,\n wrapperExecutablePath: string,\n): Promise<string | null> {\n try {\n await access(candidate);\n } catch {\n return \"not_accessible\";\n }\n\n const [candidateStat, wrapperStat] = await Promise.all([\n stat(candidate).catch(() => null),\n stat(wrapperExecutablePath).catch(() => null),\n ]);\n\n if (!candidateStat || !candidateStat.isFile()) {\n return \"not_a_file\";\n }\n\n if (wrapperStat && isSameFile(candidate, wrapperExecutablePath, candidateStat, wrapperStat)) {\n return \"self_recursive_wrapper_path\";\n }\n\n if (path.basename(candidate).toLowerCase().startsWith(\"codexes\")) {\n return \"wrapper_named_binary\";\n }\n\n return null;\n}\n\nfunction isSameFile(\n candidate: string,\n wrapperExecutablePath: string,\n candidateStat: Awaited<ReturnType<typeof stat>>,\n wrapperStat: Awaited<ReturnType<typeof stat>>,\n): boolean {\n if (path.resolve(candidate) === path.resolve(wrapperExecutablePath)) {\n return true;\n }\n\n return candidateStat.ino === wrapperStat.ino && candidateStat.dev === wrapperStat.dev;\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport {\n copyFile,\n cp,\n mkdir,\n readFile,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport type { Logger } from \"../../logging/logger.js\";\nimport type { ResolvedPaths } from \"../../core/paths.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\n\nexport interface RuntimeInitializationResult {\n firstRun: boolean;\n legacyCodexHome: string;\n sharedCodexHome: string;\n createdDirectories: string[];\n createdFiles: string[];\n copiedSharedArtifacts: string[];\n skippedArtifacts: Array<{\n path: string;\n reason: string;\n }>;\n}\n\nexport async function initializeRuntimeEnvironment(input: {\n env: NodeJS.ProcessEnv;\n logger: Logger;\n paths: ResolvedPaths;\n}): Promise<RuntimeInitializationResult> {\n const legacyCodexHome = path.join(os.homedir(), \".codex\");\n const firstRun = !(await pathExists(input.paths.sharedCodexHome));\n const createdDirectories: string[] = [];\n const createdFiles: string[] = [];\n const copiedSharedArtifacts: string[] = [];\n const skippedArtifacts: RuntimeInitializationResult[\"skippedArtifacts\"] = [];\n\n input.logger.info(\"runtime_init.start\", {\n dataRoot: input.paths.dataRoot,\n sharedCodexHome: input.paths.sharedCodexHome,\n legacyCodexHome,\n firstRun,\n });\n\n for (const directory of [\n input.paths.dataRoot,\n input.paths.sharedCodexHome,\n input.paths.accountRoot,\n input.paths.runtimeRoot,\n path.join(input.paths.runtimeRoot, \"backups\"),\n path.join(input.paths.runtimeRoot, \"tmp\"),\n path.dirname(input.paths.registryFile),\n ]) {\n if (!(await pathExists(directory))) {\n createdDirectories.push(directory);\n input.logger.info(\"runtime_init.directory_create\", { directory });\n } else {\n input.logger.debug(\"runtime_init.directory_exists\", { directory });\n }\n\n await mkdir(directory, { recursive: true });\n }\n\n const configResult = await ensureSharedConfigToml({\n legacyCodexHome,\n logger: input.logger,\n sharedCodexHome: input.paths.sharedCodexHome,\n });\n createdFiles.push(...configResult.createdFiles);\n copiedSharedArtifacts.push(...configResult.copiedArtifacts);\n skippedArtifacts.push(...configResult.skippedArtifacts);\n\n const mcpResult = await ensureSharedFileCopy({\n artifactName: \"mcp.json\",\n logger: input.logger,\n sharedCodexHome: input.paths.sharedCodexHome,\n sourceCodexHome: legacyCodexHome,\n });\n createdFiles.push(...mcpResult.createdFiles);\n copiedSharedArtifacts.push(...mcpResult.copiedArtifacts);\n skippedArtifacts.push(...mcpResult.skippedArtifacts);\n\n const trustResult = await ensureSharedDirectoryCopy({\n artifactName: \"trust\",\n logger: input.logger,\n sharedCodexHome: input.paths.sharedCodexHome,\n sourceCodexHome: legacyCodexHome,\n });\n copiedSharedArtifacts.push(...trustResult.copiedArtifacts);\n skippedArtifacts.push(...trustResult.skippedArtifacts);\n\n // Registry creation is part of first-run runtime setup but must not create account auth state.\n const registry = createAccountRegistry({\n accountRoot: input.paths.accountRoot,\n logger: input.logger,\n registryFile: input.paths.registryFile,\n });\n if (!(await pathExists(input.paths.registryFile))) {\n createdFiles.push(input.paths.registryFile);\n input.logger.info(\"runtime_init.registry_bootstrap\", {\n registryFile: input.paths.registryFile,\n });\n } else {\n input.logger.debug(\"runtime_init.registry_exists\", {\n registryFile: input.paths.registryFile,\n });\n }\n await registry.listAccounts();\n\n const result: RuntimeInitializationResult = {\n firstRun,\n legacyCodexHome,\n sharedCodexHome: input.paths.sharedCodexHome,\n createdDirectories,\n createdFiles,\n copiedSharedArtifacts,\n skippedArtifacts,\n };\n\n input.logger.info(\"runtime_init.complete\", {\n firstRun: result.firstRun,\n createdDirectories: result.createdDirectories,\n createdFiles: result.createdFiles,\n copiedSharedArtifacts: result.copiedSharedArtifacts,\n skippedArtifacts: result.skippedArtifacts,\n });\n\n return result;\n}\n\nasync function ensureSharedConfigToml(input: {\n legacyCodexHome: string;\n logger: Logger;\n sharedCodexHome: string;\n}): Promise<SharedArtifactResult> {\n const targetPath = path.join(input.sharedCodexHome, \"config.toml\");\n const sourcePath = path.join(input.legacyCodexHome, \"config.toml\");\n\n if (await pathExists(targetPath)) {\n const existingConfig = await readFile(targetPath, \"utf8\");\n const existingMode = detectCredentialStoreMode(existingConfig);\n\n input.logger.debug(\"runtime_init.config_exists\", {\n targetPath,\n credentialStoreMode: existingMode,\n });\n\n if (existingMode === \"missing\") {\n await writeFile(targetPath, pinFileCredentialStore(existingConfig), \"utf8\");\n input.logger.info(\"runtime_init.config_file_mode_pinned\", {\n targetPath,\n });\n } else if (existingMode !== \"file\") {\n input.logger.warn(\"runtime_init.config_mode_unsupported\", {\n targetPath,\n credentialStoreMode: existingMode,\n });\n }\n\n return emptyArtifactResult();\n }\n\n if (await pathExists(sourcePath) && !samePath(sourcePath, targetPath)) {\n const sourceConfig = await readFile(sourcePath, \"utf8\");\n const pinnedConfig = pinFileCredentialStore(sourceConfig);\n await writeFile(targetPath, pinnedConfig, \"utf8\");\n\n input.logger.info(\"runtime_init.config_imported\", {\n sourcePath,\n targetPath,\n sourceCredentialStoreMode: detectCredentialStoreMode(sourceConfig),\n targetCredentialStoreMode: detectCredentialStoreMode(pinnedConfig),\n });\n\n return {\n copiedArtifacts: [\"config.toml\"],\n createdFiles: [targetPath],\n skippedArtifacts: [],\n };\n }\n\n await writeFile(\n targetPath,\n [\n \"cli_auth_credentials_store = \\\"file\\\"\",\n \"\",\n \"# Wrapper-owned shared Codex home for codexes.\",\n \"# Add MCP and trust configuration here as needed.\",\n \"\",\n ].join(\"\\n\"),\n \"utf8\",\n );\n input.logger.info(\"runtime_init.config_created\", {\n targetPath,\n });\n\n return {\n copiedArtifacts: [],\n createdFiles: [targetPath],\n skippedArtifacts: [],\n };\n}\n\nasync function ensureSharedFileCopy(input: {\n artifactName: string;\n logger: Logger;\n sharedCodexHome: string;\n sourceCodexHome: string;\n}): Promise<SharedArtifactResult> {\n const targetPath = path.join(input.sharedCodexHome, input.artifactName);\n const sourcePath = path.join(input.sourceCodexHome, input.artifactName);\n\n if (await pathExists(targetPath)) {\n input.logger.debug(\"runtime_init.file_exists\", {\n artifactName: input.artifactName,\n targetPath,\n });\n return emptyArtifactResult();\n }\n\n if (!(await pathExists(sourcePath)) || samePath(sourcePath, targetPath)) {\n input.logger.debug(\"runtime_init.file_skip\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n reason: \"source_missing_or_same_path\",\n });\n return {\n copiedArtifacts: [],\n createdFiles: [],\n skippedArtifacts: [\n {\n path: input.artifactName,\n reason: \"source_missing_or_same_path\",\n },\n ],\n };\n }\n\n await copyFile(sourcePath, targetPath);\n input.logger.info(\"runtime_init.file_copied\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n });\n\n return {\n copiedArtifacts: [input.artifactName],\n createdFiles: [targetPath],\n skippedArtifacts: [],\n };\n}\n\nasync function ensureSharedDirectoryCopy(input: {\n artifactName: string;\n logger: Logger;\n sharedCodexHome: string;\n sourceCodexHome: string;\n}): Promise<SharedArtifactResult> {\n const targetPath = path.join(input.sharedCodexHome, input.artifactName);\n const sourcePath = path.join(input.sourceCodexHome, input.artifactName);\n\n if (await pathExists(targetPath)) {\n input.logger.debug(\"runtime_init.directory_artifact_exists\", {\n artifactName: input.artifactName,\n targetPath,\n });\n return emptyArtifactResult();\n }\n\n if (!(await pathExists(sourcePath)) || samePath(sourcePath, targetPath)) {\n input.logger.debug(\"runtime_init.directory_artifact_skip\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n reason: \"source_missing_or_same_path\",\n });\n return {\n copiedArtifacts: [],\n createdFiles: [],\n skippedArtifacts: [\n {\n path: input.artifactName,\n reason: \"source_missing_or_same_path\",\n },\n ],\n };\n }\n\n await cp(sourcePath, targetPath, { recursive: true });\n input.logger.info(\"runtime_init.directory_artifact_copied\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n });\n\n return {\n copiedArtifacts: [input.artifactName],\n createdFiles: [],\n skippedArtifacts: [],\n };\n}\n\nfunction detectCredentialStoreMode(rawConfig: string): string {\n const match = rawConfig.match(/^\\s*cli_auth_credentials_store\\s*=\\s*\"([^\"]+)\"/m);\n return match?.[1]?.trim().toLowerCase() ?? \"missing\";\n}\n\nfunction pinFileCredentialStore(rawConfig: string): string {\n if (/^\\s*cli_auth_credentials_store\\s*=\\s*\"file\"/m.test(rawConfig)) {\n return rawConfig;\n }\n\n if (/^\\s*cli_auth_credentials_store\\s*=\\s*\"[^\"]+\"/m.test(rawConfig)) {\n return rawConfig.replace(\n /^\\s*cli_auth_credentials_store\\s*=\\s*\"[^\"]+\"/m,\n 'cli_auth_credentials_store = \"file\"',\n );\n }\n\n const trimmed = rawConfig.trim();\n if (!trimmed) {\n return 'cli_auth_credentials_store = \"file\"\\n';\n }\n\n return ['cli_auth_credentials_store = \"file\"', \"\", trimmed, \"\"].join(\"\\n\");\n}\n\nfunction samePath(left: string, right: string): boolean {\n return path.resolve(left) === path.resolve(right);\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n\n throw error;\n }\n}\n\ninterface SharedArtifactResult {\n copiedArtifacts: string[];\n createdFiles: string[];\n skippedArtifacts: Array<{\n path: string;\n reason: string;\n }>;\n}\n\nfunction emptyArtifactResult(): SharedArtifactResult {\n return {\n copiedArtifacts: [],\n createdFiles: [],\n skippedArtifacts: [],\n };\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Logger } from \"../logging/logger.js\";\n\nconst REGISTRY_SCHEMA_VERSION = 1;\n\nexport interface AccountRecord {\n id: string;\n label: string;\n authDirectory: string;\n createdAt: string;\n updatedAt: string;\n lastUsedAt: string | null;\n}\n\nexport interface AccountRegistryDocument {\n schemaVersion: number;\n defaultAccountId: string | null;\n accounts: AccountRecord[];\n}\n\nexport interface AccountRegistry {\n addAccount(input: { label: string; authDirectory?: string }): Promise<AccountRecord>;\n getDefaultAccount(): Promise<AccountRecord | null>;\n listAccounts(): Promise<AccountRecord[]>;\n removeAccount(accountId: string): Promise<AccountRecord>;\n selectAccount(accountId: string): Promise<AccountRecord>;\n}\n\nexport function createAccountRegistry(input: {\n accountRoot: string;\n logger: Logger;\n registryFile: string;\n}): AccountRegistry {\n return {\n addAccount(details) {\n return withRegistryMutation(input, \"registry.add\", async (document, now) => {\n const normalizedLabel = normalizeLabel(details.label);\n const duplicate = document.accounts.find(\n (account) => account.label.toLowerCase() === normalizedLabel.toLowerCase(),\n );\n\n if (duplicate) {\n input.logger.warn(\"registry.duplicate_label\", {\n label: normalizedLabel,\n existingAccountId: duplicate.id,\n });\n throw new Error(`An account named \"${normalizedLabel}\" already exists.`);\n }\n\n const accountId = randomUUID();\n const record: AccountRecord = {\n id: accountId,\n label: normalizedLabel,\n authDirectory: details.authDirectory ?? path.join(input.accountRoot, accountId),\n createdAt: now,\n updatedAt: now,\n lastUsedAt: null,\n };\n\n document.accounts.push(record);\n if (!document.defaultAccountId) {\n document.defaultAccountId = record.id;\n }\n\n input.logger.info(\"registry.account_added\", {\n accountId: record.id,\n label: record.label,\n authDirectory: record.authDirectory,\n defaultAccountId: document.defaultAccountId,\n });\n\n return record;\n });\n },\n async getDefaultAccount() {\n const document = await readRegistryDocument(input);\n const account = document.defaultAccountId\n ? document.accounts.find((entry) => entry.id === document.defaultAccountId) ?? null\n : null;\n\n input.logger.debug(\"registry.default_loaded\", {\n defaultAccountId: document.defaultAccountId,\n resolvedAccountId: account?.id ?? null,\n });\n\n return account;\n },\n async listAccounts() {\n const document = await readRegistryDocument(input);\n\n input.logger.debug(\"registry.list_loaded\", {\n accountCount: document.accounts.length,\n defaultAccountId: document.defaultAccountId,\n });\n\n return [...document.accounts];\n },\n removeAccount(accountId) {\n return withRegistryMutation(input, \"registry.remove\", async (document, now) => {\n const record = document.accounts.find((account) => account.id === accountId);\n\n if (!record) {\n input.logger.warn(\"registry.remove_missing\", { accountId });\n throw new Error(`Account \"${accountId}\" was not found.`);\n }\n\n document.accounts = document.accounts.filter((account) => account.id !== accountId);\n if (document.defaultAccountId === accountId) {\n document.defaultAccountId = document.accounts[0]?.id ?? null;\n }\n\n record.updatedAt = now;\n\n input.logger.info(\"registry.account_removed\", {\n accountId,\n nextDefaultAccountId: document.defaultAccountId,\n });\n\n return record;\n });\n },\n selectAccount(accountId) {\n return withRegistryMutation(input, \"registry.select\", async (document, now) => {\n const record = document.accounts.find((account) => account.id === accountId);\n\n if (!record) {\n input.logger.warn(\"registry.select_missing\", { accountId });\n throw new Error(`Account \"${accountId}\" was not found.`);\n }\n\n document.defaultAccountId = record.id;\n record.updatedAt = now;\n record.lastUsedAt = now;\n\n input.logger.info(\"registry.account_selected\", {\n accountId,\n label: record.label,\n });\n\n return record;\n });\n },\n };\n}\n\nasync function withRegistryMutation<T>(\n input: {\n accountRoot: string;\n logger: Logger;\n registryFile: string;\n },\n operation: string,\n mutate: (document: AccountRegistryDocument, now: string) => Promise<T> | T,\n): Promise<T> {\n await mkdir(input.accountRoot, { recursive: true });\n await mkdir(path.dirname(input.registryFile), { recursive: true });\n\n const document = await readRegistryDocument(input);\n const now = new Date().toISOString();\n\n input.logger.debug(`${operation}.start`, {\n registryFile: input.registryFile,\n accountRoot: input.accountRoot,\n accountCount: document.accounts.length,\n });\n\n const result = await mutate(document, now);\n\n await persistRegistryDocument(input, document);\n\n input.logger.debug(`${operation}.complete`, {\n registryFile: input.registryFile,\n accountCount: document.accounts.length,\n defaultAccountId: document.defaultAccountId,\n });\n\n return result;\n}\n\nasync function readRegistryDocument(input: {\n accountRoot: string;\n logger: Logger;\n registryFile: string;\n}): Promise<AccountRegistryDocument> {\n await mkdir(input.accountRoot, { recursive: true });\n await mkdir(path.dirname(input.registryFile), { recursive: true });\n\n try {\n const raw = await readFile(input.registryFile, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const migrated = migrateRegistryDocument(parsed, input.logger, input.registryFile);\n\n input.logger.debug(\"registry.read_success\", {\n registryFile: input.registryFile,\n schemaVersion: migrated.schemaVersion,\n accountCount: migrated.accounts.length,\n });\n\n return migrated;\n } catch (error) {\n if (isFileMissing(error)) {\n const emptyDocument = createEmptyRegistryDocument();\n input.logger.info(\"registry.read_missing\", {\n registryFile: input.registryFile,\n action: \"create_empty_registry\",\n });\n await persistRegistryDocument(input, emptyDocument);\n return emptyDocument;\n }\n\n const normalized = normalizeUnknownError(error);\n const corruptionBackupPath = `${input.registryFile}.corrupt-${Date.now()}`;\n\n input.logger.warn(\"registry.read_corrupt\", {\n registryFile: input.registryFile,\n corruptionBackupPath,\n message: normalized.message,\n });\n\n await rename(input.registryFile, corruptionBackupPath).catch(() => undefined);\n\n const emptyDocument = createEmptyRegistryDocument();\n await persistRegistryDocument(input, emptyDocument);\n\n return emptyDocument;\n }\n}\n\nasync function persistRegistryDocument(\n input: {\n logger: Logger;\n registryFile: string;\n },\n document: AccountRegistryDocument,\n): Promise<void> {\n const tempFile = `${input.registryFile}.tmp`;\n const serialized = JSON.stringify(document, null, 2);\n\n await writeFile(tempFile, serialized, \"utf8\");\n await rename(tempFile, input.registryFile);\n\n input.logger.debug(\"registry.write_success\", {\n registryFile: input.registryFile,\n bytes: Buffer.byteLength(serialized, \"utf8\"),\n schemaVersion: document.schemaVersion,\n defaultAccountId: document.defaultAccountId,\n });\n}\n\nfunction migrateRegistryDocument(\n value: unknown,\n logger: Logger,\n registryFile: string,\n): AccountRegistryDocument {\n if (!isObject(value)) {\n throw new Error(\"Registry document is not a JSON object.\");\n }\n\n const schemaVersion = typeof value.schemaVersion === \"number\" ? value.schemaVersion : 0;\n\n logger.debug(\"registry.migration_check\", {\n registryFile,\n schemaVersion,\n targetSchemaVersion: REGISTRY_SCHEMA_VERSION,\n });\n\n if (schemaVersion > REGISTRY_SCHEMA_VERSION) {\n throw new Error(\n `Registry schema ${schemaVersion} is newer than supported schema ${REGISTRY_SCHEMA_VERSION}.`,\n );\n }\n\n if (schemaVersion === REGISTRY_SCHEMA_VERSION) {\n return normalizeRegistryDocument(value);\n }\n\n if (schemaVersion === 0) {\n const migrated = normalizeRegistryDocument({\n schemaVersion: REGISTRY_SCHEMA_VERSION,\n defaultAccountId: value.defaultAccountId ?? null,\n accounts: value.accounts ?? [],\n });\n\n logger.info(\"registry.migration_applied\", {\n registryFile,\n fromSchemaVersion: 0,\n toSchemaVersion: REGISTRY_SCHEMA_VERSION,\n });\n\n return migrated;\n }\n\n throw new Error(`Unsupported registry schema version ${schemaVersion}.`);\n}\n\nfunction normalizeRegistryDocument(value: Record<string, unknown>): AccountRegistryDocument {\n const accounts = Array.isArray(value.accounts)\n ? value.accounts.map(normalizeAccountRecord)\n : [];\n const defaultAccountId = typeof value.defaultAccountId === \"string\"\n ? value.defaultAccountId\n : null;\n\n return {\n schemaVersion: REGISTRY_SCHEMA_VERSION,\n defaultAccountId:\n defaultAccountId && accounts.some((account) => account.id === defaultAccountId)\n ? defaultAccountId\n : accounts[0]?.id ?? null,\n accounts,\n };\n}\n\nfunction normalizeAccountRecord(value: unknown): AccountRecord {\n if (!isObject(value)) {\n throw new Error(\"Account record is not an object.\");\n }\n\n const id = typeof value.id === \"string\" ? value.id : randomUUID();\n const createdAt = typeof value.createdAt === \"string\" ? value.createdAt : new Date(0).toISOString();\n const updatedAt = typeof value.updatedAt === \"string\" ? value.updatedAt : createdAt;\n\n return {\n id,\n label: normalizeLabel(typeof value.label === \"string\" ? value.label : id),\n authDirectory:\n typeof value.authDirectory === \"string\" ? value.authDirectory : path.join(\"accounts\", id),\n createdAt,\n updatedAt,\n lastUsedAt: typeof value.lastUsedAt === \"string\" ? value.lastUsedAt : null,\n };\n}\n\nfunction createEmptyRegistryDocument(): AccountRegistryDocument {\n return {\n schemaVersion: REGISTRY_SCHEMA_VERSION,\n defaultAccountId: null,\n accounts: [],\n };\n}\n\nfunction normalizeLabel(label: string): string {\n const normalized = label.trim();\n\n if (!normalized) {\n throw new Error(\"Account label cannot be empty.\");\n }\n\n return normalized;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isFileMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nfunction normalizeUnknownError(error: unknown): { message: string } {\n if (error instanceof Error) {\n return { message: error.message };\n }\n\n return { message: String(error) };\n}\n\nexport async function deleteRegistryFile(registryFile: string): Promise<void> {\n const fileStats = await stat(registryFile).catch(() => null);\n\n if (!fileStats) {\n return;\n }\n\n await rm(registryFile, { force: true });\n}\n", "import { createLogSink, createLogger, resolveLogLevel } from \"../logging/logger.js\";\nimport { resolveWrapperConfig } from \"../config/wrapper-config.js\";\nimport { resolvePaths } from \"./paths.js\";\nimport { findCodexBinary } from \"../process/find-codex-binary.js\";\nimport { initializeRuntimeEnvironment } from \"../runtime/init/initialize-runtime.js\";\n\nexport interface AppContext {\n argv: string[];\n executablePath: string;\n environment: {\n cwd: string;\n platform: NodeJS.Platform;\n runtime: string;\n };\n io: {\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n };\n output: {\n stdoutIsTTY: boolean;\n };\n logging: {\n level: string;\n sink: ReturnType<typeof createLogSink>;\n };\n paths: ReturnType<typeof resolvePaths>;\n runtimeInitialization: Awaited<ReturnType<typeof initializeRuntimeEnvironment>>;\n wrapperConfig: Awaited<ReturnType<typeof resolveWrapperConfig>>;\n codexBinary: Awaited<ReturnType<typeof findCodexBinary>>;\n}\n\nexport async function buildAppContext(\n argv: string[],\n io: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n executablePath: string;\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n },\n): Promise<AppContext> {\n const logLevel = resolveLogLevel(io.env.LOG_LEVEL);\n const sink = createLogSink(io.stderr);\n const paths = resolvePaths(io.cwd, io.env);\n const runtimeInitialization = await initializeRuntimeEnvironment({\n env: io.env,\n logger: createLogger({\n level: logLevel,\n name: \"runtime\",\n sink,\n }),\n paths,\n });\n const wrapperConfig = await resolveWrapperConfig({\n env: io.env,\n logger: createLogger({\n level: logLevel,\n name: \"config\",\n sink,\n }),\n paths,\n });\n const codexBinary = await findCodexBinary({\n env: io.env,\n logger: createLogger({\n level: logLevel,\n name: \"process\",\n sink,\n }),\n wrapperExecutablePath: io.executablePath,\n });\n\n createLogger({\n level: logLevel,\n name: \"context\",\n sink,\n }).debug(\"initialized\", {\n argv,\n cwd: io.cwd,\n logLevel,\n paths,\n runtimeInitialization,\n wrapperConfig,\n codexBinary,\n });\n\n return {\n argv,\n executablePath: io.executablePath,\n environment: {\n cwd: io.cwd,\n platform: process.platform,\n runtime: process.version,\n },\n io: {\n stdout: io.stdout,\n stderr: io.stderr,\n },\n output: {\n stdoutIsTTY: io.stdout.isTTY === true,\n },\n logging: {\n level: logLevel,\n sink,\n },\n paths,\n runtimeInitialization,\n wrapperConfig,\n codexBinary,\n };\n}\n", "import path from \"node:path\";\nimport type { CredentialStoreMode } from \"../config/wrapper-config.js\";\nimport type { Logger } from \"../logging/logger.js\";\n\nexport type RuntimeFileClass =\n | \"shared\"\n | \"account\"\n | \"ephemeral\"\n | \"protected\";\n\nexport interface RuntimeFileRule {\n pathPattern: string;\n classification: RuntimeFileClass;\n syncBack: \"never\" | \"if-changed\" | \"account-to-runtime-only\";\n reason: string;\n}\n\nexport interface RuntimeContract {\n credentialStoreMode: CredentialStoreMode;\n sharedCodexHome: string;\n runtimeRoot: string;\n perAccountRoot: string;\n supported: boolean;\n fileRules: RuntimeFileRule[];\n syncBackStrategy: {\n whenChildProcessSucceeds: string;\n whenChildProcessFails: string;\n compareStrategy: string;\n };\n}\n\nexport function createRuntimeContract(input: {\n accountRoot: string;\n credentialStoreMode: CredentialStoreMode;\n logger: Logger;\n runtimeRoot: string;\n sharedCodexHome: string;\n}): RuntimeContract {\n const contract: RuntimeContract = {\n credentialStoreMode: input.credentialStoreMode,\n sharedCodexHome: input.sharedCodexHome,\n runtimeRoot: input.runtimeRoot,\n perAccountRoot: input.accountRoot,\n supported: input.credentialStoreMode === \"file\",\n fileRules: [\n createRule(\"config.toml\", \"shared\", \"never\", \"Shared CLI behavior and MCP config should remain common.\"),\n createRule(\"mcp.json\", \"shared\", \"never\", \"MCP topology is shared across accounts.\"),\n createRule(\"trust/**\", \"shared\", \"never\", \"Trust metadata should not be overwritten per account.\"),\n createRule(\n \"auth.json\",\n \"account\",\n \"if-changed\",\n \"Windows probe evidence shows auth.json is sufficient for `codex login status`, so it belongs to the active account profile.\",\n ),\n createRule(\n \"sessions/**\",\n \"account\",\n \"if-changed\",\n \"Session refresh artifacts are still treated as account-scoped until a real token-refresh probe proves otherwise.\",\n ),\n createRule(\"cache/**\", \"ephemeral\", \"never\", \"Transient caches should be recreated instead of copied.\"),\n createRule(\"logs/**\", \"ephemeral\", \"never\", \"Runtime logs are diagnostic and should not sync back.\"),\n createRule(\"history.jsonl\", \"ephemeral\", \"never\", \"Conversation history should stay local to each runtime session.\"),\n createRule(\"models_cache.json\", \"ephemeral\", \"never\", \"Model cache data can be rebuilt and should not drive account switching.\"),\n createRule(\"tmp/**\", \"ephemeral\", \"never\", \"Temporary files should be discarded after each run.\"),\n createRule(\n \"state_*.sqlite*\",\n \"protected\",\n \"never\",\n \"Observed SQLite runtime state exists in the live Codex home and remains unproven for cross-account merge or sync-back.\",\n ),\n createRule(\n \"logs_*.sqlite*\",\n \"protected\",\n \"never\",\n \"SQLite-backed log databases should stay isolated until a dedicated write-heavy probe proves they are safe to discard or share.\",\n ),\n createRule(\"keyring/**\", \"protected\", \"never\", \"External credential stores are explicitly unsupported for MVP.\"),\n ],\n syncBackStrategy: {\n whenChildProcessSucceeds:\n \"Compare allowed account-classified files and sync only changed files back to the owning account profile.\",\n whenChildProcessFails:\n \"Restore pre-launch runtime state and avoid syncing ambiguous mutations unless the failure is known-safe.\",\n compareStrategy:\n \"Use file existence, modified time, and content hash checks before any sync-back write.\",\n },\n };\n\n input.logger.info(\"runtime.contract_created\", {\n sharedCodexHome: contract.sharedCodexHome,\n runtimeRoot: contract.runtimeRoot,\n perAccountRoot: contract.perAccountRoot,\n credentialStoreMode: contract.credentialStoreMode,\n supported: contract.supported,\n });\n\n input.logger.debug(\"runtime.file_rules\", {\n fileRules: contract.fileRules,\n syncBackStrategy: contract.syncBackStrategy,\n });\n\n return contract;\n}\n\nexport function resolveAccountRuntimePaths(contract: RuntimeContract, accountId: string) {\n const accountDirectory = path.join(contract.perAccountRoot, accountId);\n\n return {\n accountDirectory,\n accountStateDirectory: path.join(accountDirectory, \"state\"),\n accountMetadataFile: path.join(accountDirectory, \"account.json\"),\n runtimeBackupDirectory: path.join(contract.runtimeRoot, \"backups\", accountId),\n runtimeTempDirectory: path.join(contract.runtimeRoot, \"tmp\", accountId),\n };\n}\n\nexport function summarizeRuntimeContract(contract: RuntimeContract) {\n return {\n supported: contract.supported,\n credentialStoreMode: contract.credentialStoreMode,\n sharedCodexHome: contract.sharedCodexHome,\n runtimeRoot: contract.runtimeRoot,\n perAccountRoot: contract.perAccountRoot,\n classifications: contract.fileRules.reduce<Record<RuntimeFileClass, number>>(\n (accumulator, rule) => {\n accumulator[rule.classification] += 1;\n return accumulator;\n },\n {\n shared: 0,\n account: 0,\n ephemeral: 0,\n protected: 0,\n },\n ),\n };\n}\n\nfunction createRule(\n pathPattern: string,\n classification: RuntimeFileClass,\n syncBack: RuntimeFileRule[\"syncBack\"],\n reason: string,\n): RuntimeFileRule {\n return {\n pathPattern,\n classification,\n syncBack,\n reason,\n };\n}\n", "import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport {\n createRuntimeContract,\n resolveAccountRuntimePaths,\n} from \"../../runtime/runtime-contract.js\";\nimport {\n copyAccountScopedAuthArtifacts,\n prepareLoginWorkspace,\n type LoginWorkspace,\n} from \"../../runtime/login-workspace.js\";\nimport {\n runInteractiveCodexLogin,\n type CodexLoginResult,\n} from \"../../process/run-codex-login.js\";\n\nconst DEFAULT_LOGIN_TIMEOUT_MS = 10 * 60 * 1000;\nconst ACCOUNT_METADATA_SCHEMA_VERSION = 1;\n\ninterface ParsedAccountAddArgs {\n label: string;\n timeoutMs: number;\n}\n\ninterface AccountAuthMetadata {\n schemaVersion: number;\n accountId: string;\n label: string;\n capturedAt: string;\n authMode: string | null;\n authAccountId: string | null;\n lastRefresh: string | null;\n loginStatus: \"succeeded\";\n}\n\nexport async function runAccountAddCommand(\n context: AppContext,\n argv: string[],\n): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"account_add\",\n sink: context.logging.sink,\n });\n if (argv.includes(\"--help\")) {\n context.io.stdout.write(`${buildAccountAddHelpText()}\\n`);\n logger.info(\"help.rendered\");\n return 0;\n }\n const parsed = parseAccountAddArgs(argv);\n\n logger.info(\"command.start\", {\n requestedLabel: parsed.label,\n timeoutMs: parsed.timeoutMs,\n codexBinaryPath: context.codexBinary.path,\n sharedCodexHome: context.paths.sharedCodexHome,\n accountRoot: context.paths.accountRoot,\n runtimeRoot: context.paths.runtimeRoot,\n });\n\n if (!context.codexBinary.path) {\n logger.error(\"command.binary_missing\", {\n candidates: context.codexBinary.candidates,\n rejectedCandidates: context.codexBinary.rejectedCandidates,\n });\n throw new Error(\"Could not find the real `codex` binary on PATH.\");\n }\n\n if (context.wrapperConfig.credentialStoreMode !== \"file\") {\n logger.error(\"command.unsupported_credential_store\", {\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n configFilePath: context.wrapperConfig.codexConfigFilePath,\n reason: context.wrapperConfig.credentialStorePolicyReason,\n });\n throw new Error(\n `codexes account add requires cli_auth_credentials_store = \"file\"; detected ${context.wrapperConfig.credentialStoreMode}.`,\n );\n }\n\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n const existingAccounts = await registry.listAccounts();\n const duplicate = existingAccounts.find(\n (account) => account.label.toLowerCase() === parsed.label.toLowerCase(),\n );\n\n if (duplicate) {\n logger.warn(\"command.duplicate_label\", {\n requestedLabel: parsed.label,\n existingAccountId: duplicate.id,\n });\n throw new Error(`An account named \"${parsed.label}\" already exists.`);\n }\n\n const runtimeContract = createRuntimeContract({\n accountRoot: context.paths.accountRoot,\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n logger,\n runtimeRoot: context.paths.runtimeRoot,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n const workspace = await prepareLoginWorkspace({\n logger,\n runtimeRoot: context.paths.runtimeRoot,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n\n let loginResult: CodexLoginResult | null = null;\n\n try {\n loginResult = await runInteractiveCodexLogin({\n codexBinaryPath: context.codexBinary.path,\n codexHome: workspace.codexHome,\n logger,\n timeoutMs: parsed.timeoutMs,\n });\n\n if (loginResult.exitCode !== 0) {\n logger.warn(\"command.login_failed\", {\n exitCode: loginResult.exitCode,\n signal: loginResult.signal,\n timedOut: loginResult.timedOut,\n timeoutMs: loginResult.timeoutMs,\n cancelledBySignal: loginResult.cancelledBySignal,\n });\n context.io.stderr.write(buildLoginFailureMessage(loginResult));\n return loginResult.exitCode ?? 1;\n }\n\n const authSummary = await readAuthSummary(workspace.codexHome, logger);\n if (!authSummary.present) {\n logger.error(\"command.auth_missing_after_login\", {\n codexHome: workspace.codexHome,\n });\n throw new Error(\n \"codex login completed without creating auth.json in the isolated workspace.\",\n );\n }\n\n const account = await registry.addAccount({ label: parsed.label });\n\n try {\n const runtimePaths = resolveAccountRuntimePaths(runtimeContract, account.id);\n await mkdir(runtimePaths.accountDirectory, { recursive: true });\n await copyAccountScopedAuthArtifacts({\n accountId: account.id,\n destinationRoot: runtimePaths.accountStateDirectory,\n logger,\n runtimeContract,\n sourceCodexHome: workspace.codexHome,\n });\n await writeAccountMetadata({\n capturedAt: new Date().toISOString(),\n destinationFile: runtimePaths.accountMetadataFile,\n label: account.label,\n logger,\n recordId: account.id,\n summary: authSummary,\n });\n\n logger.info(\"command.complete\", {\n accountId: account.id,\n label: account.label,\n authDirectory: account.authDirectory,\n authAccountId: authSummary.accountId,\n });\n\n context.io.stdout.write(\n [\n `Added account \"${account.label}\"`,\n ` id: ${account.id}`,\n ` auth state: ${runtimePaths.accountStateDirectory}`,\n authSummary.accountId ? ` auth account id: ${authSummary.accountId}` : null,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\") + \"\\n\",\n );\n\n return 0;\n } catch (error) {\n logger.error(\"command.persist_failed\", {\n message: error instanceof Error ? error.message : String(error),\n accountLabel: parsed.label,\n });\n await cleanupFailedAccountRecord(registry, logger, parsed.label);\n throw error;\n }\n } finally {\n await cleanupWorkspace(workspace, logger, loginResult);\n }\n}\n\nfunction parseAccountAddArgs(argv: string[]): ParsedAccountAddArgs {\n let label: string | null = null;\n let timeoutMs = DEFAULT_LOGIN_TIMEOUT_MS;\n\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token) {\n continue;\n }\n\n if (token === \"--timeout-ms\") {\n const next = argv[index + 1];\n if (!next) {\n throw new Error(\"Expected a number after --timeout-ms.\");\n }\n const parsedTimeout = Number.parseInt(next, 10);\n if (!Number.isFinite(parsedTimeout) || parsedTimeout <= 0) {\n throw new Error(`Invalid timeout: ${next}`);\n }\n timeoutMs = parsedTimeout;\n index += 1;\n continue;\n }\n\n if (token.startsWith(\"--timeout-ms=\")) {\n const raw = token.slice(\"--timeout-ms=\".length);\n const parsedTimeout = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsedTimeout) || parsedTimeout <= 0) {\n throw new Error(`Invalid timeout: ${raw}`);\n }\n timeoutMs = parsedTimeout;\n continue;\n }\n\n if (token.startsWith(\"--\")) {\n throw new Error(`Unknown option for account add: ${token}`);\n }\n\n if (label) {\n throw new Error(`Unexpected argument for account add: ${token}`);\n }\n\n label = token.trim();\n }\n\n if (!label) {\n throw new Error(buildAccountAddHelpText());\n }\n\n return { label, timeoutMs };\n}\n\nfunction buildAccountAddHelpText(): string {\n return [\n \"Usage:\",\n \" codexes account add <label> [--timeout-ms <milliseconds>]\",\n \"\",\n \"Examples:\",\n \" codexes account add work\",\n \" codexes account add personal --timeout-ms 900000\",\n ].join(\"\\n\");\n}\n\nasync function readAuthSummary(\n codexHome: string,\n logger: ReturnType<typeof createLogger>,\n): Promise<{\n present: boolean;\n authMode: string | null;\n accountId: string | null;\n lastRefresh: string | null;\n}> {\n const authFile = path.join(codexHome, \"auth.json\");\n\n try {\n const raw = await readFile(authFile, \"utf8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const tokens =\n typeof parsed.tokens === \"object\" && parsed.tokens !== null\n ? (parsed.tokens as Record<string, unknown>)\n : null;\n\n const summary = {\n present: true,\n authMode: typeof parsed.auth_mode === \"string\" ? parsed.auth_mode : null,\n accountId: typeof tokens?.account_id === \"string\" ? tokens.account_id : null,\n lastRefresh: typeof parsed.last_refresh === \"string\" ? parsed.last_refresh : null,\n };\n\n logger.debug(\"auth_summary.loaded\", {\n authFile,\n authMode: summary.authMode,\n accountId: summary.accountId,\n lastRefresh: summary.lastRefresh,\n });\n\n return summary;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n logger.warn(\"auth_summary.missing\", { authFile });\n return {\n present: false,\n authMode: null,\n accountId: null,\n lastRefresh: null,\n };\n }\n\n logger.error(\"auth_summary.failed\", {\n authFile,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n\nasync function writeAccountMetadata(input: {\n capturedAt: string;\n destinationFile: string;\n label: string;\n logger: ReturnType<typeof createLogger>;\n recordId: string;\n summary: {\n authMode: string | null;\n accountId: string | null;\n lastRefresh: string | null;\n };\n}): Promise<void> {\n const metadata: AccountAuthMetadata = {\n schemaVersion: ACCOUNT_METADATA_SCHEMA_VERSION,\n accountId: input.recordId,\n label: input.label,\n capturedAt: input.capturedAt,\n authMode: input.summary.authMode,\n authAccountId: input.summary.accountId,\n lastRefresh: input.summary.lastRefresh,\n loginStatus: \"succeeded\",\n };\n\n await writeFile(input.destinationFile, JSON.stringify(metadata, null, 2), \"utf8\");\n\n input.logger.info(\"account_metadata.written\", {\n destinationFile: input.destinationFile,\n accountId: metadata.accountId,\n authAccountId: metadata.authAccountId,\n });\n}\n\nasync function cleanupFailedAccountRecord(\n registry: ReturnType<typeof createAccountRegistry>,\n logger: ReturnType<typeof createLogger>,\n label: string,\n): Promise<void> {\n const accounts = await registry.listAccounts();\n const account = [...accounts]\n .reverse()\n .find((entry) => entry.label.toLowerCase() === label.toLowerCase());\n\n if (!account) {\n return;\n }\n\n await registry.removeAccount(account.id).catch(() => undefined);\n await rm(account.authDirectory, { force: true, recursive: true }).catch(() => undefined);\n\n logger.warn(\"command.rollback_account_record\", {\n accountId: account.id,\n label: account.label,\n });\n}\n\nasync function cleanupWorkspace(\n workspace: LoginWorkspace,\n logger: ReturnType<typeof createLogger>,\n loginResult: CodexLoginResult | null,\n): Promise<void> {\n logger.debug(\"workspace.cleanup.start\", {\n workspaceRoot: workspace.workspaceRoot,\n codexHome: workspace.codexHome,\n loginExitCode: loginResult?.exitCode ?? null,\n });\n\n await rm(workspace.workspaceRoot, {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n\n logger.debug(\"workspace.cleanup.complete\", {\n workspaceRoot: workspace.workspaceRoot,\n });\n}\n\nfunction buildLoginFailureMessage(loginResult: CodexLoginResult): string {\n if (loginResult.timedOut) {\n return `codexes: account login timed out after ${loginResult.timeoutMs}ms.\\n`;\n }\n\n if (loginResult.cancelledBySignal) {\n return \"codexes: account login was cancelled.\\n\";\n }\n\n return `codexes: account login failed with exit code ${loginResult.exitCode ?? \"unknown\"}.\\n`;\n}\n", "import { copyFile, cp, mkdir, mkdtemp, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Logger } from \"../logging/logger.js\";\nimport type { RuntimeContract, RuntimeFileRule } from \"./runtime-contract.js\";\n\nexport interface LoginWorkspace {\n workspaceRoot: string;\n codexHome: string;\n}\n\nexport async function prepareLoginWorkspace(input: {\n logger: Logger;\n runtimeRoot: string;\n sharedCodexHome: string;\n}): Promise<LoginWorkspace> {\n const workspaceParent = path.join(input.runtimeRoot, \"tmp\");\n await mkdir(workspaceParent, { recursive: true });\n const workspaceRoot = await mkdtemp(path.join(workspaceParent, \"account-add-\"));\n const codexHome = path.join(workspaceRoot, \"codex-home\");\n\n await mkdir(codexHome, { recursive: true });\n input.logger.info(\"login_workspace.created\", {\n workspaceRoot,\n codexHome,\n sharedCodexHome: input.sharedCodexHome,\n });\n\n await ensurePinnedFileConfig({\n codexHome,\n logger: input.logger,\n sharedCodexHome: input.sharedCodexHome,\n });\n await copySharedArtifactIfPresent({\n artifactName: \"mcp.json\",\n codexHome,\n logger: input.logger,\n sharedCodexHome: input.sharedCodexHome,\n });\n await copySharedDirectoryIfPresent({\n artifactName: \"trust\",\n codexHome,\n logger: input.logger,\n sharedCodexHome: input.sharedCodexHome,\n });\n await mkdir(path.join(codexHome, \"sessions\"), { recursive: true });\n\n return { workspaceRoot, codexHome };\n}\n\nexport async function copyAccountScopedAuthArtifacts(input: {\n accountId: string;\n destinationRoot: string;\n logger: Logger;\n runtimeContract: RuntimeContract;\n sourceCodexHome: string;\n}): Promise<void> {\n const accountRules = input.runtimeContract.fileRules.filter(\n (rule) => rule.classification === \"account\",\n );\n\n input.logger.info(\"login_workspace.copy_account_artifacts.start\", {\n accountId: input.accountId,\n destinationRoot: input.destinationRoot,\n sourceCodexHome: input.sourceCodexHome,\n allowedPatterns: accountRules.map((rule) => rule.pathPattern),\n });\n\n await mkdir(input.destinationRoot, { recursive: true });\n\n for (const rule of accountRules) {\n await copyRuleArtifacts({\n destinationRoot: input.destinationRoot,\n logger: input.logger,\n rule,\n sourceCodexHome: input.sourceCodexHome,\n });\n }\n\n input.logger.info(\"login_workspace.copy_account_artifacts.complete\", {\n accountId: input.accountId,\n destinationRoot: input.destinationRoot,\n });\n}\n\nasync function ensurePinnedFileConfig(input: {\n codexHome: string;\n logger: Logger;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourceConfigPath = path.join(input.sharedCodexHome, \"config.toml\");\n const targetConfigPath = path.join(input.codexHome, \"config.toml\");\n const configContents = await readFile(sourceConfigPath, \"utf8\").catch(() => \"\");\n const pinnedConfig = pinFileCredentialStore(configContents);\n\n await writeFile(targetConfigPath, pinnedConfig, \"utf8\");\n input.logger.info(\"login_workspace.config_prepared\", {\n sourceConfigPath,\n targetConfigPath,\n credentialStoreMode: \"file\",\n });\n}\n\nasync function copySharedArtifactIfPresent(input: {\n artifactName: string;\n codexHome: string;\n logger: Logger;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.sharedCodexHome, input.artifactName);\n const targetPath = path.join(input.codexHome, input.artifactName);\n\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"login_workspace.shared_file_skipped\", {\n artifactName: input.artifactName,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n await copyFile(sourcePath, targetPath);\n input.logger.debug(\"login_workspace.shared_file_copied\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n });\n}\n\nasync function copySharedDirectoryIfPresent(input: {\n artifactName: string;\n codexHome: string;\n logger: Logger;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.sharedCodexHome, input.artifactName);\n const targetPath = path.join(input.codexHome, input.artifactName);\n\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"login_workspace.shared_directory_skipped\", {\n artifactName: input.artifactName,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n await cp(sourcePath, targetPath, { recursive: true });\n input.logger.debug(\"login_workspace.shared_directory_copied\", {\n artifactName: input.artifactName,\n sourcePath,\n targetPath,\n });\n}\n\nasync function copyRuleArtifacts(input: {\n destinationRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sourceCodexHome: string;\n}): Promise<void> {\n if (input.rule.pathPattern.endsWith(\"/**\")) {\n const relativeDirectory = input.rule.pathPattern.slice(0, -3);\n const sourceDirectory = path.join(input.sourceCodexHome, relativeDirectory);\n const targetDirectory = path.join(input.destinationRoot, relativeDirectory);\n\n if (!(await pathExists(sourceDirectory))) {\n input.logger.debug(\"login_workspace.account_directory_skipped\", {\n pathPattern: input.rule.pathPattern,\n sourceDirectory,\n reason: \"missing\",\n });\n return;\n }\n\n await cp(sourceDirectory, targetDirectory, { recursive: true });\n input.logger.debug(\"login_workspace.account_directory_copied\", {\n pathPattern: input.rule.pathPattern,\n sourceDirectory,\n targetDirectory,\n });\n return;\n }\n\n const sourceFile = path.join(input.sourceCodexHome, input.rule.pathPattern);\n const targetFile = path.join(input.destinationRoot, input.rule.pathPattern);\n\n if (!(await pathExists(sourceFile))) {\n input.logger.debug(\"login_workspace.account_file_skipped\", {\n pathPattern: input.rule.pathPattern,\n sourceFile,\n reason: \"missing\",\n });\n return;\n }\n\n await mkdir(path.dirname(targetFile), { recursive: true });\n await copyFile(sourceFile, targetFile);\n input.logger.debug(\"login_workspace.account_file_copied\", {\n pathPattern: input.rule.pathPattern,\n sourceFile,\n targetFile,\n });\n}\n\nfunction pinFileCredentialStore(rawConfig: string): string {\n if (/^\\s*cli_auth_credentials_store\\s*=\\s*\"file\"/m.test(rawConfig)) {\n return rawConfig;\n }\n\n if (/^\\s*cli_auth_credentials_store\\s*=\\s*\"[^\"]+\"/m.test(rawConfig)) {\n return rawConfig.replace(\n /^\\s*cli_auth_credentials_store\\s*=\\s*\"[^\"]+\"/m,\n 'cli_auth_credentials_store = \"file\"',\n );\n }\n\n const trimmed = rawConfig.trim();\n if (!trimmed) {\n return 'cli_auth_credentials_store = \"file\"\\n';\n }\n\n return ['cli_auth_credentials_store = \"file\"', \"\", trimmed, \"\"].join(\"\\n\");\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n\n throw error;\n }\n}\n", "import { spawn } from \"node:child_process\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { resolveCodexLaunchSpec } from \"./codex-launch-spec.js\";\n\nexport interface CodexLoginResult {\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n timedOut: boolean;\n timeoutMs: number;\n cancelledBySignal: boolean;\n}\n\nexport async function runInteractiveCodexLogin(input: {\n codexBinaryPath: string;\n codexHome: string;\n logger: Logger;\n timeoutMs: number;\n}): Promise<CodexLoginResult> {\n const launchSpec = await resolveCodexLaunchSpec(input.codexBinaryPath, [\"login\"]);\n\n input.logger.info(\"login.spawn.start\", {\n codexBinaryPath: input.codexBinaryPath,\n resolvedCommand: launchSpec.command,\n codexHome: input.codexHome,\n argv: launchSpec.args,\n timeoutMs: input.timeoutMs,\n });\n\n return new Promise((resolve, reject) => {\n const child = spawn(launchSpec.command, launchSpec.args, {\n env: {\n ...process.env,\n CODEX_HOME: input.codexHome,\n },\n shell: false,\n stdio: \"inherit\",\n windowsHide: false,\n });\n let timedOut = false;\n let cancelledBySignal = false;\n let settled = false;\n\n const timeoutHandle = setTimeout(() => {\n timedOut = true;\n input.logger.warn(\"login.spawn.timeout\", {\n codexBinaryPath: input.codexBinaryPath,\n codexHome: input.codexHome,\n timeoutMs: input.timeoutMs,\n });\n terminateChild(child);\n }, input.timeoutMs);\n\n const forwardSignal = (signal: NodeJS.Signals) => {\n cancelledBySignal = true;\n input.logger.warn(\"login.spawn.parent_signal\", {\n signal,\n pid: child.pid ?? null,\n });\n child.kill(signal);\n };\n\n const signalHandlers = {\n SIGINT: () => forwardSignal(\"SIGINT\"),\n SIGTERM: () => forwardSignal(\"SIGTERM\"),\n } satisfies Partial<Record<NodeJS.Signals, () => void>>;\n\n process.on(\"SIGINT\", signalHandlers.SIGINT);\n process.on(\"SIGTERM\", signalHandlers.SIGTERM);\n\n const cleanup = () => {\n clearTimeout(timeoutHandle);\n process.off(\"SIGINT\", signalHandlers.SIGINT);\n process.off(\"SIGTERM\", signalHandlers.SIGTERM);\n };\n\n child.on(\"error\", (error) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n input.logger.error(\"login.spawn.error\", {\n codexBinaryPath: input.codexBinaryPath,\n codexHome: input.codexHome,\n message: error.message,\n });\n reject(error);\n });\n\n child.on(\"exit\", (exitCode, signal) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n\n input.logger.info(\"login.spawn.complete\", {\n codexBinaryPath: input.codexBinaryPath,\n codexHome: input.codexHome,\n exitCode,\n signal,\n timedOut,\n cancelledBySignal,\n });\n\n resolve({\n exitCode,\n signal,\n timedOut,\n timeoutMs: input.timeoutMs,\n cancelledBySignal,\n });\n });\n });\n}\n\nfunction terminateChild(child: ReturnType<typeof spawn>): void {\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n\n child.kill(\"SIGTERM\");\n}\n", "import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface CodexLaunchSpec {\n args: string[];\n command: string;\n}\n\nexport async function resolveCodexLaunchSpec(\n codexBinaryPath: string,\n args: string[],\n): Promise<CodexLaunchSpec> {\n if (process.platform !== \"win32\") {\n return {\n command: codexBinaryPath,\n args,\n };\n }\n\n const npmShim = await resolveNpmCodexShim(codexBinaryPath);\n if (npmShim) {\n return {\n command: npmShim.nodeBinary,\n args: [npmShim.codexScript, ...args],\n };\n }\n\n if (/\\.(cmd|bat)$/i.test(codexBinaryPath)) {\n return {\n command: process.env.ComSpec ?? \"cmd.exe\",\n args: [\"/d\", \"/s\", \"/c\", buildCmdInvocation(codexBinaryPath, args)],\n };\n }\n\n if (/\\.ps1$/i.test(codexBinaryPath)) {\n return {\n command: process.env.ComSpec\n ? \"powershell.exe\"\n : \"pwsh\",\n args: [\n \"-NoProfile\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-File\",\n codexBinaryPath,\n ...args,\n ],\n };\n }\n\n return {\n command: codexBinaryPath,\n args,\n };\n}\n\nfunction buildCmdInvocation(binaryPath: string, args: string[]): string {\n return [quoteForCmd(binaryPath), ...args.map(quoteForCmd)].join(\" \");\n}\n\nfunction quoteForCmd(value: string): string {\n if (value.length === 0) {\n return '\"\"';\n }\n\n if (!/[\\s\"]/u.test(value)) {\n return value;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nasync function resolveNpmCodexShim(\n codexBinaryPath: string,\n): Promise<{ codexScript: string; nodeBinary: string } | null> {\n const basename = path.basename(codexBinaryPath).toLowerCase();\n if (![\"codex\", \"codex.cmd\", \"codex.bat\", \"codex.ps1\"].includes(basename)) {\n return null;\n }\n\n const directory = path.dirname(codexBinaryPath);\n const codexScript = path.join(directory, \"node_modules\", \"@openai\", \"codex\", \"bin\", \"codex.js\");\n\n if (!(await pathExists(codexScript))) {\n return null;\n }\n\n const bundledNode = path.join(directory, \"node.exe\");\n return {\n codexScript,\n nodeBinary: (await pathExists(bundledNode)) ? bundledNode : \"node\",\n };\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n", "import type { Logger } from \"../logging/logger.js\";\nimport type {\n SelectionFallbackReason,\n SelectionSummary,\n SelectionSummaryEntry,\n} from \"./selection-summary.js\";\n\ninterface SummaryRenderCapabilities {\n stdoutIsTTY: boolean;\n useColor: boolean;\n}\n\nexport function formatSelectionSummary(input: {\n capabilities: SummaryRenderCapabilities;\n logger: Logger;\n summary: SelectionSummary;\n}): string {\n const renderMode = input.capabilities.useColor ? \"color\" : \"plain\";\n\n input.logger.debug(\"selection.format_summary.start\", {\n mode: input.summary.mode,\n strategy: input.summary.strategy,\n entryCount: input.summary.entries.length,\n stdoutIsTTY: input.capabilities.stdoutIsTTY,\n useColor: input.capabilities.useColor,\n renderMode,\n fallbackReason: input.summary.fallbackReason,\n selectedAccountId: input.summary.selectedAccount?.id ?? null,\n executionBlockedReason: input.summary.executionBlockedReason,\n });\n\n const lines = [\n \"Account selection summary:\",\n ...input.summary.entries.map((entry) =>\n formatSelectionEntry(entry, input.capabilities),\n ),\n ];\n\n if (input.summary.selectedAccount && input.summary.selectedBy) {\n lines.push(\n `Selected account: ${input.summary.selectedAccount.label} (${input.summary.selectedAccount.id}) via ${describeSelectionMode(input.summary)}.`,\n );\n } else {\n lines.push(\"Selected account: unavailable for execution.\");\n }\n\n if (input.summary.fallbackReason) {\n lines.push(`Fallback: ${describeFallback(input.summary.fallbackReason)}.`);\n }\n if (input.summary.executionBlockedReason) {\n lines.push(`Execution note: ${input.summary.executionBlockedReason}`);\n }\n\n input.logger.debug(\"selection.format_summary.complete\", {\n mode: input.summary.mode,\n strategy: input.summary.strategy,\n renderMode,\n lineCount: lines.length,\n fallbackIncluded: input.summary.fallbackReason !== null,\n selectedAccountId: input.summary.selectedAccount?.id ?? null,\n executionBlockedReason: input.summary.executionBlockedReason,\n });\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatSelectionEntry(\n entry: SelectionSummaryEntry,\n capabilities: SummaryRenderCapabilities,\n): string {\n const tags = [\n entry.isSelected ? \"selected\" : null,\n entry.isDefault ? \"default\" : null,\n entry.rankingPosition !== null ? `rank #${entry.rankingPosition}` : null,\n ]\n .filter((value): value is string => value !== null)\n .join(\", \");\n\n const status = entry.snapshot?.status ?? (entry.failureCategory ? \"probe-failed\" : \"not-probed\");\n const detail =\n entry.failureMessage ??\n entry.snapshot?.statusReason ??\n \"usage probing was not required for this strategy\";\n\n return [\n \"-\",\n `${entry.account.label} (${entry.account.id})`,\n tags ? colorize(capabilities, \"tag\", `[${tags}]`) : null,\n colorize(capabilities, mapStatusTone(status), `status=${status}`),\n formatWindowMetric(capabilities, \"5h\", entry.snapshot?.dailyRemaining ?? null),\n formatWindowMetric(capabilities, \"weekly\", entry.snapshot?.weeklyRemaining ?? null),\n entry.snapshot?.plan\n ? `${colorize(capabilities, \"plan\", \"plan\")}=${colorize(capabilities, \"planValue\", entry.snapshot.plan)}`\n : null,\n colorize(capabilities, \"source\", `source=${entry.source}`),\n `detail=${describeDetailMarker(entry, detail)}`,\n ]\n .filter((value): value is string => value !== null)\n .join(\" \");\n}\n\nfunction formatPercent(value: number | null): string {\n return value === null ? \"unknown\" : `${trimTrailingZeroes(value)}%`;\n}\n\nfunction formatWindowMetric(\n capabilities: SummaryRenderCapabilities,\n label: \"5h\" | \"weekly\",\n value: number | null,\n): string {\n const renderedPercent = colorize(\n capabilities,\n mapRemainingTone(value),\n formatPercent(value),\n );\n return `${colorize(capabilities, \"windowLabel\", label)}=${renderedPercent}`;\n}\n\nfunction describeSelectionMode(summary: SelectionSummary): string {\n if (summary.selectedBy === null) {\n return \"no execution selection\";\n }\n\n switch (summary.selectedBy) {\n case \"experimental-ranked\":\n return \"remaining-limit\";\n case \"single-account\":\n return \"single-account\";\n case \"manual-default\":\n return \"manual-default\";\n case \"manual-default-fallback-single\":\n return summary.fallbackReason\n ? \"manual-default fallback because only one account was available\"\n : \"manual-default because only one account is configured\";\n }\n}\n\nfunction describeFallback(reason: SelectionFallbackReason): string {\n switch (reason) {\n case \"experimental-config-missing\":\n return \"remaining-limit probing was unavailable, so codexes fell back to manual-default\";\n case \"all-probes-failed\":\n return \"every account probe failed, so codexes could not establish a reliable execution winner\";\n case \"mixed-probe-outcomes\":\n return \"some account probes failed, so codexes could not establish a reliable execution winner\";\n case \"all-accounts-exhausted\":\n return \"all probed accounts were exhausted, so codexes could not establish a reliable execution winner\";\n case \"ambiguous-usage\":\n return \"the usage data was incomplete or ambiguous, so codexes could not establish a reliable execution winner\";\n case null:\n return \"no fallback was required\";\n }\n}\n\nfunction describeDetailMarker(entry: SelectionSummaryEntry, detail: string): string {\n if (entry.failureCategory === \"timeout\") {\n return \"probe-timeout\";\n }\n\n if (entry.failureCategory === \"http-error\") {\n return \"http-error\";\n }\n\n if (entry.failureCategory === \"auth-missing\") {\n return \"auth-missing\";\n }\n\n if (entry.failureCategory === \"invalid-response\") {\n return \"invalid-response\";\n }\n\n switch (entry.snapshot?.status) {\n case \"usable\":\n return \"rankable\";\n case \"limit-reached\":\n return \"exhausted\";\n case \"not-allowed\":\n return \"blocked\";\n case \"missing-usage-data\":\n return \"incomplete\";\n default:\n return detail.includes(\"not required\") ? \"not-probed\" : \"diagnostic\";\n }\n}\n\nfunction mapStatusTone(status: string): \"source\" | \"success\" | \"muted\" | \"warning\" | \"error\" {\n switch (status) {\n case \"usable\":\n return \"success\";\n case \"limit-reached\":\n return \"warning\";\n case \"probe-failed\":\n case \"not-allowed\":\n return \"error\";\n default:\n return \"muted\";\n }\n}\n\nfunction colorize(\n capabilities: SummaryRenderCapabilities,\n tone: \"source\" | \"success\" | \"muted\" | \"warning\" | \"error\" | \"tag\" | \"windowLabel\" | \"plan\" | \"planValue\",\n value: string,\n): string {\n if (!capabilities.useColor) {\n return value;\n }\n\n const open = ANSI_CODES[tone];\n return `${open}${value}${ANSI_RESET}`;\n}\n\nfunction mapRemainingTone(\n value: number | null,\n): \"success\" | \"warning\" | \"error\" | \"muted\" {\n if (value === null) {\n return \"muted\";\n }\n\n if (value <= 20) {\n return \"error\";\n }\n\n if (value <= 50) {\n return \"warning\";\n }\n\n return \"success\";\n}\n\nfunction trimTrailingZeroes(value: number): string {\n return value.toFixed(2).replace(/\\.00$/, \"\").replace(/(\\.\\d)0$/, \"$1\");\n}\n\nconst ANSI_RESET = \"\\u001b[0m\";\nconst ANSI_CODES: Record<\n \"source\" | \"success\" | \"muted\" | \"warning\" | \"error\" | \"tag\" | \"windowLabel\" | \"plan\" | \"planValue\",\n string\n> = {\n source: \"\\u001b[36m\",\n success: \"\\u001b[32m\",\n muted: \"\\u001b[90m\",\n warning: \"\\u001b[33m\",\n error: \"\\u001b[31m\",\n tag: \"\\u001b[1m\",\n windowLabel: \"\\u001b[94m\",\n plan: \"\\u001b[95m\",\n planValue: \"\\u001b[1;95m\",\n};\n", "import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AccountRecord } from \"../accounts/account-registry.js\";\nimport type { Logger } from \"../logging/logger.js\";\n\nexport type AccountAuthStateFailureCategory =\n | \"missing-file\"\n | \"malformed-json\"\n | \"missing-access-token\"\n | \"unsupported-auth-shape\";\n\nexport interface AccountAuthState {\n accessToken: string;\n accountId: string | null;\n authMode: string | null;\n lastRefresh: string | null;\n}\n\nexport type AccountAuthStateReadResult =\n | {\n ok: true;\n filePath: string;\n state: AccountAuthState;\n }\n | {\n ok: false;\n category: AccountAuthStateFailureCategory;\n filePath: string;\n message: string;\n };\n\nexport async function readAccountAuthState(input: {\n account: AccountRecord;\n logger: Logger;\n}): Promise<AccountAuthStateReadResult> {\n const filePath = path.join(input.account.authDirectory, \"state\", \"auth.json\");\n\n input.logger.debug(\"selection.account_auth_state.read_start\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n });\n\n try {\n const raw = await readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (!isRecord(parsed)) {\n input.logger.warn(\"selection.account_auth_state.unsupported_shape\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n topLevelType: typeof parsed,\n });\n\n return {\n ok: false,\n category: \"unsupported-auth-shape\",\n filePath,\n message: \"auth.json is not a JSON object.\",\n };\n }\n\n const accessToken = resolveString(\n parsed.access_token,\n getNestedString(parsed, [\"tokens\", \"access_token\"]),\n getNestedString(parsed, [\"tokens\", \"accessToken\"]),\n );\n if (!accessToken) {\n input.logger.warn(\"selection.account_auth_state.access_token_missing\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n hasTokensObject: isRecord(parsed.tokens),\n });\n\n return {\n ok: false,\n category: \"missing-access-token\",\n filePath,\n message: \"auth.json does not contain an access_token.\",\n };\n }\n\n const result: AccountAuthStateReadResult = {\n ok: true,\n filePath,\n state: {\n accessToken,\n accountId: resolveString(\n parsed.account_id,\n parsed.accountId,\n getNestedString(parsed, [\"tokens\", \"account_id\"]),\n getNestedString(parsed, [\"tokens\", \"accountId\"]),\n ),\n authMode: resolveString(\n parsed.auth_mode,\n parsed.authMode,\n getNestedString(parsed, [\"tokens\", \"auth_mode\"]),\n getNestedString(parsed, [\"tokens\", \"authMode\"]),\n ),\n lastRefresh: resolveString(\n parsed.last_refresh,\n parsed.lastRefresh,\n parsed.refresh_at,\n parsed.refreshAt,\n ),\n },\n };\n\n input.logger.debug(\"selection.account_auth_state.read_complete\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n hasAccessToken: true,\n authAccountId: result.state.accountId,\n authMode: result.state.authMode,\n hasRefreshMetadata: result.state.lastRefresh !== null,\n });\n\n return result;\n } catch (error) {\n if (isNodeErrorWithCode(error, \"ENOENT\")) {\n input.logger.warn(\"selection.account_auth_state.missing_file\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n });\n return {\n ok: false,\n category: \"missing-file\",\n filePath,\n message: \"auth.json was not found for the account profile.\",\n };\n }\n\n if (error instanceof SyntaxError) {\n input.logger.warn(\"selection.account_auth_state.malformed_json\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n message: error.message,\n });\n return {\n ok: false,\n category: \"malformed-json\",\n filePath,\n message: error.message,\n };\n }\n\n input.logger.warn(\"selection.account_auth_state.unsupported_shape\", {\n accountId: input.account.id,\n label: input.account.label,\n filePath,\n message: error instanceof Error ? error.message : String(error),\n });\n return {\n ok: false,\n category: \"unsupported-auth-shape\",\n filePath,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction getNestedString(value: Record<string, unknown>, pathParts: string[]): string | null {\n let current: unknown = value;\n\n for (const part of pathParts) {\n if (!isRecord(current) || typeof current[part] === \"undefined\") {\n return null;\n }\n\n current = current[part];\n }\n\n return typeof current === \"string\" && current.trim().length > 0 ? current : null;\n}\n\nfunction resolveString(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isNodeErrorWithCode(error: unknown, code: string): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n", "import type { Logger } from \"../logging/logger.js\";\nimport type {\n NormalizedUsageSnapshot,\n NormalizedUsageWindow,\n UsageQuotaWindowRaw,\n UsageSnapshotStatus,\n WhamUsageResponseRaw,\n} from \"./usage-types.js\";\n\nexport function normalizeWhamUsageResponse(input: {\n accountIdHint?: string | null;\n logger: Logger;\n raw: WhamUsageResponseRaw;\n}): NormalizedUsageSnapshot {\n const payloadShape = resolvePayloadShape(input.raw);\n const dailyWindow = resolveUsageWindow(input.raw, \"daily\");\n const weeklyWindow = resolveUsageWindow(input.raw, \"weekly\");\n\n input.logger.debug(\"selection.usage_normalize.start\", {\n accountIdHint: input.accountIdHint ?? null,\n payloadShape,\n hasPrimaryWindow: dailyWindow.source === \"rate_limit.primary_window\",\n hasSecondaryWindow: weeklyWindow.source === \"rate_limit.secondary_window\",\n topLevelKeys: Object.keys(input.raw).sort(),\n });\n\n const daily = normalizeUsageWindow({\n accountIdHint: input.accountIdHint,\n logger: input.logger,\n raw: dailyWindow.raw,\n source: dailyWindow.source,\n window: \"daily\",\n });\n const weekly = normalizeUsageWindow({\n accountIdHint: input.accountIdHint,\n logger: input.logger,\n raw: weeklyWindow.raw,\n source: weeklyWindow.source,\n window: \"weekly\",\n });\n const accountId = pickString(input.raw.account_id, input.raw.accountId, input.accountIdHint);\n const plan = pickString(\n input.raw.plan,\n input.raw.subscription_plan,\n input.raw.plan_type,\n input.raw.rate_limit?.plan,\n input.raw.rate_limit?.subscription_plan,\n );\n const allowed = pickBoolean(input.raw.allowed, input.raw.rate_limit?.allowed, true) ?? true;\n const limitReached =\n (pickBoolean(input.raw.limit_reached, input.raw.rate_limit?.limit_reached) ??\n daily.limitReached) ||\n weekly.limitReached;\n const status = classifyUsageStatus({\n allowed,\n dailyRemaining: daily.remaining,\n limitReached,\n weeklyRemaining: weekly.remaining,\n });\n const statusEvent = `selection.usage_normalize.status_${status}`;\n const statusDetails = {\n accountId,\n accountIdHint: input.accountIdHint ?? null,\n allowed,\n payloadShape,\n dailyRemaining: daily.remaining,\n weeklyRemaining: weekly.remaining,\n dailyWindowSource: daily.source,\n weeklyWindowSource: weekly.source,\n hasRemainingPercent: daily.remaining !== null || weekly.remaining !== null,\n };\n if (status === \"usable\") {\n input.logger.info(statusEvent, statusDetails);\n } else {\n input.logger.warn(statusEvent, statusDetails);\n }\n const snapshot: NormalizedUsageSnapshot = {\n accountId,\n allowed,\n limitReached,\n plan,\n dailyRemaining: daily.remaining,\n weeklyRemaining: weekly.remaining,\n dailyResetsAt: daily.resetsAt,\n weeklyResetsAt: weekly.resetsAt,\n dailyPercentUsed: daily.percentUsed,\n weeklyPercentUsed: weekly.percentUsed,\n observedAt: new Date().toISOString(),\n status,\n statusReason: describeUsageStatus(status),\n windows: {\n daily,\n weekly,\n },\n };\n\n input.logger.debug(\"selection.usage_normalize.complete\", {\n accountId: snapshot.accountId,\n allowed: snapshot.allowed,\n payloadShape,\n limitReached: snapshot.limitReached,\n plan: snapshot.plan,\n dailyRemaining: snapshot.dailyRemaining,\n weeklyRemaining: snapshot.weeklyRemaining,\n dailyResetsAt: snapshot.dailyResetsAt,\n weeklyResetsAt: snapshot.weeklyResetsAt,\n status: snapshot.status,\n statusReason: snapshot.statusReason,\n });\n\n return snapshot;\n}\n\nfunction normalizeUsageWindow(input: {\n accountIdHint?: string | null;\n logger: Logger;\n raw: UsageQuotaWindowRaw | null;\n source: string | null;\n window: \"daily\" | \"weekly\";\n}): NormalizedUsageWindow {\n if (!input.raw) {\n input.logger.debug(\"selection.usage_normalize.window_missing\", {\n accountIdHint: input.accountIdHint ?? null,\n source: input.source,\n window: input.window,\n });\n\n return {\n limit: null,\n used: null,\n remaining: null,\n limitReached: false,\n resetsAt: null,\n percentUsed: null,\n source: input.source,\n };\n }\n\n const limit = pickNumber(input.raw.limit);\n const percentResolution = resolveUsedPercent({\n accountIdHint: input.accountIdHint,\n logger: input.logger,\n raw: input.raw,\n window: input.window,\n });\n const remainingFromPercent = calculateRemainingFromPercent(percentResolution.percentUsed);\n const used = pickNumber(\n input.raw.used,\n calculateUsed(limit, pickNumber(input.raw.remaining)),\n calculateUsed(limit, remainingFromPercent),\n );\n const remaining = pickNumber(\n input.raw.remaining,\n remainingFromPercent,\n calculateRemaining(limit, used),\n );\n const limitReached =\n typeof input.raw.limit_reached === \"boolean\"\n ? input.raw.limit_reached\n : remaining !== null\n ? remaining <= 0\n : false;\n const percentUsed =\n percentResolution.percentUsed ?? calculatePercentUsed(limit, used, remaining);\n const resetsAt = normalizeTimestamp(\n input.raw.reset_at,\n input.raw.resets_at,\n input.raw.next_reset_at,\n calculateResetAtFromSeconds(input.raw.reset_after_seconds),\n );\n const source = resolveWindowSource(input.raw, input.source);\n\n input.logger.debug(\"selection.usage_normalize.window_complete\", {\n accountIdHint: input.accountIdHint ?? null,\n window: input.window,\n source,\n limit,\n used,\n remaining,\n limitReached,\n rawUsedPercent: percentResolution.rawValue,\n percentResolutionSource: percentResolution.source,\n percentUsed,\n resetsAt,\n limitWindowSeconds: pickNumber(input.raw.limit_window_seconds),\n });\n\n return {\n limit,\n used,\n remaining,\n limitReached,\n resetsAt,\n percentUsed,\n source,\n };\n}\n\nfunction resolveUsageWindow(\n raw: WhamUsageResponseRaw,\n window: \"daily\" | \"weekly\",\n): { raw: UsageQuotaWindowRaw | null; source: string | null } {\n const rateLimitWindow =\n window === \"daily\" ? raw.rate_limit?.primary_window : raw.rate_limit?.secondary_window;\n if (isRecord(rateLimitWindow)) {\n return {\n raw: rateLimitWindow as UsageQuotaWindowRaw,\n source: `rate_limit.${window === \"daily\" ? \"primary_window\" : \"secondary_window\"}`,\n };\n }\n\n const candidates: Array<{ raw: unknown; source: string }> = [\n { raw: raw[window], source: `legacy.${window}` },\n { raw: raw.usage?.[window], source: `usage.${window}` },\n { raw: raw.quotas?.[window], source: `quotas.${window}` },\n ];\n\n for (const candidate of candidates) {\n if (isRecord(candidate.raw)) {\n return {\n raw: candidate.raw as UsageQuotaWindowRaw,\n source: candidate.source,\n };\n }\n }\n\n return {\n raw: null,\n source: null,\n };\n}\n\nfunction resolveWindowSource(raw: UsageQuotaWindowRaw, fallbackSource: string | null): string | null {\n if (typeof raw.source === \"string\") {\n return raw.source;\n }\n\n if (typeof raw.kind === \"string\") {\n return raw.kind;\n }\n\n return fallbackSource;\n}\n\nfunction resolvePayloadShape(raw: WhamUsageResponseRaw): \"legacy\" | \"rate_limit\" {\n if (\n isRecord(raw.rate_limit) &&\n (isRecord(raw.rate_limit.primary_window) || isRecord(raw.rate_limit.secondary_window))\n ) {\n return \"rate_limit\";\n }\n\n return \"legacy\";\n}\n\nfunction classifyUsageStatus(input: {\n allowed: boolean;\n dailyRemaining: number | null;\n limitReached: boolean;\n weeklyRemaining: number | null;\n}): UsageSnapshotStatus {\n if (!input.allowed) {\n return \"not-allowed\";\n }\n\n if (input.limitReached) {\n return \"limit-reached\";\n }\n\n if (input.dailyRemaining === null && input.weeklyRemaining === null) {\n return \"missing-usage-data\";\n }\n\n return \"usable\";\n}\n\nfunction describeUsageStatus(status: UsageSnapshotStatus): string {\n switch (status) {\n case \"not-allowed\":\n return \"usage endpoint reported that the account is not allowed to launch\";\n case \"limit-reached\":\n return \"usage endpoint reported an exhausted limit window\";\n case \"missing-usage-data\":\n return \"usage endpoint did not expose enough quota fields to rank this account\";\n case \"usable\":\n return \"usage endpoint exposed enough quota fields to rank this account\";\n }\n}\n\nfunction normalizeTimestamp(...values: Array<number | string | null | undefined>): string | null {\n for (const value of values) {\n if (typeof value === \"string\") {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.valueOf())) {\n return parsed.toISOString();\n }\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n const normalizedValue = value > 10_000_000_000 ? value : value * 1_000;\n const parsed = new Date(normalizedValue);\n if (!Number.isNaN(parsed.valueOf())) {\n return parsed.toISOString();\n }\n }\n }\n\n return null;\n}\n\nfunction calculateResetAtFromSeconds(value: number | null | undefined): string | null {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return null;\n }\n\n return new Date(Date.now() + value * 1_000).toISOString();\n}\n\nfunction calculateRemaining(\n limit: number | null,\n used: number | null,\n): number | null {\n if (limit === null || used === null) {\n return null;\n }\n\n return limit - used;\n}\n\nfunction calculateUsed(\n limit: number | null,\n remaining: number | null,\n): number | null {\n if (limit === null || remaining === null) {\n return null;\n }\n\n return limit - remaining;\n}\n\nfunction calculatePercentUsed(\n limit: number | null,\n used: number | null,\n remaining: number | null,\n): number | null {\n if (limit === null || limit <= 0) {\n return null;\n }\n\n const numerator = used ?? calculateUsed(limit, remaining);\n if (numerator === null) {\n return null;\n }\n\n return Number(((numerator / limit) * 100).toFixed(2));\n}\n\nfunction calculateRemainingFromPercent(percentUsed: number | null): number | null {\n if (percentUsed === null) {\n return null;\n }\n\n return Number((100 - percentUsed).toFixed(2));\n}\n\nfunction resolveUsedPercent(input: {\n accountIdHint?: string | null;\n logger: Logger;\n raw: UsageQuotaWindowRaw;\n window: \"daily\" | \"weekly\";\n}): {\n percentUsed: number | null;\n rawValue: number | string | null;\n source: \"used_percent\" | \"percent_used\" | \"percentage_used\" | \"missing\" | \"invalid\";\n} {\n const candidates: Array<{\n source: \"used_percent\" | \"percent_used\" | \"percentage_used\";\n value: number | string | null | undefined;\n }> = [\n { source: \"used_percent\", value: input.raw.used_percent },\n { source: \"percent_used\", value: input.raw.percent_used },\n { source: \"percentage_used\", value: input.raw.percentage_used },\n ];\n\n for (const candidate of candidates) {\n if (candidate.value === null || candidate.value === undefined || candidate.value === \"\") {\n continue;\n }\n\n const parsed = normalizePercentValue(candidate.value);\n if (parsed === null) {\n input.logger.debug(\"selection.usage_normalize.percent_invalid\", {\n accountIdHint: input.accountIdHint ?? null,\n window: input.window,\n source: candidate.source,\n rawValue: candidate.value,\n behavior: \"skip\",\n });\n return {\n percentUsed: null,\n rawValue: typeof candidate.value === \"string\" || typeof candidate.value === \"number\"\n ? candidate.value\n : null,\n source: \"invalid\",\n };\n }\n\n if (parsed.wasClamped) {\n input.logger.debug(\"selection.usage_normalize.percent_clamped\", {\n accountIdHint: input.accountIdHint ?? null,\n window: input.window,\n source: candidate.source,\n rawValue: candidate.value,\n clampedValue: parsed.value,\n });\n }\n\n input.logger.debug(\"selection.usage_normalize.percent_resolved\", {\n accountIdHint: input.accountIdHint ?? null,\n window: input.window,\n source: candidate.source,\n rawValue: candidate.value,\n percentUsed: parsed.value,\n remainingPercent: calculateRemainingFromPercent(parsed.value),\n });\n\n return {\n percentUsed: parsed.value,\n rawValue: typeof candidate.value === \"string\" || typeof candidate.value === \"number\"\n ? candidate.value\n : null,\n source: candidate.source,\n };\n }\n\n input.logger.debug(\"selection.usage_normalize.percent_missing\", {\n accountIdHint: input.accountIdHint ?? null,\n window: input.window,\n fallback: \"derive-from-limit-or-remaining-if-possible\",\n });\n\n return {\n percentUsed: null,\n rawValue: null,\n source: \"missing\",\n };\n}\n\nfunction normalizePercentValue(\n value: number | string,\n): { value: number; wasClamped: boolean } | null {\n const numericValue =\n typeof value === \"number\"\n ? value\n : value.trim().length > 0\n ? Number(value)\n : Number.NaN;\n if (!Number.isFinite(numericValue)) {\n return null;\n }\n\n const clampedValue = Math.min(100, Math.max(0, numericValue));\n return {\n value: Number(clampedValue.toFixed(2)),\n wasClamped: clampedValue !== numericValue,\n };\n}\n\nfunction pickString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction pickNumber(\n ...values: Array<number | null | undefined>\n): number | null {\n for (const value of values) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction pickBoolean(\n ...values: Array<boolean | null | undefined>\n): boolean | null {\n for (const value of values) {\n if (typeof value === \"boolean\") {\n return value;\n }\n }\n\n return null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n", "import type { AccountRecord } from \"../accounts/account-registry.js\";\nimport type { ExperimentalSelectionConfig } from \"../config/wrapper-config.js\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { readAccountAuthState } from \"./account-auth-state.js\";\nimport { normalizeWhamUsageResponse } from \"./usage-normalize.js\";\nimport type { NormalizedUsageSnapshot, WhamUsageResponseRaw } from \"./usage-types.js\";\n\nconst WHAM_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\n\nexport type UsageProbeFailureCategory =\n | \"auth-missing\"\n | \"timeout\"\n | \"http-error\"\n | \"invalid-response\";\n\nexport type AccountUsageProbeResult =\n | {\n ok: true;\n account: AccountRecord;\n snapshot: NormalizedUsageSnapshot;\n source: \"fresh\";\n }\n | {\n ok: false;\n account: AccountRecord;\n category: UsageProbeFailureCategory;\n message: string;\n source: \"fresh\";\n };\n\nexport async function probeAccountUsage(input: {\n account: AccountRecord;\n fetchImpl?: typeof fetch;\n logger: Logger;\n probeConfig: ExperimentalSelectionConfig;\n}): Promise<AccountUsageProbeResult> {\n const fetchImpl = input.fetchImpl ?? fetch;\n\n input.logger.info(\"selection.usage_probe.start\", {\n accountId: input.account.id,\n label: input.account.label,\n timeoutMs: input.probeConfig.probeTimeoutMs,\n useAccountIdHeader: input.probeConfig.useAccountIdHeader,\n });\n\n const authState = await readAccountAuthState({\n account: input.account,\n logger: input.logger,\n });\n if (!authState.ok) {\n input.logger.warn(\"selection.usage_probe.auth_missing\", {\n accountId: input.account.id,\n label: input.account.label,\n category: authState.category,\n filePath: authState.filePath,\n });\n\n return {\n ok: false,\n account: input.account,\n category: \"auth-missing\",\n message: authState.message,\n source: \"fresh\",\n };\n }\n\n try {\n const response = await fetchImpl(WHAM_USAGE_URL, {\n method: \"GET\",\n headers: buildUsageHeaders({\n accessToken: authState.state.accessToken,\n accountId: authState.state.accountId,\n useAccountIdHeader: input.probeConfig.useAccountIdHeader,\n }),\n signal: AbortSignal.timeout(input.probeConfig.probeTimeoutMs),\n });\n\n input.logger.debug(\"selection.usage_probe.http_complete\", {\n accountId: input.account.id,\n label: input.account.label,\n status: response.status,\n ok: response.ok,\n });\n\n if (!response.ok) {\n input.logger.warn(\"selection.usage_probe.http_error\", {\n accountId: input.account.id,\n label: input.account.label,\n status: response.status,\n });\n return {\n ok: false,\n account: input.account,\n category: \"http-error\",\n message: `Usage probe returned HTTP ${response.status}.`,\n source: \"fresh\",\n };\n }\n\n const body = (await response.json()) as unknown;\n if (!isRecord(body)) {\n input.logger.warn(\"selection.usage_probe.invalid_response\", {\n accountId: input.account.id,\n label: input.account.label,\n bodyType: typeof body,\n });\n return {\n ok: false,\n account: input.account,\n category: \"invalid-response\",\n message: \"Usage probe returned a non-object JSON payload.\",\n source: \"fresh\",\n };\n }\n\n const snapshot = normalizeWhamUsageResponse({\n accountIdHint: authState.state.accountId ?? input.account.id,\n logger: input.logger,\n raw: body as WhamUsageResponseRaw,\n });\n\n input.logger.info(\"selection.usage_probe.success\", {\n accountId: input.account.id,\n label: input.account.label,\n snapshotStatus: snapshot.status,\n dailyRemaining: snapshot.dailyRemaining,\n weeklyRemaining: snapshot.weeklyRemaining,\n limitReached: snapshot.limitReached,\n });\n\n return {\n ok: true,\n account: input.account,\n snapshot,\n source: \"fresh\",\n };\n } catch (error) {\n if (isAbortError(error)) {\n input.logger.warn(\"selection.usage_probe.timeout\", {\n accountId: input.account.id,\n label: input.account.label,\n timeoutMs: input.probeConfig.probeTimeoutMs,\n });\n return {\n ok: false,\n account: input.account,\n category: \"timeout\",\n message: `Usage probe timed out after ${input.probeConfig.probeTimeoutMs}ms.`,\n source: \"fresh\",\n };\n }\n\n input.logger.error(\"selection.usage_probe.request_failed\", {\n accountId: input.account.id,\n label: input.account.label,\n message: error instanceof Error ? error.message : String(error),\n });\n return {\n ok: false,\n account: input.account,\n category: \"invalid-response\",\n message: error instanceof Error ? error.message : String(error),\n source: \"fresh\",\n };\n }\n}\n\nfunction buildUsageHeaders(input: {\n accessToken: string;\n accountId: string | null;\n useAccountIdHeader: boolean;\n}): Headers {\n const headers = new Headers({\n accept: \"application/json\",\n authorization: `Bearer ${input.accessToken}`,\n \"user-agent\": \"codexes/0.1 experimental-usage-probe\",\n });\n\n if (input.useAccountIdHeader && input.accountId) {\n headers.set(\"OpenAI-Account-ID\", input.accountId);\n }\n\n return headers;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n", "import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Logger } from \"../logging/logger.js\";\nimport type { NormalizedUsageSnapshot } from \"./usage-types.js\";\n\nconst USAGE_CACHE_SCHEMA_VERSION = 1;\n\nexport interface UsageCacheEntry {\n accountId: string;\n accountLabel: string;\n cachedAt: string;\n snapshot: NormalizedUsageSnapshot;\n}\n\ninterface UsageCacheDocument {\n schemaVersion: number;\n entries: UsageCacheEntry[];\n}\n\nexport async function loadUsageCache(input: {\n cacheFilePath: string;\n logger: Logger;\n}): Promise<UsageCacheEntry[]> {\n try {\n const raw = await readFile(input.cacheFilePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n const normalized = normalizeUsageCacheDocument(parsed);\n\n input.logger.debug(\"selection.usage_cache.load_success\", {\n cacheFilePath: input.cacheFilePath,\n entryCount: normalized.entries.length,\n compatibilitySummary: normalized.entries.map((entry) => ({\n accountId: entry.accountId,\n shape: describeSnapshotShape(entry.snapshot),\n })),\n });\n\n return normalized.entries;\n } catch (error) {\n if (isNodeErrorWithCode(error, \"ENOENT\")) {\n input.logger.debug(\"selection.usage_cache.missing\", {\n cacheFilePath: input.cacheFilePath,\n });\n return [];\n }\n\n const backupPath = `${input.cacheFilePath}.corrupt-${Date.now()}`;\n await rename(input.cacheFilePath, backupPath).catch(() => undefined);\n\n input.logger.warn(\"selection.usage_cache.corrupt\", {\n cacheFilePath: input.cacheFilePath,\n backupPath,\n message: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n}\n\nexport async function persistUsageCache(input: {\n cacheFilePath: string;\n entries: UsageCacheEntry[];\n logger: Logger;\n}): Promise<void> {\n await mkdir(path.dirname(input.cacheFilePath), { recursive: true });\n\n const document: UsageCacheDocument = {\n schemaVersion: USAGE_CACHE_SCHEMA_VERSION,\n entries: input.entries,\n };\n const tempFile = `${input.cacheFilePath}.tmp`;\n const serialized = JSON.stringify(document, null, 2);\n\n await writeFile(tempFile, serialized, \"utf8\");\n await rename(tempFile, input.cacheFilePath);\n\n input.logger.debug(\"selection.usage_cache.persisted\", {\n cacheFilePath: input.cacheFilePath,\n entryCount: input.entries.length,\n });\n}\n\nexport function resolveFreshUsageCacheEntry(input: {\n accountId: string;\n entries: UsageCacheEntry[];\n logger: Logger;\n now: number;\n ttlMs: number;\n}): UsageCacheEntry | null {\n const entry = input.entries.find((candidate) => candidate.accountId === input.accountId) ?? null;\n if (!entry) {\n input.logger.debug(\"selection.usage_cache.miss\", {\n accountId: input.accountId,\n ttlMs: input.ttlMs,\n snapshotSource: \"fresh-required\",\n });\n return null;\n }\n\n const ageMs = input.now - new Date(entry.cachedAt).valueOf();\n if (!Number.isFinite(ageMs) || ageMs > input.ttlMs) {\n input.logger.debug(\"selection.usage_cache.expired\", {\n accountId: input.accountId,\n cachedAt: entry.cachedAt,\n ageMs: Number.isFinite(ageMs) ? ageMs : null,\n ttlMs: input.ttlMs,\n primaryRemainingPercent: entry.snapshot.dailyRemaining,\n secondaryRemainingPercent: entry.snapshot.weeklyRemaining,\n snapshotStatus: entry.snapshot.status,\n compatibilityPath: describeSnapshotShape(entry.snapshot),\n });\n return null;\n }\n\n input.logger.debug(\"selection.usage_cache.hit\", {\n accountId: input.accountId,\n cachedAt: entry.cachedAt,\n ageMs,\n ttlMs: input.ttlMs,\n primaryRemainingPercent: entry.snapshot.dailyRemaining,\n secondaryRemainingPercent: entry.snapshot.weeklyRemaining,\n snapshotStatus: entry.snapshot.status,\n compatibilityPath: describeSnapshotShape(entry.snapshot),\n });\n return entry;\n}\n\nfunction normalizeUsageCacheDocument(value: unknown): UsageCacheDocument {\n if (!isRecord(value)) {\n throw new Error(\"Usage cache document is not an object.\");\n }\n\n const schemaVersion =\n typeof value.schemaVersion === \"number\" ? value.schemaVersion : USAGE_CACHE_SCHEMA_VERSION;\n if (schemaVersion !== USAGE_CACHE_SCHEMA_VERSION) {\n throw new Error(`Unsupported usage cache schema version ${schemaVersion}.`);\n }\n\n const entries = Array.isArray(value.entries)\n ? value.entries.filter(isUsageCacheEntry)\n : [];\n\n return {\n schemaVersion: USAGE_CACHE_SCHEMA_VERSION,\n entries,\n };\n}\n\nfunction isUsageCacheEntry(value: unknown): value is UsageCacheEntry {\n return (\n isRecord(value) &&\n typeof value.accountId === \"string\" &&\n typeof value.accountLabel === \"string\" &&\n typeof value.cachedAt === \"string\" &&\n isRecord(value.snapshot)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isNodeErrorWithCode(error: unknown, code: string): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n\nfunction describeSnapshotShape(snapshot: NormalizedUsageSnapshot): \"current\" | \"legacy-compatible\" {\n if (\n typeof snapshot === \"object\" &&\n snapshot !== null &&\n \"windows\" in snapshot &&\n typeof snapshot.windows === \"object\" &&\n snapshot.windows !== null\n ) {\n return \"current\";\n }\n\n return \"legacy-compatible\";\n}\n", "import type { AccountRecord } from \"../accounts/account-registry.js\";\nimport type { ExperimentalSelectionConfig } from \"../config/wrapper-config.js\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { probeAccountUsage, type AccountUsageProbeResult } from \"./usage-client.js\";\nimport {\n loadUsageCache,\n persistUsageCache,\n resolveFreshUsageCacheEntry,\n type UsageCacheEntry,\n} from \"./usage-cache.js\";\nimport type { NormalizedUsageSnapshot } from \"./usage-types.js\";\n\nexport type AccountUsageResolution =\n | {\n ok: true;\n account: AccountRecord;\n snapshot: NormalizedUsageSnapshot;\n source: \"cache\" | \"fresh\";\n }\n | AccountUsageProbeResult;\n\nexport async function resolveAccountUsageSnapshots(input: {\n accounts: AccountRecord[];\n cacheFilePath: string;\n fetchImpl?: typeof fetch;\n logger: Logger;\n probeConfig: ExperimentalSelectionConfig;\n}): Promise<AccountUsageResolution[]> {\n const now = Date.now();\n\n input.logger.info(\"selection.usage_probe_coordinator.start\", {\n accountCount: input.accounts.length,\n cacheFilePath: input.cacheFilePath,\n cacheTtlMs: input.probeConfig.cacheTtlMs,\n timeoutMs: input.probeConfig.probeTimeoutMs,\n });\n\n const cacheEntries = await loadUsageCache({\n cacheFilePath: input.cacheFilePath,\n logger: input.logger,\n });\n const freshCacheEntries: UsageCacheEntry[] = [...cacheEntries];\n const resolutions = await Promise.all(\n input.accounts.map(async (account) => {\n const cached = resolveFreshUsageCacheEntry({\n accountId: account.id,\n entries: freshCacheEntries,\n logger: input.logger,\n now,\n ttlMs: input.probeConfig.cacheTtlMs,\n });\n if (cached) {\n return {\n ok: true as const,\n account,\n snapshot: cached.snapshot,\n source: \"cache\" as const,\n };\n }\n\n const fresh = await probeAccountUsage({\n account,\n fetchImpl: input.fetchImpl,\n logger: input.logger,\n probeConfig: input.probeConfig,\n });\n if (fresh.ok) {\n upsertCacheEntry(freshCacheEntries, {\n accountId: account.id,\n accountLabel: account.label,\n cachedAt: new Date(now).toISOString(),\n snapshot: fresh.snapshot,\n });\n }\n\n return fresh;\n }),\n );\n\n await persistUsageCache({\n cacheFilePath: input.cacheFilePath,\n entries: freshCacheEntries,\n logger: input.logger,\n });\n\n input.logger.info(\"selection.usage_probe_coordinator.complete\", {\n accountCount: input.accounts.length,\n cacheHitCount: resolutions.filter((entry) => entry.ok && entry.source === \"cache\").length,\n freshSuccessCount: resolutions.filter((entry) => entry.ok && entry.source === \"fresh\").length,\n failureCount: resolutions.filter((entry) => !entry.ok).length,\n resolutionSummary: resolutions.map((entry) =>\n entry.ok\n ? {\n accountId: entry.account.id,\n source: entry.source,\n snapshotStatus: entry.snapshot.status,\n primaryRemainingPercent: entry.snapshot.dailyRemaining,\n secondaryRemainingPercent: entry.snapshot.weeklyRemaining,\n }\n : {\n accountId: entry.account.id,\n source: entry.source,\n failureCategory: entry.category,\n },\n ),\n });\n\n return resolutions;\n}\n\nfunction upsertCacheEntry(entries: UsageCacheEntry[], nextEntry: UsageCacheEntry): void {\n const existingIndex = entries.findIndex((entry) => entry.accountId === nextEntry.accountId);\n if (existingIndex >= 0) {\n entries.splice(existingIndex, 1, nextEntry);\n return;\n }\n\n entries.push(nextEntry);\n}\n", "import type { AccountRecord, AccountRegistry } from \"../accounts/account-registry.js\";\nimport type {\n AccountSelectionStrategy,\n ExperimentalSelectionConfig,\n} from \"../config/wrapper-config.js\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { resolveAccountUsageSnapshots, type AccountUsageResolution } from \"./usage-probe-coordinator.js\";\nimport type { UsageProbeFailureCategory } from \"./usage-client.js\";\nimport type { NormalizedUsageSnapshot } from \"./usage-types.js\";\n\nexport type SelectionEntrySource = \"cache\" | \"fresh\" | \"unavailable\";\nexport type SelectionFallbackReason =\n | \"experimental-config-missing\"\n | \"all-probes-failed\"\n | \"mixed-probe-outcomes\"\n | \"all-accounts-exhausted\"\n | \"ambiguous-usage\"\n | null;\nexport type SelectionDecisionMode =\n | \"manual-default\"\n | \"manual-default-fallback-single\"\n | \"single-account\"\n | \"experimental-ranked\";\nexport type SelectionSummaryMode = \"display-only\" | \"execution\";\n\nexport interface SelectionSummaryEntry {\n account: AccountRecord;\n failureCategory: UsageProbeFailureCategory | null;\n failureMessage: string | null;\n isDefault: boolean;\n isEligibleForRanking: boolean;\n isSelected: boolean;\n rankingPosition: number | null;\n snapshot: NormalizedUsageSnapshot | null;\n source: SelectionEntrySource;\n}\n\nexport interface SelectionSummary {\n entries: SelectionSummaryEntry[];\n executionBlockedReason: string | null;\n fallbackReason: SelectionFallbackReason;\n mode: SelectionSummaryMode;\n selectedAccount: AccountRecord | null;\n selectedBy: SelectionDecisionMode | null;\n strategy: AccountSelectionStrategy;\n}\n\nexport async function resolveSelectionSummary(input: {\n experimentalSelection?: ExperimentalSelectionConfig;\n fetchImpl?: typeof fetch;\n logger: Logger;\n mode?: SelectionSummaryMode;\n registry: AccountRegistry;\n selectionCacheFilePath?: string;\n strategy: AccountSelectionStrategy;\n}): Promise<SelectionSummary> {\n const mode = input.mode ?? \"execution\";\n const accounts = await input.registry.listAccounts();\n\n input.logger.info(\"selection.summary.start\", {\n mode,\n strategy: input.strategy,\n accountCount: accounts.length,\n });\n\n if (accounts.length === 0) {\n input.logger.warn(\"selection.none\", {\n mode,\n strategy: input.strategy,\n });\n throw new Error(\"No accounts configured. Add one with `codexes account add <label>`.\");\n }\n\n const defaultAccount = await input.registry.getDefaultAccount();\n const summary = await resolveStrategySummary({\n accounts,\n defaultAccount,\n experimentalSelection: input.experimentalSelection,\n fetchImpl: input.fetchImpl,\n logger: input.logger,\n mode,\n registry: input.registry,\n selectionCacheFilePath: input.selectionCacheFilePath,\n strategy: input.strategy,\n });\n\n input.logger.info(\"selection.summary.complete\", {\n mode: summary.mode,\n strategy: summary.strategy,\n selectedAccountId: summary.selectedAccount?.id ?? null,\n selectedBy: summary.selectedBy,\n fallbackReason: summary.fallbackReason,\n executionBlockedReason: summary.executionBlockedReason,\n entryCount: summary.entries.length,\n });\n\n return summary;\n}\n\nasync function resolveStrategySummary(input: {\n accounts: AccountRecord[];\n defaultAccount: AccountRecord | null;\n experimentalSelection?: ExperimentalSelectionConfig;\n fetchImpl?: typeof fetch;\n logger: Logger;\n mode: SelectionSummaryMode;\n registry: AccountRegistry;\n selectionCacheFilePath?: string;\n strategy: AccountSelectionStrategy;\n}): Promise<SelectionSummary> {\n switch (input.strategy) {\n case \"manual-default\":\n return buildManualDefaultSummary(input.registry, input.logger, input.accounts, input.defaultAccount, input.mode);\n case \"single-account\":\n return buildSingleAccountSummary(input.registry, input.logger, input.accounts, input.defaultAccount, input.mode);\n case \"remaining-limit\":\n case \"remaining-limit-experimental\":\n return buildExperimentalSummary(input);\n }\n}\n\nasync function buildManualDefaultSummary(\n registry: AccountRegistry,\n logger: Logger,\n accounts: AccountRecord[],\n defaultAccount: AccountRecord | null,\n mode: SelectionSummaryMode,\n): Promise<SelectionSummary> {\n const selection = await resolveManualDefaultSelection({\n accounts,\n logger,\n mode,\n registry,\n strategy: \"manual-default\",\n });\n\n return {\n entries: createUnavailableEntries(accounts, defaultAccount, selection.selectedAccount),\n executionBlockedReason: selection.executionBlockedReason,\n fallbackReason: null,\n mode,\n selectedAccount: selection.selectedAccount,\n selectedBy: selection.selectedBy,\n strategy: \"manual-default\",\n };\n}\n\nasync function buildSingleAccountSummary(\n registry: AccountRegistry,\n logger: Logger,\n accounts: AccountRecord[],\n defaultAccount: AccountRecord | null,\n mode: SelectionSummaryMode,\n): Promise<SelectionSummary> {\n const selectedAccount = await selectSingleAccountOnly(registry, logger, accounts, mode);\n\n return {\n entries: createUnavailableEntries(accounts, defaultAccount, selectedAccount),\n executionBlockedReason: null,\n fallbackReason: null,\n mode,\n selectedAccount,\n selectedBy: \"single-account\",\n strategy: \"single-account\",\n };\n}\n\nasync function buildExperimentalSummary(input: {\n accounts: AccountRecord[];\n defaultAccount: AccountRecord | null;\n experimentalSelection?: ExperimentalSelectionConfig;\n fetchImpl?: typeof fetch;\n logger: Logger;\n mode: SelectionSummaryMode;\n registry: AccountRegistry;\n selectionCacheFilePath?: string;\n strategy: AccountSelectionStrategy;\n}): Promise<SelectionSummary> {\n if (!input.experimentalSelection?.enabled || !input.selectionCacheFilePath) {\n input.logger.warn(\"selection.experimental_config_missing\", {\n enabled: input.experimentalSelection?.enabled ?? false,\n hasSelectionCacheFilePath: Boolean(input.selectionCacheFilePath),\n mode: input.mode,\n });\n\n const fallbackSelection = await resolveManualDefaultSelection({\n accounts: input.accounts,\n fallbackReason: \"experimental-config-missing\",\n logger: input.logger,\n mode: input.mode,\n registry: input.registry,\n strategy: input.strategy,\n });\n\n return {\n entries: createUnavailableEntries(input.accounts, input.defaultAccount, fallbackSelection.selectedAccount),\n executionBlockedReason: fallbackSelection.executionBlockedReason,\n fallbackReason: \"experimental-config-missing\",\n mode: input.mode,\n selectedAccount: fallbackSelection.selectedAccount,\n selectedBy: fallbackSelection.selectedBy,\n strategy: input.strategy,\n };\n }\n\n const probeResults = await resolveAccountUsageSnapshots({\n accounts: input.accounts,\n cacheFilePath: input.selectionCacheFilePath,\n fetchImpl: input.fetchImpl,\n logger: input.logger,\n probeConfig: input.experimentalSelection,\n });\n\n const failedProbes = probeResults.filter((entry) => !entry.ok);\n if (failedProbes.length > 0) {\n const fallbackReason =\n failedProbes.length === probeResults.length ? \"all-probes-failed\" : \"mixed-probe-outcomes\";\n input.logger.warn(\n fallbackReason === \"all-probes-failed\"\n ? \"selection.experimental_fallback_all_probes_failed\"\n : \"selection.experimental_fallback_mixed_probe_outcomes\",\n {\n failedAccountIds: failedProbes.map((entry) => entry.account.id),\n failureCategories: failedProbes.map((entry) => entry.category),\n mode: input.mode,\n successfulAccountIds: probeResults\n .filter((entry) => entry.ok)\n .map((entry) => entry.account.id),\n },\n );\n\n const fallbackSelection = await resolveManualDefaultSelection({\n accounts: input.accounts,\n fallbackReason,\n logger: input.logger,\n mode: input.mode,\n registry: input.registry,\n strategy: input.strategy,\n });\n logExperimentalFallbackSelection(input.logger, {\n fallbackReason,\n mode: input.mode,\n selectedAccount: fallbackSelection.selectedAccount,\n selectedBy: fallbackSelection.selectedBy,\n });\n\n return {\n entries: createExperimentalEntries({\n defaultAccount: input.defaultAccount,\n probeResults,\n selectedAccount: fallbackSelection.selectedAccount,\n selectedCandidateIds: [],\n }),\n executionBlockedReason: fallbackSelection.executionBlockedReason,\n fallbackReason,\n mode: input.mode,\n selectedAccount: fallbackSelection.selectedAccount,\n selectedBy: fallbackSelection.selectedBy,\n strategy: input.strategy,\n };\n }\n\n const successfulProbes = probeResults.filter((entry) => entry.ok);\n const candidates = successfulProbes\n .filter((entry) => entry.snapshot.status === \"usable\")\n .sort((left, right) =>\n compareExperimentalCandidates({\n defaultAccountId: input.defaultAccount?.id ?? null,\n left,\n registryOrder: input.accounts,\n right,\n }),\n );\n\n input.logger.info(\"selection.experimental_ranked\", {\n candidateOrder: candidates.map((entry) => ({\n accountId: entry.account.id,\n label: entry.account.label,\n primaryRemainingPercent: entry.snapshot.dailyRemaining,\n secondaryRemainingPercent: entry.snapshot.weeklyRemaining,\n source: entry.source,\n })),\n defaultAccountId: input.defaultAccount?.id ?? null,\n mode: input.mode,\n rankingSignal: \"remaining-percent\",\n tieBreakOrder: [\n \"primary_remaining_percent_desc\",\n \"secondary_remaining_percent_desc\",\n \"default_account\",\n \"registry_order\",\n ],\n });\n\n const selected = candidates[0];\n if (!selected) {\n const allExhausted = successfulProbes.every(\n (entry) => entry.snapshot.limitReached || entry.snapshot.status === \"limit-reached\",\n );\n const fallbackReason = allExhausted ? \"all-accounts-exhausted\" : \"ambiguous-usage\";\n input.logger.warn(\n allExhausted\n ? \"selection.experimental_fallback_all_accounts_exhausted\"\n : \"selection.experimental_fallback_ambiguous_usage\",\n {\n mode: input.mode,\n usableProbeCount: candidates.length,\n probeStatuses: successfulProbes.map((entry) => ({\n accountId: entry.account.id,\n snapshotStatus: entry.snapshot.status,\n limitReached: entry.snapshot.limitReached,\n dailyRemaining: entry.snapshot.dailyRemaining,\n weeklyRemaining: entry.snapshot.weeklyRemaining,\n })),\n },\n );\n\n const fallbackSelection = await resolveManualDefaultSelection({\n accounts: input.accounts,\n fallbackReason,\n logger: input.logger,\n mode: input.mode,\n registry: input.registry,\n strategy: input.strategy,\n });\n logExperimentalFallbackSelection(input.logger, {\n fallbackReason,\n mode: input.mode,\n selectedAccount: fallbackSelection.selectedAccount,\n selectedBy: fallbackSelection.selectedBy,\n });\n\n return {\n entries: createExperimentalEntries({\n defaultAccount: input.defaultAccount,\n probeResults,\n selectedAccount: fallbackSelection.selectedAccount,\n selectedCandidateIds: [],\n }),\n executionBlockedReason: fallbackSelection.executionBlockedReason,\n fallbackReason,\n mode: input.mode,\n selectedAccount: fallbackSelection.selectedAccount,\n selectedBy: fallbackSelection.selectedBy,\n strategy: input.strategy,\n };\n }\n\n input.logger.info(\"selection.experimental_selected\", {\n accountId: selected.account.id,\n label: selected.account.label,\n primaryRemainingPercent: selected.snapshot.dailyRemaining,\n secondaryRemainingPercent: selected.snapshot.weeklyRemaining,\n source: selected.source,\n mode: input.mode,\n selectedBy: \"experimental-ranked\",\n rankingSignal: \"remaining-percent\",\n });\n\n return {\n entries: createExperimentalEntries({\n defaultAccount: input.defaultAccount,\n probeResults,\n selectedAccount: selected.account,\n selectedCandidateIds: candidates.map((entry) => entry.account.id),\n }),\n executionBlockedReason: null,\n fallbackReason: null,\n mode: input.mode,\n selectedAccount: selected.account,\n selectedBy: \"experimental-ranked\",\n strategy: input.strategy,\n };\n}\n\nasync function resolveManualDefaultSelection(input: {\n accounts: AccountRecord[];\n fallbackReason?: SelectionFallbackReason;\n logger: Logger;\n mode: SelectionSummaryMode;\n registry: AccountRegistry;\n strategy: AccountSelectionStrategy;\n}): Promise<{\n executionBlockedReason: string | null;\n selectedAccount: AccountRecord | null;\n selectedBy: \"manual-default\" | \"manual-default-fallback-single\" | null;\n}> {\n input.logger.debug(\"selection.manual_default.requirement\", {\n mode: input.mode,\n strategy: input.strategy,\n fallbackReason: input.fallbackReason ?? null,\n accountCount: input.accounts.length,\n });\n\n const defaultAccount = await input.registry.getDefaultAccount();\n if (defaultAccount) {\n input.logger.info(\"selection.manual_default\", {\n accountId: defaultAccount.id,\n label: defaultAccount.label,\n mode: input.mode,\n strategy: input.strategy,\n });\n return {\n executionBlockedReason: null,\n selectedAccount: defaultAccount,\n selectedBy: \"manual-default\",\n };\n }\n\n if (input.accounts.length === 1) {\n const [singleAccount] = input.accounts;\n if (!singleAccount) {\n throw new Error(\"No accounts configured.\");\n }\n\n input.logger.info(\"selection.manual_default_fallback_single\", {\n accountId: singleAccount.id,\n label: singleAccount.label,\n mode: input.mode,\n strategy: input.strategy,\n });\n return {\n executionBlockedReason: null,\n selectedAccount: await input.registry.selectAccount(singleAccount.id),\n selectedBy: \"manual-default-fallback-single\",\n };\n }\n\n const executionBlockedReason =\n \"Multiple accounts are configured but no default account is selected. Use `codexes account use <account-id-or-label>` first.\";\n\n input.logger.warn(\"selection.manual_default_missing\", {\n accountCount: input.accounts.length,\n mode: input.mode,\n strategy: input.strategy,\n fallbackReason: input.fallbackReason ?? null,\n });\n\n if (input.mode === \"display-only\") {\n input.logger.info(\"selection.display_only_missing_execution_account\", {\n accountCount: input.accounts.length,\n strategy: input.strategy,\n fallbackReason: input.fallbackReason ?? null,\n });\n return {\n executionBlockedReason,\n selectedAccount: null,\n selectedBy: null,\n };\n }\n\n input.logger.warn(\"selection.execution_blocked_missing_default\", {\n accountCount: input.accounts.length,\n strategy: input.strategy,\n fallbackReason: input.fallbackReason ?? null,\n });\n throw new Error(executionBlockedReason);\n}\n\nasync function selectSingleAccountOnly(\n registry: AccountRegistry,\n logger: Logger,\n accounts: AccountRecord[],\n mode: SelectionSummaryMode,\n): Promise<AccountRecord> {\n logger.debug(\"selection.single_account.requirement\", {\n mode,\n accountCount: accounts.length,\n });\n\n if (accounts.length !== 1) {\n logger.warn(\"selection.single_account_invalid\", {\n accountCount: accounts.length,\n mode,\n });\n throw new Error(\n \"The single-account strategy requires exactly one configured account.\",\n );\n }\n\n const [singleAccount] = accounts;\n if (!singleAccount) {\n throw new Error(\"No accounts configured.\");\n }\n\n logger.info(\"selection.single_account\", {\n accountId: singleAccount.id,\n label: singleAccount.label,\n mode,\n });\n\n const defaultAccount = await registry.getDefaultAccount();\n if (defaultAccount?.id === singleAccount.id) {\n return singleAccount;\n }\n\n return registry.selectAccount(singleAccount.id);\n}\n\nfunction createUnavailableEntries(\n accounts: AccountRecord[],\n defaultAccount: AccountRecord | null,\n selectedAccount: AccountRecord | null,\n): SelectionSummaryEntry[] {\n return accounts.map((account) => ({\n account,\n failureCategory: null,\n failureMessage: null,\n isDefault: account.id === defaultAccount?.id,\n isEligibleForRanking: false,\n isSelected: account.id === selectedAccount?.id,\n rankingPosition: null,\n snapshot: null,\n source: \"unavailable\",\n }));\n}\n\nfunction createExperimentalEntries(input: {\n defaultAccount: AccountRecord | null;\n probeResults: AccountUsageResolution[];\n selectedAccount: AccountRecord | null;\n selectedCandidateIds: string[];\n}): SelectionSummaryEntry[] {\n return input.probeResults.map((entry) => ({\n account: entry.account,\n failureCategory: entry.ok ? null : entry.category,\n failureMessage: entry.ok ? null : entry.message,\n isDefault: entry.account.id === input.defaultAccount?.id,\n isEligibleForRanking: entry.ok && entry.snapshot.status === \"usable\",\n isSelected: entry.account.id === input.selectedAccount?.id,\n rankingPosition: entry.ok ? resolveRankingPosition(input.selectedCandidateIds, entry.account.id) : null,\n snapshot: entry.ok ? entry.snapshot : null,\n source: entry.ok ? entry.source : \"fresh\",\n }));\n}\n\nfunction resolveRankingPosition(selectedCandidateIds: string[], accountId: string): number | null {\n const index = selectedCandidateIds.indexOf(accountId);\n if (index < 0) {\n return null;\n }\n\n return index + 1;\n}\n\nfunction compareExperimentalCandidates(input: {\n defaultAccountId: string | null;\n left: {\n account: AccountRecord;\n snapshot: {\n dailyRemaining: number | null;\n weeklyRemaining: number | null;\n };\n };\n registryOrder: AccountRecord[];\n right: {\n account: AccountRecord;\n snapshot: {\n dailyRemaining: number | null;\n weeklyRemaining: number | null;\n };\n };\n}): number {\n const dailyDelta =\n (input.right.snapshot.dailyRemaining ?? Number.NEGATIVE_INFINITY) -\n (input.left.snapshot.dailyRemaining ?? Number.NEGATIVE_INFINITY);\n if (dailyDelta !== 0) {\n return dailyDelta;\n }\n\n const weeklyDelta =\n (input.right.snapshot.weeklyRemaining ?? Number.NEGATIVE_INFINITY) -\n (input.left.snapshot.weeklyRemaining ?? Number.NEGATIVE_INFINITY);\n if (weeklyDelta !== 0) {\n return weeklyDelta;\n }\n\n const leftIsDefault = input.left.account.id === input.defaultAccountId;\n const rightIsDefault = input.right.account.id === input.defaultAccountId;\n if (leftIsDefault !== rightIsDefault) {\n return leftIsDefault ? -1 : 1;\n }\n\n return (\n input.registryOrder.findIndex((account) => account.id === input.left.account.id) -\n input.registryOrder.findIndex((account) => account.id === input.right.account.id)\n );\n}\n\nfunction logExperimentalFallbackSelection(\n logger: Logger,\n input: {\n fallbackReason: SelectionFallbackReason;\n mode: SelectionSummaryMode;\n selectedAccount: AccountRecord | null;\n selectedBy: \"manual-default\" | \"manual-default-fallback-single\" | null;\n },\n): void {\n logger.info(\"selection.experimental_fallback_selected\", {\n fallbackReason: input.fallbackReason,\n mode: input.mode,\n selectedAccountId: input.selectedAccount?.id ?? null,\n selectedBy: input.selectedBy,\n rankingSignal: input.selectedBy === null ? null : \"manual-default-fallback\",\n });\n}\n", "import { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport { formatSelectionSummary } from \"../../selection/format-selection-summary.js\";\nimport { resolveSelectionSummary } from \"../../selection/selection-summary.js\";\n\nexport async function runAccountListCommand(context: AppContext): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"account_list\",\n sink: context.logging.sink,\n });\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n const accounts = await registry.listAccounts();\n\n logger.info(\"command.start\", {\n accountCount: accounts.length,\n });\n\n if (accounts.length === 0) {\n context.io.stdout.write(\n [\n \"No accounts configured.\",\n \"Add one with: codexes account add <label>\",\n ].join(\"\\n\") + \"\\n\",\n );\n logger.info(\"command.empty\");\n return 0;\n }\n\n const summary = await resolveSelectionSummary({\n experimentalSelection: context.wrapperConfig.experimentalSelection,\n fetchImpl: fetch,\n logger,\n mode: \"display-only\",\n registry,\n selectionCacheFilePath: context.paths.selectionCacheFile,\n strategy: context.wrapperConfig.accountSelectionStrategy,\n });\n const formattedSummary = formatSelectionSummary({\n capabilities: {\n stdoutIsTTY: context.output.stdoutIsTTY,\n useColor: context.output.stdoutIsTTY,\n },\n logger,\n summary,\n });\n context.io.stdout.write(formattedSummary);\n logger.info(\"summary_rendered\", {\n mode: summary.mode,\n strategy: summary.strategy,\n useColor: context.output.stdoutIsTTY,\n selectedAccountId: summary.selectedAccount?.id ?? null,\n fallbackReason: summary.fallbackReason,\n executionBlockedReason: summary.executionBlockedReason,\n });\n if (summary.fallbackReason || summary.executionBlockedReason) {\n logger.warn(\"fallback_announced\", {\n fallbackReason: summary.fallbackReason,\n selectedAccountId: summary.selectedAccount?.id ?? null,\n executionBlockedReason: summary.executionBlockedReason,\n });\n }\n logger.info(\"command.complete\", {\n accountIds: summary.entries.map(({ account }) => account.id),\n });\n\n return 0;\n}\n", "import { rm } from \"node:fs/promises\";\nimport { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport { resolveAccountBySelector } from \"../../accounts/account-resolution.js\";\n\nexport async function runAccountRemoveCommand(\n context: AppContext,\n argv: string[],\n): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"account_remove\",\n sink: context.logging.sink,\n });\n\n if (argv.includes(\"--help\")) {\n context.io.stdout.write(`${buildAccountRemoveHelpText()}\\n`);\n logger.info(\"help.rendered\");\n return 0;\n }\n\n const selector = argv[0]?.trim();\n if (!selector || argv.length > 1) {\n throw new Error(buildAccountRemoveHelpText());\n }\n\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n const accounts = await registry.listAccounts();\n\n if (accounts.length === 0) {\n context.io.stdout.write(\"No accounts configured.\\n\");\n logger.info(\"command.empty\");\n return 0;\n }\n\n const account = resolveAccountBySelector({ accounts, logger, selector });\n\n logger.info(\"command.start\", {\n requestedSelector: selector,\n resolvedAccountId: account.id,\n label: account.label,\n });\n\n await registry.removeAccount(account.id);\n await rm(account.authDirectory, { force: true, recursive: true });\n\n context.io.stdout.write(`Removed account \"${account.label}\" (${account.id}).\\n`);\n logger.info(\"command.complete\", {\n requestedSelector: selector,\n resolvedAccountId: account.id,\n });\n\n return 0;\n}\n\nfunction buildAccountRemoveHelpText(): string {\n return [\n \"Usage:\",\n \" codexes account remove <account-id-or-label>\",\n ].join(\"\\n\");\n}\n", "import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AccountRecord } from \"./account-registry.js\";\nimport type { Logger } from \"../logging/logger.js\";\n\nexport interface AccountPresentation {\n account: AccountRecord;\n authAccountId: string | null;\n authMode: string | null;\n}\n\nexport function resolveAccountBySelector(input: {\n accounts: AccountRecord[];\n logger: Logger;\n selector: string;\n}): AccountRecord {\n const normalizedSelector = input.selector.trim();\n const matches = input.accounts.filter(\n (account) =>\n account.id === normalizedSelector ||\n account.label.toLowerCase() === normalizedSelector.toLowerCase(),\n );\n\n input.logger.debug(\"account_resolution.lookup\", {\n selector: normalizedSelector,\n accountCount: input.accounts.length,\n matchCount: matches.length,\n matchedAccountIds: matches.map((account) => account.id),\n });\n\n if (matches.length === 0) {\n throw new Error(`No account matches \"${normalizedSelector}\".`);\n }\n\n if (matches.length > 1) {\n throw new Error(\n `Selector \"${normalizedSelector}\" matched multiple accounts; use the account id instead.`,\n );\n }\n\n const [match] = matches;\n if (!match) {\n throw new Error(`No account matches \"${normalizedSelector}\".`);\n }\n\n return match;\n}\n\nexport async function buildAccountPresentations(input: {\n accounts: AccountRecord[];\n logger: Logger;\n}): Promise<AccountPresentation[]> {\n const presentations: AccountPresentation[] = [];\n\n for (const account of input.accounts) {\n presentations.push({\n account,\n ...(await readAccountMetadataSummary(account, input.logger)),\n });\n }\n\n return presentations;\n}\n\nasync function readAccountMetadataSummary(\n account: AccountRecord,\n logger: Logger,\n): Promise<Pick<AccountPresentation, \"authAccountId\" | \"authMode\">> {\n const metadataFile = path.join(account.authDirectory, \"account.json\");\n\n try {\n const raw = await readFile(metadataFile, \"utf8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const summary = {\n authAccountId:\n typeof parsed.authAccountId === \"string\" ? parsed.authAccountId : null,\n authMode: typeof parsed.authMode === \"string\" ? parsed.authMode : null,\n };\n\n logger.debug(\"account_resolution.metadata_loaded\", {\n accountId: account.id,\n metadataFile,\n authAccountId: summary.authAccountId,\n authMode: summary.authMode,\n });\n\n return summary;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n logger.debug(\"account_resolution.metadata_missing\", {\n accountId: account.id,\n metadataFile,\n });\n return { authAccountId: null, authMode: null };\n }\n\n logger.warn(\"account_resolution.metadata_failed\", {\n accountId: account.id,\n metadataFile,\n message: error instanceof Error ? error.message : String(error),\n });\n\n return { authAccountId: null, authMode: null };\n }\n}\n", "import { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport { resolveAccountBySelector } from \"../../accounts/account-resolution.js\";\n\nexport async function runAccountUseCommand(\n context: AppContext,\n argv: string[],\n): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"account_use\",\n sink: context.logging.sink,\n });\n\n if (argv.includes(\"--help\")) {\n context.io.stdout.write(`${buildAccountUseHelpText()}\\n`);\n logger.info(\"help.rendered\");\n return 0;\n }\n\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n const accounts = await registry.listAccounts();\n\n if (accounts.length === 0) {\n context.io.stdout.write(\n [\n \"No accounts configured.\",\n \"Add one with: codexes account add <label>\",\n ].join(\"\\n\") + \"\\n\",\n );\n logger.info(\"command.empty\");\n return 0;\n }\n\n const selector = argv[0]?.trim() ?? null;\n if (argv.length > 1) {\n throw new Error(buildAccountUseHelpText());\n }\n\n let targetAccount = null;\n if (!selector) {\n if (accounts.length === 1) {\n const [singleAccount] = accounts;\n if (!singleAccount) {\n throw new Error(\"No accounts configured.\");\n }\n targetAccount = singleAccount;\n logger.info(\"command.single_account_default\", {\n resolvedAccountId: targetAccount.id,\n label: targetAccount.label,\n });\n } else {\n throw new Error(\n \"Multiple accounts exist. Specify which one to use: codexes account use <account-id-or-label>\",\n );\n }\n } else {\n targetAccount = resolveAccountBySelector({ accounts, logger, selector });\n }\n\n if (!targetAccount) {\n throw new Error(\"Could not resolve the account to use.\");\n }\n\n logger.info(\"command.start\", {\n requestedSelector: selector,\n resolvedAccountId: targetAccount.id,\n label: targetAccount.label,\n });\n\n const selectedAccount = await registry.selectAccount(targetAccount.id);\n\n context.io.stdout.write(\n `Using account \"${selectedAccount.label}\" (${selectedAccount.id}) as the default.\\n`,\n );\n logger.info(\"command.complete\", {\n requestedSelector: selector,\n resolvedAccountId: selectedAccount.id,\n });\n\n return 0;\n}\n\nfunction buildAccountUseHelpText(): string {\n return [\n \"Usage:\",\n \" codexes account use <account-id-or-label>\",\n \" codexes account use\",\n \"\",\n \"When only one account exists, `codexes account use` selects it automatically.\",\n ].join(\"\\n\");\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport type { Logger } from \"../../logging/logger.js\";\n\nconst DEFAULT_WAIT_TIMEOUT_MS = 15_000;\nconst DEFAULT_STALE_LOCK_MS = 5 * 60 * 1000;\nconst DEFAULT_POLL_INTERVAL_MS = 250;\n\nexport interface RuntimeLock {\n release(): Promise<void>;\n}\n\nexport async function acquireRuntimeLock(input: {\n logger: Logger;\n runtimeRoot: string;\n pollIntervalMs?: number;\n staleLockMs?: number;\n waitTimeoutMs?: number;\n}): Promise<RuntimeLock> {\n const lockRoot = path.join(input.runtimeRoot, \"lock\");\n const ownerFile = path.join(lockRoot, \"owner.json\");\n const waitTimeoutMs = input.waitTimeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS;\n const staleLockMs = input.staleLockMs ?? DEFAULT_STALE_LOCK_MS;\n const pollIntervalMs = input.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const startedAt = Date.now();\n\n input.logger.info(\"runtime_lock.acquire.start\", {\n lockRoot,\n waitTimeoutMs,\n staleLockMs,\n pollIntervalMs,\n });\n\n while (true) {\n try {\n await mkdir(lockRoot);\n const owner = {\n pid: process.pid,\n host: os.hostname(),\n createdAt: new Date().toISOString(),\n };\n await writeFile(ownerFile, JSON.stringify(owner, null, 2), \"utf8\");\n\n input.logger.info(\"runtime_lock.acquire.complete\", {\n lockRoot,\n waitedMs: Date.now() - startedAt,\n owner,\n });\n\n return {\n async release() {\n input.logger.info(\"runtime_lock.release.start\", { lockRoot });\n await rm(lockRoot, { force: true, recursive: true }).catch(() => undefined);\n input.logger.info(\"runtime_lock.release.complete\", { lockRoot });\n },\n };\n } catch (error) {\n if (!isAlreadyExistsError(error)) {\n input.logger.error(\"runtime_lock.acquire.failed\", {\n lockRoot,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n const lockAgeMs = await readLockAgeMs(lockRoot, ownerFile);\n if (lockAgeMs !== null && lockAgeMs > staleLockMs) {\n input.logger.warn(\"runtime_lock.stale_detected\", {\n lockRoot,\n lockAgeMs,\n });\n await rm(lockRoot, { force: true, recursive: true }).catch(() => undefined);\n continue;\n }\n\n const waitedMs = Date.now() - startedAt;\n input.logger.debug(\"runtime_lock.acquire.waiting\", {\n lockRoot,\n waitedMs,\n lockAgeMs,\n });\n\n if (waitedMs >= waitTimeoutMs) {\n input.logger.error(\"runtime_lock.acquire.timeout\", {\n lockRoot,\n waitedMs,\n lockAgeMs,\n });\n throw new Error(\n `Timed out waiting for the shared runtime lock after ${waitTimeoutMs}ms.`,\n );\n }\n\n await sleep(pollIntervalMs);\n }\n}\n\nasync function readLockAgeMs(lockRoot: string, ownerFile: string): Promise<number | null> {\n const ownerContents = await readFile(ownerFile, \"utf8\").catch(() => null);\n if (ownerContents) {\n const parsed = JSON.parse(ownerContents) as Record<string, unknown>;\n if (typeof parsed.createdAt === \"string\") {\n return Date.now() - new Date(parsed.createdAt).getTime();\n }\n }\n\n const lockStats = await stat(lockRoot).catch(() => null);\n return lockStats ? Date.now() - lockStats.mtimeMs : null;\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"EEXIST\"\n );\n}\n\nfunction sleep(durationMs: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, durationMs);\n });\n}\n", "import { copyFile, cp, mkdir, readFile, rm, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport type { AccountRecord } from \"../../accounts/account-registry.js\";\nimport type { Logger } from \"../../logging/logger.js\";\nimport type { RuntimeContract, RuntimeFileRule } from \"../runtime-contract.js\";\nimport { resolveAccountRuntimePaths } from \"../runtime-contract.js\";\n\nexport interface ActivatedAccountSession {\n account: AccountRecord;\n backupRoot: string;\n runtimeContract: RuntimeContract;\n sharedCodexHome: string;\n sourceAccountStateRoot: string;\n}\n\nexport async function activateAccountIntoSharedRuntime(input: {\n account: AccountRecord;\n logger: Logger;\n runtimeContract: RuntimeContract;\n sharedCodexHome: string;\n}): Promise<ActivatedAccountSession> {\n const runtimePaths = resolveAccountRuntimePaths(input.runtimeContract, input.account.id);\n const accountStateRoot = runtimePaths.accountStateDirectory;\n const backupRoot = path.join(runtimePaths.runtimeBackupDirectory, \"active\");\n\n input.logger.info(\"account_activation.start\", {\n accountId: input.account.id,\n label: input.account.label,\n accountStateRoot,\n sharedCodexHome: input.sharedCodexHome,\n backupRoot,\n });\n\n await rm(backupRoot, { force: true, recursive: true }).catch(() => undefined);\n await mkdir(backupRoot, { recursive: true });\n\n const accountRules = input.runtimeContract.fileRules.filter(\n (rule) => rule.classification === \"account\",\n );\n const authSourcePath = path.join(accountStateRoot, \"auth.json\");\n if (!(await pathExists(authSourcePath))) {\n input.logger.error(\"account_activation.missing_auth\", {\n accountId: input.account.id,\n authSourcePath,\n });\n throw new Error(\n `Account \"${input.account.label}\" has no stored auth.json; add the account again.`,\n );\n }\n\n try {\n for (const rule of accountRules) {\n await backupRuntimeArtifact({\n backupRoot,\n logger: input.logger,\n rule,\n sharedCodexHome: input.sharedCodexHome,\n });\n await replaceRuntimeArtifact({\n accountStateRoot,\n logger: input.logger,\n rule,\n sharedCodexHome: input.sharedCodexHome,\n });\n }\n } catch (error) {\n input.logger.error(\"account_activation.failed\", {\n accountId: input.account.id,\n message: error instanceof Error ? error.message : String(error),\n });\n await restoreSharedRuntimeFromBackup({\n account: input.account,\n backupRoot,\n logger: input.logger,\n runtimeContract: input.runtimeContract,\n sharedCodexHome: input.sharedCodexHome,\n });\n throw error;\n }\n\n input.logger.info(\"account_activation.complete\", {\n accountId: input.account.id,\n sharedCodexHome: input.sharedCodexHome,\n });\n\n return {\n account: input.account,\n backupRoot,\n runtimeContract: input.runtimeContract,\n sharedCodexHome: input.sharedCodexHome,\n sourceAccountStateRoot: accountStateRoot,\n };\n}\n\nexport async function syncSharedRuntimeBackToAccount(input: {\n logger: Logger;\n session: ActivatedAccountSession;\n}): Promise<void> {\n const accountRules = input.session.runtimeContract.fileRules.filter(\n (rule) => rule.classification === \"account\",\n );\n\n input.logger.info(\"account_sync.start\", {\n accountId: input.session.account.id,\n sharedCodexHome: input.session.sharedCodexHome,\n accountStateRoot: input.session.sourceAccountStateRoot,\n });\n\n for (const rule of accountRules) {\n await syncRuntimeArtifact({\n accountStateRoot: input.session.sourceAccountStateRoot,\n logger: input.logger,\n rule,\n sharedCodexHome: input.session.sharedCodexHome,\n });\n }\n\n input.logger.info(\"account_sync.complete\", {\n accountId: input.session.account.id,\n });\n}\n\nexport async function restoreSharedRuntimeFromBackup(input: {\n account: AccountRecord;\n backupRoot: string;\n logger: Logger;\n runtimeContract: RuntimeContract;\n sharedCodexHome: string;\n}): Promise<void> {\n const accountRules = input.runtimeContract.fileRules.filter(\n (rule) => rule.classification === \"account\",\n );\n\n input.logger.warn(\"account_activation.restore.start\", {\n accountId: input.account.id,\n backupRoot: input.backupRoot,\n sharedCodexHome: input.sharedCodexHome,\n });\n\n for (const rule of accountRules) {\n await restoreRuntimeArtifact({\n backupRoot: input.backupRoot,\n logger: input.logger,\n rule,\n sharedCodexHome: input.sharedCodexHome,\n });\n }\n\n input.logger.warn(\"account_activation.restore.complete\", {\n accountId: input.account.id,\n });\n}\n\nasync function backupRuntimeArtifact(input: {\n backupRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.sharedCodexHome, normalizedPattern(input.rule.pathPattern));\n const backupPath = path.join(input.backupRoot, normalizedPattern(input.rule.pathPattern));\n\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"account_activation.backup.skip\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n await mkdir(path.dirname(backupPath), { recursive: true });\n if (isDirectoryPattern(input.rule)) {\n await cp(sourcePath, backupPath, { recursive: true });\n } else {\n await copyFile(sourcePath, backupPath);\n }\n\n input.logger.debug(\"account_activation.backup.complete\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n backupPath,\n });\n}\n\nasync function replaceRuntimeArtifact(input: {\n accountStateRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.accountStateRoot, normalizedPattern(input.rule.pathPattern));\n const targetPath = path.join(input.sharedCodexHome, normalizedPattern(input.rule.pathPattern));\n\n await rm(targetPath, { force: true, recursive: true }).catch(() => undefined);\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"account_activation.replace.skip\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n await mkdir(path.dirname(targetPath), { recursive: true });\n if (isDirectoryPattern(input.rule)) {\n await cp(sourcePath, targetPath, { recursive: true });\n } else {\n await copyFile(sourcePath, targetPath);\n }\n\n input.logger.debug(\"account_activation.replace.complete\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n targetPath,\n });\n}\n\nasync function syncRuntimeArtifact(input: {\n accountStateRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sharedCodexHome: string;\n}): Promise<void> {\n const sourcePath = path.join(input.sharedCodexHome, normalizedPattern(input.rule.pathPattern));\n const targetPath = path.join(input.accountStateRoot, normalizedPattern(input.rule.pathPattern));\n\n if (!(await pathExists(sourcePath))) {\n input.logger.debug(\"account_sync.skip\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n reason: \"missing\",\n });\n return;\n }\n\n const changed = await hasArtifactChanged(sourcePath, targetPath, isDirectoryPattern(input.rule));\n if (!changed) {\n input.logger.debug(\"account_sync.no_change\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n targetPath,\n });\n return;\n }\n\n await rm(targetPath, { force: true, recursive: true }).catch(() => undefined);\n await mkdir(path.dirname(targetPath), { recursive: true });\n if (isDirectoryPattern(input.rule)) {\n await cp(sourcePath, targetPath, { recursive: true });\n } else {\n await copyFile(sourcePath, targetPath);\n }\n\n input.logger.info(\"account_sync.updated\", {\n pathPattern: input.rule.pathPattern,\n sourcePath,\n targetPath,\n });\n}\n\nasync function restoreRuntimeArtifact(input: {\n backupRoot: string;\n logger: Logger;\n rule: RuntimeFileRule;\n sharedCodexHome: string;\n}): Promise<void> {\n const backupPath = path.join(input.backupRoot, normalizedPattern(input.rule.pathPattern));\n const targetPath = path.join(input.sharedCodexHome, normalizedPattern(input.rule.pathPattern));\n\n await rm(targetPath, { force: true, recursive: true }).catch(() => undefined);\n\n if (!(await pathExists(backupPath))) {\n input.logger.debug(\"account_activation.restore.skip\", {\n pathPattern: input.rule.pathPattern,\n backupPath,\n reason: \"missing\",\n });\n return;\n }\n\n await mkdir(path.dirname(targetPath), { recursive: true });\n if (isDirectoryPattern(input.rule)) {\n await cp(backupPath, targetPath, { recursive: true });\n } else {\n await copyFile(backupPath, targetPath);\n }\n\n input.logger.debug(\"account_activation.restore.complete_artifact\", {\n pathPattern: input.rule.pathPattern,\n backupPath,\n targetPath,\n });\n}\n\nfunction isDirectoryPattern(rule: RuntimeFileRule): boolean {\n return rule.pathPattern.endsWith(\"/**\");\n}\n\nfunction normalizedPattern(pattern: string): string {\n return pattern.endsWith(\"/**\") ? pattern.slice(0, -3) : pattern;\n}\n\nasync function hasArtifactChanged(\n sourcePath: string,\n targetPath: string,\n isDirectory: boolean,\n): Promise<boolean> {\n if (!(await pathExists(targetPath))) {\n return true;\n }\n\n if (isDirectory) {\n const [sourceHash, targetHash] = await Promise.all([\n hashDirectory(sourcePath),\n hashDirectory(targetPath),\n ]);\n return sourceHash !== targetHash;\n }\n\n const [sourceHash, targetHash] = await Promise.all([\n hashFile(sourcePath),\n hashFile(targetPath),\n ]);\n return sourceHash !== targetHash;\n}\n\nasync function hashFile(filePath: string): Promise<string> {\n const content = await readFile(filePath);\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nasync function hashDirectory(directoryPath: string): Promise<string> {\n const entries = await collectFiles(directoryPath);\n const hash = createHash(\"sha256\");\n\n for (const entry of entries.sort()) {\n hash.update(entry.relativePath);\n hash.update(await readFile(entry.absolutePath));\n }\n\n return hash.digest(\"hex\");\n}\n\nasync function collectFiles(root: string): Promise<Array<{ absolutePath: string; relativePath: string }>> {\n const rootStats = await stat(root).catch(() => null);\n if (!rootStats) {\n return [];\n }\n\n if (!rootStats.isDirectory()) {\n return [{ absolutePath: root, relativePath: path.basename(root) }];\n }\n\n const results: Array<{ absolutePath: string; relativePath: string }> = [];\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) {\n continue;\n }\n\n const entries = await import(\"node:fs/promises\").then((fs) =>\n fs.readdir(current, { withFileTypes: true }),\n );\n for (const entry of entries) {\n const absolutePath = path.join(current, entry.name);\n if (entry.isDirectory()) {\n stack.push(absolutePath);\n continue;\n }\n\n if (entry.isFile()) {\n results.push({\n absolutePath,\n relativePath: path.relative(root, absolutePath).split(path.sep).join(\"/\"),\n });\n }\n }\n }\n\n return results;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n\n throw error;\n }\n}\n", "import { spawn } from \"node:child_process\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { resolveCodexLaunchSpec } from \"./codex-launch-spec.js\";\n\nexport async function spawnCodexCommand(input: {\n argv: string[];\n codexBinaryPath: string;\n codexHome: string;\n logger: Logger;\n}): Promise<number> {\n const launchSpec = await resolveCodexLaunchSpec(input.codexBinaryPath, input.argv);\n\n input.logger.info(\"spawn_codex.start\", {\n codexBinaryPath: input.codexBinaryPath,\n resolvedCommand: launchSpec.command,\n codexHome: input.codexHome,\n argv: launchSpec.args,\n stdinIsTTY: process.stdin.isTTY ?? false,\n stdoutIsTTY: process.stdout.isTTY ?? false,\n stderrIsTTY: process.stderr.isTTY ?? false,\n });\n\n return new Promise((resolve, reject) => {\n const child = spawn(launchSpec.command, launchSpec.args, {\n env: {\n ...process.env,\n CODEX_HOME: input.codexHome,\n },\n shell: false,\n stdio: \"inherit\",\n windowsHide: false,\n });\n let settled = false;\n\n const forwardSignal = (signal: NodeJS.Signals) => {\n input.logger.warn(\"spawn_codex.parent_signal\", {\n signal,\n pid: child.pid ?? null,\n });\n child.kill(signal);\n };\n\n const signalHandlers = {\n SIGINT: () => forwardSignal(\"SIGINT\"),\n SIGTERM: () => forwardSignal(\"SIGTERM\"),\n } satisfies Partial<Record<NodeJS.Signals, () => void>>;\n\n process.on(\"SIGINT\", signalHandlers.SIGINT);\n process.on(\"SIGTERM\", signalHandlers.SIGTERM);\n\n const cleanup = () => {\n process.off(\"SIGINT\", signalHandlers.SIGINT);\n process.off(\"SIGTERM\", signalHandlers.SIGTERM);\n };\n\n child.on(\"error\", (error) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n input.logger.error(\"spawn_codex.error\", {\n codexBinaryPath: input.codexBinaryPath,\n message: error.message,\n });\n reject(error);\n });\n\n child.on(\"exit\", (exitCode, signal) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n input.logger.info(\"spawn_codex.complete\", {\n codexBinaryPath: input.codexBinaryPath,\n exitCode,\n signal,\n });\n resolve(exitCode ?? 1);\n });\n });\n}\n", "import { createLogger } from \"../../logging/logger.js\";\nimport type { AppContext } from \"../../core/context.js\";\nimport { createAccountRegistry } from \"../../accounts/account-registry.js\";\nimport {\n createRuntimeContract,\n summarizeRuntimeContract,\n} from \"../../runtime/runtime-contract.js\";\nimport { runAccountAddCommand } from \"../account-add/run-account-add-command.js\";\nimport { runAccountListCommand } from \"../account-list/run-account-list-command.js\";\nimport { runAccountRemoveCommand } from \"../account-remove/run-account-remove-command.js\";\nimport { runAccountUseCommand } from \"../account-use/run-account-use-command.js\";\nimport { acquireRuntimeLock } from \"../../runtime/lock/runtime-lock.js\";\nimport {\n activateAccountIntoSharedRuntime,\n restoreSharedRuntimeFromBackup,\n syncSharedRuntimeBackToAccount,\n} from \"../../runtime/activate-account/activate-account.js\";\nimport { spawnCodexCommand } from \"../../process/spawn-codex-command.js\";\nimport { formatSelectionSummary } from \"../../selection/format-selection-summary.js\";\nimport { resolveSelectionSummary } from \"../../selection/selection-summary.js\";\n\nexport async function runRootCommand(context: AppContext): Promise<number> {\n const logger = createLogger({\n level: context.logging.level,\n name: \"root\",\n sink: context.logging.sink,\n });\n\n logger.debug(\"argv.received\", { argv: context.argv });\n logger.debug(\"runtime.detected\", {\n sharedCodexHome: context.paths.sharedCodexHome,\n accountRoot: context.paths.accountRoot,\n runtimeRoot: context.paths.runtimeRoot,\n registryFile: context.paths.registryFile,\n wrapperConfigFile: context.paths.wrapperConfigFile,\n selectionCacheFile: context.paths.selectionCacheFile,\n firstRun: context.runtimeInitialization.firstRun,\n copiedSharedArtifacts: context.runtimeInitialization.copiedSharedArtifacts,\n createdRuntimeFiles: context.runtimeInitialization.createdFiles,\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n accountSelectionStrategy: context.wrapperConfig.accountSelectionStrategy,\n accountSelectionStrategySource: context.wrapperConfig.accountSelectionStrategySource,\n experimentalSelection: context.wrapperConfig.experimentalSelection,\n codexBinaryPath: context.codexBinary.path,\n recursionGuardSource: context.executablePath,\n });\n\n const runtimeContract = createRuntimeContract({\n accountRoot: context.paths.accountRoot,\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n logger,\n runtimeRoot: context.paths.runtimeRoot,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n const runtimeSummary = summarizeRuntimeContract(runtimeContract);\n\n logger.debug(\"runtime.contract_ready\", runtimeSummary);\n\n if (context.wrapperConfig.credentialStoreMode !== \"file\") {\n logger.warn(\"credential_store.unsupported\", {\n credentialStoreMode: context.wrapperConfig.credentialStoreMode,\n codexConfigFile: context.paths.codexConfigFile,\n reason: context.wrapperConfig.credentialStorePolicyReason,\n });\n }\n\n if (context.argv[0] === \"account\" && context.argv[1] === \"add\") {\n logger.info(\"command.dispatch\", {\n command: \"account add\",\n argv: context.argv.slice(2),\n });\n return runAccountAddCommand(context, context.argv.slice(2));\n }\n\n if (context.argv[0] === \"account\" && context.argv[1] === \"list\") {\n logger.info(\"command.dispatch\", {\n command: \"account list\",\n argv: context.argv.slice(2),\n });\n return runAccountListCommand(context);\n }\n\n if (context.argv[0] === \"account\" && context.argv[1] === \"remove\") {\n logger.info(\"command.dispatch\", {\n command: \"account remove\",\n argv: context.argv.slice(2),\n });\n return runAccountRemoveCommand(context, context.argv.slice(2));\n }\n\n if (context.argv[0] === \"account\" && context.argv[1] === \"use\") {\n logger.info(\"command.dispatch\", {\n command: \"account use\",\n argv: context.argv.slice(2),\n });\n return runAccountUseCommand(context, context.argv.slice(2));\n }\n\n if (context.argv.includes(\"--help\")) {\n context.io.stdout.write(`${buildHelpText()}\\n`);\n logger.info(\"help.rendered\");\n\n return 0;\n }\n\n if (!context.codexBinary.path) {\n logger.error(\"command.binary_missing\", {\n candidates: context.codexBinary.candidates,\n rejectedCandidates: context.codexBinary.rejectedCandidates,\n });\n throw new Error(\"Could not find the real `codex` binary on PATH.\");\n }\n\n const registry = createAccountRegistry({\n accountRoot: context.paths.accountRoot,\n logger,\n registryFile: context.paths.registryFile,\n });\n logger.info(\"selection.strategy_active\", {\n strategy: context.wrapperConfig.accountSelectionStrategy,\n source: context.wrapperConfig.accountSelectionStrategySource,\n });\n\n if (\n context.wrapperConfig.accountSelectionStrategy === \"remaining-limit\" ||\n context.wrapperConfig.accountSelectionStrategy === \"remaining-limit-experimental\"\n ) {\n logger.info(\"selection.experimental_enabled\", {\n endpoint: \"https://chatgpt.com/backend-api/wham/usage\",\n fallbackStrategy: \"manual-default\",\n timeoutMs: context.wrapperConfig.experimentalSelection.probeTimeoutMs,\n cacheTtlMs: context.wrapperConfig.experimentalSelection.cacheTtlMs,\n useAccountIdHeader: context.wrapperConfig.experimentalSelection.useAccountIdHeader,\n source: context.wrapperConfig.accountSelectionStrategySource,\n });\n }\n const selectionSummary = await resolveSelectionSummary({\n experimentalSelection: context.wrapperConfig.experimentalSelection,\n fetchImpl: fetch,\n logger,\n mode: \"execution\",\n registry,\n selectionCacheFilePath: context.paths.selectionCacheFile,\n strategy: context.wrapperConfig.accountSelectionStrategy,\n });\n const activeAccount = selectionSummary.selectedAccount;\n if (!activeAccount || !selectionSummary.selectedBy) {\n logger.error(\"selection.execution_summary_incomplete\", {\n strategy: selectionSummary.strategy,\n fallbackReason: selectionSummary.fallbackReason,\n executionBlockedReason: selectionSummary.executionBlockedReason,\n });\n throw new Error(\n selectionSummary.executionBlockedReason ?? \"Execution selection did not resolve an account.\",\n );\n }\n const formattedSummary = formatSelectionSummary({\n capabilities: {\n stdoutIsTTY: context.output.stdoutIsTTY,\n useColor: context.output.stdoutIsTTY,\n },\n logger,\n summary: selectionSummary,\n });\n context.io.stdout.write(formattedSummary);\n logger.info(\"summary_rendered\", {\n mode: selectionSummary.mode,\n strategy: selectionSummary.strategy,\n useColor: context.output.stdoutIsTTY,\n selectedAccountId: activeAccount.id,\n fallbackReason: selectionSummary.fallbackReason,\n executionBlockedReason: selectionSummary.executionBlockedReason,\n });\n logger.info(\"selected_account_announced\", {\n accountId: activeAccount.id,\n label: activeAccount.label,\n selectedBy: selectionSummary.selectedBy,\n });\n if (selectionSummary.fallbackReason) {\n logger.warn(\"fallback_announced\", {\n fallbackReason: selectionSummary.fallbackReason,\n selectedAccountId: activeAccount.id,\n });\n }\n const lock = await acquireRuntimeLock({\n logger,\n runtimeRoot: context.paths.runtimeRoot,\n });\n\n try {\n const activation = await activateAccountIntoSharedRuntime({\n account: activeAccount,\n logger,\n runtimeContract,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n\n try {\n const exitCode = await spawnCodexCommand({\n argv: context.argv,\n codexBinaryPath: context.codexBinary.path,\n codexHome: context.paths.sharedCodexHome,\n logger,\n });\n\n await syncSharedRuntimeBackToAccount({\n logger,\n session: activation,\n });\n\n return exitCode;\n } catch (error) {\n await restoreSharedRuntimeFromBackup({\n account: activeAccount,\n backupRoot: activation.backupRoot,\n logger,\n runtimeContract,\n sharedCodexHome: context.paths.sharedCodexHome,\n });\n throw error;\n }\n } finally {\n await lock.release();\n }\n}\n\nfunction buildHelpText(): string {\n return [\n \"codexes\",\n \"\",\n \"Transparent multi-account wrapper around the Codex CLI.\",\n \"\",\n \"Usage:\",\n \" codexes [args...]\",\n \" codexes account add <label> [--timeout-ms <milliseconds>]\",\n \" codexes account list\",\n \" codexes account use <account-id-or-label>\",\n \" codexes account remove <account-id-or-label>\",\n \"\",\n \"Runtime model:\",\n \" Shared CODEX_HOME is preserved in a wrapper-owned runtime root.\",\n \" Account auth state is stored per account and synced back selectively.\",\n \"\",\n \"Current status:\",\n \" Account management and default Codex passthrough are implemented.\",\n \" Default selection strategy: remaining-limit.\",\n \" Available overrides: manual-default, single-account, remaining-limit.\",\n \" Legacy compatibility override: remaining-limit-experimental.\",\n \" Remaining-limit mode probes https://chatgpt.com/backend-api/wham/usage and falls back to manual-default when ranking is unreliable.\",\n ].join(\"\\n\");\n}\n", "import { buildAppContext } from \"./context.js\";\nimport { createLogger } from \"../logging/logger.js\";\nimport { runRootCommand } from \"../commands/root/run-root-command.js\";\n\nexport interface BootstrapIo {\n cwd: string;\n env: NodeJS.ProcessEnv;\n executablePath: string;\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n}\n\nexport async function runCli(argv: string[], io: BootstrapIo): Promise<number> {\n const context = await buildAppContext(argv, io);\n const logger = createLogger({\n level: context.logging.level,\n name: \"bootstrap\",\n sink: context.logging.sink,\n });\n\n logger.debug(\"bootstrap.start\", {\n argv,\n cwd: context.environment.cwd,\n platform: context.environment.platform,\n runtime: context.environment.runtime,\n });\n\n try {\n const exitCode = await runRootCommand(context);\n\n logger.debug(\"bootstrap.exit\", { exitCode });\n\n return exitCode;\n } catch (error) {\n const normalized = error instanceof Error ? error : new Error(String(error));\n\n logger.error(\"bootstrap.fatal\", {\n message: normalized.message,\n stack: normalized.stack,\n });\n\n context.io.stderr.write(`codexes: ${normalized.message}\\n`);\n\n return 1;\n }\n}\n", "import { runCli } from \"./core/bootstrap.js\";\n\nconst exitCode = await runCli(process.argv.slice(2), {\n cwd: process.cwd(),\n env: process.env,\n executablePath: process.argv[1] ?? process.execPath,\n stderr: process.stderr,\n stdout: process.stdout,\n});\n\nprocess.exit(exitCode);\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "os", "path", "mkdir", "readFile", "stat", "writeFile", "mkdir", "readFile", "stat", "path", "emptyDocument", "path", "os", "mkdir", "readFile", "detectCredentialStoreMode", "writeFile", "stat", "path", "mkdir", "readFile", "rm", "writeFile", "path", "copyFile", "cp", "mkdir", "readFile", "stat", "writeFile", "path", "pinFileCredentialStore", "pathExists", "access", "path", "pathExists", "exitCode", "mkdir", "path", "readFile", "writeFile", "rm", "readFile", "path", "isRecord", "isRecord", "mkdir", "readFile", "rename", "writeFile", "path", "isNodeErrorWithCode", "isRecord", "rm", "rm", "os", "path", "mkdir", "readFile", "rm", "stat", "writeFile", "copyFile", "cp", "mkdir", "readFile", "rm", "stat", "path", "path", "rm", "mkdir", "pathExists", "cp", "copyFile", "sourceHash", "targetHash", "readFile", "stat", "spawn", "spawn", "exitCode", "exitCode", "exitCode"]
7
7
  }