@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
package/dist/cli.js
ADDED
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { Command, CommanderError, Option } from "commander";
|
|
5
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
|
+
import { CONFIG_KEYS, appConfigPath, hasAppConfig, loadAppConfig, resetAppConfig, saveAppConfig, updateConfigValue } from "./app-config.js";
|
|
7
|
+
import { authenticatedBackendRequest } from "./backend.js";
|
|
8
|
+
import { CLI_NAME, PACKAGE_VERSION, PRODUCT_NAME } from "./branding.js";
|
|
9
|
+
import { COMMAND_CATALOG } from "./command-catalog.js";
|
|
10
|
+
import { registerCodexCommands } from "./codex-commands.js";
|
|
11
|
+
import { CodexRuntimeError } from "./codex-process.js";
|
|
12
|
+
import { CodexServiceError } from "./codex-service-client.js";
|
|
13
|
+
import { loadConfig } from "./config.js";
|
|
14
|
+
import { openConfigPage } from "./config-page.js";
|
|
15
|
+
import { currentIdentity, requireAnyRole, RoleRequiredError } from "./identity.js";
|
|
16
|
+
import { AuthError, blockingBrowserLogin, deleteTokenCache, readTokenCache } from "./oauth.js";
|
|
17
|
+
import { createServer } from "./server.js";
|
|
18
|
+
import { registerMediaCommands } from "./media/commands.js";
|
|
19
|
+
import { MediaError } from "./media/errors.js";
|
|
20
|
+
import { startWebConsole } from "./web-console.js";
|
|
21
|
+
const ADMIN_ROLES = ["platform-admin", "numa-admin"];
|
|
22
|
+
function globals(command) {
|
|
23
|
+
return command.optsWithGlobals();
|
|
24
|
+
}
|
|
25
|
+
function shouldUseJson(command, config) {
|
|
26
|
+
return Boolean(globals(command).json || config?.output === "json");
|
|
27
|
+
}
|
|
28
|
+
function printJson(value) {
|
|
29
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
30
|
+
}
|
|
31
|
+
function formatList(values) {
|
|
32
|
+
return values.length ? values.join(", ") : "-";
|
|
33
|
+
}
|
|
34
|
+
function printConfig(config, json) {
|
|
35
|
+
if (json) {
|
|
36
|
+
printJson({ ok: true, config_file: appConfigPath(), config });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
process.stdout.write(`配置文件: ${appConfigPath()}\n`);
|
|
40
|
+
process.stdout.write(`语言: ${config.locale}\n`);
|
|
41
|
+
process.stdout.write(`默认输出: ${config.output}\n`);
|
|
42
|
+
process.stdout.write(`平台 API: ${config.apiBaseUrl || "未设置"}\n`);
|
|
43
|
+
process.stdout.write(`npm registry: ${config.registryUrl}\n`);
|
|
44
|
+
process.stdout.write(`检查更新: ${config.checkUpdates ? "是" : "否"}\n`);
|
|
45
|
+
}
|
|
46
|
+
function publicIdentity(identity) {
|
|
47
|
+
const { raw: _raw, ...safeIdentity } = identity;
|
|
48
|
+
return safeIdentity;
|
|
49
|
+
}
|
|
50
|
+
function printIdentity(identity, json) {
|
|
51
|
+
const safe = publicIdentity(identity);
|
|
52
|
+
if (json) {
|
|
53
|
+
printJson({ ok: true, user: safe });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
process.stdout.write(`用户名: ${safe.username ?? "-"}\n`);
|
|
57
|
+
process.stdout.write(`姓名: ${safe.displayName ?? "-"}\n`);
|
|
58
|
+
process.stdout.write(`邮箱: ${safe.email ?? "-"}\n`);
|
|
59
|
+
process.stdout.write(`用户 ID: ${safe.subject ?? "-"}\n`);
|
|
60
|
+
process.stdout.write(`Realm 角色: ${formatList(safe.realmRoles)}\n`);
|
|
61
|
+
for (const [client, roles] of Object.entries(safe.clientRoles)) {
|
|
62
|
+
process.stdout.write(`Client 角色 (${client}): ${formatList(roles)}\n`);
|
|
63
|
+
}
|
|
64
|
+
process.stdout.write(`全部角色: ${formatList(safe.roles)}\n`);
|
|
65
|
+
process.stdout.write(`用户组: ${formatList(safe.groups)}\n`);
|
|
66
|
+
}
|
|
67
|
+
function addExamples(command, examples) {
|
|
68
|
+
return command.addHelpText("after", `\nExamples:\n${examples.map((item) => ` ${item}`).join("\n")}\n`);
|
|
69
|
+
}
|
|
70
|
+
function configureJsonCommandErrors(command) {
|
|
71
|
+
command.configureOutput({ writeErr: () => undefined });
|
|
72
|
+
command.exitOverride();
|
|
73
|
+
for (const child of command.commands)
|
|
74
|
+
configureJsonCommandErrors(child);
|
|
75
|
+
}
|
|
76
|
+
async function serve() {
|
|
77
|
+
const server = createServer();
|
|
78
|
+
await server.connect(new StdioServerTransport());
|
|
79
|
+
}
|
|
80
|
+
async function keepWebConsoleOpen(handle) {
|
|
81
|
+
const close = () => { void handle.close(); };
|
|
82
|
+
process.once("SIGINT", close);
|
|
83
|
+
process.once("SIGTERM", close);
|
|
84
|
+
try {
|
|
85
|
+
process.stdout.write(`${PRODUCT_NAME} CLI 控制台: ${handle.url}\n`);
|
|
86
|
+
process.stdout.write("控制台仅监听本机;按 Ctrl+C 停止。\n");
|
|
87
|
+
await handle.waitUntilClosed();
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
process.removeListener("SIGINT", close);
|
|
91
|
+
process.removeListener("SIGTERM", close);
|
|
92
|
+
await handle.close().catch(() => undefined);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function validateRequestBody(body) {
|
|
96
|
+
if (body == null)
|
|
97
|
+
return undefined;
|
|
98
|
+
try {
|
|
99
|
+
return JSON.parse(body);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return body;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function fileExists(path) {
|
|
106
|
+
try {
|
|
107
|
+
await access(path);
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function main() {
|
|
115
|
+
const program = new Command();
|
|
116
|
+
program
|
|
117
|
+
.name(CLI_NAME)
|
|
118
|
+
.description(`${PRODUCT_NAME} 公司内部研发平台 CLI(含 Keycloak 登录与 MCP 兼容服务)`)
|
|
119
|
+
.version(PACKAGE_VERSION, "-V, --version", "输出 CLI 版本")
|
|
120
|
+
.option("--json", "以稳定 JSON 输出,适合 AI、脚本和 CI")
|
|
121
|
+
.showSuggestionAfterError()
|
|
122
|
+
.showHelpAfterError()
|
|
123
|
+
.addHelpText("after", `
|
|
124
|
+
Access model:
|
|
125
|
+
public 无需登录,可直接使用
|
|
126
|
+
authenticated 需要有效登录,过期时自动刷新
|
|
127
|
+
role 需要有效登录及命令声明的任一角色
|
|
128
|
+
|
|
129
|
+
AI integration:
|
|
130
|
+
使用 "numa commands --json" 获取机器可读命令目录。
|
|
131
|
+
使用全局 "--json" 获得稳定结构化输出;错误同样写入 JSON。
|
|
132
|
+
|
|
133
|
+
Examples:
|
|
134
|
+
numa doctor
|
|
135
|
+
numa login
|
|
136
|
+
numa config
|
|
137
|
+
numa profile --json
|
|
138
|
+
numa request /api/projects --json
|
|
139
|
+
`);
|
|
140
|
+
addExamples(program
|
|
141
|
+
.command("commands")
|
|
142
|
+
.description("列出命令目录、登录要求、角色要求和调用示例(无需登录)")
|
|
143
|
+
.option("--json", "输出 JSON(该命令默认即为适合阅读的目录)")
|
|
144
|
+
.action(async (_options, command) => {
|
|
145
|
+
if (shouldUseJson(command, await loadAppConfig()) || command.opts().json) {
|
|
146
|
+
printJson({ schema_version: 1, cli: CLI_NAME, version: PACKAGE_VERSION, commands: COMMAND_CATALOG });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
for (const item of COMMAND_CATALOG) {
|
|
150
|
+
const access = item.roles?.length ? `${item.access}:${item.roles.join("|")}` : item.access;
|
|
151
|
+
process.stdout.write(`${item.command.padEnd(48)} [${access}]\n ${item.summary}\n`);
|
|
152
|
+
}
|
|
153
|
+
}), ["numa commands", "numa commands --json"]);
|
|
154
|
+
addExamples(program
|
|
155
|
+
.command("doctor")
|
|
156
|
+
.description("检查 Node.js、CLI 配置和本地登录缓存(无需登录、不会发起网络请求)")
|
|
157
|
+
.action(async (_options, command) => {
|
|
158
|
+
const config = await loadAppConfig();
|
|
159
|
+
const authConfig = loadConfig();
|
|
160
|
+
const checks = {
|
|
161
|
+
node: { ok: Number(process.versions.node.split(".")[0]) >= 20, version: process.versions.node },
|
|
162
|
+
platform: { ok: true, os: process.platform, arch: process.arch },
|
|
163
|
+
configuration: { ok: await hasAppConfig(), path: appConfigPath() },
|
|
164
|
+
authentication_cache: { ok: await fileExists(authConfig.tokenFile), path: authConfig.tokenFile },
|
|
165
|
+
api_base_url: { ok: Boolean(authConfig.backendBaseUrl), value: authConfig.backendBaseUrl ?? null }
|
|
166
|
+
};
|
|
167
|
+
const ok = checks.node.ok;
|
|
168
|
+
if (shouldUseJson(command, config)) {
|
|
169
|
+
printJson({ ok, checks });
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
process.stdout.write(`Node.js: ${checks.node.version} ${checks.node.ok ? "✓" : "✗ (需要 >=20)"}\n`);
|
|
173
|
+
process.stdout.write(`平台: ${checks.platform.os}/${checks.platform.arch} ✓\n`);
|
|
174
|
+
process.stdout.write(`CLI 配置: ${checks.configuration.ok ? "已初始化" : "未初始化"}\n`);
|
|
175
|
+
process.stdout.write(`登录缓存: ${checks.authentication_cache.ok ? "存在" : "不存在"}\n`);
|
|
176
|
+
process.stdout.write(`平台 API: ${checks.api_base_url.value ?? "未设置"}\n`);
|
|
177
|
+
}
|
|
178
|
+
if (!ok)
|
|
179
|
+
process.exitCode = 1;
|
|
180
|
+
}), ["numa doctor", "numa doctor --json"]);
|
|
181
|
+
addExamples(program
|
|
182
|
+
.command("config")
|
|
183
|
+
.description("打开交互式配置页;也可用参数重新配置(无需登录)")
|
|
184
|
+
.option("--show", "仅显示当前配置")
|
|
185
|
+
.option("--set <key=value...>", `设置一个或多个配置项: ${CONFIG_KEYS.join(", ")}`)
|
|
186
|
+
.option("--reset", "删除当前 CLI 配置")
|
|
187
|
+
.action(async (options, command) => {
|
|
188
|
+
if (options.reset) {
|
|
189
|
+
const previousConfig = await loadAppConfig();
|
|
190
|
+
await resetAppConfig();
|
|
191
|
+
const payload = { ok: true, reset: true, config_file: appConfigPath() };
|
|
192
|
+
if (shouldUseJson(command, previousConfig))
|
|
193
|
+
printJson(payload);
|
|
194
|
+
else
|
|
195
|
+
process.stdout.write(`已重置配置: ${appConfigPath()}\n`);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
let config = await loadAppConfig();
|
|
199
|
+
if (options.set?.length) {
|
|
200
|
+
for (const expression of options.set)
|
|
201
|
+
config = updateConfigValue(config, expression);
|
|
202
|
+
config = await saveAppConfig(config);
|
|
203
|
+
printConfig(config, shouldUseJson(command, config));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (options.show || !process.stdin.isTTY || shouldUseJson(command, config)) {
|
|
207
|
+
printConfig(config, shouldUseJson(command, config));
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
await openConfigPage();
|
|
211
|
+
}), [
|
|
212
|
+
"numa config",
|
|
213
|
+
"numa config --show --json",
|
|
214
|
+
"numa config --set output=json --set apiBaseUrl=https://rd.example.internal"
|
|
215
|
+
]);
|
|
216
|
+
addExamples(program
|
|
217
|
+
.command("login")
|
|
218
|
+
.description("使用 Keycloak PKCE 登录;成功后默认进入本地网页控制台")
|
|
219
|
+
.option("--no-console", "登录后不启动网页控制台,适合自动化")
|
|
220
|
+
.option("--no-config", "登录成功后不打开配置页,适合自动化")
|
|
221
|
+
.action(async (options, command) => {
|
|
222
|
+
const authConfig = loadConfig();
|
|
223
|
+
const json = globals(command).json === true;
|
|
224
|
+
const useConsole = options.console && process.stdin.isTTY && !json;
|
|
225
|
+
const consoleHandle = useConsole
|
|
226
|
+
? await startWebConsole({ openBrowser: false })
|
|
227
|
+
: undefined;
|
|
228
|
+
let info;
|
|
229
|
+
try {
|
|
230
|
+
info = await blockingBrowserLogin(authConfig, {
|
|
231
|
+
successRedirectUrl: consoleHandle ? `${consoleHandle.url}/?login=complete` : undefined,
|
|
232
|
+
failureRedirectUrl: consoleHandle ? `${consoleHandle.url}/?login=failed` : undefined
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
await consoleHandle?.close().catch(() => undefined);
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
const identity = await currentIdentity(authConfig);
|
|
240
|
+
if (options.config && !consoleHandle) {
|
|
241
|
+
if (process.stdin.isTTY && !globals(command).json) {
|
|
242
|
+
await openConfigPage();
|
|
243
|
+
}
|
|
244
|
+
else if (!(await hasAppConfig())) {
|
|
245
|
+
await saveAppConfig(await loadAppConfig());
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (shouldUseJson(command, await loadAppConfig())) {
|
|
249
|
+
printJson({
|
|
250
|
+
ok: true,
|
|
251
|
+
user: publicIdentity(identity),
|
|
252
|
+
token_file: authConfig.tokenFile,
|
|
253
|
+
config_file: appConfigPath(),
|
|
254
|
+
console_url: consoleHandle?.url ?? null,
|
|
255
|
+
configuration_opened: Boolean(options.config && !consoleHandle && process.stdin.isTTY && !globals(command).json)
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
process.stdout.write(`登录成功: ${String(info.preferred_username ?? info.email ?? info.sub ?? "unknown")}\n`);
|
|
260
|
+
}
|
|
261
|
+
if (consoleHandle)
|
|
262
|
+
await keepWebConsoleOpen(consoleHandle);
|
|
263
|
+
}), ["numa login", "numa login --no-console --no-config --json"]);
|
|
264
|
+
addExamples(program
|
|
265
|
+
.command("console")
|
|
266
|
+
.description("启动只监听本机的 Numa CLI 网页控制台")
|
|
267
|
+
.option("--no-open", "不自动打开浏览器")
|
|
268
|
+
.action(async (options) => {
|
|
269
|
+
await keepWebConsoleOpen(await startWebConsole({ openBrowser: options.open }));
|
|
270
|
+
}), ["numa console", "numa console --no-open"]);
|
|
271
|
+
const auth = program.command("auth").description("登录状态与会话管理");
|
|
272
|
+
addExamples(auth
|
|
273
|
+
.command("status")
|
|
274
|
+
.description("读取本地登录状态(无需登录,不发起网络请求,不输出令牌)")
|
|
275
|
+
.action(async (_options, command) => {
|
|
276
|
+
const authConfig = loadConfig();
|
|
277
|
+
const cache = await readTokenCache(authConfig);
|
|
278
|
+
const status = {
|
|
279
|
+
logged_in: Boolean(cache),
|
|
280
|
+
token_file: authConfig.tokenFile,
|
|
281
|
+
expires_at: cache?.expiresAt ?? null,
|
|
282
|
+
refresh_expires_at: cache?.refreshExpiresAt ?? null,
|
|
283
|
+
cached_user: cache?.userinfo
|
|
284
|
+
? {
|
|
285
|
+
sub: cache.userinfo.sub,
|
|
286
|
+
preferred_username: cache.userinfo.preferred_username,
|
|
287
|
+
email: cache.userinfo.email
|
|
288
|
+
}
|
|
289
|
+
: null
|
|
290
|
+
};
|
|
291
|
+
if (shouldUseJson(command, await loadAppConfig()))
|
|
292
|
+
printJson({ ok: true, ...status });
|
|
293
|
+
else {
|
|
294
|
+
process.stdout.write(`登录状态: ${status.logged_in ? "已有本地会话" : "未登录"}\n`);
|
|
295
|
+
process.stdout.write(`令牌缓存: ${status.token_file}\n`);
|
|
296
|
+
if (status.expires_at)
|
|
297
|
+
process.stdout.write(`访问令牌到期: ${new Date(status.expires_at * 1000).toISOString()}\n`);
|
|
298
|
+
}
|
|
299
|
+
}), ["numa auth status", "numa auth status --json"]);
|
|
300
|
+
addExamples(auth
|
|
301
|
+
.command("logout")
|
|
302
|
+
.description("删除本地 Keycloak 登录缓存")
|
|
303
|
+
.action(async (_options, command) => {
|
|
304
|
+
const authConfig = loadConfig();
|
|
305
|
+
await deleteTokenCache(authConfig);
|
|
306
|
+
if (shouldUseJson(command, await loadAppConfig())) {
|
|
307
|
+
printJson({ ok: true, logged_out: true, token_file: authConfig.tokenFile });
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
process.stdout.write(`已退出登录并删除本地缓存: ${authConfig.tokenFile}\n`);
|
|
311
|
+
}
|
|
312
|
+
}), ["numa auth logout"]);
|
|
313
|
+
addExamples(program
|
|
314
|
+
.command("profile")
|
|
315
|
+
.alias("whoami")
|
|
316
|
+
.description("显示当前用户信息、角色和用户组(需要登录)")
|
|
317
|
+
.option("--refresh", "强制刷新访问令牌后查询")
|
|
318
|
+
.action(async (options, command) => {
|
|
319
|
+
const identity = await currentIdentity(loadConfig(), Boolean(options.refresh));
|
|
320
|
+
printIdentity(identity, shouldUseJson(command, await loadAppConfig()));
|
|
321
|
+
}), ["numa profile", "numa profile --refresh --json"]);
|
|
322
|
+
addExamples(program
|
|
323
|
+
.command("request <path>")
|
|
324
|
+
.description("调用内部研发平台 API 并在内部注入 Bearer Token(需要登录)")
|
|
325
|
+
.addOption(new Option("-X, --method <method>", "HTTP 方法")
|
|
326
|
+
.choices(["GET", "POST", "PUT", "PATCH", "DELETE"])
|
|
327
|
+
.default("GET"))
|
|
328
|
+
.option("-d, --body <json-or-text>", "请求体;有效 JSON 会自动解析")
|
|
329
|
+
.option("-H, --header <name:value...>", "额外请求头,可重复")
|
|
330
|
+
.option("--require-role <role...>", "调用前要求当前用户具备指定角色之一")
|
|
331
|
+
.action(async (path, options, command) => {
|
|
332
|
+
if (options.requireRole?.length)
|
|
333
|
+
await requireAnyRole(loadConfig(), options.requireRole);
|
|
334
|
+
const headers = {};
|
|
335
|
+
for (const expression of options.header ?? []) {
|
|
336
|
+
const separator = expression.indexOf(":");
|
|
337
|
+
if (separator < 1)
|
|
338
|
+
throw new Error(`请求头格式应为 name:value,收到: ${expression}`);
|
|
339
|
+
const name = expression.slice(0, separator).trim();
|
|
340
|
+
if (name.toLowerCase() === "authorization")
|
|
341
|
+
throw new Error("不允许通过参数覆盖 Authorization 请求头");
|
|
342
|
+
headers[name] = expression.slice(separator + 1).trim();
|
|
343
|
+
}
|
|
344
|
+
const response = await authenticatedBackendRequest(loadConfig(), {
|
|
345
|
+
method: options.method,
|
|
346
|
+
path,
|
|
347
|
+
headers,
|
|
348
|
+
body: validateRequestBody(options.body)
|
|
349
|
+
});
|
|
350
|
+
if (shouldUseJson(command, await loadAppConfig())) {
|
|
351
|
+
printJson({ ok: response.status >= 200 && response.status < 300, response });
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
process.stdout.write(`HTTP ${response.status} ${response.statusText}\n`);
|
|
355
|
+
process.stdout.write(typeof response.body === "string" ? `${response.body}\n` : `${JSON.stringify(response.body, null, 2)}\n`);
|
|
356
|
+
}
|
|
357
|
+
if (response.status < 200 || response.status >= 300)
|
|
358
|
+
process.exitCode = 1;
|
|
359
|
+
}), [
|
|
360
|
+
"numa request /api/projects",
|
|
361
|
+
"numa request /api/jobs -X POST -H x-trace-id:123 -d '{\"name\":\"build\"}' --json",
|
|
362
|
+
"numa request /api/admin --require-role platform-admin"
|
|
363
|
+
]);
|
|
364
|
+
const admin = program
|
|
365
|
+
.command("admin")
|
|
366
|
+
.description(`研发平台管理员功能(需要以下任一角色: ${ADMIN_ROLES.join(", ")})`);
|
|
367
|
+
addExamples(admin
|
|
368
|
+
.command("context")
|
|
369
|
+
.description("显示管理员身份和平台配置,不输出令牌")
|
|
370
|
+
.action(async (_options, command) => {
|
|
371
|
+
const identity = await requireAnyRole(loadConfig(), ADMIN_ROLES);
|
|
372
|
+
const config = await loadAppConfig();
|
|
373
|
+
const result = {
|
|
374
|
+
user: publicIdentity(identity),
|
|
375
|
+
api_base_url: loadConfig().backendBaseUrl ?? null,
|
|
376
|
+
config_file: appConfigPath()
|
|
377
|
+
};
|
|
378
|
+
if (shouldUseJson(command, config))
|
|
379
|
+
printJson({ ok: true, admin_context: result });
|
|
380
|
+
else {
|
|
381
|
+
process.stdout.write(`管理员: ${identity.username ?? identity.subject ?? "-"}\n`);
|
|
382
|
+
process.stdout.write(`角色: ${formatList(identity.roles)}\n`);
|
|
383
|
+
process.stdout.write(`平台 API: ${result.api_base_url ?? "未设置"}\n`);
|
|
384
|
+
}
|
|
385
|
+
}), ["numa admin context", "numa admin context --json"]);
|
|
386
|
+
addExamples(program
|
|
387
|
+
.command("serve")
|
|
388
|
+
.description("运行兼容的 stdio MCP 服务(供 Codex、Claude Desktop 等 AI 工具连接)")
|
|
389
|
+
.action(serve), ["numa serve"]);
|
|
390
|
+
registerCodexCommands(program);
|
|
391
|
+
registerMediaCommands(program);
|
|
392
|
+
if (process.argv.length <= 2) {
|
|
393
|
+
program.outputHelp();
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
if (process.argv.includes("--json")) {
|
|
397
|
+
configureJsonCommandErrors(program);
|
|
398
|
+
try {
|
|
399
|
+
await program.parseAsync(process.argv);
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
if (error instanceof CommanderError &&
|
|
403
|
+
["commander.helpDisplayed", "commander.version"].includes(error.code)) {
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
throw error;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
await program.parseAsync(process.argv);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
main().catch((error) => {
|
|
414
|
+
const json = process.argv.includes("--json");
|
|
415
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
416
|
+
const code = error instanceof RoleRequiredError
|
|
417
|
+
? error.code
|
|
418
|
+
: error instanceof AuthError
|
|
419
|
+
? error.code
|
|
420
|
+
: error instanceof CodexServiceError
|
|
421
|
+
? error.code
|
|
422
|
+
: error instanceof CodexRuntimeError
|
|
423
|
+
? error.code
|
|
424
|
+
: error instanceof MediaError
|
|
425
|
+
? error.code
|
|
426
|
+
: error instanceof CommanderError
|
|
427
|
+
? "cli_usage_error"
|
|
428
|
+
: "command_failed";
|
|
429
|
+
if (json) {
|
|
430
|
+
printJson({
|
|
431
|
+
ok: false,
|
|
432
|
+
error: {
|
|
433
|
+
code,
|
|
434
|
+
message,
|
|
435
|
+
...(error instanceof RoleRequiredError
|
|
436
|
+
? { required_roles: error.requiredRoles, actual_roles: error.actualRoles }
|
|
437
|
+
: {}),
|
|
438
|
+
...(error instanceof MediaError
|
|
439
|
+
? { status: error.status ?? null, request_id: error.requestId ?? null }
|
|
440
|
+
: {})
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
process.stderr.write(`错误 [${code}]: ${message}\n`);
|
|
446
|
+
if (code === "login_required")
|
|
447
|
+
process.stderr.write("请先运行: numa login\n");
|
|
448
|
+
}
|
|
449
|
+
process.exitCode = code === "role_required" ? 4 : code === "login_required" ? 3 : 1;
|
|
450
|
+
});
|
|
451
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { AuthConfig } from "./config.js";
|
|
2
|
+
import type { CodexSelection } from "./codex-selection.js";
|
|
3
|
+
import { fetchRemoteCodexLoginCredentials } from "./codex-service-client.js";
|
|
4
|
+
export type CodexCredentialStore = "file" | "keyring" | "auto";
|
|
5
|
+
export interface CodexAuthAgentLog {
|
|
6
|
+
level: "INFO" | "WARN" | "ERROR";
|
|
7
|
+
event: string;
|
|
8
|
+
message: string;
|
|
9
|
+
at: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CodexCommandResult {
|
|
12
|
+
exitCode: number;
|
|
13
|
+
stdout: string;
|
|
14
|
+
stderr: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CodexAuthAgentOptions {
|
|
17
|
+
authConfig: AuthConfig;
|
|
18
|
+
selection: CodexSelection;
|
|
19
|
+
credentialStore?: CodexCredentialStore;
|
|
20
|
+
intervalMs?: number;
|
|
21
|
+
refreshBeforeMs?: number;
|
|
22
|
+
once?: boolean;
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
now?: () => number;
|
|
25
|
+
fetchCredentials?: typeof fetchRemoteCodexLoginCredentials;
|
|
26
|
+
writeCredentials?: typeof writeCodexChatgptFileCredentials;
|
|
27
|
+
runCodexCommand?: (args: string[], stdin?: string) => Promise<CodexCommandResult>;
|
|
28
|
+
log?: (entry: CodexAuthAgentLog) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface CodexAuthBackupResult {
|
|
31
|
+
action: "created" | "preserved" | "missing" | "restored";
|
|
32
|
+
authPath: string;
|
|
33
|
+
backupPath: string;
|
|
34
|
+
}
|
|
35
|
+
export interface CodexAuthResetResult {
|
|
36
|
+
action: "restored" | "removed" | "unchanged";
|
|
37
|
+
authPath: string;
|
|
38
|
+
backupPath: string;
|
|
39
|
+
}
|
|
40
|
+
export interface LocalCodexCredentialStatus {
|
|
41
|
+
state: "missing" | "invalid" | "installed" | "expired";
|
|
42
|
+
accountId?: string;
|
|
43
|
+
expiresAt?: number;
|
|
44
|
+
matchesExpectedAccount: boolean | null;
|
|
45
|
+
usable: boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare function backupCodexFileCredentials(env?: NodeJS.ProcessEnv): Promise<CodexAuthBackupResult>;
|
|
48
|
+
export declare function restoreCodexFileCredentials(env?: NodeJS.ProcessEnv): Promise<CodexAuthBackupResult>;
|
|
49
|
+
export declare function resetManagedCodexFileCredentials(accountId: string | undefined, env?: NodeJS.ProcessEnv): Promise<CodexAuthResetResult>;
|
|
50
|
+
export declare function codexFileCredentialsMatchAccount(accountId: string, env?: NodeJS.ProcessEnv): Promise<boolean>;
|
|
51
|
+
export declare function inspectLocalCodexCredentialStatus(expectedAccountId?: string, env?: NodeJS.ProcessEnv): Promise<LocalCodexCredentialStatus>;
|
|
52
|
+
export declare function writeCodexChatgptFileCredentials(credentials: {
|
|
53
|
+
accessToken: string;
|
|
54
|
+
idToken: string;
|
|
55
|
+
accountId: string;
|
|
56
|
+
}, now: number, env?: NodeJS.ProcessEnv): Promise<string>;
|
|
57
|
+
export declare function formatRemainingDuration(milliseconds: number): string;
|
|
58
|
+
export declare function codexCredentialStoreArguments(credentialStore: CodexCredentialStore): string[];
|
|
59
|
+
export declare function runDirectCodexCommand(args: string[], stdin?: string): Promise<CodexCommandResult>;
|
|
60
|
+
export declare function runForegroundCodexAuthAgent(options: CodexAuthAgentOptions): Promise<void>;
|