@palettelab/sdk 0.1.21 → 0.1.22

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
@@ -378,15 +378,17 @@ const unsubscribe = palette.events.on("hr/v1#hierarchy.updated", (payload) => {
378
378
  })
379
379
 
380
380
  await palette.events.emit("leave/v1#leave.requested", { user_id, chain })
381
+ await palette.events.publishDurable("leave/v1#leave.requested", { user_id, chain })
381
382
  unsubscribe()
382
383
  ```
383
384
 
384
385
  Use `palette.broker.call("hr/v1#approvalChain.get", payload)` for a low-level
385
386
  call when a generated helper is not available.
386
387
 
387
- `pltt services pull` generates TypeScript clients that import the SDK's default
388
- `palette` client and write calls such as `palette.broker.call(...)` under
389
- `.palette/types/services.ts`.
388
+ `pltt services pull` generates nested TypeScript clients under
389
+ `.palette/types/services.ts`, so app code can import helpers instead of
390
+ managing target strings by hand. Broker failures are surfaced as
391
+ `MissingDependencyError`, `CrossAppGrantError`, or `BrokerCallError`.
390
392
 
391
393
  ### Data Room Folders By Name
392
394
 
package/dist/index.d.mts CHANGED
@@ -137,6 +137,8 @@ type EventMeta = {
137
137
  declare const events: {
138
138
  on(target: string, handler: Handler): () => void;
139
139
  emit(target: string, payload?: unknown): Promise<void>;
140
+ publishDurable(target: string, payload?: unknown): Promise<void>;
141
+ emitDurable(target: string, payload?: unknown): Promise<void>;
140
142
  /** Diagnostic: list active subscriptions in this page. */
141
143
  active(): string[];
142
144
  };
@@ -165,6 +167,12 @@ declare class BrokerCallError extends Error {
165
167
  readonly status?: number | undefined;
166
168
  constructor(message: string, target: string, status?: number | undefined);
167
169
  }
170
+ declare class MissingDependencyError extends BrokerCallError {
171
+ constructor(message: string, target: string, status?: number);
172
+ }
173
+ declare class CrossAppGrantError extends BrokerCallError {
174
+ constructor(message: string, target: string, status?: number);
175
+ }
168
176
  type BrokerCallOptions = {
169
177
  /** Override the caller app id sent to the broker. Inferred from the URL when omitted. */
170
178
  callerAppId?: string;
@@ -354,6 +362,8 @@ declare function createPaletteClient(ctx?: PlatformContext): {
354
362
  events: {
355
363
  on(target: string, handler: (payload: unknown, meta: EventMeta) => void): () => void;
356
364
  emit(target: string, payload?: unknown): Promise<void>;
365
+ publishDurable(target: string, payload?: unknown): Promise<void>;
366
+ emitDurable(target: string, payload?: unknown): Promise<void>;
357
367
  active(): string[];
358
368
  };
359
369
  };
@@ -399,6 +409,8 @@ declare const palette: {
399
409
  events: {
400
410
  on(target: string, handler: (payload: unknown, meta: EventMeta) => void): () => void;
401
411
  emit(target: string, payload?: unknown): Promise<void>;
412
+ publishDurable(target: string, payload?: unknown): Promise<void>;
413
+ emitDurable(target: string, payload?: unknown): Promise<void>;
402
414
  active(): string[];
403
415
  };
404
416
  };
@@ -407,4 +419,4 @@ declare function hasPermission(ctx: PlatformContext, permission: string): boolea
407
419
  declare function hasAnyPermission(ctx: PlatformContext, permissions: string[]): boolean;
408
420
  declare function hasAllPermissions(ctx: PlatformContext, permissions: string[]): boolean;
409
421
 
410
- export { BrokerCallError, type BrokerCallOptions, type ConnectionAuthStart, type ConnectionStatus, type ConnectionStatusValue, DataRoom, DataRoomClient, type DataRoomContents, DataRoomFile, DataRoomFolder, type DataRoomUploadOptions, type EventMeta, type InstallConfig, type OrgInviteMemberInput, type OrgInviteMemberResponse, type OrgMember, type OrgMemberRole, OrgSummary, OrganizationClient, PaletteApiError, type PaletteClient, PlatformContext, type SandboxBridge, type SandboxBrokerMessage, StorageClient, type StorageUploadOptions, type StorageUploadProgress, type StorageUploadResult, type StorageUploadState, User, UserClient, apiFetch, apiUpload, broker, createMockPlatformContext, createPaletteClient, createSandboxBridge, dataRooms, disconnectConnection, errorFromResponse, events, getBaseUrl, getConnections, getInstallConfig, hasAllPermissions, hasAnyPermission, hasPermission, isPaletteApiError, isSandboxRuntime, palette, requireConnection, servicesProxy, setBaseUrl, startConnection, updateInstallConfig, uploadToSignedUrl, withPluginProvider };
422
+ export { BrokerCallError, type BrokerCallOptions, type ConnectionAuthStart, type ConnectionStatus, type ConnectionStatusValue, CrossAppGrantError, DataRoom, DataRoomClient, type DataRoomContents, DataRoomFile, DataRoomFolder, type DataRoomUploadOptions, type EventMeta, type InstallConfig, MissingDependencyError, type OrgInviteMemberInput, type OrgInviteMemberResponse, type OrgMember, type OrgMemberRole, OrgSummary, OrganizationClient, PaletteApiError, type PaletteClient, PlatformContext, type SandboxBridge, type SandboxBrokerMessage, StorageClient, type StorageUploadOptions, type StorageUploadProgress, type StorageUploadResult, type StorageUploadState, User, UserClient, apiFetch, apiUpload, broker, createMockPlatformContext, createPaletteClient, createSandboxBridge, dataRooms, disconnectConnection, errorFromResponse, events, getBaseUrl, getConnections, getInstallConfig, hasAllPermissions, hasAnyPermission, hasPermission, isPaletteApiError, isSandboxRuntime, palette, requireConnection, servicesProxy, setBaseUrl, startConnection, updateInstallConfig, uploadToSignedUrl, withPluginProvider };
package/dist/index.d.ts CHANGED
@@ -137,6 +137,8 @@ type EventMeta = {
137
137
  declare const events: {
138
138
  on(target: string, handler: Handler): () => void;
139
139
  emit(target: string, payload?: unknown): Promise<void>;
140
+ publishDurable(target: string, payload?: unknown): Promise<void>;
141
+ emitDurable(target: string, payload?: unknown): Promise<void>;
140
142
  /** Diagnostic: list active subscriptions in this page. */
141
143
  active(): string[];
142
144
  };
@@ -165,6 +167,12 @@ declare class BrokerCallError extends Error {
165
167
  readonly status?: number | undefined;
166
168
  constructor(message: string, target: string, status?: number | undefined);
167
169
  }
170
+ declare class MissingDependencyError extends BrokerCallError {
171
+ constructor(message: string, target: string, status?: number);
172
+ }
173
+ declare class CrossAppGrantError extends BrokerCallError {
174
+ constructor(message: string, target: string, status?: number);
175
+ }
168
176
  type BrokerCallOptions = {
169
177
  /** Override the caller app id sent to the broker. Inferred from the URL when omitted. */
170
178
  callerAppId?: string;
@@ -354,6 +362,8 @@ declare function createPaletteClient(ctx?: PlatformContext): {
354
362
  events: {
355
363
  on(target: string, handler: (payload: unknown, meta: EventMeta) => void): () => void;
356
364
  emit(target: string, payload?: unknown): Promise<void>;
365
+ publishDurable(target: string, payload?: unknown): Promise<void>;
366
+ emitDurable(target: string, payload?: unknown): Promise<void>;
357
367
  active(): string[];
358
368
  };
359
369
  };
@@ -399,6 +409,8 @@ declare const palette: {
399
409
  events: {
400
410
  on(target: string, handler: (payload: unknown, meta: EventMeta) => void): () => void;
401
411
  emit(target: string, payload?: unknown): Promise<void>;
412
+ publishDurable(target: string, payload?: unknown): Promise<void>;
413
+ emitDurable(target: string, payload?: unknown): Promise<void>;
402
414
  active(): string[];
403
415
  };
404
416
  };
@@ -407,4 +419,4 @@ declare function hasPermission(ctx: PlatformContext, permission: string): boolea
407
419
  declare function hasAnyPermission(ctx: PlatformContext, permissions: string[]): boolean;
408
420
  declare function hasAllPermissions(ctx: PlatformContext, permissions: string[]): boolean;
409
421
 
410
- export { BrokerCallError, type BrokerCallOptions, type ConnectionAuthStart, type ConnectionStatus, type ConnectionStatusValue, DataRoom, DataRoomClient, type DataRoomContents, DataRoomFile, DataRoomFolder, type DataRoomUploadOptions, type EventMeta, type InstallConfig, type OrgInviteMemberInput, type OrgInviteMemberResponse, type OrgMember, type OrgMemberRole, OrgSummary, OrganizationClient, PaletteApiError, type PaletteClient, PlatformContext, type SandboxBridge, type SandboxBrokerMessage, StorageClient, type StorageUploadOptions, type StorageUploadProgress, type StorageUploadResult, type StorageUploadState, User, UserClient, apiFetch, apiUpload, broker, createMockPlatformContext, createPaletteClient, createSandboxBridge, dataRooms, disconnectConnection, errorFromResponse, events, getBaseUrl, getConnections, getInstallConfig, hasAllPermissions, hasAnyPermission, hasPermission, isPaletteApiError, isSandboxRuntime, palette, requireConnection, servicesProxy, setBaseUrl, startConnection, updateInstallConfig, uploadToSignedUrl, withPluginProvider };
422
+ export { BrokerCallError, type BrokerCallOptions, type ConnectionAuthStart, type ConnectionStatus, type ConnectionStatusValue, CrossAppGrantError, DataRoom, DataRoomClient, type DataRoomContents, DataRoomFile, DataRoomFolder, type DataRoomUploadOptions, type EventMeta, type InstallConfig, MissingDependencyError, type OrgInviteMemberInput, type OrgInviteMemberResponse, type OrgMember, type OrgMemberRole, OrgSummary, OrganizationClient, PaletteApiError, type PaletteClient, PlatformContext, type SandboxBridge, type SandboxBrokerMessage, StorageClient, type StorageUploadOptions, type StorageUploadProgress, type StorageUploadResult, type StorageUploadState, User, UserClient, apiFetch, apiUpload, broker, createMockPlatformContext, createPaletteClient, createSandboxBridge, dataRooms, disconnectConnection, errorFromResponse, events, getBaseUrl, getConnections, getInstallConfig, hasAllPermissions, hasAnyPermission, hasPermission, isPaletteApiError, isSandboxRuntime, palette, requireConnection, servicesProxy, setBaseUrl, startConnection, updateInstallConfig, uploadToSignedUrl, withPluginProvider };
package/dist/index.js CHANGED
@@ -21,8 +21,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  BrokerCallError: () => BrokerCallError,
24
+ CrossAppGrantError: () => CrossAppGrantError,
24
25
  DataRoomClient: () => DataRoomClient,
25
26
  Link: () => Link,
27
+ MissingDependencyError: () => MissingDependencyError,
26
28
  OrganizationClient: () => OrganizationClient,
27
29
  PaletteApiError: () => PaletteApiError,
28
30
  PaletteAppRouter: () => PaletteAppRouter,
@@ -399,6 +401,28 @@ var BrokerCallError = class extends Error {
399
401
  this.name = "BrokerCallError";
400
402
  }
401
403
  };
404
+ var MissingDependencyError = class extends BrokerCallError {
405
+ constructor(message, target, status) {
406
+ super(message, target, status);
407
+ this.name = "MissingDependencyError";
408
+ }
409
+ };
410
+ var CrossAppGrantError = class extends BrokerCallError {
411
+ constructor(message, target, status) {
412
+ super(message, target, status);
413
+ this.name = "CrossAppGrantError";
414
+ }
415
+ };
416
+ function brokerError(message, target, status) {
417
+ const lower = message.toLowerCase();
418
+ if (status === 424 || lower.includes("not installed") || lower.includes("provider app")) {
419
+ return new MissingDependencyError(message, target, status);
420
+ }
421
+ if (status === 403 && (lower.includes("grant") || lower.includes("declared"))) {
422
+ return new CrossAppGrantError(message, target, status);
423
+ }
424
+ return new BrokerCallError(message, target, status);
425
+ }
402
426
  var CALLER_HEADER = "X-Palette-Caller-App";
403
427
  function currentPluginId() {
404
428
  if (typeof window === "undefined") return void 0;
@@ -409,12 +433,18 @@ async function brokerCallDirect(target, payload, options = {}) {
409
433
  const callerAppId = options.callerAppId ?? currentPluginId();
410
434
  const headers = {};
411
435
  if (callerAppId) headers[CALLER_HEADER] = callerAppId;
412
- const res = await apiFetch("/api/v1/os-broker/dispatch", {
413
- method: "POST",
414
- headers,
415
- body: JSON.stringify({ target, payload: payload ?? {}, caller_app_id: callerAppId }),
416
- signal: options.signal
417
- });
436
+ let res;
437
+ try {
438
+ res = await apiFetch("/api/v1/os-broker/dispatch", {
439
+ method: "POST",
440
+ headers,
441
+ body: JSON.stringify({ target, payload: payload ?? {}, caller_app_id: callerAppId }),
442
+ signal: options.signal
443
+ });
444
+ } catch (error) {
445
+ const e = error;
446
+ throw brokerError(typeof e.detail === "string" ? e.detail : e.message, target, e.status);
447
+ }
418
448
  if (!res.ok) {
419
449
  let detail;
420
450
  try {
@@ -422,7 +452,7 @@ async function brokerCallDirect(target, payload, options = {}) {
422
452
  } catch {
423
453
  detail = res.statusText;
424
454
  }
425
- throw new BrokerCallError(detail ?? `broker dispatch failed: ${res.status}`, target, res.status);
455
+ throw brokerError(detail ?? `broker dispatch failed: ${res.status}`, target, res.status);
426
456
  }
427
457
  const body = await res.json();
428
458
  return body.result;
@@ -535,7 +565,7 @@ function streamUrl() {
535
565
  const callerAppId = currentPluginId2();
536
566
  if (callerAppId) params.set("caller_app_id", callerAppId);
537
567
  const query = params.toString();
538
- return `/api/v1/os-broker/events/stream${query ? `?${query}` : ""}`;
568
+ return `${getBaseUrl()}/api/v1/os-broker/events/stream${query ? `?${query}` : ""}`;
539
569
  }
540
570
  function ensureStream() {
541
571
  if (activeStream || typeof window === "undefined") return;
@@ -616,6 +646,12 @@ var events = {
616
646
  async emit(target, payload) {
617
647
  await broker.emit(target, payload);
618
648
  },
649
+ async publishDurable(target, payload) {
650
+ await broker.emit(target, payload);
651
+ },
652
+ async emitDurable(target, payload) {
653
+ await broker.emit(target, payload);
654
+ },
619
655
  /** Diagnostic: list active subscriptions in this page. */
620
656
  active() {
621
657
  return Array.from(SUBSCRIBERS.keys());
@@ -1429,8 +1465,10 @@ function usePluginChat(agentId) {
1429
1465
  // Annotate the CommonJS export names for ESM import in node:
1430
1466
  0 && (module.exports = {
1431
1467
  BrokerCallError,
1468
+ CrossAppGrantError,
1432
1469
  DataRoomClient,
1433
1470
  Link,
1471
+ MissingDependencyError,
1434
1472
  OrganizationClient,
1435
1473
  PaletteApiError,
1436
1474
  PaletteAppRouter,
package/dist/index.mjs CHANGED
@@ -326,6 +326,28 @@ var BrokerCallError = class extends Error {
326
326
  this.name = "BrokerCallError";
327
327
  }
328
328
  };
329
+ var MissingDependencyError = class extends BrokerCallError {
330
+ constructor(message, target, status) {
331
+ super(message, target, status);
332
+ this.name = "MissingDependencyError";
333
+ }
334
+ };
335
+ var CrossAppGrantError = class extends BrokerCallError {
336
+ constructor(message, target, status) {
337
+ super(message, target, status);
338
+ this.name = "CrossAppGrantError";
339
+ }
340
+ };
341
+ function brokerError(message, target, status) {
342
+ const lower = message.toLowerCase();
343
+ if (status === 424 || lower.includes("not installed") || lower.includes("provider app")) {
344
+ return new MissingDependencyError(message, target, status);
345
+ }
346
+ if (status === 403 && (lower.includes("grant") || lower.includes("declared"))) {
347
+ return new CrossAppGrantError(message, target, status);
348
+ }
349
+ return new BrokerCallError(message, target, status);
350
+ }
329
351
  var CALLER_HEADER = "X-Palette-Caller-App";
330
352
  function currentPluginId() {
331
353
  if (typeof window === "undefined") return void 0;
@@ -336,12 +358,18 @@ async function brokerCallDirect(target, payload, options = {}) {
336
358
  const callerAppId = options.callerAppId ?? currentPluginId();
337
359
  const headers = {};
338
360
  if (callerAppId) headers[CALLER_HEADER] = callerAppId;
339
- const res = await apiFetch("/api/v1/os-broker/dispatch", {
340
- method: "POST",
341
- headers,
342
- body: JSON.stringify({ target, payload: payload ?? {}, caller_app_id: callerAppId }),
343
- signal: options.signal
344
- });
361
+ let res;
362
+ try {
363
+ res = await apiFetch("/api/v1/os-broker/dispatch", {
364
+ method: "POST",
365
+ headers,
366
+ body: JSON.stringify({ target, payload: payload ?? {}, caller_app_id: callerAppId }),
367
+ signal: options.signal
368
+ });
369
+ } catch (error) {
370
+ const e = error;
371
+ throw brokerError(typeof e.detail === "string" ? e.detail : e.message, target, e.status);
372
+ }
345
373
  if (!res.ok) {
346
374
  let detail;
347
375
  try {
@@ -349,7 +377,7 @@ async function brokerCallDirect(target, payload, options = {}) {
349
377
  } catch {
350
378
  detail = res.statusText;
351
379
  }
352
- throw new BrokerCallError(detail ?? `broker dispatch failed: ${res.status}`, target, res.status);
380
+ throw brokerError(detail ?? `broker dispatch failed: ${res.status}`, target, res.status);
353
381
  }
354
382
  const body = await res.json();
355
383
  return body.result;
@@ -462,7 +490,7 @@ function streamUrl() {
462
490
  const callerAppId = currentPluginId2();
463
491
  if (callerAppId) params.set("caller_app_id", callerAppId);
464
492
  const query = params.toString();
465
- return `/api/v1/os-broker/events/stream${query ? `?${query}` : ""}`;
493
+ return `${getBaseUrl()}/api/v1/os-broker/events/stream${query ? `?${query}` : ""}`;
466
494
  }
467
495
  function ensureStream() {
468
496
  if (activeStream || typeof window === "undefined") return;
@@ -543,6 +571,12 @@ var events = {
543
571
  async emit(target, payload) {
544
572
  await broker.emit(target, payload);
545
573
  },
574
+ async publishDurable(target, payload) {
575
+ await broker.emit(target, payload);
576
+ },
577
+ async emitDurable(target, payload) {
578
+ await broker.emit(target, payload);
579
+ },
546
580
  /** Diagnostic: list active subscriptions in this page. */
547
581
  active() {
548
582
  return Array.from(SUBSCRIBERS.keys());
@@ -1364,8 +1398,10 @@ function usePluginChat(agentId) {
1364
1398
  }
1365
1399
  export {
1366
1400
  BrokerCallError,
1401
+ CrossAppGrantError,
1367
1402
  DataRoomClient,
1368
1403
  Link,
1404
+ MissingDependencyError,
1369
1405
  OrganizationClient,
1370
1406
  PaletteApiError,
1371
1407
  PaletteAppRouter,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@palettelab/sdk",
3
- "version": "0.1.21",
3
+ "version": "0.1.22",
4
4
  "description": "Palette Platform SDK for building plugins and apps",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",