@tokensrc/codex 1.12.1

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 (76) hide show
  1. package/README.md +74 -0
  2. package/assets/codex-shortcut-icon.icns +0 -0
  3. package/assets/codex-shortcut-icon.ico +0 -0
  4. package/dist/account-display.d.ts +16 -0
  5. package/dist/account-display.js +35 -0
  6. package/dist/account-display.js.map +1 -0
  7. package/dist/bin-app.d.ts +2 -0
  8. package/dist/bin-app.js +12 -0
  9. package/dist/bin-app.js.map +1 -0
  10. package/dist/bin-run.d.ts +2 -0
  11. package/dist/bin-run.js +12 -0
  12. package/dist/bin-run.js.map +1 -0
  13. package/dist/branding.d.ts +2 -0
  14. package/dist/branding.js +8 -0
  15. package/dist/branding.js.map +1 -0
  16. package/dist/cli.d.ts +2 -0
  17. package/dist/cli.js +69 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/client.d.ts +27 -0
  20. package/dist/client.js +177 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/command-directory.d.ts +15 -0
  23. package/dist/command-directory.js +28 -0
  24. package/dist/command-directory.js.map +1 -0
  25. package/dist/commands.d.ts +25 -0
  26. package/dist/commands.js +507 -0
  27. package/dist/commands.js.map +1 -0
  28. package/dist/config.d.ts +36 -0
  29. package/dist/config.js +272 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/console-status.d.ts +58 -0
  32. package/dist/console-status.js +84 -0
  33. package/dist/console-status.js.map +1 -0
  34. package/dist/credentials.d.ts +52 -0
  35. package/dist/credentials.js +130 -0
  36. package/dist/credentials.js.map +1 -0
  37. package/dist/errors.d.ts +19 -0
  38. package/dist/errors.js +40 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/index.d.ts +18 -0
  41. package/dist/index.js +67 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/legacy-cleanup.d.ts +5 -0
  44. package/dist/legacy-cleanup.js +36 -0
  45. package/dist/legacy-cleanup.js.map +1 -0
  46. package/dist/oidc.d.ts +26 -0
  47. package/dist/oidc.js +154 -0
  48. package/dist/oidc.js.map +1 -0
  49. package/dist/private-file.d.ts +3 -0
  50. package/dist/private-file.js +30 -0
  51. package/dist/private-file.js.map +1 -0
  52. package/dist/profile.d.ts +29 -0
  53. package/dist/profile.js +253 -0
  54. package/dist/profile.js.map +1 -0
  55. package/dist/protocol.d.ts +752 -0
  56. package/dist/protocol.js +235 -0
  57. package/dist/protocol.js.map +1 -0
  58. package/dist/quota-cache.d.ts +18 -0
  59. package/dist/quota-cache.js +66 -0
  60. package/dist/quota-cache.js.map +1 -0
  61. package/dist/runtime.d.ts +16 -0
  62. package/dist/runtime.js +144 -0
  63. package/dist/runtime.js.map +1 -0
  64. package/dist/selection.d.ts +18 -0
  65. package/dist/selection.js +42 -0
  66. package/dist/selection.js.map +1 -0
  67. package/dist/shortcuts.d.ts +30 -0
  68. package/dist/shortcuts.js +122 -0
  69. package/dist/shortcuts.js.map +1 -0
  70. package/dist/tui.d.ts +29 -0
  71. package/dist/tui.js +278 -0
  72. package/dist/tui.js.map +1 -0
  73. package/dist/types.d.ts +104 -0
  74. package/dist/types.js +2 -0
  75. package/dist/types.js.map +1 -0
  76. package/package.json +92 -0
package/dist/config.js ADDED
@@ -0,0 +1,272 @@
1
+ import { homedir } from "node:os";
2
+ import { createHash } from "node:crypto";
3
+ import { join } from "node:path";
4
+ import { z } from "zod";
5
+ import { CodexError } from "./errors.js";
6
+ import { readJsonIfExists, writePrivateJson } from "./private-file.js";
7
+ import { resolveCodexProfile } from "./profile.js";
8
+ export const DEFAULT_CODEX_SERVER_URL = "https://mail.tokensource.top/api";
9
+ export const DEFAULT_TENANT_ID = "numa-realm";
10
+ export const DEFAULT_TENANT_HEADER_NAME = "X-Tenant-Id";
11
+ export const DEFAULT_OIDC_DISCOVERY_URL = "https://auth.tokensource.top/realms/numa-realm/.well-known/openid-configuration";
12
+ export const DEFAULT_OIDC_CLIENT_ID = "mcp-client";
13
+ export const DEFAULT_OIDC_SCOPE = "openid profile email offline_access";
14
+ export const DEFAULT_REGISTRY_URL = "https://registry.npmjs.org/";
15
+ const StoredConfigSchema = z.object({
16
+ schemaVersion: z.literal(1).default(1),
17
+ profileUrl: z.string().url().optional(),
18
+ serverUrl: z.string().url().optional(),
19
+ tenantId: z.string().min(1).optional(),
20
+ tenantHeaderName: z.string().min(1).optional(),
21
+ allowInsecureHttp: z.boolean().optional(),
22
+ requestTimeoutMs: z.number().int().positive().optional(),
23
+ registryUrl: z.string().url().optional(),
24
+ oidc: z.object({
25
+ discoveryUrl: z.string().url().optional(),
26
+ issuerUrl: z.string().url().optional(),
27
+ clientId: z.string().min(1).optional(),
28
+ scope: z.string().min(1).optional(),
29
+ redirectHost: z.string().min(1).optional(),
30
+ redirectPort: z.number().int().min(1).max(65535).optional(),
31
+ redirectPath: z.string().startsWith("/").optional(),
32
+ openBrowser: z.boolean().optional()
33
+ }).optional()
34
+ });
35
+ function envBoolean(value, fallback) {
36
+ if (value == null || value === "")
37
+ return fallback;
38
+ return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
39
+ }
40
+ function envPositiveInteger(value, fallback, name) {
41
+ if (!value)
42
+ return fallback;
43
+ const result = Number.parseInt(value, 10);
44
+ if (!Number.isInteger(result) || result <= 0) {
45
+ throw new CodexError(`${name} must be a positive integer.`, "invalid_configuration");
46
+ }
47
+ return result;
48
+ }
49
+ function optionalBoolean(value) {
50
+ return value == null || value === "" ? undefined : envBoolean(value, false);
51
+ }
52
+ function trim(value) {
53
+ return value?.trim() || undefined;
54
+ }
55
+ export function defaultCodexConfigDirectory(env = process.env, platform = process.platform, home = homedir()) {
56
+ if (trim(env.TOKENSRC_CODEX_CONFIG_DIR))
57
+ return trim(env.TOKENSRC_CODEX_CONFIG_DIR);
58
+ if (platform === "win32") {
59
+ return join(env.APPDATA ?? join(home, "AppData", "Roaming"), "tokensrc-codex");
60
+ }
61
+ return join(env.XDG_CONFIG_HOME ?? join(home, ".config"), "tokensrc-codex");
62
+ }
63
+ export function codexConfigPath(configDirectory) {
64
+ return join(configDirectory, "tokensrc-codex.json");
65
+ }
66
+ export async function loadStoredCodexConfig(configDirectory, settingsFile = codexConfigPath(configDirectory)) {
67
+ const raw = await readJsonIfExists(settingsFile);
68
+ if (raw === undefined)
69
+ return { schemaVersion: 1 };
70
+ const parsed = StoredConfigSchema.safeParse(raw);
71
+ if (!parsed.success) {
72
+ throw new CodexError(`Invalid Codex configuration: ${settingsFile}`, "invalid_configuration");
73
+ }
74
+ return parsed.data;
75
+ }
76
+ export async function saveStoredCodexConfig(configDirectory, value, settingsFile = codexConfigPath(configDirectory)) {
77
+ const parsed = StoredConfigSchema.parse({ ...value, schemaVersion: 1 });
78
+ await writePrivateJson(settingsFile, parsed);
79
+ return parsed;
80
+ }
81
+ function oidcFromEnv(env) {
82
+ const issuerUrl = trim(env.TOKENSRC_CODEX_OIDC_ISSUER_URL);
83
+ const discoveryUrl = trim(env.TOKENSRC_CODEX_OIDC_DISCOVERY_URL)
84
+ ?? (issuerUrl ? `${issuerUrl.replace(/\/+$/, "")}/.well-known/openid-configuration` : undefined);
85
+ return {
86
+ ...(discoveryUrl ? { discoveryUrl } : {}),
87
+ ...(issuerUrl ? { issuerUrl } : {}),
88
+ ...(trim(env.TOKENSRC_CODEX_OIDC_CLIENT_ID)
89
+ ? { clientId: trim(env.TOKENSRC_CODEX_OIDC_CLIENT_ID) }
90
+ : {}),
91
+ ...(trim(env.TOKENSRC_CODEX_OIDC_CLIENT_SECRET)
92
+ ? { clientSecret: trim(env.TOKENSRC_CODEX_OIDC_CLIENT_SECRET) }
93
+ : {}),
94
+ ...(trim(env.TOKENSRC_CODEX_OIDC_SCOPE)
95
+ ? { scope: trim(env.TOKENSRC_CODEX_OIDC_SCOPE) }
96
+ : {}),
97
+ ...(trim(env.TOKENSRC_CODEX_OIDC_REDIRECT_HOST)
98
+ ? { redirectHost: trim(env.TOKENSRC_CODEX_OIDC_REDIRECT_HOST) }
99
+ : {}),
100
+ ...(trim(env.TOKENSRC_CODEX_OIDC_REDIRECT_PATH)
101
+ ? { redirectPath: trim(env.TOKENSRC_CODEX_OIDC_REDIRECT_PATH) }
102
+ : {}),
103
+ ...(env.TOKENSRC_CODEX_OIDC_REDIRECT_PORT
104
+ ? {
105
+ redirectPort: envPositiveInteger(env.TOKENSRC_CODEX_OIDC_REDIRECT_PORT, 8765, "TOKENSRC_CODEX_OIDC_REDIRECT_PORT")
106
+ }
107
+ : {}),
108
+ ...(optionalBoolean(env.TOKENSRC_CODEX_OIDC_OPEN_BROWSER) === undefined
109
+ ? {}
110
+ : { openBrowser: optionalBoolean(env.TOKENSRC_CODEX_OIDC_OPEN_BROWSER) })
111
+ };
112
+ }
113
+ export async function resolveCodexConfig(options = {}) {
114
+ const env = options.env ?? process.env;
115
+ const configDirectory = options.persistence?.configDirectory
116
+ ?? defaultCodexConfigDirectory(env);
117
+ const settingsFile = options.persistence?.settingsFile ?? codexConfigPath(configDirectory);
118
+ const loadStoredConfig = options.persistence?.loadStoredConfig ?? true;
119
+ const stored = loadStoredConfig
120
+ ? await loadStoredCodexConfig(configDirectory, settingsFile)
121
+ : { schemaVersion: 1 };
122
+ const envOidc = oidcFromEnv(env);
123
+ const explicitProfileUrl = options.profileUrl
124
+ ?? trim(env.TOKENSRC_CODEX_PROFILE_URL)
125
+ ?? stored.profileUrl;
126
+ const selectorServer = options.connection?.serverUrl
127
+ ?? trim(env.TOKENSRC_CODEX_SERVER_URL)
128
+ ?? stored.serverUrl
129
+ ?? (options.discoverProfile ? DEFAULT_CODEX_SERVER_URL : undefined);
130
+ const selectorTenant = options.connection?.tenantId
131
+ ?? trim(env.TOKENSRC_CODEX_TENANT_ID)
132
+ ?? stored.tenantId
133
+ ?? (options.discoverProfile ? DEFAULT_TENANT_ID : undefined);
134
+ const autoDiscover = !options.profile && !explicitProfileUrl
135
+ && Boolean(options.discoverProfile && selectorServer && selectorTenant);
136
+ const profile = options.profile ?? (explicitProfileUrl || autoDiscover
137
+ ? await resolveCodexProfile({
138
+ ...(explicitProfileUrl ? { profileUrl: explicitProfileUrl } : {}),
139
+ ...(!explicitProfileUrl && selectorServer ? { serverUrl: selectorServer } : {}),
140
+ ...(!explicitProfileUrl && selectorTenant ? { tenantId: selectorTenant } : {}),
141
+ fetch: options.fetch,
142
+ configDirectory,
143
+ onWarning: options.onProfileWarning ?? ((message) => {
144
+ (options.errorOutput ?? process.stderr).write(`Warning: ${message}\n`);
145
+ })
146
+ })
147
+ : undefined);
148
+ const profileTokenKey = profile
149
+ ? createHash("sha256").update(`${profile.authority.issuer}\0${profile.authority.clientId}\0${profile.tenantId}\0${profile.audience}`).digest("hex").slice(0, 24)
150
+ : "legacy";
151
+ const defaultOidc = {
152
+ discoveryUrl: DEFAULT_OIDC_DISCOVERY_URL,
153
+ clientId: DEFAULT_OIDC_CLIENT_ID,
154
+ scope: DEFAULT_OIDC_SCOPE,
155
+ redirectHost: "127.0.0.1",
156
+ redirectPort: 8765,
157
+ redirectPath: "/callback",
158
+ openBrowser: true,
159
+ tokenFile: join(configDirectory, `oidc-token-${profileTokenKey}.json`)
160
+ };
161
+ let auth;
162
+ if (options.auth) {
163
+ auth = "oidc" in options.auth && profile
164
+ ? {
165
+ oidc: {
166
+ ...options.auth.oidc,
167
+ issuerUrl: options.auth.oidc.issuerUrl ?? profile.authority.issuer,
168
+ tenantId: options.auth.oidc.tenantId ?? profile.tenantId,
169
+ audience: options.auth.oidc.audience ?? profile.audience
170
+ }
171
+ }
172
+ : options.auth;
173
+ }
174
+ else if (trim(env.TOKENSRC_CODEX_ACCESS_TOKEN)) {
175
+ auth = { accessToken: trim(env.TOKENSRC_CODEX_ACCESS_TOKEN) };
176
+ }
177
+ else {
178
+ auth = {
179
+ oidc: {
180
+ ...defaultOidc,
181
+ ...(stored.oidc ?? {}),
182
+ ...(profile ? {
183
+ discoveryUrl: profile.authority.discoveryUrl,
184
+ issuerUrl: profile.authority.issuer,
185
+ clientId: profile.authority.clientId,
186
+ scope: profile.authority.scope,
187
+ tenantId: profile.tenantId,
188
+ audience: profile.audience
189
+ } : {}),
190
+ ...envOidc,
191
+ tokenFile: join(configDirectory, `oidc-token-${profileTokenKey}.json`)
192
+ }
193
+ };
194
+ }
195
+ return {
196
+ auth,
197
+ connection: {
198
+ serverUrl: autoDiscover ? profile.serverUrl
199
+ : options.connection?.serverUrl
200
+ ?? trim(env.TOKENSRC_CODEX_SERVER_URL)
201
+ ?? profile?.serverUrl
202
+ ?? stored.serverUrl
203
+ ?? DEFAULT_CODEX_SERVER_URL,
204
+ tenantId: autoDiscover ? profile.tenantId
205
+ : options.connection?.tenantId
206
+ ?? trim(env.TOKENSRC_CODEX_TENANT_ID)
207
+ ?? profile?.tenantId
208
+ ?? stored.tenantId
209
+ ?? DEFAULT_TENANT_ID,
210
+ tenantHeaderName: autoDiscover ? profile.tenantHeaderName
211
+ : options.connection?.tenantHeaderName
212
+ ?? trim(env.TOKENSRC_CODEX_TENANT_HEADER_NAME)
213
+ ?? profile?.tenantHeaderName
214
+ ?? stored.tenantHeaderName
215
+ ?? DEFAULT_TENANT_HEADER_NAME,
216
+ allowInsecureHttp: options.connection?.allowInsecureHttp
217
+ ?? optionalBoolean(env.TOKENSRC_CODEX_ALLOW_INSECURE_HTTP)
218
+ ?? stored.allowInsecureHttp
219
+ ?? false,
220
+ requestTimeoutMs: options.connection?.requestTimeoutMs
221
+ ?? (env.TOKENSRC_CODEX_REQUEST_TIMEOUT_MS
222
+ ? envPositiveInteger(env.TOKENSRC_CODEX_REQUEST_TIMEOUT_MS, 10_000, "TOKENSRC_CODEX_REQUEST_TIMEOUT_MS")
223
+ : undefined)
224
+ ?? stored.requestTimeoutMs
225
+ ?? 10_000
226
+ },
227
+ persistence: { configDirectory, settingsFile, loadStoredConfig },
228
+ branding: {
229
+ packageName: options.branding?.packageName
230
+ ?? trim(env.TOKENSRC_CODEX_PACKAGE_NAME)
231
+ ?? "@tokensrc/codex",
232
+ registryUrl: options.branding?.registryUrl
233
+ ?? trim(env.TOKENSRC_CODEX_REGISTRY_URL)
234
+ ?? stored.registryUrl
235
+ ?? DEFAULT_REGISTRY_URL,
236
+ cliName: options.branding?.cliName
237
+ ?? trim(env.TOKENSRC_CODEX_CLI_NAME)
238
+ ?? "tokensrc-codex",
239
+ commandName: options.branding?.commandName
240
+ ?? trim(env.TOKENSRC_CODEX_COMMAND_NAME)
241
+ ?? "tokensrc-codex-run",
242
+ appName: options.branding?.appName
243
+ ?? trim(env.TOKENSRC_CODEX_APP_NAME)
244
+ ?? "TokenSrc Codex"
245
+ },
246
+ launcher: {
247
+ runCommandName: options.launcher?.runCommandName
248
+ ?? trim(env.TOKENSRC_CODEX_RUN_COMMAND_NAME)
249
+ ?? "tokensrc-codex-run",
250
+ appCommandName: options.launcher?.appCommandName
251
+ ?? trim(env.TOKENSRC_CODEX_APP_COMMAND_NAME)
252
+ ?? "tokensrc-codex-app",
253
+ launchMode: options.launcher?.launchMode
254
+ ?? (env.TOKENSRC_CODEX_LAUNCH_MODE === "npx" ? "npx" : "direct"),
255
+ codexBinary: options.launcher?.codexBinary
256
+ ?? trim(env.TOKENSRC_CODEX_BIN)
257
+ ?? "",
258
+ binaryEnvNames: options.launcher?.binaryEnvNames ?? ["TOKENSRC_CODEX_BIN", "NUMA_CODEX_BIN"],
259
+ bundledEnvNames: options.launcher?.bundledEnvNames
260
+ ?? ["TOKENSRC_CODEX_USE_BUNDLED", "NUMA_USE_BUNDLED_CODEX"],
261
+ wrapperPackage: options.launcher?.wrapperPackage
262
+ ?? options.branding?.packageName
263
+ ?? "@tokensrc/codex",
264
+ wrapperCommand: options.launcher?.wrapperCommand ?? [],
265
+ managedMarker: options.launcher?.managedMarker ?? "tokensrc-codex-managed",
266
+ manifestFileName: options.launcher?.manifestFileName ?? ".tokensrc-codex-shortcuts.json",
267
+ bundleId: options.launcher?.bundleId ?? "com.tokensrc.codex"
268
+ },
269
+ ...(profile ? { profile } : {})
270
+ };
271
+ }
272
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type AccountStorageV3 } from "codex-multi-auth/storage";
2
+ import type { CodexServiceClient } from "./client.js";
3
+ import { type LocalCodexCredentialStatus } from "./credentials.js";
4
+ import type { CodexAccountSummary, CodexQuotaSnapshotView } from "./protocol.js";
5
+ import { loadCodexQuotaUploads, type CodexQuotaUpload } from "./quota-cache.js";
6
+ import { type CodexSelection } from "./selection.js";
7
+ export interface LocalCodexPoolAccount {
8
+ id: string;
9
+ accountId?: string;
10
+ label: string;
11
+ email?: string;
12
+ enabled: boolean;
13
+ selected: boolean;
14
+ accessExpiresAt?: number;
15
+ quota?: CodexQuotaUpload;
16
+ }
17
+ export interface CodexLocalStatus {
18
+ status: "READY";
19
+ readAt: number;
20
+ total: number;
21
+ available: number;
22
+ accounts: LocalCodexPoolAccount[];
23
+ configured: boolean;
24
+ officialAuthMatchesSelection: boolean;
25
+ officialAuth: LocalCodexCredentialStatus;
26
+ selection?: CodexSelection;
27
+ }
28
+ export interface CodexRemoteStatus {
29
+ status: "SUCCESS" | "FAILED";
30
+ serviceUrl: string;
31
+ syncedAt: number;
32
+ accounts: Array<CodexAccountSummary & {
33
+ quota?: CodexQuotaSnapshotView | null;
34
+ }>;
35
+ defaultAccountId?: string | null;
36
+ error?: {
37
+ code: string;
38
+ message: string;
39
+ };
40
+ }
41
+ export interface CodexConsoleStatus {
42
+ local: CodexLocalStatus;
43
+ remote: CodexRemoteStatus;
44
+ }
45
+ export interface CodexStatusLoader {
46
+ loadLocal(): Promise<CodexLocalStatus>;
47
+ loadRemote(): Promise<CodexRemoteStatus>;
48
+ load(): Promise<CodexConsoleStatus>;
49
+ }
50
+ export interface CodexStatusDependencies {
51
+ loadStorage?: () => Promise<{
52
+ storage: AccountStorageV3 | null;
53
+ storagePath: string;
54
+ }>;
55
+ loadQuota?: typeof loadCodexQuotaUploads;
56
+ now?: () => number;
57
+ }
58
+ export declare function createCodexStatusLoader(configDirectory: string, client: CodexServiceClient, env?: NodeJS.ProcessEnv, dependencies?: CodexStatusDependencies): CodexStatusLoader;
@@ -0,0 +1,84 @@
1
+ import { createHash } from "node:crypto";
2
+ import { getStoragePath, loadAccounts, setStoragePath } from "codex-multi-auth/storage";
3
+ import { inspectLocalCodexCredentialStatus } from "./credentials.js";
4
+ import { loadCodexQuotaUploads } from "./quota-cache.js";
5
+ import { loadCodexSelection } from "./selection.js";
6
+ function safeLocalId(identity) {
7
+ return `local_${createHash("sha256").update(identity).digest("hex").slice(0, 16)}`;
8
+ }
9
+ function selectedIndex(storage) {
10
+ return storage.pinnedAccountIndex ?? storage.activeIndexByFamily?.codex ?? storage.activeIndex;
11
+ }
12
+ async function defaultStorage() {
13
+ setStoragePath(null);
14
+ return { storage: await loadAccounts(), storagePath: getStoragePath() };
15
+ }
16
+ function safeRemoteError(error) {
17
+ const value = error;
18
+ return {
19
+ code: (typeof value?.code === "string" ? value.code : "remote_sync_failed").slice(0, 80),
20
+ message: (typeof value?.message === "string" ? value.message : String(error)).slice(0, 320)
21
+ };
22
+ }
23
+ export function createCodexStatusLoader(configDirectory, client, env = process.env, dependencies = {}) {
24
+ const now = dependencies.now ?? Date.now;
25
+ const loadLocal = async () => {
26
+ const selection = await loadCodexSelection(configDirectory);
27
+ const officialAuth = await inspectLocalCodexCredentialStatus(selection?.account.accountId, env);
28
+ const { storage, storagePath } = await (dependencies.loadStorage ?? defaultStorage)();
29
+ let accounts = [];
30
+ if (storage) {
31
+ const quota = await (dependencies.loadQuota ?? loadCodexQuotaUploads)(storagePath, storage.accounts);
32
+ const active = selectedIndex(storage);
33
+ accounts = storage.accounts.map((account, index) => {
34
+ const identity = account.accountId?.trim()
35
+ || account.email?.trim().toLowerCase()
36
+ || `${account.addedAt}:${index}`;
37
+ return {
38
+ id: safeLocalId(identity),
39
+ ...(account.accountId?.trim() ? { accountId: account.accountId.trim() } : {}),
40
+ label: account.accountLabel?.trim() || account.email?.trim() || `ChatGPT 账号 ${index + 1}`,
41
+ ...(account.email?.trim() ? { email: account.email.trim() } : {}),
42
+ enabled: account.enabled !== false,
43
+ selected: index === active,
44
+ ...(account.expiresAt && account.expiresAt > 0 ? { accessExpiresAt: account.expiresAt } : {}),
45
+ ...(quota[index] ? { quota: quota[index] } : {})
46
+ };
47
+ });
48
+ }
49
+ return {
50
+ status: "READY",
51
+ readAt: now(),
52
+ total: accounts.length,
53
+ available: accounts.filter((account) => account.enabled).length,
54
+ accounts,
55
+ configured: Boolean(selection),
56
+ officialAuthMatchesSelection: Boolean(selection && officialAuth.usable && officialAuth.matchesExpectedAccount),
57
+ officialAuth,
58
+ ...(selection ? { selection } : {})
59
+ };
60
+ };
61
+ const loadRemote = async () => {
62
+ try {
63
+ const response = await client.listAccounts();
64
+ return {
65
+ status: "SUCCESS",
66
+ serviceUrl: client.serviceUrl,
67
+ syncedAt: now(),
68
+ accounts: response.accounts,
69
+ defaultAccountId: response.defaultAccountId
70
+ };
71
+ }
72
+ catch (error) {
73
+ return {
74
+ status: "FAILED",
75
+ serviceUrl: client.serviceUrl,
76
+ syncedAt: now(),
77
+ accounts: [],
78
+ error: safeRemoteError(error)
79
+ };
80
+ }
81
+ };
82
+ return { loadLocal, loadRemote, load: async () => ({ local: await loadLocal(), remote: await loadRemote() }) };
83
+ }
84
+ //# sourceMappingURL=console-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-status.js","sourceRoot":"","sources":["../src/console-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export interface LocalCodexCredentialStatus {
2
+ state: "missing" | "invalid" | "installed" | "expired";
3
+ accountId?: string;
4
+ expiresAt?: number;
5
+ matchesExpectedAccount: boolean | null;
6
+ usable: boolean;
7
+ }
8
+ export declare function backupCodexFileCredentials(env?: NodeJS.ProcessEnv): Promise<{
9
+ authPath: string;
10
+ backupPath: string;
11
+ configPath: string;
12
+ action: "preserved";
13
+ } | {
14
+ authPath: string;
15
+ backupPath: string;
16
+ configPath: string;
17
+ action: "missing";
18
+ } | {
19
+ authPath: string;
20
+ backupPath: string;
21
+ configPath: string;
22
+ action: "created";
23
+ }>;
24
+ export declare function restoreCodexFileCredentials(env?: NodeJS.ProcessEnv): Promise<{
25
+ authPath: string;
26
+ backupPath: string;
27
+ configPath: string;
28
+ action: "restored";
29
+ }>;
30
+ export declare function inspectLocalCodexCredentialStatus(expectedAccountId?: string, env?: NodeJS.ProcessEnv): Promise<LocalCodexCredentialStatus>;
31
+ export declare function codexFileCredentialsMatchAccount(accountId: string, env?: NodeJS.ProcessEnv): Promise<boolean>;
32
+ export declare function writeCodexChatgptFileCredentials(credentials: {
33
+ accessToken: string;
34
+ idToken: string;
35
+ accountId: string;
36
+ }, now?: number, env?: NodeJS.ProcessEnv): Promise<string>;
37
+ export declare function resetManagedCodexFileCredentials(accountId?: string, env?: NodeJS.ProcessEnv): Promise<{
38
+ authPath: string;
39
+ backupPath: string;
40
+ configPath: string;
41
+ action: "restored";
42
+ } | {
43
+ authPath: string;
44
+ backupPath: string;
45
+ configPath: string;
46
+ action: "removed";
47
+ } | {
48
+ authPath: string;
49
+ backupPath: string;
50
+ configPath: string;
51
+ action: "unchanged";
52
+ }>;
@@ -0,0 +1,130 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { readFile, rm } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import * as codexMultiAuthCli from "codex-multi-auth/cli";
6
+ import { writePrivateJson, writePrivateText } from "./private-file.js";
7
+ const externalApi = codexMultiAuthCli;
8
+ function paths(env = process.env) {
9
+ const codexHome = env.CODEX_HOME?.trim() || join(homedir(), ".codex");
10
+ return {
11
+ authPath: join(codexHome, "auth.json"),
12
+ backupPath: join(codexHome, "auth.json.numa-backup"),
13
+ configPath: join(codexHome, "config.toml")
14
+ };
15
+ }
16
+ async function optionalText(path) {
17
+ try {
18
+ return await readFile(path, "utf8");
19
+ }
20
+ catch (error) {
21
+ if (error.code === "ENOENT")
22
+ return undefined;
23
+ throw error;
24
+ }
25
+ }
26
+ export async function backupCodexFileCredentials(env = process.env) {
27
+ const value = paths(env);
28
+ if (await optionalText(value.backupPath) !== undefined)
29
+ return { action: "preserved", ...value };
30
+ const current = await optionalText(value.authPath);
31
+ if (current === undefined)
32
+ return { action: "missing", ...value };
33
+ await writePrivateText(value.backupPath, current);
34
+ return { action: "created", ...value };
35
+ }
36
+ export async function restoreCodexFileCredentials(env = process.env) {
37
+ const value = paths(env);
38
+ const backup = await optionalText(value.backupPath);
39
+ if (backup === undefined)
40
+ throw new Error(`No Codex login backup exists: ${value.backupPath}`);
41
+ await writePrivateText(value.authPath, backup);
42
+ return { action: "restored", ...value };
43
+ }
44
+ export async function inspectLocalCodexCredentialStatus(expectedAccountId, env = process.env) {
45
+ const authPath = paths(env).authPath;
46
+ if (externalApi.inspectCodexCredentialStatus) {
47
+ return externalApi.inspectCodexCredentialStatus({ authPath, ...(expectedAccountId ? { expectedAccountId } : {}) });
48
+ }
49
+ const raw = await optionalText(authPath);
50
+ if (!raw)
51
+ return { state: "missing", matchesExpectedAccount: null, usable: false };
52
+ try {
53
+ const parsed = JSON.parse(raw);
54
+ const accountId = typeof parsed.tokens?.account_id === "string" ? parsed.tokens.account_id : undefined;
55
+ const accessToken = typeof parsed.tokens?.access_token === "string" ? parsed.tokens.access_token : "";
56
+ const payload = accessToken.split(".")[1];
57
+ const exp = payload
58
+ ? JSON.parse(Buffer.from(payload, "base64url").toString("utf8")).exp
59
+ : undefined;
60
+ const expiresAt = typeof exp === "number" ? exp * 1000 : undefined;
61
+ const usableShape = parsed.auth_mode === "chatgpt" && Boolean(accountId && accessToken && parsed.tokens?.id_token);
62
+ const expired = expiresAt !== undefined && expiresAt <= Date.now() + 60_000;
63
+ return {
64
+ state: usableShape ? (expired ? "expired" : "installed") : "invalid",
65
+ ...(accountId ? { accountId } : {}),
66
+ ...(expiresAt ? { expiresAt } : {}),
67
+ matchesExpectedAccount: expectedAccountId ? accountId === expectedAccountId : null,
68
+ usable: usableShape && !expired
69
+ };
70
+ }
71
+ catch {
72
+ return { state: "invalid", matchesExpectedAccount: false, usable: false };
73
+ }
74
+ }
75
+ export async function codexFileCredentialsMatchAccount(accountId, env = process.env) {
76
+ const status = await inspectLocalCodexCredentialStatus(accountId, env);
77
+ return status.usable && status.matchesExpectedAccount === true;
78
+ }
79
+ function validJwt(token) {
80
+ const payload = token.split(".")[1];
81
+ if (!payload)
82
+ return false;
83
+ try {
84
+ JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
85
+ return true;
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ export async function writeCodexChatgptFileCredentials(credentials, now = Date.now(), env = process.env) {
92
+ if (!validJwt(credentials.idToken))
93
+ throw new Error("The account service returned an invalid id_token.");
94
+ const value = paths(env);
95
+ if (externalApi.applyExternalCodexCredentials) {
96
+ return (await externalApi.applyExternalCodexCredentials(credentials, {
97
+ authPath: value.authPath,
98
+ configPath: value.configPath,
99
+ now
100
+ })).authPath;
101
+ }
102
+ await externalApi.ensureCodexCliFileAuthStore?.(value.configPath);
103
+ await writePrivateJson(value.authPath, {
104
+ auth_mode: "chatgpt",
105
+ OPENAI_API_KEY: null,
106
+ tokens: {
107
+ id_token: credentials.idToken,
108
+ access_token: credentials.accessToken,
109
+ refresh_token: randomBytes(48).toString("base64url"),
110
+ account_id: credentials.accountId
111
+ },
112
+ last_refresh: new Date(now).toISOString()
113
+ });
114
+ return value.authPath;
115
+ }
116
+ export async function resetManagedCodexFileCredentials(accountId, env = process.env) {
117
+ const value = paths(env);
118
+ const backup = await optionalText(value.backupPath);
119
+ if (backup !== undefined) {
120
+ await writePrivateText(value.authPath, backup);
121
+ return { action: "restored", ...value };
122
+ }
123
+ const status = await inspectLocalCodexCredentialStatus(accountId, env);
124
+ if (accountId && status.accountId === accountId) {
125
+ await rm(value.authPath, { force: true });
126
+ return { action: "removed", ...value };
127
+ }
128
+ return { action: "unchanged", ...value };
129
+ }
130
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}