@kindgi/authz 0.0.0-bootstrap.0 → 0.1.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.
@@ -0,0 +1,71 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ // ============================================================
4
+ // CONSTRUCTORS — thin factories for readable call sites
5
+ // ============================================================
6
+ export function userPrincipal(userId, tenantId) {
7
+ return { actor: { kind: 'user', id: userId, tenantId } };
8
+ }
9
+ export function systemPrincipal(tenantId) {
10
+ return { actor: { kind: 'system', id: 'system', tenantId } };
11
+ }
12
+ /**
13
+ * Build a principal from a service-account token. `id` is typically
14
+ * the token id (or a stable identifier derived from it) so grants can
15
+ * be attached to a specific integration.
16
+ */
17
+ export function serviceAccountPrincipal(serviceAccountId, tenantId) {
18
+ return { actor: { kind: 'service_account', id: serviceAccountId, tenantId } };
19
+ }
20
+ /**
21
+ * Build a delegated principal: `actor` acting on behalf of `onBehalfOf`.
22
+ * Both must be in the same tenant (checked at construction; mismatches
23
+ * are configuration bugs, not runtime authz denials).
24
+ */
25
+ export function delegate(actor, onBehalfOf, scope) {
26
+ if (actor.tenantId !== onBehalfOf.tenantId) {
27
+ throw new Error(`delegate: cross-tenant delegation not supported (actor.tenantId=${actor.tenantId}, onBehalfOf.tenantId=${onBehalfOf.tenantId})`);
28
+ }
29
+ return {
30
+ actor,
31
+ onBehalfOf,
32
+ ...(scope !== undefined ? { scope } : {}),
33
+ };
34
+ }
35
+ /**
36
+ * Narrow an existing principal's permissions further. Composable with
37
+ * delegation — an agent-on-behalf-of-user can be additionally scoped
38
+ * to read-only for a specific request.
39
+ */
40
+ export function downscope(principal, scope) {
41
+ return { ...principal, scope };
42
+ }
43
+ // ============================================================
44
+ // FGA MAPPING — encapsulated in one place
45
+ // ============================================================
46
+ /**
47
+ * Return the FGA subject string for a PrincipalRef. This is the ONE
48
+ * place that decides how principal kinds map to FGA subjects.
49
+ *
50
+ * - `user` → `user:${id}` (real user UUID)
51
+ * - `agent` → `agent:${id}`
52
+ * - `service_account` → `service_account:${id}` (machine identity
53
+ * with narrow grants)
54
+ * - `system` → `user:system` (service identity the tenant's
55
+ * setup grants tenant admin; with one FGA store
56
+ * per tenant the string never crosses tenant
57
+ * boundaries)
58
+ */
59
+ export function fgaSubject(ref) {
60
+ switch (ref.kind) {
61
+ case 'user':
62
+ return `user:${ref.id}`;
63
+ case 'agent':
64
+ return `agent:${ref.id}`;
65
+ case 'service_account':
66
+ return `service_account:${ref.id}`;
67
+ case 'system':
68
+ return 'user:system';
69
+ }
70
+ }
71
+ //# sourceMappingURL=principal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"principal.js","sourceRoot":"","sources":["../src/principal.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AA2EjC,+DAA+D;AAC/D,wDAAwD;AACxD,+DAA+D;AAE/D,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAkB;IAC9D,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,gBAAwB,EAAE,QAAkB;IAClF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAmB,EACnB,UAAwB,EACxB,KAA6B;IAE7B,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,mEAAmE,KAAK,CAAC,QAAQ,yBAAyB,UAAU,CAAC,QAAQ,GAAG,CACjI,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK;QACL,UAAU;QACV,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,SAAoB,EAAE,KAA4B;IAC1E,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED,+DAA+D;AAC/D,0CAA0C;AAC1C,+DAA+D;AAE/D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,GAAiB;IAC1C,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC;QAC1B,KAAK,OAAO;YACV,OAAO,SAAS,GAAG,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,iBAAiB;YACpB,OAAO,mBAAmB,GAAG,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type ReviewerRole = 'standard' | 'senior' | 'admin';
2
+ /**
3
+ * Rank order — index into an ordered scale so callers can express
4
+ * "requires >= senior" without hard-coding string comparisons.
5
+ * Higher number = more senior.
6
+ */
7
+ export declare const REVIEWER_ROLE_RANK: Readonly<Record<ReviewerRole, number>>;
8
+ //# sourceMappingURL=reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAIrE,CAAC"}
@@ -0,0 +1,13 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ /**
4
+ * Rank order — index into an ordered scale so callers can express
5
+ * "requires >= senior" without hard-coding string comparisons.
6
+ * Higher number = more senior.
7
+ */
8
+ export const REVIEWER_ROLE_RANK = {
9
+ standard: 0,
10
+ senior: 1,
11
+ admin: 2,
12
+ };
13
+ //# sourceMappingURL=reviewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAoBjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2C;IACxE,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;CACT,CAAC"}
@@ -0,0 +1,142 @@
1
+ import type { AgentId, FlowId, GuardrailId, OrgId, ProjectId, RunId, TeamId, TenantId, ToolId, UserId } from '@kindgi/types';
2
+ import type { TupleIntent } from './enqueue.js';
3
+ type EvalSuiteId = string;
4
+ type SecretId = string;
5
+ type EnvId = string;
6
+ type McpEndpointId = string;
7
+ export declare function userSubject(id: UserId): string;
8
+ export declare function teamMemberSubject(id: TeamId): string;
9
+ export declare function tenantObject(id: TenantId): string;
10
+ export declare function orgObject(id: OrgId): string;
11
+ export declare function teamObject(id: TeamId): string;
12
+ export declare function projectObject(id: ProjectId): string;
13
+ export declare function agentObject(id: AgentId): string;
14
+ export declare function flowObject(id: FlowId): string;
15
+ export declare function toolObject(id: ToolId): string;
16
+ export declare function guardrailObject(id: GuardrailId): string;
17
+ export declare function evalSuiteObject(id: EvalSuiteId): string;
18
+ export declare function secretObject(id: SecretId): string;
19
+ export declare function envObject(id: EnvId): string;
20
+ export declare function mcpEndpointObject(id: McpEndpointId): string;
21
+ export declare function runObject(id: RunId): string;
22
+ export type Scope = {
23
+ readonly kind: 'tenant';
24
+ readonly tenantId: TenantId;
25
+ } | {
26
+ readonly kind: 'org';
27
+ readonly tenantId: TenantId;
28
+ readonly orgId: OrgId;
29
+ } | {
30
+ readonly kind: 'project';
31
+ readonly tenantId: TenantId;
32
+ readonly projectId: ProjectId;
33
+ };
34
+ export declare function scopeSubject(scope: Scope): string;
35
+ export type EntityRef = {
36
+ readonly kind: 'org';
37
+ readonly id: OrgId;
38
+ readonly tenantId: TenantId;
39
+ } | {
40
+ readonly kind: 'project';
41
+ readonly id: ProjectId;
42
+ readonly tenantId: TenantId;
43
+ readonly orgId?: OrgId;
44
+ } | {
45
+ readonly kind: 'team';
46
+ readonly id: TeamId;
47
+ readonly tenantId: TenantId;
48
+ readonly orgId?: OrgId;
49
+ } | {
50
+ readonly kind: 'agent';
51
+ readonly id: AgentId;
52
+ readonly tenantId: TenantId;
53
+ readonly projectId: ProjectId;
54
+ } | {
55
+ readonly kind: 'flow';
56
+ readonly id: FlowId;
57
+ readonly tenantId: TenantId;
58
+ readonly projectId: ProjectId;
59
+ } | {
60
+ readonly kind: 'tool';
61
+ readonly id: ToolId;
62
+ readonly tenantId: TenantId;
63
+ readonly projectId: ProjectId;
64
+ } | {
65
+ readonly kind: 'guardrail';
66
+ readonly id: GuardrailId;
67
+ readonly tenantId: TenantId;
68
+ readonly projectId: ProjectId;
69
+ } | {
70
+ readonly kind: 'eval_suite';
71
+ readonly id: EvalSuiteId;
72
+ readonly tenantId: TenantId;
73
+ readonly projectId: ProjectId;
74
+ } | {
75
+ readonly kind: 'secret';
76
+ readonly id: SecretId;
77
+ readonly tenantId: TenantId;
78
+ readonly scope: Scope;
79
+ } | {
80
+ readonly kind: 'env';
81
+ readonly id: EnvId;
82
+ readonly tenantId: TenantId;
83
+ readonly scope: Scope;
84
+ } | {
85
+ readonly kind: 'mcp_endpoint';
86
+ readonly id: McpEndpointId;
87
+ readonly tenantId: TenantId;
88
+ readonly scope: Scope;
89
+ } | {
90
+ readonly kind: 'run';
91
+ readonly id: RunId;
92
+ readonly tenantId: TenantId;
93
+ readonly projectId: ProjectId;
94
+ };
95
+ export declare function tuplesForCreate(entity: EntityRef, creatorUserId?: UserId): TupleIntent[];
96
+ export declare function tuplesForDelete(entity: EntityRef): TupleIntent[];
97
+ export type TeamRole = 'member' | 'admin';
98
+ export type ProjectRole = 'owner' | 'admin' | 'editor' | 'viewer';
99
+ export declare function teamMembershipTuple(op: 'write' | 'delete', teamId: TeamId, userId: UserId, role: TeamRole): TupleIntent;
100
+ export declare function projectMembershipTuple(op: 'write' | 'delete', projectId: ProjectId, userId: UserId, role: ProjectRole): TupleIntent;
101
+ export declare function teamProjectGrantTuple(op: 'write' | 'delete', projectId: ProjectId, teamId: TeamId, role: Exclude<ProjectRole, 'owner'>): TupleIntent;
102
+ export type MachineSubject = {
103
+ readonly kind: 'agent';
104
+ readonly id: AgentId | string;
105
+ } | {
106
+ readonly kind: 'service_account';
107
+ readonly id: string;
108
+ };
109
+ export type AgentAccessResource = {
110
+ readonly type: 'tool';
111
+ readonly id: ToolId;
112
+ } | {
113
+ readonly type: 'flow';
114
+ readonly id: FlowId;
115
+ } | {
116
+ readonly type: 'eval_suite';
117
+ readonly id: EvalSuiteId;
118
+ } | {
119
+ readonly type: 'agent';
120
+ readonly id: AgentId;
121
+ } | {
122
+ readonly type: 'secret';
123
+ readonly id: SecretId;
124
+ } | {
125
+ readonly type: 'env';
126
+ readonly id: EnvId;
127
+ } | {
128
+ readonly type: 'mcp_endpoint';
129
+ readonly id: McpEndpointId;
130
+ };
131
+ /**
132
+ * Generic machine-subject grant. Works for both `agent` and
133
+ * `service_account` — the capability relations admit both.
134
+ */
135
+ export declare function machineAccessTuple(op: 'write' | 'delete', subject: MachineSubject, resource: AgentAccessResource): TupleIntent;
136
+ /**
137
+ * Agent-subject shorthand for
138
+ * `machineAccessTuple(op, { kind: 'agent', id: agentId }, resource)`.
139
+ */
140
+ export declare function agentAccessTuple(op: 'write' | 'delete', agentId: AgentId, resource: AgentAccessResource): TupleIntent;
141
+ export {};
142
+ //# sourceMappingURL=tuples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuples.d.ts","sourceRoot":"","sources":["../src/tuples.ts"],"names":[],"mappings":"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"}
package/dist/tuples.js ADDED
@@ -0,0 +1,372 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ // ============================================================
4
+ // SUBJECT HELPERS
5
+ // ============================================================
6
+ export function userSubject(id) {
7
+ return `user:${id}`;
8
+ }
9
+ export function teamMemberSubject(id) {
10
+ return `team:${id}#member`;
11
+ }
12
+ // ============================================================
13
+ // OBJECT HELPERS
14
+ // ============================================================
15
+ export function tenantObject(id) {
16
+ return `tenant:${id}`;
17
+ }
18
+ export function orgObject(id) {
19
+ return `org:${id}`;
20
+ }
21
+ export function teamObject(id) {
22
+ return `team:${id}`;
23
+ }
24
+ export function projectObject(id) {
25
+ return `project:${id}`;
26
+ }
27
+ export function agentObject(id) {
28
+ return `agent:${id}`;
29
+ }
30
+ export function flowObject(id) {
31
+ return `flow:${id}`;
32
+ }
33
+ export function toolObject(id) {
34
+ return `tool:${id}`;
35
+ }
36
+ export function guardrailObject(id) {
37
+ return `guardrail:${id}`;
38
+ }
39
+ export function evalSuiteObject(id) {
40
+ return `eval_suite:${id}`;
41
+ }
42
+ export function secretObject(id) {
43
+ return `secret:${id}`;
44
+ }
45
+ export function envObject(id) {
46
+ return `env:${id}`;
47
+ }
48
+ export function mcpEndpointObject(id) {
49
+ return `mcp_endpoint:${id}`;
50
+ }
51
+ export function runObject(id) {
52
+ return `run:${id}`;
53
+ }
54
+ export function scopeSubject(scope) {
55
+ switch (scope.kind) {
56
+ case 'tenant':
57
+ return tenantObject(scope.tenantId);
58
+ case 'org':
59
+ return orgObject(scope.orgId);
60
+ case 'project':
61
+ return projectObject(scope.projectId);
62
+ }
63
+ }
64
+ // ============================================================
65
+ // TUPLE GENERATORS FOR CREATE / DELETE
66
+ // ============================================================
67
+ export function tuplesForCreate(entity, creatorUserId) {
68
+ switch (entity.kind) {
69
+ case 'org': {
70
+ const tuples = [
71
+ {
72
+ operation: 'write',
73
+ user: tenantObject(entity.tenantId),
74
+ relation: 'parent',
75
+ object: orgObject(entity.id),
76
+ },
77
+ ];
78
+ if (creatorUserId !== undefined) {
79
+ tuples.push({
80
+ operation: 'write',
81
+ user: userSubject(creatorUserId),
82
+ relation: 'admin',
83
+ object: orgObject(entity.id),
84
+ });
85
+ }
86
+ return tuples;
87
+ }
88
+ case 'team': {
89
+ const tuples = [
90
+ {
91
+ operation: 'write',
92
+ user: entity.orgId !== undefined ? orgObject(entity.orgId) : tenantObject(entity.tenantId),
93
+ relation: 'parent',
94
+ object: teamObject(entity.id),
95
+ },
96
+ ];
97
+ if (creatorUserId !== undefined) {
98
+ tuples.push({
99
+ operation: 'write',
100
+ user: userSubject(creatorUserId),
101
+ relation: 'admin',
102
+ object: teamObject(entity.id),
103
+ });
104
+ }
105
+ return tuples;
106
+ }
107
+ case 'project': {
108
+ const tuples = [
109
+ {
110
+ operation: 'write',
111
+ user: entity.orgId !== undefined ? orgObject(entity.orgId) : tenantObject(entity.tenantId),
112
+ relation: 'parent',
113
+ object: projectObject(entity.id),
114
+ },
115
+ ];
116
+ if (creatorUserId !== undefined) {
117
+ tuples.push({
118
+ operation: 'write',
119
+ user: userSubject(creatorUserId),
120
+ relation: 'owner',
121
+ object: projectObject(entity.id),
122
+ });
123
+ }
124
+ return tuples;
125
+ }
126
+ case 'agent':
127
+ case 'flow':
128
+ case 'tool':
129
+ case 'guardrail':
130
+ case 'eval_suite': {
131
+ const object = contentObject(entity);
132
+ const tuples = [
133
+ {
134
+ operation: 'write',
135
+ user: projectObject(entity.projectId),
136
+ relation: 'parent',
137
+ object,
138
+ },
139
+ ];
140
+ if (creatorUserId !== undefined) {
141
+ tuples.push({
142
+ operation: 'write',
143
+ user: userSubject(creatorUserId),
144
+ relation: 'owner',
145
+ object,
146
+ });
147
+ }
148
+ return tuples;
149
+ }
150
+ case 'secret':
151
+ case 'env':
152
+ case 'mcp_endpoint': {
153
+ const object = configObject(entity);
154
+ const tuples = [
155
+ {
156
+ operation: 'write',
157
+ user: scopeSubject(entity.scope),
158
+ relation: 'scope',
159
+ object,
160
+ },
161
+ ];
162
+ if (creatorUserId !== undefined) {
163
+ tuples.push({
164
+ operation: 'write',
165
+ user: userSubject(creatorUserId),
166
+ relation: 'admin',
167
+ object,
168
+ });
169
+ }
170
+ return tuples;
171
+ }
172
+ case 'run':
173
+ // Runs are system-created; no `owner` role (read access comes
174
+ // through the parent project).
175
+ return [
176
+ {
177
+ operation: 'write',
178
+ user: projectObject(entity.projectId),
179
+ relation: 'parent',
180
+ object: runObject(entity.id),
181
+ },
182
+ ];
183
+ }
184
+ }
185
+ export function tuplesForDelete(entity) {
186
+ // Deletes only the parent/scope tuple written at create time. Role
187
+ // and grant tuples added later (membership / grant helpers below)
188
+ // are removed separately by whoever wrote them. Orphan tuples are
189
+ // safe — they only reference objects that no longer exist.
190
+ switch (entity.kind) {
191
+ case 'org':
192
+ return [
193
+ {
194
+ operation: 'delete',
195
+ user: tenantObject(entity.tenantId),
196
+ relation: 'parent',
197
+ object: orgObject(entity.id),
198
+ },
199
+ ];
200
+ case 'team':
201
+ return [
202
+ {
203
+ operation: 'delete',
204
+ user: entity.orgId !== undefined ? orgObject(entity.orgId) : tenantObject(entity.tenantId),
205
+ relation: 'parent',
206
+ object: teamObject(entity.id),
207
+ },
208
+ ];
209
+ case 'project':
210
+ return [
211
+ {
212
+ operation: 'delete',
213
+ user: entity.orgId !== undefined ? orgObject(entity.orgId) : tenantObject(entity.tenantId),
214
+ relation: 'parent',
215
+ object: projectObject(entity.id),
216
+ },
217
+ ];
218
+ case 'agent':
219
+ case 'flow':
220
+ case 'tool':
221
+ case 'guardrail':
222
+ case 'eval_suite':
223
+ return [
224
+ {
225
+ operation: 'delete',
226
+ user: projectObject(entity.projectId),
227
+ relation: 'parent',
228
+ object: contentObject(entity),
229
+ },
230
+ ];
231
+ case 'secret':
232
+ case 'env':
233
+ case 'mcp_endpoint':
234
+ return [
235
+ {
236
+ operation: 'delete',
237
+ user: scopeSubject(entity.scope),
238
+ relation: 'scope',
239
+ object: configObject(entity),
240
+ },
241
+ ];
242
+ case 'run':
243
+ return [
244
+ {
245
+ operation: 'delete',
246
+ user: projectObject(entity.projectId),
247
+ relation: 'parent',
248
+ object: runObject(entity.id),
249
+ },
250
+ ];
251
+ }
252
+ }
253
+ export function teamMembershipTuple(op, teamId, userId, role) {
254
+ return {
255
+ operation: op,
256
+ user: userSubject(userId),
257
+ relation: role,
258
+ object: teamObject(teamId),
259
+ };
260
+ }
261
+ export function projectMembershipTuple(op, projectId, userId, role) {
262
+ return {
263
+ operation: op,
264
+ user: userSubject(userId),
265
+ relation: role,
266
+ object: projectObject(projectId),
267
+ };
268
+ }
269
+ export function teamProjectGrantTuple(op, projectId, teamId, role) {
270
+ return {
271
+ operation: op,
272
+ user: teamMemberSubject(teamId),
273
+ relation: role,
274
+ object: projectObject(projectId),
275
+ };
276
+ }
277
+ function machineSubjectString(subject) {
278
+ return `${subject.kind}:${subject.id}`;
279
+ }
280
+ /**
281
+ * Generic machine-subject grant. Works for both `agent` and
282
+ * `service_account` — the capability relations admit both.
283
+ */
284
+ export function machineAccessTuple(op, subject, resource) {
285
+ const subjectString = machineSubjectString(subject);
286
+ switch (resource.type) {
287
+ case 'tool':
288
+ return {
289
+ operation: op,
290
+ user: subjectString,
291
+ relation: 'invoker',
292
+ object: toolObject(resource.id),
293
+ };
294
+ case 'flow':
295
+ return {
296
+ operation: op,
297
+ user: subjectString,
298
+ relation: 'executor',
299
+ object: flowObject(resource.id),
300
+ };
301
+ case 'eval_suite':
302
+ return {
303
+ operation: op,
304
+ user: subjectString,
305
+ relation: 'executor',
306
+ object: evalSuiteObject(resource.id),
307
+ };
308
+ case 'agent':
309
+ return {
310
+ operation: op,
311
+ user: subjectString,
312
+ relation: 'caller',
313
+ object: agentObject(resource.id),
314
+ };
315
+ case 'secret':
316
+ return {
317
+ operation: op,
318
+ user: subjectString,
319
+ relation: 'reader',
320
+ object: secretObject(resource.id),
321
+ };
322
+ case 'env':
323
+ return {
324
+ operation: op,
325
+ user: subjectString,
326
+ relation: 'reader',
327
+ object: envObject(resource.id),
328
+ };
329
+ case 'mcp_endpoint':
330
+ return {
331
+ operation: op,
332
+ user: subjectString,
333
+ relation: 'reader',
334
+ object: mcpEndpointObject(resource.id),
335
+ };
336
+ }
337
+ }
338
+ /**
339
+ * Agent-subject shorthand for
340
+ * `machineAccessTuple(op, { kind: 'agent', id: agentId }, resource)`.
341
+ */
342
+ export function agentAccessTuple(op, agentId, resource) {
343
+ return machineAccessTuple(op, { kind: 'agent', id: agentId }, resource);
344
+ }
345
+ // ============================================================
346
+ // INTERNAL HELPERS
347
+ // ============================================================
348
+ function contentObject(entity) {
349
+ switch (entity.kind) {
350
+ case 'agent':
351
+ return agentObject(entity.id);
352
+ case 'flow':
353
+ return flowObject(entity.id);
354
+ case 'tool':
355
+ return toolObject(entity.id);
356
+ case 'guardrail':
357
+ return guardrailObject(entity.id);
358
+ case 'eval_suite':
359
+ return evalSuiteObject(entity.id);
360
+ }
361
+ }
362
+ function configObject(entity) {
363
+ switch (entity.kind) {
364
+ case 'secret':
365
+ return secretObject(entity.id);
366
+ case 'env':
367
+ return envObject(entity.id);
368
+ case 'mcp_endpoint':
369
+ return mcpEndpointObject(entity.id);
370
+ }
371
+ }
372
+ //# sourceMappingURL=tuples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuples.js","sourceRoot":"","sources":["../src/tuples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const OBJECT_TYPES: readonly ["tenant", "org", "team", "project", "user", "agent", "flow", "tool", "guardrail", "eval_suite", "trigger", "conversation", "secret", "env", "mcp_endpoint", "run"];
2
+ export type ObjectType = (typeof OBJECT_TYPES)[number];
3
+ export declare const ACTIONS: readonly ["read", "write", "delete", "admin", "execute", "invoke", "publish", "rotate", "fire", "cancel"];
4
+ export type Action = (typeof ACTIONS)[number];
5
+ export declare const ACTION_TO_RELATION: Record<Action, string>;
6
+ export declare const OBJECT_ACTIONS: Record<ObjectType, readonly Action[]>;
7
+ export interface ResourceRef {
8
+ readonly type: ObjectType;
9
+ readonly id: string;
10
+ }
11
+ export declare function resourceKey(ref: ResourceRef): string;
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,YAAY,8KAqBf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,OAAO,2GAWV,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWrD,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAoBhE,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAEpD"}