@numa-tech/numa 1.12.10 → 1.13.0
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 +96 -14
- package/dist/ai-registry/commands.js +33 -33
- package/dist/ai-registry/commands.js.map +1 -1
- package/dist/app-config.d.ts +0 -1
- package/dist/app-config.js +4 -2
- package/dist/app-config.js.map +1 -1
- package/dist/application-onboarding/client.d.ts +83 -8
- package/dist/application-onboarding/client.js +23 -1
- package/dist/application-onboarding/client.js.map +1 -1
- package/dist/application-onboarding/commands.js +66 -4
- package/dist/application-onboarding/commands.js.map +1 -1
- package/dist/application-onboarding/schemas.d.ts +301 -58
- package/dist/application-onboarding/schemas.js +134 -8
- package/dist/application-onboarding/schemas.js.map +1 -1
- package/dist/application-onboarding/tui-model.d.ts +18 -0
- package/dist/application-onboarding/tui-model.js +215 -3
- package/dist/application-onboarding/tui-model.js.map +1 -1
- package/dist/application-onboarding/tui.d.ts +1 -1
- package/dist/application-onboarding/tui.js +20 -6
- package/dist/application-onboarding/tui.js.map +1 -1
- package/dist/authorization/access-request-client.d.ts +45 -0
- package/dist/authorization/access-request-client.js +93 -0
- package/dist/authorization/access-request-client.js.map +1 -0
- package/dist/authorization/access-request-commands.d.ts +25 -0
- package/dist/authorization/access-request-commands.js +196 -0
- package/dist/authorization/access-request-commands.js.map +1 -0
- package/dist/authorization/access-request-schemas.d.ts +123 -0
- package/dist/authorization/access-request-schemas.js +67 -0
- package/dist/authorization/access-request-schemas.js.map +1 -0
- package/dist/authorization/client.d.ts +50 -0
- package/dist/authorization/client.js +113 -0
- package/dist/authorization/client.js.map +1 -0
- package/dist/authorization/commands.d.ts +40 -0
- package/dist/authorization/commands.js +296 -0
- package/dist/authorization/commands.js.map +1 -0
- package/dist/authorization/errors.d.ts +13 -0
- package/dist/authorization/errors.js +70 -0
- package/dist/authorization/errors.js.map +1 -0
- package/dist/authorization/schemas.d.ts +187 -0
- package/dist/authorization/schemas.js +101 -0
- package/dist/authorization/schemas.js.map +1 -0
- package/dist/cli.js +73 -9
- package/dist/cli.js.map +1 -1
- package/dist/clusters/client.d.ts +436 -0
- package/dist/clusters/client.js +207 -0
- package/dist/clusters/client.js.map +1 -0
- package/dist/clusters/commands.d.ts +11 -0
- package/dist/clusters/commands.js +373 -0
- package/dist/clusters/commands.js.map +1 -0
- package/dist/clusters/errors.d.ts +10 -0
- package/dist/clusters/errors.js +61 -0
- package/dist/clusters/errors.js.map +1 -0
- package/dist/clusters/kubeconfig-discovery.d.ts +48 -0
- package/dist/clusters/kubeconfig-discovery.js +280 -0
- package/dist/clusters/kubeconfig-discovery.js.map +1 -0
- package/dist/clusters/schemas.d.ts +510 -0
- package/dist/clusters/schemas.js +201 -0
- package/dist/clusters/schemas.js.map +1 -0
- package/dist/command-catalog.js +490 -26
- package/dist/command-catalog.js.map +1 -1
- package/dist/gitops/client.d.ts +499 -0
- package/dist/gitops/client.js +163 -0
- package/dist/gitops/client.js.map +1 -0
- package/dist/gitops/commands.d.ts +11 -0
- package/dist/gitops/commands.js +367 -0
- package/dist/gitops/commands.js.map +1 -0
- package/dist/gitops/errors.d.ts +10 -0
- package/dist/gitops/errors.js +59 -0
- package/dist/gitops/errors.js.map +1 -0
- package/dist/gitops/schemas.d.ts +1712 -0
- package/dist/gitops/schemas.js +360 -0
- package/dist/gitops/schemas.js.map +1 -0
- package/dist/repositories/client.d.ts +540 -0
- package/dist/repositories/client.js +215 -0
- package/dist/repositories/client.js.map +1 -0
- package/dist/repositories/commands.d.ts +10 -0
- package/dist/repositories/commands.js +347 -0
- package/dist/repositories/commands.js.map +1 -0
- package/dist/repositories/errors.d.ts +10 -0
- package/dist/repositories/errors.js +60 -0
- package/dist/repositories/errors.js.map +1 -0
- package/dist/repositories/schemas.d.ts +1692 -0
- package/dist/repositories/schemas.js +255 -0
- package/dist/repositories/schemas.js.map +1 -0
- package/dist/web-console-page.d.ts +1 -1
- package/dist/web-console-page.js +1 -1
- package/dist/web-console.js +2 -2
- package/dist/web-console.js.map +1 -1
- package/examples/ai-registry/README.md +18 -0
- package/examples/ai-registry/nacos-instance.username-password.example.json +25 -0
- package/package.json +4 -4
- package/skills/numa-ai-registry/SKILL.md +5 -5
- package/skills/numa-ai-registry/evals/evals.json +1 -1
- package/skills/numa-ai-registry/references/command-contract.md +22 -22
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { loadAppConfig } from "../app-config.js";
|
|
3
|
+
import { sanitizeAuthorizationOutput } from "./errors.js";
|
|
4
|
+
import { AuthorizationError } from "./errors.js";
|
|
5
|
+
const ROLE_PREFIX = "mci-devops-platform-";
|
|
6
|
+
const REQUEST_ID = /^ar_[A-Za-z0-9_-]{8,76}$/u;
|
|
7
|
+
const CONTROL_CHARACTERS = /[\u0000-\u001f\u007f]/u;
|
|
8
|
+
export function registerAccessRequestCommands(authorization, dependencies) {
|
|
9
|
+
const accessRequest = authorization.command("access-request")
|
|
10
|
+
.description("申请角色权限、查询申请清单并执行双人审批")
|
|
11
|
+
.addHelpText("after", `
|
|
12
|
+
安全边界:
|
|
13
|
+
create 只提交申请,不会直接授权。
|
|
14
|
+
review 只向 DevOps 提交审批决定;Keycloak 管理凭据不会进入 CLI。
|
|
15
|
+
审批人不能审批自己的申请,最终授权状态以服务端返回为准。
|
|
16
|
+
`);
|
|
17
|
+
addExamples(accessRequest.command("options")
|
|
18
|
+
.description("列出可申请角色、namespace 和当前用户的审批能力")
|
|
19
|
+
.action(async (_options, command) => {
|
|
20
|
+
const options = await dependencies.clientFactory().options();
|
|
21
|
+
const lines = [
|
|
22
|
+
...options.roles.map((role) => `${role.roleCode}\t${role.scopeType}\t${role.roleName}`),
|
|
23
|
+
...options.namespaces.map((namespace) => `${namespace.id}\t${namespace.namespaceKey}\t${namespace.environment}\t${namespace.displayName}`)
|
|
24
|
+
];
|
|
25
|
+
await output(command, { ok: true, options }, lines.join("\n") || "没有可申请的角色或 namespace");
|
|
26
|
+
}), ["numa authorization access-request options --json"]);
|
|
27
|
+
addExamples(accessRequest.command("create")
|
|
28
|
+
.description("提交角色权限申请;不会直接执行授权")
|
|
29
|
+
.requiredOption("--role <role-code>", "可申请的完整 Client Role 名称")
|
|
30
|
+
.requiredOption("--reason <text>", "申请原因(至少 5 个字符)")
|
|
31
|
+
.requiredOption("--idempotency-key <key>", "8-200 字符;网络重试时复用同一个值")
|
|
32
|
+
.option("--namespace-id <id>", "namespace 范围角色所需的平台 namespace ID")
|
|
33
|
+
.action(async (options, command) => {
|
|
34
|
+
const input = parseCreateAccessRequestInput(options);
|
|
35
|
+
const request = await dependencies.clientFactory().create(input);
|
|
36
|
+
await output(command, { ok: true, access_request: request }, requestLine(request));
|
|
37
|
+
}), [
|
|
38
|
+
"numa authorization access-request create --role mci-devops-platform-ai-registry-reviewer --namespace-id 7 --reason '负责 team-ai 发布审核' --idempotency-key reviewer-team-ai-20260820 --json"
|
|
39
|
+
]);
|
|
40
|
+
addExamples(accessRequest.command("list")
|
|
41
|
+
.description("查询自己的申请清单或当前用户可审批的清单")
|
|
42
|
+
.option("--view <view>", "mine 或 review", "mine")
|
|
43
|
+
.option("--state <state>", "按状态筛选")
|
|
44
|
+
.option("--cursor <id>", "上一页返回的 nextCursor")
|
|
45
|
+
.option("--limit <count>", "每页 1-100 条", "20")
|
|
46
|
+
.action(async (options, command) => {
|
|
47
|
+
const input = parseListAccessRequestsInput(options);
|
|
48
|
+
const result = await dependencies.clientFactory().list(input);
|
|
49
|
+
await output(command, { ok: true, ...result }, result.items.map(requestLine).join("\n") || (input.view === "mine" ? "没有权限申请" : "没有待审批申请"));
|
|
50
|
+
}), [
|
|
51
|
+
"numa authorization access-request list --view mine --json",
|
|
52
|
+
"numa authorization access-request list --view review --state SUBMITTED --json"
|
|
53
|
+
]);
|
|
54
|
+
addExamples(accessRequest.command("show <request-id>")
|
|
55
|
+
.description("查询本人申请或有权审批的申请详情")
|
|
56
|
+
.action(async (requestIdValue, _options, command) => {
|
|
57
|
+
const request = await dependencies.clientFactory().get(parseAccessRequestId(requestIdValue));
|
|
58
|
+
await output(command, { ok: true, access_request: request }, requestLine(request));
|
|
59
|
+
}), ["numa authorization access-request show ar_0123456789abcdef0123456789abcdef --json"]);
|
|
60
|
+
addExamples(accessRequest.command("cancel <request-id>")
|
|
61
|
+
.description("申请人撤销仍处于 SUBMITTED 的申请")
|
|
62
|
+
.requiredOption("--version <version>", "详情或清单返回的乐观锁版本")
|
|
63
|
+
.action(async (requestIdValue, options, command) => {
|
|
64
|
+
const request = await dependencies.clientFactory().cancel(parseAccessRequestId(requestIdValue), parseVersion(options.version));
|
|
65
|
+
await output(command, { ok: true, access_request: request }, requestLine(request));
|
|
66
|
+
}), ["numa authorization access-request cancel ar_0123456789abcdef0123456789abcdef --version 0 --json"]);
|
|
67
|
+
addExamples(accessRequest.command("review <request-id>")
|
|
68
|
+
.description("审批或重试授权;禁止申请人自审")
|
|
69
|
+
.requiredOption("--decision <decision>", "approve 或 reject")
|
|
70
|
+
.requiredOption("--reason <text>", "审批依据(至少 3 个字符)")
|
|
71
|
+
.requiredOption("--version <version>", "详情或审批清单返回的乐观锁版本")
|
|
72
|
+
.action(async (requestIdValue, options, command) => {
|
|
73
|
+
const input = parseReviewAccessRequestInput(options);
|
|
74
|
+
const request = await dependencies.clientFactory().review(parseAccessRequestId(requestIdValue), input);
|
|
75
|
+
const completed = input.decision === "REJECT"
|
|
76
|
+
? request.state === "REJECTED"
|
|
77
|
+
: request.state === "GRANTED";
|
|
78
|
+
await output(command, { ok: completed, access_request: request }, requestLine(request));
|
|
79
|
+
if (!completed)
|
|
80
|
+
process.exitCode = 1;
|
|
81
|
+
}), [
|
|
82
|
+
"numa authorization access-request review ar_0123456789abcdef0123456789abcdef --decision approve --reason '职责确认无误' --version 0 --json",
|
|
83
|
+
"numa authorization access-request review ar_0123456789abcdef0123456789abcdef --decision reject --reason '职责范围不符' --version 0 --json"
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
export function parseCreateAccessRequestInput(options) {
|
|
87
|
+
const roleCode = boundedText(options.role, "role", 120, 1);
|
|
88
|
+
if (!roleCode.startsWith(ROLE_PREFIX) || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(roleCode)) {
|
|
89
|
+
throw invalid(`role must be a complete Client Role beginning with '${ROLE_PREFIX}'.`);
|
|
90
|
+
}
|
|
91
|
+
const reason = boundedText(options.reason, "reason", 2_000, 5);
|
|
92
|
+
const idempotencyKey = boundedText(options.idempotencyKey, "idempotency-key", 200, 8);
|
|
93
|
+
if (!/^[A-Za-z0-9._:-]+$/u.test(idempotencyKey)) {
|
|
94
|
+
throw invalid("idempotency-key may contain only letters, numbers, dot, underscore, colon, or dash.");
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
roleCode,
|
|
98
|
+
reason,
|
|
99
|
+
idempotencyKey,
|
|
100
|
+
...(options.namespaceId == null ? {} : { namespaceId: parsePositiveInteger(options.namespaceId, "namespace-id") })
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function parseListAccessRequestsInput(options) {
|
|
104
|
+
const view = options.view.trim().toLowerCase();
|
|
105
|
+
if (view !== "mine" && view !== "review")
|
|
106
|
+
throw invalid("view must be mine or review.");
|
|
107
|
+
const state = options.state == null ? undefined : options.state.trim().toUpperCase();
|
|
108
|
+
const allowedStates = ["SUBMITTED", "GRANTING", "GRANTED", "REJECTED", "GRANT_FAILED", "CANCELLED"];
|
|
109
|
+
if (state != null && !allowedStates.includes(state))
|
|
110
|
+
throw invalid("state is invalid.");
|
|
111
|
+
const limit = parsePositiveInteger(options.limit, "limit");
|
|
112
|
+
if (limit > 100)
|
|
113
|
+
throw invalid("limit must be between 1 and 100.");
|
|
114
|
+
const cursor = options.cursor == null ? undefined : String(parsePositiveInteger(options.cursor, "cursor"));
|
|
115
|
+
return {
|
|
116
|
+
view,
|
|
117
|
+
...(state == null ? {} : { state: state }),
|
|
118
|
+
...(cursor == null ? {} : { cursor }),
|
|
119
|
+
limit
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function parseReviewAccessRequestInput(options) {
|
|
123
|
+
const decision = options.decision.trim().toUpperCase();
|
|
124
|
+
if (decision !== "APPROVE" && decision !== "REJECT") {
|
|
125
|
+
throw invalid("decision must be approve or reject.");
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
decision,
|
|
129
|
+
reason: boundedText(options.reason, "reason", 2_000, 3),
|
|
130
|
+
version: parseVersion(options.version)
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export function parseAccessRequestId(value) {
|
|
134
|
+
const normalized = value.trim();
|
|
135
|
+
if (!REQUEST_ID.test(normalized))
|
|
136
|
+
throw invalid("request-id is invalid.");
|
|
137
|
+
return normalized;
|
|
138
|
+
}
|
|
139
|
+
export function parseVersion(value) {
|
|
140
|
+
const parsed = Number(value);
|
|
141
|
+
if (!Number.isSafeInteger(parsed) || parsed < 0 || String(parsed) !== value.trim()) {
|
|
142
|
+
throw invalid("version must be a non-negative integer.");
|
|
143
|
+
}
|
|
144
|
+
return parsed;
|
|
145
|
+
}
|
|
146
|
+
function parsePositiveInteger(value, label) {
|
|
147
|
+
const parsed = Number(value);
|
|
148
|
+
if (!Number.isSafeInteger(parsed) || parsed < 1 || String(parsed) !== value.trim()) {
|
|
149
|
+
throw invalid(`${label} must be a positive integer.`);
|
|
150
|
+
}
|
|
151
|
+
return parsed;
|
|
152
|
+
}
|
|
153
|
+
function boundedText(value, label, maximum, minimum) {
|
|
154
|
+
const normalized = value.trim();
|
|
155
|
+
if (normalized.length < minimum || normalized.length > maximum || CONTROL_CHARACTERS.test(normalized)) {
|
|
156
|
+
throw invalid(`${label} must be ${minimum}-${maximum} characters and contain no control characters.`);
|
|
157
|
+
}
|
|
158
|
+
return normalized;
|
|
159
|
+
}
|
|
160
|
+
function requestLine(request) {
|
|
161
|
+
return [
|
|
162
|
+
request.requestId,
|
|
163
|
+
request.state,
|
|
164
|
+
request.roleCode,
|
|
165
|
+
request.namespaceKey ?? "GLOBAL",
|
|
166
|
+
`v${request.version}`
|
|
167
|
+
].join("\t");
|
|
168
|
+
}
|
|
169
|
+
function addExamples(command, examples) {
|
|
170
|
+
return command.addHelpText("after", `\nExamples:\n${examples.map((item) => ` ${item}`).join("\n")}\n`);
|
|
171
|
+
}
|
|
172
|
+
async function output(command, payload, textValue) {
|
|
173
|
+
const config = await loadAppConfig();
|
|
174
|
+
if (command.optsWithGlobals().json || config.output === "json") {
|
|
175
|
+
process.stdout.write(`${JSON.stringify(stableOutput(payload), null, 2)}\n`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
process.stdout.write(`${String(sanitizeAuthorizationOutput(textValue))}\n`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function stableOutput(value) {
|
|
182
|
+
const safe = sanitizeAuthorizationOutput(value);
|
|
183
|
+
if (Array.isArray(safe))
|
|
184
|
+
return safe.map(stableOutput);
|
|
185
|
+
if (safe && typeof safe === "object") {
|
|
186
|
+
return Object.fromEntries(Object.entries(safe).map(([key, item]) => [
|
|
187
|
+
key.replace(/([a-z0-9])([A-Z])/gu, "$1_$2").toLowerCase(),
|
|
188
|
+
stableOutput(item)
|
|
189
|
+
]));
|
|
190
|
+
}
|
|
191
|
+
return safe;
|
|
192
|
+
}
|
|
193
|
+
function invalid(message) {
|
|
194
|
+
return new AuthorizationError(message, "authorization_input_invalid");
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=access-request-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-request-commands.js","sourceRoot":"","sources":["../../src/authorization/access-request-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const AccessRequestStateSchema: z.ZodEnum<{
|
|
3
|
+
CANCELLED: "CANCELLED";
|
|
4
|
+
GRANTED: "GRANTED";
|
|
5
|
+
GRANTING: "GRANTING";
|
|
6
|
+
GRANT_FAILED: "GRANT_FAILED";
|
|
7
|
+
REJECTED: "REJECTED";
|
|
8
|
+
SUBMITTED: "SUBMITTED";
|
|
9
|
+
}>;
|
|
10
|
+
export declare const AccessRequestSchema: z.ZodObject<{
|
|
11
|
+
id: z.ZodNumber;
|
|
12
|
+
requestId: z.ZodString;
|
|
13
|
+
requesterSubject: z.ZodString;
|
|
14
|
+
requesterUsername: z.ZodNullable<z.ZodString>;
|
|
15
|
+
roleCode: z.ZodString;
|
|
16
|
+
roleName: z.ZodString;
|
|
17
|
+
scopeType: z.ZodEnum<{
|
|
18
|
+
AI_REGISTRY_NAMESPACE: "AI_REGISTRY_NAMESPACE";
|
|
19
|
+
GLOBAL: "GLOBAL";
|
|
20
|
+
}>;
|
|
21
|
+
namespaceId: z.ZodNullable<z.ZodNumber>;
|
|
22
|
+
namespaceKey: z.ZodNullable<z.ZodString>;
|
|
23
|
+
nacosNamespaceId: z.ZodNullable<z.ZodString>;
|
|
24
|
+
namespaceName: z.ZodNullable<z.ZodString>;
|
|
25
|
+
environment: z.ZodNullable<z.ZodString>;
|
|
26
|
+
reason: z.ZodString;
|
|
27
|
+
state: z.ZodEnum<{
|
|
28
|
+
CANCELLED: "CANCELLED";
|
|
29
|
+
GRANTED: "GRANTED";
|
|
30
|
+
GRANTING: "GRANTING";
|
|
31
|
+
GRANT_FAILED: "GRANT_FAILED";
|
|
32
|
+
REJECTED: "REJECTED";
|
|
33
|
+
SUBMITTED: "SUBMITTED";
|
|
34
|
+
}>;
|
|
35
|
+
reviewedBy: z.ZodNullable<z.ZodString>;
|
|
36
|
+
reviewedByUsername: z.ZodNullable<z.ZodString>;
|
|
37
|
+
reviewReason: z.ZodNullable<z.ZodString>;
|
|
38
|
+
reviewedAt: z.ZodNullable<z.ZodString>;
|
|
39
|
+
grantedAt: z.ZodNullable<z.ZodString>;
|
|
40
|
+
grantErrorCode: z.ZodNullable<z.ZodString>;
|
|
41
|
+
grantErrorSummary: z.ZodNullable<z.ZodString>;
|
|
42
|
+
grantRetryAt: z.ZodOptional<z.ZodString>;
|
|
43
|
+
grantRetryable: z.ZodOptional<z.ZodBoolean>;
|
|
44
|
+
version: z.ZodNumber;
|
|
45
|
+
createdAt: z.ZodString;
|
|
46
|
+
updatedAt: z.ZodString;
|
|
47
|
+
}, z.core.$strict>;
|
|
48
|
+
export declare const AccessRequestListSchema: z.ZodObject<{
|
|
49
|
+
view: z.ZodEnum<{
|
|
50
|
+
mine: "mine";
|
|
51
|
+
review: "review";
|
|
52
|
+
}>;
|
|
53
|
+
items: z.ZodArray<z.ZodObject<{
|
|
54
|
+
id: z.ZodNumber;
|
|
55
|
+
requestId: z.ZodString;
|
|
56
|
+
requesterSubject: z.ZodString;
|
|
57
|
+
requesterUsername: z.ZodNullable<z.ZodString>;
|
|
58
|
+
roleCode: z.ZodString;
|
|
59
|
+
roleName: z.ZodString;
|
|
60
|
+
scopeType: z.ZodEnum<{
|
|
61
|
+
AI_REGISTRY_NAMESPACE: "AI_REGISTRY_NAMESPACE";
|
|
62
|
+
GLOBAL: "GLOBAL";
|
|
63
|
+
}>;
|
|
64
|
+
namespaceId: z.ZodNullable<z.ZodNumber>;
|
|
65
|
+
namespaceKey: z.ZodNullable<z.ZodString>;
|
|
66
|
+
nacosNamespaceId: z.ZodNullable<z.ZodString>;
|
|
67
|
+
namespaceName: z.ZodNullable<z.ZodString>;
|
|
68
|
+
environment: z.ZodNullable<z.ZodString>;
|
|
69
|
+
reason: z.ZodString;
|
|
70
|
+
state: z.ZodEnum<{
|
|
71
|
+
CANCELLED: "CANCELLED";
|
|
72
|
+
GRANTED: "GRANTED";
|
|
73
|
+
GRANTING: "GRANTING";
|
|
74
|
+
GRANT_FAILED: "GRANT_FAILED";
|
|
75
|
+
REJECTED: "REJECTED";
|
|
76
|
+
SUBMITTED: "SUBMITTED";
|
|
77
|
+
}>;
|
|
78
|
+
reviewedBy: z.ZodNullable<z.ZodString>;
|
|
79
|
+
reviewedByUsername: z.ZodNullable<z.ZodString>;
|
|
80
|
+
reviewReason: z.ZodNullable<z.ZodString>;
|
|
81
|
+
reviewedAt: z.ZodNullable<z.ZodString>;
|
|
82
|
+
grantedAt: z.ZodNullable<z.ZodString>;
|
|
83
|
+
grantErrorCode: z.ZodNullable<z.ZodString>;
|
|
84
|
+
grantErrorSummary: z.ZodNullable<z.ZodString>;
|
|
85
|
+
grantRetryAt: z.ZodOptional<z.ZodString>;
|
|
86
|
+
grantRetryable: z.ZodOptional<z.ZodBoolean>;
|
|
87
|
+
version: z.ZodNumber;
|
|
88
|
+
createdAt: z.ZodString;
|
|
89
|
+
updatedAt: z.ZodString;
|
|
90
|
+
}, z.core.$strict>>;
|
|
91
|
+
totalItems: z.ZodNumber;
|
|
92
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
93
|
+
pageSize: z.ZodOptional<z.ZodNumber>;
|
|
94
|
+
totalPages: z.ZodOptional<z.ZodNumber>;
|
|
95
|
+
nextCursor: z.ZodOptional<z.ZodString>;
|
|
96
|
+
}, z.core.$strict>;
|
|
97
|
+
export declare const AccessRequestOptionsSchema: z.ZodObject<{
|
|
98
|
+
roles: z.ZodArray<z.ZodObject<{
|
|
99
|
+
roleCode: z.ZodString;
|
|
100
|
+
roleName: z.ZodString;
|
|
101
|
+
description: z.ZodNullable<z.ZodString>;
|
|
102
|
+
scopeType: z.ZodEnum<{
|
|
103
|
+
AI_REGISTRY_NAMESPACE: "AI_REGISTRY_NAMESPACE";
|
|
104
|
+
GLOBAL: "GLOBAL";
|
|
105
|
+
}>;
|
|
106
|
+
canReview: z.ZodBoolean;
|
|
107
|
+
}, z.core.$strict>>;
|
|
108
|
+
namespaces: z.ZodArray<z.ZodObject<{
|
|
109
|
+
id: z.ZodNumber;
|
|
110
|
+
namespaceKey: z.ZodString;
|
|
111
|
+
nacosNamespaceId: z.ZodString;
|
|
112
|
+
displayName: z.ZodString;
|
|
113
|
+
environment: z.ZodString;
|
|
114
|
+
}, z.core.$strict>>;
|
|
115
|
+
}, z.core.$strict>;
|
|
116
|
+
export declare const AccessRequestApiErrorSchema: z.ZodObject<{
|
|
117
|
+
code: z.ZodOptional<z.ZodString>;
|
|
118
|
+
message: z.ZodOptional<z.ZodString>;
|
|
119
|
+
}, z.core.$strip>;
|
|
120
|
+
export type AccessRequest = z.infer<typeof AccessRequestSchema>;
|
|
121
|
+
export type AccessRequestList = z.infer<typeof AccessRequestListSchema>;
|
|
122
|
+
export type AccessRequestOptions = z.infer<typeof AccessRequestOptionsSchema>;
|
|
123
|
+
export type AccessRequestState = z.infer<typeof AccessRequestStateSchema>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const AccessRequestStateSchema = z.enum([
|
|
3
|
+
"SUBMITTED",
|
|
4
|
+
"GRANTING",
|
|
5
|
+
"GRANTED",
|
|
6
|
+
"REJECTED",
|
|
7
|
+
"GRANT_FAILED",
|
|
8
|
+
"CANCELLED"
|
|
9
|
+
]);
|
|
10
|
+
export const AccessRequestSchema = z.object({
|
|
11
|
+
id: z.number().int().positive().max(Number.MAX_SAFE_INTEGER),
|
|
12
|
+
requestId: z.string().regex(/^ar_[A-Za-z0-9_-]{8,76}$/u),
|
|
13
|
+
requesterSubject: z.string().trim().min(1).max(256),
|
|
14
|
+
requesterUsername: z.string().trim().min(1).max(256).nullable(),
|
|
15
|
+
roleCode: z.string().trim().min(1).max(120),
|
|
16
|
+
roleName: z.string().trim().min(1).max(160),
|
|
17
|
+
scopeType: z.enum(["GLOBAL", "AI_REGISTRY_NAMESPACE"]),
|
|
18
|
+
namespaceId: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).nullable(),
|
|
19
|
+
namespaceKey: z.string().trim().min(1).max(160).nullable(),
|
|
20
|
+
nacosNamespaceId: z.string().trim().min(1).max(256).nullable(),
|
|
21
|
+
namespaceName: z.string().trim().min(1).max(160).nullable(),
|
|
22
|
+
environment: z.string().trim().min(1).max(32).nullable(),
|
|
23
|
+
reason: z.string().trim().min(1).max(2_000),
|
|
24
|
+
state: AccessRequestStateSchema,
|
|
25
|
+
reviewedBy: z.string().trim().min(1).max(256).nullable(),
|
|
26
|
+
reviewedByUsername: z.string().trim().min(1).max(256).nullable(),
|
|
27
|
+
reviewReason: z.string().trim().min(1).max(2_000).nullable(),
|
|
28
|
+
reviewedAt: z.string().datetime({ offset: true }).nullable(),
|
|
29
|
+
grantedAt: z.string().datetime({ offset: true }).nullable(),
|
|
30
|
+
grantErrorCode: z.string().trim().min(1).max(120).nullable(),
|
|
31
|
+
grantErrorSummary: z.string().trim().min(1).max(500).nullable(),
|
|
32
|
+
grantRetryAt: z.string().datetime({ offset: true }).optional(),
|
|
33
|
+
grantRetryable: z.boolean().optional(),
|
|
34
|
+
version: z.number().int().nonnegative(),
|
|
35
|
+
createdAt: z.string().datetime({ offset: true }),
|
|
36
|
+
updatedAt: z.string().datetime({ offset: true })
|
|
37
|
+
}).strict();
|
|
38
|
+
export const AccessRequestListSchema = z.object({
|
|
39
|
+
view: z.enum(["mine", "review"]),
|
|
40
|
+
items: z.array(AccessRequestSchema),
|
|
41
|
+
totalItems: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER),
|
|
42
|
+
page: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),
|
|
43
|
+
pageSize: z.number().int().positive().max(100).optional(),
|
|
44
|
+
totalPages: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),
|
|
45
|
+
nextCursor: z.string().regex(/^[1-9][0-9]*$/u).optional()
|
|
46
|
+
}).strict();
|
|
47
|
+
export const AccessRequestOptionsSchema = z.object({
|
|
48
|
+
roles: z.array(z.object({
|
|
49
|
+
roleCode: z.string().trim().min(1).max(120),
|
|
50
|
+
roleName: z.string().trim().min(1).max(160),
|
|
51
|
+
description: z.string().max(2_000).nullable(),
|
|
52
|
+
scopeType: z.enum(["GLOBAL", "AI_REGISTRY_NAMESPACE"]),
|
|
53
|
+
canReview: z.boolean()
|
|
54
|
+
}).strict()),
|
|
55
|
+
namespaces: z.array(z.object({
|
|
56
|
+
id: z.number().int().positive().max(Number.MAX_SAFE_INTEGER),
|
|
57
|
+
namespaceKey: z.string().trim().min(1).max(160),
|
|
58
|
+
nacosNamespaceId: z.string().trim().min(1).max(256),
|
|
59
|
+
displayName: z.string().trim().min(1).max(160),
|
|
60
|
+
environment: z.string().trim().min(1).max(32)
|
|
61
|
+
}).strict())
|
|
62
|
+
}).strict();
|
|
63
|
+
export const AccessRequestApiErrorSchema = z.object({
|
|
64
|
+
code: z.string().trim().min(1).max(160).optional(),
|
|
65
|
+
message: z.string().optional()
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=access-request-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-request-schemas.js","sourceRoot":"","sources":["../../src/authorization/access-request-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AuthConfig } from "../config.js";
|
|
2
|
+
import { type KeycloakTokenProvider } from "../oauth.js";
|
|
3
|
+
import { type AuthorizationRole, type KeycloakBootstrapRun, type KeycloakBootstrapStart, type RoleProvisionPreview, type RoleProvisionRun } from "./schemas.js";
|
|
4
|
+
export interface AuthorizationClientDependencies {
|
|
5
|
+
fetch?: typeof fetch;
|
|
6
|
+
tokenProvider?: KeycloakTokenProvider;
|
|
7
|
+
}
|
|
8
|
+
export interface CreateAuthorizationRoleInput {
|
|
9
|
+
code: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
status: "ACTIVE";
|
|
13
|
+
}
|
|
14
|
+
export interface ApplyRoleProvisionInput {
|
|
15
|
+
expectedRoleVersion: number;
|
|
16
|
+
expectedRemoteDigest: string;
|
|
17
|
+
idempotencyKey: string;
|
|
18
|
+
}
|
|
19
|
+
export type StartKeycloakBootstrapInput = {
|
|
20
|
+
mode: "PLAN";
|
|
21
|
+
} | {
|
|
22
|
+
mode: "APPLY";
|
|
23
|
+
expectedPlanDigest: string;
|
|
24
|
+
idempotencyKey: string;
|
|
25
|
+
confirmRealm: string;
|
|
26
|
+
};
|
|
27
|
+
export interface AuthorizationApi {
|
|
28
|
+
listRoles(): Promise<AuthorizationRole[]>;
|
|
29
|
+
createRole(input: CreateAuthorizationRoleInput): Promise<AuthorizationRole>;
|
|
30
|
+
previewRole(roleId: number): Promise<RoleProvisionPreview>;
|
|
31
|
+
applyRole(roleId: number, input: ApplyRoleProvisionInput): Promise<RoleProvisionRun>;
|
|
32
|
+
getProvisioningRun(runId: number): Promise<RoleProvisionRun>;
|
|
33
|
+
startKeycloakBootstrap(input: StartKeycloakBootstrapInput): Promise<KeycloakBootstrapStart>;
|
|
34
|
+
getKeycloakBootstrapRun(runId: number): Promise<KeycloakBootstrapRun>;
|
|
35
|
+
}
|
|
36
|
+
export declare class AuthorizationClient implements AuthorizationApi {
|
|
37
|
+
private readonly config;
|
|
38
|
+
private readonly fetchImpl;
|
|
39
|
+
private readonly tokenProvider;
|
|
40
|
+
constructor(config: AuthConfig, dependencies?: AuthorizationClientDependencies);
|
|
41
|
+
private authenticatedFetch;
|
|
42
|
+
private json;
|
|
43
|
+
listRoles(): Promise<AuthorizationRole[]>;
|
|
44
|
+
createRole(input: CreateAuthorizationRoleInput): Promise<AuthorizationRole>;
|
|
45
|
+
previewRole(roleId: number): Promise<RoleProvisionPreview>;
|
|
46
|
+
applyRole(roleId: number, input: ApplyRoleProvisionInput): Promise<RoleProvisionRun>;
|
|
47
|
+
getProvisioningRun(runId: number): Promise<RoleProvisionRun>;
|
|
48
|
+
startKeycloakBootstrap(input: StartKeycloakBootstrapInput): Promise<KeycloakBootstrapStart>;
|
|
49
|
+
getKeycloakBootstrapRun(runId: number): Promise<KeycloakBootstrapRun>;
|
|
50
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { resolveBackendUrl } from "../backend.js";
|
|
2
|
+
import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
|
|
3
|
+
import { AuthorizationError, authorizationHttpErrorCode } from "./errors.js";
|
|
4
|
+
import { AuthorizationApiErrorSchema, AuthorizationRoleListSchema, AuthorizationRoleSchema, KeycloakBootstrapRunSchema, KeycloakBootstrapStartSchema, RoleProvisionPreviewSchema, RoleProvisionRunSchema } from "./schemas.js";
|
|
5
|
+
const AUTHORIZATION_ROOT = "/api/v1/admin/authorization";
|
|
6
|
+
const ROLE_ROOT = `${AUTHORIZATION_ROOT}/roles`;
|
|
7
|
+
const RUN_ROOT = `${AUTHORIZATION_ROOT}/role-provisioning/runs`;
|
|
8
|
+
const BOOTSTRAP_ROOT = `${AUTHORIZATION_ROOT}/bootstrap`;
|
|
9
|
+
async function responseBody(response) {
|
|
10
|
+
const text = await response.text();
|
|
11
|
+
if (!text)
|
|
12
|
+
return {};
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(text);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return text;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function safeRequestId(value) {
|
|
21
|
+
return typeof value === "string"
|
|
22
|
+
&& value.length <= 256
|
|
23
|
+
&& !/[\u0000-\u001f\u007f]/u.test(value)
|
|
24
|
+
? value
|
|
25
|
+
: undefined;
|
|
26
|
+
}
|
|
27
|
+
function requestIdFrom(response, body) {
|
|
28
|
+
if (body && typeof body === "object" && "requestId" in body) {
|
|
29
|
+
const requestId = safeRequestId(body.requestId);
|
|
30
|
+
if (requestId)
|
|
31
|
+
return requestId;
|
|
32
|
+
}
|
|
33
|
+
return safeRequestId(response.headers.get("x-request-id"));
|
|
34
|
+
}
|
|
35
|
+
function apiFailure(response, body) {
|
|
36
|
+
const parsed = AuthorizationApiErrorSchema.safeParse(body);
|
|
37
|
+
const code = authorizationHttpErrorCode(response.status);
|
|
38
|
+
const messages = {
|
|
39
|
+
400: "The authorization management request was invalid.",
|
|
40
|
+
401: "Authorization management requires a valid Numa login.",
|
|
41
|
+
403: "The platform denied this authorization management operation.",
|
|
42
|
+
409: "Authorization role state changed or conflicts with this request.",
|
|
43
|
+
412: "Authorization role version no longer matches the preview.",
|
|
44
|
+
422: "Authorization role provisioning input was rejected by the platform.",
|
|
45
|
+
502: "The platform could not reach or authorize its Keycloak role service."
|
|
46
|
+
};
|
|
47
|
+
return new AuthorizationError(`Authorization API HTTP ${response.status}: ${messages[response.status] ?? "Request failed."}`, code, response.status, requestIdFrom(response, body), parsed.success ? parsed.data.code : undefined, parsed.success ? parsed.data.runId : undefined);
|
|
48
|
+
}
|
|
49
|
+
export class AuthorizationClient {
|
|
50
|
+
config;
|
|
51
|
+
fetchImpl;
|
|
52
|
+
tokenProvider;
|
|
53
|
+
constructor(config, dependencies = {}) {
|
|
54
|
+
this.config = config;
|
|
55
|
+
this.fetchImpl = dependencies.fetch ?? fetch;
|
|
56
|
+
this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
|
|
57
|
+
}
|
|
58
|
+
async authenticatedFetch(path, init = {}) {
|
|
59
|
+
// Every public method supplies a compile-time fixed path rooted under the DevOps
|
|
60
|
+
// authorization API. No caller-controlled absolute URL is accepted here.
|
|
61
|
+
const url = resolveBackendUrl(this.config, { method: "GET", path });
|
|
62
|
+
const headers = new Headers(init.headers);
|
|
63
|
+
headers.set("Accept", "application/json");
|
|
64
|
+
if (init.body != null)
|
|
65
|
+
headers.set("Content-Type", "application/json");
|
|
66
|
+
return fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), { fetch: this.fetchImpl, tokenProvider: this.tokenProvider });
|
|
67
|
+
}
|
|
68
|
+
async json(path, schema, init = {}, expectedStatuses = [200]) {
|
|
69
|
+
const response = await this.authenticatedFetch(path, init);
|
|
70
|
+
const body = await responseBody(response);
|
|
71
|
+
if (!response.ok)
|
|
72
|
+
throw apiFailure(response, body);
|
|
73
|
+
if (!expectedStatuses.includes(response.status)) {
|
|
74
|
+
throw new AuthorizationError(`Authorization API returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "authorization_invalid_response", response.status, requestIdFrom(response, body));
|
|
75
|
+
}
|
|
76
|
+
const parsed = schema.safeParse(body);
|
|
77
|
+
if (!parsed.success) {
|
|
78
|
+
throw new AuthorizationError("Authorization API returned a response that does not match the safe CLI contract.", "authorization_invalid_response", response.status, requestIdFrom(response, body));
|
|
79
|
+
}
|
|
80
|
+
return parsed.data;
|
|
81
|
+
}
|
|
82
|
+
listRoles() {
|
|
83
|
+
return this.json(ROLE_ROOT, AuthorizationRoleListSchema);
|
|
84
|
+
}
|
|
85
|
+
createRole(input) {
|
|
86
|
+
return this.json(ROLE_ROOT, AuthorizationRoleSchema, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
body: JSON.stringify(input)
|
|
89
|
+
}, [201]);
|
|
90
|
+
}
|
|
91
|
+
previewRole(roleId) {
|
|
92
|
+
return this.json(`${ROLE_ROOT}/${roleId}/provisioning/preview`, RoleProvisionPreviewSchema);
|
|
93
|
+
}
|
|
94
|
+
applyRole(roleId, input) {
|
|
95
|
+
return this.json(`${ROLE_ROOT}/${roleId}/provisioning`, RoleProvisionRunSchema, {
|
|
96
|
+
method: "POST",
|
|
97
|
+
body: JSON.stringify(input)
|
|
98
|
+
}, [200, 201]);
|
|
99
|
+
}
|
|
100
|
+
getProvisioningRun(runId) {
|
|
101
|
+
return this.json(`${RUN_ROOT}/${runId}`, RoleProvisionRunSchema);
|
|
102
|
+
}
|
|
103
|
+
startKeycloakBootstrap(input) {
|
|
104
|
+
return this.json(`${BOOTSTRAP_ROOT}/sessions`, KeycloakBootstrapStartSchema, {
|
|
105
|
+
method: "POST",
|
|
106
|
+
body: JSON.stringify(input)
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
getKeycloakBootstrapRun(runId) {
|
|
110
|
+
return this.json(`${BOOTSTRAP_ROOT}/runs/${runId}`, KeycloakBootstrapRunSchema);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/authorization/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type ApplyRoleProvisionInput, type AuthorizationApi, type CreateAuthorizationRoleInput, type StartKeycloakBootstrapInput } from "./client.js";
|
|
3
|
+
import type { KeycloakBootstrapRun, KeycloakBootstrapStart, RoleProvisionPreview, RoleProvisionRun } from "./schemas.js";
|
|
4
|
+
import { type AccessRequestApi } from "./access-request-client.js";
|
|
5
|
+
export interface AuthorizationCommandDependencies {
|
|
6
|
+
clientFactory?: () => AuthorizationApi;
|
|
7
|
+
accessRequestClientFactory?: () => AccessRequestApi;
|
|
8
|
+
openBrowser?: (url: string) => Promise<void>;
|
|
9
|
+
sleep?: (milliseconds: number) => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
interface ProvisionOptions {
|
|
12
|
+
apply?: boolean;
|
|
13
|
+
expectedRemoteDigest?: string;
|
|
14
|
+
idempotencyKey?: string;
|
|
15
|
+
}
|
|
16
|
+
interface BootstrapOptions {
|
|
17
|
+
noOpen?: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface BootstrapApplyOptions extends BootstrapOptions {
|
|
20
|
+
expectedPlanDigest: string;
|
|
21
|
+
idempotencyKey: string;
|
|
22
|
+
confirmRealm: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function stableAuthorizationOutput(value: unknown): unknown;
|
|
25
|
+
export declare function parseAuthorizationRoleId(value: string): number;
|
|
26
|
+
export declare function parseProvisioningRunId(value: string): number;
|
|
27
|
+
export declare function parseBootstrapApplyInput(options: BootstrapApplyOptions): StartKeycloakBootstrapInput;
|
|
28
|
+
export declare function waitForKeycloakBootstrap(client: Pick<AuthorizationApi, "getKeycloakBootstrapRun">, started: KeycloakBootstrapStart, sleep?: (milliseconds: number) => Promise<void>): Promise<KeycloakBootstrapRun>;
|
|
29
|
+
export declare function parseRoleCreateInput(options: {
|
|
30
|
+
code: string;
|
|
31
|
+
name: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
}): CreateAuthorizationRoleInput;
|
|
34
|
+
export declare function parseProvisionOptions(preview: RoleProvisionPreview | undefined, options: ProvisionOptions): ApplyRoleProvisionInput | undefined;
|
|
35
|
+
export declare function provisionAuthorizationRole(client: Pick<AuthorizationApi, "previewRole" | "applyRole">, roleId: number, options: ProvisionOptions): Promise<{
|
|
36
|
+
preview: RoleProvisionPreview;
|
|
37
|
+
run?: RoleProvisionRun;
|
|
38
|
+
}>;
|
|
39
|
+
export declare function registerAuthorizationCommands(program: Command, dependencies?: AuthorizationCommandDependencies): void;
|
|
40
|
+
export {};
|