@numa-tech/numa 1.12.10 → 1.12.11
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 +13 -12
- 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/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 +30 -8
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.js +136 -26
- package/dist/command-catalog.js.map +1 -1
- 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,93 @@
|
|
|
1
|
+
import { resolveBackendUrl } from "../backend.js";
|
|
2
|
+
import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
|
|
3
|
+
import { AuthorizationError, authorizationHttpErrorCode } from "./errors.js";
|
|
4
|
+
import { AccessRequestApiErrorSchema, AccessRequestListSchema, AccessRequestOptionsSchema, AccessRequestSchema } from "./access-request-schemas.js";
|
|
5
|
+
const ACCESS_REQUEST_ROOT = "/api/v1/me/access-requests";
|
|
6
|
+
export class AccessRequestClient {
|
|
7
|
+
config;
|
|
8
|
+
fetchImpl;
|
|
9
|
+
tokenProvider;
|
|
10
|
+
constructor(config, dependencies = {}) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.fetchImpl = dependencies.fetch ?? fetch;
|
|
13
|
+
this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
|
|
14
|
+
}
|
|
15
|
+
options() {
|
|
16
|
+
return this.json(`${ACCESS_REQUEST_ROOT}/options`, AccessRequestOptionsSchema);
|
|
17
|
+
}
|
|
18
|
+
create(input) {
|
|
19
|
+
const { idempotencyKey, ...body } = input;
|
|
20
|
+
return this.json(ACCESS_REQUEST_ROOT, AccessRequestSchema, {
|
|
21
|
+
method: "POST",
|
|
22
|
+
headers: { "Idempotency-Key": idempotencyKey },
|
|
23
|
+
body: JSON.stringify(body)
|
|
24
|
+
}, [201]);
|
|
25
|
+
}
|
|
26
|
+
list(input) {
|
|
27
|
+
const query = new URLSearchParams({ view: input.view });
|
|
28
|
+
if (input.state)
|
|
29
|
+
query.set("state", input.state);
|
|
30
|
+
if (input.cursor)
|
|
31
|
+
query.set("cursor", input.cursor);
|
|
32
|
+
if (input.limit != null)
|
|
33
|
+
query.set("limit", String(input.limit));
|
|
34
|
+
return this.json(`${ACCESS_REQUEST_ROOT}?${query}`, AccessRequestListSchema);
|
|
35
|
+
}
|
|
36
|
+
get(requestId) {
|
|
37
|
+
return this.json(`${ACCESS_REQUEST_ROOT}/${encodeURIComponent(requestId)}`, AccessRequestSchema);
|
|
38
|
+
}
|
|
39
|
+
cancel(requestId, version) {
|
|
40
|
+
return this.json(`${ACCESS_REQUEST_ROOT}/${encodeURIComponent(requestId)}/cancel`, AccessRequestSchema, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
body: JSON.stringify({ version })
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
review(requestId, input) {
|
|
46
|
+
return this.json(`${ACCESS_REQUEST_ROOT}/${encodeURIComponent(requestId)}/review`, AccessRequestSchema, {
|
|
47
|
+
method: "POST",
|
|
48
|
+
body: JSON.stringify(input)
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async json(path, schema, init = {}, expectedStatuses = [200]) {
|
|
52
|
+
const url = resolveBackendUrl(this.config, { method: "GET", path });
|
|
53
|
+
const headers = new Headers(init.headers);
|
|
54
|
+
headers.set("Accept", "application/json");
|
|
55
|
+
if (init.body != null)
|
|
56
|
+
headers.set("Content-Type", "application/json");
|
|
57
|
+
const response = await fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), { fetch: this.fetchImpl, tokenProvider: this.tokenProvider });
|
|
58
|
+
const body = await responseBody(response);
|
|
59
|
+
if (!response.ok)
|
|
60
|
+
throw apiFailure(response, body);
|
|
61
|
+
if (!expectedStatuses.includes(response.status)) {
|
|
62
|
+
throw new AuthorizationError(`Access request API returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "authorization_invalid_response", response.status);
|
|
63
|
+
}
|
|
64
|
+
const parsed = schema.safeParse(body);
|
|
65
|
+
if (!parsed.success) {
|
|
66
|
+
throw new AuthorizationError("Access request API returned a response that does not match the safe CLI contract.", "authorization_invalid_response", response.status);
|
|
67
|
+
}
|
|
68
|
+
return parsed.data;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function responseBody(response) {
|
|
72
|
+
const text = await response.text();
|
|
73
|
+
if (!text)
|
|
74
|
+
return {};
|
|
75
|
+
try {
|
|
76
|
+
return JSON.parse(text);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return text;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function apiFailure(response, body) {
|
|
83
|
+
const parsed = AccessRequestApiErrorSchema.safeParse(body);
|
|
84
|
+
const messages = {
|
|
85
|
+
400: "The access request input was invalid.",
|
|
86
|
+
401: "Access requests require a valid Numa login.",
|
|
87
|
+
403: "The platform denied this access request operation.",
|
|
88
|
+
404: "The access request was not found.",
|
|
89
|
+
409: "The access request changed or conflicts with this operation."
|
|
90
|
+
};
|
|
91
|
+
return new AuthorizationError(`Access request API HTTP ${response.status}: ${messages[response.status] ?? "Request failed."}`, authorizationHttpErrorCode(response.status), response.status, undefined, parsed.success ? parsed.data.code : undefined);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=access-request-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-request-client.js","sourceRoot":"","sources":["../../src/authorization/access-request-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { AccessRequestApi, CreateAccessRequestInput, ListAccessRequestsInput, ReviewAccessRequestInput } from "./access-request-client.js";
|
|
3
|
+
export interface AccessRequestCommandDependencies {
|
|
4
|
+
clientFactory: () => AccessRequestApi;
|
|
5
|
+
}
|
|
6
|
+
export declare function registerAccessRequestCommands(authorization: Command, dependencies: AccessRequestCommandDependencies): void;
|
|
7
|
+
export declare function parseCreateAccessRequestInput(options: {
|
|
8
|
+
role: string;
|
|
9
|
+
reason: string;
|
|
10
|
+
idempotencyKey: string;
|
|
11
|
+
namespaceId?: string;
|
|
12
|
+
}): CreateAccessRequestInput;
|
|
13
|
+
export declare function parseListAccessRequestsInput(options: {
|
|
14
|
+
view: string;
|
|
15
|
+
state?: string;
|
|
16
|
+
cursor?: string;
|
|
17
|
+
limit: string;
|
|
18
|
+
}): ListAccessRequestsInput;
|
|
19
|
+
export declare function parseReviewAccessRequestInput(options: {
|
|
20
|
+
decision: string;
|
|
21
|
+
reason: string;
|
|
22
|
+
version: string;
|
|
23
|
+
}): ReviewAccessRequestInput;
|
|
24
|
+
export declare function parseAccessRequestId(value: string): string;
|
|
25
|
+
export declare function parseVersion(value: string): number;
|
|
@@ -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
|
+
}
|