@numa-tech/numa 1.11.10
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 +602 -0
- package/THIRD_PARTY_NOTICES.md +13 -0
- package/assets/codex-shortcut-icon.icns +0 -0
- package/assets/codex-shortcut-icon.ico +0 -0
- package/dist/app-config.d.ts +26 -0
- package/dist/app-config.js +135 -0
- package/dist/app-config.js.map +1 -0
- package/dist/backend.d.ts +16 -0
- package/dist/backend.js +106 -0
- package/dist/backend.js.map +1 -0
- package/dist/branding.d.ts +7 -0
- package/dist/branding.js +13 -0
- package/dist/branding.js.map +1 -0
- package/dist/chatgpt-console.d.ts +53 -0
- package/dist/chatgpt-console.js +105 -0
- package/dist/chatgpt-console.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +451 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-auth-agent.d.ts +60 -0
- package/dist/codex-auth-agent.js +331 -0
- package/dist/codex-auth-agent.js.map +1 -0
- package/dist/codex-commands.d.ts +2 -0
- package/dist/codex-commands.js +528 -0
- package/dist/codex-commands.js.map +1 -0
- package/dist/codex-legacy-cleanup.d.ts +5 -0
- package/dist/codex-legacy-cleanup.js +77 -0
- package/dist/codex-legacy-cleanup.js.map +1 -0
- package/dist/codex-process.d.ts +13 -0
- package/dist/codex-process.js +193 -0
- package/dist/codex-process.js.map +1 -0
- package/dist/codex-protocol.d.ts +352 -0
- package/dist/codex-protocol.js +116 -0
- package/dist/codex-protocol.js.map +1 -0
- package/dist/codex-quota-cache.d.ts +20 -0
- package/dist/codex-quota-cache.js +82 -0
- package/dist/codex-quota-cache.js.map +1 -0
- package/dist/codex-selection.d.ts +18 -0
- package/dist/codex-selection.js +47 -0
- package/dist/codex-selection.js.map +1 -0
- package/dist/codex-service-client.d.ts +11 -0
- package/dist/codex-service-client.js +91 -0
- package/dist/codex-service-client.js.map +1 -0
- package/dist/codex-shortcuts.d.ts +43 -0
- package/dist/codex-shortcuts.js +429 -0
- package/dist/codex-shortcuts.js.map +1 -0
- package/dist/codex-tui.d.ts +15 -0
- package/dist/codex-tui.js +235 -0
- package/dist/codex-tui.js.map +1 -0
- package/dist/command-catalog.d.ts +9 -0
- package/dist/command-catalog.js +206 -0
- package/dist/command-catalog.js.map +1 -0
- package/dist/config-page.d.ts +2 -0
- package/dist/config-page.js +51 -0
- package/dist/config-page.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.js +99 -0
- package/dist/config.js.map +1 -0
- package/dist/identity.d.ts +23 -0
- package/dist/identity.js +78 -0
- package/dist/identity.js.map +1 -0
- package/dist/media/client.d.ts +79 -0
- package/dist/media/client.js +175 -0
- package/dist/media/client.js.map +1 -0
- package/dist/media/commands.d.ts +2 -0
- package/dist/media/commands.js +193 -0
- package/dist/media/commands.js.map +1 -0
- package/dist/media/errors.d.ts +8 -0
- package/dist/media/errors.js +37 -0
- package/dist/media/errors.js.map +1 -0
- package/dist/media/schemas.d.ts +62 -0
- package/dist/media/schemas.js +71 -0
- package/dist/media/schemas.js.map +1 -0
- package/dist/media/transfers.d.ts +38 -0
- package/dist/media/transfers.js +169 -0
- package/dist/media/transfers.js.map +1 -0
- package/dist/oauth.d.ts +30 -0
- package/dist/oauth.js +295 -0
- package/dist/oauth.js.map +1 -0
- package/dist/private-file.d.ts +3 -0
- package/dist/private-file.js +51 -0
- package/dist/private-file.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +197 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web-console-page.d.ts +3 -0
- package/dist/web-console-page.js +59 -0
- package/dist/web-console-page.js.map +1 -0
- package/dist/web-console.d.ts +22 -0
- package/dist/web-console.js +335 -0
- package/dist/web-console.js.map +1 -0
- package/examples/claude-desktop-installed-binary.json +11 -0
- package/examples/claude-desktop-npx.json +12 -0
- package/examples/codex-installed-binary.json +11 -0
- package/examples/codex-npx.json +12 -0
- package/package.json +67 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { readFile, rm } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import * as codexMultiAuthCli from "codex-multi-auth/cli";
|
|
7
|
+
import { fetchRemoteCodexLoginCredentials } from "./codex-service-client.js";
|
|
8
|
+
import { resolveDirectCodexLaunch } from "./codex-process.js";
|
|
9
|
+
import { writePrivateJson, writePrivateText } from "./private-file.js";
|
|
10
|
+
const DEFAULT_INTERVAL_MS = 60_000;
|
|
11
|
+
const DEFAULT_REFRESH_BEFORE_MS = 60 * 60_000;
|
|
12
|
+
const REFRESH_PLACEHOLDER_BYTES = 48;
|
|
13
|
+
const externalCredentialApi = codexMultiAuthCli;
|
|
14
|
+
function codexFileCredentialPaths(env = process.env) {
|
|
15
|
+
const codexHome = env.CODEX_HOME?.trim() || join(homedir(), ".codex");
|
|
16
|
+
return {
|
|
17
|
+
authPath: join(codexHome, "auth.json"),
|
|
18
|
+
backupPath: join(codexHome, "auth.json.numa-backup"),
|
|
19
|
+
configPath: join(codexHome, "config.toml")
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function readOptionalText(path) {
|
|
23
|
+
try {
|
|
24
|
+
return await readFile(path, "utf8");
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error.code === "ENOENT")
|
|
28
|
+
return undefined;
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function backupCodexFileCredentials(env = process.env) {
|
|
33
|
+
const paths = codexFileCredentialPaths(env);
|
|
34
|
+
if ((await readOptionalText(paths.backupPath)) !== undefined) {
|
|
35
|
+
return { action: "preserved", ...paths };
|
|
36
|
+
}
|
|
37
|
+
const current = await readOptionalText(paths.authPath);
|
|
38
|
+
if (current === undefined)
|
|
39
|
+
return { action: "missing", ...paths };
|
|
40
|
+
await writePrivateText(paths.backupPath, current);
|
|
41
|
+
return { action: "created", ...paths };
|
|
42
|
+
}
|
|
43
|
+
export async function restoreCodexFileCredentials(env = process.env) {
|
|
44
|
+
const paths = codexFileCredentialPaths(env);
|
|
45
|
+
const backup = await readOptionalText(paths.backupPath);
|
|
46
|
+
if (backup === undefined) {
|
|
47
|
+
throw new Error(`没有可恢复的 Codex 登录备份: ${paths.backupPath}`);
|
|
48
|
+
}
|
|
49
|
+
await writePrivateText(paths.authPath, backup);
|
|
50
|
+
return { action: "restored", ...paths };
|
|
51
|
+
}
|
|
52
|
+
export async function resetManagedCodexFileCredentials(accountId, env = process.env) {
|
|
53
|
+
const paths = codexFileCredentialPaths(env);
|
|
54
|
+
const backup = await readOptionalText(paths.backupPath);
|
|
55
|
+
if (backup !== undefined) {
|
|
56
|
+
await writePrivateText(paths.authPath, backup);
|
|
57
|
+
return { action: "restored", ...paths };
|
|
58
|
+
}
|
|
59
|
+
const current = await readOptionalText(paths.authPath);
|
|
60
|
+
if (!current || !accountId)
|
|
61
|
+
return { action: "unchanged", ...paths };
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(current);
|
|
64
|
+
if (parsed.auth_mode === "chatgpt" &&
|
|
65
|
+
parsed.tokens?.account_id === accountId) {
|
|
66
|
+
await rm(paths.authPath, { force: true });
|
|
67
|
+
return { action: "removed", ...paths };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Preserve malformed or unrelated files; reset only removes credentials it can identify.
|
|
72
|
+
}
|
|
73
|
+
return { action: "unchanged", ...paths };
|
|
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
|
+
export async function inspectLocalCodexCredentialStatus(expectedAccountId, env = process.env) {
|
|
80
|
+
const authPath = codexFileCredentialPaths(env).authPath;
|
|
81
|
+
if (externalCredentialApi.inspectCodexCredentialStatus) {
|
|
82
|
+
return externalCredentialApi.inspectCodexCredentialStatus({
|
|
83
|
+
authPath,
|
|
84
|
+
...(expectedAccountId ? { expectedAccountId } : {})
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const raw = await readOptionalText(authPath);
|
|
88
|
+
if (!raw) {
|
|
89
|
+
return {
|
|
90
|
+
state: "missing",
|
|
91
|
+
matchesExpectedAccount: null,
|
|
92
|
+
usable: false
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const parsed = JSON.parse(raw);
|
|
97
|
+
const accessToken = typeof parsed.tokens?.access_token === "string"
|
|
98
|
+
? parsed.tokens.access_token
|
|
99
|
+
: "";
|
|
100
|
+
const tokens = parsed.tokens;
|
|
101
|
+
const expiresAt = decodeJwtPayload(accessToken)?.exp;
|
|
102
|
+
const accountId = typeof parsed.tokens?.account_id === "string"
|
|
103
|
+
? parsed.tokens.account_id
|
|
104
|
+
: undefined;
|
|
105
|
+
const expiresAtMs = typeof expiresAt === "number" ? expiresAt * 1000 : undefined;
|
|
106
|
+
const expired = expiresAtMs !== undefined && expiresAtMs <= Date.now() + 60_000;
|
|
107
|
+
const structurallyUsable = parsed.auth_mode === "chatgpt" &&
|
|
108
|
+
Boolean(accountId) &&
|
|
109
|
+
accessToken.length > 0 &&
|
|
110
|
+
typeof tokens?.id_token === "string" &&
|
|
111
|
+
tokens.id_token.length > 0;
|
|
112
|
+
return {
|
|
113
|
+
state: structurallyUsable ? (expired ? "expired" : "installed") : "invalid",
|
|
114
|
+
...(accountId ? { accountId } : {}),
|
|
115
|
+
...(expiresAtMs !== undefined ? { expiresAt: expiresAtMs } : {}),
|
|
116
|
+
matchesExpectedAccount: expectedAccountId
|
|
117
|
+
? accountId === expectedAccountId
|
|
118
|
+
: null,
|
|
119
|
+
usable: structurallyUsable && !expired
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return {
|
|
124
|
+
state: "invalid",
|
|
125
|
+
matchesExpectedAccount: false,
|
|
126
|
+
usable: false
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function decodeJwtPayload(token) {
|
|
131
|
+
const parts = token.split(".");
|
|
132
|
+
if (parts.length !== 3 || !parts[1])
|
|
133
|
+
return undefined;
|
|
134
|
+
try {
|
|
135
|
+
const decoded = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
|
|
136
|
+
return decoded && typeof decoded === "object"
|
|
137
|
+
? decoded
|
|
138
|
+
: undefined;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export async function writeCodexChatgptFileCredentials(credentials, now, env = process.env) {
|
|
145
|
+
if (!decodeJwtPayload(credentials.idToken)) {
|
|
146
|
+
throw new Error("账号服务返回的 id_token 不是有效 JWT,拒绝写入 auth.json");
|
|
147
|
+
}
|
|
148
|
+
const { authPath, configPath } = codexFileCredentialPaths(env);
|
|
149
|
+
if (externalCredentialApi.applyExternalCodexCredentials) {
|
|
150
|
+
const result = await externalCredentialApi.applyExternalCodexCredentials(credentials, { authPath, configPath, now });
|
|
151
|
+
return result.authPath;
|
|
152
|
+
}
|
|
153
|
+
// Compatibility for codex-multi-auth 2.8.0 during the staggered package
|
|
154
|
+
// rollout. 2.9.0+ owns this write through applyExternalCodexCredentials().
|
|
155
|
+
await externalCredentialApi.ensureCodexCliFileAuthStore?.(configPath);
|
|
156
|
+
const refreshPlaceholder = randomBytes(REFRESH_PLACEHOLDER_BYTES).toString("base64url");
|
|
157
|
+
await writePrivateJson(authPath, {
|
|
158
|
+
auth_mode: "chatgpt",
|
|
159
|
+
OPENAI_API_KEY: null,
|
|
160
|
+
tokens: {
|
|
161
|
+
id_token: credentials.idToken,
|
|
162
|
+
access_token: credentials.accessToken,
|
|
163
|
+
refresh_token: refreshPlaceholder,
|
|
164
|
+
account_id: credentials.accountId
|
|
165
|
+
},
|
|
166
|
+
last_refresh: new Date(now).toISOString()
|
|
167
|
+
});
|
|
168
|
+
return authPath;
|
|
169
|
+
}
|
|
170
|
+
function sanitizeOutput(value, secrets = []) {
|
|
171
|
+
let sanitized = value;
|
|
172
|
+
for (const secret of secrets) {
|
|
173
|
+
if (secret)
|
|
174
|
+
sanitized = sanitized.split(secret).join("[REDACTED]");
|
|
175
|
+
}
|
|
176
|
+
return sanitized
|
|
177
|
+
.replace(/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*\b/g, "[REDACTED_JWT]")
|
|
178
|
+
.trim();
|
|
179
|
+
}
|
|
180
|
+
export function formatRemainingDuration(milliseconds) {
|
|
181
|
+
if (milliseconds <= 0)
|
|
182
|
+
return "已过期";
|
|
183
|
+
const totalSeconds = Math.ceil(milliseconds / 1000);
|
|
184
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
185
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
186
|
+
const seconds = totalSeconds % 60;
|
|
187
|
+
if (hours > 0)
|
|
188
|
+
return `${hours}小时${minutes}分`;
|
|
189
|
+
if (minutes > 0)
|
|
190
|
+
return `${minutes}分${seconds}秒`;
|
|
191
|
+
return `${seconds}秒`;
|
|
192
|
+
}
|
|
193
|
+
export function codexCredentialStoreArguments(credentialStore) {
|
|
194
|
+
return ["-c", `cli_auth_credentials_store=${JSON.stringify(credentialStore)}`];
|
|
195
|
+
}
|
|
196
|
+
export async function runDirectCodexCommand(args, stdin) {
|
|
197
|
+
const launch = await resolveDirectCodexLaunch(args);
|
|
198
|
+
const child = spawn(launch.command, launch.args, {
|
|
199
|
+
env: process.env,
|
|
200
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
201
|
+
});
|
|
202
|
+
let stdout = "";
|
|
203
|
+
let stderr = "";
|
|
204
|
+
child.stdout.setEncoding("utf8").on("data", (chunk) => {
|
|
205
|
+
stdout += chunk;
|
|
206
|
+
});
|
|
207
|
+
child.stderr.setEncoding("utf8").on("data", (chunk) => {
|
|
208
|
+
stderr += chunk;
|
|
209
|
+
});
|
|
210
|
+
child.stdin.end(stdin);
|
|
211
|
+
return new Promise((resolve, reject) => {
|
|
212
|
+
child.once("error", (error) => {
|
|
213
|
+
reject(new Error(`无法启动官方 Codex CLI (${launch.command}): ${error.message}`));
|
|
214
|
+
});
|
|
215
|
+
child.once("exit", (code, signal) => {
|
|
216
|
+
resolve({
|
|
217
|
+
exitCode: signal ? 128 : (code ?? 1),
|
|
218
|
+
stdout,
|
|
219
|
+
stderr
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function waitForNextCheck(milliseconds, signal) {
|
|
225
|
+
if (signal?.aborted)
|
|
226
|
+
return Promise.resolve(false);
|
|
227
|
+
return new Promise((resolve) => {
|
|
228
|
+
const timer = setTimeout(() => {
|
|
229
|
+
signal?.removeEventListener("abort", onAbort);
|
|
230
|
+
resolve(true);
|
|
231
|
+
}, milliseconds);
|
|
232
|
+
const onAbort = () => {
|
|
233
|
+
clearTimeout(timer);
|
|
234
|
+
resolve(false);
|
|
235
|
+
};
|
|
236
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
function tokenDigest(token) {
|
|
240
|
+
return createHash("sha256").update(token).digest("hex");
|
|
241
|
+
}
|
|
242
|
+
function emitProcessOutput(result, event, log, now, secrets) {
|
|
243
|
+
const output = [result.stdout, result.stderr]
|
|
244
|
+
.map((value) => sanitizeOutput(value, secrets))
|
|
245
|
+
.filter(Boolean)
|
|
246
|
+
.join(" | ");
|
|
247
|
+
if (!output)
|
|
248
|
+
return;
|
|
249
|
+
log({
|
|
250
|
+
level: result.exitCode === 0 ? "INFO" : "ERROR",
|
|
251
|
+
event,
|
|
252
|
+
message: output,
|
|
253
|
+
at: new Date(now()).toISOString()
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
export async function runForegroundCodexAuthAgent(options) {
|
|
257
|
+
const credentialStore = options.credentialStore ?? "file";
|
|
258
|
+
const intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
259
|
+
const refreshBeforeMs = options.refreshBeforeMs ?? DEFAULT_REFRESH_BEFORE_MS;
|
|
260
|
+
const fetchCredentials = options.fetchCredentials ?? fetchRemoteCodexLoginCredentials;
|
|
261
|
+
const writeCredentials = options.writeCredentials ?? writeCodexChatgptFileCredentials;
|
|
262
|
+
const runCodexCommand = options.runCodexCommand ?? runDirectCodexCommand;
|
|
263
|
+
const now = options.now ?? Date.now;
|
|
264
|
+
const log = options.log ?? (() => undefined);
|
|
265
|
+
const selection = options.selection;
|
|
266
|
+
let installed;
|
|
267
|
+
const writeLog = (level, event, message) => {
|
|
268
|
+
log({ level, event, message, at: new Date(now()).toISOString() });
|
|
269
|
+
};
|
|
270
|
+
writeLog("INFO", "agent.start", `前台认证代理已启动;账号=${selection.account.label} (${selection.account.id}),凭据存储=${credentialStore},检查间隔=${Math.round(intervalMs / 1000)}秒,提前刷新=${Math.round(refreshBeforeMs / 1000)}秒`);
|
|
271
|
+
while (!options.signal?.aborted) {
|
|
272
|
+
try {
|
|
273
|
+
const currentTime = now();
|
|
274
|
+
if (installed) {
|
|
275
|
+
const remaining = installed.expiresAt - currentTime;
|
|
276
|
+
writeLog(remaining <= refreshBeforeMs ? "WARN" : "INFO", "token.check", `本地短效凭据剩余 ${formatRemainingDuration(remaining)};到期=${new Date(installed.expiresAt).toISOString()}`);
|
|
277
|
+
if (remaining > refreshBeforeMs) {
|
|
278
|
+
if (options.once)
|
|
279
|
+
return;
|
|
280
|
+
if (!(await waitForNextCheck(intervalMs, options.signal)))
|
|
281
|
+
break;
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
writeLog("INFO", "token.fetch", "正在从账号服务领取 access_token 与 id_token(不领取 refresh token)");
|
|
286
|
+
const response = await fetchCredentials(options.authConfig, selection.serviceUrl, selection.account.id, selection.allowInsecurePoc);
|
|
287
|
+
const remaining = response.expiresAt - now();
|
|
288
|
+
writeLog(remaining > 0 ? "INFO" : "ERROR", "token.received", `已收到短效凭据;剩余=${formatRemainingDuration(remaining)},到期=${new Date(response.expiresAt).toISOString()}`);
|
|
289
|
+
if (remaining <= 0) {
|
|
290
|
+
throw new Error("账号服务返回了已过期的 access token");
|
|
291
|
+
}
|
|
292
|
+
const digest = tokenDigest(`${response.accessToken}\0${response.idToken}`);
|
|
293
|
+
if (installed?.digest === digest) {
|
|
294
|
+
writeLog("WARN", "token.unchanged", "账号服务仍返回相同 token;暂不重复写入,下一检查周期重试");
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
const storeArgs = codexCredentialStoreArguments(credentialStore);
|
|
298
|
+
writeLog("INFO", "auth.write", "正在原子更新 ChatGPT 模式 auth.json;本机 refresh_token 使用独立随机占位值");
|
|
299
|
+
const authPath = await writeCredentials({
|
|
300
|
+
accessToken: response.accessToken,
|
|
301
|
+
idToken: response.idToken,
|
|
302
|
+
accountId: response.account.accountId
|
|
303
|
+
}, now());
|
|
304
|
+
writeLog("INFO", "auth.written", `已更新官方 Codex 文件凭据: ${authPath}`);
|
|
305
|
+
writeLog("INFO", "codex.verify", "正在执行 `codex login status` 验证认证模式");
|
|
306
|
+
const statusResult = await runCodexCommand([...storeArgs, "login", "status"]);
|
|
307
|
+
emitProcessOutput(statusResult, "codex.verify.output", log, now, [
|
|
308
|
+
response.accessToken,
|
|
309
|
+
response.idToken
|
|
310
|
+
]);
|
|
311
|
+
if (statusResult.exitCode !== 0) {
|
|
312
|
+
throw new Error(`官方 Codex 登录状态验证失败,退出码=${statusResult.exitCode}`);
|
|
313
|
+
}
|
|
314
|
+
installed = { digest, expiresAt: response.expiresAt };
|
|
315
|
+
writeLog("INFO", "token.installed", `短效凭据已写入 auth.json 并经官方 Codex 验证;预计剩余 ${formatRemainingDuration(response.expiresAt - now())}`);
|
|
316
|
+
writeLog("WARN", "app.reload", "运行中的 Codex App 可能缓存旧凭据;若仍显示旧账号或出现 401,请完全退出后重新打开");
|
|
317
|
+
}
|
|
318
|
+
if (options.once)
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
writeLog("ERROR", "agent.error", sanitizeOutput(error instanceof Error ? error.message : String(error)));
|
|
323
|
+
if (options.once)
|
|
324
|
+
throw error;
|
|
325
|
+
}
|
|
326
|
+
if (!(await waitForNextCheck(intervalMs, options.signal)))
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
writeLog("INFO", "agent.stop", "前台认证代理已停止");
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=codex-auth-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth-agent.js","sourceRoot":"","sources":["../src/codex-auth-agent.ts"],"names":[],"mappings":"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"}
|