@inkeep/agents-core 0.0.0-dev-20260118170655 → 0.0.0-dev-20260119170007
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/dist/auth/auth-schema.d.ts +82 -82
- package/dist/auth/auth-validation-schemas.d.ts +146 -146
- package/dist/auth/auth.d.ts +78 -18
- package/dist/auth/auth.js +46 -0
- package/dist/auth/authz/client.d.ts +81 -0
- package/dist/auth/authz/client.js +189 -0
- package/dist/auth/authz/config.d.ts +76 -0
- package/dist/auth/authz/config.js +76 -0
- package/dist/auth/authz/index.d.ts +5 -0
- package/dist/auth/authz/index.js +6 -0
- package/dist/auth/authz/permissions.d.ts +57 -0
- package/dist/auth/authz/permissions.js +83 -0
- package/dist/auth/authz/sync.d.ts +85 -0
- package/dist/auth/authz/sync.js +237 -0
- package/dist/auth/permissions.d.ts +13 -13
- package/dist/auth/permissions.js +2 -181
- package/dist/client-exports.d.ts +1 -0
- package/dist/data-access/manage/agentFull.js +51 -2
- package/dist/data-access/manage/projectLifecycle.d.ts +1 -0
- package/dist/data-access/manage/projectLifecycle.js +3 -2
- package/dist/data-access/manage/projects.d.ts +4 -0
- package/dist/data-access/manage/projects.js +11 -4
- package/dist/data-access/runtime/conversations.d.ts +7 -7
- package/dist/data-access/runtime/messages.d.ts +9 -9
- package/dist/data-access/runtime/projects.d.ts +2 -0
- package/dist/data-access/runtime/projects.js +16 -2
- package/dist/data-access/runtime/tasks.d.ts +4 -4
- package/dist/db/manage/manage-schema.d.ts +360 -360
- package/dist/db/runtime/runtime-schema.d.ts +169 -169
- package/dist/index.d.ts +6 -1
- package/dist/index.js +6 -1
- package/dist/validation/dolt-schemas.d.ts +1 -1
- package/dist/validation/drizzle-schema-helpers.d.ts +3 -3
- package/dist/validation/schemas.d.ts +1180 -1180
- package/package.json +6 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { OrgRole } from "./config.js";
|
|
2
|
+
|
|
3
|
+
//#region src/auth/authz/permissions.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Check if a user can view a project.
|
|
7
|
+
*
|
|
8
|
+
* - If authz is disabled: returns true (current behavior)
|
|
9
|
+
* - If user is org owner/admin: returns true (bypass)
|
|
10
|
+
* - Otherwise: checks SpiceDB
|
|
11
|
+
*/
|
|
12
|
+
declare function canViewProject(params: {
|
|
13
|
+
tenantId: string;
|
|
14
|
+
userId: string;
|
|
15
|
+
projectId: string;
|
|
16
|
+
orgRole: OrgRole;
|
|
17
|
+
}): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a user can use a project (invoke agents, create API keys, view traces).
|
|
20
|
+
*
|
|
21
|
+
* - If authz is disabled: returns true (current behavior)
|
|
22
|
+
* - If user is org owner/admin: returns true (bypass)
|
|
23
|
+
* - Otherwise: checks SpiceDB for use permission
|
|
24
|
+
*/
|
|
25
|
+
declare function canUseProject(params: {
|
|
26
|
+
tenantId: string;
|
|
27
|
+
userId: string;
|
|
28
|
+
projectId: string;
|
|
29
|
+
orgRole: OrgRole;
|
|
30
|
+
}): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a user can edit a project (modify configurations).
|
|
33
|
+
*
|
|
34
|
+
* - If authz is disabled: only org owner/admin can edit
|
|
35
|
+
* - If user is org owner/admin: returns true (bypass)
|
|
36
|
+
* - Otherwise: checks SpiceDB for edit permission
|
|
37
|
+
*/
|
|
38
|
+
declare function canEditProject(params: {
|
|
39
|
+
tenantId: string;
|
|
40
|
+
userId: string;
|
|
41
|
+
projectId: string;
|
|
42
|
+
orgRole: OrgRole;
|
|
43
|
+
}): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Get list of accessible project IDs for a user.
|
|
46
|
+
*
|
|
47
|
+
* - If authz is disabled: returns 'all' (no filtering needed)
|
|
48
|
+
* - If user is org owner/admin: returns 'all' (no filtering needed)
|
|
49
|
+
* - Otherwise: uses SpiceDB LookupResources
|
|
50
|
+
*/
|
|
51
|
+
declare function listAccessibleProjectIds(params: {
|
|
52
|
+
tenantId: string;
|
|
53
|
+
userId: string;
|
|
54
|
+
orgRole: OrgRole;
|
|
55
|
+
}): Promise<string[] | 'all'>;
|
|
56
|
+
//#endregion
|
|
57
|
+
export { canEditProject, canUseProject, canViewProject, listAccessibleProjectIds };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { SpiceDbPermissions, SpiceDbResourceTypes, isAuthzEnabled } from "./config.js";
|
|
2
|
+
import { checkPermission, lookupResources } from "./client.js";
|
|
3
|
+
|
|
4
|
+
//#region src/auth/authz/permissions.ts
|
|
5
|
+
/**
|
|
6
|
+
* SpiceDB Permission Check Functions
|
|
7
|
+
*
|
|
8
|
+
* High-level functions for checking project-level permissions.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Check if a user can view a project.
|
|
12
|
+
*
|
|
13
|
+
* - If authz is disabled: returns true (current behavior)
|
|
14
|
+
* - If user is org owner/admin: returns true (bypass)
|
|
15
|
+
* - Otherwise: checks SpiceDB
|
|
16
|
+
*/
|
|
17
|
+
async function canViewProject(params) {
|
|
18
|
+
if (!isAuthzEnabled(params.tenantId)) return true;
|
|
19
|
+
if (params.orgRole === "owner" || params.orgRole === "admin") return true;
|
|
20
|
+
return checkPermission({
|
|
21
|
+
resourceType: SpiceDbResourceTypes.PROJECT,
|
|
22
|
+
resourceId: params.projectId,
|
|
23
|
+
permission: SpiceDbPermissions.VIEW,
|
|
24
|
+
subjectType: SpiceDbResourceTypes.USER,
|
|
25
|
+
subjectId: params.userId
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if a user can use a project (invoke agents, create API keys, view traces).
|
|
30
|
+
*
|
|
31
|
+
* - If authz is disabled: returns true (current behavior)
|
|
32
|
+
* - If user is org owner/admin: returns true (bypass)
|
|
33
|
+
* - Otherwise: checks SpiceDB for use permission
|
|
34
|
+
*/
|
|
35
|
+
async function canUseProject(params) {
|
|
36
|
+
if (!isAuthzEnabled(params.tenantId)) return true;
|
|
37
|
+
if (params.orgRole === "owner" || params.orgRole === "admin") return true;
|
|
38
|
+
return checkPermission({
|
|
39
|
+
resourceType: SpiceDbResourceTypes.PROJECT,
|
|
40
|
+
resourceId: params.projectId,
|
|
41
|
+
permission: SpiceDbPermissions.USE,
|
|
42
|
+
subjectType: SpiceDbResourceTypes.USER,
|
|
43
|
+
subjectId: params.userId
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if a user can edit a project (modify configurations).
|
|
48
|
+
*
|
|
49
|
+
* - If authz is disabled: only org owner/admin can edit
|
|
50
|
+
* - If user is org owner/admin: returns true (bypass)
|
|
51
|
+
* - Otherwise: checks SpiceDB for edit permission
|
|
52
|
+
*/
|
|
53
|
+
async function canEditProject(params) {
|
|
54
|
+
if (!isAuthzEnabled(params.tenantId)) return params.orgRole === "owner" || params.orgRole === "admin";
|
|
55
|
+
if (params.orgRole === "owner" || params.orgRole === "admin") return true;
|
|
56
|
+
return checkPermission({
|
|
57
|
+
resourceType: SpiceDbResourceTypes.PROJECT,
|
|
58
|
+
resourceId: params.projectId,
|
|
59
|
+
permission: SpiceDbPermissions.EDIT,
|
|
60
|
+
subjectType: SpiceDbResourceTypes.USER,
|
|
61
|
+
subjectId: params.userId
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get list of accessible project IDs for a user.
|
|
66
|
+
*
|
|
67
|
+
* - If authz is disabled: returns 'all' (no filtering needed)
|
|
68
|
+
* - If user is org owner/admin: returns 'all' (no filtering needed)
|
|
69
|
+
* - Otherwise: uses SpiceDB LookupResources
|
|
70
|
+
*/
|
|
71
|
+
async function listAccessibleProjectIds(params) {
|
|
72
|
+
if (!isAuthzEnabled(params.tenantId)) return "all";
|
|
73
|
+
if (params.orgRole === "owner" || params.orgRole === "admin") return "all";
|
|
74
|
+
return lookupResources({
|
|
75
|
+
resourceType: SpiceDbResourceTypes.PROJECT,
|
|
76
|
+
permission: SpiceDbPermissions.VIEW,
|
|
77
|
+
subjectType: SpiceDbResourceTypes.USER,
|
|
78
|
+
subjectId: params.userId
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
//#endregion
|
|
83
|
+
export { canEditProject, canUseProject, canViewProject, listAccessibleProjectIds };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { OrgRole, ProjectRole } from "./config.js";
|
|
2
|
+
|
|
3
|
+
//#region src/auth/authz/sync.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Sync a user's org membership to SpiceDB.
|
|
7
|
+
* Call when: user joins org, role changes, user leaves org.
|
|
8
|
+
*/
|
|
9
|
+
declare function syncOrgMemberToSpiceDb(params: {
|
|
10
|
+
tenantId: string;
|
|
11
|
+
userId: string;
|
|
12
|
+
role: OrgRole;
|
|
13
|
+
action: 'add' | 'remove';
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Change a user's organization role.
|
|
17
|
+
* Removes the old role and adds the new one atomically in a single transaction.
|
|
18
|
+
* Call when: user's org role is updated (e.g., member -> admin).
|
|
19
|
+
*/
|
|
20
|
+
declare function changeOrgRole(params: {
|
|
21
|
+
tenantId: string;
|
|
22
|
+
userId: string;
|
|
23
|
+
oldRole: OrgRole;
|
|
24
|
+
newRole: OrgRole;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Sync a new project to SpiceDB.
|
|
28
|
+
* Links project to org and grants creator project_admin role.
|
|
29
|
+
* Call when: project is created.
|
|
30
|
+
*/
|
|
31
|
+
declare function syncProjectToSpiceDb(params: {
|
|
32
|
+
tenantId: string;
|
|
33
|
+
projectId: string;
|
|
34
|
+
creatorUserId: string;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Grant project access to a user.
|
|
38
|
+
*/
|
|
39
|
+
declare function grantProjectAccess(params: {
|
|
40
|
+
tenantId: string;
|
|
41
|
+
projectId: string;
|
|
42
|
+
userId: string;
|
|
43
|
+
role: ProjectRole;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Revoke project access from a user.
|
|
47
|
+
*/
|
|
48
|
+
declare function revokeProjectAccess(params: {
|
|
49
|
+
tenantId: string;
|
|
50
|
+
projectId: string;
|
|
51
|
+
userId: string;
|
|
52
|
+
role: ProjectRole;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Change a user's project role.
|
|
56
|
+
* Removes the old role and adds the new one atomically in a single transaction.
|
|
57
|
+
*/
|
|
58
|
+
declare function changeProjectRole(params: {
|
|
59
|
+
tenantId: string;
|
|
60
|
+
projectId: string;
|
|
61
|
+
userId: string;
|
|
62
|
+
oldRole: ProjectRole;
|
|
63
|
+
newRole: ProjectRole;
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Remove a project from SpiceDB.
|
|
67
|
+
* Call when: project is deleted.
|
|
68
|
+
*/
|
|
69
|
+
declare function removeProjectFromSpiceDb(params: {
|
|
70
|
+
tenantId: string;
|
|
71
|
+
projectId: string;
|
|
72
|
+
}): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* List all explicit project members from SpiceDB.
|
|
75
|
+
* Returns users with project_admin, project_member, or project_viewer roles.
|
|
76
|
+
*/
|
|
77
|
+
declare function listProjectMembers(params: {
|
|
78
|
+
tenantId: string;
|
|
79
|
+
projectId: string;
|
|
80
|
+
}): Promise<Array<{
|
|
81
|
+
userId: string;
|
|
82
|
+
role: ProjectRole;
|
|
83
|
+
}>>;
|
|
84
|
+
//#endregion
|
|
85
|
+
export { changeOrgRole, changeProjectRole, grantProjectAccess, listProjectMembers, removeProjectFromSpiceDb, revokeProjectAccess, syncOrgMemberToSpiceDb, syncProjectToSpiceDb };
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { SpiceDbRelations, SpiceDbResourceTypes, isAuthzEnabled } from "./config.js";
|
|
2
|
+
import { deleteRelationship, getSpiceClient, readRelationships, writeRelationship } from "./client.js";
|
|
3
|
+
|
|
4
|
+
//#region src/auth/authz/sync.ts
|
|
5
|
+
/**
|
|
6
|
+
* SpiceDB Sync Utilities
|
|
7
|
+
*
|
|
8
|
+
* Functions for syncing data between better-auth and SpiceDB.
|
|
9
|
+
*/
|
|
10
|
+
const RELATIONSHIP_OPERATION_CREATE = 1;
|
|
11
|
+
const RELATIONSHIP_OPERATION_TOUCH = 2;
|
|
12
|
+
const RELATIONSHIP_OPERATION_DELETE = 3;
|
|
13
|
+
/**
|
|
14
|
+
* Sync a user's org membership to SpiceDB.
|
|
15
|
+
* Call when: user joins org, role changes, user leaves org.
|
|
16
|
+
*/
|
|
17
|
+
async function syncOrgMemberToSpiceDb(params) {
|
|
18
|
+
if (!isAuthzEnabled(params.tenantId)) return;
|
|
19
|
+
if (params.action === "add") await writeRelationship({
|
|
20
|
+
resourceType: SpiceDbResourceTypes.ORGANIZATION,
|
|
21
|
+
resourceId: params.tenantId,
|
|
22
|
+
relation: params.role,
|
|
23
|
+
subjectType: SpiceDbResourceTypes.USER,
|
|
24
|
+
subjectId: params.userId
|
|
25
|
+
});
|
|
26
|
+
else await deleteRelationship({
|
|
27
|
+
resourceType: SpiceDbResourceTypes.ORGANIZATION,
|
|
28
|
+
resourceId: params.tenantId,
|
|
29
|
+
relation: params.role,
|
|
30
|
+
subjectType: SpiceDbResourceTypes.USER,
|
|
31
|
+
subjectId: params.userId
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Change a user's organization role.
|
|
36
|
+
* Removes the old role and adds the new one atomically in a single transaction.
|
|
37
|
+
* Call when: user's org role is updated (e.g., member -> admin).
|
|
38
|
+
*/
|
|
39
|
+
async function changeOrgRole(params) {
|
|
40
|
+
if (!isAuthzEnabled(params.tenantId)) return;
|
|
41
|
+
if (params.oldRole === params.newRole) return;
|
|
42
|
+
await getSpiceClient().promises.writeRelationships({
|
|
43
|
+
updates: [{
|
|
44
|
+
operation: RELATIONSHIP_OPERATION_DELETE,
|
|
45
|
+
relationship: {
|
|
46
|
+
resource: {
|
|
47
|
+
objectType: SpiceDbResourceTypes.ORGANIZATION,
|
|
48
|
+
objectId: params.tenantId
|
|
49
|
+
},
|
|
50
|
+
relation: params.oldRole,
|
|
51
|
+
subject: {
|
|
52
|
+
object: {
|
|
53
|
+
objectType: SpiceDbResourceTypes.USER,
|
|
54
|
+
objectId: params.userId
|
|
55
|
+
},
|
|
56
|
+
optionalRelation: ""
|
|
57
|
+
},
|
|
58
|
+
optionalCaveat: void 0
|
|
59
|
+
}
|
|
60
|
+
}, {
|
|
61
|
+
operation: RELATIONSHIP_OPERATION_TOUCH,
|
|
62
|
+
relationship: {
|
|
63
|
+
resource: {
|
|
64
|
+
objectType: SpiceDbResourceTypes.ORGANIZATION,
|
|
65
|
+
objectId: params.tenantId
|
|
66
|
+
},
|
|
67
|
+
relation: params.newRole,
|
|
68
|
+
subject: {
|
|
69
|
+
object: {
|
|
70
|
+
objectType: SpiceDbResourceTypes.USER,
|
|
71
|
+
objectId: params.userId
|
|
72
|
+
},
|
|
73
|
+
optionalRelation: ""
|
|
74
|
+
},
|
|
75
|
+
optionalCaveat: void 0
|
|
76
|
+
}
|
|
77
|
+
}],
|
|
78
|
+
optionalPreconditions: [],
|
|
79
|
+
optionalTransactionMetadata: void 0
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Sync a new project to SpiceDB.
|
|
84
|
+
* Links project to org and grants creator project_admin role.
|
|
85
|
+
* Call when: project is created.
|
|
86
|
+
*/
|
|
87
|
+
async function syncProjectToSpiceDb(params) {
|
|
88
|
+
if (!isAuthzEnabled(params.tenantId)) return;
|
|
89
|
+
await getSpiceClient().promises.writeRelationships({
|
|
90
|
+
updates: [{
|
|
91
|
+
operation: RELATIONSHIP_OPERATION_CREATE,
|
|
92
|
+
relationship: {
|
|
93
|
+
resource: {
|
|
94
|
+
objectType: SpiceDbResourceTypes.PROJECT,
|
|
95
|
+
objectId: params.projectId
|
|
96
|
+
},
|
|
97
|
+
relation: SpiceDbRelations.ORGANIZATION,
|
|
98
|
+
subject: {
|
|
99
|
+
object: {
|
|
100
|
+
objectType: SpiceDbResourceTypes.ORGANIZATION,
|
|
101
|
+
objectId: params.tenantId
|
|
102
|
+
},
|
|
103
|
+
optionalRelation: ""
|
|
104
|
+
},
|
|
105
|
+
optionalCaveat: void 0
|
|
106
|
+
}
|
|
107
|
+
}, {
|
|
108
|
+
operation: RELATIONSHIP_OPERATION_CREATE,
|
|
109
|
+
relationship: {
|
|
110
|
+
resource: {
|
|
111
|
+
objectType: SpiceDbResourceTypes.PROJECT,
|
|
112
|
+
objectId: params.projectId
|
|
113
|
+
},
|
|
114
|
+
relation: SpiceDbRelations.PROJECT_ADMIN,
|
|
115
|
+
subject: {
|
|
116
|
+
object: {
|
|
117
|
+
objectType: SpiceDbResourceTypes.USER,
|
|
118
|
+
objectId: params.creatorUserId
|
|
119
|
+
},
|
|
120
|
+
optionalRelation: ""
|
|
121
|
+
},
|
|
122
|
+
optionalCaveat: void 0
|
|
123
|
+
}
|
|
124
|
+
}],
|
|
125
|
+
optionalPreconditions: [],
|
|
126
|
+
optionalTransactionMetadata: void 0
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Grant project access to a user.
|
|
131
|
+
*/
|
|
132
|
+
async function grantProjectAccess(params) {
|
|
133
|
+
if (!isAuthzEnabled(params.tenantId)) throw new Error("Authorization is not enabled");
|
|
134
|
+
await writeRelationship({
|
|
135
|
+
resourceType: SpiceDbResourceTypes.PROJECT,
|
|
136
|
+
resourceId: params.projectId,
|
|
137
|
+
relation: params.role,
|
|
138
|
+
subjectType: SpiceDbResourceTypes.USER,
|
|
139
|
+
subjectId: params.userId
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Revoke project access from a user.
|
|
144
|
+
*/
|
|
145
|
+
async function revokeProjectAccess(params) {
|
|
146
|
+
if (!isAuthzEnabled(params.tenantId)) throw new Error("Authorization is not enabled");
|
|
147
|
+
await deleteRelationship({
|
|
148
|
+
resourceType: SpiceDbResourceTypes.PROJECT,
|
|
149
|
+
resourceId: params.projectId,
|
|
150
|
+
relation: params.role,
|
|
151
|
+
subjectType: SpiceDbResourceTypes.USER,
|
|
152
|
+
subjectId: params.userId
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Change a user's project role.
|
|
157
|
+
* Removes the old role and adds the new one atomically in a single transaction.
|
|
158
|
+
*/
|
|
159
|
+
async function changeProjectRole(params) {
|
|
160
|
+
if (!isAuthzEnabled(params.tenantId)) throw new Error("Authorization is not enabled");
|
|
161
|
+
if (params.oldRole === params.newRole) return;
|
|
162
|
+
await getSpiceClient().promises.writeRelationships({
|
|
163
|
+
updates: [{
|
|
164
|
+
operation: RELATIONSHIP_OPERATION_DELETE,
|
|
165
|
+
relationship: {
|
|
166
|
+
resource: {
|
|
167
|
+
objectType: SpiceDbResourceTypes.PROJECT,
|
|
168
|
+
objectId: params.projectId
|
|
169
|
+
},
|
|
170
|
+
relation: params.oldRole,
|
|
171
|
+
subject: {
|
|
172
|
+
object: {
|
|
173
|
+
objectType: SpiceDbResourceTypes.USER,
|
|
174
|
+
objectId: params.userId
|
|
175
|
+
},
|
|
176
|
+
optionalRelation: ""
|
|
177
|
+
},
|
|
178
|
+
optionalCaveat: void 0
|
|
179
|
+
}
|
|
180
|
+
}, {
|
|
181
|
+
operation: RELATIONSHIP_OPERATION_TOUCH,
|
|
182
|
+
relationship: {
|
|
183
|
+
resource: {
|
|
184
|
+
objectType: SpiceDbResourceTypes.PROJECT,
|
|
185
|
+
objectId: params.projectId
|
|
186
|
+
},
|
|
187
|
+
relation: params.newRole,
|
|
188
|
+
subject: {
|
|
189
|
+
object: {
|
|
190
|
+
objectType: SpiceDbResourceTypes.USER,
|
|
191
|
+
objectId: params.userId
|
|
192
|
+
},
|
|
193
|
+
optionalRelation: ""
|
|
194
|
+
},
|
|
195
|
+
optionalCaveat: void 0
|
|
196
|
+
}
|
|
197
|
+
}],
|
|
198
|
+
optionalPreconditions: [],
|
|
199
|
+
optionalTransactionMetadata: void 0
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Remove a project from SpiceDB.
|
|
204
|
+
* Call when: project is deleted.
|
|
205
|
+
*/
|
|
206
|
+
async function removeProjectFromSpiceDb(params) {
|
|
207
|
+
if (!isAuthzEnabled(params.tenantId)) return;
|
|
208
|
+
await getSpiceClient().promises.deleteRelationships({
|
|
209
|
+
relationshipFilter: {
|
|
210
|
+
resourceType: SpiceDbResourceTypes.PROJECT,
|
|
211
|
+
optionalResourceId: params.projectId,
|
|
212
|
+
optionalResourceIdPrefix: "",
|
|
213
|
+
optionalRelation: ""
|
|
214
|
+
},
|
|
215
|
+
optionalPreconditions: [],
|
|
216
|
+
optionalLimit: 0,
|
|
217
|
+
optionalAllowPartialDeletions: false,
|
|
218
|
+
optionalTransactionMetadata: void 0
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* List all explicit project members from SpiceDB.
|
|
223
|
+
* Returns users with project_admin, project_member, or project_viewer roles.
|
|
224
|
+
*/
|
|
225
|
+
async function listProjectMembers(params) {
|
|
226
|
+
if (!isAuthzEnabled(params.tenantId)) return [];
|
|
227
|
+
return (await readRelationships({
|
|
228
|
+
resourceType: SpiceDbResourceTypes.PROJECT,
|
|
229
|
+
resourceId: params.projectId
|
|
230
|
+
})).filter((rel) => rel.subjectType === SpiceDbResourceTypes.USER && (rel.relation === SpiceDbRelations.PROJECT_ADMIN || rel.relation === SpiceDbRelations.PROJECT_MEMBER || rel.relation === SpiceDbRelations.PROJECT_VIEWER)).map((rel) => ({
|
|
231
|
+
userId: rel.subjectId,
|
|
232
|
+
role: rel.relation
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
//#endregion
|
|
237
|
+
export { changeOrgRole, changeProjectRole, grantProjectAccess, listProjectMembers, removeProjectFromSpiceDb, revokeProjectAccess, syncOrgMemberToSpiceDb, syncProjectToSpiceDb };
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as better_auth_plugins69 from "better-auth/plugins";
|
|
2
2
|
import { AccessControl } from "better-auth/plugins/access";
|
|
3
3
|
import { organizationClient } from "better-auth/client/plugins";
|
|
4
4
|
|
|
5
5
|
//#region src/auth/permissions.d.ts
|
|
6
6
|
declare const ac: AccessControl;
|
|
7
7
|
declare const memberRole: {
|
|
8
|
-
authorize<K_1 extends "
|
|
9
|
-
actions:
|
|
8
|
+
authorize<K_1 extends "organization" | "ac" | "member" | "project" | "team" | "invitation">(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>[key] | {
|
|
9
|
+
actions: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>[key];
|
|
10
10
|
connector: "OR" | "AND";
|
|
11
|
-
} | undefined } : never, connector?: "OR" | "AND"):
|
|
12
|
-
statements:
|
|
11
|
+
} | undefined } : never, connector?: "OR" | "AND"): better_auth_plugins69.AuthorizeResponse;
|
|
12
|
+
statements: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>;
|
|
13
13
|
};
|
|
14
14
|
declare const adminRole: {
|
|
15
|
-
authorize<K_1 extends "
|
|
16
|
-
actions:
|
|
15
|
+
authorize<K_1 extends "organization" | "ac" | "member" | "project" | "team" | "invitation">(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>[key] | {
|
|
16
|
+
actions: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>[key];
|
|
17
17
|
connector: "OR" | "AND";
|
|
18
|
-
} | undefined } : never, connector?: "OR" | "AND"):
|
|
19
|
-
statements:
|
|
18
|
+
} | undefined } : never, connector?: "OR" | "AND"): better_auth_plugins69.AuthorizeResponse;
|
|
19
|
+
statements: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>;
|
|
20
20
|
};
|
|
21
21
|
declare const ownerRole: {
|
|
22
|
-
authorize<K_1 extends "
|
|
23
|
-
actions:
|
|
22
|
+
authorize<K_1 extends "organization" | "ac" | "member" | "project" | "team" | "invitation">(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>[key] | {
|
|
23
|
+
actions: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>[key];
|
|
24
24
|
connector: "OR" | "AND";
|
|
25
|
-
} | undefined } : never, connector?: "OR" | "AND"):
|
|
26
|
-
statements:
|
|
25
|
+
} | undefined } : never, connector?: "OR" | "AND"): better_auth_plugins69.AuthorizeResponse;
|
|
26
|
+
statements: better_auth_plugins69.Subset<"organization" | "ac" | "member" | "project" | "team" | "invitation", better_auth_plugins69.Statements>;
|
|
27
27
|
};
|
|
28
28
|
//#endregion
|
|
29
29
|
export { ac, adminRole, memberRole, organizationClient, ownerRole };
|