@plandesk/api 1.0.0-beta.3 → 1.0.0-beta.4

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.
@@ -90,6 +90,7 @@ export declare const member: import("better-auth/plugins/access").Role<import("b
90
90
  }>;
91
91
  export declare const admin: import("better-auth/plugins/access").Role<import("better-auth/plugins/access").ExactRoleStatements<{
92
92
  readonly project: ["create", "delete"];
93
+ readonly invitation: ["create", "cancel"];
93
94
  readonly task: readonly ["read", "create", "update", "delete"];
94
95
  readonly document: readonly ["read", "create", "update", "delete"];
95
96
  readonly edge: readonly ["read", "create", "update", "delete"];
@@ -98,7 +99,6 @@ export declare const admin: import("better-auth/plugins/access").Role<import("be
98
99
  readonly agent_run: readonly ["read", "create", "update", "delete"];
99
100
  readonly organization: readonly [];
100
101
  readonly member: readonly [];
101
- readonly invitation: readonly [];
102
102
  readonly team: readonly [];
103
103
  readonly ac: readonly [];
104
104
  readonly apiKey: readonly [];
@@ -35,6 +35,10 @@ export const member = ac.newRole(memberPermissions);
35
35
  export const admin = ac.newRole({
36
36
  ...memberPermissions,
37
37
  project: ['create', 'delete'],
38
+ // Admins can invite teammates (as member or admin) and cancel invites, but
39
+ // cannot manage members directly (member:update/delete) or mint owners —
40
+ // better-auth blocks a non-owner inviting the creatorRole. Owner-only stays owner-only.
41
+ invitation: ['create', 'cancel'],
38
42
  });
39
43
  export const owner = ac.newRole({
40
44
  ...memberPermissions,
@@ -122,8 +122,9 @@ export function createOrgsRouter(db, options = {}) {
122
122
  return c.json({ members }, 200);
123
123
  });
124
124
  /**
125
- * BA3c: invite by email (link-only, no mailer). Session owner only
126
- * (member:create). Returns claimUrl for the inviter to deliver by hand.
125
+ * BA3c: invite by email (link-only, no mailer). Owners and admins may invite
126
+ * (invitation:create); better-auth still blocks a non-owner inviting an owner.
127
+ * Returns claimUrl for the inviter to deliver by hand.
127
128
  */
128
129
  router.post('/orgs/:id/invitations', async (c) => {
129
130
  const orgId = c.req.param('id');
@@ -131,11 +132,11 @@ export function createOrgsRouter(db, options = {}) {
131
132
  return c.json({ error: 'not_found' }, 404);
132
133
  }
133
134
  const authCtx = getOrgAuthContext();
134
- // Session owner only — token/loopback cannot drive better-auth createInvitation.
135
+ // Session only — token/loopback cannot drive better-auth createInvitation.
135
136
  if (authCtx.kind !== 'session') {
136
137
  return c.json({ error: 'forbidden' }, 403);
137
138
  }
138
- requirePermission(authCtx, 'member', 'create');
139
+ requirePermission(authCtx, 'invitation', 'create');
139
140
  if (betterAuth === undefined) {
140
141
  return c.json({ error: 'unavailable' }, 503);
141
142
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plandesk/api",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.4",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -26,7 +26,7 @@
26
26
  "@libsql/kysely-libsql": "^0.4.1",
27
27
  "better-auth": "1.6.23",
28
28
  "hono": "^4.12.23",
29
- "@plandesk/db": "1.0.0-beta.3"
29
+ "@plandesk/db": "1.0.0-beta.4"
30
30
  },
31
31
  "description": "Plan Desk REST + SSE API and service layer (local-first planning workspace).",
32
32
  "license": "MIT",