@numa-tech/numa 1.11.14 → 1.12.2

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 (102) hide show
  1. package/README.md +197 -25
  2. package/dist/ai-registry/client.d.ts +65 -0
  3. package/dist/ai-registry/client.js +260 -0
  4. package/dist/ai-registry/client.js.map +1 -0
  5. package/dist/ai-registry/commands.d.ts +2 -0
  6. package/dist/ai-registry/commands.js +438 -0
  7. package/dist/ai-registry/commands.js.map +1 -0
  8. package/dist/ai-registry/errors.d.ts +8 -0
  9. package/dist/ai-registry/errors.js +40 -0
  10. package/dist/ai-registry/errors.js.map +1 -0
  11. package/dist/ai-registry/mcp-installer.d.ts +37 -0
  12. package/dist/ai-registry/mcp-installer.js +273 -0
  13. package/dist/ai-registry/mcp-installer.js.map +1 -0
  14. package/dist/ai-registry/schemas.d.ts +86 -0
  15. package/dist/ai-registry/schemas.js +39 -0
  16. package/dist/ai-registry/schemas.js.map +1 -0
  17. package/dist/ai-registry/skill-installer.d.ts +21 -0
  18. package/dist/ai-registry/skill-installer.js +262 -0
  19. package/dist/ai-registry/skill-installer.js.map +1 -0
  20. package/dist/app-config.d.ts +4 -2
  21. package/dist/app-config.js +15 -3
  22. package/dist/app-config.js.map +1 -1
  23. package/dist/cli.js +40 -12
  24. package/dist/cli.js.map +1 -1
  25. package/dist/codex-module.d.ts +8 -0
  26. package/dist/codex-module.js +152 -0
  27. package/dist/codex-module.js.map +1 -0
  28. package/dist/command-catalog.js +170 -64
  29. package/dist/command-catalog.js.map +1 -1
  30. package/dist/config-page.js +17 -0
  31. package/dist/config-page.js.map +1 -1
  32. package/dist/config.d.ts +4 -1
  33. package/dist/config.js +26 -7
  34. package/dist/config.js.map +1 -1
  35. package/dist/media/commands.js +12 -11
  36. package/dist/media/commands.js.map +1 -1
  37. package/dist/oauth.d.ts +2 -30
  38. package/dist/oauth.js +1 -294
  39. package/dist/oauth.js.map +1 -1
  40. package/dist/pipeline/client.d.ts +126 -0
  41. package/dist/pipeline/client.js +105 -0
  42. package/dist/pipeline/client.js.map +1 -0
  43. package/dist/pipeline/commands.d.ts +17 -0
  44. package/dist/pipeline/commands.js +283 -0
  45. package/dist/pipeline/commands.js.map +1 -0
  46. package/dist/pipeline/errors.d.ts +8 -0
  47. package/dist/pipeline/errors.js +37 -0
  48. package/dist/pipeline/errors.js.map +1 -0
  49. package/dist/pipeline/schemas.d.ts +243 -0
  50. package/dist/pipeline/schemas.js +60 -0
  51. package/dist/pipeline/schemas.js.map +1 -0
  52. package/dist/platform-profile.d.ts +75 -0
  53. package/dist/platform-profile.js +169 -0
  54. package/dist/platform-profile.js.map +1 -0
  55. package/dist/types.d.ts +1 -40
  56. package/dist/web-console-page.d.ts +2 -2
  57. package/dist/web-console-page.js +21 -7
  58. package/dist/web-console-page.js.map +1 -1
  59. package/dist/web-console.d.ts +17 -3
  60. package/dist/web-console.js +70 -5
  61. package/dist/web-console.js.map +1 -1
  62. package/examples/claude-desktop-npx.json +1 -1
  63. package/examples/codex-npx.json +1 -1
  64. package/package.json +30 -14
  65. package/skills/numa-ai-registry/SKILL.md +47 -0
  66. package/skills/numa-ai-registry/evals/evals.json +35 -0
  67. package/skills/numa-ai-registry/references/command-contract.md +53 -0
  68. package/assets/codex-shortcut-icon.icns +0 -0
  69. package/assets/codex-shortcut-icon.ico +0 -0
  70. package/dist/chatgpt-console.d.ts +0 -53
  71. package/dist/chatgpt-console.js +0 -105
  72. package/dist/chatgpt-console.js.map +0 -1
  73. package/dist/codex-auth-agent.d.ts +0 -60
  74. package/dist/codex-auth-agent.js +0 -331
  75. package/dist/codex-auth-agent.js.map +0 -1
  76. package/dist/codex-commands.d.ts +0 -13
  77. package/dist/codex-commands.js +0 -571
  78. package/dist/codex-commands.js.map +0 -1
  79. package/dist/codex-legacy-cleanup.d.ts +0 -5
  80. package/dist/codex-legacy-cleanup.js +0 -77
  81. package/dist/codex-legacy-cleanup.js.map +0 -1
  82. package/dist/codex-process.d.ts +0 -13
  83. package/dist/codex-process.js +0 -193
  84. package/dist/codex-process.js.map +0 -1
  85. package/dist/codex-protocol.d.ts +0 -352
  86. package/dist/codex-protocol.js +0 -116
  87. package/dist/codex-protocol.js.map +0 -1
  88. package/dist/codex-quota-cache.d.ts +0 -20
  89. package/dist/codex-quota-cache.js +0 -82
  90. package/dist/codex-quota-cache.js.map +0 -1
  91. package/dist/codex-selection.d.ts +0 -18
  92. package/dist/codex-selection.js +0 -47
  93. package/dist/codex-selection.js.map +0 -1
  94. package/dist/codex-service-client.d.ts +0 -11
  95. package/dist/codex-service-client.js +0 -91
  96. package/dist/codex-service-client.js.map +0 -1
  97. package/dist/codex-shortcuts.d.ts +0 -43
  98. package/dist/codex-shortcuts.js +0 -429
  99. package/dist/codex-shortcuts.js.map +0 -1
  100. package/dist/codex-tui.d.ts +0 -15
  101. package/dist/codex-tui.js +0 -235
  102. package/dist/codex-tui.js.map +0 -1
@@ -0,0 +1,152 @@
1
+ import process from "node:process";
2
+ import { createInterface } from "node:readline/promises";
3
+ import { createCodexCommandDirectory, createCodexModule } from "@tokensrc/codex";
4
+ import { DEFAULT_CODEX_SERVER_URL } from "@tokensrc/codex/config";
5
+ import { appConfigDirectory, loadAppConfig } from "./app-config.js";
6
+ import { CLI_NAME, CODEX_APP_NAME, CODEX_SHORTCUT_NAME, PACKAGE_NAME } from "./branding.js";
7
+ import { loadConfig } from "./config.js";
8
+ import { currentPlatformProfile, ModuleUnavailableError, requireProfileService } from "./platform-profile.js";
9
+ import { blockingBrowserLogin, ensureAccessToken, LoginRequiredError } from "./oauth.js";
10
+ export const NUMA_CODEX_COMMAND_DIRECTORY = createCodexCommandDirectory({
11
+ nested: true,
12
+ cliName: CLI_NAME
13
+ });
14
+ function numaCodexServiceUrl() {
15
+ const explicit = process.env.NUMA_CODEX_SERVICE_URL?.trim();
16
+ if (explicit)
17
+ return explicit;
18
+ const selected = requireProfileService("codex");
19
+ if (selected)
20
+ return selected.service.baseUrl;
21
+ return DEFAULT_CODEX_SERVER_URL;
22
+ }
23
+ async function confirmNumaBrowserLogin() {
24
+ if (!process.stdin.isTTY) {
25
+ throw new LoginRequiredError("非交互环境没有可用的 Keycloak 登录。请先运行 numa login,或预置 NUMA_TOKEN_CACHE_PATH。");
26
+ }
27
+ const prompt = createInterface({ input: process.stdin, output: process.stderr, terminal: true });
28
+ try {
29
+ while (true) {
30
+ const answer = (await prompt.question("你还没有登录,是否打开浏览器进行登录?(Y/n) ")).trim().toLowerCase();
31
+ if (answer === "" || answer === "y" || answer === "yes")
32
+ return true;
33
+ if (answer === "n" || answer === "no")
34
+ return false;
35
+ process.stderr.write("请输入 Y 或 n。\n");
36
+ }
37
+ }
38
+ finally {
39
+ prompt.close();
40
+ }
41
+ }
42
+ async function loginWithNuma() {
43
+ if (!(await confirmNumaBrowserLogin())) {
44
+ throw new LoginRequiredError("你还没有登录,已取消打开浏览器。请先运行 numa login。");
45
+ }
46
+ process.stderr.write("尚未登录 Numa,正在启动 Keycloak 登录流程。\n");
47
+ await blockingBrowserLogin(loadConfig("codex"));
48
+ }
49
+ export async function createNumaCodexModule() {
50
+ const appConfig = await loadAppConfig();
51
+ const selected = requireProfileService("codex");
52
+ const profile = currentPlatformProfile();
53
+ return createCodexModule({
54
+ ...(selected && profile ? {
55
+ profile: {
56
+ sourceUrl: profile.sourceUrl,
57
+ profileId: profile.profileId,
58
+ revision: profile.revision,
59
+ environment: profile.environment,
60
+ tenantId: profile.tenant.id,
61
+ tenantHeaderName: profile.tenant.headerName,
62
+ serverUrl: selected.service.baseUrl.replace(/\/+$/u, ""),
63
+ resource: selected.service.resource.replace(/\/+$/u, ""),
64
+ audience: selected.service.audience,
65
+ roleClientId: selected.service.roleClientId,
66
+ authority: {
67
+ issuer: selected.authority.issuer.replace(/\/+$/u, ""),
68
+ discoveryUrl: selected.authority.discoveryUrl,
69
+ clientId: selected.authority.clientId,
70
+ scope: selected.authority.scopes.join(" ")
71
+ },
72
+ stale: profile.stale
73
+ }
74
+ } : {}),
75
+ auth: {
76
+ tokenProvider: ({ forceRefresh }) => ensureAccessToken(loadConfig("codex"), forceRefresh),
77
+ loginProvider: loginWithNuma,
78
+ isLoginRequired: (error) => error instanceof LoginRequiredError ||
79
+ error?.code === "login_required",
80
+ loginHint: "请先运行 numa login。"
81
+ },
82
+ connection: {
83
+ serverUrl: numaCodexServiceUrl(),
84
+ tenantId: profile?.tenant.id ?? "numa-realm",
85
+ tenantHeaderName: profile?.tenant.headerName ?? "X-Tenant-Id",
86
+ allowInsecureHttp: false,
87
+ requestTimeoutMs: 10_000
88
+ },
89
+ persistence: {
90
+ configDirectory: appConfigDirectory(),
91
+ loadStoredConfig: false
92
+ },
93
+ branding: {
94
+ packageName: PACKAGE_NAME,
95
+ registryUrl: appConfig.registryUrl,
96
+ cliName: CLI_NAME,
97
+ commandName: CODEX_SHORTCUT_NAME,
98
+ appName: CODEX_APP_NAME
99
+ },
100
+ launcher: {
101
+ runCommandName: CODEX_SHORTCUT_NAME,
102
+ appCommandName: `${CODEX_SHORTCUT_NAME}-app`,
103
+ launchMode: "direct",
104
+ binaryEnvNames: ["NUMA_CODEX_BIN"],
105
+ bundledEnvNames: ["NUMA_USE_BUNDLED_CODEX"],
106
+ wrapperPackage: PACKAGE_NAME,
107
+ wrapperCommand: ["codex"],
108
+ managedMarker: `Managed by ${PACKAGE_NAME} codex shortcut`,
109
+ manifestFileName: ".numa-codex-shortcuts.json",
110
+ bundleId: "tech.numa.codex-shortcut"
111
+ },
112
+ env: process.env,
113
+ output: process.stdout,
114
+ errorOutput: process.stderr,
115
+ jsonEnabled: (command) => Boolean(command.optsWithGlobals().json) || appConfig.output === "json"
116
+ });
117
+ }
118
+ export async function registerNumaCodexCommands(program) {
119
+ try {
120
+ (await createNumaCodexModule()).registerCommands(program, {
121
+ nested: true,
122
+ includeAuthCommands: false
123
+ });
124
+ }
125
+ catch (error) {
126
+ if (!(error instanceof ModuleUnavailableError) || error.serviceKey !== "codex")
127
+ throw error;
128
+ const unavailable = () => { throw new ModuleUnavailableError("codex"); };
129
+ const codex = program
130
+ .command("codex")
131
+ .description("Select an account and launch the official Codex client")
132
+ .action(unavailable);
133
+ for (const descriptor of NUMA_CODEX_COMMAND_DIRECTORY) {
134
+ codex
135
+ .command(`${descriptor.name} [args...]`)
136
+ .description(descriptor.description)
137
+ .allowUnknownOption(true)
138
+ .allowExcessArguments(true)
139
+ .action(unavailable);
140
+ }
141
+ }
142
+ }
143
+ export async function loadNumaCodexLocalStatus() {
144
+ return (await createNumaCodexModule()).status.loadLocal();
145
+ }
146
+ export async function loadNumaCodexRemoteStatus() {
147
+ return (await createNumaCodexModule()).status.loadRemote();
148
+ }
149
+ export async function resolveNumaCodexRuntime(args = []) {
150
+ return (await createNumaCodexModule()).resolveRuntime(args);
151
+ }
152
+ //# sourceMappingURL=codex-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-module.js","sourceRoot":"","sources":["../src/codex-module.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { NUMA_CODEX_COMMAND_DIRECTORY } from "./codex-module.js";
1
2
  export const COMMAND_CATALOG = [
2
3
  {
3
4
  command: "help [command]",
@@ -66,12 +67,180 @@ export const COMMAND_CATALOG = [
66
67
  roles: ["platform-admin", "numa-admin"],
67
68
  examples: ["numa admin context --json"]
68
69
  },
70
+ {
71
+ command: "registry tui",
72
+ summary: "交互式浏览、安装和治理私有 Nacos Skill/MCP",
73
+ access: "authenticated",
74
+ examples: ["numa registry tui"]
75
+ },
76
+ {
77
+ command: "registry instances list",
78
+ summary: "列出数据库中的 Nacos 实例与凭据配置状态,不返回 secret",
79
+ access: "authenticated",
80
+ examples: ["numa registry instances list --json"]
81
+ },
82
+ {
83
+ command: "registry instances create <json>",
84
+ summary: "创建 Nacos 实例并将 OIDC secret 加密写入平台数据库(服务端 edit Scope)",
85
+ access: "authenticated",
86
+ examples: ["numa registry instances create ./nacos-instance.json --json"]
87
+ },
88
+ {
89
+ command: "registry instances update <id-or-code> <json>",
90
+ summary: "以乐观锁更新 Nacos 实例及其写入式 secret(服务端 edit Scope)",
91
+ access: "authenticated",
92
+ examples: ["numa registry instances update cluster-a ./nacos-instance.json --json"]
93
+ },
94
+ {
95
+ command: "registry instances delete <id-or-code> --yes",
96
+ summary: "删除没有 namespace 的 Nacos 实例(服务端 edit Scope)",
97
+ access: "authenticated",
98
+ examples: ["numa registry instances delete cluster-a --yes --json"]
99
+ },
100
+ {
101
+ command: "registry namespaces list",
102
+ summary: "列出多实例 namespace 路由与默认项",
103
+ access: "authenticated",
104
+ examples: ["numa registry namespaces list --namespace team-ai --json"]
105
+ },
106
+ {
107
+ command: "registry namespaces resolve <namespace>",
108
+ summary: "按 namespaceKey 解析唯一实例;同名时使用默认项或 --instance 消歧",
109
+ access: "authenticated",
110
+ examples: ["numa registry namespaces resolve team-ai --json"]
111
+ },
112
+ {
113
+ command: "registry namespaces create <instance> <json>",
114
+ summary: "在指定 Nacos 实例创建 namespace 路由(服务端 edit Scope)",
115
+ access: "authenticated",
116
+ examples: ["numa registry namespaces create cluster-a ./namespace.json --json"]
117
+ },
118
+ {
119
+ command: "registry namespaces update <namespace-id> <json>",
120
+ summary: "更新 namespace 路由和跨集群默认项(服务端 edit Scope)",
121
+ access: "authenticated",
122
+ examples: ["numa registry namespaces update 7 ./namespace.json --json"]
123
+ },
124
+ {
125
+ command: "registry namespaces check <namespace>",
126
+ summary: "验证平台到解析后 Nacos namespace 的健康状态",
127
+ access: "authenticated",
128
+ examples: ["numa registry namespaces check team-ai --json"]
129
+ },
130
+ {
131
+ command: "registry namespaces delete <namespace-id> --yes",
132
+ summary: "删除 namespace 路由(服务端 edit Scope)",
133
+ access: "authenticated",
134
+ examples: ["numa registry namespaces delete 7 --yes --json"]
135
+ },
136
+ {
137
+ command: "registry skill list",
138
+ summary: "分页查询私有 Nacos Skill Registry",
139
+ access: "authenticated",
140
+ examples: ["numa registry skill list --namespace team-ai --json"]
141
+ },
142
+ {
143
+ command: "registry skill inspect <name>",
144
+ summary: "查看 Skill 治理元数据与版本",
145
+ access: "authenticated",
146
+ examples: ["numa registry skill inspect release-helper --namespace team-ai --json"]
147
+ },
148
+ {
149
+ command: "registry skill install <name>",
150
+ summary: "校验 SHA-256 和 ZIP 后原子安装到 AI 客户端 Skills 目录",
151
+ access: "authenticated",
152
+ examples: ["numa registry skill install release-helper --namespace team-ai --agent claude"]
153
+ },
154
+ {
155
+ command: "registry skill upload <zip>",
156
+ summary: "上传经过服务端安全校验的 Skill ZIP(服务端 edit Scope)",
157
+ access: "authenticated",
158
+ examples: ["numa registry skill upload ./release-helper.zip --namespace team-ai --json"]
159
+ },
160
+ ...["submit", "publish", "online", "offline", "scope", "tags", "delete"].map((action) => ({
161
+ command: `registry skill ${action} <name>`,
162
+ summary: `执行 Skill ${action} 治理操作(服务端 edit Scope)`,
163
+ access: "authenticated",
164
+ examples: [`numa registry skill ${action} release-helper --namespace team-ai --json`]
165
+ })),
166
+ {
167
+ command: "registry mcp list",
168
+ summary: "分页查询私有 Nacos MCP Registry",
169
+ access: "authenticated",
170
+ examples: ["numa registry mcp list --namespace team-ai --json"]
171
+ },
172
+ {
173
+ command: "registry mcp inspect <name>",
174
+ summary: "查看 MCP Server 版本、传输与能力元数据",
175
+ access: "authenticated",
176
+ examples: ["numa registry mcp inspect internal-docs --namespace team-ai --json"]
177
+ },
178
+ {
179
+ command: "registry mcp install <name>",
180
+ summary: "安装 MCP Server 到 ChatGPT、Codex、Claude、Cursor、WorkBuddy 或 OpenClaw",
181
+ access: "authenticated",
182
+ examples: ["numa registry mcp install internal-docs --namespace team-ai --agent cursor"]
183
+ },
184
+ ...["create", "update", "delete"].map((action) => ({
185
+ command: `registry mcp ${action} ${action === "create" ? "<json>" : "<name>"}`,
186
+ summary: `执行 MCP Server ${action} 操作(服务端 edit Scope)`,
187
+ access: "authenticated",
188
+ examples: [`numa registry mcp ${action} --help`]
189
+ })),
69
190
  {
70
191
  command: "media capabilities",
71
192
  summary: "查询平台媒体 API、Provider 和版本能力",
72
193
  access: "authenticated",
73
194
  examples: ["numa media capabilities --json"]
74
195
  },
196
+ {
197
+ command: "pipeline list [--app <code>] [--tier <tier>] [--branch <name>]",
198
+ summary: "列出当前用户可见的 Jenkins 应用流水线",
199
+ access: "authenticated",
200
+ examples: ["numa pipeline list --app mci-devops-platform --tier develop --json"]
201
+ },
202
+ {
203
+ command: "pipeline inspect <application>",
204
+ summary: "查看应用的流水线绑定、参数和最近构建",
205
+ access: "authenticated",
206
+ examples: ["numa pipeline inspect mci-devops-platform --json"]
207
+ },
208
+ {
209
+ command: "pipeline builds [--app <code>] [--tier <tier>] [--branch <name>] [--state <state>] [--cursor <cursor>] [--limit <number>]",
210
+ summary: "检索当前用户可见的 Jenkins 构建记录",
211
+ access: "authenticated",
212
+ examples: ["numa pipeline builds --app mci-devops-platform --state running --json"]
213
+ },
214
+ {
215
+ command: "pipeline build <application> --tier <tier> [--branch <name>] [--param <KEY=VALUE>...] [--idempotency-key <key>] [--wait]",
216
+ summary: "通过平台授权触发非生产 Jenkins 构建",
217
+ access: "authenticated",
218
+ examples: ["numa pipeline build mci-devops-platform --tier develop --param SONAR_SCAN=false --wait --json"]
219
+ },
220
+ {
221
+ command: "pipeline status <request-or-build-id> [--watch]",
222
+ summary: "查询或持续观察 Jenkins 构建状态",
223
+ access: "authenticated",
224
+ examples: ["numa pipeline status req_01ABC --watch --json"]
225
+ },
226
+ {
227
+ command: "pipeline log <request-or-build-id> [--follow] [--offset <number>] [--limit <number>]",
228
+ summary: "按 progressiveText 游标读取或跟随构建日志",
229
+ access: "authenticated",
230
+ examples: ["numa pipeline log req_01ABC --follow"]
231
+ },
232
+ {
233
+ command: "pipeline stop <request-or-build-id> --yes",
234
+ summary: "停止排队中或运行中的非生产构建",
235
+ access: "authenticated",
236
+ examples: ["numa pipeline stop req_01ABC --yes --json"]
237
+ },
238
+ {
239
+ command: "pipeline retry <request-or-build-id> --yes [--param <KEY=VALUE>...]",
240
+ summary: "重试非生产构建并重新提供敏感参数",
241
+ access: "authenticated",
242
+ examples: ["numa pipeline retry req_01ABC --yes --param DEPLOY_TOKEN=value --json"]
243
+ },
75
244
  {
76
245
  command: "media tts submit -i|--input <file> [-k|--idempotency-key <key>]",
77
246
  summary: "提交平台托管的 TTS 异步任务",
@@ -138,69 +307,6 @@ export const COMMAND_CATALOG = [
138
307
  access: "public",
139
308
  examples: ["numa serve"]
140
309
  },
141
- {
142
- command: "codex list [-u|--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 [-u|--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 [-s|--select-account|-a|--account <id>] [-u|--server <url>] [--] [codexArgs...]",
164
- summary: "选择或复用 ChatGPT 账号后启动官方 Codex;模型流量不经过 numa",
165
- access: "authenticated",
166
- examples: ["numa codex run -s", "numa codex run --account acct_xxx", "numa codex run -- exec \"完成长任务\""]
167
- },
168
- {
169
- command: "codex app [workspace] [-s|--select-account|-a|--account <id>] [-u|--server <url>]",
170
- summary: "使用官方 ChatGPT 登录启动 macOS/Windows 官方 Codex 桌面 App",
171
- access: "authenticated",
172
- examples: ["numa codex app . -s", "numa codex app . --account acct_xxx"]
173
- },
174
- {
175
- command: "codex shortcut [install|remove] [-t|--target run|app|both] [-s|--select-account]",
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
- }
310
+ ...NUMA_CODEX_COMMAND_DIRECTORY
205
311
  ];
206
312
  //# sourceMappingURL=command-catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-catalog.js","sourceRoot":"","sources":["../src/command-catalog.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,eAAe,GAAwB;IAClD;QACE,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,oBAAoB;QAC7B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,WAAW,EAAE,mBAAmB,CAAC;KAC7C;IACD;QACE,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,mBAAmB;QAC5B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,kBAAkB,CAAC;KAC/B;IACD;QACE,OAAO,EAAE,oBAAoB;QAC7B,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,aAAa,CAAC;KAC1B;IACD;QACE,OAAO,EAAE,8CAA8C;QACvD,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,aAAa,EAAE,oEAAoE,CAAC;KAChG;IACD;QACE,OAAO,EAAE,oCAAoC;QAC7C,OAAO,EAAE,oCAAoC;QAC7C,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,YAAY,EAAE,+BAA+B,CAAC;KAC1D;IACD;QACE,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,mBAAmB;QAC5B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,cAAc,EAAE,wBAAwB,CAAC;KACrD;IACD;QACE,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,gBAAgB;QACzB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,yBAAyB,CAAC;KACtC;IACD;QACE,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,6BAA6B;QACtC,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,kBAAkB,CAAC;KAC/B;IACD;QACE,OAAO,EAAE,wBAAwB;QACjC,OAAO,EAAE,8BAA8B;QACvC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,cAAc,EAAE,qBAAqB,CAAC;KAClD;IACD;QACE,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,uBAAuB;QAChC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,4BAA4B,EAAE,oEAAoE,CAAC;KAC/G;IACD;QACE,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,CAAC,gBAAgB,EAAE,YAAY,CAAC;QACvC,QAAQ,EAAE,CAAC,2BAA2B,CAAC;KACxC;IACD;QACE,OAAO,EAAE,oBAAoB;QAC7B,OAAO,EAAE,2BAA2B;QACpC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,gCAAgC,CAAC;KAC7C;IACD;QACE,OAAO,EAAE,iEAAiE;QAC1E,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,gFAAgF,CAAC;KAC7F;IACD;QACE,OAAO,EAAE,mEAAmE;QAC5E,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,gFAAgF,CAAC;KAC7F;IACD;QACE,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,eAAe;QACxB,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,uCAAuC,CAAC;KACpD;IACD;QACE,OAAO,EAAE,oEAAoE;QAC7E,OAAO,EAAE,0BAA0B;QACnC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,sEAAsE,CAAC;KACnF;IACD;QACE,OAAO,EAAE,qDAAqD;QAC9D,OAAO,EAAE,sBAAsB;QAC/B,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,kEAAkE,CAAC;KAC/E;IACD;QACE,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,2DAA2D,CAAC;KACxE;IACD;QACE,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,6DAA6D,CAAC;KAC1E;IACD;QACE,OAAO,EAAE,mCAAmC;QAC5C,OAAO,EAAE,uBAAuB;QAChC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,mDAAmD,CAAC;KAChE;IACD;QACE,OAAO,EAAE,mDAAmD;QAC5D,OAAO,EAAE,eAAe;QACxB,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,kEAAkE,CAAC;KAC/E;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,OAAO,EAAE,0BAA0B;QACnC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,iEAAiE,CAAC;KAC9E;IACD;QACE,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,oBAAoB;QAC7B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB;IACD;QACE,OAAO,EAAE,gCAAgC;QACzC,OAAO,EAAE,qCAAqC;QAC9C,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,uDAAuD,CAAC;KACpE;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE,oCAAoC;QAC7C,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE;YACR,yDAAyD;YACzD,4EAA4E;SAC7E;KACF;IACD;QACE,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,gCAAgC;QACzC,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,yBAAyB,CAAC;KACtC;IACD;QACE,OAAO,EAAE,2FAA2F;QACpG,OAAO,EAAE,0CAA0C;QACnD,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,mBAAmB,EAAE,mCAAmC,EAAE,kCAAkC,CAAC;KACzG;IACD;QACE,OAAO,EAAE,mFAAmF;QAC5F,OAAO,EAAE,iDAAiD;QAC1D,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,qBAAqB,EAAE,qCAAqC,CAAC;KACzE;IACD;QACE,OAAO,EAAE,kFAAkF;QAC3F,OAAO,EAAE,uCAAuC;QAChD,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE;YACR,6BAA6B;YAC7B,wDAAwD;YACxD,4BAA4B;SAC7B;KACF;IACD;QACE,OAAO,EAAE,4BAA4B;QACrC,OAAO,EAAE,oCAAoC;QAC7C,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE;YACR,gDAAgD;YAChD,8CAA8C;SAC/C;KACF;IACD;QACE,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,kCAAkC;QAC3C,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,0BAA0B,CAAC;KACvC;IACD;QACE,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,gCAAgC;QACzC,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,kBAAkB,CAAC;KAC/B;CACF,CAAC"}
1
+ {"version":3,"file":"command-catalog.js","sourceRoot":"","sources":["../src/command-catalog.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,19 @@ function validateHttpUrl(value) {
28
28
  return "请输入有效 URL";
29
29
  }
30
30
  }
31
+ function validateProfileUrl(value) {
32
+ if (!value)
33
+ return undefined;
34
+ try {
35
+ const url = new URL(value);
36
+ const local = ["localhost", "127.0.0.1", "::1"].includes(url.hostname);
37
+ return url.protocol === "https:" || (url.protocol === "http:" && local)
38
+ ? undefined : "请输入 HTTPS URL(本机测试可使用 HTTP)";
39
+ }
40
+ catch {
41
+ return "请输入有效 URL";
42
+ }
43
+ }
31
44
  export async function openConfigPage() {
32
45
  const current = await loadAppConfig();
33
46
  stdout.write("\nNuma CLI 基础配置\n");
@@ -35,6 +48,8 @@ export async function openConfigPage() {
35
48
  const locale = (await ask("界面语言 (zh-CN/en-US)", current.locale, (value) => ["zh-CN", "en-US"].includes(value) ? undefined : "可选值: zh-CN, en-US"));
36
49
  const output = (await ask("默认输出 (text/json)", current.output, (value) => ["text", "json"].includes(value) ? undefined : "可选值: text, json"));
37
50
  const apiBaseUrl = await ask("内部研发平台 API 地址", current.apiBaseUrl, validateHttpUrl);
51
+ const profileUrl = await ask("公开 client profile URL", current.profileUrl, validateProfileUrl);
52
+ const profileId = await ask("锁定 profile ID(可留空)", current.profileId);
38
53
  const registryUrl = await ask("npm registry", current.registryUrl, validateHttpUrl);
39
54
  const checkUpdatesText = await ask("启动时检查更新 (true/false)", String(current.checkUpdates), (value) => ["true", "false"].includes(value) ? undefined : "可选值: true, false");
40
55
  const saved = await saveAppConfig({
@@ -42,6 +57,8 @@ export async function openConfigPage() {
42
57
  locale,
43
58
  output,
44
59
  apiBaseUrl,
60
+ profileUrl,
61
+ profileId,
45
62
  registryUrl,
46
63
  checkUpdates: checkUpdatesText === "true"
47
64
  });
@@ -1 +1 @@
1
- {"version":3,"file":"config-page.js","sourceRoot":"","sources":["../src/config-page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-page.js","sourceRoot":"","sources":["../src/config-page.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,7 +1,10 @@
1
+ import { type PlatformServiceKey } from "./platform-profile.js";
1
2
  export interface AuthConfig {
2
3
  discoveryUrl: string;
3
4
  issuerUrl?: string;
4
5
  clientId: string;
6
+ profileTenantId?: string;
7
+ resourceAudience?: string;
5
8
  clientSecret?: string;
6
9
  scope: string;
7
10
  tokenFile: string;
@@ -18,5 +21,5 @@ export declare const DEFAULT_SCOPE = "openid profile email offline_access";
18
21
  export declare function defaultTokenFile(): string;
19
22
  export declare const DEFAULT_REDIRECT_HOST = "127.0.0.1";
20
23
  export declare const DEFAULT_REDIRECT_PORT = 8765;
21
- export declare function loadConfig(): AuthConfig;
24
+ export declare function loadConfig(serviceKey?: PlatformServiceKey): AuthConfig;
22
25
  export declare function redirectUri(config: AuthConfig): string;
package/dist/config.js CHANGED
@@ -1,5 +1,7 @@
1
+ import { createHash } from "node:crypto";
1
2
  import { join } from "node:path";
2
3
  import { appConfigDirectory, loadAppConfigSync } from "./app-config.js";
4
+ import { requireProfileService } from "./platform-profile.js";
3
5
  export const DEFAULT_DISCOVERY_URL = "https://kc.mcisaas.com/auth/realms/numa-realm/.well-known/openid-configuration";
4
6
  export const DEFAULT_CLIENT_ID = "mcp-client";
5
7
  export const DEFAULT_SCOPE = "openid profile email offline_access";
@@ -73,21 +75,38 @@ function envInteger(name, defaultValue) {
73
75
  }
74
76
  return parsed;
75
77
  }
76
- export function loadConfig() {
78
+ export function loadConfig(serviceKey = "platform") {
77
79
  const discovery = discoveryUrlFromEnv();
78
80
  const appConfig = loadAppConfigSync();
81
+ const selected = requireProfileService(serviceKey);
82
+ const discoveryUrl = process.env.NUMA_KEYCLOAK_DISCOVERY_URL
83
+ || (process.env.NUMA_KEYCLOAK_ISSUER_URL || (process.env.NUMA_KEYCLOAK_BASE_URL && process.env.NUMA_KEYCLOAK_REALM)
84
+ ? discovery.discoveryUrl
85
+ : selected?.authority.discoveryUrl ?? discovery.discoveryUrl);
86
+ const issuerUrl = discovery.issuerUrl
87
+ ?? selected?.authority.issuer;
88
+ const clientId = process.env.NUMA_KEYCLOAK_CLIENT_ID ?? selected?.authority.clientId ?? DEFAULT_CLIENT_ID;
89
+ const tokenKey = selected
90
+ ? createHash("sha256").update(`${issuerUrl ?? discoveryUrl}\0${clientId}\0${selected.profile.tenant.id}\0${selected.service.audience}`).digest("hex").slice(0, 24)
91
+ : undefined;
79
92
  return {
80
- discoveryUrl: discovery.discoveryUrl,
81
- issuerUrl: discovery.issuerUrl,
82
- clientId: process.env.NUMA_KEYCLOAK_CLIENT_ID ?? DEFAULT_CLIENT_ID,
93
+ discoveryUrl,
94
+ issuerUrl,
95
+ clientId,
96
+ ...(selected ? {
97
+ profileTenantId: selected.profile.tenant.id,
98
+ resourceAudience: selected.service.audience
99
+ } : {}),
83
100
  clientSecret: process.env.NUMA_KEYCLOAK_CLIENT_SECRET || undefined,
84
- scope: process.env.NUMA_KEYCLOAK_SCOPES ?? process.env.NUMA_KEYCLOAK_SCOPE ?? DEFAULT_SCOPE,
85
- tokenFile: process.env.NUMA_TOKEN_CACHE_PATH ?? process.env.NUMA_AUTH_TOKEN_FILE ?? defaultTokenFile(),
101
+ scope: process.env.NUMA_KEYCLOAK_SCOPES ?? process.env.NUMA_KEYCLOAK_SCOPE
102
+ ?? selected?.authority.scopes.join(" ") ?? DEFAULT_SCOPE,
103
+ tokenFile: process.env.NUMA_TOKEN_CACHE_PATH ?? process.env.NUMA_AUTH_TOKEN_FILE
104
+ ?? (tokenKey ? join(appConfigDirectory(), `keycloak-token-${tokenKey}.json`) : defaultTokenFile()),
86
105
  redirectHost: redirectHostFromEnv(),
87
106
  redirectPort: redirectPortFromEnv(),
88
107
  redirectPath: redirectPathFromEnv(),
89
108
  openBrowser: envBoolean("NUMA_AUTH_OPEN_BROWSER", true),
90
- backendBaseUrl: process.env.NUMA_BACKEND_BASE_URL || appConfig.apiBaseUrl || undefined,
109
+ backendBaseUrl: process.env.NUMA_BACKEND_BASE_URL || selected?.service.baseUrl || appConfig.apiBaseUrl || undefined,
91
110
  allowAbsoluteBackendUrls: envBoolean("NUMA_BACKEND_ALLOW_ABSOLUTE_URLS", false)
92
111
  };
93
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}