@palettelab/sdk 0.1.12 → 0.1.13

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/README.md CHANGED
@@ -248,7 +248,7 @@ function App() {
248
248
  Included clients:
249
249
 
250
250
  - `palette.user.current()` and `palette.user.updateProfile()`
251
- - `palette.organization.currentId()`, `currentRole()`, and `listMine()`
251
+ - `palette.organization.currentId()`, `currentRole()`, `listMine()`, `listMembers()`, `getMember()`, `getMemberByEmail()`, `inviteMember()`, and `updateMemberRole()`
252
252
  - `palette.dataRooms.list()`, `create()`, `get()`, `folder()`, `createFolder()`, `ensureFolder()`, `findRoomByName()`, `findFolderByName()`, `resolveFolderPath()`, `findFileByName()`, and `uploadFile()`
253
253
  - `palette.config.get()` and `palette.config.update(values)`, with optional plugin ID override
254
254
  - `palette.permissions.has()`, `hasAny()`, and `hasAll()`
@@ -258,6 +258,12 @@ Included clients:
258
258
  These helpers are intentionally thin wrappers over platform APIs. Apps can still
259
259
  use `apiFetch()` directly for custom backend routes.
260
260
 
261
+ Member helpers operate on the active organisation. Use `members:read` for
262
+ listing or looking up members, and `members:write` for invitations or role
263
+ updates. When the runtime provides declared app permissions, these helpers check
264
+ those permissions before calling the platform API. Member deletion/removal is
265
+ intentionally not exposed through the app SDK.
266
+
261
267
  ### Data Room Folders By Name
262
268
 
263
269
  Apps can create or reuse custom Data Room folders by name:
package/dist/index.d.mts CHANGED
@@ -112,6 +112,24 @@ declare class StorageClient {
112
112
  uploadToSignedUrl: typeof uploadToSignedUrl;
113
113
  }
114
114
 
115
+ type OrgMemberRole = "owner" | "admin" | "member" | "viewer";
116
+ interface OrgMember {
117
+ id: string;
118
+ name: string;
119
+ email: string;
120
+ role: OrgMemberRole;
121
+ is_active: boolean;
122
+ joined_at: string;
123
+ }
124
+ interface OrgInviteMemberInput {
125
+ email: string;
126
+ role?: OrgMemberRole;
127
+ }
128
+ interface OrgInviteMemberResponse {
129
+ message: string;
130
+ email: string;
131
+ role: OrgMemberRole;
132
+ }
115
133
  declare class UserClient {
116
134
  private readonly ctx?;
117
135
  constructor(ctx?: PlatformContext | undefined);
@@ -124,9 +142,15 @@ declare class UserClient {
124
142
  declare class OrganizationClient {
125
143
  private readonly ctx?;
126
144
  constructor(ctx?: PlatformContext | undefined);
145
+ private assertPermission;
127
146
  currentId(): number | null;
128
147
  currentRole(): string | null;
129
148
  listMine(): Promise<OrgSummary[]>;
149
+ listMembers(): Promise<OrgMember[]>;
150
+ getMember(userId: string): Promise<OrgMember | null>;
151
+ getMemberByEmail(email: string): Promise<OrgMember | null>;
152
+ inviteMember(input: OrgInviteMemberInput): Promise<OrgInviteMemberResponse>;
153
+ updateMemberRole(userId: string, role: OrgMemberRole): Promise<OrgMember>;
130
154
  }
131
155
 
132
156
  declare function createPaletteClient(ctx?: PlatformContext): {
@@ -155,4 +179,4 @@ declare function hasPermission(ctx: PlatformContext, permission: string): boolea
155
179
  declare function hasAnyPermission(ctx: PlatformContext, permissions: string[]): boolean;
156
180
  declare function hasAllPermissions(ctx: PlatformContext, permissions: string[]): boolean;
157
181
 
158
- export { DataRoom, DataRoomClient, type DataRoomContents, DataRoomFile, DataRoomFolder, type DataRoomUploadOptions, type InstallConfig, OrgSummary, OrganizationClient, PaletteApiError, type PaletteClient, PlatformContext, type SandboxBridge, StorageClient, User, UserClient, apiFetch, apiUpload, createMockPlatformContext, createPaletteClient, createSandboxBridge, dataRooms, errorFromResponse, getBaseUrl, getInstallConfig, hasAllPermissions, hasAnyPermission, hasPermission, isPaletteApiError, isSandboxRuntime, setBaseUrl, updateInstallConfig, uploadToSignedUrl, withPluginProvider };
182
+ export { DataRoom, DataRoomClient, type DataRoomContents, DataRoomFile, DataRoomFolder, type DataRoomUploadOptions, type InstallConfig, type OrgInviteMemberInput, type OrgInviteMemberResponse, type OrgMember, type OrgMemberRole, OrgSummary, OrganizationClient, PaletteApiError, type PaletteClient, PlatformContext, type SandboxBridge, StorageClient, User, UserClient, apiFetch, apiUpload, createMockPlatformContext, createPaletteClient, createSandboxBridge, dataRooms, errorFromResponse, getBaseUrl, getInstallConfig, hasAllPermissions, hasAnyPermission, hasPermission, isPaletteApiError, isSandboxRuntime, setBaseUrl, updateInstallConfig, uploadToSignedUrl, withPluginProvider };
package/dist/index.d.ts CHANGED
@@ -112,6 +112,24 @@ declare class StorageClient {
112
112
  uploadToSignedUrl: typeof uploadToSignedUrl;
113
113
  }
114
114
 
115
+ type OrgMemberRole = "owner" | "admin" | "member" | "viewer";
116
+ interface OrgMember {
117
+ id: string;
118
+ name: string;
119
+ email: string;
120
+ role: OrgMemberRole;
121
+ is_active: boolean;
122
+ joined_at: string;
123
+ }
124
+ interface OrgInviteMemberInput {
125
+ email: string;
126
+ role?: OrgMemberRole;
127
+ }
128
+ interface OrgInviteMemberResponse {
129
+ message: string;
130
+ email: string;
131
+ role: OrgMemberRole;
132
+ }
115
133
  declare class UserClient {
116
134
  private readonly ctx?;
117
135
  constructor(ctx?: PlatformContext | undefined);
@@ -124,9 +142,15 @@ declare class UserClient {
124
142
  declare class OrganizationClient {
125
143
  private readonly ctx?;
126
144
  constructor(ctx?: PlatformContext | undefined);
145
+ private assertPermission;
127
146
  currentId(): number | null;
128
147
  currentRole(): string | null;
129
148
  listMine(): Promise<OrgSummary[]>;
149
+ listMembers(): Promise<OrgMember[]>;
150
+ getMember(userId: string): Promise<OrgMember | null>;
151
+ getMemberByEmail(email: string): Promise<OrgMember | null>;
152
+ inviteMember(input: OrgInviteMemberInput): Promise<OrgInviteMemberResponse>;
153
+ updateMemberRole(userId: string, role: OrgMemberRole): Promise<OrgMember>;
130
154
  }
131
155
 
132
156
  declare function createPaletteClient(ctx?: PlatformContext): {
@@ -155,4 +179,4 @@ declare function hasPermission(ctx: PlatformContext, permission: string): boolea
155
179
  declare function hasAnyPermission(ctx: PlatformContext, permissions: string[]): boolean;
156
180
  declare function hasAllPermissions(ctx: PlatformContext, permissions: string[]): boolean;
157
181
 
158
- export { DataRoom, DataRoomClient, type DataRoomContents, DataRoomFile, DataRoomFolder, type DataRoomUploadOptions, type InstallConfig, OrgSummary, OrganizationClient, PaletteApiError, type PaletteClient, PlatformContext, type SandboxBridge, StorageClient, User, UserClient, apiFetch, apiUpload, createMockPlatformContext, createPaletteClient, createSandboxBridge, dataRooms, errorFromResponse, getBaseUrl, getInstallConfig, hasAllPermissions, hasAnyPermission, hasPermission, isPaletteApiError, isSandboxRuntime, setBaseUrl, updateInstallConfig, uploadToSignedUrl, withPluginProvider };
182
+ export { DataRoom, DataRoomClient, type DataRoomContents, DataRoomFile, DataRoomFolder, type DataRoomUploadOptions, type InstallConfig, type OrgInviteMemberInput, type OrgInviteMemberResponse, type OrgMember, type OrgMemberRole, OrgSummary, OrganizationClient, PaletteApiError, type PaletteClient, PlatformContext, type SandboxBridge, StorageClient, User, UserClient, apiFetch, apiUpload, createMockPlatformContext, createPaletteClient, createSandboxBridge, dataRooms, errorFromResponse, getBaseUrl, getInstallConfig, hasAllPermissions, hasAnyPermission, hasPermission, isPaletteApiError, isSandboxRuntime, setBaseUrl, updateInstallConfig, uploadToSignedUrl, withPluginProvider };
package/dist/index.js CHANGED
@@ -395,6 +395,11 @@ var OrganizationClient = class {
395
395
  constructor(ctx) {
396
396
  this.ctx = ctx;
397
397
  }
398
+ assertPermission(permission) {
399
+ if (this.ctx?.permissions && !this.ctx.permissions.includes(permission)) {
400
+ throw new Error(`App does not declare required permission: ${permission}`);
401
+ }
402
+ }
398
403
  currentId() {
399
404
  return this.ctx?.organizationId ?? null;
400
405
  }
@@ -406,6 +411,39 @@ var OrganizationClient = class {
406
411
  const res = await apiFetch("/api/v1/auth/my-orgs");
407
412
  return res.json();
408
413
  }
414
+ async listMembers() {
415
+ this.assertPermission("members:read");
416
+ const res = await apiFetch("/api/v1/org/members");
417
+ return res.json();
418
+ }
419
+ async getMember(userId) {
420
+ const members = await this.listMembers();
421
+ return members.find((member) => member.id === userId) ?? null;
422
+ }
423
+ async getMemberByEmail(email) {
424
+ const normalizedEmail = email.trim().toLowerCase();
425
+ const members = await this.listMembers();
426
+ return members.find((member) => member.email.toLowerCase() === normalizedEmail) ?? null;
427
+ }
428
+ async inviteMember(input) {
429
+ this.assertPermission("members:write");
430
+ const res = await apiFetch("/api/v1/org/members", {
431
+ method: "POST",
432
+ body: JSON.stringify({
433
+ email: input.email,
434
+ role: input.role ?? "member"
435
+ })
436
+ });
437
+ return res.json();
438
+ }
439
+ async updateMemberRole(userId, role) {
440
+ this.assertPermission("members:write");
441
+ const res = await apiFetch(`/api/v1/org/members/${encodeURIComponent(userId)}/role`, {
442
+ method: "PATCH",
443
+ body: JSON.stringify({ role })
444
+ });
445
+ return res.json();
446
+ }
409
447
  };
410
448
 
411
449
  // src/palette-client.ts
package/dist/index.mjs CHANGED
@@ -338,6 +338,11 @@ var OrganizationClient = class {
338
338
  constructor(ctx) {
339
339
  this.ctx = ctx;
340
340
  }
341
+ assertPermission(permission) {
342
+ if (this.ctx?.permissions && !this.ctx.permissions.includes(permission)) {
343
+ throw new Error(`App does not declare required permission: ${permission}`);
344
+ }
345
+ }
341
346
  currentId() {
342
347
  return this.ctx?.organizationId ?? null;
343
348
  }
@@ -349,6 +354,39 @@ var OrganizationClient = class {
349
354
  const res = await apiFetch("/api/v1/auth/my-orgs");
350
355
  return res.json();
351
356
  }
357
+ async listMembers() {
358
+ this.assertPermission("members:read");
359
+ const res = await apiFetch("/api/v1/org/members");
360
+ return res.json();
361
+ }
362
+ async getMember(userId) {
363
+ const members = await this.listMembers();
364
+ return members.find((member) => member.id === userId) ?? null;
365
+ }
366
+ async getMemberByEmail(email) {
367
+ const normalizedEmail = email.trim().toLowerCase();
368
+ const members = await this.listMembers();
369
+ return members.find((member) => member.email.toLowerCase() === normalizedEmail) ?? null;
370
+ }
371
+ async inviteMember(input) {
372
+ this.assertPermission("members:write");
373
+ const res = await apiFetch("/api/v1/org/members", {
374
+ method: "POST",
375
+ body: JSON.stringify({
376
+ email: input.email,
377
+ role: input.role ?? "member"
378
+ })
379
+ });
380
+ return res.json();
381
+ }
382
+ async updateMemberRole(userId, role) {
383
+ this.assertPermission("members:write");
384
+ const res = await apiFetch(`/api/v1/org/members/${encodeURIComponent(userId)}/role`, {
385
+ method: "PATCH",
386
+ body: JSON.stringify({ role })
387
+ });
388
+ return res.json();
389
+ }
352
390
  };
353
391
 
354
392
  // src/palette-client.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@palettelab/sdk",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Palette Platform SDK for building plugins and apps",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",