@elevasis/ui 2.70.0 → 2.72.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 (72) hide show
  1. package/dist/api/index.js +3 -3
  2. package/dist/app/index.d.ts +28 -2
  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-GZADST64.js → chunk-2454MK7P.js} +7 -7
  7. package/dist/{chunk-26BTE3Z4.js → chunk-753MKWFV.js} +1 -1
  8. package/dist/{chunk-LWYLZUUV.js → chunk-7ESZKTQG.js} +3 -3
  9. package/dist/{chunk-SMH6SQQE.js → chunk-A3JHFZDP.js} +1 -1
  10. package/dist/{chunk-MFCV4JMQ.js → chunk-AFBFSXP3.js} +4 -4
  11. package/dist/{chunk-TJMZUL6E.js → chunk-DJWIIPKW.js} +3 -3
  12. package/dist/{chunk-QDMIFD6F.js → chunk-DKVGO6RJ.js} +1 -1
  13. package/dist/{chunk-LY3IKYTZ.js → chunk-IMZTRDY2.js} +2 -2
  14. package/dist/{chunk-JA2XDMAE.js → chunk-IXBRUIYI.js} +1 -1
  15. package/dist/{chunk-6TT3FQEZ.js → chunk-KIDZXZM5.js} +149 -17
  16. package/dist/{chunk-CCZJ4OWY.js → chunk-LCHL5SM2.js} +1 -1
  17. package/dist/{chunk-5C62IRKS.js → chunk-LEQGGX2U.js} +4 -4
  18. package/dist/{chunk-NM4A63KJ.js → chunk-Q3O3WY7Q.js} +23 -7
  19. package/dist/{chunk-GJQF3S2Q.js → chunk-RRS2QR3W.js} +1 -1
  20. package/dist/{chunk-DUEGHF7A.js → chunk-SV4M2BUI.js} +4 -4
  21. package/dist/{chunk-AGX2CY2O.js → chunk-UZ5JO5TK.js} +1 -1
  22. package/dist/{chunk-C75XWBYZ.js → chunk-XZIOCB5D.js} +1 -1
  23. package/dist/{chunk-VDX6DL7Z.js → chunk-Z2W5VNN3.js} +1 -1
  24. package/dist/{chunk-XKUEO4HG.js → chunk-ZBXCEWKF.js} +3 -3
  25. package/dist/components/index.d.ts +61 -5
  26. package/dist/components/index.js +23 -23
  27. package/dist/components/navigation/index.js +5 -5
  28. package/dist/features/auth/index.d.ts +26 -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 +187 -113
  32. package/dist/features/content/index.js +200 -303
  33. package/dist/features/crm/index.d.ts +29 -2
  34. package/dist/features/crm/index.js +6 -6
  35. package/dist/features/dashboard/index.d.ts +1 -1
  36. package/dist/features/dashboard/index.js +6 -6
  37. package/dist/features/delivery/index.d.ts +26 -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 +3 -2
  41. package/dist/features/lead-gen/index.js +6 -6
  42. package/dist/features/monitoring/index.d.ts +33 -3
  43. package/dist/features/monitoring/index.js +7 -7
  44. package/dist/features/monitoring/requests/index.js +5 -5
  45. package/dist/features/operations/index.d.ts +2 -2
  46. package/dist/features/operations/index.js +9 -9
  47. package/dist/features/settings/index.d.ts +26 -0
  48. package/dist/features/settings/index.js +6 -6
  49. package/dist/hooks/access/index.js +4 -4
  50. package/dist/hooks/delivery/index.d.ts +26 -0
  51. package/dist/hooks/delivery/index.js +2 -2
  52. package/dist/hooks/index.d.ts +310 -14
  53. package/dist/hooks/index.js +4 -4
  54. package/dist/hooks/operations/command-view/utils/transformCommandViewData.d.ts +1 -1
  55. package/dist/hooks/published.d.ts +310 -14
  56. package/dist/hooks/published.js +4 -4
  57. package/dist/initialization/index.d.ts +26 -0
  58. package/dist/knowledge/index.d.ts +2 -2
  59. package/dist/knowledge/index.js +18 -18
  60. package/dist/{knowledge-search-index-LP2WVSQX.js → knowledge-search-index-RZLIVWPJ.js} +5 -5
  61. package/dist/layout/index.js +7 -7
  62. package/dist/profile/index.d.ts +26 -0
  63. package/dist/provider/index.d.ts +28 -2
  64. package/dist/provider/index.js +4 -4
  65. package/dist/provider/published.d.ts +28 -2
  66. package/dist/provider/published.js +4 -4
  67. package/dist/supabase/index.d.ts +50 -0
  68. package/dist/test-utils/index.js +3 -3
  69. package/dist/types/index.d.ts +60 -4
  70. package/dist/utils/index.d.ts +1 -1
  71. package/dist/utils/index.js +1 -1
  72. package/package.json +5 -5
@@ -100,7 +100,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
100
100
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
101
101
  route: z.ZodOptional<z.ZodString>;
102
102
  }, z.core.$loose>>>>;
103
- }, z.core.$strip>>;
103
+ }, z.core.$strict>>;
104
104
  type OntologyScope = z.infer<typeof OntologyScopeSchema>;
105
105
 
106
106
  declare const SystemApiInterfaceSchema: z.ZodObject<{
@@ -241,6 +241,12 @@ interface ContentPipelineStepEntry {
241
241
  * implements the step yet. See `ContentPipelineStepDeclarationSchema`.
242
242
  */
243
243
  actionId?: string;
244
+ /**
245
+ * Per-step override of the pipeline's Workspace route. Absent on almost every
246
+ * step. Resolve it with `resolveContentWorkspaceRoute`, never by reading this
247
+ * field directly -- the fallback to the pipeline's route is the whole point.
248
+ */
249
+ workspaceRoute?: string;
244
250
  /** D17: the template-declared serializable field list for this step's payload. */
245
251
  payloadFields: ContentPayloadFieldDeclaration[];
246
252
  }
@@ -250,6 +256,12 @@ interface ContentPipelineTemplate {
250
256
  label: string;
251
257
  description?: string;
252
258
  color?: string;
259
+ /**
260
+ * Route into the tenant's Workspace surface for this pipeline. Absent when the
261
+ * tenant has declared none, which is the case `ContentItemReviewPage`'s
262
+ * fallback action bar exists to serve. See `ContentWorkspaceRouteSchema`.
263
+ */
264
+ workspaceRoute?: string;
253
265
  steps: ContentPipelineStepEntry[];
254
266
  }
255
267
  /** One entry in a resolved `content-stage` catalog (status / pillar / platform), as returned by `getContentStageCatalog`. */
@@ -796,7 +808,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
796
808
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
797
809
  route: z.ZodOptional<z.ZodString>;
798
810
  }, z.core.$loose>>>>;
799
- }, z.core.$strip>>>;
811
+ }, z.core.$strict>>>;
800
812
  resources: z.ZodDefault<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
801
813
  id: z.ZodString;
802
814
  order: z.ZodDefault<z.ZodNumber>;
@@ -1266,9 +1278,13 @@ declare const ContentItemResponseSchema: z.ZodObject<{
1266
1278
  status: z.ZodEnum<{
1267
1279
  error: "error";
1268
1280
  success: "success";
1281
+ running: "running";
1269
1282
  no_result: "no_result";
1270
1283
  skipped: "skipped";
1271
1284
  }>;
1285
+ attemptId: z.ZodString;
1286
+ executionId: z.ZodNullable<z.ZodString>;
1287
+ attemptedAt: z.ZodString;
1272
1288
  data: z.ZodOptional<z.ZodUnknown>;
1273
1289
  }, z.core.$loose>>;
1274
1290
  reviewedAt: z.ZodNullable<z.ZodString>;
@@ -1282,6 +1298,96 @@ declare const ContentItemResponseSchema: z.ZodObject<{
1282
1298
  }, z.core.$strip>;
1283
1299
  type ContentItemResponse = z.infer<typeof ContentItemResponseSchema>;
1284
1300
 
1301
+ /**
1302
+ * `deriveContentBoard` -- a pure function of `(items, pipeline, now)`. No React, no
1303
+ * hooks, no fetching. `content_items` has NO `step_key` column (only
1304
+ * `content_item_attempts` does), so an item's current step is derived from
1305
+ * `processingState`, whose declared shape is
1306
+ * `Record<stepKey, { status: 'running' | 'success' | 'no_result' | 'skipped' | 'error';
1307
+ * attemptId: string; executionId: string | null; attemptedAt: string; data?: unknown }>`.
1308
+ * `'running'` (added 2026-08-14, the step-state model) is the only in-flight value;
1309
+ * every other member is terminal.
1310
+ *
1311
+ * Placement rule (implemented exactly as follows):
1312
+ *
1313
+ * 1. Sort the pipeline's steps ascending by `order`. Ties break by `key` so the result
1314
+ * is deterministic.
1315
+ * 2. An item's current step is the first step in that order whose `processingState`
1316
+ * entry is missing, or present with a status other than `'success'`. Rationale:
1317
+ * `processingState` records what has run; a step recorded `'success'` is behind the
1318
+ * item -- `'running'` falls out of this rule unchanged: a step mid-flight is not
1319
+ * `'success'`, so it holds the item at that column exactly like `'error'` or
1320
+ * `'skipped'` already do.
1321
+ * 3. If every declared step has a `'success'` entry the item has finished the pipeline --
1322
+ * but it reaches `done` only once its review gate is cleared. When the LAST step
1323
+ * declares a `reviewMode` other than `'none'` and the item's `reviewedAt` is still
1324
+ * `null`, the item is held at that last step (`bucket: 'column'`) so the gate it has
1325
+ * not passed keeps counting it. Otherwise `stepKey` is `null` and the card goes in
1326
+ * `done`. Without the hold, a producer writing `'success'` on the final step removed
1327
+ * the item from every column and the gate's `waitingCount` dropped to zero with
1328
+ * nobody having reviewed anything -- `'success'` is the only status that advances an
1329
+ * item, so the gate could not survive its own producer completing.
1330
+ * 4. If `processingState` is empty (`{}`), the item sits at the first step -- nothing
1331
+ * has run yet.
1332
+ * 5. A card goes in `unplaced` only when `processingState` is non-empty AND none of its
1333
+ * keys appear in the catalog. This is the honest bucket for an item produced against
1334
+ * a step catalog that has since changed; unplaced items are never silently dropped
1335
+ * into column 1.
1336
+ */
1337
+ interface ContentBoardCard {
1338
+ item: ContentItemResponse;
1339
+ /** Step key this item currently sits at. `null` when every declared step has succeeded. */
1340
+ stepKey: string | null;
1341
+ /** Milliseconds since `item.updatedAt`, measured against the `now` argument. */
1342
+ ageMs: number;
1343
+ /** True when this card is waiting on a person: its step's reviewMode is not 'none' and `reviewedAt` is null. */
1344
+ awaitingReview: boolean;
1345
+ }
1346
+ interface ContentBoardGate {
1347
+ /** The review mode of the step this gate follows. Never 'none' -- a 'none' step has no gate. */
1348
+ reviewMode: Exclude<ContentPipelineStepReviewMode, 'none'>;
1349
+ /** How many cards in the preceding column are awaiting review. */
1350
+ waitingCount: number;
1351
+ }
1352
+ interface ContentBoardColumn {
1353
+ step: ContentPipelineStepEntry;
1354
+ cards: ContentBoardCard[];
1355
+ /** Present when this step's reviewMode is 'live' or 'queued'. Absent on a 'none' step. */
1356
+ gate?: ContentBoardGate;
1357
+ }
1358
+ interface ContentBoard {
1359
+ columns: ContentBoardColumn[];
1360
+ /** Cards whose every declared step succeeded. */
1361
+ done: ContentBoardCard[];
1362
+ /** Cards whose processingState names only step keys the catalog does not declare. */
1363
+ unplaced: ContentBoardCard[];
1364
+ /** True when the pipeline declares 0 or 1 steps -- the consumer renders pick-then-review, not columns. */
1365
+ isCollapsed: boolean;
1366
+ }
1367
+ declare function deriveContentBoard(items: ContentItemResponse[], pipeline: ContentPipelineTemplate, now: number): ContentBoard;
1368
+
1369
+ /**
1370
+ * `getContentItemIdentity` -- a pure function that names a content item for display when
1371
+ * `title` cannot be trusted to do it. The tenant `nirvana-marketing`'s drafts have no
1372
+ * titles at all, so a title-first surface renders an empty or meaningless column. A
1373
+ * post's identity is its opening line.
1374
+ *
1375
+ * Resolution order, first non-empty wins:
1376
+ * 1. First non-blank line of `item.body`.
1377
+ * 2. The first string-valued field of `item.payload`, taken in `payloadFields`
1378
+ * declaration order when that argument is supplied, otherwise `Object.keys` order.
1379
+ * Only a non-blank string value counts.
1380
+ * 3. `item.title`, when non-blank.
1381
+ * 4. The literal `'Untitled'`.
1382
+ *
1383
+ * The resolved candidate is then normalized: runs of whitespace collapse to one space,
1384
+ * the result is trimmed, and anything longer than `maxLength` is truncated at the last
1385
+ * word boundary at or before `maxLength` with a trailing `'…'` -- never mid-word.
1386
+ * The source complaint this fixes is titles clipped mid-word
1387
+ * (`MOCK Pipeline Walk S…`).
1388
+ */
1389
+ declare function getContentItemIdentity(item: Pick<ContentItemResponse, 'title' | 'body' | 'payload'>, payloadFields?: ContentPayloadFieldDeclaration[], maxLength?: number): string;
1390
+
1285
1391
  type SystemSidebarComponent = ComponentType;
1286
1392
  type SystemIconComponent = ComponentType<{
1287
1393
  size?: number;
@@ -1351,7 +1457,7 @@ interface ContentPipelinesPageSlots {
1351
1457
  */
1352
1458
  declare function ContentPipelinesPage({ headerActions }?: ContentPipelinesPageSlots): react_jsx_runtime.JSX.Element;
1353
1459
 
1354
- interface ContentPipelineWorkspacePageSlots {
1460
+ interface ContentPipelineBoardPageSlots {
1355
1461
  /** Optional content rendered after the page title. Default: nothing rendered. */
1356
1462
  headerActions?: ReactNode;
1357
1463
  }
@@ -1359,9 +1465,9 @@ interface ContentPipelineWorkspacePageSlots {
1359
1465
  * Pipeline workspace -- tabbed via `?tab=`, matching how `LeadGenListDetailPage`
1360
1466
  * (`../../../lead-gen/pages/list-detail/ListDetailPage.tsx`) already does it.
1361
1467
  */
1362
- declare function ContentPipelineWorkspacePage({ pipelineId, headerActions }: {
1468
+ declare function ContentPipelineBoardPage({ pipelineId, headerActions }: {
1363
1469
  pipelineId: string;
1364
- } & ContentPipelineWorkspacePageSlots): react_jsx_runtime.JSX.Element;
1470
+ } & ContentPipelineBoardPageSlots): react_jsx_runtime.JSX.Element;
1365
1471
 
1366
1472
  interface ContentDistributionsPageSlots {
1367
1473
  /** Optional content rendered after the page title. Default: nothing rendered. */
@@ -1386,14 +1492,19 @@ interface ContentDistributionDetailPageSlots {
1386
1492
  }
1387
1493
  /**
1388
1494
  * Distribution detail -- ported from `/acquisition/content/distribution/$distributionId`.
1389
- * The four writes the original made through Supabase-direct hooks (checklist toggle,
1390
- * platform-content edit, media delete, general field update) all collapse into
1391
- * `useUpdateContentDistribution`, since each was a partial write of `checklist`,
1392
- * `platformContent`, or `mediaUrls` and the PATCH route accepts all three plus the
1393
- * general fields. Surfaces the four columns that have never been rendered anywhere:
1394
- * `metrics`, `metricsUpdatedAt`, `publishMethod`, `platformPostId` -- `publishMethod` is
1395
- * where D7's manual-publish state becomes visible (a row with `publishedAt` set and no
1495
+ * Surfaces the four columns that have never been rendered anywhere: `metrics`,
1496
+ * `metricsUpdatedAt`, `publishMethod`, `platformPostId` -- `publishMethod` is where D7's
1497
+ * manual-publish state becomes visible (a row with `publishedAt` set and no
1396
1498
  * `platformPostId`).
1499
+ *
1500
+ * **Display-only.** This page used to be an editor: status, platform URL, checklist,
1501
+ * platform content, and media delete all wrote through `useUpdateContentDistribution`.
1502
+ * Every one of those was removed when the content System split its UI -- tenants own the
1503
+ * surfaces where content is operated on, the platform owns the surfaces where it is
1504
+ * observed, and a distribution page is an observation. `useUpdateContentDistribution` is
1505
+ * still exported for tenants that want to build their own editing screen; nothing shared
1506
+ * calls it. Do not reintroduce a write here -- the absence is the contract, and it is the
1507
+ * same absence that keeps `reviewItem` out of `ContentToolMap`.
1397
1508
  */
1398
1509
  declare function ContentDistributionDetailPage({ distributionId, headerActions }: {
1399
1510
  distributionId: string;
@@ -1414,8 +1525,15 @@ interface ContentPageOverrides {
1414
1525
  itemReview?: ContentItemReviewPageSlots;
1415
1526
  /** Slot props injected into `ContentPipelinesPage`. */
1416
1527
  pipelines?: ContentPipelinesPageSlots;
1417
- /** Slot props injected into `ContentPipelineWorkspacePage`. */
1418
- pipelineWorkspace?: ContentPipelineWorkspacePageSlots;
1528
+ /**
1529
+ * Slot props injected into `ContentPipelineBoardPage`.
1530
+ *
1531
+ * The key stays `pipelineWorkspace` although the page it points at was renamed to
1532
+ * Board on 2026-08-15 (Decision 6). It is part of the published manifest surface, so
1533
+ * renaming it is a second breaking change on the same minor, and unlike the page name
1534
+ * this one is never read by anyone looking at a sidebar. Revisit on a later minor.
1535
+ */
1536
+ pipelineWorkspace?: ContentPipelineBoardPageSlots;
1419
1537
  }
1420
1538
  /**
1421
1539
  * Extended `SystemModule` for the content feature that carries optional page overrides
@@ -1582,6 +1700,14 @@ interface ContentReviewAction {
1582
1700
  * a one-click irreversible action.
1583
1701
  */
1584
1702
  consequence?: 'standard' | 'irreversible';
1703
+ /**
1704
+ * Disables this action's button -- e.g. the item has no open review gate to clear.
1705
+ * Renders inert rather than firing a call that the server rejects. Pair with
1706
+ * `disabledReason` so the reviewer sees why, not just a greyed-out button.
1707
+ */
1708
+ disabled?: boolean;
1709
+ /** Shown in a Tooltip over the button while `disabled` is true. */
1710
+ disabledReason?: string;
1585
1711
  }
1586
1712
  interface ReviewActionBarProps {
1587
1713
  /**
@@ -1663,6 +1789,15 @@ interface ContentReviewCardProps {
1663
1789
  onAction: (actionId: string, feedback?: string) => void;
1664
1790
  /** True while a submitted action is in flight. Disables the action bar and the body. */
1665
1791
  actionsPending?: boolean;
1792
+ /**
1793
+ * Render the piece without any way to change it: the body is not editable and the
1794
+ * alternates panel is hidden, since picking an alternate rewrites the body. Distinct
1795
+ * from `actionsPending`, which is a transient in-flight disable -- this one is a
1796
+ * statement about who owns editing. Used by the shared review page when the pipeline
1797
+ * declares a `workspaceRoute`, so the tenant's own screen is the only place the piece
1798
+ * can be changed.
1799
+ */
1800
+ readOnly?: boolean;
1666
1801
  }
1667
1802
  /**
1668
1803
  * The generic content review card. Generalizes three things that exist separately
@@ -1670,7 +1805,7 @@ interface ContentReviewCardProps {
1670
1805
  * nirvana's `DraftCard`, and the attempt-lineage / processing-state surfaces that had
1671
1806
  * no reader at all. Keyed off `reviewMode` rather than any tenant-specific vocabulary.
1672
1807
  */
1673
- declare function ContentReviewCard({ title, body, onBodyChange, originalBody, onReset, payload, payloadFields, fidelity, checkFirst, hookOptions, closeOptions, onMoreHooks, onMoreCloses, alternatesRunning, alternatesElapsed, processingSteps, actions, onAction, actionsPending }: ContentReviewCardProps): react_jsx_runtime.JSX.Element;
1808
+ declare function ContentReviewCard({ title, body, onBodyChange, originalBody, onReset, payload, payloadFields, fidelity, checkFirst, hookOptions, closeOptions, onMoreHooks, onMoreCloses, alternatesRunning, alternatesElapsed, processingSteps, actions, onAction, actionsPending, readOnly }: ContentReviewCardProps): react_jsx_runtime.JSX.Element;
1674
1809
 
1675
1810
  /** A single tenant-facing noun with singular and plural forms, e.g. `{ singular: 'Post', plural: 'Posts' }`. */
1676
1811
  interface ContentNoun {
@@ -1785,84 +1920,6 @@ interface ContentConfig {
1785
1920
  */
1786
1921
  declare function useContentConfig(): ContentConfig;
1787
1922
 
1788
- /**
1789
- * `deriveContentBoard` -- a pure function of `(items, pipeline, now)`. No React, no
1790
- * hooks, no fetching. `content_items` has NO `step_key` column (only
1791
- * `content_item_attempts` does), so an item's current step is derived from
1792
- * `processingState`, whose declared shape is
1793
- * `Record<stepKey, { status: 'success' | 'no_result' | 'skipped' | 'error'; data?: unknown }>`.
1794
- *
1795
- * Placement rule (implemented exactly as follows):
1796
- *
1797
- * 1. Sort the pipeline's steps ascending by `order`. Ties break by `key` so the result
1798
- * is deterministic.
1799
- * 2. An item's current step is the first step in that order whose `processingState`
1800
- * entry is missing, or present with a status other than `'success'`. Rationale:
1801
- * `processingState` records what has run; a step recorded `'success'` is behind the
1802
- * item.
1803
- * 3. If every declared step has a `'success'` entry, `stepKey` is `null` and the card
1804
- * goes in `done`.
1805
- * 4. If `processingState` is empty (`{}`), the item sits at the first step -- nothing
1806
- * has run yet.
1807
- * 5. A card goes in `unplaced` only when `processingState` is non-empty AND none of its
1808
- * keys appear in the catalog. This is the honest bucket for an item produced against
1809
- * a step catalog that has since changed; unplaced items are never silently dropped
1810
- * into column 1.
1811
- */
1812
- interface ContentBoardCard {
1813
- item: ContentItemResponse;
1814
- /** Step key this item currently sits at. `null` when every declared step has succeeded. */
1815
- stepKey: string | null;
1816
- /** Milliseconds since `item.updatedAt`, measured against the `now` argument. */
1817
- ageMs: number;
1818
- /** True when this card is waiting on a person: its step's reviewMode is not 'none' and `reviewedAt` is null. */
1819
- awaitingReview: boolean;
1820
- }
1821
- interface ContentBoardGate {
1822
- /** The review mode of the step this gate follows. Never 'none' -- a 'none' step has no gate. */
1823
- reviewMode: Exclude<ContentPipelineStepReviewMode, 'none'>;
1824
- /** How many cards in the preceding column are awaiting review. */
1825
- waitingCount: number;
1826
- }
1827
- interface ContentBoardColumn {
1828
- step: ContentPipelineStepEntry;
1829
- cards: ContentBoardCard[];
1830
- /** Present when this step's reviewMode is 'live' or 'queued'. Absent on a 'none' step. */
1831
- gate?: ContentBoardGate;
1832
- }
1833
- interface ContentBoard {
1834
- columns: ContentBoardColumn[];
1835
- /** Cards whose every declared step succeeded. */
1836
- done: ContentBoardCard[];
1837
- /** Cards whose processingState names only step keys the catalog does not declare. */
1838
- unplaced: ContentBoardCard[];
1839
- /** True when the pipeline declares 0 or 1 steps -- the consumer renders pick-then-review, not columns. */
1840
- isCollapsed: boolean;
1841
- }
1842
- declare function deriveContentBoard(items: ContentItemResponse[], pipeline: ContentPipelineTemplate, now: number): ContentBoard;
1843
-
1844
- /**
1845
- * `getContentItemIdentity` -- a pure function that names a content item for display when
1846
- * `title` cannot be trusted to do it. The tenant `nirvana-marketing`'s drafts have no
1847
- * titles at all, so a title-first surface renders an empty or meaningless column. A
1848
- * post's identity is its opening line.
1849
- *
1850
- * Resolution order, first non-empty wins:
1851
- * 1. First non-blank line of `item.body`.
1852
- * 2. The first string-valued field of `item.payload`, taken in `payloadFields`
1853
- * declaration order when that argument is supplied, otherwise `Object.keys` order.
1854
- * Only a non-blank string value counts.
1855
- * 3. `item.title`, when non-blank.
1856
- * 4. The literal `'Untitled'`.
1857
- *
1858
- * The resolved candidate is then normalized: runs of whitespace collapse to one space,
1859
- * the result is trimmed, and anything longer than `maxLength` is truncated at the last
1860
- * word boundary at or before `maxLength` with a trailing `'…'` -- never mid-word.
1861
- * The source complaint this fixes is titles clipped mid-word
1862
- * (`MOCK Pipeline Walk S…`).
1863
- */
1864
- declare function getContentItemIdentity(item: Pick<ContentItemResponse, 'title' | 'body' | 'payload'>, payloadFields?: ContentPayloadFieldDeclaration[], maxLength?: number): string;
1865
-
1866
1923
  /**
1867
1924
  * Shared nav-item shape used by feature sidebar middle components.
1868
1925
  *
@@ -1897,19 +1954,25 @@ interface NavItem {
1897
1954
 
1898
1955
  interface ContentSidebarProps {
1899
1956
  /**
1900
- * Tenant-authored authoring surfaces for the `Create` section, forwarded to
1957
+ * Tenant-authored operating surfaces for the `Workspace` section, forwarded to
1901
1958
  * `ContentSidebarMiddle`. Ignored when `children` is supplied, since that replaces the
1902
- * middle outright. This is the one-line path for a tenant adding its own creator:
1959
+ * middle outright. This is the one-line path for a tenant adding its own screen:
1903
1960
  *
1904
1961
  * ```tsx
1905
- * const sidebar = () => <ContentSidebar createItems={[{ label: 'Draft a Post', to: '/content/write', icon: IconPencil, exact: false }]} />
1962
+ * const sidebar = () => <ContentSidebar workspaceItems={[{ label: 'Draft a Post', to: '/content/write', icon: IconPencil, exact: false }]} />
1906
1963
  * ```
1907
1964
  */
1965
+ workspaceItems?: NavItem[];
1966
+ /**
1967
+ * @deprecated Renamed to {@link ContentSidebarProps.workspaceItems}. Kept as an alias
1968
+ * for one minor so the rename is non-breaking for tenants; `workspaceItems` wins when
1969
+ * both are passed.
1970
+ */
1908
1971
  createItems?: NavItem[];
1909
1972
  /** Replace the default `ContentSidebarMiddle` with custom middle content. Leave unset for the default layout. */
1910
1973
  children?: ReactNode;
1911
1974
  }
1912
- declare const ContentSidebar: ({ createItems, children }?: ContentSidebarProps) => react_jsx_runtime.JSX.Element;
1975
+ declare const ContentSidebar: ({ workspaceItems, createItems, children }?: ContentSidebarProps) => react_jsx_runtime.JSX.Element;
1913
1976
 
1914
1977
  /**
1915
1978
  * Static two-entry default, built from {@link DEFAULT_CONTENT_VOCABULARY}. Exists for
@@ -1920,14 +1983,21 @@ declare const ContentSidebar: ({ createItems, children }?: ContentSidebarProps)
1920
1983
  declare const CONTENT_ITEMS: NavItem[];
1921
1984
  interface ContentSidebarMiddleProps {
1922
1985
  /**
1923
- * Tenant-authored authoring surfaces, rendered under the `Create` section above the
1924
- * pipeline nav. Empty or omitted -> the section renders its "nothing declared" hint
1925
- * instead of nav entries; the section header itself is always present.
1986
+ * Tenant-authored operating surfaces, rendered under the `Workspace` section above
1987
+ * the pipeline nav. Empty or omitted -> the section renders its "nothing declared"
1988
+ * hint instead of nav entries; the section header itself is always present.
1926
1989
  *
1927
- * This is the seam for a tenant's own content creator -- a LinkedIn drafting screen,
1928
- * a brief builder, whatever the tenant authors -- without it having to restate the
1929
- * pipeline entries. Prefer this over {@link ContentSidebarMiddleProps.items}, which
1930
- * replaces the pipeline list wholesale and stops tracking the tenant's vocabulary.
1990
+ * This is the seam for the screens where a tenant *operates* on content -- creating
1991
+ * it and clearing its review gates, which may well be one screen -- without having to
1992
+ * restate the pipeline entries. Prefer this over {@link ContentSidebarMiddleProps.items},
1993
+ * which replaces the pipeline list wholesale and stops tracking the tenant's vocabulary.
1994
+ */
1995
+ workspaceItems?: NavItem[];
1996
+ /**
1997
+ * @deprecated Renamed to {@link ContentSidebarMiddleProps.workspaceItems}. Kept as an
1998
+ * alias for one minor so the rename is non-breaking for tenants; `workspaceItems` wins
1999
+ * when both are passed. The prop was named for a section that only held authoring, and
2000
+ * that section now holds review too.
1931
2001
  */
1932
2002
  createItems?: NavItem[];
1933
2003
  /** Override the pipeline nav items. Defaults to the two-entry nav built from the tenant's declared vocabulary. */
@@ -1936,22 +2006,26 @@ interface ContentSidebarMiddleProps {
1936
2006
  /**
1937
2007
  * The content subshell nav, in two labeled sections.
1938
2008
  *
1939
- * `Create` sits on top and is where content gets made; the pipeline section below is
1940
- * where it gets reviewed and tracked. The split exists because authoring is
1941
- * tenant-specific by nature (every tenant writes a different kind of thing, through a
1942
- * different screen) while the pipeline underneath is the same shared system for all of
1943
- * them.
2009
+ * `Workspace` sits on top and is where content is *operated on* -- both made and
2010
+ * signed off; the pipeline section below is where it is *observed*. The split exists
2011
+ * because operating on content is tenant-specific by nature (every tenant writes a
2012
+ * different kind of thing, and reviews it against different criteria, through
2013
+ * different screens) while the pipeline underneath is the same shared system for all
2014
+ * of them.
2015
+ *
2016
+ * The section was called `Create` until 2026-08-15. It was renamed because clearing a
2017
+ * review gate is not creation, and the tenant screen that does one usually does both.
1944
2018
  *
1945
2019
  * **Both section labels are fixed platform vocabulary, not tenant-declared.** The nav
1946
2020
  * entries inside them still are — a tenant that renames its pipelines to "Campaigns"
1947
2021
  * gets `Content Pipeline > Campaigns`. The sections name the two halves of the System
1948
2022
  * itself, which every tenant has; only what they contain varies.
1949
2023
  *
1950
- * There is deliberately no section header above `Create`: the subshell is already
2024
+ * There is deliberately no section header above `Workspace`: the subshell is already
1951
2025
  * reached through the `Content` nav entry, so a third `Content` header only repeated
1952
2026
  * what the breadcrumb and the left rail both already say.
1953
2027
  */
1954
- declare const ContentSidebarMiddle: ({ createItems, items }?: ContentSidebarMiddleProps) => react_jsx_runtime.JSX.Element;
2028
+ declare const ContentSidebarMiddle: ({ workspaceItems, createItems, items }?: ContentSidebarMiddleProps) => react_jsx_runtime.JSX.Element;
1955
2029
 
1956
2030
  interface MyReviewQueuePanelProps {
1957
2031
  onItemClick: (itemId: string) => void;
@@ -1974,5 +2048,5 @@ interface MyReviewQueuePanelProps {
1974
2048
  */
1975
2049
  declare function MyReviewQueuePanel({ onItemClick, onSeeAll, showSectionLabel }: MyReviewQueuePanelProps): react_jsx_runtime.JSX.Element;
1976
2050
 
1977
- export { AlternatesPanel, CONTENT_ITEMS, ContentDistributionDetailPage, ContentDistributionsPage, ContentItemReviewPage, ContentItemsPage, ContentOverviewPage, ContentPipelineWorkspacePage, ContentPipelinesPage, ContentReviewCard, ContentSidebar, ContentSidebarMiddle, DEFAULT_CONTENT_VOCABULARY, MyReviewQueuePanel, PayloadBody, ProcessingStateStrip, ReviewActionBar, contentManifest, deriveContentBoard, firstLine, formatElapsed, getContentItemIdentity, lastLine, resolveContentStepResource, resolveContentVocabulary, swapFirstLine, swapLastLine, useContentConfig };
1978
- export type { AlternatesPanelProps, ContentAlternateOption, ContentBoard, ContentBoardCard, ContentBoardColumn, ContentBoardGate, ContentConfig, ContentDistributionDetailPageSlots, ContentDistributionsPageSlots, ContentFidelityCheck, ContentItemReviewPageSlots, ContentItemsPageSlots, ContentNoun, ContentOverviewPageSlots, ContentPayloadField, ContentPipelineWorkspacePageSlots, ContentPipelinesPageSlots, ContentProcessingStatus, ContentProcessingStep, ContentReviewAction, ContentReviewCardProps, ContentSidebarMiddleProps, ContentSidebarProps, ContentStepResourceBinding, ContentVocabulary, MyReviewQueuePanelProps, PayloadBodyProps, ProcessingStateStripProps, ReviewActionBarProps, ReviewMode };
2051
+ export { AlternatesPanel, CONTENT_ITEMS, ContentDistributionDetailPage, ContentDistributionsPage, ContentItemReviewPage, ContentItemsPage, ContentOverviewPage, ContentPipelineBoardPage, ContentPipelineBoardPage as ContentPipelineWorkspacePage, ContentPipelinesPage, ContentReviewCard, ContentSidebar, ContentSidebarMiddle, DEFAULT_CONTENT_VOCABULARY, MyReviewQueuePanel, PayloadBody, ProcessingStateStrip, ReviewActionBar, contentManifest, deriveContentBoard, firstLine, formatElapsed, getContentItemIdentity, lastLine, resolveContentStepResource, resolveContentVocabulary, swapFirstLine, swapLastLine, useContentConfig };
2052
+ export type { AlternatesPanelProps, ContentAlternateOption, ContentBoard, ContentBoardCard, ContentBoardColumn, ContentBoardGate, ContentConfig, ContentDistributionDetailPageSlots, ContentDistributionsPageSlots, ContentFidelityCheck, ContentItemReviewPageSlots, ContentItemsPageSlots, ContentNoun, ContentOverviewPageSlots, ContentPayloadField, ContentPipelineBoardPageSlots, ContentPipelineBoardPageSlots as ContentPipelineWorkspacePageSlots, ContentPipelinesPageSlots, ContentProcessingStatus, ContentProcessingStep, ContentReviewAction, ContentReviewCardProps, ContentSidebarMiddleProps, ContentSidebarProps, ContentStepResourceBinding, ContentVocabulary, MyReviewQueuePanelProps, PayloadBodyProps, ProcessingStateStripProps, ReviewActionBarProps, ReviewMode };