@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.
- package/LICENSE +201 -0
- package/README.md +66 -2
- package/dist/check.d.ts +68 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +11 -0
- package/dist/check.js.map +1 -0
- package/dist/enqueue.d.ts +28 -0
- package/dist/enqueue.d.ts.map +1 -0
- package/dist/enqueue.js +4 -0
- package/dist/enqueue.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/pep.d.ts +46 -0
- package/dist/pep.d.ts.map +1 -0
- package/dist/pep.js +33 -0
- package/dist/pep.js.map +1 -0
- package/dist/principal.d.ts +60 -0
- package/dist/principal.d.ts.map +1 -0
- package/dist/principal.js +71 -0
- package/dist/principal.js.map +1 -0
- package/dist/reviewer.d.ts +8 -0
- package/dist/reviewer.d.ts.map +1 -0
- package/dist/reviewer.js +13 -0
- package/dist/reviewer.js.map +1 -0
- package/dist/tuples.d.ts +142 -0
- package/dist/tuples.d.ts.map +1 -0
- package/dist/tuples.js +372 -0
- package/dist/tuples.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +86 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -4
- package/src/check.ts +96 -0
- package/src/enqueue.ts +42 -0
- package/src/index.ts +10 -0
- package/src/pep.ts +87 -0
- package/src/principal.ts +157 -0
- package/src/reviewer.ts +31 -0
- package/src/tuples.ts +595 -0
- package/src/types.ts +103 -0
|
@@ -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"}
|
package/dist/reviewer.js
ADDED
|
@@ -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"}
|
package/dist/tuples.d.ts
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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"}
|