@numa-tech/numa 1.19.0 → 1.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +57 -3
  2. package/dist/ai-registry/bridge.js +3 -2
  3. package/dist/ai-registry/bridge.js.map +1 -1
  4. package/dist/ai-registry/client.d.ts +8 -1
  5. package/dist/ai-registry/client.js +11 -1
  6. package/dist/ai-registry/client.js.map +1 -1
  7. package/dist/ai-registry/commands.d.ts +3 -0
  8. package/dist/ai-registry/commands.js +48 -36
  9. package/dist/ai-registry/commands.js.map +1 -1
  10. package/dist/ai-registry/mcp-management.d.ts +2 -0
  11. package/dist/ai-registry/mcp-management.js +74 -0
  12. package/dist/ai-registry/mcp-management.js.map +1 -0
  13. package/dist/ai-registry/mcp-runtime-commands.d.ts +15 -0
  14. package/dist/ai-registry/mcp-runtime-commands.js +101 -0
  15. package/dist/ai-registry/mcp-runtime-commands.js.map +1 -0
  16. package/dist/ai-registry/mcp-runtime.d.ts +37 -0
  17. package/dist/ai-registry/mcp-runtime.js +134 -0
  18. package/dist/ai-registry/mcp-runtime.js.map +1 -0
  19. package/dist/ai-registry/mcp-stdio.d.ts +2 -0
  20. package/dist/ai-registry/mcp-stdio.js +18 -0
  21. package/dist/ai-registry/mcp-stdio.js.map +1 -0
  22. package/dist/authorization/application-client.d.ts +1271 -0
  23. package/dist/authorization/application-client.js +391 -0
  24. package/dist/authorization/application-client.js.map +1 -0
  25. package/dist/authorization/application-commands.d.ts +15 -0
  26. package/dist/authorization/application-commands.js +240 -0
  27. package/dist/authorization/application-commands.js.map +1 -0
  28. package/dist/authorization/application-schemas.d.ts +731 -0
  29. package/dist/authorization/application-schemas.js +521 -0
  30. package/dist/authorization/application-schemas.js.map +1 -0
  31. package/dist/authorization/{client.d.ts → bootstrap-client.d.ts} +5 -26
  32. package/dist/authorization/{client.js → bootstrap-client.js} +4 -27
  33. package/dist/authorization/bootstrap-client.js.map +1 -0
  34. package/dist/authorization/commands.d.ts +6 -21
  35. package/dist/authorization/commands.js +8 -130
  36. package/dist/authorization/commands.js.map +1 -1
  37. package/dist/authorization/enrollment-client.d.ts +40 -0
  38. package/dist/authorization/enrollment-client.js +56 -0
  39. package/dist/authorization/enrollment-client.js.map +1 -0
  40. package/dist/authorization/enrollment-commands.d.ts +5 -0
  41. package/dist/authorization/enrollment-commands.js +30 -0
  42. package/dist/authorization/enrollment-commands.js.map +1 -0
  43. package/dist/authorization/enrollment.d.ts +2 -2
  44. package/dist/authorization/enrollment.js +2 -2
  45. package/dist/authorization/enrollment.js.map +1 -1
  46. package/dist/authorization/schemas.d.ts +0 -90
  47. package/dist/authorization/schemas.js +0 -48
  48. package/dist/authorization/schemas.js.map +1 -1
  49. package/dist/backend.d.ts +1 -0
  50. package/dist/backend.js +4 -1
  51. package/dist/backend.js.map +1 -1
  52. package/dist/business-issuer.d.ts +4 -0
  53. package/dist/business-issuer.js +30 -0
  54. package/dist/business-issuer.js.map +1 -0
  55. package/dist/cli.js +61 -30
  56. package/dist/cli.js.map +1 -1
  57. package/dist/cloud/bootstrap.js +1 -1
  58. package/dist/cloud/bootstrap.js.map +1 -1
  59. package/dist/command-catalog.js +11 -36
  60. package/dist/command-catalog.js.map +1 -1
  61. package/dist/config.d.ts +1 -1
  62. package/dist/config.js +15 -6
  63. package/dist/config.js.map +1 -1
  64. package/dist/login-configuration.d.ts +8 -0
  65. package/dist/login-configuration.js +17 -0
  66. package/dist/login-configuration.js.map +1 -0
  67. package/dist/login-recovery.d.ts +2 -0
  68. package/dist/login-recovery.js +15 -0
  69. package/dist/login-recovery.js.map +1 -0
  70. package/dist/mcp/commands.js +12 -2
  71. package/dist/mcp/commands.js.map +1 -1
  72. package/dist/mcp-gateway/commands.d.ts +2 -0
  73. package/dist/mcp-gateway/commands.js +11 -0
  74. package/dist/mcp-gateway/commands.js.map +1 -1
  75. package/dist/oss/commands.d.ts +2 -1
  76. package/dist/oss/commands.js +55 -37
  77. package/dist/oss/commands.js.map +1 -1
  78. package/dist/oss/file-operations.d.ts +57 -0
  79. package/dist/oss/file-operations.js +269 -0
  80. package/dist/oss/file-operations.js.map +1 -0
  81. package/dist/oss/local-picker.d.ts +2 -0
  82. package/dist/oss/local-picker.js +6 -0
  83. package/dist/oss/local-picker.js.map +1 -1
  84. package/dist/oss/tools.js +1 -1
  85. package/dist/oss/tools.js.map +1 -1
  86. package/dist/oss/transfer-queue.js +1 -1
  87. package/dist/oss/transfer-queue.js.map +1 -1
  88. package/dist/oss/transfers.d.ts +7 -0
  89. package/dist/oss/transfers.js +87 -0
  90. package/dist/oss/transfers.js.map +1 -1
  91. package/dist/oss/web-page.js +365 -30
  92. package/dist/oss/web-page.js.map +1 -1
  93. package/dist/oss/web-service.d.ts +45 -0
  94. package/dist/oss/web-service.js +107 -0
  95. package/dist/oss/web-service.js.map +1 -0
  96. package/dist/oss/web.d.ts +10 -0
  97. package/dist/oss/web.js +117 -15
  98. package/dist/oss/web.js.map +1 -1
  99. package/dist/platform-profile.d.ts +22 -2
  100. package/dist/platform-profile.js +67 -6
  101. package/dist/platform-profile.js.map +1 -1
  102. package/docs/application-default-groups.md +73 -0
  103. package/examples/cloud-bootstrap/README.md +1 -1
  104. package/examples/mcp/README.md +108 -0
  105. package/examples/mcp/management-smoke.py +154 -0
  106. package/examples/mcp/runtime-smoke.mjs +187 -0
  107. package/examples/mcp/server.json +17 -0
  108. package/examples/oss/README.md +78 -0
  109. package/examples/oss/__pycache__/roundtrip.cpython-314.pyc +0 -0
  110. package/examples/oss/__pycache__/test_roundtrip.cpython-314.pyc +0 -0
  111. package/examples/oss/roundtrip.py +84 -0
  112. package/examples/oss/test_roundtrip.py +66 -0
  113. package/package.json +6 -5
  114. package/dist/authorization/client.js.map +0 -1
  115. package/dist/authorization/group-client.d.ts +0 -169
  116. package/dist/authorization/group-client.js +0 -129
  117. package/dist/authorization/group-client.js.map +0 -1
  118. package/dist/authorization/group-commands.d.ts +0 -25
  119. package/dist/authorization/group-commands.js +0 -155
  120. package/dist/authorization/group-commands.js.map +0 -1
@@ -1,169 +0,0 @@
1
- import { z } from "zod";
2
- import type { AuthConfig } from "../config.js";
3
- import { type KeycloakTokenProvider } from "../oauth.js";
4
- export declare const EnrollmentSchema: z.ZodObject<{
5
- membershipStatus: z.ZodEnum<{
6
- ACTIVE: "ACTIVE";
7
- NOT_ENROLLED: "NOT_ENROLLED";
8
- REVOKED: "REVOKED";
9
- SUSPENDED: "SUSPENDED";
10
- }>;
11
- syncStatus: z.ZodEnum<{
12
- APPLIED: "APPLIED";
13
- DISABLED: "DISABLED";
14
- FAILED: "FAILED";
15
- PENDING: "PENDING";
16
- UNKNOWN: "UNKNOWN";
17
- }>;
18
- tokenRefreshRequired: z.ZodBoolean;
19
- policyRevision: z.ZodNumber;
20
- blocked: z.ZodOptional<z.ZodBoolean>;
21
- policyEnabled: z.ZodOptional<z.ZodBoolean>;
22
- clientId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
- groupId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
24
- blockReason: z.ZodOptional<z.ZodNullable<z.ZodString>>;
25
- expectedClientRoles: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
26
- }, z.core.$strip>;
27
- export type Enrollment = z.infer<typeof EnrollmentSchema>;
28
- /** @deprecated Historical suggestions only; never an enrollment or authorization allowlist. */
29
- export declare const BASELINE_ROLES: readonly ["mci-devops-platform-notion-user", "mci-devops-platform-ai-registry-reader", "mci-devops-platform-oss-user"];
30
- export declare const GroupPlanInputSchema: z.ZodObject<{
31
- operation: z.ZodEnum<{
32
- ADD_MEMBER: "ADD_MEMBER";
33
- CREATE_GROUP: "CREATE_GROUP";
34
- DEACTIVATE_GROUP: "DEACTIVATE_GROUP";
35
- FILL_MISSING: "FILL_MISSING";
36
- LINK_GROUP: "LINK_GROUP";
37
- MIGRATE_POLICY: "MIGRATE_POLICY";
38
- REMOVE_MEMBER: "REMOVE_MEMBER";
39
- RESTORE_MEMBER: "RESTORE_MEMBER";
40
- SET_GROUP_ROLES: "SET_GROUP_ROLES";
41
- SET_MEMBER_STATE: "SET_MEMBER_STATE";
42
- SET_POLICY: "SET_POLICY";
43
- }>;
44
- name: z.ZodOptional<z.ZodString>;
45
- groupId: z.ZodOptional<z.ZodString>;
46
- keycloakGroupId: z.ZodOptional<z.ZodString>;
47
- subject: z.ZodOptional<z.ZodString>;
48
- state: z.ZodOptional<z.ZodEnum<{
49
- ACTIVE: "ACTIVE";
50
- REVOKED: "REVOKED";
51
- SUSPENDED: "SUSPENDED";
52
- }>>;
53
- enabled: z.ZodOptional<z.ZodBoolean>;
54
- roles: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
- }, z.core.$strict>;
56
- export type GroupPlanInput = z.infer<typeof GroupPlanInputSchema>;
57
- declare const GroupPlanSchema: z.ZodObject<{
58
- planId: z.ZodString;
59
- digest: z.ZodString;
60
- status: z.ZodString;
61
- operation: z.ZodString;
62
- policyRevision: z.ZodNumber;
63
- items: z.ZodArray<z.ZodObject<{
64
- action: z.ZodString;
65
- status: z.ZodString;
66
- }, z.core.$loose>>;
67
- summary: z.ZodUnknown;
68
- input: z.ZodUnknown;
69
- totalItems: z.ZodNumber;
70
- businessImpact: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
71
- }, z.core.$strip>;
72
- export type GroupPlan = z.infer<typeof GroupPlanSchema>;
73
- declare const GroupListSchema: z.ZodObject<{
74
- groups: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
75
- total: z.ZodNumber;
76
- page: z.ZodNumber;
77
- limit: z.ZodNumber;
78
- policy: z.ZodObject<{
79
- revision: z.ZodNumber;
80
- enabled: z.ZodBoolean;
81
- groupId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
82
- }, z.core.$loose>;
83
- baselineRoles: z.ZodArray<z.ZodString>;
84
- readiness: z.ZodOptional<z.ZodObject<{
85
- status: z.ZodString;
86
- writesVerified: z.ZodBoolean;
87
- message: z.ZodString;
88
- }, z.core.$strip>>;
89
- }, z.core.$strip>;
90
- declare const MemberListSchema: z.ZodObject<{
91
- members: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
92
- total: z.ZodNumber;
93
- page: z.ZodNumber;
94
- limit: z.ZodNumber;
95
- }, z.core.$strip>;
96
- export type GroupList = z.infer<typeof GroupListSchema>;
97
- export type MemberList = z.infer<typeof MemberListSchema>;
98
- declare const PlanItemListSchema: z.ZodObject<{
99
- items: z.ZodArray<z.ZodObject<{
100
- action: z.ZodString;
101
- status: z.ZodString;
102
- }, z.core.$loose>>;
103
- total: z.ZodNumber;
104
- page: z.ZodNumber;
105
- limit: z.ZodNumber;
106
- }, z.core.$strip>;
107
- declare const DirectoryUsersSchema: z.ZodObject<{
108
- users: z.ZodArray<z.ZodObject<{
109
- subject: z.ZodString;
110
- username: z.ZodString;
111
- email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
112
- }, z.core.$strip>>;
113
- page: z.ZodNumber;
114
- limit: z.ZodNumber;
115
- }, z.core.$loose>;
116
- declare const DirectoryGroupsSchema: z.ZodObject<{
117
- groups: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
118
- total: z.ZodNumber;
119
- page: z.ZodNumber;
120
- limit: z.ZodNumber;
121
- }, z.core.$strip>;
122
- export type PlanItemList = z.infer<typeof PlanItemListSchema>;
123
- export type DirectoryUsers = z.infer<typeof DirectoryUsersSchema>;
124
- export type DirectoryGroups = z.infer<typeof DirectoryGroupsSchema>;
125
- export declare const ImpactKindSchema: z.ZodEnum<{
126
- notionRoleGrants: "notionRoleGrants";
127
- ossExistingGrants: "ossExistingGrants";
128
- readerNamespaces: "readerNamespaces";
129
- }>;
130
- export type ImpactKind = z.infer<typeof ImpactKindSchema>;
131
- declare const ImpactListSchema: z.ZodObject<{
132
- items: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
133
- total: z.ZodNumber;
134
- page: z.ZodNumber;
135
- limit: z.ZodNumber;
136
- }, z.core.$strip>;
137
- export type ImpactList = z.infer<typeof ImpactListSchema>;
138
- export interface GroupApi {
139
- enrollment(initialize?: boolean): Promise<Enrollment>;
140
- list(page?: number, limit?: number): Promise<GroupList>;
141
- members(query?: string, page?: number, limit?: number, groupId?: string): Promise<MemberList>;
142
- users(query: string, page?: number, limit?: number): Promise<DirectoryUsers>;
143
- directoryGroups(query?: string, page?: number, limit?: number): Promise<DirectoryGroups>;
144
- plan(input: GroupPlanInput): Promise<GroupPlan>;
145
- getPlan(id: string): Promise<GroupPlan>;
146
- planItems(id: string, page?: number, limit?: number): Promise<PlanItemList>;
147
- impact(id: string, kind: ImpactKind, page?: number, limit?: number): Promise<ImpactList>;
148
- apply(id: string, expectedDigest: string, idempotencyKey: string): Promise<GroupPlan>;
149
- }
150
- export declare class GroupClient implements GroupApi {
151
- private readonly config;
152
- private readonly dependencies;
153
- constructor(config: AuthConfig, dependencies?: {
154
- fetch?: typeof fetch;
155
- tokenProvider?: KeycloakTokenProvider;
156
- });
157
- enrollment(initialize?: boolean): Promise<Enrollment>;
158
- list(page?: number, limit?: number): Promise<GroupList>;
159
- members(query?: string, page?: number, limit?: number, groupId?: string): Promise<MemberList>;
160
- users(query: string, page?: number, limit?: number): Promise<DirectoryUsers>;
161
- directoryGroups(query?: string, page?: number, limit?: number): Promise<DirectoryGroups>;
162
- plan(input: GroupPlanInput): Promise<GroupPlan>;
163
- getPlan(id: string): Promise<GroupPlan>;
164
- planItems(id: string, page?: number, limit?: number): Promise<PlanItemList>;
165
- impact(id: string, kind: ImpactKind, page?: number, limit?: number): Promise<ImpactList>;
166
- apply(id: string, expectedDigest: string, idempotencyKey: string): Promise<GroupPlan>;
167
- private json;
168
- }
169
- export {};
@@ -1,129 +0,0 @@
1
- import { z } from "zod";
2
- import { resolveBackendUrl } from "../backend.js";
3
- import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
4
- import { AuthorizationError, authorizationHttpErrorCode } from "./errors.js";
5
- const ROOT = "/api/v1/admin/authorization/groups";
6
- export const EnrollmentSchema = z.object({
7
- membershipStatus: z.enum(["NOT_ENROLLED", "ACTIVE", "SUSPENDED", "REVOKED"]),
8
- syncStatus: z.enum(["DISABLED", "PENDING", "APPLIED", "FAILED", "UNKNOWN"]),
9
- tokenRefreshRequired: z.boolean(), policyRevision: z.number().int().nonnegative(),
10
- blocked: z.boolean().optional(), policyEnabled: z.boolean().optional(), clientId: z.string().nullable().optional(),
11
- groupId: z.string().nullable().optional(), blockReason: z.string().nullable().optional(),
12
- expectedClientRoles: z.record(z.string(), z.array(z.string())).optional()
13
- });
14
- /** @deprecated Historical suggestions only; never an enrollment or authorization allowlist. */
15
- export const BASELINE_ROLES = [
16
- "mci-devops-platform-notion-user",
17
- "mci-devops-platform-ai-registry-reader",
18
- "mci-devops-platform-oss-user"
19
- ];
20
- export const GroupPlanInputSchema = z.object({
21
- operation: z.enum(["CREATE_GROUP", "LINK_GROUP", "SET_GROUP_ROLES", "SET_POLICY", "ADD_MEMBER", "REMOVE_MEMBER", "RESTORE_MEMBER", "DEACTIVATE_GROUP", "SET_MEMBER_STATE", "FILL_MISSING", "MIGRATE_POLICY"]),
22
- name: z.string().trim().min(1).max(160).optional(),
23
- groupId: z.string().uuid().optional(),
24
- keycloakGroupId: z.string().uuid().optional(),
25
- subject: z.string().min(1).max(200).optional(),
26
- state: z.enum(["ACTIVE", "SUSPENDED", "REVOKED"]).optional(),
27
- enabled: z.boolean().optional(),
28
- roles: z.array(z.string().min(1).max(416).refine(value => {
29
- const parts = value.split("/");
30
- const client = parts.length === 1 ? "mci-devops-platform" : parts[0];
31
- const role = parts.at(-1);
32
- return parts.length <= 2 && /^[A-Za-z0-9][A-Za-z0-9_.-]{0,159}$/u.test(client)
33
- && !["realm-management", "account", "account-console", "security-admin-console", "admin-cli", "broker", "web-client", "mcp-client"].includes(client)
34
- && !client.endsWith("-realm") && Boolean(role.trim()) && role.length <= 255 && !/[\u0000-\u001f\u007f]/u.test(role);
35
- })).max(200).optional()
36
- }).strict();
37
- const GroupPlanSchema = z.object({
38
- planId: z.string().uuid(),
39
- digest: z.string().min(1), status: z.string().min(1), operation: z.string(),
40
- policyRevision: z.number().int().nonnegative(),
41
- items: z.array(z.object({ action: z.string(), status: z.string() }).passthrough()),
42
- summary: z.unknown(), input: z.unknown(), totalItems: z.number().int().nonnegative(),
43
- businessImpact: z.record(z.string(), z.unknown()).optional()
44
- });
45
- const GroupListSchema = z.object({
46
- groups: z.array(z.record(z.string(), z.unknown())), total: z.number().int().nonnegative(),
47
- page: z.number().int(), limit: z.number().int(),
48
- policy: z.object({ revision: z.number().int(), enabled: z.boolean(), groupId: z.string().uuid().nullable().optional() }).passthrough(),
49
- baselineRoles: z.array(z.string()),
50
- readiness: z.object({ status: z.string(), writesVerified: z.boolean(), message: z.string() }).optional()
51
- });
52
- const MemberListSchema = z.object({
53
- members: z.array(z.record(z.string(), z.unknown())), total: z.number().int().nonnegative(),
54
- page: z.number().int(), limit: z.number().int()
55
- });
56
- const PlanItemListSchema = z.object({ items: z.array(z.object({ action: z.string(), status: z.string() }).passthrough()), total: z.number().int(), page: z.number().int(), limit: z.number().int() });
57
- const DirectoryUsersSchema = z.object({ users: z.array(z.object({ subject: z.string(), username: z.string(), email: z.string().nullable().optional() })), page: z.number().int(), limit: z.number().int() }).passthrough();
58
- const DirectoryGroupsSchema = z.object({ groups: z.array(z.record(z.string(), z.unknown())), total: z.number().int(), page: z.number().int(), limit: z.number().int() });
59
- export const ImpactKindSchema = z.enum(["notionRoleGrants", "readerNamespaces", "ossExistingGrants"]);
60
- const ImpactListSchema = z.object({ items: z.array(z.record(z.string(), z.unknown())), total: z.number().int(), page: z.number().int(), limit: z.number().int() });
61
- export class GroupClient {
62
- config;
63
- dependencies;
64
- constructor(config, dependencies = {}) {
65
- this.config = config;
66
- this.dependencies = dependencies;
67
- }
68
- enrollment(initialize = false) {
69
- if (this.config.authenticationMode === "client_credentials") {
70
- throw new AuthorizationError("Application enrollment is for human user sessions, not machine identities.", "authorization_input_invalid");
71
- }
72
- return this.json("/api/v1/me/enrollment", EnrollmentSchema, initialize ? {} : undefined);
73
- }
74
- list(page = 1, limit = 20) {
75
- return this.json(`${ROOT}?${new URLSearchParams({ page: String(page), limit: String(limit) })}`, GroupListSchema);
76
- }
77
- members(query = "", page = 1, limit = 20, groupId) {
78
- return this.json(`${ROOT}/members?${new URLSearchParams({ query, page: String(page), limit: String(limit), ...(groupId ? { groupId } : {}) })}`, MemberListSchema);
79
- }
80
- users(query, page = 1, limit = 20) {
81
- return this.json(`${ROOT}/directory/users?${new URLSearchParams({ query, page: String(page), limit: String(limit) })}`, DirectoryUsersSchema);
82
- }
83
- directoryGroups(query = "", page = 1, limit = 20) {
84
- return this.json(`${ROOT}/directory/groups?${new URLSearchParams({ query, page: String(page), limit: String(limit) })}`, DirectoryGroupsSchema);
85
- }
86
- plan(input) {
87
- const parsed = GroupPlanInputSchema.safeParse(input);
88
- if (!parsed.success)
89
- throw new AuthorizationError("Group plan input is invalid; use registered application Client Role references.", "authorization_input_invalid");
90
- return this.json(`${ROOT}/plans`, GroupPlanSchema, parsed.data);
91
- }
92
- getPlan(id) {
93
- return this.json(`${ROOT}/plans/${segment(id)}`, GroupPlanSchema);
94
- }
95
- planItems(id, page = 1, limit = 20) {
96
- return this.json(`${ROOT}/plans/${segment(id)}/items?${new URLSearchParams({ page: String(page), limit: String(limit) })}`, PlanItemListSchema);
97
- }
98
- impact(id, kind, page = 1, limit = 20) {
99
- if (!ImpactKindSchema.safeParse(kind).success)
100
- throw new AuthorizationError("Unsupported business impact kind.", "authorization_input_invalid");
101
- return this.json(`${ROOT}/plans/${segment(id)}/impact?${new URLSearchParams({ kind, page: String(page), limit: String(limit) })}`, ImpactListSchema);
102
- }
103
- apply(id, expectedDigest, idempotencyKey) {
104
- return this.json(`${ROOT}/plans/${segment(id)}/apply`, GroupPlanSchema, { expectedDigest, idempotencyKey });
105
- }
106
- async json(path, schema, body) {
107
- const method = body === undefined ? "GET" : "POST";
108
- const response = await fetchWithKeycloakIdentity(this.config, resolveBackendUrl(this.config, { path, method }), () => ({
109
- method, redirect: "error", signal: AbortSignal.timeout(20_000),
110
- headers: { Accept: "application/json", ...(body === undefined ? {} : { "Content-Type": "application/json" }) },
111
- ...(body === undefined ? {} : { body: JSON.stringify(body) })
112
- }), { fetch: this.dependencies.fetch ?? fetch, tokenProvider: this.dependencies.tokenProvider ?? ensureAccessToken, retryUnauthorized: method === "GET" });
113
- if (!response.ok) {
114
- // Never echo credential-bearing upstream errors or HTML. After write timeouts,
115
- // operators must inspect the same plan instead of submitting a new operation.
116
- throw new AuthorizationError(`Application group API returned HTTP ${response.status}. Inspect the same plan before retrying a write.`, authorizationHttpErrorCode(response.status), response.status);
117
- }
118
- const parsed = schema.safeParse(await response.json().catch(() => undefined));
119
- if (!parsed.success)
120
- throw new AuthorizationError("Application group API response does not match the CLI contract.", "authorization_invalid_response");
121
- return parsed.data;
122
- }
123
- }
124
- function segment(value) {
125
- if (!/^[A-Za-z0-9_-]{1,200}$/u.test(value))
126
- throw new AuthorizationError("Invalid group plan ID.", "authorization_input_invalid");
127
- return encodeURIComponent(value);
128
- }
129
- //# sourceMappingURL=group-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"group-client.js","sourceRoot":"","sources":["../../src/authorization/group-client.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import type { Command } from "commander";
2
- import { type GroupApi, type GroupPlanInput } from "./group-client.js";
3
- interface Dependencies {
4
- clientFactory?: () => GroupApi;
5
- }
6
- type PageOptions = {
7
- page: string;
8
- limit: string;
9
- };
10
- type ApplyOptions = {
11
- expectedDigest: string;
12
- idempotencyKey: string;
13
- yes?: boolean;
14
- };
15
- export declare function registerGroupCommands(authorization: Command, dependencies?: Dependencies): void;
16
- export declare function parseGroupPlanInput(value: unknown): GroupPlanInput;
17
- export declare function parseGroupApplyInput(options: ApplyOptions): {
18
- expectedDigest: string;
19
- idempotencyKey: string;
20
- };
21
- export declare function parseGroupPagination(options: PageOptions): {
22
- page: number;
23
- limit: number;
24
- };
25
- export {};
@@ -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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"}