@mostok/codexes 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +88 -0
  3. package/dist/accounts/account-registry.d.ts +30 -0
  4. package/dist/accounts/account-registry.js +263 -0
  5. package/dist/accounts/account-registry.js.map +1 -0
  6. package/dist/accounts/account-resolution.d.ts +16 -0
  7. package/dist/accounts/account-resolution.js +71 -0
  8. package/dist/accounts/account-resolution.js.map +1 -0
  9. package/dist/accounts/resolve-active-account.d.ts +6 -0
  10. package/dist/accounts/resolve-active-account.js +32 -0
  11. package/dist/accounts/resolve-active-account.js.map +1 -0
  12. package/dist/cli.d.ts +1 -0
  13. package/dist/cli.js +3426 -0
  14. package/dist/cli.js.map +7 -0
  15. package/dist/commands/account-add/run-account-add-command.d.ts +2 -0
  16. package/dist/commands/account-add/run-account-add-command.js +296 -0
  17. package/dist/commands/account-add/run-account-add-command.js.map +1 -0
  18. package/dist/commands/account-list/run-account-list-command.d.ts +2 -0
  19. package/dist/commands/account-list/run-account-list-command.js +48 -0
  20. package/dist/commands/account-list/run-account-list-command.js.map +1 -0
  21. package/dist/commands/account-remove/run-account-remove-command.d.ts +2 -0
  22. package/dist/commands/account-remove/run-account-remove-command.js +52 -0
  23. package/dist/commands/account-remove/run-account-remove-command.js.map +1 -0
  24. package/dist/commands/account-use/run-account-use-command.d.ts +2 -0
  25. package/dist/commands/account-use/run-account-use-command.js +78 -0
  26. package/dist/commands/account-use/run-account-use-command.js.map +1 -0
  27. package/dist/commands/root/run-root-command.d.ts +2 -0
  28. package/dist/commands/root/run-root-command.js +175 -0
  29. package/dist/commands/root/run-root-command.js.map +1 -0
  30. package/dist/config/wrapper-config.d.ts +24 -0
  31. package/dist/config/wrapper-config.js +145 -0
  32. package/dist/config/wrapper-config.js.map +1 -0
  33. package/dist/core/bootstrap.d.ts +8 -0
  34. package/dist/core/bootstrap.js +32 -0
  35. package/dist/core/bootstrap.js.map +1 -0
  36. package/dist/core/context.d.ts +33 -0
  37. package/dist/core/context.js +72 -0
  38. package/dist/core/context.js.map +1 -0
  39. package/dist/core/paths.d.ts +12 -0
  40. package/dist/core/paths.js +30 -0
  41. package/dist/core/paths.js.map +1 -0
  42. package/dist/logging/logger.d.ts +18 -0
  43. package/dist/logging/logger.js +56 -0
  44. package/dist/logging/logger.js.map +1 -0
  45. package/dist/process/codex-launch-spec.d.ts +5 -0
  46. package/dist/process/codex-launch-spec.js +80 -0
  47. package/dist/process/codex-launch-spec.js.map +1 -0
  48. package/dist/process/find-codex-binary.d.ts +14 -0
  49. package/dist/process/find-codex-binary.js +73 -0
  50. package/dist/process/find-codex-binary.js.map +1 -0
  51. package/dist/process/run-codex-login.d.ts +14 -0
  52. package/dist/process/run-codex-login.js +97 -0
  53. package/dist/process/run-codex-login.js.map +1 -0
  54. package/dist/process/spawn-codex-command.d.ts +7 -0
  55. package/dist/process/spawn-codex-command.js +69 -0
  56. package/dist/process/spawn-codex-command.js.map +1 -0
  57. package/dist/runtime/activate-account/activate-account.d.ts +27 -0
  58. package/dist/runtime/activate-account/activate-account.js +298 -0
  59. package/dist/runtime/activate-account/activate-account.js.map +1 -0
  60. package/dist/runtime/auth-state-probe.d.ts +57 -0
  61. package/dist/runtime/auth-state-probe.js +394 -0
  62. package/dist/runtime/auth-state-probe.js.map +1 -0
  63. package/dist/runtime/init/initialize-runtime.d.ts +19 -0
  64. package/dist/runtime/init/initialize-runtime.js +275 -0
  65. package/dist/runtime/init/initialize-runtime.js.map +1 -0
  66. package/dist/runtime/lock/runtime-lock.d.ts +11 -0
  67. package/dist/runtime/lock/runtime-lock.js +99 -0
  68. package/dist/runtime/lock/runtime-lock.js.map +1 -0
  69. package/dist/runtime/login-workspace.d.ts +18 -0
  70. package/dist/runtime/login-workspace.js +171 -0
  71. package/dist/runtime/login-workspace.js.map +1 -0
  72. package/dist/runtime/runtime-contract.d.ts +44 -0
  73. package/dist/runtime/runtime-contract.js +79 -0
  74. package/dist/runtime/runtime-contract.js.map +1 -0
  75. package/dist/selection/account-auth-state.d.ts +23 -0
  76. package/dist/selection/account-auth-state.js +132 -0
  77. package/dist/selection/account-auth-state.js.map +1 -0
  78. package/dist/selection/select-account.d.ts +11 -0
  79. package/dist/selection/select-account.js +168 -0
  80. package/dist/selection/select-account.js.map +1 -0
  81. package/dist/selection/usage-cache.d.ts +24 -0
  82. package/dist/selection/usage-cache.js +106 -0
  83. package/dist/selection/usage-cache.js.map +1 -0
  84. package/dist/selection/usage-client.d.ts +23 -0
  85. package/dist/selection/usage-client.js +143 -0
  86. package/dist/selection/usage-client.js.map +1 -0
  87. package/dist/selection/usage-normalize.d.ts +7 -0
  88. package/dist/selection/usage-normalize.js +209 -0
  89. package/dist/selection/usage-normalize.js.map +1 -0
  90. package/dist/selection/usage-probe-coordinator.d.ts +18 -0
  91. package/dist/selection/usage-probe-coordinator.js +69 -0
  92. package/dist/selection/usage-probe-coordinator.js.map +1 -0
  93. package/dist/selection/usage-types.d.ts +59 -0
  94. package/dist/selection/usage-types.js +2 -0
  95. package/dist/selection/usage-types.js.map +1 -0
  96. package/package.json +59 -0
@@ -0,0 +1,175 @@
1
+ import { createLogger } from "../../logging/logger.js";
2
+ import { createAccountRegistry } from "../../accounts/account-registry.js";
3
+ import { createRuntimeContract, summarizeRuntimeContract, } from "../../runtime/runtime-contract.js";
4
+ import { runAccountAddCommand } from "../account-add/run-account-add-command.js";
5
+ import { runAccountListCommand } from "../account-list/run-account-list-command.js";
6
+ import { runAccountRemoveCommand } from "../account-remove/run-account-remove-command.js";
7
+ import { runAccountUseCommand } from "../account-use/run-account-use-command.js";
8
+ import { acquireRuntimeLock } from "../../runtime/lock/runtime-lock.js";
9
+ import { activateAccountIntoSharedRuntime, restoreSharedRuntimeFromBackup, syncSharedRuntimeBackToAccount, } from "../../runtime/activate-account/activate-account.js";
10
+ import { spawnCodexCommand } from "../../process/spawn-codex-command.js";
11
+ import { selectAccountForExecution } from "../../selection/select-account.js";
12
+ export async function runRootCommand(context) {
13
+ const logger = createLogger({
14
+ level: context.logging.level,
15
+ name: "root",
16
+ sink: context.logging.sink,
17
+ });
18
+ logger.debug("argv.received", { argv: context.argv });
19
+ logger.debug("runtime.detected", {
20
+ sharedCodexHome: context.paths.sharedCodexHome,
21
+ accountRoot: context.paths.accountRoot,
22
+ runtimeRoot: context.paths.runtimeRoot,
23
+ registryFile: context.paths.registryFile,
24
+ wrapperConfigFile: context.paths.wrapperConfigFile,
25
+ selectionCacheFile: context.paths.selectionCacheFile,
26
+ firstRun: context.runtimeInitialization.firstRun,
27
+ copiedSharedArtifacts: context.runtimeInitialization.copiedSharedArtifacts,
28
+ createdRuntimeFiles: context.runtimeInitialization.createdFiles,
29
+ credentialStoreMode: context.wrapperConfig.credentialStoreMode,
30
+ accountSelectionStrategy: context.wrapperConfig.accountSelectionStrategy,
31
+ experimentalSelection: context.wrapperConfig.experimentalSelection,
32
+ codexBinaryPath: context.codexBinary.path,
33
+ recursionGuardSource: context.executablePath,
34
+ });
35
+ const runtimeContract = createRuntimeContract({
36
+ accountRoot: context.paths.accountRoot,
37
+ credentialStoreMode: context.wrapperConfig.credentialStoreMode,
38
+ logger,
39
+ runtimeRoot: context.paths.runtimeRoot,
40
+ sharedCodexHome: context.paths.sharedCodexHome,
41
+ });
42
+ const runtimeSummary = summarizeRuntimeContract(runtimeContract);
43
+ logger.debug("runtime.contract_ready", runtimeSummary);
44
+ if (context.wrapperConfig.credentialStoreMode !== "file") {
45
+ logger.warn("credential_store.unsupported", {
46
+ credentialStoreMode: context.wrapperConfig.credentialStoreMode,
47
+ codexConfigFile: context.paths.codexConfigFile,
48
+ reason: context.wrapperConfig.credentialStorePolicyReason,
49
+ });
50
+ }
51
+ if (context.argv[0] === "account" && context.argv[1] === "add") {
52
+ logger.info("command.dispatch", {
53
+ command: "account add",
54
+ argv: context.argv.slice(2),
55
+ });
56
+ return runAccountAddCommand(context, context.argv.slice(2));
57
+ }
58
+ if (context.argv[0] === "account" && context.argv[1] === "list") {
59
+ logger.info("command.dispatch", {
60
+ command: "account list",
61
+ argv: context.argv.slice(2),
62
+ });
63
+ return runAccountListCommand(context);
64
+ }
65
+ if (context.argv[0] === "account" && context.argv[1] === "remove") {
66
+ logger.info("command.dispatch", {
67
+ command: "account remove",
68
+ argv: context.argv.slice(2),
69
+ });
70
+ return runAccountRemoveCommand(context, context.argv.slice(2));
71
+ }
72
+ if (context.argv[0] === "account" && context.argv[1] === "use") {
73
+ logger.info("command.dispatch", {
74
+ command: "account use",
75
+ argv: context.argv.slice(2),
76
+ });
77
+ return runAccountUseCommand(context, context.argv.slice(2));
78
+ }
79
+ if (context.argv.includes("--help")) {
80
+ context.io.stdout.write(`${buildHelpText()}\n`);
81
+ logger.info("help.rendered");
82
+ return 0;
83
+ }
84
+ if (!context.codexBinary.path) {
85
+ logger.error("command.binary_missing", {
86
+ candidates: context.codexBinary.candidates,
87
+ rejectedCandidates: context.codexBinary.rejectedCandidates,
88
+ });
89
+ throw new Error("Could not find the real `codex` binary on PATH.");
90
+ }
91
+ const registry = createAccountRegistry({
92
+ accountRoot: context.paths.accountRoot,
93
+ logger,
94
+ registryFile: context.paths.registryFile,
95
+ });
96
+ if (context.wrapperConfig.accountSelectionStrategy === "remaining-limit-experimental") {
97
+ logger.warn("selection.experimental_enabled", {
98
+ endpoint: "https://chatgpt.com/backend-api/wham/usage",
99
+ fallbackStrategy: "manual-default",
100
+ timeoutMs: context.wrapperConfig.experimentalSelection.probeTimeoutMs,
101
+ cacheTtlMs: context.wrapperConfig.experimentalSelection.cacheTtlMs,
102
+ useAccountIdHeader: context.wrapperConfig.experimentalSelection.useAccountIdHeader,
103
+ });
104
+ }
105
+ const activeAccount = await selectAccountForExecution({
106
+ experimentalSelection: context.wrapperConfig.experimentalSelection,
107
+ fetchImpl: fetch,
108
+ logger,
109
+ registry,
110
+ selectionCacheFilePath: context.paths.selectionCacheFile,
111
+ strategy: context.wrapperConfig.accountSelectionStrategy,
112
+ });
113
+ const lock = await acquireRuntimeLock({
114
+ logger,
115
+ runtimeRoot: context.paths.runtimeRoot,
116
+ });
117
+ try {
118
+ const activation = await activateAccountIntoSharedRuntime({
119
+ account: activeAccount,
120
+ logger,
121
+ runtimeContract,
122
+ sharedCodexHome: context.paths.sharedCodexHome,
123
+ });
124
+ try {
125
+ const exitCode = await spawnCodexCommand({
126
+ argv: context.argv,
127
+ codexBinaryPath: context.codexBinary.path,
128
+ codexHome: context.paths.sharedCodexHome,
129
+ logger,
130
+ });
131
+ await syncSharedRuntimeBackToAccount({
132
+ logger,
133
+ session: activation,
134
+ });
135
+ return exitCode;
136
+ }
137
+ catch (error) {
138
+ await restoreSharedRuntimeFromBackup({
139
+ account: activeAccount,
140
+ backupRoot: activation.backupRoot,
141
+ logger,
142
+ runtimeContract,
143
+ sharedCodexHome: context.paths.sharedCodexHome,
144
+ });
145
+ throw error;
146
+ }
147
+ }
148
+ finally {
149
+ await lock.release();
150
+ }
151
+ }
152
+ function buildHelpText() {
153
+ return [
154
+ "codexes",
155
+ "",
156
+ "Transparent multi-account wrapper around the Codex CLI.",
157
+ "",
158
+ "Usage:",
159
+ " codexes [args...]",
160
+ " codexes account add <label> [--timeout-ms <milliseconds>]",
161
+ " codexes account list",
162
+ " codexes account use <account-id-or-label>",
163
+ " codexes account remove <account-id-or-label>",
164
+ "",
165
+ "Runtime model:",
166
+ " Shared CODEX_HOME is preserved in a wrapper-owned runtime root.",
167
+ " Account auth state is stored per account and synced back selectively.",
168
+ "",
169
+ "Current status:",
170
+ " Account management and default Codex passthrough are implemented.",
171
+ " Selection strategies: manual-default, single-account, remaining-limit-experimental.",
172
+ " Experimental mode probes https://chatgpt.com/backend-api/wham/usage and falls back to manual-default when ranking is unreliable.",
173
+ ].join("\n");
174
+ }
175
+ //# sourceMappingURL=run-root-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-root-command.js","sourceRoot":"","sources":["../../../src/commands/root/run-root-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Logger } from "../logging/logger.js";
2
+ import type { ResolvedPaths } from "../core/paths.js";
3
+ export type CredentialStoreMode = "file" | "keyring" | "auto" | "missing" | "unknown";
4
+ export type AccountSelectionStrategy = "manual-default" | "single-account" | "remaining-limit-experimental";
5
+ export interface WrapperConfig {
6
+ configFilePath: string;
7
+ codexConfigFilePath: string;
8
+ selectionCacheFilePath: string;
9
+ credentialStoreMode: CredentialStoreMode;
10
+ credentialStorePolicyReason: string;
11
+ accountSelectionStrategy: AccountSelectionStrategy;
12
+ experimentalSelection: ExperimentalSelectionConfig;
13
+ }
14
+ export interface ExperimentalSelectionConfig {
15
+ enabled: boolean;
16
+ probeTimeoutMs: number;
17
+ cacheTtlMs: number;
18
+ useAccountIdHeader: boolean;
19
+ }
20
+ export declare function resolveWrapperConfig(input: {
21
+ env: NodeJS.ProcessEnv;
22
+ logger: Logger;
23
+ paths: ResolvedPaths;
24
+ }): Promise<WrapperConfig>;
@@ -0,0 +1,145 @@
1
+ import { mkdir, readFile } from "node:fs/promises";
2
+ const DEFAULT_EXPERIMENTAL_PROBE_TIMEOUT_MS = 3_500;
3
+ const DEFAULT_EXPERIMENTAL_CACHE_TTL_MS = 60_000;
4
+ export async function resolveWrapperConfig(input) {
5
+ await mkdir(input.paths.dataRoot, { recursive: true });
6
+ const credentialStoreMode = await detectCredentialStoreMode(input.paths.codexConfigFile, input.logger);
7
+ const resolved = {
8
+ configFilePath: input.paths.wrapperConfigFile,
9
+ codexConfigFilePath: input.paths.codexConfigFile,
10
+ selectionCacheFilePath: input.paths.selectionCacheFile,
11
+ credentialStoreMode,
12
+ credentialStorePolicyReason: credentialStoreMode === "file"
13
+ ? "file mode detected in Codex config"
14
+ : "codexes currently supports only file-backed auth storage",
15
+ accountSelectionStrategy: resolveAccountSelectionStrategy(input.env),
16
+ experimentalSelection: resolveExperimentalSelectionConfig(input.env, input.logger),
17
+ };
18
+ input.logger.info("wrapper_config.resolved", {
19
+ configFilePath: resolved.configFilePath,
20
+ codexConfigFilePath: resolved.codexConfigFilePath,
21
+ selectionCacheFilePath: resolved.selectionCacheFilePath,
22
+ credentialStoreMode: resolved.credentialStoreMode,
23
+ accountSelectionStrategy: resolved.accountSelectionStrategy,
24
+ experimentalSelection: resolved.experimentalSelection,
25
+ });
26
+ return resolved;
27
+ }
28
+ function resolveExperimentalSelectionConfig(env, logger) {
29
+ const probeTimeoutMs = resolvePositiveIntegerEnv({
30
+ defaultValue: DEFAULT_EXPERIMENTAL_PROBE_TIMEOUT_MS,
31
+ env,
32
+ envKey: "CODEXES_EXPERIMENTAL_SELECTION_TIMEOUT_MS",
33
+ logger,
34
+ });
35
+ const cacheTtlMs = resolvePositiveIntegerEnv({
36
+ defaultValue: DEFAULT_EXPERIMENTAL_CACHE_TTL_MS,
37
+ env,
38
+ envKey: "CODEXES_EXPERIMENTAL_SELECTION_CACHE_TTL_MS",
39
+ logger,
40
+ });
41
+ const useAccountIdHeader = resolveBooleanEnv(env.CODEXES_EXPERIMENTAL_SELECTION_USE_ACCOUNT_ID_HEADER);
42
+ const enabled = resolveAccountSelectionStrategy(env) === "remaining-limit-experimental";
43
+ logger.debug("wrapper_config.experimental_selection_resolved", {
44
+ enabled,
45
+ probeTimeoutMs,
46
+ cacheTtlMs,
47
+ useAccountIdHeader,
48
+ });
49
+ return {
50
+ enabled,
51
+ probeTimeoutMs,
52
+ cacheTtlMs,
53
+ useAccountIdHeader,
54
+ };
55
+ }
56
+ function resolveAccountSelectionStrategy(env) {
57
+ switch (env.CODEXES_ACCOUNT_SELECTION_STRATEGY?.trim().toLowerCase()) {
58
+ case "single-account":
59
+ return "single-account";
60
+ case "remaining-limit-experimental":
61
+ return "remaining-limit-experimental";
62
+ case "manual-default":
63
+ case undefined:
64
+ case "":
65
+ return "manual-default";
66
+ default:
67
+ return "manual-default";
68
+ }
69
+ }
70
+ async function detectCredentialStoreMode(configFile, logger) {
71
+ try {
72
+ const rawConfig = await readFile(configFile, "utf8");
73
+ const mode = parseCredentialStoreMode(rawConfig);
74
+ logger.debug("credential_store.detected", {
75
+ configFile,
76
+ credentialStoreMode: mode,
77
+ });
78
+ return mode;
79
+ }
80
+ catch (error) {
81
+ if (typeof error === "object" &&
82
+ error !== null &&
83
+ "code" in error &&
84
+ error.code === "ENOENT") {
85
+ logger.warn("credential_store.config_missing", {
86
+ configFile,
87
+ fallbackMode: "missing",
88
+ });
89
+ return "missing";
90
+ }
91
+ logger.error("credential_store.read_failed", {
92
+ configFile,
93
+ message: error instanceof Error ? error.message : String(error),
94
+ });
95
+ return "unknown";
96
+ }
97
+ }
98
+ function parseCredentialStoreMode(rawConfig) {
99
+ const match = rawConfig.match(/^\s*cli_auth_credentials_store\s*=\s*"([^"]+)"/m);
100
+ if (!match) {
101
+ return "missing";
102
+ }
103
+ const configuredValue = match[1];
104
+ if (!configuredValue) {
105
+ return "unknown";
106
+ }
107
+ switch (configuredValue.trim().toLowerCase()) {
108
+ case "file":
109
+ return "file";
110
+ case "keyring":
111
+ return "keyring";
112
+ case "auto":
113
+ return "auto";
114
+ default:
115
+ return "unknown";
116
+ }
117
+ }
118
+ function resolvePositiveIntegerEnv(input) {
119
+ const raw = input.env[input.envKey]?.trim();
120
+ if (!raw) {
121
+ return input.defaultValue;
122
+ }
123
+ const parsed = Number.parseInt(raw, 10);
124
+ if (!Number.isFinite(parsed) || parsed <= 0) {
125
+ input.logger.warn("wrapper_config.invalid_env_override", {
126
+ envKey: input.envKey,
127
+ rawValue: raw,
128
+ fallbackValue: input.defaultValue,
129
+ });
130
+ return input.defaultValue;
131
+ }
132
+ return parsed;
133
+ }
134
+ function resolveBooleanEnv(value) {
135
+ switch (value?.trim().toLowerCase()) {
136
+ case "1":
137
+ case "true":
138
+ case "yes":
139
+ case "on":
140
+ return true;
141
+ default:
142
+ return false;
143
+ }
144
+ }
145
+ //# sourceMappingURL=wrapper-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper-config.js","sourceRoot":"","sources":["../../src/config/wrapper-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface BootstrapIo {
2
+ cwd: string;
3
+ env: NodeJS.ProcessEnv;
4
+ executablePath: string;
5
+ stdout: NodeJS.WriteStream;
6
+ stderr: NodeJS.WriteStream;
7
+ }
8
+ export declare function runCli(argv: string[], io: BootstrapIo): Promise<number>;
@@ -0,0 +1,32 @@
1
+ import { buildAppContext } from "./context.js";
2
+ import { createLogger } from "../logging/logger.js";
3
+ import { runRootCommand } from "../commands/root/run-root-command.js";
4
+ export async function runCli(argv, io) {
5
+ const context = await buildAppContext(argv, io);
6
+ const logger = createLogger({
7
+ level: context.logging.level,
8
+ name: "bootstrap",
9
+ sink: context.logging.sink,
10
+ });
11
+ logger.debug("bootstrap.start", {
12
+ argv,
13
+ cwd: context.environment.cwd,
14
+ platform: context.environment.platform,
15
+ runtime: context.environment.runtime,
16
+ });
17
+ try {
18
+ const exitCode = await runRootCommand(context);
19
+ logger.debug("bootstrap.exit", { exitCode });
20
+ return exitCode;
21
+ }
22
+ catch (error) {
23
+ const normalized = error instanceof Error ? error : new Error(String(error));
24
+ logger.error("bootstrap.fatal", {
25
+ message: normalized.message,
26
+ stack: normalized.stack,
27
+ });
28
+ context.io.stderr.write(`codexes: ${normalized.message}\n`);
29
+ return 1;
30
+ }
31
+ }
32
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAUtE,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,EAAe;IAC1D,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK;QAC5B,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;KAC3B,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;QAC9B,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG;QAC5B,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ;QACtC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,OAAO;KACrC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE7C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAE7E,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;YAC9B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;QAE5D,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { createLogSink } from "../logging/logger.js";
2
+ import { resolveWrapperConfig } from "../config/wrapper-config.js";
3
+ import { resolvePaths } from "./paths.js";
4
+ import { findCodexBinary } from "../process/find-codex-binary.js";
5
+ import { initializeRuntimeEnvironment } from "../runtime/init/initialize-runtime.js";
6
+ export interface AppContext {
7
+ argv: string[];
8
+ executablePath: string;
9
+ environment: {
10
+ cwd: string;
11
+ platform: NodeJS.Platform;
12
+ runtime: string;
13
+ };
14
+ io: {
15
+ stdout: NodeJS.WriteStream;
16
+ stderr: NodeJS.WriteStream;
17
+ };
18
+ logging: {
19
+ level: string;
20
+ sink: ReturnType<typeof createLogSink>;
21
+ };
22
+ paths: ReturnType<typeof resolvePaths>;
23
+ runtimeInitialization: Awaited<ReturnType<typeof initializeRuntimeEnvironment>>;
24
+ wrapperConfig: Awaited<ReturnType<typeof resolveWrapperConfig>>;
25
+ codexBinary: Awaited<ReturnType<typeof findCodexBinary>>;
26
+ }
27
+ export declare function buildAppContext(argv: string[], io: {
28
+ cwd: string;
29
+ env: NodeJS.ProcessEnv;
30
+ executablePath: string;
31
+ stdout: NodeJS.WriteStream;
32
+ stderr: NodeJS.WriteStream;
33
+ }): Promise<AppContext>;
@@ -0,0 +1,72 @@
1
+ import { createLogSink, createLogger, resolveLogLevel } from "../logging/logger.js";
2
+ import { resolveWrapperConfig } from "../config/wrapper-config.js";
3
+ import { resolvePaths } from "./paths.js";
4
+ import { findCodexBinary } from "../process/find-codex-binary.js";
5
+ import { initializeRuntimeEnvironment } from "../runtime/init/initialize-runtime.js";
6
+ export async function buildAppContext(argv, io) {
7
+ const logLevel = resolveLogLevel(io.env.LOG_LEVEL);
8
+ const sink = createLogSink(io.stderr);
9
+ const paths = resolvePaths(io.cwd, io.env);
10
+ const runtimeInitialization = await initializeRuntimeEnvironment({
11
+ env: io.env,
12
+ logger: createLogger({
13
+ level: logLevel,
14
+ name: "runtime",
15
+ sink,
16
+ }),
17
+ paths,
18
+ });
19
+ const wrapperConfig = await resolveWrapperConfig({
20
+ env: io.env,
21
+ logger: createLogger({
22
+ level: logLevel,
23
+ name: "config",
24
+ sink,
25
+ }),
26
+ paths,
27
+ });
28
+ const codexBinary = await findCodexBinary({
29
+ env: io.env,
30
+ logger: createLogger({
31
+ level: logLevel,
32
+ name: "process",
33
+ sink,
34
+ }),
35
+ wrapperExecutablePath: io.executablePath,
36
+ });
37
+ createLogger({
38
+ level: logLevel,
39
+ name: "context",
40
+ sink,
41
+ }).debug("initialized", {
42
+ argv,
43
+ cwd: io.cwd,
44
+ logLevel,
45
+ paths,
46
+ runtimeInitialization,
47
+ wrapperConfig,
48
+ codexBinary,
49
+ });
50
+ return {
51
+ argv,
52
+ executablePath: io.executablePath,
53
+ environment: {
54
+ cwd: io.cwd,
55
+ platform: process.platform,
56
+ runtime: process.version,
57
+ },
58
+ io: {
59
+ stdout: io.stdout,
60
+ stderr: io.stderr,
61
+ },
62
+ logging: {
63
+ level: logLevel,
64
+ sink,
65
+ },
66
+ paths,
67
+ runtimeInitialization,
68
+ wrapperConfig,
69
+ codexBinary,
70
+ };
71
+ }
72
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAwBrF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAc,EACd,EAMC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,qBAAqB,GAAG,MAAM,4BAA4B,CAAC;QAC/D,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,MAAM,EAAE,YAAY,CAAC;YACnB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,SAAS;YACf,IAAI;SACL,CAAC;QACF,KAAK;KACN,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC;QAC/C,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,MAAM,EAAE,YAAY,CAAC;YACnB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,QAAQ;YACd,IAAI;SACL,CAAC;QACF,KAAK;KACN,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC;QACxC,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,MAAM,EAAE,YAAY,CAAC;YACnB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,SAAS;YACf,IAAI;SACL,CAAC;QACF,qBAAqB,EAAE,EAAE,CAAC,cAAc;KACzC,CAAC,CAAC;IAEH,YAAY,CAAC;QACX,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,SAAS;QACf,IAAI;KACL,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE;QACtB,IAAI;QACJ,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,QAAQ;QACR,KAAK;QACL,qBAAqB;QACrB,aAAa;QACb,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,cAAc,EAAE,EAAE,CAAC,cAAc;QACjC,WAAW,EAAE;YACX,GAAG,EAAE,EAAE,CAAC,GAAG;YACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB;QACD,EAAE,EAAE;YACF,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,MAAM,EAAE,EAAE,CAAC,MAAM;SAClB;QACD,OAAO,EAAE;YACP,KAAK,EAAE,QAAQ;YACf,IAAI;SACL;QACD,KAAK;QACL,qBAAqB;QACrB,aAAa;QACb,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ResolvedPaths {
2
+ projectRoot: string;
3
+ dataRoot: string;
4
+ sharedCodexHome: string;
5
+ accountRoot: string;
6
+ runtimeRoot: string;
7
+ registryFile: string;
8
+ wrapperConfigFile: string;
9
+ codexConfigFile: string;
10
+ selectionCacheFile: string;
11
+ }
12
+ export declare function resolvePaths(cwd: string, env: NodeJS.ProcessEnv): ResolvedPaths;
@@ -0,0 +1,30 @@
1
+ import path from "node:path";
2
+ import os from "node:os";
3
+ export function resolvePaths(cwd, env) {
4
+ const baseDataDir = resolveBaseDataDir(env);
5
+ return {
6
+ projectRoot: cwd,
7
+ dataRoot: baseDataDir,
8
+ sharedCodexHome: env.CODEX_HOME ?? path.join(baseDataDir, "shared-home"),
9
+ accountRoot: path.join(baseDataDir, "accounts"),
10
+ runtimeRoot: path.join(baseDataDir, "runtime"),
11
+ registryFile: path.join(baseDataDir, "registry.json"),
12
+ wrapperConfigFile: path.join(baseDataDir, "codexes.json"),
13
+ codexConfigFile: path.join(env.CODEX_HOME ?? path.join(baseDataDir, "shared-home"), "config.toml"),
14
+ selectionCacheFile: path.join(baseDataDir, "selection-cache.json"),
15
+ };
16
+ }
17
+ function resolveBaseDataDir(env) {
18
+ if (process.platform === "win32") {
19
+ return path.join(env.LOCALAPPDATA ?? path.join(os.homedir(), "AppData", "Local"), "codexes");
20
+ }
21
+ if (process.platform === "darwin") {
22
+ return path.join(env.HOME ?? os.homedir(), "Library", "Application Support", "codexes");
23
+ }
24
+ const xdgStateHome = env.XDG_STATE_HOME;
25
+ if (xdgStateHome) {
26
+ return path.join(xdgStateHome, "codexes");
27
+ }
28
+ return path.join(env.HOME ?? os.homedir(), ".local", "state", "codexes");
29
+ }
30
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAczB,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,GAAsB;IAEtB,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAE5C,OAAO;QACL,WAAW,EAAE,GAAG;QAChB,QAAQ,EAAE,WAAW;QACrB,eAAe,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC;QACxE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC;QAC/C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;QAC9C,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC;QACrD,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;QACzD,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,aAAa,CAAC;QAClG,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAsB;IAChD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CACd,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAC/D,SAAS,CACV,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CACd,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EACxB,SAAS,EACT,qBAAqB,EACrB,SAAS,CACV,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,cAAc,CAAC;IAExC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,18 @@
1
+ type LogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR";
2
+ export interface LogSink {
3
+ write(level: LogLevel, event: string, details?: Record<string, unknown>): void;
4
+ }
5
+ export interface Logger {
6
+ debug(event: string, details?: Record<string, unknown>): void;
7
+ info(event: string, details?: Record<string, unknown>): void;
8
+ warn(event: string, details?: Record<string, unknown>): void;
9
+ error(event: string, details?: Record<string, unknown>): void;
10
+ }
11
+ export declare function resolveLogLevel(value: string | undefined): LogLevel;
12
+ export declare function createLogSink(stream: Pick<NodeJS.WriteStream, "write">): LogSink;
13
+ export declare function createLogger(input: {
14
+ level: string;
15
+ name: string;
16
+ sink: LogSink;
17
+ }): Logger;
18
+ export {};
@@ -0,0 +1,56 @@
1
+ const LOG_LEVEL_ORDER = {
2
+ DEBUG: 10,
3
+ INFO: 20,
4
+ WARN: 30,
5
+ ERROR: 40,
6
+ };
7
+ export function resolveLogLevel(value) {
8
+ switch (value?.toUpperCase()) {
9
+ case "ERROR":
10
+ return "ERROR";
11
+ case "WARN":
12
+ return "WARN";
13
+ case "INFO":
14
+ return "INFO";
15
+ case "DEBUG":
16
+ return "DEBUG";
17
+ default:
18
+ return "ERROR";
19
+ }
20
+ }
21
+ export function createLogSink(stream) {
22
+ return {
23
+ write(level, event, details = {}) {
24
+ stream.write(`${JSON.stringify({
25
+ ts: new Date().toISOString(),
26
+ level,
27
+ event,
28
+ details,
29
+ })}\n`);
30
+ },
31
+ };
32
+ }
33
+ export function createLogger(input) {
34
+ const configuredLevel = resolveLogLevel(input.level);
35
+ return {
36
+ debug(event, details) {
37
+ logWithLevel("DEBUG", input.name, configuredLevel, input.sink, event, details);
38
+ },
39
+ info(event, details) {
40
+ logWithLevel("INFO", input.name, configuredLevel, input.sink, event, details);
41
+ },
42
+ warn(event, details) {
43
+ logWithLevel("WARN", input.name, configuredLevel, input.sink, event, details);
44
+ },
45
+ error(event, details) {
46
+ logWithLevel("ERROR", input.name, configuredLevel, input.sink, event, details);
47
+ },
48
+ };
49
+ }
50
+ function logWithLevel(level, name, configuredLevel, sink, event, details) {
51
+ if (LOG_LEVEL_ORDER[level] < LOG_LEVEL_ORDER[configuredLevel]) {
52
+ return;
53
+ }
54
+ sink.write(level, `${name}.${event}`, details);
55
+ }
56
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAA6B;IAChD,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;CACV,CAAC;AAaF,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,QAAQ,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAyC;IAEzC,OAAO;QACL,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE;YAC9B,MAAM,CAAC,KAAK,CACV,GAAG,IAAI,CAAC,SAAS,CAAC;gBAChB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,KAAK;gBACL,KAAK;gBACL,OAAO;aACR,CAAC,IAAI,CACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAI5B;IACC,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAErD,OAAO;QACL,KAAK,CAAC,KAAK,EAAE,OAAO;YAClB,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,OAAO;YACjB,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,OAAO;YACjB,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,OAAO;YAClB,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,KAAe,EACf,IAAY,EACZ,eAAyB,EACzB,IAAa,EACb,KAAa,EACb,OAAiC;IAEjC,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC"}