@palettelab/sdk 0.1.12 → 0.1.14

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
@@ -122,15 +122,30 @@ import {
122
122
  PluginProvider,
123
123
  usePlatform,
124
124
  createPaletteClient,
125
+ DataRoomClient,
126
+ StorageClient,
125
127
  usePluginTranslations,
128
+ translate,
129
+ normalizePaletteLanguage,
126
130
  usePluginTasks,
127
131
  usePluginDataRooms,
128
132
  usePluginChat,
129
133
  apiFetch,
130
134
  apiUpload,
135
+ setBaseUrl,
136
+ getBaseUrl,
131
137
  createSandboxBridge,
138
+ isSandboxRuntime,
132
139
  getInstallConfig,
133
140
  updateInstallConfig,
141
+ hasPermission,
142
+ hasAnyPermission,
143
+ hasAllPermissions,
144
+ PaletteApiError,
145
+ errorFromResponse,
146
+ isPaletteApiError,
147
+ createMockPlatformContext,
148
+ withPluginProvider,
134
149
  } from "@palettelab/sdk"
135
150
  ```
136
151
 
@@ -142,6 +157,25 @@ import type { PluginManifest } from "@palettelab/sdk/types"
142
157
  import { PluginProvider } from "@palettelab/sdk/components"
143
158
  ```
144
159
 
160
+ ## Helper Reference
161
+
162
+ Public frontend helpers exported by `@palettelab/sdk`:
163
+
164
+ - Provider/context: `PluginProvider`, `usePlatform`, `PlatformCtx`.
165
+ - Client facade: `createPaletteClient(platform?)`.
166
+ - API: `apiFetch(path, init?)`, `apiUpload(path, file, fieldName?, extraFields?)`, `setBaseUrl(url)`, `getBaseUrl()`.
167
+ - Errors: `PaletteApiError`, `errorFromResponse(response)`, `isPaletteApiError(error)`.
168
+ - Data Rooms: `DataRoomClient`, `dataRooms`, plus `list`, `create`, `get`, `folder`, `ensureRoom`, `requireRoomByName`, `findRoomByName`, `createFolder`, `ensureFolder`, `findFolderByName`, `resolveFolderPath`, `findFileByName`, `requestUpload`, `confirmUpload`, and `uploadFile`.
169
+ - Storage: `StorageClient`, `uploadToSignedUrl(uploadUrl, file, contentType?)`.
170
+ - Install config: `getInstallConfig(pluginId)`, `updateInstallConfig(pluginId, values)`.
171
+ - Organization/user: `UserClient`, `OrganizationClient`, including `current`, `updateProfile`, `listMine`, `listMembers`, `getMember`, `getMemberByEmail`, `inviteMember`, and `updateMemberRole`.
172
+ - Permissions: `hasPermission(ctx, permission)`, `hasAnyPermission(ctx, permissions)`, `hasAllPermissions(ctx, permissions)`.
173
+ - Translations: `normalizePaletteLanguage`, `translate`, `usePluginTranslations`.
174
+ - Hooks: `usePluginTasks`, `usePluginDataRooms`, `usePluginChat`.
175
+ - Sandbox: `createSandboxBridge`, `isSandboxRuntime`.
176
+ - Testing: `createMockPlatformContext`, `withPluginProvider`.
177
+ - Types: `PluginManifest`, `PluginComponentProps`, `PlatformContext`, `PaletteClient`, resource, task, chat, data-room, user, organization, translation, and sandbox bridge types.
178
+
145
179
  ## Plugin Root
146
180
 
147
181
  The platform passes plugin runtime context into your root component. Wrap your UI with `PluginProvider` so hooks can read it.
@@ -248,7 +282,7 @@ function App() {
248
282
  Included clients:
249
283
 
250
284
  - `palette.user.current()` and `palette.user.updateProfile()`
251
- - `palette.organization.currentId()`, `currentRole()`, and `listMine()`
285
+ - `palette.organization.currentId()`, `currentRole()`, `listMine()`, `listMembers()`, `getMember()`, `getMemberByEmail()`, `inviteMember()`, and `updateMemberRole()`
252
286
  - `palette.dataRooms.list()`, `create()`, `get()`, `folder()`, `createFolder()`, `ensureFolder()`, `findRoomByName()`, `findFolderByName()`, `resolveFolderPath()`, `findFileByName()`, and `uploadFile()`
253
287
  - `palette.config.get()` and `palette.config.update(values)`, with optional plugin ID override
254
288
  - `palette.permissions.has()`, `hasAny()`, and `hasAll()`
@@ -258,6 +292,12 @@ Included clients:
258
292
  These helpers are intentionally thin wrappers over platform APIs. Apps can still
259
293
  use `apiFetch()` directly for custom backend routes.
260
294
 
295
+ Member helpers operate on the active organisation. Use `members:read` for
296
+ listing or looking up members, and `members:write` for invitations or role
297
+ updates. When the runtime provides declared app permissions, these helpers check
298
+ those permissions before calling the platform API. Member deletion/removal is
299
+ intentionally not exposed through the app SDK.
300
+
261
301
  ### Data Room Folders By Name
262
302
 
263
303
  Apps can create or reuse custom Data Room folders by name:
@@ -358,8 +398,8 @@ Plugins can read and update their installation configuration through helper APIs
358
398
  ```ts
359
399
  import { getInstallConfig, updateInstallConfig } from "@palettelab/sdk"
360
400
 
361
- const config = await getInstallConfig()
362
- await updateInstallConfig({ ...config, enabled: true })
401
+ const config = await getInstallConfig("my-plugin")
402
+ await updateInstallConfig("my-plugin", { ...config, enabled: true })
363
403
  ```
364
404
 
365
405
  ## Sandbox Bridge
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.14",
4
4
  "description": "Palette Platform SDK for building plugins and apps",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",