@xenide-io/suite-client 0.5.0 → 0.6.1

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/dist/index.d.mts CHANGED
@@ -327,6 +327,88 @@ declare function createWorkspaceAppearanceApi(config: WorkspaceAppearanceApiConf
327
327
  cacheWorkspaceAppearanceLocally: (appearance: WorkspaceAppearance) => void;
328
328
  };
329
329
 
330
+ /** How long a persisted read-model snapshot may be shown after a reload. */
331
+ declare const SUITE_QUERY_CACHE_MAX_AGE_MS: number;
332
+ type QueryKeyPart = string | readonly string[];
333
+ interface PersistableQuery {
334
+ queryKey: readonly unknown[];
335
+ state: {
336
+ status: string;
337
+ data: unknown;
338
+ };
339
+ }
340
+ interface PersistableQueryClient {
341
+ getQueryCache(): {
342
+ getAll(): PersistableQuery[];
343
+ subscribe(listener: () => void): () => void;
344
+ };
345
+ setQueryData(queryKey: readonly unknown[], data: unknown): unknown;
346
+ invalidateQueries(filters: {
347
+ queryKey: readonly unknown[];
348
+ refetchType: 'none';
349
+ }): Promise<unknown>;
350
+ }
351
+ interface PersistSuiteQueriesOptions {
352
+ /** localStorage key, including a version. */
353
+ storageKey: string;
354
+ /** Access-token localStorage key. The JWT `sub` is the user half of the buster. */
355
+ tokenKey: string;
356
+ /** Active workspace localStorage key. */
357
+ workspaceKey: string;
358
+ /**
359
+ * Query keys to keep. A string matches `queryKey[0]`. A list matches a prefix,
360
+ * so `['tt', 'tracker-catalog']` does not keep `['tt', 'time-entries']`.
361
+ */
362
+ allow: readonly QueryKeyPart[];
363
+ maxAgeMs?: number;
364
+ }
365
+ /**
366
+ * User and workspace identity for a snapshot. Empty when the tab is signed out,
367
+ * which refuses both restore and write.
368
+ */
369
+ declare function suiteCacheBuster(tokenKey: string, workspaceKey: string): string;
370
+ declare function readJsonSnapshot<T>(key: string, buster: string, maxAgeMs: number): T | null;
371
+ declare function writeJsonSnapshot(key: string, buster: string, value: unknown): void;
372
+ /**
373
+ * Restore an allow-listed query cache, then keep writing it. Restored queries
374
+ * are marked stale so the next mount refetches without hiding the snapshot.
375
+ * Returns an unsubscribe.
376
+ */
377
+ declare function persistSuiteQueries(queryClient: PersistableQueryClient, options: PersistSuiteQueriesOptions): () => void;
378
+ /** Per-app browser cache. Live operational keys are intentionally absent. */
379
+ declare const SUITE_APP_QUERY_CACHES: {
380
+ readonly kraken: {
381
+ readonly storageKey: "kraken-query-cache:v1";
382
+ readonly tokenKey: "kraken_access_token";
383
+ readonly workspaceKey: "kraken_active_workspace_id";
384
+ readonly allow: readonly ["kraken-sidebar"];
385
+ };
386
+ readonly shellstack: {
387
+ readonly storageKey: "shellstack-query-cache:v1";
388
+ readonly tokenKey: "portal_access_token";
389
+ readonly workspaceKey: "portal_active_workspace_id";
390
+ readonly allow: readonly ["calendar-events", "org-workspaces", "organisation", "org-team", "directory"];
391
+ };
392
+ readonly tides: {
393
+ readonly storageKey: "tides-query-cache:v1";
394
+ readonly tokenKey: "tides_access_token";
395
+ readonly workspaceKey: "tides_active_workspace_id";
396
+ readonly allow: readonly [readonly ["tides", "projects"], readonly ["tides", "clients"], readonly ["tides", "workspace-members"], readonly ["tides", "workspace-tags"], readonly ["tides", "project-statuses"]];
397
+ };
398
+ readonly turtletime: {
399
+ readonly storageKey: "tt-query-cache:v1";
400
+ readonly tokenKey: "tt_access_token";
401
+ readonly workspaceKey: "tt_active_workspace_id";
402
+ readonly allow: readonly [readonly ["tt", "tracker-catalog"], readonly ["tt", "projects"], readonly ["tt", "clients"], readonly ["tt", "categories"]];
403
+ };
404
+ readonly shelly: {
405
+ readonly storageKey: "shelly-query-cache:v1";
406
+ readonly tokenKey: "shelly_access_token";
407
+ readonly workspaceKey: "shelly_active_workspace_id";
408
+ readonly allow: readonly [readonly ["shelly", "skills"], readonly ["shelly", "crews"], readonly ["shelly", "mcp-servers"], readonly ["shelly", "models"]];
409
+ };
410
+ };
411
+
330
412
  type CrossAppSyncTopic = 'time' | 'integration' | 'tasks';
331
413
  interface CrossAppSyncConfig {
332
414
  api: Api;
@@ -334,6 +416,8 @@ interface CrossAppSyncConfig {
334
416
  checkpointPath: string;
335
417
  /** Poll interval while the tab is visible (ms). */
336
418
  pollMs?: number;
419
+ /** Reset the checkpoint baseline when the active workspace changes. */
420
+ getScope?: () => string | null;
337
421
  }
338
422
  type CrossAppSync = ReturnType<typeof createCrossAppSync>;
339
423
  /**
@@ -361,6 +445,37 @@ declare function createLiveRefresh(sync: CrossAppSync): {
361
445
  hasPendingCrossAppSync: (topic: CrossAppSyncTopic | undefined, since: number) => boolean;
362
446
  };
363
447
 
448
+ interface SuiteRevisionMap {
449
+ documents: number;
450
+ calendar: number;
451
+ notifications: number;
452
+ tasks: number;
453
+ time: number;
454
+ catalogue: number;
455
+ }
456
+ /**
457
+ * First successful poll is the baseline and refreshes nothing. Later polls
458
+ * report only topics whose integer moved, so unchanged lists are not refetched.
459
+ */
460
+ declare function nextRevisionTick(seen: Record<string, number>, ready: boolean, data: Partial<SuiteRevisionMap> | null): {
461
+ seen: Record<string, number>;
462
+ ready: boolean;
463
+ changed: string[];
464
+ };
465
+ /**
466
+ * Poll workspace revisions and report topics whose integer moved.
467
+ * The first successful read is the baseline, so a reload does not refetch
468
+ * everything the snapshot already painted.
469
+ */
470
+ declare function useSuiteRevisions(options: {
471
+ enabled: boolean;
472
+ /** Workspace (or other) id. Changing it refetches, so the previous workspace cannot stay on screen. */
473
+ scope?: string;
474
+ load: () => Promise<Partial<SuiteRevisionMap> | null>;
475
+ onTopic: (topic: string) => void;
476
+ pollMs?: number;
477
+ }): void;
478
+
364
479
  /** Cross-app (suite) notification from `/api/notifications/` — shared across ShellStack apps. */
365
480
  interface SuiteNotification {
366
481
  id: string;
@@ -421,6 +536,18 @@ declare function createWebPushClient(config: WebPushClientConfig): {
421
536
  disable: () => Promise<void>;
422
537
  };
423
538
 
539
+ interface EmailNotificationPreference {
540
+ enabled: boolean;
541
+ busy: boolean;
542
+ error: string;
543
+ onChange: (enabled: boolean) => void;
544
+ }
545
+ /**
546
+ * Loads and saves the signed-in person's email notification preference.
547
+ * The preference is shared across suite apps.
548
+ */
549
+ declare function useEmailNotificationPreference(api: Api, parseApiError: (res: Response) => Promise<string>): EmailNotificationPreference;
550
+
424
551
  type SuiteAiJobEvent = {
425
552
  sequence: number;
426
553
  event_type: 'queued' | 'started' | 'progress' | 'tool' | 'completed' | 'failed' | 'cancelled';
@@ -481,4 +608,4 @@ declare function createJsonLd(config: JsonLdConfig): string;
481
608
 
482
609
  declare function useIsNight(): boolean;
483
610
 
484
- export { type AnalyticsClient, type AnalyticsClientConfig, type AnalyticsContextHeaders, type AnalyticsProperties, type Api, type ApiAnalyticsEventSink, type ApiClient, type ApiClientConfig, type ApiFetchInit, type AppError, type AuthReturnPath, type AuthReturnPathConfig, type BrandSettings, type BrandSettingsConfig, type CrossAppSync, type CrossAppSyncConfig, type CrossAppSyncTopic, DEFAULT_ERROR_CODE, ERROR_CODES, ERROR_COPY, ERROR_RETRYABLE, type ErrorCode, FREE_PLAN_SEAT_HELP, type JsonLdConfig, type LiveRefresh, type LiveRefreshOptions, type NotificationsClient, type NotificationsClientConfig, ORGANISATION_SEAT_HELP, type PortalHandoffPayload, type PortalHandoffRead, type SeatType, type SubscriptionTier, type SuiteAiJob, type SuiteAiJobEvent, type SuiteNotification, type SuiteNotificationsResponse, TIDES_ACCESS_HELP, TURTLETIME_ACCESS_HELP, WEBHOOK_ACTIVITY_ACTIONS, WORKSPACE_SEAT_HELP, type WebPushClient, type WebPushClientConfig, type WebPushConfig, type WebPushState, type WorkspaceAppearance, type WorkspaceAppearanceApiConfig, type WorkspaceAppearanceConfig, WorkspaceAppearanceError, type WorkspaceAppearanceHelpers, type WorkspaceAppearancePatch, type WorkspaceBrandPayload, type WorkspaceSubscription, type WorkspaceTheme, activeSuiteAiJobs, appErrorFromResponse, canDisableAppAccess, codeForStatus, copyFor, createAnalyticsClient, createApiClient, createAuthReturnPath, createBrandSettings, createCrossAppSync, createJsonLd, createLiveRefresh, createNotificationsClient, createWebPushClient, createWorkspaceAppearance, createWorkspaceAppearanceApi, defaultInviteSeatType, emailDomain, flagsFromSeatType, formatAppError, hasAppAccess, isErrorCode, normalizeError, normalizeThrown, planSeatSummary, resolveSubscriptionTier, seatTypeDescription, seatTypeFromFlags, seatTypeLabel, selectedToWebhookActions, sortedSuiteAiEvents, suiteAiEventSummary, tierAllowsTidesOnlySeats, tierAllowsTurtletime, tierLabel, useIsNight, webhookActionsToSelected };
611
+ export { type AnalyticsClient, type AnalyticsClientConfig, type AnalyticsContextHeaders, type AnalyticsProperties, type Api, type ApiAnalyticsEventSink, type ApiClient, type ApiClientConfig, type ApiFetchInit, type AppError, type AuthReturnPath, type AuthReturnPathConfig, type BrandSettings, type BrandSettingsConfig, type CrossAppSync, type CrossAppSyncConfig, type CrossAppSyncTopic, DEFAULT_ERROR_CODE, ERROR_CODES, ERROR_COPY, ERROR_RETRYABLE, type EmailNotificationPreference, type ErrorCode, FREE_PLAN_SEAT_HELP, type JsonLdConfig, type LiveRefresh, type LiveRefreshOptions, type NotificationsClient, type NotificationsClientConfig, ORGANISATION_SEAT_HELP, type PersistSuiteQueriesOptions, type PersistableQuery, type PersistableQueryClient, type PortalHandoffPayload, type PortalHandoffRead, type QueryKeyPart, SUITE_APP_QUERY_CACHES, SUITE_QUERY_CACHE_MAX_AGE_MS, type SeatType, type SubscriptionTier, type SuiteAiJob, type SuiteAiJobEvent, type SuiteNotification, type SuiteNotificationsResponse, type SuiteRevisionMap, TIDES_ACCESS_HELP, TURTLETIME_ACCESS_HELP, WEBHOOK_ACTIVITY_ACTIONS, WORKSPACE_SEAT_HELP, type WebPushClient, type WebPushClientConfig, type WebPushConfig, type WebPushState, type WorkspaceAppearance, type WorkspaceAppearanceApiConfig, type WorkspaceAppearanceConfig, WorkspaceAppearanceError, type WorkspaceAppearanceHelpers, type WorkspaceAppearancePatch, type WorkspaceBrandPayload, type WorkspaceSubscription, type WorkspaceTheme, activeSuiteAiJobs, appErrorFromResponse, canDisableAppAccess, codeForStatus, copyFor, createAnalyticsClient, createApiClient, createAuthReturnPath, createBrandSettings, createCrossAppSync, createJsonLd, createLiveRefresh, createNotificationsClient, createWebPushClient, createWorkspaceAppearance, createWorkspaceAppearanceApi, defaultInviteSeatType, emailDomain, flagsFromSeatType, formatAppError, hasAppAccess, isErrorCode, nextRevisionTick, normalizeError, normalizeThrown, persistSuiteQueries, planSeatSummary, readJsonSnapshot, resolveSubscriptionTier, seatTypeDescription, seatTypeFromFlags, seatTypeLabel, selectedToWebhookActions, sortedSuiteAiEvents, suiteAiEventSummary, suiteCacheBuster, tierAllowsTidesOnlySeats, tierAllowsTurtletime, tierLabel, useEmailNotificationPreference, useIsNight, useSuiteRevisions, webhookActionsToSelected, writeJsonSnapshot };
package/dist/index.d.ts CHANGED
@@ -327,6 +327,88 @@ declare function createWorkspaceAppearanceApi(config: WorkspaceAppearanceApiConf
327
327
  cacheWorkspaceAppearanceLocally: (appearance: WorkspaceAppearance) => void;
328
328
  };
329
329
 
330
+ /** How long a persisted read-model snapshot may be shown after a reload. */
331
+ declare const SUITE_QUERY_CACHE_MAX_AGE_MS: number;
332
+ type QueryKeyPart = string | readonly string[];
333
+ interface PersistableQuery {
334
+ queryKey: readonly unknown[];
335
+ state: {
336
+ status: string;
337
+ data: unknown;
338
+ };
339
+ }
340
+ interface PersistableQueryClient {
341
+ getQueryCache(): {
342
+ getAll(): PersistableQuery[];
343
+ subscribe(listener: () => void): () => void;
344
+ };
345
+ setQueryData(queryKey: readonly unknown[], data: unknown): unknown;
346
+ invalidateQueries(filters: {
347
+ queryKey: readonly unknown[];
348
+ refetchType: 'none';
349
+ }): Promise<unknown>;
350
+ }
351
+ interface PersistSuiteQueriesOptions {
352
+ /** localStorage key, including a version. */
353
+ storageKey: string;
354
+ /** Access-token localStorage key. The JWT `sub` is the user half of the buster. */
355
+ tokenKey: string;
356
+ /** Active workspace localStorage key. */
357
+ workspaceKey: string;
358
+ /**
359
+ * Query keys to keep. A string matches `queryKey[0]`. A list matches a prefix,
360
+ * so `['tt', 'tracker-catalog']` does not keep `['tt', 'time-entries']`.
361
+ */
362
+ allow: readonly QueryKeyPart[];
363
+ maxAgeMs?: number;
364
+ }
365
+ /**
366
+ * User and workspace identity for a snapshot. Empty when the tab is signed out,
367
+ * which refuses both restore and write.
368
+ */
369
+ declare function suiteCacheBuster(tokenKey: string, workspaceKey: string): string;
370
+ declare function readJsonSnapshot<T>(key: string, buster: string, maxAgeMs: number): T | null;
371
+ declare function writeJsonSnapshot(key: string, buster: string, value: unknown): void;
372
+ /**
373
+ * Restore an allow-listed query cache, then keep writing it. Restored queries
374
+ * are marked stale so the next mount refetches without hiding the snapshot.
375
+ * Returns an unsubscribe.
376
+ */
377
+ declare function persistSuiteQueries(queryClient: PersistableQueryClient, options: PersistSuiteQueriesOptions): () => void;
378
+ /** Per-app browser cache. Live operational keys are intentionally absent. */
379
+ declare const SUITE_APP_QUERY_CACHES: {
380
+ readonly kraken: {
381
+ readonly storageKey: "kraken-query-cache:v1";
382
+ readonly tokenKey: "kraken_access_token";
383
+ readonly workspaceKey: "kraken_active_workspace_id";
384
+ readonly allow: readonly ["kraken-sidebar"];
385
+ };
386
+ readonly shellstack: {
387
+ readonly storageKey: "shellstack-query-cache:v1";
388
+ readonly tokenKey: "portal_access_token";
389
+ readonly workspaceKey: "portal_active_workspace_id";
390
+ readonly allow: readonly ["calendar-events", "org-workspaces", "organisation", "org-team", "directory"];
391
+ };
392
+ readonly tides: {
393
+ readonly storageKey: "tides-query-cache:v1";
394
+ readonly tokenKey: "tides_access_token";
395
+ readonly workspaceKey: "tides_active_workspace_id";
396
+ readonly allow: readonly [readonly ["tides", "projects"], readonly ["tides", "clients"], readonly ["tides", "workspace-members"], readonly ["tides", "workspace-tags"], readonly ["tides", "project-statuses"]];
397
+ };
398
+ readonly turtletime: {
399
+ readonly storageKey: "tt-query-cache:v1";
400
+ readonly tokenKey: "tt_access_token";
401
+ readonly workspaceKey: "tt_active_workspace_id";
402
+ readonly allow: readonly [readonly ["tt", "tracker-catalog"], readonly ["tt", "projects"], readonly ["tt", "clients"], readonly ["tt", "categories"]];
403
+ };
404
+ readonly shelly: {
405
+ readonly storageKey: "shelly-query-cache:v1";
406
+ readonly tokenKey: "shelly_access_token";
407
+ readonly workspaceKey: "shelly_active_workspace_id";
408
+ readonly allow: readonly [readonly ["shelly", "skills"], readonly ["shelly", "crews"], readonly ["shelly", "mcp-servers"], readonly ["shelly", "models"]];
409
+ };
410
+ };
411
+
330
412
  type CrossAppSyncTopic = 'time' | 'integration' | 'tasks';
331
413
  interface CrossAppSyncConfig {
332
414
  api: Api;
@@ -334,6 +416,8 @@ interface CrossAppSyncConfig {
334
416
  checkpointPath: string;
335
417
  /** Poll interval while the tab is visible (ms). */
336
418
  pollMs?: number;
419
+ /** Reset the checkpoint baseline when the active workspace changes. */
420
+ getScope?: () => string | null;
337
421
  }
338
422
  type CrossAppSync = ReturnType<typeof createCrossAppSync>;
339
423
  /**
@@ -361,6 +445,37 @@ declare function createLiveRefresh(sync: CrossAppSync): {
361
445
  hasPendingCrossAppSync: (topic: CrossAppSyncTopic | undefined, since: number) => boolean;
362
446
  };
363
447
 
448
+ interface SuiteRevisionMap {
449
+ documents: number;
450
+ calendar: number;
451
+ notifications: number;
452
+ tasks: number;
453
+ time: number;
454
+ catalogue: number;
455
+ }
456
+ /**
457
+ * First successful poll is the baseline and refreshes nothing. Later polls
458
+ * report only topics whose integer moved, so unchanged lists are not refetched.
459
+ */
460
+ declare function nextRevisionTick(seen: Record<string, number>, ready: boolean, data: Partial<SuiteRevisionMap> | null): {
461
+ seen: Record<string, number>;
462
+ ready: boolean;
463
+ changed: string[];
464
+ };
465
+ /**
466
+ * Poll workspace revisions and report topics whose integer moved.
467
+ * The first successful read is the baseline, so a reload does not refetch
468
+ * everything the snapshot already painted.
469
+ */
470
+ declare function useSuiteRevisions(options: {
471
+ enabled: boolean;
472
+ /** Workspace (or other) id. Changing it refetches, so the previous workspace cannot stay on screen. */
473
+ scope?: string;
474
+ load: () => Promise<Partial<SuiteRevisionMap> | null>;
475
+ onTopic: (topic: string) => void;
476
+ pollMs?: number;
477
+ }): void;
478
+
364
479
  /** Cross-app (suite) notification from `/api/notifications/` — shared across ShellStack apps. */
365
480
  interface SuiteNotification {
366
481
  id: string;
@@ -421,6 +536,18 @@ declare function createWebPushClient(config: WebPushClientConfig): {
421
536
  disable: () => Promise<void>;
422
537
  };
423
538
 
539
+ interface EmailNotificationPreference {
540
+ enabled: boolean;
541
+ busy: boolean;
542
+ error: string;
543
+ onChange: (enabled: boolean) => void;
544
+ }
545
+ /**
546
+ * Loads and saves the signed-in person's email notification preference.
547
+ * The preference is shared across suite apps.
548
+ */
549
+ declare function useEmailNotificationPreference(api: Api, parseApiError: (res: Response) => Promise<string>): EmailNotificationPreference;
550
+
424
551
  type SuiteAiJobEvent = {
425
552
  sequence: number;
426
553
  event_type: 'queued' | 'started' | 'progress' | 'tool' | 'completed' | 'failed' | 'cancelled';
@@ -481,4 +608,4 @@ declare function createJsonLd(config: JsonLdConfig): string;
481
608
 
482
609
  declare function useIsNight(): boolean;
483
610
 
484
- export { type AnalyticsClient, type AnalyticsClientConfig, type AnalyticsContextHeaders, type AnalyticsProperties, type Api, type ApiAnalyticsEventSink, type ApiClient, type ApiClientConfig, type ApiFetchInit, type AppError, type AuthReturnPath, type AuthReturnPathConfig, type BrandSettings, type BrandSettingsConfig, type CrossAppSync, type CrossAppSyncConfig, type CrossAppSyncTopic, DEFAULT_ERROR_CODE, ERROR_CODES, ERROR_COPY, ERROR_RETRYABLE, type ErrorCode, FREE_PLAN_SEAT_HELP, type JsonLdConfig, type LiveRefresh, type LiveRefreshOptions, type NotificationsClient, type NotificationsClientConfig, ORGANISATION_SEAT_HELP, type PortalHandoffPayload, type PortalHandoffRead, type SeatType, type SubscriptionTier, type SuiteAiJob, type SuiteAiJobEvent, type SuiteNotification, type SuiteNotificationsResponse, TIDES_ACCESS_HELP, TURTLETIME_ACCESS_HELP, WEBHOOK_ACTIVITY_ACTIONS, WORKSPACE_SEAT_HELP, type WebPushClient, type WebPushClientConfig, type WebPushConfig, type WebPushState, type WorkspaceAppearance, type WorkspaceAppearanceApiConfig, type WorkspaceAppearanceConfig, WorkspaceAppearanceError, type WorkspaceAppearanceHelpers, type WorkspaceAppearancePatch, type WorkspaceBrandPayload, type WorkspaceSubscription, type WorkspaceTheme, activeSuiteAiJobs, appErrorFromResponse, canDisableAppAccess, codeForStatus, copyFor, createAnalyticsClient, createApiClient, createAuthReturnPath, createBrandSettings, createCrossAppSync, createJsonLd, createLiveRefresh, createNotificationsClient, createWebPushClient, createWorkspaceAppearance, createWorkspaceAppearanceApi, defaultInviteSeatType, emailDomain, flagsFromSeatType, formatAppError, hasAppAccess, isErrorCode, normalizeError, normalizeThrown, planSeatSummary, resolveSubscriptionTier, seatTypeDescription, seatTypeFromFlags, seatTypeLabel, selectedToWebhookActions, sortedSuiteAiEvents, suiteAiEventSummary, tierAllowsTidesOnlySeats, tierAllowsTurtletime, tierLabel, useIsNight, webhookActionsToSelected };
611
+ export { type AnalyticsClient, type AnalyticsClientConfig, type AnalyticsContextHeaders, type AnalyticsProperties, type Api, type ApiAnalyticsEventSink, type ApiClient, type ApiClientConfig, type ApiFetchInit, type AppError, type AuthReturnPath, type AuthReturnPathConfig, type BrandSettings, type BrandSettingsConfig, type CrossAppSync, type CrossAppSyncConfig, type CrossAppSyncTopic, DEFAULT_ERROR_CODE, ERROR_CODES, ERROR_COPY, ERROR_RETRYABLE, type EmailNotificationPreference, type ErrorCode, FREE_PLAN_SEAT_HELP, type JsonLdConfig, type LiveRefresh, type LiveRefreshOptions, type NotificationsClient, type NotificationsClientConfig, ORGANISATION_SEAT_HELP, type PersistSuiteQueriesOptions, type PersistableQuery, type PersistableQueryClient, type PortalHandoffPayload, type PortalHandoffRead, type QueryKeyPart, SUITE_APP_QUERY_CACHES, SUITE_QUERY_CACHE_MAX_AGE_MS, type SeatType, type SubscriptionTier, type SuiteAiJob, type SuiteAiJobEvent, type SuiteNotification, type SuiteNotificationsResponse, type SuiteRevisionMap, TIDES_ACCESS_HELP, TURTLETIME_ACCESS_HELP, WEBHOOK_ACTIVITY_ACTIONS, WORKSPACE_SEAT_HELP, type WebPushClient, type WebPushClientConfig, type WebPushConfig, type WebPushState, type WorkspaceAppearance, type WorkspaceAppearanceApiConfig, type WorkspaceAppearanceConfig, WorkspaceAppearanceError, type WorkspaceAppearanceHelpers, type WorkspaceAppearancePatch, type WorkspaceBrandPayload, type WorkspaceSubscription, type WorkspaceTheme, activeSuiteAiJobs, appErrorFromResponse, canDisableAppAccess, codeForStatus, copyFor, createAnalyticsClient, createApiClient, createAuthReturnPath, createBrandSettings, createCrossAppSync, createJsonLd, createLiveRefresh, createNotificationsClient, createWebPushClient, createWorkspaceAppearance, createWorkspaceAppearanceApi, defaultInviteSeatType, emailDomain, flagsFromSeatType, formatAppError, hasAppAccess, isErrorCode, nextRevisionTick, normalizeError, normalizeThrown, persistSuiteQueries, planSeatSummary, readJsonSnapshot, resolveSubscriptionTier, seatTypeDescription, seatTypeFromFlags, seatTypeLabel, selectedToWebhookActions, sortedSuiteAiEvents, suiteAiEventSummary, suiteCacheBuster, tierAllowsTidesOnlySeats, tierAllowsTurtletime, tierLabel, useEmailNotificationPreference, useIsNight, useSuiteRevisions, webhookActionsToSelected, writeJsonSnapshot };