@elevasis/ui 2.71.0 → 2.73.0

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.
Files changed (71) hide show
  1. package/dist/api/index.js +3 -3
  2. package/dist/app/index.d.ts +116 -22
  3. package/dist/app/index.js +8 -8
  4. package/dist/auth/index.js +4 -4
  5. package/dist/charts/index.js +4 -4
  6. package/dist/{chunk-DCMFNSJ6.js → chunk-3TS5U5BL.js} +1 -1
  7. package/dist/{chunk-VRRIHA3S.js → chunk-4CW2C5BD.js} +1 -1
  8. package/dist/{chunk-26BTE3Z4.js → chunk-5B2ZFO44.js} +1 -1
  9. package/dist/{chunk-BM2WKRAQ.js → chunk-AJOVWB47.js} +3 -3
  10. package/dist/{chunk-DH2MO5DX.js → chunk-CJ2232PQ.js} +1 -1
  11. package/dist/{chunk-TVFSVTRG.js → chunk-ETN3TTRT.js} +7 -7
  12. package/dist/{chunk-NM4A63KJ.js → chunk-IBCEAVB2.js} +56 -20
  13. package/dist/{chunk-3BLYJT5L.js → chunk-IGBPWD6S.js} +3 -3
  14. package/dist/{chunk-TB2PM2OU.js → chunk-JYBJMVNY.js} +1 -1
  15. package/dist/{chunk-TCQZ4AJI.js → chunk-LEPYXLJ2.js} +1 -1
  16. package/dist/{chunk-H3SDGC5F.js → chunk-LZT2H2MA.js} +4 -4
  17. package/dist/{chunk-VDX6DL7Z.js → chunk-NHNTX6ZL.js} +1 -1
  18. package/dist/{chunk-VHPHWTX7.js → chunk-NI37YNRP.js} +4 -4
  19. package/dist/{chunk-UZ7MSORW.js → chunk-OCVSPAKM.js} +540 -29
  20. package/dist/{chunk-LL5H7J4N.js → chunk-PQ4B62HH.js} +2 -2
  21. package/dist/{chunk-CPBT6Z2G.js → chunk-SWKAH2YM.js} +52 -20
  22. package/dist/{chunk-C75XWBYZ.js → chunk-U2H3TIHD.js} +1 -1
  23. package/dist/{chunk-AIOV5NM7.js → chunk-Z4ICFQXG.js} +1 -1
  24. package/dist/{chunk-JTSNU6KA.js → chunk-ZDKPHFTH.js} +3 -3
  25. package/dist/components/index.d.ts +307 -24
  26. package/dist/components/index.js +316 -26
  27. package/dist/components/navigation/index.js +5 -5
  28. package/dist/features/auth/index.d.ts +76 -0
  29. package/dist/features/auth/index.js +6 -6
  30. package/dist/features/clients/index.js +5 -5
  31. package/dist/features/content/index.d.ts +586 -66
  32. package/dist/features/content/index.js +1213 -312
  33. package/dist/features/crm/index.d.ts +117 -22
  34. package/dist/features/crm/index.js +6 -6
  35. package/dist/features/dashboard/index.d.ts +20 -11
  36. package/dist/features/dashboard/index.js +6 -6
  37. package/dist/features/delivery/index.d.ts +76 -0
  38. package/dist/features/delivery/index.js +5 -5
  39. package/dist/features/knowledge/index.js +4 -4
  40. package/dist/features/lead-gen/index.d.ts +41 -22
  41. package/dist/features/lead-gen/index.js +6 -6
  42. package/dist/features/monitoring/index.js +7 -7
  43. package/dist/features/monitoring/requests/index.js +5 -5
  44. package/dist/features/operations/index.d.ts +40 -22
  45. package/dist/features/operations/index.js +9 -9
  46. package/dist/features/settings/index.d.ts +76 -0
  47. package/dist/features/settings/index.js +6 -6
  48. package/dist/hooks/access/index.js +4 -4
  49. package/dist/hooks/delivery/index.d.ts +76 -0
  50. package/dist/hooks/delivery/index.js +2 -2
  51. package/dist/hooks/index.d.ts +1259 -32
  52. package/dist/hooks/index.js +4 -4
  53. package/dist/hooks/operations/command-view/utils/transformCommandViewData.d.ts +20 -11
  54. package/dist/hooks/published.d.ts +1259 -32
  55. package/dist/hooks/published.js +4 -4
  56. package/dist/initialization/index.d.ts +76 -0
  57. package/dist/knowledge/index.d.ts +40 -22
  58. package/dist/knowledge/index.js +18 -18
  59. package/dist/{knowledge-search-index-LP2WVSQX.js → knowledge-search-index-RZLIVWPJ.js} +5 -5
  60. package/dist/layout/index.js +7 -7
  61. package/dist/profile/index.d.ts +76 -0
  62. package/dist/provider/index.d.ts +116 -22
  63. package/dist/provider/index.js +4 -4
  64. package/dist/provider/published.d.ts +116 -22
  65. package/dist/provider/published.js +4 -4
  66. package/dist/supabase/index.d.ts +149 -0
  67. package/dist/test-utils/index.js +3 -3
  68. package/dist/types/index.d.ts +126 -14
  69. package/dist/utils/index.d.ts +20 -11
  70. package/dist/utils/index.js +1 -1
  71. package/package.json +5 -5
@@ -1,8 +1,8 @@
1
1
  import { mantineThemeOverride, createCssVariablesResolver, PresetsProvider } from './chunk-R6NMRXNO.js';
2
2
  import { PRESETS, getPreset, AppBackground, generateShades } from './chunk-RBGVNPA6.js';
3
3
  import { useSupabase } from './chunk-MKH2KOAO.js';
4
- import { HTTP_HEADERS, ApiClientProvider, useApiClient } from './chunk-VDX6DL7Z.js';
5
- import { showApiErrorNotification, showSuccessNotification, projectKeys, noteKeys, taskKeys, milestoneKeys } from './chunk-C75XWBYZ.js';
4
+ import { HTTP_HEADERS, ApiClientProvider, useApiClient } from './chunk-NHNTX6ZL.js';
5
+ import { showApiErrorNotification, showSuccessNotification, projectKeys, noteKeys, taskKeys, milestoneKeys } from './chunk-U2H3TIHD.js';
6
6
  import { topbarHeight, sidebarTransitionDuration, sidebarBottomSectionHeight, SubshellSidebarSection, sidebarItemPadding, sidebarItemHeight, sidebarIconSize, sidebarIconStroke, sidebarIconInnerSize, SubshellNavItem } from './chunk-MISHPEJX.js';
7
7
  import { CardHeader } from './chunk-62GVNH5U.js';
8
8
  import { InitializationContext, useInitialization, InitializationProvider } from './chunk-P45GQ3ZW.js';
@@ -12,7 +12,7 @@ import { getStatusIcon } from './chunk-BLXJEIQS.js';
12
12
  import { invalidateOrgScopedQueries, OrganizationProvider } from './chunk-UD657ICS.js';
13
13
  import { OrganizationContext, useOrganization } from './chunk-DD3CCMCZ.js';
14
14
  import { ProfileProvider } from './chunk-RT4KRGZT.js';
15
- import { LabelSchema, DescriptionSchema, PathSchema, ModelIdSchema, IconNameSchema, SystemLifecycleSchema, OntologyIdSchema, SystemPathSchema, ActionInvocationSchema, SystemIdSchema, NodeIdStringSchema, JsonValueSchema, SystemInterfaceRefSchema, EntitiesDomainSchema, ActionsDomainSchema, DEFAULT_ORGANIZATION_MODEL_ACTIONS, OntologyScopeSchema, DEFAULT_ONTOLOGY_SCOPE, SystemsDomainSchema, DEFAULT_ORGANIZATION_MODEL_SYSTEMS, formatOntologyId, listResolvedOntologyRecords, getErrorInfo, getErrorTitle, formatErrorMessage, compileOrganizationOntology, listAllSystems, ontologyGraphNodeId, parseOntologyId, getSystem, STALE_TIME_DEFAULT, GC_TIME_SHORT, STALE_TIME_MONITORING, getResourceIcon, formatTimeAgo, APIClientError, getResourcesForSystem, STALE_TIME_ADMIN, GC_TIME_MEDIUM, formatRelativeTime, PAGE_SIZE_DEFAULT, devOnlyFor, topLevel, parentOf, ancestorsOf, childrenOf, findById, findByPath, resolveSystemConfig, defaultPathFor } from './chunk-NM4A63KJ.js';
15
+ import { LabelSchema, DescriptionSchema, PathSchema, ModelIdSchema, IconNameSchema, SystemLifecycleSchema, OntologyIdSchema, SystemPathSchema, ActionInvocationSchema, SystemIdSchema, NodeIdStringSchema, JsonValueSchema, SystemInterfaceRefSchema, EntitiesDomainSchema, ActionsDomainSchema, DEFAULT_ORGANIZATION_MODEL_ACTIONS, OntologyScopeSchema, DEFAULT_ONTOLOGY_SCOPE, SystemsDomainSchema, DEFAULT_ORGANIZATION_MODEL_SYSTEMS, formatOntologyId, listResolvedOntologyRecords, getErrorInfo, getErrorTitle, formatErrorMessage, compileOrganizationOntology, listAllSystems, ontologyGraphNodeId, parseOntologyId, getSystem, STALE_TIME_DEFAULT, GC_TIME_SHORT, STALE_TIME_MONITORING, getResourceIcon, formatTimeAgo, APIClientError, getResourcesForSystem, STALE_TIME_ADMIN, GC_TIME_MEDIUM, formatRelativeTime, PAGE_SIZE_DEFAULT, devOnlyFor, topLevel, parentOf, ancestorsOf, childrenOf, findById, findByPath, resolveSystemConfig, defaultPathFor } from './chunk-IBCEAVB2.js';
16
16
  import { getTimeRangeLabel, getTimeRangeDates, formatBucketTime, REFETCH_INTERVAL_DASHBOARD, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY, REFETCH_INTERVAL_RUNNING, debounce } from './chunk-Y6I3IC45.js';
17
17
  import { ResourceStatusColors } from './chunk-6SSQGWK7.js';
18
18
  import { ElevasisServiceContext, useElevasisServices, ElevasisServiceProvider } from './chunk-BI5VDO2K.js';
@@ -2094,7 +2094,7 @@ function deriveActions(deal, actions = []) {
2094
2094
  return actions.filter((a) => a.isAvailableFor(deal)).map(({ key, label, payloadSchema }) => ({ key, label, payloadSchema }));
2095
2095
  }
2096
2096
  var ContentPipelineStepActorSchema = z.enum(["workflow", "agent", "vendor"]);
2097
- var ContentPipelineStepReviewModeSchema = z.enum(["live", "queued", "none"]);
2097
+ var ContentPipelineStepReviewModeSchema = z.enum(["none", "required"]);
2098
2098
  var ContentPayloadFieldTypeSchema = z.enum(["string", "text", "number", "boolean", "url", "string-array"]);
2099
2099
  var ContentPayloadFieldDeclarationSchema = z.object({
2100
2100
  key: z.string().trim().min(1).max(200),
@@ -2102,6 +2102,7 @@ var ContentPayloadFieldDeclarationSchema = z.object({
2102
2102
  type: ContentPayloadFieldTypeSchema,
2103
2103
  required: z.boolean().optional()
2104
2104
  });
2105
+ var ContentWorkspaceRouteSchema = z.string().trim().min(1).max(400).regex(/^\//, 'workspaceRoute must be an app-relative path beginning with "/"');
2105
2106
  var ContentPipelineStepDeclarationSchema = z.object({
2106
2107
  label: z.string().trim().min(1).max(160).optional(),
2107
2108
  description: z.string().trim().min(1).max(2e3).optional(),
@@ -2127,8 +2128,25 @@ var ContentPipelineStepDeclarationSchema = z.object({
2127
2128
  * Resource at all.
2128
2129
  */
2129
2130
  actionId: z.string().trim().min(1).max(200).optional(),
2131
+ /**
2132
+ * Per-step override of the pipeline's `workspaceRoute`. Absent on almost every
2133
+ * step -- the pipeline-level route is the common case, and this exists for the
2134
+ * chains whose gates are genuinely different screens (the video pipeline
2135
+ * reviews text candidates, then rendered video, then copy plus a schedule).
2136
+ *
2137
+ * Resolution is override-then-fallback: a display surface takes this when the
2138
+ * step declares one and the pipeline's otherwise. See `ContentWorkspaceRouteSchema`.
2139
+ */
2140
+ workspaceRoute: ContentWorkspaceRouteSchema.optional(),
2130
2141
  payloadFields: z.array(ContentPayloadFieldDeclarationSchema).default([])
2131
2142
  });
2143
+ function resolveContentWorkspaceRoute(pipeline, step) {
2144
+ return step?.workspaceRoute ?? pipeline?.workspaceRoute;
2145
+ }
2146
+ function resolveContentReviewVenue(pipeline, step) {
2147
+ if (step.reviewMode === "none") return "none";
2148
+ return resolveContentWorkspaceRoute(pipeline, step) !== void 0 ? "workspace" : "queue";
2149
+ }
2132
2150
  z.object({
2133
2151
  label: z.string().trim().min(1).max(160).optional(),
2134
2152
  description: z.string().trim().min(1).max(2e3).optional(),
@@ -2307,7 +2325,8 @@ function getLeadGenStageCatalog(model) {
2307
2325
  );
2308
2326
  }
2309
2327
  var CONTENT_SYSTEM_PATH = "content";
2310
- function contentStepsFromCatalog(stepCatalog) {
2328
+ function contentStepsFromCatalog(stepCatalog, pipelineWorkspaceRoute) {
2329
+ const pipeline = { workspaceRoute: pipelineWorkspaceRoute };
2311
2330
  return entriesOf(stepCatalog).flatMap(([stepId, entry]) => {
2312
2331
  const parsed = ContentPipelineStepDeclarationSchema.safeParse(entry);
2313
2332
  if (!parsed.success) return [];
@@ -2319,8 +2338,10 @@ function contentStepsFromCatalog(stepCatalog) {
2319
2338
  order: parsed.data.order ?? Number.MAX_SAFE_INTEGER,
2320
2339
  actor: parsed.data.actor,
2321
2340
  reviewMode: parsed.data.reviewMode,
2341
+ reviewVenue: resolveContentReviewVenue(pipeline, parsed.data),
2322
2342
  ...parsed.data.advancesTo !== void 0 ? { advancesTo: parsed.data.advancesTo } : {},
2323
2343
  ...parsed.data.actionId !== void 0 ? { actionId: parsed.data.actionId } : {},
2344
+ ...parsed.data.workspaceRoute !== void 0 ? { workspaceRoute: parsed.data.workspaceRoute } : {},
2324
2345
  payloadFields: parsed.data.payloadFields
2325
2346
  }
2326
2347
  ];
@@ -2335,9 +2356,10 @@ function getContentBuildTemplates(model) {
2335
2356
  );
2336
2357
  return catalogs.filter((catalog) => catalog.kind === "content-pipeline").flatMap(
2337
2358
  (catalog) => entriesOf(catalog).map(([templateId, templateEntry]) => {
2359
+ const workspaceRoute = ContentWorkspaceRouteSchema.safeParse(templateEntry.workspaceRoute);
2338
2360
  const stepCatalogId = stringValue(templateEntry.stepCatalog);
2339
2361
  const stepCatalog = stepCatalogId !== void 0 ? stepCatalogs.get(stepCatalogId) : void 0;
2340
- const steps = stepCatalog === void 0 ? [] : contentStepsFromCatalog(stepCatalog);
2362
+ const steps = stepCatalog === void 0 ? [] : contentStepsFromCatalog(stepCatalog, workspaceRoute.success ? workspaceRoute.data : void 0);
2341
2363
  return {
2342
2364
  order: numberValue(templateEntry.order, Number.MAX_SAFE_INTEGER),
2343
2365
  template: {
@@ -2345,6 +2367,7 @@ function getContentBuildTemplates(model) {
2345
2367
  label: stringValue(templateEntry.label) ?? templateId,
2346
2368
  ...stringValue(templateEntry.description) ? { description: stringValue(templateEntry.description) } : {},
2347
2369
  ...stringValue(templateEntry.color) ? { color: stringValue(templateEntry.color) } : {},
2370
+ ...workspaceRoute.success ? { workspaceRoute: workspaceRoute.data } : {},
2348
2371
  steps
2349
2372
  }
2350
2373
  };
@@ -2364,7 +2387,8 @@ function getContentStageCatalog(model) {
2364
2387
  label: stringValue(entry.label) ?? entryId,
2365
2388
  description: stringValue(entry.description) ?? "",
2366
2389
  order: numberValue(entry.order),
2367
- ...stringValue(entry.color) ? { color: stringValue(entry.color) } : {}
2390
+ ...stringValue(entry.color) ? { color: stringValue(entry.color) } : {},
2391
+ ...stringValue(entry.semanticClass) ? { semanticClass: stringValue(entry.semanticClass) } : {}
2368
2392
  };
2369
2393
  }
2370
2394
  }
@@ -4272,7 +4296,7 @@ function buildContentItems(vocabulary) {
4272
4296
  ];
4273
4297
  }
4274
4298
  var CONTENT_ITEMS = buildContentItems(DEFAULT_CONTENT_VOCABULARY);
4275
- var ContentSidebarMiddle = ({ createItems, items } = {}) => {
4299
+ var ContentSidebarMiddle = ({ workspaceItems, createItems, items } = {}) => {
4276
4300
  const { currentPath, navigate } = useRouterContext();
4277
4301
  const { vocabulary } = useContentConfig();
4278
4302
  const navItems = items ?? buildContentItems(vocabulary);
@@ -4291,16 +4315,17 @@ var ContentSidebarMiddle = ({ createItems, items } = {}) => {
4291
4315
  item.to
4292
4316
  );
4293
4317
  });
4294
- const hasCreateItems = createItems !== void 0 && createItems.length > 0;
4318
+ const resolvedWorkspaceItems = workspaceItems ?? createItems;
4319
+ const hasWorkspaceItems = resolvedWorkspaceItems !== void 0 && resolvedWorkspaceItems.length > 0;
4295
4320
  return /* @__PURE__ */ jsxs(Stack, { gap: 0, style: { flex: 1, overflowY: "auto" }, children: [
4296
- /* @__PURE__ */ jsx(SubshellSidebarSection, { icon: IconPencil, label: "Create" }),
4297
- hasCreateItems ? /* @__PURE__ */ jsx(Stack, { gap: 0, p: "sm", children: renderItems2(createItems) }) : /* @__PURE__ */ jsx(Box, { p: "sm", c: "var(--color-text-subtle)", style: { fontSize: "var(--mantine-font-size-xs)" }, children: "No authoring pages declared yet." }),
4321
+ /* @__PURE__ */ jsx(SubshellSidebarSection, { icon: IconPencil, label: "Workspace" }),
4322
+ hasWorkspaceItems ? /* @__PURE__ */ jsx(Stack, { gap: 0, p: "sm", children: renderItems2(resolvedWorkspaceItems) }) : /* @__PURE__ */ jsx(Box, { p: "sm", c: "var(--color-text-subtle)", style: { fontSize: "var(--mantine-font-size-xs)" }, children: "No workspace pages declared yet." }),
4298
4323
  /* @__PURE__ */ jsx(SubshellSidebarSection, { icon: IconRoute, label: "Content Pipeline", withTopBorder: true }),
4299
4324
  /* @__PURE__ */ jsx(Stack, { gap: 0, p: "sm", children: renderItems2(navItems) })
4300
4325
  ] });
4301
4326
  };
4302
- var ContentSidebar = ({ createItems, children } = {}) => {
4303
- return /* @__PURE__ */ jsx(Stack, { gap: 0, style: { height: "100%", display: "flex", flexDirection: "column" }, children: children ?? /* @__PURE__ */ jsx(ContentSidebarMiddle, { createItems }) });
4327
+ var ContentSidebar = ({ workspaceItems, createItems, children } = {}) => {
4328
+ return /* @__PURE__ */ jsx(Stack, { gap: 0, style: { height: "100%", display: "flex", flexDirection: "column" }, children: children ?? /* @__PURE__ */ jsx(ContentSidebarMiddle, { workspaceItems: workspaceItems ?? createItems }) });
4304
4329
  };
4305
4330
  var MISSING_CONTEXT_ANSWER = {
4306
4331
  allowed: false,
@@ -8052,6 +8077,148 @@ function useTransitionItem() {
8052
8077
  });
8053
8078
  }
8054
8079
 
8080
+ // src/hooks/cloud-storage/queryKeys.ts
8081
+ var cloudStorageKeys = {
8082
+ all: ["cloud-storage"],
8083
+ folders: () => [...cloudStorageKeys.all, "folders"],
8084
+ folder: (organizationId, filters) => [...cloudStorageKeys.folders(), organizationId, filters],
8085
+ thumbnails: () => [...cloudStorageKeys.all, "thumbnails"],
8086
+ /**
8087
+ * One key per resolved batch (at most `THUMBNAIL_BATCH_SIZE` ids) -- `useQueries`
8088
+ * issues one query per batch, so the batch's own id list is part of its key.
8089
+ */
8090
+ thumbnailBatch: (organizationId, credentialName, batchFileIds) => [...cloudStorageKeys.thumbnails(), organizationId, credentialName, batchFileIds],
8091
+ temporaryLinks: () => [...cloudStorageKeys.all, "temporary-links"],
8092
+ /**
8093
+ * Keyed per file. Shared by every consumer that needs the original's bytes --
8094
+ * measuring, cropping, and previewing all read this one key, so a selected
8095
+ * image resolves one link and downloads once rather than three times.
8096
+ */
8097
+ temporaryLinkFor: (organizationId, credentialName, fileId) => [...cloudStorageKeys.temporaryLinks(), organizationId, credentialName, fileId],
8098
+ imageDimensions: () => [...cloudStorageKeys.all, "image-dimensions"],
8099
+ /**
8100
+ * Keyed per file rather than per set -- dimensions are measured one file at a time
8101
+ * and a measured file stays measured no matter what else is selected alongside it.
8102
+ */
8103
+ imageDimensionsFor: (organizationId, credentialName, fileId) => [...cloudStorageKeys.imageDimensions(), organizationId, credentialName, fileId]
8104
+ };
8105
+ function useCloudStorageFolder(params) {
8106
+ const { apiRequest, isReady, workOSOrganizationId } = useElevasisServices();
8107
+ const { credentialName, folderPath, cursor } = params;
8108
+ return useQuery({
8109
+ queryKey: cloudStorageKeys.folder(workOSOrganizationId ?? void 0, { credentialName, folderPath, cursor }),
8110
+ queryFn: async () => {
8111
+ const searchParams = new URLSearchParams({ credentialName });
8112
+ if (folderPath) searchParams.set("folderPath", folderPath);
8113
+ if (cursor) searchParams.set("cursor", cursor);
8114
+ return apiRequest(`/integrations/dropbox/files?${searchParams.toString()}`);
8115
+ },
8116
+ enabled: isReady && !!credentialName
8117
+ });
8118
+ }
8119
+ var THUMBNAIL_BATCH_SIZE = 25;
8120
+ function chunkIntoBatches(items, size) {
8121
+ if (size <= 0) {
8122
+ return items.length ? [items] : [];
8123
+ }
8124
+ const batches = [];
8125
+ for (let i = 0; i < items.length; i += size) {
8126
+ batches.push(items.slice(i, i + size));
8127
+ }
8128
+ return batches;
8129
+ }
8130
+ function mergeThumbnailBatches(batches) {
8131
+ const thumbnails = {};
8132
+ let connected = false;
8133
+ for (const batch of batches) {
8134
+ if (!batch) continue;
8135
+ Object.assign(thumbnails, batch.thumbnails);
8136
+ if (batch.connected) connected = true;
8137
+ }
8138
+ return { thumbnails, connected };
8139
+ }
8140
+ function useCloudStorageThumbnails(credentialName, fileIds) {
8141
+ const { apiRequest, isReady, workOSOrganizationId } = useElevasisServices();
8142
+ const batches = chunkIntoBatches(fileIds, THUMBNAIL_BATCH_SIZE);
8143
+ const results = useQueries({
8144
+ queries: batches.map((batchIds) => ({
8145
+ queryKey: cloudStorageKeys.thumbnailBatch(workOSOrganizationId ?? void 0, credentialName, batchIds),
8146
+ queryFn: async () => {
8147
+ const searchParams = new URLSearchParams({ credentialName, ids: batchIds.join(",") });
8148
+ return apiRequest(
8149
+ `/integrations/dropbox/thumbnails?${searchParams.toString()}`
8150
+ );
8151
+ },
8152
+ enabled: isReady && !!credentialName && batchIds.length > 0
8153
+ }))
8154
+ });
8155
+ const { thumbnails, connected } = mergeThumbnailBatches(results.map((result) => result.data));
8156
+ return {
8157
+ thumbnails,
8158
+ connected,
8159
+ isLoading: results.some((result) => result.isLoading)
8160
+ };
8161
+ }
8162
+ var TEMPORARY_LINK_STALE_MS = 60 * 60 * 1e3;
8163
+ function useCloudStorageTemporaryLinks(credentialName, fileIds) {
8164
+ const { apiRequest, isReady, workOSOrganizationId } = useElevasisServices();
8165
+ const results = useQueries({
8166
+ queries: fileIds.map((fileId) => ({
8167
+ queryKey: cloudStorageKeys.temporaryLinkFor(workOSOrganizationId ?? void 0, credentialName, fileId),
8168
+ queryFn: async () => {
8169
+ const searchParams = new URLSearchParams({ credentialName, id: fileId });
8170
+ const response = await apiRequest(
8171
+ `/integrations/dropbox/temporary-link?${searchParams.toString()}`
8172
+ );
8173
+ return response.link;
8174
+ },
8175
+ enabled: isReady && !!credentialName && !!fileId,
8176
+ staleTime: TEMPORARY_LINK_STALE_MS
8177
+ }))
8178
+ });
8179
+ const links = {};
8180
+ results.forEach((result, index) => {
8181
+ const fileId = fileIds[index];
8182
+ if (fileId !== void 0 && result.data !== void 0) links[fileId] = result.data;
8183
+ });
8184
+ return { links, isLoading: results.some((result) => result.isLoading) };
8185
+ }
8186
+
8187
+ // src/hooks/cloud-storage/useCloudStorageImageDimensions.ts
8188
+ function measureImageDimensions(url) {
8189
+ return new Promise((resolve) => {
8190
+ const image = new Image();
8191
+ image.onload = () => resolve({ width: image.naturalWidth, height: image.naturalHeight });
8192
+ image.onerror = () => resolve(null);
8193
+ image.src = url;
8194
+ });
8195
+ }
8196
+ function useCloudStorageImageDimensions(credentialName, fileIds) {
8197
+ const { isReady, workOSOrganizationId } = useElevasisServices();
8198
+ const { links, isLoading: isResolvingLinks } = useCloudStorageTemporaryLinks(credentialName, fileIds);
8199
+ const results = useQueries({
8200
+ queries: fileIds.map((fileId) => {
8201
+ const link = links[fileId];
8202
+ return {
8203
+ queryKey: cloudStorageKeys.imageDimensionsFor(workOSOrganizationId ?? void 0, credentialName, fileId),
8204
+ queryFn: async () => link ? measureImageDimensions(link) : null,
8205
+ // `link === undefined` means the link query has not settled; `null` means it
8206
+ // settled with nothing, which is a measurable outcome (`null` dimensions).
8207
+ enabled: isReady && !!credentialName && !!fileId && link !== void 0,
8208
+ // The underlying file does not change size, so re-measuring on every remount
8209
+ // would re-download the original for a value that cannot have moved.
8210
+ staleTime: 60 * 60 * 1e3
8211
+ };
8212
+ })
8213
+ });
8214
+ const dimensions = {};
8215
+ results.forEach((result, index) => {
8216
+ const fileId = fileIds[index];
8217
+ if (fileId !== void 0 && result.data !== void 0) dimensions[fileId] = result.data;
8218
+ });
8219
+ return { dimensions, isLoading: isResolvingLinks || results.some((result) => result.isLoading) };
8220
+ }
8221
+
8055
8222
  // src/features/crm/workbench/constants.ts
8056
8223
  var SAVED_VIEW_PRESETS = [
8057
8224
  {
@@ -9786,6 +9953,7 @@ function useSessionWebSocket(sessionId, apiUrl) {
9786
9953
  const wsRef = useRef(null);
9787
9954
  const retryCountRef = useRef(0);
9788
9955
  const reconnectTimeoutRef = useRef(null);
9956
+ const connectionEpochRef = useRef(0);
9789
9957
  const { getAccessToken } = useAuthContext();
9790
9958
  const { currentWorkOSOrganizationId, currentSupabaseOrganizationId } = useOrganization();
9791
9959
  const queryClient = useQueryClient();
@@ -9807,10 +9975,14 @@ function useSessionWebSocket(sessionId, apiUrl) {
9807
9975
  if (wsRef.current?.readyState === WebSocket.OPEN || wsRef.current?.readyState === WebSocket.CONNECTING) {
9808
9976
  return;
9809
9977
  }
9978
+ const epoch = connectionEpochRef.current;
9810
9979
  const token = await getAccessTokenRef.current();
9811
9980
  if (!token) {
9812
9981
  return;
9813
9982
  }
9983
+ if (epoch !== connectionEpochRef.current) {
9984
+ return;
9985
+ }
9814
9986
  const orgId = currentWorkOSOrgIdRef.current;
9815
9987
  const wsUrl = `${getWsUrl(apiUrl)}/ws/sessions/${sessionId}?token=${token}&orgId=${orgId}`;
9816
9988
  const ws = new WebSocket(wsUrl);
@@ -9902,11 +10074,18 @@ function useSessionWebSocket(sessionId, apiUrl) {
9902
10074
  connect();
9903
10075
  }
9904
10076
  return () => {
10077
+ connectionEpochRef.current += 1;
9905
10078
  if (reconnectTimeoutRef.current) {
9906
10079
  clearTimeout(reconnectTimeoutRef.current);
10080
+ reconnectTimeoutRef.current = null;
9907
10081
  }
9908
- if (wsRef.current) {
9909
- wsRef.current.close();
10082
+ const ws = wsRef.current;
10083
+ if (ws) {
10084
+ ws.onopen = null;
10085
+ ws.onmessage = null;
10086
+ ws.onerror = null;
10087
+ ws.onclose = null;
10088
+ ws.close();
9910
10089
  wsRef.current = null;
9911
10090
  }
9912
10091
  };
@@ -12298,6 +12477,21 @@ var contentKeys = {
12298
12477
  itemsList: (organizationId, filters) => [...contentKeys.items(), "list", organizationId, filters],
12299
12478
  itemDetail: (organizationId, itemId) => [...contentKeys.items(), "detail", organizationId, itemId],
12300
12479
  itemAttempts: (organizationId, itemId) => [...contentKeys.items(), "attempts", organizationId, itemId],
12480
+ /**
12481
+ * One item's ordered source-asset membership (`content_item_source_assets`).
12482
+ *
12483
+ * Nested under `items()` on purpose, matching `itemAttempts`: membership is a
12484
+ * property of the item, and every item read that expands `sourceAssets` goes
12485
+ * stale for exactly the same writes. That makes `contentKeys.items()` a
12486
+ * prefix that reaches this key, the item list, and the item detail in one
12487
+ * invalidation -- which is why the membership mutations invalidate both this
12488
+ * key (the direct read) and `items()` (every reader carrying the expansion).
12489
+ *
12490
+ * Distinct from `sourceAssets()` below, which keys the assets themselves.
12491
+ * A membership row carries `sourceAssetId` and no display fields, so the two
12492
+ * caches are never interchangeable.
12493
+ */
12494
+ itemSourceAssets: (organizationId, itemId) => [...contentKeys.items(), "source-assets", organizationId, itemId],
12301
12495
  distributions: () => [...contentKeys.all, "distributions"],
12302
12496
  distributionsList: (organizationId, filters) => [...contentKeys.distributions(), "list", organizationId, filters],
12303
12497
  distributionDetail: (organizationId, distributionId) => [...contentKeys.distributions(), "detail", organizationId, distributionId],
@@ -12396,6 +12590,29 @@ function useUpdateContentItem() {
12396
12590
  }
12397
12591
  });
12398
12592
  }
12593
+ function useCreateContentDistribution() {
12594
+ const { apiRequest, workOSOrganizationId } = useElevasisServices();
12595
+ const queryClient = useQueryClient();
12596
+ return useMutation({
12597
+ mutationFn: async (distribution) => {
12598
+ return apiRequest("/content/distributions", {
12599
+ method: "POST",
12600
+ body: JSON.stringify(distribution)
12601
+ });
12602
+ },
12603
+ onSuccess: (_data, { contentItemId }) => {
12604
+ void queryClient.invalidateQueries({ queryKey: contentKeys.distributions() });
12605
+ void queryClient.invalidateQueries({ queryKey: contentKeys.items() });
12606
+ void queryClient.invalidateQueries({
12607
+ queryKey: contentKeys.itemDetail(workOSOrganizationId ?? void 0, contentItemId)
12608
+ });
12609
+ },
12610
+ onError: (error) => {
12611
+ console.error("Failed to create content distribution:", error);
12612
+ showApiErrorNotification(error);
12613
+ }
12614
+ });
12615
+ }
12399
12616
  function useUpdateContentDistribution() {
12400
12617
  const { apiRequest, workOSOrganizationId } = useElevasisServices();
12401
12618
  const queryClient = useQueryClient();
@@ -12469,6 +12686,25 @@ function useContentSourceAsset(sourceAssetId) {
12469
12686
  enabled: isReady && !!sourceAssetId
12470
12687
  });
12471
12688
  }
12689
+ function useCreateContentItem() {
12690
+ const { apiRequest } = useElevasisServices();
12691
+ const queryClient = useQueryClient();
12692
+ return useMutation({
12693
+ mutationFn: async (item) => {
12694
+ return apiRequest("/content/items", {
12695
+ method: "POST",
12696
+ body: JSON.stringify(item)
12697
+ });
12698
+ },
12699
+ onSuccess: () => {
12700
+ void queryClient.invalidateQueries({ queryKey: contentKeys.items() });
12701
+ },
12702
+ onError: (error) => {
12703
+ console.error("Failed to create content item:", error);
12704
+ showApiErrorNotification(error);
12705
+ }
12706
+ });
12707
+ }
12472
12708
  function useCreateContentSourceAsset() {
12473
12709
  const { apiRequest } = useElevasisServices();
12474
12710
  const queryClient = useQueryClient();
@@ -12513,6 +12749,154 @@ function useUpdateContentSourceAsset() {
12513
12749
  }
12514
12750
  });
12515
12751
  }
12752
+ function useContentItemSourceAssets(itemId) {
12753
+ const { apiRequest, isReady, workOSOrganizationId } = useElevasisServices();
12754
+ return useQuery({
12755
+ queryKey: contentKeys.itemSourceAssets(workOSOrganizationId ?? void 0, itemId),
12756
+ queryFn: async () => {
12757
+ return apiRequest(`/content/items/${itemId}/source-assets`);
12758
+ },
12759
+ enabled: isReady && !!itemId
12760
+ });
12761
+ }
12762
+ function readItemSourceAssets(item) {
12763
+ const sourceAssets = item?.sourceAssets;
12764
+ if (sourceAssets === void 0) return { expanded: false, sourceAssets: void 0 };
12765
+ return { expanded: true, sourceAssets };
12766
+ }
12767
+ function pickCoverSourceAsset(memberships) {
12768
+ if (!memberships || memberships.length === 0) return void 0;
12769
+ return memberships.reduce((lowest, candidate) => candidate.position < lowest.position ? candidate : lowest);
12770
+ }
12771
+ function joinSourceAssetDetails(memberships, assets) {
12772
+ const byId = /* @__PURE__ */ new Map();
12773
+ for (const asset of assets) {
12774
+ if (asset) byId.set(asset.id, asset);
12775
+ }
12776
+ return memberships.map((membership) => ({
12777
+ membership,
12778
+ asset: byId.get(membership.sourceAssetId)
12779
+ }));
12780
+ }
12781
+ function useContentItemSourceAssetDetails(itemId) {
12782
+ const { apiRequest, isReady, workOSOrganizationId } = useElevasisServices();
12783
+ const membershipQuery = useContentItemSourceAssets(itemId);
12784
+ const memberships = membershipQuery.data?.data ?? [];
12785
+ const assetQueries = useQueries({
12786
+ queries: memberships.map((membership) => ({
12787
+ queryKey: contentKeys.sourceAssetDetail(workOSOrganizationId ?? void 0, membership.sourceAssetId),
12788
+ queryFn: async () => {
12789
+ return apiRequest(`/content/source-assets/${membership.sourceAssetId}`);
12790
+ },
12791
+ enabled: isReady
12792
+ }))
12793
+ });
12794
+ return {
12795
+ memberships: joinSourceAssetDetails(
12796
+ memberships,
12797
+ assetQueries.map((query) => query.data)
12798
+ ),
12799
+ isLoading: membershipQuery.isLoading || assetQueries.some((query) => query.isLoading),
12800
+ isMembershipLoaded: membershipQuery.isSuccess
12801
+ };
12802
+ }
12803
+ function useAddContentItemSourceAsset() {
12804
+ const { apiRequest, workOSOrganizationId } = useElevasisServices();
12805
+ const queryClient = useQueryClient();
12806
+ return useMutation({
12807
+ mutationFn: async ({
12808
+ itemId,
12809
+ membership
12810
+ }) => {
12811
+ return apiRequest(`/content/items/${itemId}/source-assets`, {
12812
+ method: "POST",
12813
+ body: JSON.stringify(membership)
12814
+ });
12815
+ },
12816
+ onSuccess: (_data, { itemId }) => {
12817
+ void queryClient.invalidateQueries({
12818
+ queryKey: contentKeys.itemSourceAssets(workOSOrganizationId ?? void 0, itemId)
12819
+ });
12820
+ void queryClient.invalidateQueries({ queryKey: contentKeys.items() });
12821
+ },
12822
+ onError: (error) => {
12823
+ console.error("Failed to add content item source asset:", error);
12824
+ showApiErrorNotification(error);
12825
+ }
12826
+ });
12827
+ }
12828
+ function useRemoveContentItemSourceAsset() {
12829
+ const { apiRequest, workOSOrganizationId } = useElevasisServices();
12830
+ const queryClient = useQueryClient();
12831
+ return useMutation({
12832
+ mutationFn: async ({ itemId, sourceAssetId }) => {
12833
+ await apiRequest(`/content/items/${itemId}/source-assets/${sourceAssetId}`, {
12834
+ method: "DELETE"
12835
+ });
12836
+ },
12837
+ onSuccess: (_data, { itemId }) => {
12838
+ void queryClient.invalidateQueries({
12839
+ queryKey: contentKeys.itemSourceAssets(workOSOrganizationId ?? void 0, itemId)
12840
+ });
12841
+ void queryClient.invalidateQueries({ queryKey: contentKeys.items() });
12842
+ },
12843
+ onError: (error) => {
12844
+ console.error("Failed to remove content item source asset:", error);
12845
+ showApiErrorNotification(error);
12846
+ }
12847
+ });
12848
+ }
12849
+ function useReorderContentItemSourceAssets() {
12850
+ const { apiRequest, workOSOrganizationId } = useElevasisServices();
12851
+ const queryClient = useQueryClient();
12852
+ return useMutation({
12853
+ mutationFn: async ({
12854
+ itemId,
12855
+ orderedAssetIds
12856
+ }) => {
12857
+ return apiRequest(`/content/items/${itemId}/source-assets/reorder`, {
12858
+ method: "POST",
12859
+ body: JSON.stringify({ orderedAssetIds })
12860
+ });
12861
+ },
12862
+ onSuccess: (_data, { itemId }) => {
12863
+ void queryClient.invalidateQueries({
12864
+ queryKey: contentKeys.itemSourceAssets(workOSOrganizationId ?? void 0, itemId)
12865
+ });
12866
+ void queryClient.invalidateQueries({ queryKey: contentKeys.items() });
12867
+ },
12868
+ onError: (error) => {
12869
+ console.error("Failed to reorder content item source assets:", error);
12870
+ showApiErrorNotification(error);
12871
+ }
12872
+ });
12873
+ }
12874
+ function useUpdateContentItemSourceAsset() {
12875
+ const { apiRequest, workOSOrganizationId } = useElevasisServices();
12876
+ const queryClient = useQueryClient();
12877
+ return useMutation({
12878
+ mutationFn: async ({
12879
+ itemId,
12880
+ sourceAssetId,
12881
+ updates
12882
+ }) => {
12883
+ return apiRequest(`/content/items/${itemId}/source-assets/${sourceAssetId}`, {
12884
+ method: "PATCH",
12885
+ body: JSON.stringify(updates)
12886
+ });
12887
+ },
12888
+ onSuccess: (_data, { itemId }) => {
12889
+ void queryClient.invalidateQueries({
12890
+ queryKey: contentKeys.itemSourceAssets(workOSOrganizationId ?? void 0, itemId)
12891
+ });
12892
+ void queryClient.invalidateQueries({ queryKey: contentKeys.items() });
12893
+ },
12894
+ onError: (error) => {
12895
+ console.error("Failed to update content item source asset:", error);
12896
+ showApiErrorNotification(error);
12897
+ }
12898
+ });
12899
+ }
12516
12900
  function sumStatusCounts(statusKeys, totals) {
12517
12901
  const countsByStatus = {};
12518
12902
  let totalItems = 0;
@@ -12565,6 +12949,85 @@ function useContentPipelineSummary(pipelineId, statusKeys, stepResourceIds) {
12565
12949
  isLoading: itemResults.some((result) => result.isLoading) || runResults.some((result) => result.isLoading)
12566
12950
  };
12567
12951
  }
12952
+
12953
+ // src/hooks/storage/queryKeys.ts
12954
+ var storageKeys = {
12955
+ all: ["storage"],
12956
+ signedUrls: () => [...storageKeys.all, "signed-urls"],
12957
+ /**
12958
+ * Keyed per object rather than per set, so a path already signed stays signed no
12959
+ * matter what else is requested alongside it -- the same reason
12960
+ * `cloudStorageKeys.temporaryLinkFor` is per file.
12961
+ */
12962
+ signedUrlFor: (organizationId, bucket, path) => [...storageKeys.signedUrls(), organizationId, bucket, path]
12963
+ };
12964
+ async function blobToBase64(blob) {
12965
+ const dataUrl = await new Promise((resolve, reject) => {
12966
+ const reader = new FileReader();
12967
+ reader.onload = () => resolve(reader.result);
12968
+ reader.onerror = () => reject(reader.error ?? new Error("Failed to read the file"));
12969
+ reader.readAsDataURL(blob);
12970
+ });
12971
+ const comma = dataUrl.indexOf(",");
12972
+ if (comma === -1) throw new Error("Unreadable data URL while encoding the upload");
12973
+ return dataUrl.slice(comma + 1);
12974
+ }
12975
+ function useUploadStorageFile() {
12976
+ const { apiRequest } = useElevasisServices();
12977
+ return useMutation({
12978
+ mutationFn: async ({
12979
+ bucket,
12980
+ path,
12981
+ file,
12982
+ contentType,
12983
+ upsert
12984
+ }) => {
12985
+ const content = await blobToBase64(file);
12986
+ return apiRequest("/storage/upload", {
12987
+ method: "POST",
12988
+ body: JSON.stringify({
12989
+ bucket,
12990
+ path,
12991
+ content,
12992
+ contentType: contentType ?? file.type,
12993
+ ...upsert === void 0 ? {} : { upsert }
12994
+ })
12995
+ });
12996
+ },
12997
+ onError: (error) => {
12998
+ console.error("Failed to upload file to storage:", error);
12999
+ showApiErrorNotification(error);
13000
+ }
13001
+ });
13002
+ }
13003
+ function storageObjectRefKey(ref) {
13004
+ return `${ref.bucket}/${ref.path}`;
13005
+ }
13006
+ var SIGNED_URL_EXPIRES_IN_SECONDS = 60 * 60;
13007
+ var SIGNED_URL_STALE_MS = (SIGNED_URL_EXPIRES_IN_SECONDS - 5 * 60) * 1e3;
13008
+ function useStorageSignedUrls(refs) {
13009
+ const { apiRequest, isReady, workOSOrganizationId } = useElevasisServices();
13010
+ const results = useQueries({
13011
+ queries: refs.map(({ bucket, path }) => ({
13012
+ queryKey: storageKeys.signedUrlFor(workOSOrganizationId ?? void 0, bucket, path),
13013
+ queryFn: async () => {
13014
+ const response = await apiRequest("/storage/signed-url", {
13015
+ method: "POST",
13016
+ body: JSON.stringify({ bucket, path, expiresIn: SIGNED_URL_EXPIRES_IN_SECONDS })
13017
+ });
13018
+ return response.signedUrl;
13019
+ },
13020
+ enabled: isReady && !!bucket && !!path,
13021
+ staleTime: SIGNED_URL_STALE_MS
13022
+ }))
13023
+ });
13024
+ const urls = {};
13025
+ results.forEach((result, index) => {
13026
+ const ref = refs[index];
13027
+ if (ref !== void 0 && typeof result.data === "string") urls[storageObjectRefKey(ref)] = result.data;
13028
+ });
13029
+ return { urls, isLoading: results.some((result) => result.isLoading) };
13030
+ }
12568
13031
  function useResourceErrors({ resourceId, timeRange, hasFailures }) {
12569
13032
  const { apiRequest, workOSOrganizationId, isReady } = useElevasisServices();
12570
13033
  return useQuery({
@@ -13242,7 +13705,7 @@ function useProjectRealtime(projectId) {
13242
13705
 
13243
13706
  // ../core/src/content/review-gates.ts
13244
13707
  function isOpenContentReviewGate(entry, step) {
13245
- if (!step || step.reviewMode !== "queued") return false;
13708
+ if (!step || step.reviewVenue !== "queue") return false;
13246
13709
  if (entry.status === "running" || entry.executionId === null) return false;
13247
13710
  return true;
13248
13711
  }
@@ -13257,6 +13720,38 @@ function getOpenContentReviewGates(processingState, steps) {
13257
13720
  gates.sort((a, b) => Date.parse(a.entry.attemptedAt) - Date.parse(b.entry.attemptedAt));
13258
13721
  return gates;
13259
13722
  }
13723
+ function resolveCurrentContentStep(item, steps) {
13724
+ if (steps.length === 0) return void 0;
13725
+ const sortedSteps = [...steps].sort((a, b) => {
13726
+ if (a.order !== b.order) return a.order - b.order;
13727
+ return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
13728
+ });
13729
+ const stateKeys = Object.keys(item.processingState);
13730
+ if (stateKeys.length > 0) {
13731
+ const catalogKeys = new Set(sortedSteps.map((step) => step.key));
13732
+ const hasKnownKey = stateKeys.some((key) => catalogKeys.has(key));
13733
+ if (!hasKnownKey) return void 0;
13734
+ }
13735
+ const currentStep = sortedSteps.find((step) => {
13736
+ const entry = item.processingState[step.key];
13737
+ return !entry || entry.status !== "success";
13738
+ });
13739
+ return currentStep ?? sortedSteps[sortedSteps.length - 1];
13740
+ }
13741
+ function isAwaitingReview(item, step) {
13742
+ if (!step) return false;
13743
+ return step.reviewMode !== "none" && item.reviewedAt === null;
13744
+ }
13745
+ function resolveReviewTarget(item, pipeline, steps) {
13746
+ const gate = getOpenContentReviewGates(item.processingState, steps)[0];
13747
+ if (gate) return { kind: "queued", gate };
13748
+ const step = resolveCurrentContentStep(item, steps);
13749
+ if (step?.reviewVenue === "workspace" && isAwaitingReview(item, step)) {
13750
+ const route = resolveContentWorkspaceRoute(pipeline, step);
13751
+ if (route) return { kind: "workspace", route };
13752
+ }
13753
+ return { kind: "none" };
13754
+ }
13260
13755
 
13261
13756
  // ../core/src/content/derive-board.ts
13262
13757
  function sortPipelineSteps(steps) {
@@ -13265,7 +13760,8 @@ function sortPipelineSteps(steps) {
13265
13760
  return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
13266
13761
  });
13267
13762
  }
13268
- function deriveItemPlacement(processingState, sortedSteps) {
13763
+ function deriveItemPlacement(item, sortedSteps) {
13764
+ const processingState = item.processingState;
13269
13765
  const stateKeys = Object.keys(processingState);
13270
13766
  if (stateKeys.length > 0) {
13271
13767
  const catalogKeys = new Set(sortedSteps.map((step) => step.key));
@@ -13279,14 +13775,14 @@ function deriveItemPlacement(processingState, sortedSteps) {
13279
13775
  return !entry || entry.status !== "success";
13280
13776
  });
13281
13777
  if (!currentStep) {
13778
+ const lastStep = sortedSteps[sortedSteps.length - 1];
13779
+ if (lastStep !== void 0 && isAwaitingReview(item, lastStep)) {
13780
+ return { bucket: "column", stepKey: lastStep.key };
13781
+ }
13282
13782
  return { bucket: "done", stepKey: null };
13283
13783
  }
13284
13784
  return { bucket: "column", stepKey: currentStep.key };
13285
13785
  }
13286
- function deriveAwaitingReview(step, item) {
13287
- if (!step) return false;
13288
- return step.reviewMode !== "none" && item.reviewedAt === null;
13289
- }
13290
13786
  function deriveContentBoard(items, pipeline, now) {
13291
13787
  const sortedSteps = sortPipelineSteps(pipeline.steps);
13292
13788
  const stepsByKey = new Map(sortedSteps.map((step) => [step.key, step]));
@@ -13294,13 +13790,13 @@ function deriveContentBoard(items, pipeline, now) {
13294
13790
  const done = [];
13295
13791
  const unplaced = [];
13296
13792
  for (const item of items) {
13297
- const placement = deriveItemPlacement(item.processingState, sortedSteps);
13793
+ const placement = deriveItemPlacement(item, sortedSteps);
13298
13794
  const step = placement.stepKey ? stepsByKey.get(placement.stepKey) : void 0;
13299
13795
  const card = {
13300
13796
  item,
13301
13797
  stepKey: placement.stepKey,
13302
13798
  ageMs: now - Date.parse(item.updatedAt),
13303
- awaitingReview: deriveAwaitingReview(step, item)
13799
+ awaitingReview: isAwaitingReview(item, step)
13304
13800
  };
13305
13801
  if (placement.bucket === "done") {
13306
13802
  done.push(card);
@@ -13324,9 +13820,9 @@ function deriveContentBoard(items, pipeline, now) {
13324
13820
  const columns = sortedSteps.map((step) => {
13325
13821
  const cards = cardsByStepKey.get(step.key) ?? [];
13326
13822
  const column = { step, cards };
13327
- if (step.reviewMode === "live" || step.reviewMode === "queued") {
13823
+ if (step.reviewVenue !== "none") {
13328
13824
  column.gate = {
13329
- reviewMode: step.reviewMode,
13825
+ venue: step.reviewVenue,
13330
13826
  waitingCount: cards.filter((card) => card.awaitingReview).length
13331
13827
  };
13332
13828
  }
@@ -13417,7 +13913,22 @@ function ItemRow({ item, onClick }) {
13417
13913
  }
13418
13914
  function MyReviewQueuePanel({ onItemClick, onSeeAll, showSectionLabel = true }) {
13419
13915
  const { data, isLoading, isError } = useContentItems({ limit: FETCH_LIMIT });
13420
- const pending = (data?.data ?? []).filter((item) => item.reviewedAt === null).sort((a, b) => Date.parse(a.updatedAt) - Date.parse(b.updatedAt));
13916
+ const { pipelines } = useContentConfig();
13917
+ const { navigate } = useRouterContext();
13918
+ const handleItemClick = (item) => {
13919
+ const pipeline = pipelines.find((candidate) => candidate.id === item.pipelineId);
13920
+ const target = resolveReviewTarget(item, pipeline, pipeline?.steps ?? []);
13921
+ if (target.kind === "workspace") {
13922
+ navigate(target.route);
13923
+ return;
13924
+ }
13925
+ onItemClick(item.id);
13926
+ };
13927
+ const pending = (data?.data ?? []).filter((item) => {
13928
+ const pipeline = pipelines.find((candidate) => candidate.id === item.pipelineId);
13929
+ const step = resolveCurrentContentStep(item, pipeline?.steps ?? []);
13930
+ return isAwaitingReview(item, step);
13931
+ }).sort((a, b) => Date.parse(a.updatedAt) - Date.parse(b.updatedAt));
13421
13932
  const total = pending.length;
13422
13933
  const visible = pending.slice(0, VISIBLE_LIMIT);
13423
13934
  return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
@@ -13428,7 +13939,7 @@ function MyReviewQueuePanel({ onItemClick, onSeeAll, showSectionLabel = true })
13428
13939
  isLoading && /* @__PURE__ */ jsx(Center, { py: 4, children: /* @__PURE__ */ jsx(Loader, { size: "xs" }) }),
13429
13940
  isError && /* @__PURE__ */ jsx(Text, { size: "xs", c: "var(--color-error)", children: "Failed to load review queue" }),
13430
13941
  !isLoading && !isError && visible.length === 0 && /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: "Nothing waiting on review." }),
13431
- !isLoading && !isError && visible.map((item) => /* @__PURE__ */ jsx(ItemRow, { item, onClick: () => onItemClick(item.id) }, item.id)),
13942
+ !isLoading && !isError && visible.map((item) => /* @__PURE__ */ jsx(ItemRow, { item, onClick: () => handleItemClick(item) }, item.id)),
13432
13943
  onSeeAll && total > VISIBLE_LIMIT && /* @__PURE__ */ jsx(UnstyledButton, { onClick: onSeeAll, mt: 2, style: { display: "inline-block" }, children: /* @__PURE__ */ jsxs(Text, { size: "xs", c: "dimmed", style: { textDecoration: "underline" }, children: [
13433
13944
  "See all (",
13434
13945
  total,
@@ -15861,7 +16372,7 @@ function ConceptInfoControl({ description }) {
15861
16372
  var indexPromise = null;
15862
16373
  function loadSearchIndex() {
15863
16374
  if (!indexPromise) {
15864
- indexPromise = import('./knowledge-search-index-LP2WVSQX.js').then(
16375
+ indexPromise = import('./knowledge-search-index-RZLIVWPJ.js').then(
15865
16376
  (mod) => buildSearchIndex(mod.default ?? mod)
15866
16377
  );
15867
16378
  }
@@ -16670,4 +17181,4 @@ function createTestSystemsProvider({
16670
17181
  };
16671
17182
  }
16672
17183
 
16673
- export { APIErrorAlert, AccessGuard, AccessKeys, ActivityTimeline, ActivityTrendChart, AgentResourceEntrySchema, ApiKeyService, AppearanceContext, AppearanceProvider, CONTENT_ITEMS, CRM_ITEMS, CenteredErrorState, ChartFrame, CheckpointGroup, CollapsibleSection, CombinedTrendChart, CommandQueueSidebar, CommandQueueSidebarMiddle, CommandQueueSidebarTop, ConfirmationInputModal, ConfirmationModal, ContentSidebar, ContentSidebarMiddle, ContextViewer, CostTrendChart, CredentialSchemas, CredentialService, CrmActionsProvider, CrmSidebarMiddle, CustomModal, CustomSelector, CyberAreaChart, CyberDonut, CyberDonutTooltip, CyberLegendItem, DEFAULT_CONTENT_VOCABULARY, DEFAULT_ORGANIZATION_GRAPH_FILTERS, DEFAULT_WAIT_FOR_ORGANIZATION, DeploymentService, DetailCardSkeleton, EMPTY_LIST_ACTIONS, ElevasisCoreProvider, ElevasisLoader, ElevasisSystemsProvider, ElevasisUIProvider, EmptyState, FILTERABLE_DOMAIN_KEYS, FeatureUnavailableState, GlowDot, HeroStatsRow, IdentityDomainSchema, IntegrationResourceEntrySchema, JsonViewer, KNOWLEDGE_DOMAINS_WITH_PANELS, KNOWLEDGE_ICON_TOKEN_BY_KIND, KnowledgeSearchBar, KnowledgeTree, LEAD_GEN_ITEMS, LeadGenSidebarMiddle, ListActionsProvider, ListSkeleton, MEMBERSHIP_STATUS_COLORS, MyReviewQueuePanel, MyTasksPanel, NavigationButton, NotificationProvider, OM_NESTED_TREE_GROUPS, OM_TREE_GROUPS, ORGANIZATION_GRAPH_EDGE_KIND_LABELS, ORGANIZATION_GRAPH_EDGE_KIND_MEANINGS, ORGANIZATION_GRAPH_NODE_KIND_DETAIL_LABELS, ORGANIZATION_GRAPH_NODE_KIND_LABELS, ORGANIZATION_GRAPH_NODE_KIND_MEANINGS, ORGANIZATION_GRAPH_NODE_KIND_ORDER, OperationsService, OperationsSidebar, OperationsSidebarMiddle, OperationsSidebarTop, OrganizationMembershipService, OrganizationModelDriftActionIcon, PROVISIONING_STATE_DISPLAY, PageNotFound, PageTitleCaption, ProtectedRoute, QuickCreateActions, RequestActionIcon, RequestModal, ResourceCard, ResourcesSidebar, RoleSchema, SAVED_VIEW_PRESETS, SYSTEM_RESOURCE_KINDS, SavedViewsPanel, ScriptResourceEntrySchema, SemanticIcon, SessionListItem, SessionsSidebar, StatCard, StatCardSkeleton, StatsCardSkeleton, StatusBadge, SubshellContainer, SubshellContentContainer, SubshellRightSideContainer, SubshellSidebar, SubshellSidebarLoader, SurfaceDefinitionSchema, SystemShell, TabCountBadge, TimeRangeSelector, TrendIndicator, WebhookEndpointService, WorkflowResourceEntrySchema, acquisitionListKeys, aggregateSystemMetrics, buildKnowledgeOmTreeData, buildOrganizationGraph, clientsKeys, clientsManifest, collectResourceFilterFacets, companyKeys, computeProtectedRouteGate, contactKeys, contentKeys, contentManifest, createTestSystemsProvider, crmManifest, dealKeys, dealNoteKeys, dealTaskKeys, deliveryManifest, deriveActions, deriveContentBoard, executionsKeys, extendSemanticIconRegistry, filterByDomainFilters, findKnowledgeTreeNodeByValue, findListActionByAction, findOmTreeGroup, formatResourceAttribution, getAllBuildTemplates, getConceptDefinition, getContentItemIdentity, getCrmPipelineCatalog, getKnowledgeDomainFolderCommand, getKnowledgeGraphNodeCommand, getKnowledgeIconToken, getKnowledgeNodeReadCommand, getKnowledgeOntologyProjection, getKnowledgeTreeFolderCommand, getLeadGenStageCatalog, getListActionWorkflowId, getOntologyDomainLabel, getOpenContentReviewGates, getPrimaryOntologyItemsForDomain, getResourceFilterFacetIds, getSemanticIconComponent, getSeriesColor, getSessionView, getSharedOrganizationGraph, isSessionCapable, knowledgeManifest, labelResourceFilterFacet, leadGenArtifactKeys, leadGenListCompanyKeys, leadGenListMemberKeys, leadGenManifest, monitoringManifest, normaliseConceptKey, observabilityKeys, operationsKeys, operationsManifest, pickLatestRunAt, projectActivityKeys, projectNavigationGroups, projectNavigationSurfaces, requestTopbarActionManifest, requestsKeys, resolveContentStepResource, resolveContentVocabulary, resolveSemanticIconComponent, scheduleKeys, sessionsKeys, settingsManifest, sortData, submittedRequestsManifest, sumStatusCounts, transformMembershipToTableRow, useAccess, useActivateDeployment, useActivities, useActivitiesRealtime, useActivityFilters, useActivityTrend, useAddCompaniesToList, useAddContactsToList, useAppearance, useArchiveSession, useArchivedLogs, useArtifacts, useAssignRole, useBatchDelete, useBatchTelemetry, useBatchedResourcesHealth, useBulkDeleteExecutions, useBusinessImpact, useCancelExecution, useCancelSchedule, useCheckpointTasks, useClient, useClientStatus, useClients, useCommandQueue, useCommandQueueTask, useCommandQueueTotals, useCommandViewData, useCommandViewDomainFilters, useCommandViewStats, useCommandViewStore, useCompanies, useCompany, useCompanyFacets, useCompleteDealTask, useContact, useContacts, useContentConfig, useContentDistribution, useContentDistributions, useContentItem, useContentItemAttempts, useContentItems, useContentPipelineSummary, useContentSourceAsset, useContentSourceAssets, useCostBreakdown, useCostByModel, useCostSummary, useCostTrends, useCreateApiKey, useCreateArtifact, useCreateClient, useCreateCompany, useCreateContact, useCreateContentSourceAsset, useCreateCredential, useCreateDealNote, useCreateDealTask, useCreateList, useCreateOrgRole, useCreateSchedule, useCreateSession, useCreateWebhookEndpoint, useCredentials, useCrmActions, useCyberColors, useDashboardMetrics, useDeactivateDeployment, useDeactivateMembership, useDealDetail, useDealNotes, useDealTasks, useDealTasksDue, useDeals, useDealsLookup, useDealsSummary, useDeleteApiKey, useDeleteClient, useDeleteCompanies, useDeleteContacts, useDeleteCredential, useDeleteDeal, useDeleteDeployment, useDeleteExecution, useDeleteList, useDeleteOrgRole, useDeleteRequest, useDeleteSchedule, useDeleteSession, useDeleteTask, useDeleteWebhookEndpoint, useDeriveActions, useEffectivePermissions, useElevasisSystems, useEndSession, useErrorAnalysis, useErrorDetail, useErrorDetails, useErrorDistribution, useErrorNotification, useErrorTrends, useExecuteAction, useExecuteAsync, useExecuteResource, useExecution, useExecutionHealth, useExecutionLogSSE, useExecutionLogs, useExecutionLogsFilters, useExecutionPanelState, useExecutionSSE, useExecutions, useGetExecutionHistory, useGetSchedule, useInFlightExecutions, useLeadGenActionRegistry, useLeadGenBulkActions, useLeadGenHeaderActions, useLeadGenRowActions, useList, useListActions, useListApiKeys, useListDeployments, useListExecutions, useListMember, useListMembers, useListProgress, useListRecords, useListSchedules, useListWebhookEndpoints, useLists, useListsTelemetry, useMarkAllAsRead, useMarkAsRead, useNotificationAdapter, useNotificationCount, useNotifications, useOptionalElevasisSystems, useOrgRoles, useOrganizationMembers, useOrganizationModelDrift, usePaginationState, usePatchTask, usePauseSchedule, usePermissionCatalog, useProjectActivities, useProjectRealtime, useReactivateMembership, useRecentExecutionsByResource, useRemoveCompaniesFromList, useRequest, useRequestsList, useResolveAllErrors, useResolveError, useResolveErrorsByExecution, useResolvedOrganizationModel, useResourceDefinition, useResourceErrors, useResourceExecutions, useResourceSearch, useResources, useResourcesDomainFilters, useResourcesHealth, useResumeSchedule, useRetryExecution, useReviewContentItem, useRevokeRole, useSSEConnection, useScheduledTasks, useSession, useSessionCheck, useSessionExecution, useSessionExecutions, useSessionMessages, useSessionWebSocket, useSessions, useSortedData, useStableAccessToken, useStatusFilter, useSubmitAction, useSubmitRequest, useSuccessNotification, useSystemHealth, useSystemsViewState, useTableSelection, useTableSort, useTestNotification, useTimeRangeDates, useTopFailingResources, useTransitionItem, useTransitionListCompany, useTransitionListMember, useTransitionState, useUnresolveError, useUnresolvedErrors, useUpdateAnchor, useUpdateApiKey, useUpdateClient, useUpdateCompany, useUpdateContact, useUpdateContentDistribution, useUpdateContentItem, useUpdateContentSourceAsset, useUpdateCredential, useUpdateList, useUpdateListConfig, useUpdateListStatus, useUpdateOrgRole, useUpdateRequestStatus, useUpdateSchedule, useUpdateWebhookEndpoint, useUserMemberships, useVerifyCredential, useVisibleResources, useWarningNotification, useWorkflowExecution };
17184
+ export { APIErrorAlert, AccessGuard, AccessKeys, ActivityTimeline, ActivityTrendChart, AgentResourceEntrySchema, ApiKeyService, AppearanceContext, AppearanceProvider, CONTENT_ITEMS, CRM_ITEMS, CenteredErrorState, ChartFrame, CheckpointGroup, CollapsibleSection, CombinedTrendChart, CommandQueueSidebar, CommandQueueSidebarMiddle, CommandQueueSidebarTop, ConfirmationInputModal, ConfirmationModal, ContentSidebar, ContentSidebarMiddle, ContextViewer, CostTrendChart, CredentialSchemas, CredentialService, CrmActionsProvider, CrmSidebarMiddle, CustomModal, CustomSelector, CyberAreaChart, CyberDonut, CyberDonutTooltip, CyberLegendItem, DEFAULT_CONTENT_VOCABULARY, DEFAULT_ORGANIZATION_GRAPH_FILTERS, DEFAULT_WAIT_FOR_ORGANIZATION, DeploymentService, DetailCardSkeleton, EMPTY_LIST_ACTIONS, ElevasisCoreProvider, ElevasisLoader, ElevasisSystemsProvider, ElevasisUIProvider, EmptyState, FILTERABLE_DOMAIN_KEYS, FeatureUnavailableState, GlowDot, HeroStatsRow, IdentityDomainSchema, IntegrationResourceEntrySchema, JsonViewer, KNOWLEDGE_DOMAINS_WITH_PANELS, KNOWLEDGE_ICON_TOKEN_BY_KIND, KnowledgeSearchBar, KnowledgeTree, LEAD_GEN_ITEMS, LeadGenSidebarMiddle, ListActionsProvider, ListSkeleton, MEMBERSHIP_STATUS_COLORS, MyReviewQueuePanel, MyTasksPanel, NavigationButton, NotificationProvider, OM_NESTED_TREE_GROUPS, OM_TREE_GROUPS, ORGANIZATION_GRAPH_EDGE_KIND_LABELS, ORGANIZATION_GRAPH_EDGE_KIND_MEANINGS, ORGANIZATION_GRAPH_NODE_KIND_DETAIL_LABELS, ORGANIZATION_GRAPH_NODE_KIND_LABELS, ORGANIZATION_GRAPH_NODE_KIND_MEANINGS, ORGANIZATION_GRAPH_NODE_KIND_ORDER, OperationsService, OperationsSidebar, OperationsSidebarMiddle, OperationsSidebarTop, OrganizationMembershipService, OrganizationModelDriftActionIcon, PROVISIONING_STATE_DISPLAY, PageNotFound, PageTitleCaption, ProtectedRoute, QuickCreateActions, RequestActionIcon, RequestModal, ResourceCard, ResourcesSidebar, RoleSchema, SAVED_VIEW_PRESETS, SIGNED_URL_EXPIRES_IN_SECONDS, SYSTEM_RESOURCE_KINDS, SavedViewsPanel, ScriptResourceEntrySchema, SemanticIcon, SessionListItem, SessionsSidebar, StatCard, StatCardSkeleton, StatsCardSkeleton, StatusBadge, SubshellContainer, SubshellContentContainer, SubshellRightSideContainer, SubshellSidebar, SubshellSidebarLoader, SurfaceDefinitionSchema, SystemShell, TEMPORARY_LINK_STALE_MS, THUMBNAIL_BATCH_SIZE, TabCountBadge, TimeRangeSelector, TrendIndicator, WebhookEndpointService, WorkflowResourceEntrySchema, acquisitionListKeys, aggregateSystemMetrics, buildKnowledgeOmTreeData, buildOrganizationGraph, chunkIntoBatches, clientsKeys, clientsManifest, cloudStorageKeys, collectResourceFilterFacets, companyKeys, computeProtectedRouteGate, contactKeys, contentKeys, contentManifest, createTestSystemsProvider, crmManifest, dealKeys, dealNoteKeys, dealTaskKeys, deliveryManifest, deriveActions, deriveContentBoard, executionsKeys, extendSemanticIconRegistry, filterByDomainFilters, findKnowledgeTreeNodeByValue, findListActionByAction, findOmTreeGroup, formatResourceAttribution, getAllBuildTemplates, getConceptDefinition, getContentItemIdentity, getCrmPipelineCatalog, getKnowledgeDomainFolderCommand, getKnowledgeGraphNodeCommand, getKnowledgeIconToken, getKnowledgeNodeReadCommand, getKnowledgeOntologyProjection, getKnowledgeTreeFolderCommand, getLeadGenStageCatalog, getListActionWorkflowId, getOntologyDomainLabel, getPrimaryOntologyItemsForDomain, getResourceFilterFacetIds, getSemanticIconComponent, getSeriesColor, getSessionView, getSharedOrganizationGraph, isAwaitingReview, isSessionCapable, joinSourceAssetDetails, knowledgeManifest, labelResourceFilterFacet, leadGenArtifactKeys, leadGenListCompanyKeys, leadGenListMemberKeys, leadGenManifest, measureImageDimensions, mergeThumbnailBatches, monitoringManifest, normaliseConceptKey, observabilityKeys, operationsKeys, operationsManifest, pickCoverSourceAsset, pickLatestRunAt, projectActivityKeys, projectNavigationGroups, projectNavigationSurfaces, readItemSourceAssets, requestTopbarActionManifest, requestsKeys, resolveContentStepResource, resolveContentVocabulary, resolveContentWorkspaceRoute, resolveCurrentContentStep, resolveReviewTarget, resolveSemanticIconComponent, scheduleKeys, sessionsKeys, settingsManifest, sortData, storageKeys, storageObjectRefKey, submittedRequestsManifest, sumStatusCounts, transformMembershipToTableRow, useAccess, useActivateDeployment, useActivities, useActivitiesRealtime, useActivityFilters, useActivityTrend, useAddCompaniesToList, useAddContactsToList, useAddContentItemSourceAsset, useAppearance, useArchiveSession, useArchivedLogs, useArtifacts, useAssignRole, useBatchDelete, useBatchTelemetry, useBatchedResourcesHealth, useBulkDeleteExecutions, useBusinessImpact, useCancelExecution, useCancelSchedule, useCheckpointTasks, useClient, useClientStatus, useClients, useCloudStorageFolder, useCloudStorageImageDimensions, useCloudStorageTemporaryLinks, useCloudStorageThumbnails, useCommandQueue, useCommandQueueTask, useCommandQueueTotals, useCommandViewData, useCommandViewDomainFilters, useCommandViewStats, useCommandViewStore, useCompanies, useCompany, useCompanyFacets, useCompleteDealTask, useContact, useContacts, useContentConfig, useContentDistribution, useContentDistributions, useContentItem, useContentItemAttempts, useContentItemSourceAssetDetails, useContentItemSourceAssets, useContentItems, useContentPipelineSummary, useContentSourceAsset, useContentSourceAssets, useCostBreakdown, useCostByModel, useCostSummary, useCostTrends, useCreateApiKey, useCreateArtifact, useCreateClient, useCreateCompany, useCreateContact, useCreateContentDistribution, useCreateContentItem, useCreateContentSourceAsset, useCreateCredential, useCreateDealNote, useCreateDealTask, useCreateList, useCreateOrgRole, useCreateSchedule, useCreateSession, useCreateWebhookEndpoint, useCredentials, useCrmActions, useCyberColors, useDashboardMetrics, useDeactivateDeployment, useDeactivateMembership, useDealDetail, useDealNotes, useDealTasks, useDealTasksDue, useDeals, useDealsLookup, useDealsSummary, useDeleteApiKey, useDeleteClient, useDeleteCompanies, useDeleteContacts, useDeleteCredential, useDeleteDeal, useDeleteDeployment, useDeleteExecution, useDeleteList, useDeleteOrgRole, useDeleteRequest, useDeleteSchedule, useDeleteSession, useDeleteTask, useDeleteWebhookEndpoint, useDeriveActions, useEffectivePermissions, useElevasisSystems, useEndSession, useErrorAnalysis, useErrorDetail, useErrorDetails, useErrorDistribution, useErrorNotification, useErrorTrends, useExecuteAction, useExecuteAsync, useExecuteResource, useExecution, useExecutionHealth, useExecutionLogSSE, useExecutionLogs, useExecutionLogsFilters, useExecutionPanelState, useExecutionSSE, useExecutions, useGetExecutionHistory, useGetSchedule, useInFlightExecutions, useLeadGenActionRegistry, useLeadGenBulkActions, useLeadGenHeaderActions, useLeadGenRowActions, useList, useListActions, useListApiKeys, useListDeployments, useListExecutions, useListMember, useListMembers, useListProgress, useListRecords, useListSchedules, useListWebhookEndpoints, useLists, useListsTelemetry, useMarkAllAsRead, useMarkAsRead, useNotificationAdapter, useNotificationCount, useNotifications, useOptionalElevasisSystems, useOrgRoles, useOrganizationMembers, useOrganizationModelDrift, usePaginationState, usePatchTask, usePauseSchedule, usePermissionCatalog, useProjectActivities, useProjectRealtime, useReactivateMembership, useRecentExecutionsByResource, useRemoveCompaniesFromList, useRemoveContentItemSourceAsset, useReorderContentItemSourceAssets, useRequest, useRequestsList, useResolveAllErrors, useResolveError, useResolveErrorsByExecution, useResolvedOrganizationModel, useResourceDefinition, useResourceErrors, useResourceExecutions, useResourceSearch, useResources, useResourcesDomainFilters, useResourcesHealth, useResumeSchedule, useRetryExecution, useReviewContentItem, useRevokeRole, useSSEConnection, useScheduledTasks, useSession, useSessionCheck, useSessionExecution, useSessionExecutions, useSessionMessages, useSessionWebSocket, useSessions, useSortedData, useStableAccessToken, useStatusFilter, useStorageSignedUrls, useSubmitAction, useSubmitRequest, useSuccessNotification, useSystemHealth, useSystemsViewState, useTableSelection, useTableSort, useTestNotification, useTimeRangeDates, useTopFailingResources, useTransitionItem, useTransitionListCompany, useTransitionListMember, useTransitionState, useUnresolveError, useUnresolvedErrors, useUpdateAnchor, useUpdateApiKey, useUpdateClient, useUpdateCompany, useUpdateContact, useUpdateContentDistribution, useUpdateContentItem, useUpdateContentItemSourceAsset, useUpdateContentSourceAsset, useUpdateCredential, useUpdateList, useUpdateListConfig, useUpdateListStatus, useUpdateOrgRole, useUpdateRequestStatus, useUpdateSchedule, useUpdateWebhookEndpoint, useUploadStorageFile, useUserMemberships, useVerifyCredential, useVisibleResources, useWarningNotification, useWorkflowExecution };