@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.
- package/README.md +74 -0
- package/assets/codex-shortcut-icon.icns +0 -0
- package/assets/codex-shortcut-icon.ico +0 -0
- package/dist/account-display.d.ts +16 -0
- package/dist/account-display.js +35 -0
- package/dist/account-display.js.map +1 -0
- package/dist/bin-app.d.ts +2 -0
- package/dist/bin-app.js +12 -0
- package/dist/bin-app.js.map +1 -0
- package/dist/bin-run.d.ts +2 -0
- package/dist/bin-run.js +12 -0
- package/dist/bin-run.js.map +1 -0
- package/dist/branding.d.ts +2 -0
- package/dist/branding.js +8 -0
- package/dist/branding.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +27 -0
- package/dist/client.js +177 -0
- package/dist/client.js.map +1 -0
- package/dist/command-directory.d.ts +15 -0
- package/dist/command-directory.js +28 -0
- package/dist/command-directory.js.map +1 -0
- package/dist/commands.d.ts +25 -0
- package/dist/commands.js +507 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +272 -0
- package/dist/config.js.map +1 -0
- package/dist/console-status.d.ts +58 -0
- package/dist/console-status.js +84 -0
- package/dist/console-status.js.map +1 -0
- package/dist/credentials.d.ts +52 -0
- package/dist/credentials.js +130 -0
- package/dist/credentials.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy-cleanup.d.ts +5 -0
- package/dist/legacy-cleanup.js +36 -0
- package/dist/legacy-cleanup.js.map +1 -0
- package/dist/oidc.d.ts +26 -0
- package/dist/oidc.js +154 -0
- package/dist/oidc.js.map +1 -0
- package/dist/private-file.d.ts +3 -0
- package/dist/private-file.js +30 -0
- package/dist/private-file.js.map +1 -0
- package/dist/profile.d.ts +29 -0
- package/dist/profile.js +253 -0
- package/dist/profile.js.map +1 -0
- package/dist/protocol.d.ts +752 -0
- package/dist/protocol.js +235 -0
- package/dist/protocol.js.map +1 -0
- package/dist/quota-cache.d.ts +18 -0
- package/dist/quota-cache.js +66 -0
- package/dist/quota-cache.js.map +1 -0
- package/dist/runtime.d.ts +16 -0
- package/dist/runtime.js +144 -0
- package/dist/runtime.js.map +1 -0
- package/dist/selection.d.ts +18 -0
- package/dist/selection.js +42 -0
- package/dist/selection.js.map +1 -0
- package/dist/shortcuts.d.ts +30 -0
- package/dist/shortcuts.js +122 -0
- package/dist/shortcuts.js.map +1 -0
- package/dist/tui.d.ts +29 -0
- package/dist/tui.js +278 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +104 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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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"}
|