@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.
Files changed (99) hide show
  1. package/README.md +602 -0
  2. package/THIRD_PARTY_NOTICES.md +13 -0
  3. package/assets/codex-shortcut-icon.icns +0 -0
  4. package/assets/codex-shortcut-icon.ico +0 -0
  5. package/dist/app-config.d.ts +26 -0
  6. package/dist/app-config.js +135 -0
  7. package/dist/app-config.js.map +1 -0
  8. package/dist/backend.d.ts +16 -0
  9. package/dist/backend.js +106 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/branding.d.ts +7 -0
  12. package/dist/branding.js +13 -0
  13. package/dist/branding.js.map +1 -0
  14. package/dist/chatgpt-console.d.ts +53 -0
  15. package/dist/chatgpt-console.js +105 -0
  16. package/dist/chatgpt-console.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +451 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/codex-auth-agent.d.ts +60 -0
  21. package/dist/codex-auth-agent.js +331 -0
  22. package/dist/codex-auth-agent.js.map +1 -0
  23. package/dist/codex-commands.d.ts +2 -0
  24. package/dist/codex-commands.js +528 -0
  25. package/dist/codex-commands.js.map +1 -0
  26. package/dist/codex-legacy-cleanup.d.ts +5 -0
  27. package/dist/codex-legacy-cleanup.js +77 -0
  28. package/dist/codex-legacy-cleanup.js.map +1 -0
  29. package/dist/codex-process.d.ts +13 -0
  30. package/dist/codex-process.js +193 -0
  31. package/dist/codex-process.js.map +1 -0
  32. package/dist/codex-protocol.d.ts +352 -0
  33. package/dist/codex-protocol.js +116 -0
  34. package/dist/codex-protocol.js.map +1 -0
  35. package/dist/codex-quota-cache.d.ts +20 -0
  36. package/dist/codex-quota-cache.js +82 -0
  37. package/dist/codex-quota-cache.js.map +1 -0
  38. package/dist/codex-selection.d.ts +18 -0
  39. package/dist/codex-selection.js +47 -0
  40. package/dist/codex-selection.js.map +1 -0
  41. package/dist/codex-service-client.d.ts +11 -0
  42. package/dist/codex-service-client.js +91 -0
  43. package/dist/codex-service-client.js.map +1 -0
  44. package/dist/codex-shortcuts.d.ts +43 -0
  45. package/dist/codex-shortcuts.js +429 -0
  46. package/dist/codex-shortcuts.js.map +1 -0
  47. package/dist/codex-tui.d.ts +15 -0
  48. package/dist/codex-tui.js +235 -0
  49. package/dist/codex-tui.js.map +1 -0
  50. package/dist/command-catalog.d.ts +9 -0
  51. package/dist/command-catalog.js +206 -0
  52. package/dist/command-catalog.js.map +1 -0
  53. package/dist/config-page.d.ts +2 -0
  54. package/dist/config-page.js +51 -0
  55. package/dist/config-page.js.map +1 -0
  56. package/dist/config.d.ts +22 -0
  57. package/dist/config.js +99 -0
  58. package/dist/config.js.map +1 -0
  59. package/dist/identity.d.ts +23 -0
  60. package/dist/identity.js +78 -0
  61. package/dist/identity.js.map +1 -0
  62. package/dist/media/client.d.ts +79 -0
  63. package/dist/media/client.js +175 -0
  64. package/dist/media/client.js.map +1 -0
  65. package/dist/media/commands.d.ts +2 -0
  66. package/dist/media/commands.js +193 -0
  67. package/dist/media/commands.js.map +1 -0
  68. package/dist/media/errors.d.ts +8 -0
  69. package/dist/media/errors.js +37 -0
  70. package/dist/media/errors.js.map +1 -0
  71. package/dist/media/schemas.d.ts +62 -0
  72. package/dist/media/schemas.js +71 -0
  73. package/dist/media/schemas.js.map +1 -0
  74. package/dist/media/transfers.d.ts +38 -0
  75. package/dist/media/transfers.js +169 -0
  76. package/dist/media/transfers.js.map +1 -0
  77. package/dist/oauth.d.ts +30 -0
  78. package/dist/oauth.js +295 -0
  79. package/dist/oauth.js.map +1 -0
  80. package/dist/private-file.d.ts +3 -0
  81. package/dist/private-file.js +51 -0
  82. package/dist/private-file.js.map +1 -0
  83. package/dist/server.d.ts +2 -0
  84. package/dist/server.js +197 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/types.d.ts +40 -0
  87. package/dist/types.js +2 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/web-console-page.d.ts +3 -0
  90. package/dist/web-console-page.js +59 -0
  91. package/dist/web-console-page.js.map +1 -0
  92. package/dist/web-console.d.ts +22 -0
  93. package/dist/web-console.js +335 -0
  94. package/dist/web-console.js.map +1 -0
  95. package/examples/claude-desktop-installed-binary.json +11 -0
  96. package/examples/claude-desktop-npx.json +12 -0
  97. package/examples/codex-installed-binary.json +11 -0
  98. package/examples/codex-npx.json +12 -0
  99. package/package.json +67 -0
@@ -0,0 +1,235 @@
1
+ import process from "node:process";
2
+ import { cancel, isCancel, select } from "@clack/prompts";
3
+ import { codexQuotaWindowHasData } from "./codex-protocol.js";
4
+ const ANSI = {
5
+ reset: "\u001b[0m",
6
+ bold: "\u001b[1m",
7
+ dim: "\u001b[2m",
8
+ cyan: "\u001b[36m",
9
+ green: "\u001b[32m",
10
+ yellow: "\u001b[33m",
11
+ red: "\u001b[31m"
12
+ };
13
+ function terminalColor() {
14
+ return Boolean(process.stdout.isTTY && !process.env.NO_COLOR && process.env.TERM !== "dumb");
15
+ }
16
+ function terminalUnicode() {
17
+ return process.env.TERM !== "dumb" && process.env.NUMA_ASCII !== "1";
18
+ }
19
+ function paint(value, color, enabled) {
20
+ return enabled ? `${ANSI[color]}${value}${ANSI.reset}` : value;
21
+ }
22
+ function clampedPercent(value) {
23
+ return typeof value === "number" && Number.isFinite(value)
24
+ ? Math.max(0, Math.min(100, value))
25
+ : undefined;
26
+ }
27
+ export function quotaRemainingPercent(usedPercent) {
28
+ const used = clampedPercent(usedPercent);
29
+ return used === undefined ? undefined : Math.round(100 - used);
30
+ }
31
+ function remainingColor(remaining) {
32
+ if (remaining >= 50)
33
+ return "green";
34
+ if (remaining >= 20)
35
+ return "yellow";
36
+ return "red";
37
+ }
38
+ export function renderQuotaBar(remaining, width, options = {}) {
39
+ const unicode = options.unicode ?? true;
40
+ const empty = unicode ? "░" : "-";
41
+ if (remaining === undefined)
42
+ return empty.repeat(width);
43
+ const filled = unicode ? "█" : "#";
44
+ const filledWidth = Math.round((Math.max(0, Math.min(100, remaining)) / 100) * width);
45
+ const value = `${filled.repeat(filledWidth)}${empty.repeat(width - filledWidth)}`;
46
+ return paint(value, remainingColor(remaining), Boolean(options.color));
47
+ }
48
+ function quotaWindowLabel(minutes, fallback) {
49
+ if (typeof minutes !== "number" || !Number.isFinite(minutes) || minutes <= 0)
50
+ return fallback;
51
+ if (minutes % (24 * 60) === 0)
52
+ return `${minutes / (24 * 60)} 天`;
53
+ if (minutes % 60 === 0)
54
+ return `${minutes / 60} 小时`;
55
+ return `${Math.round(minutes)} 分钟`;
56
+ }
57
+ export function terminalCellWidth(value) {
58
+ let width = 0;
59
+ for (const character of value) {
60
+ const codePoint = character.codePointAt(0) ?? 0;
61
+ const isCombiningMark = /\p{Mark}/u.test(character);
62
+ const isWide = codePoint >= 0x1100 &&
63
+ (codePoint <= 0x115f ||
64
+ codePoint === 0x2329 ||
65
+ codePoint === 0x232a ||
66
+ (codePoint >= 0x2e80 && codePoint <= 0xa4cf) ||
67
+ (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
68
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
69
+ (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
70
+ (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||
71
+ (codePoint >= 0xff00 && codePoint <= 0xff60) ||
72
+ (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||
73
+ (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||
74
+ (codePoint >= 0x20000 && codePoint <= 0x3fffd));
75
+ width += isCombiningMark ? 0 : isWide ? 2 : 1;
76
+ }
77
+ return width;
78
+ }
79
+ function padTerminalEnd(value, targetWidth) {
80
+ return `${value}${" ".repeat(Math.max(0, targetWidth - terminalCellWidth(value)))}`;
81
+ }
82
+ function instantMilliseconds(value) {
83
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
84
+ return value < 1_000_000_000_000 ? value * 1000 : value;
85
+ }
86
+ if (typeof value === "string") {
87
+ const parsed = Date.parse(value);
88
+ return Number.isFinite(parsed) ? parsed : undefined;
89
+ }
90
+ return undefined;
91
+ }
92
+ export function formatQuotaRefresh(value, now = Date.now()) {
93
+ const timestamp = instantMilliseconds(value);
94
+ if (timestamp === undefined)
95
+ return "刷新时间未知";
96
+ const remainingMs = timestamp - now;
97
+ if (remainingMs <= 0)
98
+ return "等待刷新";
99
+ const minutes = Math.ceil(remainingMs / 60_000);
100
+ if (minutes < 60)
101
+ return `${minutes} 分钟后刷新`;
102
+ const hours = Math.ceil(remainingMs / 3_600_000);
103
+ if (hours < 24)
104
+ return `${hours} 小时后刷新`;
105
+ const days = Math.ceil(remainingMs / 86_400_000);
106
+ if (days <= 7)
107
+ return `${days} 天后刷新`;
108
+ return `${new Date(timestamp).toLocaleString("zh-CN", {
109
+ month: "2-digit",
110
+ day: "2-digit",
111
+ hour: "2-digit",
112
+ minute: "2-digit",
113
+ hour12: false
114
+ })} 刷新`;
115
+ }
116
+ function quotaLine(label, usedPercent, resetAt, barWidth, options) {
117
+ const remaining = quotaRemainingPercent(usedPercent);
118
+ const percentage = remaining === undefined ? " --" : String(remaining).padStart(3, " ");
119
+ const percentageText = remaining === undefined
120
+ ? `${percentage}%`
121
+ : paint(`${percentage}%`, remainingColor(remaining), options.color);
122
+ return `${padTerminalEnd(label, 8)} ${renderQuotaBar(remaining, barWidth, options)} ${percentageText} 剩余 · ${formatQuotaRefresh(resetAt, options.now)}`;
123
+ }
124
+ function accountQuotaLines(quota, barWidth, options) {
125
+ if (!quota)
126
+ return [paint("额度 暂无额度数据", "dim", options.color)];
127
+ const lines = [
128
+ codexQuotaWindowHasData(quota.primary)
129
+ ? quotaLine(quotaWindowLabel(quota.primary?.windowMinutes, "短周期"), quota.primary?.usedPercent, quota.primary?.resetAt, barWidth, options)
130
+ : undefined,
131
+ codexQuotaWindowHasData(quota.secondary)
132
+ ? quotaLine(quotaWindowLabel(quota.secondary?.windowMinutes, "长周期"), quota.secondary?.usedPercent, quota.secondary?.resetAt, barWidth, options)
133
+ : undefined
134
+ ].filter((line) => line !== undefined);
135
+ return lines.length > 0
136
+ ? lines
137
+ : [paint("额度 暂无有效额度窗口", "dim", options.color)];
138
+ }
139
+ function compactQuota(quota) {
140
+ if (!quota)
141
+ return "暂无额度";
142
+ const windows = [
143
+ { window: quota.primary, fallback: "短周期" },
144
+ { window: quota.secondary, fallback: "长周期" }
145
+ ].filter(({ window }) => codexQuotaWindowHasData(window));
146
+ if (windows.length === 0)
147
+ return "暂无额度";
148
+ return windows
149
+ .map(({ window, fallback }) => {
150
+ const remaining = quotaRemainingPercent(window?.usedPercent);
151
+ return `${quotaWindowLabel(window?.windowMinutes, fallback)} ${remaining === undefined ? "--" : remaining}%`;
152
+ })
153
+ .join(" · ");
154
+ }
155
+ export function isCodexAccountAvailable(account) {
156
+ return account.credentialStatus == null || account.credentialStatus === "AVAILABLE";
157
+ }
158
+ export function codexAccountStatusText(account) {
159
+ if (account.credentialStatus === "NEEDS_REAUTH")
160
+ return "凭据已失效";
161
+ if (account.credentialStatus === "TEMPORARILY_UNAVAILABLE")
162
+ return "服务暂时不可用";
163
+ return undefined;
164
+ }
165
+ export function renderCodexAccountDashboard(accounts, selectedAccountId, tuiOptions = {}) {
166
+ const columns = Math.max(40, tuiOptions.columns ?? process.stdout.columns ?? 80);
167
+ const options = {
168
+ color: tuiOptions.color ?? terminalColor(),
169
+ unicode: tuiOptions.unicode ?? terminalUnicode(),
170
+ now: tuiOptions.now ?? Date.now()
171
+ };
172
+ const barWidth = columns >= 96 ? 24 : columns >= 72 ? 18 : 10;
173
+ const selectedSymbol = options.unicode ? "◆" : ">";
174
+ const idleSymbol = options.unicode ? "◇" : "-";
175
+ const rail = options.unicode ? "│" : "|";
176
+ const availableCount = accounts.filter(isCodexAccountAvailable).length;
177
+ const countText = availableCount === accounts.length
178
+ ? `${accounts.length} 个可用`
179
+ : `${accounts.length} 个账号 · ${availableCount} 个可用`;
180
+ const lines = [
181
+ `${paint("ChatGPT 账号", "bold", options.color)} ${countText}`,
182
+ ""
183
+ ];
184
+ accounts.forEach((account, index) => {
185
+ const selected = selectedAccountId
186
+ ? account.id === selectedAccountId
187
+ : account.isDefault;
188
+ const symbol = selected ? paint(selectedSymbol, "cyan", options.color) : paint(idleSymbol, "dim", options.color);
189
+ const selectedText = selected ? ` ${paint("当前", "cyan", options.color)}` : "";
190
+ const badges = [
191
+ codexAccountStatusText(account)
192
+ ? paint(codexAccountStatusText(account), "red", options.color)
193
+ : undefined,
194
+ account.quota?.planType?.toUpperCase(),
195
+ account.quota?.activeLimit != null ? `LIMIT ${account.quota.activeLimit}` : undefined
196
+ ]
197
+ .filter(Boolean)
198
+ .join(" · ");
199
+ lines.push(`${symbol} ${paint(account.label, "bold", options.color)}${selectedText}`);
200
+ lines.push(`${paint(rail, "dim", options.color)} ${paint(account.id, "dim", options.color)}${badges ? ` · ${badges}` : ""}`);
201
+ for (const quota of accountQuotaLines(account.quota, barWidth, options)) {
202
+ lines.push(`${paint(rail, "dim", options.color)} ${quota}`);
203
+ }
204
+ if (index < accounts.length - 1)
205
+ lines.push("");
206
+ });
207
+ return `${lines.join("\n")}\n`;
208
+ }
209
+ export async function promptCodexAccount(accounts, selectedAccountId) {
210
+ const answer = await select({
211
+ message: "选择要使用的 ChatGPT 账号(↑↓ 移动,回车确认)",
212
+ initialValue: accounts.some((account) => account.id === selectedAccountId)
213
+ ? selectedAccountId
214
+ : undefined,
215
+ maxItems: Math.min(10, accounts.length),
216
+ showInstructions: false,
217
+ options: accounts.map((account) => ({
218
+ value: account.id,
219
+ label: account.label,
220
+ hint: isCodexAccountAvailable(account)
221
+ ? `${compactQuota(account.quota)} · ${account.id}`
222
+ : `${codexAccountStatusText(account)} · ${account.id}`,
223
+ disabled: !isCodexAccountAvailable(account)
224
+ }))
225
+ });
226
+ if (isCancel(answer)) {
227
+ cancel("已取消账号选择");
228
+ throw new Error("已取消账号选择。");
229
+ }
230
+ const account = accounts.find((candidate) => candidate.id === answer);
231
+ if (!account)
232
+ throw new Error("选择的账号已不在可用列表中,请重新运行命令。");
233
+ return account;
234
+ }
235
+ //# sourceMappingURL=codex-tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-tui.js","sourceRoot":"","sources":["../src/codex-tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type AccessLevel = "public" | "authenticated" | "role";
2
+ export interface CommandDescriptor {
3
+ command: string;
4
+ summary: string;
5
+ access: AccessLevel;
6
+ roles?: string[];
7
+ examples: string[];
8
+ }
9
+ export declare const COMMAND_CATALOG: CommandDescriptor[];
@@ -0,0 +1,206 @@
1
+ export const COMMAND_CATALOG = [
2
+ {
3
+ command: "help [command]",
4
+ summary: "查看面向用户和 AI 的完整命令说明",
5
+ access: "public",
6
+ examples: ["numa help", "numa help request"]
7
+ },
8
+ {
9
+ command: "commands [--json]",
10
+ summary: "列出机器可读的命令、访问级别和示例",
11
+ access: "public",
12
+ examples: ["numa commands --json"]
13
+ },
14
+ {
15
+ command: "doctor [--json]",
16
+ summary: "检查本机运行环境、配置和登录缓存",
17
+ access: "public",
18
+ examples: ["numa doctor"]
19
+ },
20
+ {
21
+ command: "config [--show] [--set <key=value...>]",
22
+ summary: "打开配置页或通过参数读写基础配置",
23
+ access: "public",
24
+ examples: ["numa config", "numa config --set output=json --set apiBaseUrl=https://dev.example"]
25
+ },
26
+ {
27
+ command: "login [--no-console] [--no-config]",
28
+ summary: "使用 Keycloak PKCE 登录;成功后默认跳转本地网页控制台",
29
+ access: "public",
30
+ examples: ["numa login", "numa login --no-config --json"]
31
+ },
32
+ {
33
+ command: "console [--no-open]",
34
+ summary: "启动只监听回环地址的本地网页控制台",
35
+ access: "public",
36
+ examples: ["numa console", "numa console --no-open"]
37
+ },
38
+ {
39
+ command: "auth status",
40
+ summary: "查看本地登录状态,不输出令牌",
41
+ access: "public",
42
+ examples: ["numa auth status --json"]
43
+ },
44
+ {
45
+ command: "auth logout",
46
+ summary: "删除本地登录缓存,不影响服务端 Keycloak 会话",
47
+ access: "public",
48
+ examples: ["numa auth logout"]
49
+ },
50
+ {
51
+ command: "profile [--refresh]",
52
+ summary: "显示当前用户资料、Realm/Client 角色和用户组",
53
+ access: "authenticated",
54
+ examples: ["numa profile", "numa profile --json"]
55
+ },
56
+ {
57
+ command: "request <path>",
58
+ summary: "携带登录凭据调用配置的内部研发平台 API",
59
+ access: "authenticated",
60
+ examples: ["numa request /api/projects", "numa request /api/jobs --method POST --body '{\"name\":\"build\"}'"]
61
+ },
62
+ {
63
+ command: "admin context",
64
+ summary: "检查管理员研发平台上下文",
65
+ access: "role",
66
+ roles: ["platform-admin", "numa-admin"],
67
+ examples: ["numa admin context --json"]
68
+ },
69
+ {
70
+ command: "media capabilities",
71
+ summary: "查询平台媒体 API、Provider 和版本能力",
72
+ access: "authenticated",
73
+ examples: ["numa media capabilities --json"]
74
+ },
75
+ {
76
+ command: "media tts submit --input <file> [--idempotency-key <key>]",
77
+ summary: "提交平台托管的 TTS 异步任务",
78
+ access: "authenticated",
79
+ examples: ["numa media tts submit --input narration.json --idempotency-key scene-01 --json"]
80
+ },
81
+ {
82
+ command: "media video submit --input <file> [--idempotency-key <key>]",
83
+ summary: "提交平台托管的视频生成异步任务",
84
+ access: "authenticated",
85
+ examples: ["numa media video submit --input seedance.json --idempotency-key shot-01 --json"]
86
+ },
87
+ {
88
+ command: "media job inspect <jobId>",
89
+ summary: "查询媒体异步任务状态和结果",
90
+ access: "authenticated",
91
+ examples: ["numa media job inspect job_123 --json"]
92
+ },
93
+ {
94
+ command: "media job resolve --type <tts|video> --idempotency-key <key>",
95
+ summary: "按幂等键解析已有任务,避免结果不明时重复付费提交",
96
+ access: "authenticated",
97
+ examples: ["numa media job resolve --type video --idempotency-key shot-01 --json"]
98
+ },
99
+ {
100
+ command: "media artifact pull <artifactId> --output <file>",
101
+ summary: "流式下载并校验媒体产物,原子写入目标路径",
102
+ access: "authenticated",
103
+ examples: ["numa media artifact pull artifact_123 --output result.mp4 --json"]
104
+ },
105
+ {
106
+ command: "media asset upload <file>",
107
+ summary: "使用流式 multipart 上传媒体输入资产",
108
+ access: "authenticated",
109
+ examples: ["numa media asset upload reference.png --kind image --json"]
110
+ },
111
+ {
112
+ command: "media library search",
113
+ summary: "按关键词和游标分页查询媒体素材库",
114
+ access: "authenticated",
115
+ examples: ["numa media library search --query product --limit 20 --json"]
116
+ },
117
+ {
118
+ command: "media library inspect <id@semver>",
119
+ summary: "按精确版本查询素材和 artifactId",
120
+ access: "authenticated",
121
+ examples: ["numa media library inspect logo-main@1.2.0 --json"]
122
+ },
123
+ {
124
+ command: "media library pull <id@semver> --output <path>",
125
+ summary: "解析精确版本并流式下载素材",
126
+ access: "authenticated",
127
+ examples: ["numa media library pull logo-main@1.2.0 --output ./assets --json"]
128
+ },
129
+ {
130
+ command: "media library publish --manifest <file>",
131
+ summary: "发布引用已上传 artifactId 的素材清单",
132
+ access: "authenticated",
133
+ examples: ["numa media library publish --manifest library-entry.json --json"]
134
+ },
135
+ {
136
+ command: "serve",
137
+ summary: "运行兼容的 stdio MCP 服务",
138
+ access: "public",
139
+ examples: ["numa serve"]
140
+ },
141
+ {
142
+ command: "codex list [--server <url>]",
143
+ summary: "列出服务端 Codex 账号元数据,不传输 refresh token",
144
+ access: "authenticated",
145
+ examples: ["numa codex list --server https://platform.example/api"]
146
+ },
147
+ {
148
+ command: "codex upload [--server <url>]",
149
+ summary: "把 codex-multi-auth 管理的本地账号池批量上传到平台",
150
+ access: "authenticated",
151
+ examples: [
152
+ "numa codex upload --server https://platform.example/api",
153
+ "numa codex upload --storage ~/.codex/multi-auth/openai-codex-accounts.json"
154
+ ]
155
+ },
156
+ {
157
+ command: "codex use [account]",
158
+ summary: "选择服务端账号并写入官方 ChatGPT auth.json",
159
+ access: "authenticated",
160
+ examples: ["numa codex use acct_xxx"]
161
+ },
162
+ {
163
+ command: "codex run [--select-account|--account <id>] [--] [codexArgs...]",
164
+ summary: "选择或复用 ChatGPT 账号后启动官方 Codex;模型流量不经过 numa",
165
+ access: "authenticated",
166
+ examples: ["numa codex run --select-account", "numa codex run --account acct_xxx", "numa codex run -- exec \"完成长任务\""]
167
+ },
168
+ {
169
+ command: "codex app [workspace] [--select-account|--account <id>]",
170
+ summary: "使用官方 ChatGPT 登录启动 macOS/Windows 官方 Codex 桌面 App",
171
+ access: "authenticated",
172
+ examples: ["numa codex app . --select-account", "numa codex app . --account acct_xxx"]
173
+ },
174
+ {
175
+ command: "codex shortcut [install|remove] [--target run|app|both]",
176
+ summary: "安装或删除 macOS/Windows 的 Codex 快捷命令与桌面入口",
177
+ access: "public",
178
+ examples: [
179
+ "numa codex shortcut install",
180
+ "numa codex shortcut install --target app --workspace .",
181
+ "numa codex shortcut remove"
182
+ ]
183
+ },
184
+ {
185
+ command: "codex auth-agent [account]",
186
+ summary: "前台刷新短效 token 到官方 Codex 登录并输出完整状态日志",
187
+ access: "authenticated",
188
+ examples: [
189
+ "numa codex auth-agent acct_xxx --replace-login",
190
+ "numa codex auth-agent --replace-login --once"
191
+ ]
192
+ },
193
+ {
194
+ command: "codex status",
195
+ summary: "查看当前账号选择与官方 ChatGPT auth.json 状态",
196
+ access: "public",
197
+ examples: ["numa codex status --json"]
198
+ },
199
+ {
200
+ command: "codex reset",
201
+ summary: "重置本地账号选择和登录,并清理废弃的 provider 残留",
202
+ access: "public",
203
+ examples: ["numa codex reset"]
204
+ }
205
+ ];
206
+ //# sourceMappingURL=command-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-catalog.js","sourceRoot":"","sources":["../src/command-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { AppConfig } from "./app-config.js";
2
+ export declare function openConfigPage(): Promise<AppConfig>;
@@ -0,0 +1,51 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { stdin, stdout } from "node:process";
3
+ import { appConfigPath, loadAppConfig, saveAppConfig } from "./app-config.js";
4
+ async function ask(prompt, current, validate) {
5
+ const terminal = createInterface({ input: stdin, output: stdout });
6
+ try {
7
+ while (true) {
8
+ const answer = (await terminal.question(`${prompt} [${current || "未设置"}]: `)).trim();
9
+ const value = answer || current;
10
+ const error = validate?.(value);
11
+ if (!error)
12
+ return value;
13
+ stdout.write(` ${error}\n`);
14
+ }
15
+ }
16
+ finally {
17
+ terminal.close();
18
+ }
19
+ }
20
+ function validateHttpUrl(value) {
21
+ if (!value)
22
+ return undefined;
23
+ try {
24
+ const url = new URL(value);
25
+ return ["http:", "https:"].includes(url.protocol) ? undefined : "请输入 HTTP(S) URL";
26
+ }
27
+ catch {
28
+ return "请输入有效 URL";
29
+ }
30
+ }
31
+ export async function openConfigPage() {
32
+ const current = await loadAppConfig();
33
+ stdout.write("\nNuma CLI 基础配置\n");
34
+ stdout.write("直接回车保留当前值。配置可随时通过 `numa config` 重新打开。\n\n");
35
+ const locale = (await ask("界面语言 (zh-CN/en-US)", current.locale, (value) => ["zh-CN", "en-US"].includes(value) ? undefined : "可选值: zh-CN, en-US"));
36
+ const output = (await ask("默认输出 (text/json)", current.output, (value) => ["text", "json"].includes(value) ? undefined : "可选值: text, json"));
37
+ const apiBaseUrl = await ask("内部研发平台 API 地址", current.apiBaseUrl, validateHttpUrl);
38
+ const registryUrl = await ask("npm registry", current.registryUrl, validateHttpUrl);
39
+ const checkUpdatesText = await ask("启动时检查更新 (true/false)", String(current.checkUpdates), (value) => ["true", "false"].includes(value) ? undefined : "可选值: true, false");
40
+ const saved = await saveAppConfig({
41
+ ...current,
42
+ locale,
43
+ output,
44
+ apiBaseUrl,
45
+ registryUrl,
46
+ checkUpdates: checkUpdatesText === "true"
47
+ });
48
+ stdout.write(`\n配置已保存: ${appConfigPath()}\n`);
49
+ return saved;
50
+ }
51
+ //# sourceMappingURL=config-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-page.js","sourceRoot":"","sources":["../src/config-page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface AuthConfig {
2
+ discoveryUrl: string;
3
+ issuerUrl?: string;
4
+ clientId: string;
5
+ clientSecret?: string;
6
+ scope: string;
7
+ tokenFile: string;
8
+ redirectHost: string;
9
+ redirectPort: number;
10
+ redirectPath: string;
11
+ openBrowser: boolean;
12
+ backendBaseUrl?: string;
13
+ allowAbsoluteBackendUrls: boolean;
14
+ }
15
+ export declare const DEFAULT_DISCOVERY_URL = "https://kc.mcisaas.com/auth/realms/numa-realm/.well-known/openid-configuration";
16
+ export declare const DEFAULT_CLIENT_ID = "mcp-client";
17
+ export declare const DEFAULT_SCOPE = "openid profile email offline_access";
18
+ export declare function defaultTokenFile(): string;
19
+ export declare const DEFAULT_REDIRECT_HOST = "127.0.0.1";
20
+ export declare const DEFAULT_REDIRECT_PORT = 8765;
21
+ export declare function loadConfig(): AuthConfig;
22
+ export declare function redirectUri(config: AuthConfig): string;