@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 +43 -3
- package/dist/index.d.mts +25 -1
- package/dist/index.d.ts +25 -1
- package/dist/index.js +38 -0
- package/dist/index.mjs +38 -0
- package/package.json +1 -1
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 `
|
|
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
|