@inf-monkeys-tech/monkeys-cli 0.12.13 → 0.12.14

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 (106) hide show
  1. package/README.md +10 -0
  2. package/README.zh.md +10 -0
  3. package/dist/command/metadata.d.ts.map +1 -1
  4. package/dist/command/metadata.js +13 -0
  5. package/dist/command/metadata.js.map +1 -1
  6. package/dist/commands/group/create.d.ts +21 -0
  7. package/dist/commands/group/create.d.ts.map +1 -0
  8. package/dist/commands/group/create.js +31 -0
  9. package/dist/commands/group/create.js.map +1 -0
  10. package/dist/commands/group/delete.d.ts +22 -0
  11. package/dist/commands/group/delete.d.ts.map +1 -0
  12. package/dist/commands/group/delete.js +30 -0
  13. package/dist/commands/group/delete.js.map +1 -0
  14. package/dist/commands/group/get.d.ts +14 -0
  15. package/dist/commands/group/get.d.ts.map +1 -0
  16. package/dist/commands/group/get.js +20 -0
  17. package/dist/commands/group/get.js.map +1 -0
  18. package/dist/commands/group/list.d.ts +16 -0
  19. package/dist/commands/group/list.d.ts.map +1 -0
  20. package/dist/commands/group/list.js +18 -0
  21. package/dist/commands/group/list.js.map +1 -0
  22. package/dist/commands/group/member/add.d.ts +26 -0
  23. package/dist/commands/group/member/add.d.ts.map +1 -0
  24. package/dist/commands/group/member/add.js +29 -0
  25. package/dist/commands/group/member/add.js.map +1 -0
  26. package/dist/commands/group/member/list.d.ts +20 -0
  27. package/dist/commands/group/member/list.d.ts.map +1 -0
  28. package/dist/commands/group/member/list.js +21 -0
  29. package/dist/commands/group/member/list.js.map +1 -0
  30. package/dist/commands/group/member/remove.d.ts +27 -0
  31. package/dist/commands/group/member/remove.d.ts.map +1 -0
  32. package/dist/commands/group/member/remove.js +33 -0
  33. package/dist/commands/group/member/remove.js.map +1 -0
  34. package/dist/commands/group/permission/list.d.ts +19 -0
  35. package/dist/commands/group/permission/list.d.ts.map +1 -0
  36. package/dist/commands/group/permission/list.js +28 -0
  37. package/dist/commands/group/permission/list.js.map +1 -0
  38. package/dist/commands/group/permission/set.d.ts +24 -0
  39. package/dist/commands/group/permission/set.d.ts.map +1 -0
  40. package/dist/commands/group/permission/set.js +33 -0
  41. package/dist/commands/group/permission/set.js.map +1 -0
  42. package/dist/commands/group/update.d.ts +24 -0
  43. package/dist/commands/group/update.d.ts.map +1 -0
  44. package/dist/commands/group/update.js +33 -0
  45. package/dist/commands/group/update.js.map +1 -0
  46. package/dist/commands/permission/list.d.ts +16 -0
  47. package/dist/commands/permission/list.d.ts.map +1 -0
  48. package/dist/commands/permission/list.js +18 -0
  49. package/dist/commands/permission/list.js.map +1 -0
  50. package/dist/commands/user/get.d.ts +14 -0
  51. package/dist/commands/user/get.d.ts.map +1 -0
  52. package/dist/commands/user/get.js +20 -0
  53. package/dist/commands/user/get.js.map +1 -0
  54. package/dist/commands/user/group/add.d.ts +26 -0
  55. package/dist/commands/user/group/add.d.ts.map +1 -0
  56. package/dist/commands/user/group/add.js +29 -0
  57. package/dist/commands/user/group/add.js.map +1 -0
  58. package/dist/commands/user/group/list.d.ts +19 -0
  59. package/dist/commands/user/group/list.d.ts.map +1 -0
  60. package/dist/commands/user/group/list.js +38 -0
  61. package/dist/commands/user/group/list.js.map +1 -0
  62. package/dist/commands/user/group/remove.d.ts +26 -0
  63. package/dist/commands/user/group/remove.d.ts.map +1 -0
  64. package/dist/commands/user/group/remove.js +29 -0
  65. package/dist/commands/user/group/remove.js.map +1 -0
  66. package/dist/commands/user/list.d.ts +18 -0
  67. package/dist/commands/user/list.d.ts.map +1 -0
  68. package/dist/commands/user/list.js +27 -0
  69. package/dist/commands/user/list.js.map +1 -0
  70. package/dist/identity-governance/client.d.ts +217 -0
  71. package/dist/identity-governance/client.d.ts.map +1 -0
  72. package/dist/identity-governance/client.js +185 -0
  73. package/dist/identity-governance/client.js.map +1 -0
  74. package/dist/identity-governance/contracts.d.ts +142 -0
  75. package/dist/identity-governance/contracts.d.ts.map +1 -0
  76. package/dist/identity-governance/contracts.js +109 -0
  77. package/dist/identity-governance/contracts.js.map +1 -0
  78. package/dist/identity-governance/definitions.d.ts +54 -0
  79. package/dist/identity-governance/definitions.d.ts.map +1 -0
  80. package/dist/identity-governance/definitions.js +25 -0
  81. package/dist/identity-governance/definitions.js.map +1 -0
  82. package/dist/identity-governance/files.d.ts +5 -0
  83. package/dist/identity-governance/files.d.ts.map +1 -0
  84. package/dist/identity-governance/files.js +75 -0
  85. package/dist/identity-governance/files.js.map +1 -0
  86. package/dist/identity-governance/flags.d.ts +43 -0
  87. package/dist/identity-governance/flags.d.ts.map +1 -0
  88. package/dist/identity-governance/flags.js +52 -0
  89. package/dist/identity-governance/flags.js.map +1 -0
  90. package/dist/identity-governance/group-mutation.d.ts +165 -0
  91. package/dist/identity-governance/group-mutation.d.ts.map +1 -0
  92. package/dist/identity-governance/group-mutation.js +160 -0
  93. package/dist/identity-governance/group-mutation.js.map +1 -0
  94. package/dist/identity-governance/membership.d.ts +145 -0
  95. package/dist/identity-governance/membership.d.ts.map +1 -0
  96. package/dist/identity-governance/membership.js +264 -0
  97. package/dist/identity-governance/membership.js.map +1 -0
  98. package/dist/identity-governance/runtime.d.ts +16 -0
  99. package/dist/identity-governance/runtime.d.ts.map +1 -0
  100. package/dist/identity-governance/runtime.js +30 -0
  101. package/dist/identity-governance/runtime.js.map +1 -0
  102. package/oclif.manifest.json +2585 -560
  103. package/package.json +11 -2
  104. package/skills/monkeys-shared/SKILL.md +2 -1
  105. package/skills/monkeys-shared/references/identity-governance.md +47 -0
  106. package/skills/monkeys-shared/references/platform-overview.md +2 -0
@@ -0,0 +1,160 @@
1
+ import { z } from 'zod';
2
+ import { CliError, EXIT_CODES } from '../errors/cli-error.js';
3
+ import { assertConfirmation } from '../policy/risk.js';
4
+ import { requireComplete } from './client.js';
5
+ import { fail, groupCreateSchema, groupSchema, groupUpdateSchema, idSchema, parse, permissionSetSchema, requireCustomGroup, } from './contracts.js';
6
+ import { digest, writeArtifact } from './files.js';
7
+ import { identityMeta } from './runtime.js';
8
+ export async function executeGroupMutation(input) {
9
+ const { client, action } = input;
10
+ if (input.dryRun && input.yes)
11
+ fail('IDENTITY_FLAG_CONFLICT', '--dry-run and --yes are mutually exclusive.');
12
+ if (!input.dryRun)
13
+ assertConfirmation({ interactive: false, risk: 'privileged', yes: input.yes });
14
+ const id = action === 'create' ? undefined : parse(idSchema, input.id);
15
+ if (action === 'create' && input.id !== undefined)
16
+ fail('IDENTITY_INPUT_INVALID', 'Create does not accept a target group ID.');
17
+ const body = action === 'create'
18
+ ? parse(groupCreateSchema, input.body)
19
+ : action === 'update'
20
+ ? parse(groupUpdateSchema, input.body)
21
+ : action === 'setPermissions'
22
+ ? parse(permissionSetSchema, input.body)
23
+ : undefined;
24
+ if (action === 'delete' && input.body !== undefined)
25
+ fail('IDENTITY_INPUT_INVALID', 'Delete does not accept a request body.');
26
+ client.validateRequest(action, id, body);
27
+ const before = id ? await client.group(id) : undefined;
28
+ if (before)
29
+ requireCustomGroup(before);
30
+ const { pageToken: _pageToken, ...pageBounds } = input.pagination;
31
+ const completePages = { ...pageBounds, pageAll: true };
32
+ const metadata = body && 'code' in body ? body : undefined;
33
+ if (metadata?.code !== undefined) {
34
+ if (['member', 'platform_admin', 'super_admin'].includes(metadata.code))
35
+ fail('IDENTITY_GROUP_PROTECTED', 'This group code is reserved.', EXIT_CODES.authorization);
36
+ const groups = requireComplete(await client.groups(completePages));
37
+ if (groups.some((group) => group.id !== id && group.code.toLowerCase() === metadata.code))
38
+ fail('IDENTITY_GROUP_CODE_EXISTS', 'An active group already uses this code.');
39
+ }
40
+ if (action === 'delete') {
41
+ const members = await client.members(id, { pageAll: false, pageSize: 1, pageLimit: 1, pageDelay: 0 });
42
+ if (members.items.length || members.pageInfo.hasMore)
43
+ fail('IDENTITY_GROUP_IN_USE', 'Remove direct members explicitly before deleting a custom group.');
44
+ }
45
+ if (action === 'setPermissions') {
46
+ const desired = body.permissionIds;
47
+ if (new Set(desired).size !== desired.length)
48
+ fail('IDENTITY_DUPLICATE_TARGET', 'Repeated permission IDs are not allowed.');
49
+ const known = new Set(requireComplete(await client.permissions(completePages)).map((permission) => permission.id));
50
+ if (desired.some((permissionId) => !known.has(permissionId)))
51
+ fail('IDENTITY_PERMISSION_NOT_FOUND', 'Every permission ID must exist in the complete permission catalog.');
52
+ const own = await client.userGroups(client.runtime.principalId);
53
+ if ([...own.direct, ...own.mapped].some((group) => group.id === id) &&
54
+ ![...own.direct, ...own.mapped].some((group) => group.code === 'super_admin' && group.protected))
55
+ fail('IDENTITY_SELF_LOCKOUT_RISK', 'Changing your own permission group requires proven independent super-administrator authority.', EXIT_CODES.authorization);
56
+ }
57
+ const warnings = action === 'setPermissions'
58
+ ? [
59
+ 'This replaces the complete permission set. An explicit [] clears it.',
60
+ 'The server uses last-writer-wins; client preflight is not atomic compare-and-swap.',
61
+ ]
62
+ : action === 'delete'
63
+ ? ['Deletion has no restore endpoint. Recreating a group will not preserve its original ID.']
64
+ : [];
65
+ const preview = { ...identityMeta(client.runtime), action, groupId: id, before, after: body, warnings };
66
+ if (input.dryRun)
67
+ return { ...preview, dryRun: true, writeRequestSent: false, serverValidated: false };
68
+ if (before && digest(await client.group(id)) !== digest(before))
69
+ fail('IDENTITY_PLAN_STALE', 'The group changed during preflight. Nothing was written; repeat the preview.');
70
+ const snapshot = await writeArtifact(preview, input.snapshot, 'group-before');
71
+ let resultId = id;
72
+ let requestId;
73
+ try {
74
+ if (action === 'delete') {
75
+ const result = await client.call('delete', z.undefined(), { id: id });
76
+ requestId = result.requestId;
77
+ try {
78
+ await client.group(id);
79
+ }
80
+ catch (cause) {
81
+ if (cause instanceof CliError && cause.code === 'HTTP_404')
82
+ return saveResult({ ...preview, dryRun: false, writeRequestSent: true, snapshot, requestId, verification: { absent: true } });
83
+ throw cause;
84
+ }
85
+ fail('IDENTITY_READBACK_MISMATCH', 'The group still exists after deletion.', EXIT_CODES.partial);
86
+ }
87
+ const result = await client.call(action, groupSchema, { ...(id === undefined ? {} : { id }), body });
88
+ requestId = result.requestId;
89
+ resultId = result.data.id;
90
+ if (id && resultId !== id)
91
+ fail('IDENTITY_READBACK_MISMATCH', 'The write returned a different group ID.', EXIT_CODES.partial);
92
+ const after = await client.group(resultId);
93
+ verifyGroupMutation(action, body, after);
94
+ return saveResult({
95
+ ...preview,
96
+ dryRun: false,
97
+ writeRequestSent: true,
98
+ snapshot,
99
+ requestId,
100
+ groupId: resultId,
101
+ after,
102
+ verification: { matches: true },
103
+ });
104
+ }
105
+ catch (cause) {
106
+ const evidence = {
107
+ groupId: resultId,
108
+ snapshot,
109
+ requestId,
110
+ originalCode: cause instanceof CliError ? cause.code : 'INTERNAL_ERROR',
111
+ requestState: 'sent',
112
+ recovery: 'Reconcile the exact target before any retry or separately authorized restoration.',
113
+ };
114
+ let failureReport;
115
+ try {
116
+ failureReport = await writeArtifact(evidence, undefined, 'group-stopped');
117
+ }
118
+ catch (reportError) {
119
+ throw new CliError('The group operation stopped and its final report could not be saved. Inspect the snapshot; do not replay.', {
120
+ cause: reportError,
121
+ code: 'IDENTITY_REPORT_WRITE_FAILED',
122
+ exitCode: EXIT_CODES.partial,
123
+ safeDetails: evidence,
124
+ });
125
+ }
126
+ throw new CliError('Group mutation did not complete verified execution. Inspect the exact target and snapshot before retrying; no write was replayed.', { cause, code: 'IDENTITY_GROUP_MUTATION_INCOMPLETE', exitCode: EXIT_CODES.partial, safeDetails: { ...evidence, failureReport } });
127
+ }
128
+ }
129
+ async function saveResult(result) {
130
+ try {
131
+ return { ...result, finalReport: await writeArtifact(result, undefined, 'group-complete') };
132
+ }
133
+ catch (cause) {
134
+ throw new CliError('The group write was verified but its final report could not be saved. Do not replay the write.', {
135
+ cause,
136
+ code: 'IDENTITY_REPORT_WRITE_FAILED',
137
+ exitCode: EXIT_CODES.partial,
138
+ safeDetails: result,
139
+ });
140
+ }
141
+ }
142
+ function verifyGroupMutation(action, body, after) {
143
+ const values = body;
144
+ if (action === 'setPermissions') {
145
+ if (digest([...values.permissionIds].sort()) !== digest(after.permissions.map((permission) => permission.id).sort()))
146
+ fail('IDENTITY_READBACK_MISMATCH', 'Group permission readback differs from the requested complete set.', EXIT_CODES.partial);
147
+ }
148
+ else {
149
+ for (const [key, expected] of Object.entries(values)) {
150
+ const actual = after[key];
151
+ if ((key === 'description' ? (actual ?? '') : actual) !== expected)
152
+ fail('IDENTITY_READBACK_MISMATCH', 'Group metadata readback differs from the requested fields.', EXIT_CODES.partial, {
153
+ field: key,
154
+ });
155
+ }
156
+ if (action === 'create' && (after.isSystem || after.permissions.length))
157
+ fail('IDENTITY_READBACK_MISMATCH', 'A newly created custom group unexpectedly has system status or permissions.', EXIT_CODES.partial);
158
+ }
159
+ }
160
+ //# sourceMappingURL=group-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-mutation.js","sourceRoot":"","sources":["../../src/identity-governance/group-mutation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { z } from 'zod';
2
+ import type { PaginationInput } from '../pagination/index.js';
3
+ import { IdentityClient } from './client.js';
4
+ import { type MembershipChange, type MembershipScope } from './contracts.js';
5
+ export declare const membershipPlanSchema: z.ZodObject<{
6
+ version: z.ZodLiteral<1>;
7
+ kind: z.ZodLiteral<"direct-group-membership">;
8
+ contextFingerprint: z.ZodString;
9
+ principalId: z.ZodString;
10
+ subscription: z.ZodString;
11
+ deployment: z.ZodString;
12
+ tenant: z.ZodString;
13
+ schemaDigest: z.ZodString;
14
+ scope: z.ZodObject<{
15
+ kind: z.ZodEnum<{
16
+ group: "group";
17
+ user: "user";
18
+ }>;
19
+ id: z.ZodString;
20
+ }, z.core.$strict>;
21
+ action: z.ZodEnum<{
22
+ add: "add";
23
+ remove: "remove";
24
+ }>;
25
+ groups: z.ZodArray<z.ZodObject<{
26
+ id: z.ZodString;
27
+ code: z.ZodString;
28
+ name: z.ZodString;
29
+ }, z.core.$strict>>;
30
+ entries: z.ZodArray<z.ZodObject<{
31
+ userId: z.ZodString;
32
+ groupId: z.ZodString;
33
+ action: z.ZodEnum<{
34
+ add: "add";
35
+ remove: "remove";
36
+ }>;
37
+ before: z.ZodBoolean;
38
+ mapped: z.ZodBoolean;
39
+ }, z.core.$strict>>;
40
+ sha256: z.ZodString;
41
+ }, z.core.$strict>;
42
+ export type MembershipPlan = z.infer<typeof membershipPlanSchema>;
43
+ type State = 'completed' | 'skipped' | 'failed' | 'unknown' | 'pending';
44
+ type Outcome = MembershipChange & {
45
+ state: State;
46
+ before: boolean;
47
+ mapped: boolean;
48
+ };
49
+ export declare function parseTargetIds(value: unknown): string[];
50
+ export declare function validateMembershipPlan(value: unknown, client: IdentityClient, scope: MembershipScope, action: 'add' | 'remove'): MembershipPlan;
51
+ export interface MembershipInput {
52
+ client: IdentityClient;
53
+ scope: MembershipScope;
54
+ action: 'add' | 'remove';
55
+ ids?: string[] | undefined;
56
+ idsFile?: string | undefined;
57
+ allMembers?: boolean | undefined;
58
+ planFile?: string | undefined;
59
+ planOut?: string | undefined;
60
+ report?: string | undefined;
61
+ dryRun: boolean;
62
+ yes: boolean;
63
+ pagination: PaginationInput;
64
+ }
65
+ export declare function executeMembership(input: MembershipInput): Promise<{
66
+ authSurface: string;
67
+ teamMode: string;
68
+ subscription: string;
69
+ deployment: string;
70
+ tenant: string;
71
+ principalId: string;
72
+ contextFingerprint: string;
73
+ schemaDigest: string | undefined;
74
+ scope: {
75
+ kind: "group" | "user";
76
+ id: string;
77
+ };
78
+ action: "add" | "remove";
79
+ targetCount: number;
80
+ planSha256: string;
81
+ warnings: string[];
82
+ dryRun: boolean;
83
+ writeRequestSent: boolean;
84
+ serverValidated: boolean;
85
+ planPath: string | undefined;
86
+ plan: {
87
+ version: 1;
88
+ kind: "direct-group-membership";
89
+ contextFingerprint: string;
90
+ principalId: string;
91
+ subscription: string;
92
+ deployment: string;
93
+ tenant: string;
94
+ schemaDigest: string;
95
+ scope: {
96
+ kind: "group" | "user";
97
+ id: string;
98
+ };
99
+ action: "add" | "remove";
100
+ groups: {
101
+ id: string;
102
+ code: string;
103
+ name: string;
104
+ }[];
105
+ entries: {
106
+ userId: string;
107
+ groupId: string;
108
+ action: "add" | "remove";
109
+ before: boolean;
110
+ mapped: boolean;
111
+ }[];
112
+ sha256: string;
113
+ };
114
+ } | {
115
+ authSurface: string;
116
+ teamMode: string;
117
+ subscription: string;
118
+ deployment: string;
119
+ tenant: string;
120
+ principalId: string;
121
+ contextFingerprint: string;
122
+ schemaDigest: string | undefined;
123
+ scope: {
124
+ kind: "group" | "user";
125
+ id: string;
126
+ };
127
+ action: "add" | "remove";
128
+ targetCount: number;
129
+ planSha256: string;
130
+ warnings: string[];
131
+ dryRun: boolean;
132
+ writeRequestSent: boolean;
133
+ snapshot: string;
134
+ report: string;
135
+ reports: string[];
136
+ outcomes: Outcome[];
137
+ inverse: {
138
+ userId: string;
139
+ groupId: string;
140
+ action: "add" | "remove";
141
+ }[];
142
+ finalReport: string;
143
+ }>;
144
+ export {};
145
+ //# sourceMappingURL=membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"membership.d.ts","sourceRoot":"","sources":["../../src/identity-governance/membership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAmB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAQL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAqBxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAiF,CAAC;AACnH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,KAAK,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AACxE,KAAK,OAAO,GAAG,gBAAgB,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAErF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAIvD;AA0ED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,KAAK,GAAG,QAAQ,GACvB,cAAc,CAoBhB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0J7D"}
@@ -0,0 +1,264 @@
1
+ import { z } from 'zod';
2
+ import { CliError, EXIT_CODES } from '../errors/cli-error.js';
3
+ import { assertConfirmation } from '../policy/risk.js';
4
+ import { requireComplete } from './client.js';
5
+ import { changeSchema, fail, groupRefSchema, idSchema, MAX_MEMBERSHIP_TARGETS, parse, scopeSchema, } from './contracts.js';
6
+ import { digest, readJson, writeArtifact } from './files.js';
7
+ import { identityMeta } from './runtime.js';
8
+ const entrySchema = changeSchema.extend({ before: z.boolean(), mapped: z.boolean() }).strict();
9
+ const planBodySchema = z
10
+ .object({
11
+ version: z.literal(1),
12
+ kind: z.literal('direct-group-membership'),
13
+ contextFingerprint: z.string().min(1),
14
+ principalId: idSchema,
15
+ subscription: z.string().min(1),
16
+ deployment: z.string().min(1),
17
+ tenant: z.string().min(1),
18
+ schemaDigest: z.string().regex(/^[a-f0-9]{64}$/),
19
+ scope: scopeSchema,
20
+ action: z.enum(['add', 'remove']),
21
+ groups: z.array(groupRefSchema.strict()).max(MAX_MEMBERSHIP_TARGETS),
22
+ entries: z.array(entrySchema).max(MAX_MEMBERSHIP_TARGETS),
23
+ })
24
+ .strict();
25
+ export const membershipPlanSchema = planBodySchema.extend({ sha256: z.string().regex(/^[a-f0-9]{64}$/) }).strict();
26
+ export function parseTargetIds(value) {
27
+ const ids = parse(z.array(idSchema).min(1).max(MAX_MEMBERSHIP_TARGETS), value);
28
+ if (new Set(ids).size !== ids.length)
29
+ fail('IDENTITY_DUPLICATE_TARGET', 'Repeated target IDs are not allowed.');
30
+ return ids.sort();
31
+ }
32
+ async function observe(client, scope, action, ids) {
33
+ client.binding('change');
34
+ const changes = ids.map((id) => ({
35
+ userId: scope.kind === 'user' ? scope.id : id,
36
+ groupId: scope.kind === 'group' ? scope.id : id,
37
+ action,
38
+ }));
39
+ const groupIds = [...new Set(changes.map((entry) => entry.groupId))].sort();
40
+ // Still validate an empty group's identity/protection when preparing an all-members no-op.
41
+ if (scope.kind === 'group' && !groupIds.length)
42
+ groupIds.push(scope.id);
43
+ const groups = [];
44
+ for (const id of groupIds) {
45
+ const group = await client.group(id);
46
+ if (!group.membershipEditable || group.code === 'super_admin')
47
+ fail('IDENTITY_MEMBERSHIP_PROTECTED', 'This group membership is protected.', EXIT_CODES.authorization, { groupId: id });
48
+ groups.push(parse(groupRefSchema, group));
49
+ }
50
+ const byUser = new Map();
51
+ for (const userId of [...new Set(changes.map((entry) => entry.userId))])
52
+ byUser.set(userId, await client.userGroups(userId));
53
+ if (scope.kind === 'user' && !byUser.has(scope.id))
54
+ byUser.set(scope.id, await client.userGroups(scope.id));
55
+ const memberships = new Map([...byUser].map(([userId, state]) => [
56
+ userId,
57
+ {
58
+ direct: new Set(state.direct.map((group) => group.id)),
59
+ mapped: new Set(state.mapped.map((group) => group.id)),
60
+ },
61
+ ]));
62
+ const entries = changes
63
+ .map((change) => {
64
+ const state = memberships.get(change.userId);
65
+ return {
66
+ ...change,
67
+ before: state.direct.has(change.groupId),
68
+ mapped: state.mapped.has(change.groupId),
69
+ };
70
+ })
71
+ .sort((a, b) => (a.userId < b.userId ? -1 : a.userId > b.userId ? 1 : a.groupId < b.groupId ? -1 : a.groupId > b.groupId ? 1 : 0));
72
+ const selfRemoval = entries.some((entry) => entry.userId === client.runtime.principalId && entry.action === 'remove' && entry.before);
73
+ if (selfRemoval) {
74
+ const own = byUser.get(client.runtime.principalId);
75
+ const retainedSuperAdmin = [...own.direct, ...own.mapped].some((group) => group.code === 'super_admin' && group.protected);
76
+ if (!retainedSuperAdmin)
77
+ fail('IDENTITY_SELF_LOCKOUT_RISK', 'This operation removes your own membership without proven retained super-administrator authority. Use an already authorized operator with independent access; no target was omitted.', EXIT_CODES.authorization);
78
+ }
79
+ const meta = identityMeta(client.runtime);
80
+ const body = parse(planBodySchema, {
81
+ version: 1,
82
+ kind: 'direct-group-membership',
83
+ contextFingerprint: meta.contextFingerprint,
84
+ principalId: meta.principalId,
85
+ subscription: meta.subscription,
86
+ deployment: meta.deployment,
87
+ tenant: meta.tenant,
88
+ schemaDigest: meta.schemaDigest,
89
+ scope,
90
+ action,
91
+ groups,
92
+ entries,
93
+ });
94
+ return { ...body, sha256: digest(body) };
95
+ }
96
+ function targetIds(plan) {
97
+ return plan.entries.map((entry) => (plan.scope.kind === 'user' ? entry.groupId : entry.userId));
98
+ }
99
+ export function validateMembershipPlan(value, client, scope, action) {
100
+ const plan = parse(membershipPlanSchema, value);
101
+ const { sha256, ...body } = plan;
102
+ if (digest(body) !== sha256)
103
+ fail('IDENTITY_PLAN_INVALID', 'The plan digest does not match its content. Prepare a new dry-run.');
104
+ if (plan.contextFingerprint !== client.runtime.context.fingerprint ||
105
+ plan.principalId !== client.runtime.principalId ||
106
+ plan.subscription !== client.runtime.context.subscription ||
107
+ plan.deployment !== client.runtime.context.deployment ||
108
+ plan.tenant !== client.runtime.context.tenant ||
109
+ plan.schemaDigest !== client.runtime.digest ||
110
+ plan.action !== action ||
111
+ plan.scope.kind !== scope.kind ||
112
+ plan.scope.id !== scope.id)
113
+ fail('IDENTITY_PLAN_CONTEXT_MISMATCH', 'The plan does not match this command, principal, subscription, target, or API contract.');
114
+ if (plan.entries.length)
115
+ parseTargetIds(targetIds(plan));
116
+ if (plan.entries.some((entry) => entry.action !== action || (scope.kind === 'user' ? entry.userId : entry.groupId) !== scope.id))
117
+ fail('IDENTITY_PLAN_SCOPE_MISMATCH', 'Every plan change must belong to the exact editor scope.');
118
+ return plan;
119
+ }
120
+ export async function executeMembership(input) {
121
+ const { client, action } = input;
122
+ const scope = parse(scopeSchema, input.scope);
123
+ if (input.dryRun && input.yes)
124
+ fail('IDENTITY_FLAG_CONFLICT', '--dry-run and --yes are mutually exclusive.');
125
+ if (input.planOut && !input.dryRun)
126
+ fail('IDENTITY_FLAG_CONFLICT', '--plan-out is only allowed during dry-run.');
127
+ const selectors = [input.ids !== undefined, input.idsFile !== undefined, Boolean(input.allMembers), input.planFile !== undefined].filter(Boolean).length;
128
+ if (selectors !== 1)
129
+ fail('IDENTITY_TARGET_REQUIRED', 'Choose exactly one of explicit IDs, --ids-file, --all-members, or --plan-file.');
130
+ if (input.allMembers && (scope.kind !== 'group' || action !== 'remove' || !input.dryRun || !input.planOut || input.pagination.pageToken))
131
+ fail('IDENTITY_ALL_MEMBERS_PREVIEW_REQUIRED', '--all-members requires group member remove --dry-run --plan-out, starting from the first page.');
132
+ if (!input.dryRun)
133
+ assertConfirmation({ interactive: false, risk: 'privileged', yes: input.yes });
134
+ client.binding('change');
135
+ let plan;
136
+ if (input.planFile) {
137
+ plan = validateMembershipPlan(await readJson(input.planFile), client, scope, action);
138
+ const current = await observe(client, scope, action, targetIds(plan));
139
+ if (current.sha256 !== plan.sha256)
140
+ fail('IDENTITY_PLAN_STALE', 'Membership or group state changed since preview. Prepare a new plan; nothing was written.');
141
+ }
142
+ else {
143
+ let ids;
144
+ if (input.allMembers) {
145
+ ids = requireComplete(await client.members(scope.id, { ...input.pagination, pageAll: true })).map((member) => member.id);
146
+ if (ids.length)
147
+ ids = parseTargetIds(ids);
148
+ }
149
+ else
150
+ ids = parseTargetIds(input.idsFile ? await readJson(input.idsFile) : input.ids);
151
+ if (!input.dryRun && ids.length > 1)
152
+ fail('IDENTITY_BULK_PLAN_REQUIRED', 'Bulk writes require a reviewed --plan-file. Run --dry-run --plan-out first.');
153
+ plan = await observe(client, scope, action, ids);
154
+ }
155
+ for (let offset = 0; offset < Math.max(1, plan.entries.length); offset += 200) {
156
+ client.validateRequest('change', undefined, {
157
+ scope,
158
+ changes: plan.entries.slice(offset, offset + 200).map(({ userId, groupId, action }) => ({ userId, groupId, action })),
159
+ });
160
+ }
161
+ const warnings = [
162
+ 'Only direct membership changes. Mapped access is not revoked.',
163
+ 'Removing access groups may remove backend access.',
164
+ 'Batches are individually atomic; the whole job is not a transaction.',
165
+ ];
166
+ const common = { ...identityMeta(client.runtime), scope, action, targetCount: plan.entries.length, planSha256: plan.sha256, warnings };
167
+ if (input.dryRun) {
168
+ const planPath = input.planOut ? await writeArtifact(plan, input.planOut, 'plan') : undefined;
169
+ return { ...common, dryRun: true, writeRequestSent: false, serverValidated: false, planPath, plan };
170
+ }
171
+ const snapshot = await writeArtifact(plan, undefined, 'before');
172
+ const outcomes = plan.entries.map((entry) => ({
173
+ ...entry,
174
+ state: entry.before === (action === 'add') ? 'skipped' : 'pending',
175
+ }));
176
+ const reports = [];
177
+ // Reserve the requested report path before sending anything. Later batch files are immutable receipts.
178
+ const report = await writeArtifact({ ...common, snapshot, outcomes }, input.report, 'report');
179
+ const pending = outcomes.filter((entry) => entry.state === 'pending');
180
+ const plannedGroups = new Map(plan.groups.map((group) => [group.id, group]));
181
+ let writeRequestSent = false;
182
+ for (let offset = 0; offset < pending.length; offset += 200) {
183
+ const batch = pending.slice(offset, offset + 200);
184
+ let requestId;
185
+ let sent = false;
186
+ let accepted = false;
187
+ try {
188
+ const current = await observe(client, scope, action, batch.map((entry) => (scope.kind === 'user' ? entry.groupId : entry.userId)));
189
+ const expectedEntries = batch.map(({ state: _state, ...entry }) => entry);
190
+ if (digest(current.entries) !== digest(expectedEntries) ||
191
+ current.groups.some((group) => {
192
+ const before = plannedGroups.get(group.id);
193
+ return !before || before.code !== group.code || before.name !== group.name;
194
+ }))
195
+ fail('IDENTITY_PLAN_STALE', 'Pending target state changed. Stop and prepare a new plan.');
196
+ const changes = batch.map(({ userId, groupId, action }) => ({ userId, groupId, action }));
197
+ client.validateRequest('change', undefined, { scope, changes });
198
+ reports.push(await writeArtifact({ ...common, snapshot, batchIndex: offset / 200, requestState: 'prepared', changes, outcomes }, undefined, 'batch-before'));
199
+ sent = true;
200
+ writeRequestSent = true;
201
+ const result = await client.change({ scope, changes });
202
+ accepted = true;
203
+ requestId = result.requestId;
204
+ if (result.data.changed !== batch.length || digest(result.data.scope) !== digest(scope))
205
+ fail('IDENTITY_WRITE_COUNT_MISMATCH', 'The server did not confirm the exact planned batch. Reconcile before further changes.', EXIT_CODES.partial);
206
+ const readbacks = new Map();
207
+ for (const entry of batch) {
208
+ let actual = readbacks.get(entry.userId);
209
+ if (!actual) {
210
+ actual = await client.userGroups(entry.userId);
211
+ readbacks.set(entry.userId, actual);
212
+ }
213
+ if (actual.direct.some((group) => group.id === entry.groupId) !== (action === 'add'))
214
+ fail('IDENTITY_READBACK_MISMATCH', 'The exact membership readback differs from the requested state.', EXIT_CODES.partial);
215
+ }
216
+ for (const entry of batch)
217
+ entry.state = 'completed';
218
+ reports.push(await writeArtifact({ ...common, snapshot, requestId, outcomes, inverse: inverseChanges(outcomes) }, undefined, 'batch'));
219
+ }
220
+ catch (cause) {
221
+ const knownRejection = !accepted && cause instanceof CliError && /^HTTP_4\d\d$/.test(cause.code);
222
+ for (const entry of batch)
223
+ if (entry.state === 'pending')
224
+ entry.state = sent && !knownRejection ? 'unknown' : 'failed';
225
+ const result = {
226
+ ...common,
227
+ snapshot,
228
+ report,
229
+ reports,
230
+ requestId,
231
+ writeRequestSent,
232
+ outcomes,
233
+ inverse: inverseChanges(outcomes),
234
+ failureCode: cause instanceof CliError ? cause.code : 'INTERNAL_ERROR',
235
+ };
236
+ let failureReport;
237
+ try {
238
+ failureReport = await writeArtifact(result, undefined, 'stopped');
239
+ }
240
+ catch (reportError) {
241
+ throw new CliError('Membership execution stopped and the final report could not be saved. Use the snapshot and returned outcomes; do not replay writes.', { cause: reportError, code: 'IDENTITY_REPORT_WRITE_FAILED', exitCode: EXIT_CODES.partial, safeDetails: result });
242
+ }
243
+ throw new CliError('Membership execution stopped. Inspect completed, failed, unknown, and pending targets before recovery; no batch was replayed.', { cause, code: 'IDENTITY_BATCH_INCOMPLETE', exitCode: EXIT_CODES.partial, safeDetails: { ...result, failureReport } });
244
+ }
245
+ }
246
+ const result = { ...common, dryRun: false, writeRequestSent, snapshot, report, reports, outcomes, inverse: inverseChanges(outcomes) };
247
+ try {
248
+ return { ...result, finalReport: await writeArtifact(result, undefined, 'complete') };
249
+ }
250
+ catch (cause) {
251
+ throw new CliError('Membership results were verified but the final report could not be saved. Do not repeat the write.', {
252
+ cause,
253
+ code: 'IDENTITY_REPORT_WRITE_FAILED',
254
+ exitCode: EXIT_CODES.partial,
255
+ safeDetails: result,
256
+ });
257
+ }
258
+ }
259
+ function inverseChanges(outcomes) {
260
+ return outcomes
261
+ .filter((entry) => entry.state === 'completed')
262
+ .map(({ userId, groupId, action }) => ({ userId, groupId, action: action === 'add' ? 'remove' : 'add' }));
263
+ }
264
+ //# sourceMappingURL=membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"membership.js","sourceRoot":"","sources":["../../src/identity-governance/membership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type SemanticRuntime } from '../semantic/runtime.js';
2
+ export interface IdentityRuntime extends SemanticRuntime {
3
+ principalId: string;
4
+ }
5
+ export declare function loadIdentityRuntime(subscription: string, refresh: boolean): Promise<IdentityRuntime>;
6
+ export declare function identityMeta(runtime: IdentityRuntime): {
7
+ authSurface: string;
8
+ teamMode: string;
9
+ subscription: string;
10
+ deployment: string;
11
+ tenant: string;
12
+ principalId: string;
13
+ contextFingerprint: string;
14
+ schemaDigest: string | undefined;
15
+ };
16
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/identity-governance/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGnF,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAe1G;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe;IAEjD,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,MAAM;IACN,WAAW;IACX,kBAAkB;IAClB,YAAY;EAEf"}