@numa-tech/numa 1.26.15 → 1.26.17

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.
@@ -0,0 +1,263 @@
1
+ import { z } from "zod";
2
+ export declare const responses: {
3
+ instances: z.ZodObject<{
4
+ items: z.ZodArray<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
5
+ total: z.ZodNumber;
6
+ page: z.ZodNumber;
7
+ size: z.ZodNumber;
8
+ }, z.core.$strip>;
9
+ candidates: z.ZodArray<z.ZodObject<{
10
+ id: z.ZodNumber;
11
+ name: z.ZodString;
12
+ code: z.ZodString;
13
+ kind: z.ZodEnum<{
14
+ RDS: "RDS";
15
+ REDIS: "REDIS";
16
+ }>;
17
+ engine: z.ZodString;
18
+ endpoint: z.ZodNullable<z.ZodString>;
19
+ port: z.ZodNullable<z.ZodNumber>;
20
+ mode: z.ZodString;
21
+ credentialConfigured: z.ZodBoolean;
22
+ version: z.ZodNumber;
23
+ instanceVersion: z.ZodNumber;
24
+ credentialVersion: z.ZodNumber;
25
+ cloudAccountId: z.ZodNullable<z.ZodNumber>;
26
+ region: z.ZodNullable<z.ZodString>;
27
+ cloudInstanceId: z.ZodNullable<z.ZodString>;
28
+ assumeRoleId: z.ZodNullable<z.ZodNumber>;
29
+ }, z.core.$strip>>;
30
+ bindings: z.ZodObject<{
31
+ items: z.ZodArray<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
32
+ total: z.ZodNumber;
33
+ page: z.ZodNumber;
34
+ size: z.ZodNumber;
35
+ }, z.core.$strip>;
36
+ environments: z.ZodObject<{
37
+ items: z.ZodArray<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
38
+ total: z.ZodNumber;
39
+ page: z.ZodNumber;
40
+ size: z.ZodNumber;
41
+ }, z.core.$strip>;
42
+ policy: z.ZodObject<{
43
+ version: z.ZodNumber;
44
+ defaultRdsInstanceId: z.ZodNullable<z.ZodNumber>;
45
+ defaultRedisInstanceId: z.ZodNullable<z.ZodNumber>;
46
+ environmentDatabase: z.ZodNullable<z.ZodString>;
47
+ mysqlAccountHost: z.ZodNullable<z.ZodString>;
48
+ redisMode: z.ZodString;
49
+ redisDb: z.ZodNullable<z.ZodNumber>;
50
+ requirePrefixCompatibility: z.ZodBoolean;
51
+ mode: z.ZodEnum<{
52
+ AUTO: "AUTO";
53
+ MANUAL: "MANUAL";
54
+ }>;
55
+ redisIsolationMode: z.ZodEnum<{
56
+ ACL_PREFIX: "ACL_PREFIX";
57
+ INSTANCE_ACCOUNT: "INSTANCE_ACCOUNT";
58
+ }>;
59
+ }, z.core.$strip>;
60
+ scopes: z.ZodObject<{
61
+ version: z.ZodNumber;
62
+ entries: z.ZodArray<z.ZodObject<{
63
+ type: z.ZodEnum<{
64
+ APPLICATION_ENVIRONMENT: "APPLICATION_ENVIRONMENT";
65
+ CLUSTER: "CLUSTER";
66
+ ENVIRONMENT: "ENVIRONMENT";
67
+ }>;
68
+ clusterId: z.ZodNullable<z.ZodNumber>;
69
+ environmentId: z.ZodNullable<z.ZodNumber>;
70
+ appId: z.ZodNullable<z.ZodNumber>;
71
+ }, z.core.$strip>>;
72
+ }, z.core.$strip>;
73
+ settings: z.ZodObject<{
74
+ version: z.ZodNumber;
75
+ mode: z.ZodString;
76
+ persistentAcl: z.ZodBoolean;
77
+ defaultClusterId: z.ZodNullable<z.ZodNumber>;
78
+ tls: z.ZodNullable<z.ZodObject<{
79
+ mode: z.ZodEnum<{
80
+ DISABLED: "DISABLED";
81
+ REQUIRE: "REQUIRE";
82
+ VERIFY_IDENTITY: "VERIFY_IDENTITY";
83
+ }>;
84
+ caRef: z.ZodNullable<z.ZodString>;
85
+ }, z.core.$strip>>;
86
+ }, z.core.$strip>;
87
+ "cloud-binding": z.ZodObject<{
88
+ id: z.ZodNumber;
89
+ name: z.ZodString;
90
+ code: z.ZodString;
91
+ kind: z.ZodEnum<{
92
+ RDS: "RDS";
93
+ REDIS: "REDIS";
94
+ }>;
95
+ engine: z.ZodString;
96
+ endpoint: z.ZodNullable<z.ZodString>;
97
+ port: z.ZodNullable<z.ZodNumber>;
98
+ mode: z.ZodString;
99
+ credentialConfigured: z.ZodBoolean;
100
+ version: z.ZodNumber;
101
+ instanceVersion: z.ZodNumber;
102
+ credentialVersion: z.ZodNumber;
103
+ cloudAccountId: z.ZodNullable<z.ZodNumber>;
104
+ region: z.ZodNullable<z.ZodString>;
105
+ cloudInstanceId: z.ZodNullable<z.ZodString>;
106
+ assumeRoleId: z.ZodNullable<z.ZodNumber>;
107
+ }, z.core.$strip>;
108
+ connection: z.ZodObject<{
109
+ id: z.ZodNumber;
110
+ name: z.ZodString;
111
+ code: z.ZodString;
112
+ kind: z.ZodEnum<{
113
+ RDS: "RDS";
114
+ REDIS: "REDIS";
115
+ }>;
116
+ engine: z.ZodString;
117
+ endpoint: z.ZodNullable<z.ZodString>;
118
+ port: z.ZodNullable<z.ZodNumber>;
119
+ mode: z.ZodString;
120
+ credentialConfigured: z.ZodBoolean;
121
+ version: z.ZodNumber;
122
+ instanceVersion: z.ZodNumber;
123
+ credentialVersion: z.ZodNumber;
124
+ cloudAccountId: z.ZodNullable<z.ZodNumber>;
125
+ region: z.ZodNullable<z.ZodString>;
126
+ cloudInstanceId: z.ZodNullable<z.ZodString>;
127
+ assumeRoleId: z.ZodNullable<z.ZodNumber>;
128
+ }, z.core.$strip>;
129
+ run: z.ZodObject<{
130
+ id: z.ZodString;
131
+ planId: z.ZodString;
132
+ bindingId: z.ZodString;
133
+ status: z.ZodString;
134
+ errorCode: z.ZodNullable<z.ZodString>;
135
+ deliveryStatus: z.ZodNullable<z.ZodString>;
136
+ version: z.ZodNumber;
137
+ idempotencyKey: z.ZodNullable<z.ZodString>;
138
+ accountRecoveries: z.ZodArray<z.ZodObject<{
139
+ accountId: z.ZodString;
140
+ username: z.ZodString;
141
+ stepKey: z.ZodString;
142
+ phase: z.ZodString;
143
+ abandonedCredentialVersion: z.ZodNumber;
144
+ resetOperationId: z.ZodNullable<z.ZodString>;
145
+ resetStatus: z.ZodNullable<z.ZodString>;
146
+ resetIdempotencyKey: z.ZodNullable<z.ZodString>;
147
+ confirmedCredentialVersion: z.ZodNullable<z.ZodNumber>;
148
+ errorCode: z.ZodNullable<z.ZodString>;
149
+ }, z.core.$strip>>;
150
+ providerCode: z.ZodNullable<z.ZodString>;
151
+ requestId: z.ZodNullable<z.ZodString>;
152
+ }, z.core.$strip>;
153
+ plan: z.ZodObject<{
154
+ id: z.ZodString;
155
+ status: z.ZodString;
156
+ target: z.ZodObject<{
157
+ operationId: z.ZodString;
158
+ appId: z.ZodNumber;
159
+ environmentId: z.ZodNumber;
160
+ kind: z.ZodEnum<{
161
+ RDS: "RDS";
162
+ REDIS: "REDIS";
163
+ }>;
164
+ purpose: z.ZodString;
165
+ mode: z.ZodEnum<{
166
+ CREATE: "CREATE";
167
+ LEGACY: "LEGACY";
168
+ }>;
169
+ instanceId: z.ZodNumber;
170
+ engine: z.ZodString;
171
+ endpoint: z.ZodNullable<z.ZodString>;
172
+ port: z.ZodNumber;
173
+ topology: z.ZodString;
174
+ databaseName: z.ZodNullable<z.ZodString>;
175
+ schemaName: z.ZodNullable<z.ZodString>;
176
+ redisDb: z.ZodNumber;
177
+ keyPrefix: z.ZodNullable<z.ZodString>;
178
+ mysqlAccountHost: z.ZodNullable<z.ZodString>;
179
+ runtimeAccount: z.ZodNullable<z.ZodString>;
180
+ migrationAccount: z.ZodNullable<z.ZodString>;
181
+ prefixCompatible: z.ZodBoolean;
182
+ persistentAcl: z.ZodBoolean;
183
+ clusterId: z.ZodNullable<z.ZodNumber>;
184
+ namespaceId: z.ZodNullable<z.ZodNumber>;
185
+ namespace: z.ZodNullable<z.ZodString>;
186
+ clusterVersion: z.ZodNumber;
187
+ namespaceVersion: z.ZodNumber;
188
+ tls: z.ZodNullable<z.ZodObject<{
189
+ mode: z.ZodEnum<{
190
+ DISABLED: "DISABLED";
191
+ REQUIRE: "REQUIRE";
192
+ VERIFY_IDENTITY: "VERIFY_IDENTITY";
193
+ }>;
194
+ caRef: z.ZodNullable<z.ZodString>;
195
+ }, z.core.$strip>>;
196
+ isolationMode: z.ZodEnum<{
197
+ ACL_PREFIX: "ACL_PREFIX";
198
+ DATABASE: "DATABASE";
199
+ INSTANCE_ACCOUNT: "INSTANCE_ACCOUNT";
200
+ SCHEMA: "SCHEMA";
201
+ }>;
202
+ cloud: z.ZodNullable<z.ZodObject<{
203
+ kind: z.ZodEnum<{
204
+ RDS: "RDS";
205
+ REDIS: "REDIS";
206
+ }>;
207
+ instanceId: z.ZodNumber;
208
+ cloudAccountId: z.ZodNumber;
209
+ region: z.ZodString;
210
+ cloudInstanceId: z.ZodString;
211
+ assumeRoleId: z.ZodNullable<z.ZodNumber>;
212
+ configurationVersion: z.ZodNumber;
213
+ }, z.core.$strip>>;
214
+ }, z.core.$strip>;
215
+ instanceVersion: z.ZodNumber;
216
+ configurationVersion: z.ZodNumber;
217
+ credentialVersion: z.ZodNumber;
218
+ policyVersion: z.ZodNumber;
219
+ environmentVersion: z.ZodNumber;
220
+ applicationVersion: z.ZodNumber;
221
+ operations: z.ZodArray<z.ZodString>;
222
+ warnings: z.ZodArray<z.ZodString>;
223
+ selectedAccountProfile: z.ZodNullable<z.ZodString>;
224
+ }, z.core.$strip>;
225
+ delivery: z.ZodObject<{
226
+ bindingId: z.ZodString;
227
+ desiredVersions: z.ZodNullable<z.ZodObject<{
228
+ runtime: z.ZodNullable<z.ZodObject<{
229
+ accountId: z.ZodString;
230
+ version: z.ZodNumber;
231
+ }, z.core.$strip>>;
232
+ migration: z.ZodNullable<z.ZodObject<{
233
+ accountId: z.ZodString;
234
+ version: z.ZodNumber;
235
+ }, z.core.$strip>>;
236
+ }, z.core.$strip>>;
237
+ deliveredVersions: z.ZodNullable<z.ZodObject<{
238
+ runtime: z.ZodNullable<z.ZodObject<{
239
+ accountId: z.ZodString;
240
+ version: z.ZodNumber;
241
+ }, z.core.$strip>>;
242
+ migration: z.ZodNullable<z.ZodObject<{
243
+ accountId: z.ZodString;
244
+ version: z.ZodNumber;
245
+ }, z.core.$strip>>;
246
+ }, z.core.$strip>>;
247
+ attemptVersions: z.ZodNullable<z.ZodObject<{
248
+ runtime: z.ZodNullable<z.ZodObject<{
249
+ accountId: z.ZodString;
250
+ version: z.ZodNumber;
251
+ }, z.core.$strip>>;
252
+ migration: z.ZodNullable<z.ZodObject<{
253
+ accountId: z.ZodString;
254
+ version: z.ZodNumber;
255
+ }, z.core.$strip>>;
256
+ }, z.core.$strip>>;
257
+ attemptId: z.ZodNullable<z.ZodString>;
258
+ status: z.ZodString;
259
+ version: z.ZodNumber;
260
+ errorCode: z.ZodNullable<z.ZodString>;
261
+ }, z.core.$strip>;
262
+ };
263
+ export declare function boundedJson(response: Response): Promise<unknown>;
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ const id = z.number().int().positive().safe();
3
+ const version = z.number().int().nonnegative().safe();
4
+ const uuid = z.string().uuid();
5
+ const str = z.string().max(2000);
6
+ const status = z.string().regex(/^[A-Z][A-Z0-9_]{0,100}$/u);
7
+ const kind = z.enum(["RDS", "REDIS"]);
8
+ const tls = z.object({ mode: z.enum(["DISABLED", "REQUIRE", "VERIFY_IDENTITY"]), caRef: str.nullable() });
9
+ const cloud = z.object({ kind, instanceId: id, cloudAccountId: id, region: str, cloudInstanceId: str, assumeRoleId: id.nullable(), configurationVersion: version });
10
+ const target = z.object({ operationId: uuid, appId: id, environmentId: id, kind, purpose: str, mode: z.enum(["CREATE", "LEGACY"]), instanceId: id, engine: str, endpoint: str.nullable(), port: id.max(65535), topology: str, databaseName: str.nullable(), schemaName: str.nullable(), redisDb: version, keyPrefix: str.nullable(), mysqlAccountHost: str.nullable(), runtimeAccount: str.nullable(), migrationAccount: str.nullable(), prefixCompatible: z.boolean(), persistentAcl: z.boolean(), clusterId: id.nullable(), namespaceId: id.nullable(), namespace: str.nullable(), clusterVersion: version, namespaceVersion: version, tls: tls.nullable(), isolationMode: z.enum(["DATABASE", "SCHEMA", "ACL_PREFIX", "INSTANCE_ACCOUNT"]), cloud: cloud.nullable() });
11
+ const instance = z.object({ id, name: str, code: str, kind, engine: str, endpoint: str.nullable(), port: id.max(65535).nullable(), mode: str, credentialConfigured: z.boolean(), version, instanceVersion: version, credentialVersion: version, cloudAccountId: id.nullable(), region: str.nullable(), cloudInstanceId: str.nullable(), assumeRoleId: id.nullable() });
12
+ const policy = z.object({ version, defaultRdsInstanceId: id.nullable(), defaultRedisInstanceId: id.nullable(), environmentDatabase: str.nullable(), mysqlAccountHost: str.nullable(), redisMode: str, redisDb: version.nullable(), requirePrefixCompatibility: z.boolean(), mode: z.enum(["MANUAL", "AUTO"]), redisIsolationMode: z.enum(["ACL_PREFIX", "INSTANCE_ACCOUNT"]) });
13
+ const scopes = z.object({ version, entries: z.array(z.object({ type: z.enum(["CLUSTER", "ENVIRONMENT", "APPLICATION_ENVIRONMENT"]), clusterId: id.nullable(), environmentId: id.nullable(), appId: id.nullable() })).max(500) });
14
+ const settings = z.object({ version, mode: str, persistentAcl: z.boolean(), defaultClusterId: id.nullable(), tls: tls.nullable() });
15
+ const credentialRef = z.object({ accountId: uuid, version });
16
+ const credentialSet = z.object({ runtime: credentialRef.nullable(), migration: credentialRef.nullable() }).nullable();
17
+ const delivery = z.object({ bindingId: uuid, desiredVersions: credentialSet, deliveredVersions: credentialSet, attemptVersions: credentialSet, attemptId: uuid.nullable(), status, version, errorCode: status.nullable() });
18
+ const recovery = z.object({ accountId: uuid, username: str, stepKey: str, phase: str, abandonedCredentialVersion: version, resetOperationId: uuid.nullable(), resetStatus: status.nullable(), resetIdempotencyKey: str.nullable(), confirmedCredentialVersion: version.nullable(), errorCode: status.nullable() });
19
+ const run = z.object({ id: uuid, planId: uuid, bindingId: uuid, status, errorCode: status.nullable(), deliveryStatus: status.nullable(), version, idempotencyKey: str.nullable(), accountRecoveries: z.array(recovery), providerCode: str.nullable(), requestId: str.nullable() });
20
+ const plan = z.object({ id: uuid, status, target, instanceVersion: version, configurationVersion: version, credentialVersion: version, policyVersion: version, environmentVersion: version, applicationVersion: version, operations: z.array(str), warnings: z.array(str), selectedAccountProfile: status.nullable() });
21
+ const binding = z.object({ id: uuid, appId: id, environmentId: id, kind, purpose: str, resourceId: uuid, instanceId: id, businessDatabaseId: id.nullable(), status, version, target, runId: uuid.nullable(), resourceStatus: status, deliveryStatus: status.nullable(), runtimeAccountId: uuid.nullable(), migrationAccountId: uuid.nullable() });
22
+ const page = (item) => z.object({ items: z.array(item), total: version, page: id, size: id });
23
+ // Object schemas deliberately strip unknown fields at every level. Never forward raw API objects.
24
+ export const responses = { instances: page(instance), candidates: z.array(instance), bindings: page(binding), environments: page(z.object({ id, code: str, name: str })), policy, scopes, settings, "cloud-binding": instance, connection: instance, run, plan, delivery };
25
+ export async function boundedJson(response) {
26
+ const reader = response.body?.getReader();
27
+ if (!reader)
28
+ throw new Error("Empty response");
29
+ const chunks = [];
30
+ let length = 0;
31
+ try {
32
+ for (;;) {
33
+ const { done, value } = await reader.read();
34
+ if (done)
35
+ break;
36
+ length += value.byteLength;
37
+ if (length > 1024 * 1024) {
38
+ await reader.cancel();
39
+ throw new Error("Response too large");
40
+ }
41
+ chunks.push(value);
42
+ }
43
+ }
44
+ finally {
45
+ reader.releaseLock();
46
+ }
47
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
48
+ }
49
+ //# sourceMappingURL=responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/data-resources/responses.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,7 @@ export async function interactiveEntry(args, ui = terminalUi, tty) {
30
30
  (await ui.choose("Numa · 选择要做的事", [
31
31
  { value: "mcp", label: "安装 MCP 工具到 Agent" },
32
32
  { value: "skills", label: "安装或更新 Skills" },
33
+ { value: "provider", label: "切换模型提供商(Codex / Claude Code)" },
33
34
  { value: "modules", label: "按用途检索模块" },
34
35
  { value: "help", label: "查看命令帮助" },
35
36
  ], "mcp"));
@@ -74,6 +75,8 @@ export async function interactiveEntry(args, ui = terminalUi, tty) {
74
75
  }
75
76
  if (choice === "help")
76
77
  return [...globals, "--help"];
78
+ if (choice === "provider")
79
+ return [...globals, "provider"];
77
80
  const source = await ui.choose("安装哪类 MCP?", [
78
81
  {
79
82
  value: "local",
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/interactive/entry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/interactive/entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ # Data resource CLI
2
+
3
+ `numa data-resource` uses the current platform identity and `/api/v1/data-resources`.
4
+ Instance, policy, scope and settings reads require the platform ops-admin role;
5
+ application reads and mutations retain server-side VIEWER/MAINTAINER checks.
6
+
7
+ ```sh
8
+ numa data-resource instances --kind RDS --json
9
+ numa data-resource instances --kind REDIS --json
10
+ numa data-resource policy 2 --json
11
+ numa data-resource scopes 1 --kind REDIS --json
12
+ numa data-resource candidates --app 8 --environment 2 --kind RDS --purpose main --json
13
+ numa data-resource bindings --app 8 --environment 2 --json
14
+ ```
15
+
16
+ Names and IDs must come from the target platform. A catalog instance alone does
17
+ not prove cloud identity, application access or usable credentials. An empty
18
+ candidate list is not permission to select another environment's instance.
19
+
20
+ Administrators can use `cloud-bind`, `set-scopes`, `set-settings`, `set-connection`, and `set-policy`
21
+ with `--file` and `--yes`. Each takes the backend's complete, credential-free
22
+ configuration DTO including its current `version`. Instance commands also require
23
+ `--kind RDS|REDIS`; policy targets an environment ID. These PUT requests are sent
24
+ once. Review cloud identity, environment scope, TLS and Redis instance-wide access
25
+ before applying; existing bindings do not follow changed defaults automatically.
26
+
27
+ `set-connection` additionally requires `instanceVersion`, `endpoint` (hostname/IP,
28
+ not a URL), and `port`. It requires the backend connection-correction upgrade and
29
+ rejects instances with existing resources or unresolved operations.
30
+
31
+ Allocation uses a credential-free JSON PlanInput matching the platform contract:
32
+
33
+ ```json
34
+ {
35
+ "appId": 8,
36
+ "environmentId": 2,
37
+ "kind": "RDS",
38
+ "purpose": "main",
39
+ "mode": "CREATE",
40
+ "instanceId": 4,
41
+ "isolationMode": "DATABASE"
42
+ }
43
+ ```
44
+
45
+ These IDs are illustrative, not existing-resource evidence. Save the input to a
46
+ file and call `numa data-resource plan --file plan.json --yes --json`. Review the
47
+ returned immutable target, account profile, operations and warnings before
48
+ `apply <plan-id> --idempotency-key <original-key> --yes`. Production requires the
49
+ server's accepted `--production-reason`. Redis `INSTANCE_ACCOUNT` grants access
50
+ to the whole instance; DB 0 is not dataset isolation.
51
+
52
+ `run <run-id>` reads the saved request. `reconcile <run-id> --yes` observes cloud
53
+ state and updates its ledger; it does not repeat a cloud mutation. Transport
54
+ loss, uncertain HTTP 5xx, and malformed successful write responses return
55
+ `DATA_RESOURCE_RESULT_UNKNOWN`. Writes, including 401 responses, are never
56
+ automatically replayed. Never replace a key to recover an unknown operation.
57
+ Plan creation has no resolve-by-key API: an unknown preview must be inspected
58
+ through existing bindings/platform records before considering a new plan.
59
+
60
+ Secret delivery is separate: `delivery <binding-id>` reads its CAS version and
61
+ `deliver <binding-id> --version <version> --idempotency-key <key> --yes` submits
62
+ the versioned delivery/reconciliation request. A valid receipt does not prove
63
+ application connectivity, migration success or restarted Pods. Credentials,
64
+ reveal, rotations, arbitrary cloud calls and inventory creation are deliberately
65
+ outside this initial command family.
66
+
67
+ The CLI preserves backend field names under `data`. Unknown response fields are dropped using explicit DTO schemas. Sensitive fields,
68
+ credential assignments and URL userinfo are redacted; provider error bodies and headers are not printed.
69
+
70
+ If an onboarding application is PROVISIONING and data-resource reads return
71
+ NOT_FOUND, check the platform's ACTIVE-only application gate. Do not silently
72
+ mark onboarding complete just to obtain database access.
@@ -0,0 +1,100 @@
1
+ # 模型提供商切换
2
+
3
+ 运行 `numa provider`,自动打开本机 Web 配置页;也可从 `numa` 主菜单选择“切换模型提供商”。在网页里选择 Codex CLI / 桌面端或 Claude Code,完成模式、URL、Key 和模型选择。终端需保持运行,浏览器与 CLI 在同一台电脑。
4
+
5
+ ```sh
6
+ numa provider # 网页选择客户端与模式
7
+ numa provider codex # 直接打开 Codex 配置网页
8
+ numa provider claude # 直接打开 Claude Code 配置网页
9
+ numa provider --browser-config # 输出管理员需追加的 New API 聊天预设
10
+ numa provider codex --status --json
11
+ numa provider codex --status --check --json # 在线查询中转 Key 信息,不改配置
12
+ numa codex run # 显示模式告示板,再启动 CLI
13
+ numa codex app . # 显示模式告示板,再启动现有桌面端
14
+ numa codex run --provider # 终端选择官方 / 中转,切换后立即启动
15
+ numa codex app . --provider # 同上,启动桌面端
16
+ numa claude run # 显示模式告示板,再启动已安装的 Claude Code
17
+ ```
18
+
19
+ `numa codex run/app --provider`只在终端选择“官方账号”或“中转模式”。已保存的 URL、Key、模型直接复用,不打开编辑页;不带选项则按当前模式启动。首次没有中转配置时才打开一次网页,保存后继续启动,取消则不启动。选择会写入当前客户端配置,之后启动沿用该模式;不是实例级隔离。切换前仍执行现有的会话占用检查、受管凭据归还及必要确认;尚未完成的切换需先通过 `numa provider codex` 恢复。
20
+
21
+ 快速选择需要交互式终端,不支持 `--json`。`-s/--select-account` 用来选择官方账号,与 `--provider` 的模式选择不同;选中中转时不能同时传 `-a/-s`。`-p <profile>` 保留原生 Codex 用法,例如 `numa codex run -p work` 会原样透传;也可以放在 `--` 后。模式选择发生在远程账号配置加载之前,切回官方会加载正确的平台配置;不需要释放受管凭据的中转启动不访问官方账号服务。
22
+
23
+ 目前支持官方账号和自定义模型提供商两种模式。自定义配置页将平台 URL、隐藏的 API Key 和常用模型选项放在同一张表单。Key 旁的“从 LLM 平台获取”按钮打开聊天登录入口,回调后自动填入 Key;也可直接手动填写。默认 URL 为 `https://llm-api.mcisaas.com`,仅作为预填值,可修改为任意兼容平台。Codex 的根地址自动补 `/v1`;自定义 URL 已带路径时使用该路径。Claude 使用 Anthropic 兼容接口的基地址。中转平台必须分别支持 Responses API / Anthropic Messages API。
24
+
25
+ 再次打开表单会预填已保存的 URL;Key 隐藏保留,无需重新输入。更改 URL 后必须重新填写或获取 Key,不把旧 Key 自动发送给另一个平台。模式菜单只提供“官方账号登录”和“自定义模型提供商”。URL、Key 和模型都在同一配置页编辑,不再单列修改 URL / Key、追加模型或选择启动模型入口。常用模型预设完整展示五家目录,不因当前 Key 的平台列表缺项而隐藏;它不是可用性清单。
26
+
27
+ Codex 中仅有自定义名称、启用官方认证且未覆盖地址或 API 凭据的 provider 仍按官方账号处理,可直接切换并恢复原配置。
28
+
29
+ 首次接入 Claude 时,如果 `settings.json` 已有同一平台的 URL 和 API Key / Auth Token,Numa 可直接接管,无需先删除配置。原文件内容备份在仅当前用户可读的 `.numa-provider.json` 的 `importedConfig` 中;切回官方时清除自定义平台认证及模型覆盖,保留其他设置和客户端登录凭据。其他平台、认证脚本或云提供商配置仍需先处理冲突,不会静默接管。此接管规则不限定默认平台域名。
30
+
31
+ 在同一配置页直接勾选常用模型,也可点击“读取模型”检查 Key 并更新平台匹配 ID。Codex 和 Claude 都使用多选框追加模型,最后统一“保存配置”;也可不勾选,首次配置的首个勾选模型作为初始模型,编辑时保留已有启动模型。对于 Claude Code,Numa 将勾选的模型写入 `settings.json` 的 `modelPicker`,并关闭客户端再次自动发现未筛选的网关模型;平台支持 Anthropic 兼容接口的 ChatGPT、DeepSeek、GLM、Kimi 模型也可勾选。Codex 将所选模型写入独立的 JSON 模型目录,通过原生 `model_catalog_json` 加载;重启后可在 `/model` 中选择,切回官方时恢复原目录设置。目录使用官方 Codex 的默认指令和保守的自定义模型能力元数据,不据此推断模型的实际上下文或推理能力。完整自定义菜单需要 **Claude Code 2.1.242+**,见 [Claude 模型菜单配置](https://code.claude.com/docs/en/settings-reference#modelpicker)。旧版(例如 2.1.81)不会从平台自动获取模型列表,只能通过 `ANTHROPIC_CUSTOM_MODEL_OPTION` 显示一个自定义项:使用 `numa provider claude` 选择其他模型后重启 Claude,或自行升级客户端。平台可见列表不代表已经验证模型生成、effort 或上下文长度,Numa 不伪造这些能力。切回官方会恢复原来的模型及菜单配置。
32
+
33
+ 常用预设在进入配置页时即可选择,填写 URL、Key 或等待平台回调时保持可见和勾选。已有菜单项保留,不勾选则不追加模型。页面统一提醒“预设不代表平台已支持,也不保证当前 Key 分组有可用渠道”,不附加逐项可用性标签,不发起生成请求。追加不会改变 Claude 当前启动模型,也不会删除此前保存的模型。
34
+
35
+ 模型精选目录核对于 **2026-10-11**:Claude Opus / Sonnet / Haiku 5.5;ChatGPT 对应 OpenAI GPT-6 Astra、GPT-6.1 Sol、GPT-6 Luna;DeepSeek Flash / V4 Pro;GLM-5.3 / 5.3 Flash;Kimi K3。配置页提供完整的 11 项常用预设;平台返回匹配的模型时优先保留其大小写、部署前缀及快照 ID,缺少的条目仍显示目录中的预设 ID。查询结果和 `--status` 仍仅记录实际返回且通过接口类型、Key 限制筛选的模型,不把预设当成 API 返回结果。目录维护于 `packages/codex/src/provider-catalog.ts`,需随版本更新;它不是实时抓取厂商官网,也不证明分组渠道可用。官方来源:[Claude](https://www.anthropic.com/system-cards)、[OpenAI](https://developers.openai.com/api/docs/models)、[DeepSeek](https://api-docs.deepseek.com/quick_start/pricing/)、[GLM](https://docs.z.ai/llms.txt)、[Kimi](https://platform.kimi.ai/docs/guide/kimi-k3-quickstart)。
36
+
37
+ 配置网页仅监听 `127.0.0.1` 的随机端口,使用一次性连接地址和同源校验,10 分钟超时。Key 输入使用密码框,下方显示前 4 位和后 4 位方便核对,中间遮盖;长度不超过 12 位时全部遮盖。已保存 Key 只向页面提供遮盖后的摘要,不提供完整值。Key 不写入浏览器存储或配置记录;接收后仍由 CLI 按原有权限保存。页面不会自动重放保存请求。关闭标签页不撤销已提交操作;未完成时可重新打开终端地址,或在终端 Ctrl+C 结束。切换受管 Codex 凭据时,原有释放和进程关闭确认也在网页完成。
38
+
39
+ 启动选择写入 `model`,不通过 `ANTHROPIC_MODEL` 固定,之后在 Claude `/model` 中保存其他模型,后续启动会使用该选择。已有 Key 自动复用,追加的模型在切回自定义模式后继续保留。重启后直接运行 `claude` 即可读取菜单,无需每次从 Numa 启动。
40
+
41
+ 网页切换 Codex 官方账号到中转时,受管凭据的 release 全程使用当前配置页:展示账号和设备、待退出进程及待清理位置,在页面选择重新检查、关闭进程或取消,必要时另行确认强制结束。凭据同步、服务端准备、本地清理和释放登记的进度也显示在页面中,服务端确认后才继续写入中转配置。取消和失败沿用原有恢复记录,不自动重放释放请求。若 Numa 登录已失效,页面提示先运行 `numa login` 后重新进入配置,不会隐藏等待终端输入。独立 `numa codex release` 仍使用原有终端交互。
42
+
43
+ 启动告示板显示模式和中转平台地址,不展示 API Key。自定义模式启动时统一提醒“模型列表不代表当前 Key 所在分组可调用”,遇到无可用渠道时提示更换模型或联系平台管理员检查分组渠道。它输出到 stderr;只读 `--status --json` 不输出任何凭据。直接运行原生 `codex`、`claude` 或点击桌面应用仍读取客户端配置,但不会显示 Numa 的告示板。
44
+
45
+ ## Key 校验与平台信息
46
+
47
+ 配置中转时,先通过 New API 的 `GET /v1/models` 检查鉴权,并通过 `GET /api/usage/token/` 查询 Key 名称、剩余/已用额度、到期时间和模型限制。两个请求并行,默认各超时 4 秒,不发起模型生成请求。识别到 New API 且鉴权通过后,额外通过 `GET /api/log/token` 查询当前 Key 的近期用量,最多等待 1.5 秒;接口不可用不影响原列表。只提取近 7 天、当前候选模型、与目标客户端相同接口的用量记录:Claude 对应 `/v1/messages`,Codex 对应 `/v1/responses`。这些候选优先排序,并保存模型 ID 和最后调用时间,不保存日志内容、用户信息或请求正文。历史用量不保证当前仍可用,也不会把历史分组推断为当前分组。Codex 根 URL 自动补 `/v1/models`;带 `/v1` 的地址用于模型查询,查询用量时去掉末尾 `/v1`,保留此前的部署路径。Claude 的基地址统一追加 `/v1/models`,例如 `/gateway` 对应 `/gateway/v1/models`。
48
+
49
+ 明确鉴权失败、Key 到期或额度耗尽时,不发起新的切换或官方凭据释放。恢复未完成切换时也会重新查询;已经开始释放的事务允许完成恢复,Key 无效时仍禁止启动,之后可修改 Key。网络故障、服务异常或接口不兼容显示“暂时无法验证”,网页可选择取消或仍然保存。用量接口能查到 Key 不代表它通过模型接口的鉴权;鉴权通过也不保证上游模型生成正常。模型列表成功时,JSON 明确标记 `modelAvailability: "unverified"`。若返回 `supported_endpoint_types`,Claude 只保留支持 `anthropic` 的条目,Codex 只保留支持 `openai-response` 的条目;已启用且返回了 Key 模型限制时进一步按精确 ID 取交集。缺失接口类型时保留为未验证候选。列表可能与实时分组渠道不一致,出现 503 `model_not_found` 时应检查该 Key 的分组和渠道,不应仅凭模型在列表中就认定可调用。
50
+
51
+ 如果尚未开始释放的切换中断,恢复菜单提供“取消尚未开始的切换,保留官方模式”,之后可以修改已保存的 Key。取消会检查客户端配置没有变化;已经开始的释放事务不能通过此入口取消。
52
+
53
+ 通过 Numa 启动中转客户端前,会重新查询并在告示板显示这些信息、候选模型和检查时间。明确校验失败则停止启动;无法验证时显示提示并继续交给客户端处理。`--status` 展示配置时保存的结果及检查时间;加 `--check` 获取实时结果,仅返回查询结果,不更新本地配置。完整模型列表保留在 JSON 输出中,告示板中的长列表会省略部分条目。
54
+
55
+ 额度按平台原始 quota 单位显示,不推测人民币或美元。Key 的“无限额度”不代表用户账户余额无限。上游 New API 用量接口未返回分组,因此默认显示“未知(接口未返回)”;平台扩展返回 `data.group` 时自动展示,`auto` 显示“自动分组”,不会推测实际请求最终使用哪个分组。
56
+
57
+ ## 未提供 Key 时的登录
58
+
59
+ 无需修改 New API 源码。复用平台现有的 OIDC 登录、Key 列表和创建页面,通过 New API 的聊天预设把用户选中的 Key 交给本机 CLI。
60
+
61
+ **平台管理员一次性配置:** 在 New API 的系统设置中找到聊天预设配置,在已有列表中追加下面这个对象,保留其他预设。也可通过 `numa provider --browser-config` 获取同一配置。
62
+
63
+ ```json
64
+ {"Numa CLI":"http://127.0.0.1:17653/import#base_url={address}&api_key={key}"}
65
+ ```
66
+
67
+ 需要部署版本支持自定义聊天预设、`{address}` / `{key}` 变量,以及 Key 行的聊天入口。相关配置与入口见 [New API 聊天应用说明](https://docs.newapi.pro/zh/docs/guide/feature-guide/user/chat-apps)。本次代码改动未修改线上平台配置。没有预设时仍可直接粘贴 Key。
68
+
69
+ 用户流程:
70
+
71
+ 1. 运行 `numa provider`,进入自定义提供商配置页,确认平台 URL,点击 Key 旁的“从 LLM 平台获取”。
72
+ 2. 新窗口先连接本机接收器,再进入平台 `/chat/<序号>`。Numa 从公开 `/api/status` 找到匹配预设,支持当前 `/chat/0`,不固定编号。登录仍由平台及 Keycloak 完成,不复用固定 OIDC state,不修改平台 OAuth 回调。
73
+ 3. 登录成功后,聊天页把平台自动选择的 Key 传给本机 iframe。iframe 与原配置窗口校验来源和本次任务后,Key 自动填入密码框,同时只读查询模型;这一步不保存客户端配置。成功页提供“返回配置页”按钮:通过本次任务的窗口消息让原配置页关闭它打开的登录弹窗,并请求切回配置页;原表单不刷新,未保存输入保留。返回消息校验来源、接收 iframe 和任务 ID,不依赖跨域 `focus()` 单独完成切换。
74
+ 4. 在原配置页勾选常用模型,点击“保存配置”,CLI 才执行切换并保存。获取期间若修改 URL 或 Key,旧回调不会覆盖新输入。
75
+
76
+ 聊天入口使用的 Key 由平台选择;若要指定或创建其他 Key,请使用平台 API 密钥列表中对应行的“⋯ → 聊天 → Numa CLI”,或手动粘贴到配置表单。没有匹配预设时会提示手动填写。浏览器若因登录页隔离策略断开新窗口与配置页的关系,则退回独立确认页;确认后原配置页自动接收并填入 Key。本机 `/import` 仅允许本次平台源嵌入,其余页面禁止嵌入。浏览器若询问本地网络访问或拦截弹窗,需要允许平台打开本机接收页。
77
+
78
+ 浏览器与 CLI 必须在同一台电脑。推荐使用同一个浏览器配置文件打开引导页和平台页面。如果换了浏览器、用户配置,或直接进入 `/chat/<序号>` 跳过引导页,导入页会显示“连接当前终端”:粘贴 CLI 打印的完整本机连接地址(包含 `#session=…`),验证后继续确认已收到的 Key,无需再次复制 API Key。该地址是本次任务的临时凭据,请勿分享。恢复期间 Key 只保留在页面内存中,不要刷新;本地存储被禁用时也可使用此恢复操作。终端已结束或超时则需重新运行 provider。远程 SSH 使用手动输入 Key。接收器只监听 `127.0.0.1:17653`,10 分钟后关闭,Ctrl+C 可取消;端口被占用时停止,不把 Key 发给另一个进程。
79
+
80
+ Key 放在 URL fragment 中传递,不进入 HTTP 查询字符串;本机页面读取后立即清除地址栏片段,保存前仅暂存在内存。自动回填通过限定来源的窗口消息,并核对打开窗口、当前任务及平台地址;不会使用通配来源发送 Key。临时连接标识保存在本机页面的 localStorage,用于同一浏览器的新标签页确认;它不是 API Key 或 OIDC token。接收 API 校验临时标识、Host 和请求来源,检查平台地址并只接受一次选取。Numa 不读取网页登录 Cookie 或 OIDC token。新 Key 由用户在 New API 页面创建,CLI 不代替用户创建,也不自动重放结果未知的写请求。
81
+
82
+ 列表中的分组信息在 New API 网页上查看;CLI 后续能显示哪些字段仍取决于 Key 用量接口的返回,不会因为导入成功而推断分组。
83
+
84
+ ## 凭据处理
85
+
86
+ Numa 受管 Codex 账号切到中转时,先退出客户端、确认释放,随后上报最新完整 Token Set、清理本地受管凭据并完成服务端释放确认。复用 `numa codex release` 的既有事务;未完成时不应用中转配置,也不启动客户端。重新执行 `numa provider` 可继续上次切换。释放后保留原用户、原设备的再次领取资格,不自动回公共池。切回官方后,`numa codex run/app` 重新领取。
87
+
88
+ 个人登录凭据保留在客户端原来的文件或钥匙串中,不上传 Numa。中转启动不领取或刷新官方凭据;`use`、`auth-agent` 等凭据操作在中转模式下被阻止。运行中的 Numa 会话阻止模式切换,多个同模式会话仍可并行启动。
89
+
90
+ ## 本地配置与恢复
91
+
92
+ Codex 使用 `CODEX_HOME`(默认 `~/.codex`),Claude 使用 `CLAUDE_CONFIG_DIR`(默认 `~/.claude`)。各自的 `.numa-provider.json` 保存模式、中转信息和配置恢复记录;原生配置分别为 `config.toml` 和 `settings.json`。两端使用同一 Codex 目录时,CLI 和桌面端共用提供商配置,切换后需重启桌面端。
93
+
94
+ API Key 以明文保存在本机私有文件中;POSIX 系统文件权限为 `0600`。Codex 使用专用 provider 的 bearer token,`requires_openai_auth=false`,确保不会将缓存的官方登录 token 发送给中转。请勿将这些配置文件提交到仓库。
95
+
96
+ 切回官方会恢复原来的提供商相关设置,并保留中转期间修改的其他设置。无其他修改时恢复原文件;有修改时重新序列化,注释与格式可能变化。遇到损坏配置、并发修改或未完成释放时保留现场并停止,不假装切换成功。已有其他第三方提供商配置须先恢复为官方配置;Numa 不静默接管它们。
97
+
98
+ 通过 Numa 启动时,覆盖提供商的参数、环境变量或 Claude 项目设置会导致明确错误,避免显示错误的启动模式。组织管理策略仍由原生客户端执行。
99
+
100
+ 独立包也支持 `tokensrc-codex provider`、`tokensrc-codex run` 和 `tokensrc-codex app`。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@numa-tech/numa",
3
- "version": "1.26.15",
3
+ "version": "1.26.17",
4
4
  "description": "Cross-platform CLI for the Numa internal developer platform with Keycloak authentication and MCP support.",
5
5
  "author": "numa-tech",
6
6
  "keywords": [
@@ -31,6 +31,7 @@
31
31
  "THIRD_PARTY_NOTICES.md",
32
32
  "docs/kb-access.md",
33
33
  "docs/gitops-configuration.md",
34
+ "docs/model-providers.md",
34
35
  "docs/design/kb-cli.md",
35
36
  "docs/design/kb-web-workspace.md",
36
37
  "scripts/export-kb-contract.py",
@@ -39,7 +40,8 @@
39
40
  "docs/oss-policy-client-governance.md",
40
41
  "docs/environment-configuration-publication.md",
41
42
  "docs/keycloak-managed-import.md",
42
- "docs/design/kb-capability-upgrade.md"
43
+ "docs/design/kb-capability-upgrade.md",
44
+ "docs/data-resources.md"
43
45
  ],
44
46
  "scripts": {
45
47
  "clean": "node scripts/clean.mjs",
@@ -51,7 +53,7 @@
51
53
  "dev:oss-web": "tsx src/cli.ts oss web",
52
54
  "test:oss-web": "node --import tsx --test src/oss/web.test.ts src/oss/web-session.test.ts src/oss/web-transfers.test.ts src/oss/web-command.test.ts src/oss/local-picker.test.ts src/oss/transfer-paths.test.ts src/oss/transfer-worker.test.ts src/oss/transfer-queue.test.ts src/oss/web-page.test.ts src/oss/file-operations.test.ts src/oss/download-links.test.ts src/local-web/context-menu.test.ts",
53
55
  "test:oss-auth-code": "node scripts/test-oss-auth-code.mjs",
54
- "root:test": "node --import tsx --test --test-concurrency=4 src/mcp-gateway/profile.test.ts src/mcp-gateway/runtime.test.ts src/mcp-gateway/install.test.ts src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/profile-migration.test.ts src/identity.test.ts src/backend.test.ts src/cert/client.test.ts src/cert/commands.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/mail/client.test.ts src/wecom/client.test.ts src/wecom/commands.test.ts src/wecom/tools.test.ts src/ai-registry/client.test.ts src/ai-registry/bootstrap.test.ts src/ai-registry/install-defaults.test.ts src/ai-registry/workspace.test.ts src/ai-registry/namespace.test.ts src/compatibility/registry-instance.test.ts src/ai-registry/sync.test.ts src/ai-registry/bridge.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/skill-uninstaller.test.ts src/ai-registry/skill-dependencies.test.ts src/ai-registry/updates.test.ts src/maintenance/scheduler.test.ts src/maintenance/codex.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/oss/client.test.ts src/oss/governance.test.ts src/oss/commands.test.ts src/oss/auth-code.test.ts src/oss/clipboard.test.ts src/oss/web.test.ts src/oss/web-session.test.ts src/oss/web-transfers.test.ts src/oss/web-command.test.ts src/oss/local-picker.test.ts src/oss/transfer-paths.test.ts src/oss/transfer-worker.test.ts src/oss/transfer-queue.test.ts src/oss/web-page.test.ts src/oss/file-operations.test.ts src/oss/download-links.test.ts src/oss/bootstrap.test.ts src/oss/transfers.test.ts src/oss/search.test.ts src/oss/tools.test.ts src/mcp/install.test.ts src/mcp/catalog.test.ts src/tasks/runtime.test.ts src/tasks/stdio.test.ts src/tasks/wecom-notify.test.ts src/tasks/oss-query.test.ts src/interactive/wizard.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/gitops/client.test.ts src/gitops/commands.test.ts src/gitops/workload-input.test.ts src/gitops/workload-client.test.ts src/gitops/workload-commands.test.ts src/repositories/client.test.ts src/repositories/commands.test.ts src/publications/scanner.test.ts src/publications/client.test.ts src/publications/commands.test.ts src/jenkins-jobs/client.test.ts src/jenkins-jobs/commands.test.ts src/clusters/client.test.ts src/clusters/commands.test.ts src/clusters/kubeconfig-discovery.test.ts src/teams/client.test.ts src/teams/commands.test.ts src/authorization/bootstrap-client.test.ts src/authorization/commands.test.ts src/authorization/access-request-client.test.ts src/authorization/access-request-commands.test.ts src/application-candidates/client.test.ts src/application-candidates/commands.test.ts src/application-onboarding/client.test.ts src/application-onboarding/commands.test.ts src/application-onboarding/tui.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs src/authorization/application-commands.test.ts src/authorization/application-client.test.ts src/authorization/application-schemas.test.ts src/notion/client.test.ts src/notion/commands.test.ts src/notion/tools.test.ts src/notion/machine-cli.test.ts src/cloud/accounts.test.ts src/cloud/bootstrap.test.ts src/cloud/business-bootstrap.test.ts src/cloud/maintenance.test.ts src/cloud/wizard.test.ts src/cloud/oss-bootstrap.test.ts src/business-issuer.test.ts src/login-configuration.test.ts src/login-recovery.test.ts src/ai-registry/mcp-management.test.ts src/ai-registry/mcp-runtime.test.ts src/ai-registry/mcp-stdio.test.ts src/kb/client.test.ts src/kb/config.test.ts src/kb/commands.test.ts src/kb/login.test.ts src/kb/transfers.test.ts src/kb/contract.test.ts src/authorization/environment-governance-client.test.ts src/authorization/environment-governance-commands.test.ts src/authorization/environment-publication.test.ts src/authorization/managed-keycloak.test.ts src/authorization/managed-keycloak-producer.test.ts src/kb/web.test.ts src/kb/web-queue.test.ts src/local-web/context-menu.test.ts src/kb/web-login.test.ts src/kb/capabilities.test.ts src/jev/input.test.ts src/jev/profile.test.ts src/jev/client.test.ts src/jev/commands.test.ts scripts/check-default-profile.test.mjs",
56
+ "root:test": "node --import tsx --test --test-concurrency=4 src/mcp-gateway/profile.test.ts src/mcp-gateway/runtime.test.ts src/mcp-gateway/install.test.ts src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/profile-migration.test.ts src/identity.test.ts src/backend.test.ts src/cert/client.test.ts src/cert/commands.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/mail/client.test.ts src/wecom/client.test.ts src/wecom/commands.test.ts src/wecom/tools.test.ts src/ai-registry/client.test.ts src/ai-registry/bootstrap.test.ts src/ai-registry/install-defaults.test.ts src/ai-registry/workspace.test.ts src/ai-registry/namespace.test.ts src/compatibility/registry-instance.test.ts src/ai-registry/sync.test.ts src/ai-registry/bridge.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/skill-uninstaller.test.ts src/ai-registry/skill-dependencies.test.ts src/ai-registry/updates.test.ts src/maintenance/scheduler.test.ts src/maintenance/codex.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/oss/client.test.ts src/oss/governance.test.ts src/oss/commands.test.ts src/oss/auth-code.test.ts src/oss/clipboard.test.ts src/oss/web.test.ts src/oss/web-session.test.ts src/oss/web-transfers.test.ts src/oss/web-command.test.ts src/oss/local-picker.test.ts src/oss/transfer-paths.test.ts src/oss/transfer-worker.test.ts src/oss/transfer-queue.test.ts src/oss/web-page.test.ts src/oss/file-operations.test.ts src/oss/download-links.test.ts src/oss/bootstrap.test.ts src/oss/transfers.test.ts src/oss/search.test.ts src/oss/tools.test.ts src/mcp/install.test.ts src/mcp/catalog.test.ts src/tasks/runtime.test.ts src/tasks/stdio.test.ts src/tasks/wecom-notify.test.ts src/tasks/oss-query.test.ts src/interactive/wizard.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/gitops/client.test.ts src/gitops/commands.test.ts src/gitops/workload-input.test.ts src/gitops/workload-client.test.ts src/gitops/workload-commands.test.ts src/repositories/client.test.ts src/repositories/commands.test.ts src/publications/scanner.test.ts src/publications/client.test.ts src/publications/commands.test.ts src/jenkins-jobs/client.test.ts src/jenkins-jobs/commands.test.ts src/clusters/client.test.ts src/clusters/commands.test.ts src/clusters/kubeconfig-discovery.test.ts src/teams/client.test.ts src/teams/commands.test.ts src/authorization/bootstrap-client.test.ts src/authorization/commands.test.ts src/authorization/access-request-client.test.ts src/authorization/access-request-commands.test.ts src/application-candidates/client.test.ts src/application-candidates/commands.test.ts src/application-onboarding/client.test.ts src/application-onboarding/commands.test.ts src/application-onboarding/tui.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs src/authorization/application-commands.test.ts src/authorization/application-client.test.ts src/authorization/application-schemas.test.ts src/notion/client.test.ts src/notion/commands.test.ts src/notion/tools.test.ts src/notion/machine-cli.test.ts src/cloud/accounts.test.ts src/cloud/bootstrap.test.ts src/cloud/business-bootstrap.test.ts src/cloud/maintenance.test.ts src/cloud/wizard.test.ts src/cloud/oss-bootstrap.test.ts src/business-issuer.test.ts src/login-configuration.test.ts src/login-recovery.test.ts src/ai-registry/mcp-management.test.ts src/ai-registry/mcp-runtime.test.ts src/ai-registry/mcp-stdio.test.ts src/kb/client.test.ts src/kb/config.test.ts src/kb/commands.test.ts src/kb/login.test.ts src/kb/transfers.test.ts src/kb/contract.test.ts src/authorization/environment-governance-client.test.ts src/authorization/environment-governance-commands.test.ts src/authorization/environment-publication.test.ts src/authorization/managed-keycloak.test.ts src/authorization/managed-keycloak-producer.test.ts src/kb/web.test.ts src/kb/web-queue.test.ts src/local-web/context-menu.test.ts src/kb/web-login.test.ts src/kb/capabilities.test.ts src/jev/input.test.ts src/jev/profile.test.ts src/jev/client.test.ts src/jev/commands.test.ts scripts/check-default-profile.test.mjs src/data-resources/client.test.ts src/data-resources/commands.test.ts",
55
57
  "pack:check": "turbo run pack:check root:pack:check",
56
58
  "root:pack:check": "node scripts/check-root-package.mjs",
57
59
  "boundaries": "node scripts/check-workspace-boundaries.mjs",
@@ -78,8 +80,8 @@
78
80
  "dependencies": {
79
81
  "@clack/prompts": "^1.7.0",
80
82
  "@modelcontextprotocol/sdk": "^1.29.0",
81
- "@numa-tech/cli-auth": "1.26.15",
82
- "@tokensrc/codex": "1.26.15",
83
+ "@numa-tech/cli-auth": "1.26.17",
84
+ "@tokensrc/codex": "1.26.17",
83
85
  "ali-oss": "^6.23.0",
84
86
  "commander": "^14.0.3",
85
87
  "ink": "^6.8.0",
@@ -103,7 +105,7 @@
103
105
  "fast-uri": "4.1.2",
104
106
  "hono": "4.13.0",
105
107
  "ip-address": "10.4.0",
106
- "undici": "6.28.0"
108
+ "undici": "6.29.0"
107
109
  },
108
110
  "publishConfig": {
109
111
  "access": "public"