@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
@@ -0,0 +1,122 @@
1
+ import { chmod, copyFile, mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join, resolve } from "node:path";
4
+ function quote(value) {
5
+ return `'${value.replace(/'/g, `'"'"'`)}'`;
6
+ }
7
+ function paths(config, options) {
8
+ if (process.platform !== "darwin" && process.platform !== "win32") {
9
+ throw new Error("Codex shortcuts are supported on macOS and Windows only.");
10
+ }
11
+ const user = options.scope !== "system";
12
+ const commandDirectory = options.rootDirectory
13
+ ? join(options.rootDirectory, "bin")
14
+ : process.platform === "win32"
15
+ ? join(process.env.LOCALAPPDATA ?? join(homedir(), "AppData", "Local"), "Programs", "tokensrc-codex", "bin")
16
+ : user ? join(homedir(), ".local", "bin") : "/usr/local/bin";
17
+ const appDirectory = options.rootDirectory
18
+ ? join(options.rootDirectory, "Applications")
19
+ : process.platform === "win32"
20
+ ? join(process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"), "Microsoft", "Windows", "Start Menu", "Programs")
21
+ : user ? join(homedir(), "Applications") : "/Applications";
22
+ const ext = process.platform === "win32" ? ".cmd" : "";
23
+ const appRoot = join(appDirectory, process.platform === "win32"
24
+ ? `${config.branding.appName}.cmd`
25
+ : `${config.branding.appName}.app`);
26
+ return {
27
+ user,
28
+ commandDirectory,
29
+ run: join(commandDirectory, `${config.launcher.runCommandName}${ext}`),
30
+ appRoot,
31
+ app: process.platform === "win32"
32
+ ? appRoot
33
+ : join(appRoot, "Contents", "MacOS", config.launcher.appCommandName),
34
+ manifest: join(commandDirectory, config.launcher.manifestFileName)
35
+ };
36
+ }
37
+ function wrapper(config, kind, options) {
38
+ const args = [
39
+ ...config.launcher.wrapperCommand,
40
+ kind,
41
+ ...(kind === "app" ? [resolve(options.workspace ?? ".")] : []),
42
+ ...(options.account ? ["--account", options.account] : []),
43
+ ...(options.selectAccount ? ["--select-account"] : []),
44
+ ...(options.server ? ["--server", options.server] : []),
45
+ ...(options.insecurePoc ? ["--insecure-poc"] : [])
46
+ ];
47
+ const npx = ["npx", "-y", "--prefer-online", "--registry", options.registryUrl ?? config.branding.registryUrl];
48
+ if (process.platform === "win32") {
49
+ return `@echo off\r\nrem ${config.launcher.managedMarker}\r\n${npx.map((x) => `"${x.replace(/"/g, '""')}"`).join(" ")} "${config.launcher.wrapperPackage}@latest" ${args.map((x) => `"${x.replace(/"/g, '""')}"`).join(" ")} %*\r\n`;
50
+ }
51
+ return `#!/bin/sh\n# ${config.launcher.managedMarker}\nexec ${npx.map(quote).join(" ")} ${quote(`${config.launcher.wrapperPackage}@latest`)} ${args.map(quote).join(" ")} "$@"\n`;
52
+ }
53
+ async function ensureManaged(path, marker, force) {
54
+ try {
55
+ const value = await readFile(path, "utf8");
56
+ if (!value.includes(marker) && !force)
57
+ throw new Error(`Refusing to overwrite unmanaged shortcut: ${path}`);
58
+ }
59
+ catch (error) {
60
+ if (error.code !== "ENOENT")
61
+ throw error;
62
+ }
63
+ }
64
+ export async function installCodexShortcuts(config, options = {}) {
65
+ const value = paths(config, options);
66
+ const target = options.target ?? "both";
67
+ const artifacts = [];
68
+ if (target === "run" || target === "both") {
69
+ await ensureManaged(value.run, config.launcher.managedMarker, Boolean(options.force));
70
+ await mkdir(dirname(value.run), { recursive: true });
71
+ await writeFile(value.run, wrapper(config, "run", options), { mode: 0o755 });
72
+ if (process.platform !== "win32")
73
+ await chmod(value.run, 0o755);
74
+ artifacts.push({ kind: "command", path: value.run });
75
+ }
76
+ if (target === "app" || target === "both") {
77
+ await ensureManaged(value.app, config.launcher.managedMarker, Boolean(options.force));
78
+ await mkdir(dirname(value.app), { recursive: true });
79
+ await writeFile(value.app, wrapper(config, "app", options), { mode: 0o755 });
80
+ if (process.platform !== "win32") {
81
+ await chmod(value.app, 0o755);
82
+ const resources = join(value.appRoot, "Contents", "Resources");
83
+ await mkdir(resources, { recursive: true });
84
+ await copyFile(new URL("../assets/codex-shortcut-icon.icns", import.meta.url), join(resources, "codex-shortcut-icon.icns"));
85
+ const escapeXml = (text) => text
86
+ .replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
87
+ await writeFile(join(value.appRoot, "Contents", "Info.plist"), `<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0"><dict>\n<key>CFBundleExecutable</key><string>${escapeXml(config.launcher.appCommandName)}</string>\n<key>CFBundleIdentifier</key><string>${escapeXml(config.launcher.bundleId)}</string>\n<key>CFBundleName</key><string>${escapeXml(config.branding.appName)}</string>\n<key>CFBundleIconFile</key><string>codex-shortcut-icon</string>\n</dict></plist>\n`);
88
+ }
89
+ artifacts.push({ kind: "application", path: value.appRoot });
90
+ }
91
+ await mkdir(dirname(value.manifest), { recursive: true });
92
+ await writeFile(value.manifest, `${JSON.stringify({
93
+ schemaVersion: 1,
94
+ marker: config.launcher.managedMarker,
95
+ bundleId: config.launcher.bundleId,
96
+ wrapperPackage: config.launcher.wrapperPackage,
97
+ artifacts: artifacts.map((item) => item.path)
98
+ }, null, 2)}\n`, { mode: 0o600 });
99
+ artifacts.push({ kind: "manifest", path: value.manifest });
100
+ return { action: "installed", platform: process.platform, scope: value.user ? "user" : "system", commandDirectory: value.commandDirectory, pathReady: true, artifacts };
101
+ }
102
+ export async function removeCodexShortcuts(config, options = {}) {
103
+ const value = paths(config, options);
104
+ const target = options.target ?? "both";
105
+ const artifacts = [];
106
+ for (const [kind, path] of [["command", value.run], ["application", value.app]]) {
107
+ if ((kind === "command" && target === "app") || (kind === "application" && target === "run"))
108
+ continue;
109
+ try {
110
+ const text = await readFile(path, "utf8");
111
+ if (!text.includes(config.launcher.managedMarker) && !options.force)
112
+ continue;
113
+ }
114
+ catch { /* directory app or missing */ }
115
+ await rm(kind === "application" ? value.appRoot : path, { recursive: true, force: true });
116
+ artifacts.push({ kind, path: kind === "application" ? value.appRoot : path });
117
+ }
118
+ await rm(value.manifest, { force: true });
119
+ artifacts.push({ kind: "manifest", path: value.manifest });
120
+ return { action: "removed", platform: process.platform, scope: value.user ? "user" : "system", commandDirectory: value.commandDirectory, pathReady: true, artifacts };
121
+ }
122
+ //# sourceMappingURL=shortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../src/shortcuts.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import { type CodexAccountSummary } from "./protocol.js";
2
+ export interface CodexTuiOptions {
3
+ columns?: number;
4
+ color?: boolean;
5
+ unicode?: boolean;
6
+ now?: number;
7
+ }
8
+ export declare function quotaRemainingPercent(usedPercent: number | null | undefined): number | undefined;
9
+ export declare function renderQuotaBar(remaining: number | undefined, width: number, options?: Pick<CodexTuiOptions, "color" | "unicode">): string;
10
+ export declare function terminalCellWidth(value: string): number;
11
+ export declare function formatQuotaRefresh(value: number | string | null | undefined, now?: number): string;
12
+ export declare function isCodexAccountAvailable(account: CodexAccountSummary): boolean;
13
+ export declare function codexAccountStatusText(account: CodexAccountSummary): string | undefined;
14
+ export declare function renderCodexAccountDashboard(accounts: readonly CodexAccountSummary[], selectedAccountId?: string, tuiOptions?: CodexTuiOptions): string;
15
+ export interface CodexAccountSelectionOptions {
16
+ requested?: string;
17
+ selectedAccountId?: string;
18
+ interactive?: boolean;
19
+ nonInteractiveCommand?: string;
20
+ noAvailableMessage?: string;
21
+ output?: NodeJS.WritableStream;
22
+ prompt?: typeof promptCodexAccount;
23
+ }
24
+ /**
25
+ * Resolve an explicit account alias or present the shared quota-aware account
26
+ * picker when several accounts are available.
27
+ */
28
+ export declare function selectCodexAccount(accounts: readonly CodexAccountSummary[], options?: CodexAccountSelectionOptions): Promise<CodexAccountSummary>;
29
+ export declare function promptCodexAccount(accounts: readonly CodexAccountSummary[], selectedAccountId?: string): Promise<CodexAccountSummary>;
package/dist/tui.js ADDED
@@ -0,0 +1,278 @@
1
+ import process from "node:process";
2
+ import { cancel, isCancel, select } from "@clack/prompts";
3
+ import { codexQuotaWindowHasData } from "./protocol.js";
4
+ import { resolveCodexAccountDisplayName } from "./account-display.js";
5
+ const ANSI = {
6
+ reset: "\u001b[0m",
7
+ bold: "\u001b[1m",
8
+ dim: "\u001b[2m",
9
+ cyan: "\u001b[36m",
10
+ green: "\u001b[32m",
11
+ yellow: "\u001b[33m",
12
+ red: "\u001b[31m"
13
+ };
14
+ function terminalColor() {
15
+ return Boolean(process.stdout.isTTY && !process.env.NO_COLOR && process.env.TERM !== "dumb");
16
+ }
17
+ function terminalUnicode() {
18
+ return process.env.TERM !== "dumb" && process.env.NUMA_ASCII !== "1";
19
+ }
20
+ function paint(value, color, enabled) {
21
+ return enabled ? `${ANSI[color]}${value}${ANSI.reset}` : value;
22
+ }
23
+ function codexAccountDisplayName(account) {
24
+ return resolveCodexAccountDisplayName({
25
+ accountId: account.id,
26
+ label: account.label,
27
+ providerAccountId: account.accountId
28
+ });
29
+ }
30
+ function clampedPercent(value) {
31
+ return typeof value === "number" && Number.isFinite(value)
32
+ ? Math.max(0, Math.min(100, value))
33
+ : undefined;
34
+ }
35
+ export function quotaRemainingPercent(usedPercent) {
36
+ const used = clampedPercent(usedPercent);
37
+ return used === undefined ? undefined : Math.round(100 - used);
38
+ }
39
+ function remainingColor(remaining) {
40
+ if (remaining >= 50)
41
+ return "green";
42
+ if (remaining >= 20)
43
+ return "yellow";
44
+ return "red";
45
+ }
46
+ export function renderQuotaBar(remaining, width, options = {}) {
47
+ const unicode = options.unicode ?? true;
48
+ const empty = unicode ? "░" : "-";
49
+ if (remaining === undefined)
50
+ return empty.repeat(width);
51
+ const filled = unicode ? "█" : "#";
52
+ const filledWidth = Math.round((Math.max(0, Math.min(100, remaining)) / 100) * width);
53
+ const value = `${filled.repeat(filledWidth)}${empty.repeat(width - filledWidth)}`;
54
+ return paint(value, remainingColor(remaining), Boolean(options.color));
55
+ }
56
+ function quotaWindowLabel(minutes, fallback) {
57
+ if (typeof minutes !== "number" || !Number.isFinite(minutes) || minutes <= 0)
58
+ return fallback;
59
+ if (minutes % (24 * 60) === 0)
60
+ return `${minutes / (24 * 60)} 天`;
61
+ if (minutes % 60 === 0)
62
+ return `${minutes / 60} 小时`;
63
+ return `${Math.round(minutes)} 分钟`;
64
+ }
65
+ export function terminalCellWidth(value) {
66
+ let width = 0;
67
+ for (const character of value) {
68
+ const codePoint = character.codePointAt(0) ?? 0;
69
+ const isCombiningMark = /\p{Mark}/u.test(character);
70
+ const isWide = codePoint >= 0x1100 &&
71
+ (codePoint <= 0x115f ||
72
+ codePoint === 0x2329 ||
73
+ codePoint === 0x232a ||
74
+ (codePoint >= 0x2e80 && codePoint <= 0xa4cf) ||
75
+ (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
76
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
77
+ (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
78
+ (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||
79
+ (codePoint >= 0xff00 && codePoint <= 0xff60) ||
80
+ (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||
81
+ (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||
82
+ (codePoint >= 0x20000 && codePoint <= 0x3fffd));
83
+ width += isCombiningMark ? 0 : isWide ? 2 : 1;
84
+ }
85
+ return width;
86
+ }
87
+ function padTerminalEnd(value, targetWidth) {
88
+ return `${value}${" ".repeat(Math.max(0, targetWidth - terminalCellWidth(value)))}`;
89
+ }
90
+ function instantMilliseconds(value) {
91
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
92
+ return value < 1_000_000_000_000 ? value * 1000 : value;
93
+ }
94
+ if (typeof value === "string") {
95
+ const parsed = Date.parse(value);
96
+ return Number.isFinite(parsed) ? parsed : undefined;
97
+ }
98
+ return undefined;
99
+ }
100
+ export function formatQuotaRefresh(value, now = Date.now()) {
101
+ const timestamp = instantMilliseconds(value);
102
+ if (timestamp === undefined)
103
+ return "刷新时间未知";
104
+ const remainingMs = timestamp - now;
105
+ if (remainingMs <= 0)
106
+ return "等待刷新";
107
+ const minutes = Math.ceil(remainingMs / 60_000);
108
+ if (minutes < 60)
109
+ return `${minutes} 分钟后刷新`;
110
+ const hours = Math.ceil(remainingMs / 3_600_000);
111
+ if (hours < 24)
112
+ return `${hours} 小时后刷新`;
113
+ const days = Math.ceil(remainingMs / 86_400_000);
114
+ if (days <= 7)
115
+ return `${days} 天后刷新`;
116
+ return `${new Date(timestamp).toLocaleString("zh-CN", {
117
+ month: "2-digit",
118
+ day: "2-digit",
119
+ hour: "2-digit",
120
+ minute: "2-digit",
121
+ hour12: false
122
+ })} 刷新`;
123
+ }
124
+ function quotaLine(label, usedPercent, resetAt, barWidth, options) {
125
+ const remaining = quotaRemainingPercent(usedPercent);
126
+ const percentage = remaining === undefined ? " --" : String(remaining).padStart(3, " ");
127
+ const percentageText = remaining === undefined
128
+ ? `${percentage}%`
129
+ : paint(`${percentage}%`, remainingColor(remaining), options.color);
130
+ return `${padTerminalEnd(label, 8)} ${renderQuotaBar(remaining, barWidth, options)} ${percentageText} 剩余 · ${formatQuotaRefresh(resetAt, options.now)}`;
131
+ }
132
+ function accountQuotaLines(quota, barWidth, options) {
133
+ if (!quota)
134
+ return [paint("额度 暂无额度数据", "dim", options.color)];
135
+ const lines = [
136
+ codexQuotaWindowHasData(quota.primary)
137
+ ? quotaLine(quotaWindowLabel(quota.primary?.windowMinutes, "短周期"), quota.primary?.usedPercent, quota.primary?.resetAt, barWidth, options)
138
+ : undefined,
139
+ codexQuotaWindowHasData(quota.secondary)
140
+ ? quotaLine(quotaWindowLabel(quota.secondary?.windowMinutes, "长周期"), quota.secondary?.usedPercent, quota.secondary?.resetAt, barWidth, options)
141
+ : undefined
142
+ ].filter((line) => line !== undefined);
143
+ return lines.length > 0
144
+ ? lines
145
+ : [paint("额度 暂无有效额度窗口", "dim", options.color)];
146
+ }
147
+ function compactQuota(quota) {
148
+ if (!quota)
149
+ return "暂无额度";
150
+ const windows = [
151
+ { window: quota.primary, fallback: "短周期" },
152
+ { window: quota.secondary, fallback: "长周期" }
153
+ ].filter(({ window }) => codexQuotaWindowHasData(window));
154
+ if (windows.length === 0)
155
+ return "暂无额度";
156
+ return windows
157
+ .map(({ window, fallback }) => {
158
+ const remaining = quotaRemainingPercent(window?.usedPercent);
159
+ return `${quotaWindowLabel(window?.windowMinutes, fallback)} ${remaining === undefined ? "--" : remaining}%`;
160
+ })
161
+ .join(" · ");
162
+ }
163
+ export function isCodexAccountAvailable(account) {
164
+ return account.credentialStatus == null || account.credentialStatus === "AVAILABLE";
165
+ }
166
+ export function codexAccountStatusText(account) {
167
+ if (account.credentialStatus === "NEEDS_REAUTH")
168
+ return "凭据已失效";
169
+ if (account.credentialStatus === "TEMPORARILY_UNAVAILABLE")
170
+ return "服务暂时不可用";
171
+ return undefined;
172
+ }
173
+ export function renderCodexAccountDashboard(accounts, selectedAccountId, tuiOptions = {}) {
174
+ const columns = Math.max(40, tuiOptions.columns ?? process.stdout.columns ?? 80);
175
+ const options = {
176
+ color: tuiOptions.color ?? terminalColor(),
177
+ unicode: tuiOptions.unicode ?? terminalUnicode(),
178
+ now: tuiOptions.now ?? Date.now()
179
+ };
180
+ const barWidth = columns >= 96 ? 24 : columns >= 72 ? 18 : 10;
181
+ const selectedSymbol = options.unicode ? "◆" : ">";
182
+ const idleSymbol = options.unicode ? "◇" : "-";
183
+ const rail = options.unicode ? "│" : "|";
184
+ const availableCount = accounts.filter(isCodexAccountAvailable).length;
185
+ const countText = availableCount === accounts.length
186
+ ? `${accounts.length} 个可用`
187
+ : `${accounts.length} 个账号 · ${availableCount} 个可用`;
188
+ const lines = [`${paint("ChatGPT 账号", "bold", options.color)} ${countText}`, ""];
189
+ accounts.forEach((account, index) => {
190
+ const selected = selectedAccountId
191
+ ? account.id === selectedAccountId
192
+ : account.isDefault;
193
+ const symbol = selected
194
+ ? paint(selectedSymbol, "cyan", options.color)
195
+ : paint(idleSymbol, "dim", options.color);
196
+ const selectedText = selected ? ` ${paint("当前", "cyan", options.color)}` : "";
197
+ const badges = [
198
+ codexAccountStatusText(account)
199
+ ? paint(codexAccountStatusText(account), "red", options.color)
200
+ : undefined,
201
+ account.quota?.planType?.toUpperCase(),
202
+ account.quota?.activeLimit != null ? `LIMIT ${account.quota.activeLimit}` : undefined
203
+ ].filter(Boolean).join(" · ");
204
+ lines.push(`${symbol} ${paint(codexAccountDisplayName(account), "bold", options.color)}${selectedText}`);
205
+ lines.push(`${paint(rail, "dim", options.color)} ${paint(account.id, "dim", options.color)}${badges ? ` · ${badges}` : ""}`);
206
+ for (const quota of accountQuotaLines(account.quota, barWidth, options)) {
207
+ lines.push(`${paint(rail, "dim", options.color)} ${quota}`);
208
+ }
209
+ if (index < accounts.length - 1)
210
+ lines.push("");
211
+ });
212
+ return `${lines.join("\n")}\n`;
213
+ }
214
+ /**
215
+ * Resolve an explicit account alias or present the shared quota-aware account
216
+ * picker when several accounts are available.
217
+ */
218
+ export async function selectCodexAccount(accounts, options = {}) {
219
+ const availableAccounts = accounts.filter(isCodexAccountAvailable);
220
+ if (!options.requested) {
221
+ if (availableAccounts.length === 0) {
222
+ throw new Error(options.noAvailableMessage ?? "没有可用的 ChatGPT 账号。");
223
+ }
224
+ if (availableAccounts.length === 1)
225
+ return availableAccounts[0];
226
+ if (!(options.interactive ?? Boolean(process.stdin.isTTY))) {
227
+ throw new Error(`服务端有多个账号;非交互环境请运行 ${options.nonInteractiveCommand ?? "tokensrc-codex use"} <account-id> 显式选择。`);
228
+ }
229
+ (options.output ?? process.stderr).write(renderCodexAccountDashboard(accounts, options.selectedAccountId));
230
+ return (options.prompt ?? promptCodexAccount)(accounts, options.selectedAccountId);
231
+ }
232
+ const exact = accounts.find((account) => account.id === options.requested);
233
+ if (exact) {
234
+ if (!isCodexAccountAvailable(exact)) {
235
+ throw new Error(`ChatGPT 账号 ${codexAccountDisplayName(exact)} ${codexAccountStatusText(exact)},无法使用。`);
236
+ }
237
+ return exact;
238
+ }
239
+ const aliases = accounts.filter((account) => account.accountId === options.requested || account.label === options.requested);
240
+ if (aliases.length === 1) {
241
+ const account = aliases[0];
242
+ if (!isCodexAccountAvailable(account)) {
243
+ throw new Error(`ChatGPT 账号 ${codexAccountDisplayName(account)} ${codexAccountStatusText(account)},无法使用。`);
244
+ }
245
+ return account;
246
+ }
247
+ if (aliases.length > 1) {
248
+ throw new Error(`账号选择 ${options.requested} 不唯一,请使用列表中的 account id。`);
249
+ }
250
+ throw new Error(`未找到 Codex 账号: ${options.requested}`);
251
+ }
252
+ export async function promptCodexAccount(accounts, selectedAccountId) {
253
+ const answer = await select({
254
+ message: "选择要使用的 ChatGPT 账号(↑↓ 移动,回车确认)",
255
+ initialValue: accounts.some((account) => account.id === selectedAccountId)
256
+ ? selectedAccountId
257
+ : undefined,
258
+ maxItems: Math.min(10, accounts.length),
259
+ showInstructions: false,
260
+ options: accounts.map((account) => ({
261
+ value: account.id,
262
+ label: codexAccountDisplayName(account),
263
+ hint: isCodexAccountAvailable(account)
264
+ ? `${compactQuota(account.quota)} · ${account.id}`
265
+ : `${codexAccountStatusText(account)} · ${account.id}`,
266
+ disabled: !isCodexAccountAvailable(account)
267
+ }))
268
+ });
269
+ if (isCancel(answer)) {
270
+ cancel("已取消账号选择");
271
+ throw new Error("已取消账号选择。");
272
+ }
273
+ const account = accounts.find((candidate) => candidate.id === answer);
274
+ if (!account)
275
+ throw new Error("选择的账号已不在可用列表中,请重新运行命令。");
276
+ return account;
277
+ }
278
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type { Command } from "commander";
2
+ import type { ResolvedCodexProfile } from "./profile.js";
3
+ export interface AccessTokenResult {
4
+ accessToken: string;
5
+ expiresAt?: number;
6
+ }
7
+ export type AccessTokenProvider = (context: {
8
+ forceRefresh: boolean;
9
+ }) => Promise<string | AccessTokenResult>;
10
+ export interface StaticAccessTokenAuth {
11
+ accessToken: string;
12
+ }
13
+ export interface ProviderAuth {
14
+ tokenProvider: AccessTokenProvider;
15
+ loginProvider?: () => Promise<void>;
16
+ isLoginRequired?: (error: unknown) => boolean;
17
+ loginHint?: string;
18
+ }
19
+ export interface OidcAuthOptions {
20
+ discoveryUrl?: string;
21
+ issuerUrl?: string;
22
+ clientId?: string;
23
+ tenantId?: string;
24
+ audience?: string;
25
+ clientSecret?: string;
26
+ scope?: string;
27
+ redirectHost?: string;
28
+ redirectPort?: number;
29
+ redirectPath?: string;
30
+ openBrowser?: boolean;
31
+ tokenFile?: string;
32
+ }
33
+ export type CodexAuthOptions = StaticAccessTokenAuth | ProviderAuth | {
34
+ oidc: OidcAuthOptions;
35
+ };
36
+ export interface CodexConnectionOptions {
37
+ serverUrl?: string;
38
+ tenantId?: string;
39
+ tenantHeaderName?: string;
40
+ allowInsecureHttp?: boolean;
41
+ requestTimeoutMs?: number;
42
+ }
43
+ export interface CodexPersistenceOptions {
44
+ configDirectory?: string;
45
+ settingsFile?: string;
46
+ loadStoredConfig?: boolean;
47
+ }
48
+ export interface CodexBrandingOptions {
49
+ packageName?: string;
50
+ registryUrl?: string;
51
+ cliName?: string;
52
+ commandName?: string;
53
+ appName?: string;
54
+ }
55
+ export interface CodexLauncherOptions {
56
+ runCommandName?: string;
57
+ appCommandName?: string;
58
+ launchMode?: "direct" | "npx";
59
+ codexBinary?: string;
60
+ binaryEnvNames?: string[];
61
+ bundledEnvNames?: string[];
62
+ wrapperPackage?: string;
63
+ wrapperCommand?: string[];
64
+ managedMarker?: string;
65
+ manifestFileName?: string;
66
+ bundleId?: string;
67
+ }
68
+ export interface CodexModuleOptions {
69
+ profile?: ResolvedCodexProfile;
70
+ profileUrl?: string;
71
+ discoverProfile?: boolean;
72
+ auth?: CodexAuthOptions;
73
+ connection?: CodexConnectionOptions;
74
+ persistence?: CodexPersistenceOptions;
75
+ branding?: CodexBrandingOptions;
76
+ launcher?: CodexLauncherOptions;
77
+ env?: NodeJS.ProcessEnv;
78
+ fetch?: typeof fetch;
79
+ output?: NodeJS.WritableStream;
80
+ errorOutput?: NodeJS.WritableStream;
81
+ onProfileWarning?: (message: string) => void;
82
+ jsonEnabled?: (command: Command) => boolean | Promise<boolean>;
83
+ }
84
+ export interface ResolvedCodexConfig {
85
+ auth: CodexAuthOptions;
86
+ connection: Required<CodexConnectionOptions>;
87
+ persistence: Required<CodexPersistenceOptions>;
88
+ branding: Required<CodexBrandingOptions>;
89
+ launcher: Required<CodexLauncherOptions>;
90
+ profile?: ResolvedCodexProfile;
91
+ }
92
+ export interface CodexModule {
93
+ readonly config: ResolvedCodexConfig;
94
+ readonly client: import("./client.js").CodexServiceClient;
95
+ readonly status: import("./console-status.js").CodexStatusLoader;
96
+ registerCommands(program: Command, options?: {
97
+ nested?: boolean;
98
+ includeAuthCommands?: boolean;
99
+ }): Command;
100
+ getConsoleStatus(): Promise<import("./console-status.js").CodexConsoleStatus>;
101
+ resolveRuntime(args?: string[]): Promise<import("./runtime.js").CodexLaunch>;
102
+ run(args?: string[]): Promise<number>;
103
+ app(workspace?: string): Promise<number>;
104
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}