@numa-tech/numa 1.20.0 → 1.20.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.
- package/README.md +31 -2
- package/dist/ai-registry/bridge.js +3 -2
- package/dist/ai-registry/bridge.js.map +1 -1
- package/dist/ai-registry/client.d.ts +8 -1
- package/dist/ai-registry/client.js +11 -1
- package/dist/ai-registry/client.js.map +1 -1
- package/dist/ai-registry/commands.d.ts +3 -0
- package/dist/ai-registry/commands.js +48 -36
- package/dist/ai-registry/commands.js.map +1 -1
- package/dist/ai-registry/mcp-management.d.ts +2 -0
- package/dist/ai-registry/mcp-management.js +74 -0
- package/dist/ai-registry/mcp-management.js.map +1 -0
- package/dist/ai-registry/mcp-runtime-commands.d.ts +15 -0
- package/dist/ai-registry/mcp-runtime-commands.js +101 -0
- package/dist/ai-registry/mcp-runtime-commands.js.map +1 -0
- package/dist/ai-registry/mcp-runtime.d.ts +37 -0
- package/dist/ai-registry/mcp-runtime.js +134 -0
- package/dist/ai-registry/mcp-runtime.js.map +1 -0
- package/dist/ai-registry/mcp-stdio.d.ts +2 -0
- package/dist/ai-registry/mcp-stdio.js +18 -0
- package/dist/ai-registry/mcp-stdio.js.map +1 -0
- package/dist/authorization/application-client.d.ts +1271 -0
- package/dist/authorization/application-client.js +391 -0
- package/dist/authorization/application-client.js.map +1 -0
- package/dist/authorization/application-commands.d.ts +15 -0
- package/dist/authorization/application-commands.js +240 -0
- package/dist/authorization/application-commands.js.map +1 -0
- package/dist/authorization/application-schemas.d.ts +731 -0
- package/dist/authorization/application-schemas.js +521 -0
- package/dist/authorization/application-schemas.js.map +1 -0
- package/dist/authorization/{client.d.ts → bootstrap-client.d.ts} +5 -26
- package/dist/authorization/{client.js → bootstrap-client.js} +4 -27
- package/dist/authorization/bootstrap-client.js.map +1 -0
- package/dist/authorization/commands.d.ts +6 -21
- package/dist/authorization/commands.js +8 -130
- package/dist/authorization/commands.js.map +1 -1
- package/dist/authorization/enrollment-client.d.ts +40 -0
- package/dist/authorization/enrollment-client.js +56 -0
- package/dist/authorization/enrollment-client.js.map +1 -0
- package/dist/authorization/enrollment-commands.d.ts +5 -0
- package/dist/authorization/enrollment-commands.js +30 -0
- package/dist/authorization/enrollment-commands.js.map +1 -0
- package/dist/authorization/enrollment.d.ts +2 -2
- package/dist/authorization/enrollment.js +2 -2
- package/dist/authorization/enrollment.js.map +1 -1
- package/dist/authorization/schemas.d.ts +0 -90
- package/dist/authorization/schemas.js +0 -48
- package/dist/authorization/schemas.js.map +1 -1
- package/dist/backend.d.ts +1 -0
- package/dist/backend.js +4 -1
- package/dist/backend.js.map +1 -1
- package/dist/business-issuer.d.ts +4 -0
- package/dist/business-issuer.js +30 -0
- package/dist/business-issuer.js.map +1 -0
- package/dist/cli.js +61 -30
- package/dist/cli.js.map +1 -1
- package/dist/cloud/bootstrap.js +1 -1
- package/dist/cloud/bootstrap.js.map +1 -1
- package/dist/command-catalog.js +11 -36
- package/dist/command-catalog.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +15 -6
- package/dist/config.js.map +1 -1
- package/dist/login-configuration.d.ts +8 -0
- package/dist/login-configuration.js +17 -0
- package/dist/login-configuration.js.map +1 -0
- package/dist/login-recovery.d.ts +2 -0
- package/dist/login-recovery.js +15 -0
- package/dist/login-recovery.js.map +1 -0
- package/dist/mcp/commands.js +12 -2
- package/dist/mcp/commands.js.map +1 -1
- package/dist/mcp-gateway/commands.d.ts +2 -0
- package/dist/mcp-gateway/commands.js +11 -0
- package/dist/mcp-gateway/commands.js.map +1 -1
- package/dist/oss/commands.js +15 -15
- package/dist/oss/commands.js.map +1 -1
- package/dist/oss/file-operations.d.ts +11 -1
- package/dist/oss/file-operations.js +61 -5
- package/dist/oss/file-operations.js.map +1 -1
- package/dist/oss/tools.js +1 -1
- package/dist/oss/tools.js.map +1 -1
- package/dist/oss/web-page.js +58 -14
- package/dist/oss/web-page.js.map +1 -1
- package/dist/oss/web.js +1 -1
- package/dist/oss/web.js.map +1 -1
- package/dist/platform-profile.d.ts +22 -2
- package/dist/platform-profile.js +67 -6
- package/dist/platform-profile.js.map +1 -1
- package/docs/application-default-groups.md +73 -0
- package/examples/cloud-bootstrap/README.md +1 -1
- package/examples/mcp/README.md +108 -0
- package/examples/mcp/management-smoke.py +154 -0
- package/examples/mcp/runtime-smoke.mjs +187 -0
- package/examples/mcp/server.json +17 -0
- package/examples/oss/README.md +78 -0
- package/examples/oss/__pycache__/roundtrip.cpython-314.pyc +0 -0
- package/examples/oss/__pycache__/test_roundtrip.cpython-314.pyc +0 -0
- package/examples/oss/roundtrip.py +84 -0
- package/examples/oss/test_roundtrip.py +66 -0
- package/package.json +5 -4
- package/dist/authorization/client.js.map +0 -1
- package/dist/authorization/group-client.d.ts +0 -169
- package/dist/authorization/group-client.js +0 -129
- package/dist/authorization/group-client.js.map +0 -1
- package/dist/authorization/group-commands.d.ts +0 -25
- package/dist/authorization/group-commands.js +0 -155
- package/dist/authorization/group-commands.js.map +0 -1
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import process from "node:process";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
3
|
-
import { loadConfig } from "../config.js";
|
|
4
|
-
import { GroupClient, GroupPlanInputSchema, ImpactKindSchema } from "./group-client.js";
|
|
5
|
-
import { initializeApplicationMembership } from "./enrollment.js";
|
|
6
|
-
import { AuthorizationError, sanitizeAuthorizationOutput } from "./errors.js";
|
|
7
|
-
export function registerGroupCommands(authorization, dependencies = {}) {
|
|
8
|
-
const client = dependencies.clientFactory ?? (() => new GroupClient(loadConfig()));
|
|
9
|
-
const enrollment = authorization.command("enrollment").description("本人应用成员资格与默认组同步(不操作 realm 默认组)");
|
|
10
|
-
enrollment.command("status").description("只读查询本人入组状态,不触发授权")
|
|
11
|
-
.action(async (_options, command) => output(command, { ok: true, enrollment: await client().enrollment() }));
|
|
12
|
-
enrollment.command("initialize").description("显式初始化本人默认组;机器、暂停和已撤销成员不可自动入组")
|
|
13
|
-
.action(async (_options, command) => {
|
|
14
|
-
const result = await initializeApplicationMembership(loadConfig(), { client: client() });
|
|
15
|
-
await output(command, { ok: result.status === "READY", ...result });
|
|
16
|
-
if (result.status !== "READY")
|
|
17
|
-
process.exitCode = 1;
|
|
18
|
-
});
|
|
19
|
-
const group = authorization.command("group").description("应用受管组、默认策略及成员重分配;不直接连接 Keycloak")
|
|
20
|
-
.addHelpText("after", `
|
|
21
|
-
所有变更先生成不可变计划,再显式 apply;超时先 status 同一个计划,UNKNOWN 需重新预览。
|
|
22
|
-
组角色使用已登记应用的 Client Role;格式 clientId/roleName,平台角色兼容裸名称。
|
|
23
|
-
成员来源、状态、漂移与最终权限全部由平台服务端校验。
|
|
24
|
-
`);
|
|
25
|
-
paginated(group.command("list").description("分页查询受管组、默认策略和允许的基础角色"))
|
|
26
|
-
.action(async (options, command) => {
|
|
27
|
-
const { page, limit } = parseGroupPagination(options);
|
|
28
|
-
await output(command, { ok: true, ...await client().list(page, limit) });
|
|
29
|
-
});
|
|
30
|
-
paginated(group.command("members").description("分页查询应用成员;不是 realm 用户全量清单").option("--query <text>", "按用户名称或邮箱搜索").option("--group-id <uuid>", "受管组 ID 筛选"))
|
|
31
|
-
.action(async (options, command) => {
|
|
32
|
-
const { page, limit } = parseGroupPagination(options);
|
|
33
|
-
await output(command, { ok: true, ...await client().members(options.query, page, limit, options.groupId) });
|
|
34
|
-
});
|
|
35
|
-
paginated(group.command("users").description("从 Keycloak 人员目录搜索候选,返回稳定 subject;不创建成员").requiredOption("--query <text>", "输入名称或邮箱搜索"))
|
|
36
|
-
.action(async (options, command) => {
|
|
37
|
-
const { page, limit } = parseGroupPagination(options);
|
|
38
|
-
await output(command, { ok: true, ...await client().users(options.query, page, limit) });
|
|
39
|
-
});
|
|
40
|
-
paginated(group.command("directory").description("只读发现可关联的远端普通组;发现不等于允许接管").option("--query <text>", "按组名搜索"))
|
|
41
|
-
.action(async (options, command) => {
|
|
42
|
-
const { page, limit } = parseGroupPagination(options);
|
|
43
|
-
await output(command, { ok: true, ...await client().directoryGroups(options.query, page, limit) });
|
|
44
|
-
});
|
|
45
|
-
group.command("plan").description("从严格 JSON 输入预览创建/关联组、角色绑定、策略、成员或重分配变更;不写 Keycloak")
|
|
46
|
-
.requiredOption("--file <path>", "GroupPlanInput JSON 文件,不含 secret 或 token")
|
|
47
|
-
.action(async (options, command) => {
|
|
48
|
-
const source = await readFile(options.file, "utf8");
|
|
49
|
-
if (Buffer.byteLength(source) > 64 * 1024)
|
|
50
|
-
throw invalid("Group plan file exceeds 64 KiB.");
|
|
51
|
-
let body;
|
|
52
|
-
try {
|
|
53
|
-
body = JSON.parse(source);
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
throw invalid("Group plan file must contain valid JSON.");
|
|
57
|
-
}
|
|
58
|
-
await output(command, { ok: true, plan: await client().plan(parseGroupPlanInput(body)) });
|
|
59
|
-
}).addHelpText("after", `
|
|
60
|
-
JSON 示例:
|
|
61
|
-
{"operation":"CREATE_GROUP","name":"mci-devops-platform-users"}
|
|
62
|
-
{"operation":"SET_POLICY","groupId":"<managed-group-uuid>","enabled":true}
|
|
63
|
-
{"operation":"FILL_MISSING"}
|
|
64
|
-
|
|
65
|
-
numa authorization group plan --file group-plan.json --json
|
|
66
|
-
`);
|
|
67
|
-
group.command("status <plan-id>").description("只读检查同一计划的结果;UNKNOWN 需核对后重新预览")
|
|
68
|
-
.action(async (id, _options, command) => output(command, { ok: true, plan: await client().getPlan(planId(id)) }));
|
|
69
|
-
paginated(group.command("items <plan-id>").description("分页检查计划全部候选;status 仅含前 20 条摘要"))
|
|
70
|
-
.action(async (id, options, command) => {
|
|
71
|
-
const { page, limit } = parseGroupPagination(options);
|
|
72
|
-
await output(command, { ok: true, ...await client().planItems(planId(id), page, limit) });
|
|
73
|
-
});
|
|
74
|
-
paginated(group.command("impact <plan-id>").description("分页读取摘要绑定的真实业务范围;counts 不等于完整明细")
|
|
75
|
-
.requiredOption("--kind <kind>", "notionRoleGrants、readerNamespaces 或 ossExistingGrants"))
|
|
76
|
-
.action(async (id, options, command) => {
|
|
77
|
-
const { page, limit } = parseGroupPagination(options);
|
|
78
|
-
const kind = ImpactKindSchema.safeParse(options.kind);
|
|
79
|
-
if (!kind.success)
|
|
80
|
-
throw invalid("kind must be notionRoleGrants, readerNamespaces, or ossExistingGrants.");
|
|
81
|
-
await output(command, { ok: true, kind: kind.data, ...await client().impact(planId(id), kind.data, page, limit) });
|
|
82
|
-
});
|
|
83
|
-
group.command("apply <plan-id>").description("确认执行或恢复同一批准快照;不重新生成成员范围")
|
|
84
|
-
.requiredOption("--expected-digest <sha256>", "预览返回的精确 digest")
|
|
85
|
-
.requiredOption("--idempotency-key <key>", "8-200 字符;重试复用同一个值")
|
|
86
|
-
.option("--yes", "已核对当前环境、计划明细、权限变化与人员范围")
|
|
87
|
-
.action(async (id, options, command) => {
|
|
88
|
-
const input = parseGroupApplyInput(options);
|
|
89
|
-
const plan = await client().getPlan(planId(id));
|
|
90
|
-
if (plan.digest !== input.expectedDigest)
|
|
91
|
-
throw invalid("Plan digest changed. Read a new preview before applying.");
|
|
92
|
-
if (!["PREVIEW", "APPLIED"].includes(plan.status))
|
|
93
|
-
throw invalid("This plan cannot be replayed. Inspect all items and create a new preview after UNKNOWN, failure, or drift.");
|
|
94
|
-
const result = await client().apply(planId(id), input.expectedDigest, input.idempotencyKey);
|
|
95
|
-
await output(command, { ok: result.status === "APPLIED", plan: result });
|
|
96
|
-
if (result.status !== "APPLIED")
|
|
97
|
-
process.exitCode = 1;
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
export function parseGroupPlanInput(value) {
|
|
101
|
-
const result = GroupPlanInputSchema.safeParse(value);
|
|
102
|
-
if (!result.success)
|
|
103
|
-
throw invalid("Invalid group plan fields or role. Use registered application Client Role references.");
|
|
104
|
-
const input = result.data;
|
|
105
|
-
const requiresGroup = ["SET_GROUP_ROLES", "SET_POLICY", "ADD_MEMBER", "REMOVE_MEMBER", "RESTORE_MEMBER", "DEACTIVATE_GROUP"];
|
|
106
|
-
if (requiresGroup.includes(input.operation) && input.groupId == null)
|
|
107
|
-
throw invalid("This operation requires groupId.");
|
|
108
|
-
if (input.operation === "CREATE_GROUP" && (!input.name || !/^[A-Za-z0-9][A-Za-z0-9_.-]{2,119}$/u.test(input.name)))
|
|
109
|
-
throw invalid("CREATE_GROUP requires a flat 3-120 character name (letters, numbers, dot, dash, underscore).");
|
|
110
|
-
if (input.operation === "LINK_GROUP" && !input.keycloakGroupId)
|
|
111
|
-
throw invalid("LINK_GROUP requires keycloakGroupId.");
|
|
112
|
-
if (["ADD_MEMBER", "REMOVE_MEMBER", "RESTORE_MEMBER", "SET_MEMBER_STATE"].includes(input.operation) && !input.subject)
|
|
113
|
-
throw invalid("This operation requires subject from the member directory.");
|
|
114
|
-
if (input.operation === "SET_MEMBER_STATE" && !input.state)
|
|
115
|
-
throw invalid("SET_MEMBER_STATE requires state.");
|
|
116
|
-
if (input.operation === "SET_GROUP_ROLES" && input.roles == null)
|
|
117
|
-
throw invalid("SET_GROUP_ROLES requires an explicit roles list.");
|
|
118
|
-
if (input.operation === "SET_POLICY" && input.enabled == null)
|
|
119
|
-
throw invalid("SET_POLICY requires explicit enabled.");
|
|
120
|
-
for (const value of [input.name, input.subject, input.keycloakGroupId]) {
|
|
121
|
-
if (value && /[\u0000-\u001f\u007f]/u.test(value))
|
|
122
|
-
throw invalid("Group plan values must not contain control characters.");
|
|
123
|
-
}
|
|
124
|
-
return input;
|
|
125
|
-
}
|
|
126
|
-
export function parseGroupApplyInput(options) {
|
|
127
|
-
if (!options.yes)
|
|
128
|
-
throw invalid("Group authorization changes require --yes after reviewing the plan.");
|
|
129
|
-
if (!/^[a-f0-9]{64}$/iu.test(options.expectedDigest))
|
|
130
|
-
throw invalid("expected-digest must be the preview SHA-256 digest.");
|
|
131
|
-
if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{7,199}$/u.test(options.idempotencyKey))
|
|
132
|
-
throw invalid("idempotency-key must be 8-200 safe characters.");
|
|
133
|
-
return { expectedDigest: options.expectedDigest, idempotencyKey: options.idempotencyKey };
|
|
134
|
-
}
|
|
135
|
-
export function parseGroupPagination(options) {
|
|
136
|
-
const page = Number(options.page), limit = Number(options.limit);
|
|
137
|
-
if (!Number.isSafeInteger(page) || page < 1 || !Number.isSafeInteger(limit) || limit < 1 || limit > 100)
|
|
138
|
-
throw invalid("page must start at 1; limit must be 1-100.");
|
|
139
|
-
return { page, limit };
|
|
140
|
-
}
|
|
141
|
-
function paginated(command) {
|
|
142
|
-
return command.option("--page <number>", "从 1 开始的页码", "1").option("--limit <count>", "每页 1-100 条", "20");
|
|
143
|
-
}
|
|
144
|
-
function planId(value) {
|
|
145
|
-
if (!/^[A-Za-z0-9_-]{1,200}$/u.test(value))
|
|
146
|
-
throw invalid("Invalid plan ID.");
|
|
147
|
-
return value;
|
|
148
|
-
}
|
|
149
|
-
function invalid(message) { return new AuthorizationError(message, "authorization_input_invalid"); }
|
|
150
|
-
async function output(_command, value) {
|
|
151
|
-
// Keep server field names stable for plan-file automation; redaction precedes all output.
|
|
152
|
-
const safe = sanitizeAuthorizationOutput(value);
|
|
153
|
-
process.stdout.write(`${JSON.stringify(safe, null, 2)}\n`);
|
|
154
|
-
}
|
|
155
|
-
//# sourceMappingURL=group-commands.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"group-commands.js","sourceRoot":"","sources":["../../src/authorization/group-commands.ts"],"names":[],"mappings":"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"}
|