@flamingo-stack/openframe-frontend-core 0.0.593 → 0.0.594-snapshot.20260905135632

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 (117) hide show
  1. package/dist/{chunk-WY2GQ62H.cjs → chunk-23UJ4EBJ.cjs} +10 -10
  2. package/dist/{chunk-WY2GQ62H.cjs.map → chunk-23UJ4EBJ.cjs.map} +1 -1
  3. package/dist/{chunk-KPO6TWEV.js → chunk-2WLW5HDU.js} +7 -7
  4. package/dist/{chunk-GEP3O6NU.js → chunk-3WZLPCJ7.js} +3 -3
  5. package/dist/{chunk-NEFNARFF.cjs → chunk-4R6AZFNU.cjs} +30 -30
  6. package/dist/{chunk-NEFNARFF.cjs.map → chunk-4R6AZFNU.cjs.map} +1 -1
  7. package/dist/{chunk-S6G6KJ57.cjs → chunk-4ZY5MP46.cjs} +15 -15
  8. package/dist/{chunk-S6G6KJ57.cjs.map → chunk-4ZY5MP46.cjs.map} +1 -1
  9. package/dist/{chunk-3ZHDEZQB.js → chunk-63PXZXCT.js} +4 -4
  10. package/dist/{chunk-2KISKWOY.cjs → chunk-6PEFK4UH.cjs} +6 -6
  11. package/dist/{chunk-2KISKWOY.cjs.map → chunk-6PEFK4UH.cjs.map} +1 -1
  12. package/dist/{chunk-MPNCYET3.js → chunk-7N2NJPUK.js} +3 -3
  13. package/dist/{chunk-J3D2WHWC.js → chunk-A57HKYLY.js} +6 -6
  14. package/dist/{chunk-I7JYX5O3.js → chunk-AQ65NLGJ.js} +88 -5
  15. package/dist/{chunk-I7JYX5O3.js.map → chunk-AQ65NLGJ.js.map} +1 -1
  16. package/dist/{chunk-XH5QBMXD.js → chunk-BKMSI2AW.js} +2 -2
  17. package/dist/{chunk-YSJ4TA6V.cjs → chunk-CPWX46TL.cjs} +6 -6
  18. package/dist/{chunk-YSJ4TA6V.cjs.map → chunk-CPWX46TL.cjs.map} +1 -1
  19. package/dist/{chunk-5SGTTSQN.cjs → chunk-CZM2H5F5.cjs} +5 -5
  20. package/dist/{chunk-5SGTTSQN.cjs.map → chunk-CZM2H5F5.cjs.map} +1 -1
  21. package/dist/{chunk-X7XO73M5.js → chunk-DYXVQ24Q.js} +3 -3
  22. package/dist/{chunk-OAAQKMMU.cjs → chunk-EO5GYWIX.cjs} +28 -28
  23. package/dist/{chunk-OAAQKMMU.cjs.map → chunk-EO5GYWIX.cjs.map} +1 -1
  24. package/dist/{chunk-CMAO4PPL.cjs → chunk-FHEN27GM.cjs} +11 -11
  25. package/dist/{chunk-CMAO4PPL.cjs.map → chunk-FHEN27GM.cjs.map} +1 -1
  26. package/dist/{chunk-VDAMJEMR.cjs → chunk-HGWC7ABT.cjs} +57 -57
  27. package/dist/{chunk-VDAMJEMR.cjs.map → chunk-HGWC7ABT.cjs.map} +1 -1
  28. package/dist/{chunk-4DRZZWC7.cjs → chunk-JGDDPNSC.cjs} +192 -192
  29. package/dist/{chunk-4DRZZWC7.cjs.map → chunk-JGDDPNSC.cjs.map} +1 -1
  30. package/dist/{chunk-2VOBGNEY.cjs → chunk-MDUAU74C.cjs} +28 -28
  31. package/dist/{chunk-2VOBGNEY.cjs.map → chunk-MDUAU74C.cjs.map} +1 -1
  32. package/dist/{chunk-QHTDFF52.cjs → chunk-MHORK6KM.cjs} +3 -3
  33. package/dist/{chunk-QHTDFF52.cjs.map → chunk-MHORK6KM.cjs.map} +1 -1
  34. package/dist/{chunk-ZZHHKE2Q.js → chunk-MUNVPRT2.js} +2 -2
  35. package/dist/{chunk-NRHU4V3E.cjs → chunk-MX7DNV7X.cjs} +33 -33
  36. package/dist/{chunk-NRHU4V3E.cjs.map → chunk-MX7DNV7X.cjs.map} +1 -1
  37. package/dist/{chunk-2645GIM2.js → chunk-NNMAMTA5.js} +3 -3
  38. package/dist/{chunk-2PMCHL37.cjs → chunk-OGE4GSLZ.cjs} +80 -80
  39. package/dist/{chunk-2PMCHL37.cjs.map → chunk-OGE4GSLZ.cjs.map} +1 -1
  40. package/dist/{chunk-WZHARPOT.cjs → chunk-OWWICTQR.cjs} +21 -21
  41. package/dist/{chunk-WZHARPOT.cjs.map → chunk-OWWICTQR.cjs.map} +1 -1
  42. package/dist/{chunk-GXPOEAXL.js → chunk-PYEJL2UG.js} +3 -3
  43. package/dist/{chunk-UG27ITVP.js → chunk-QLJMXCB5.js} +5 -5
  44. package/dist/{chunk-YAZY24ZK.js → chunk-SEVD4AST.js} +5 -5
  45. package/dist/{chunk-Y6I2DGKC.cjs → chunk-SK4IVCSI.cjs} +10 -2
  46. package/dist/{chunk-Y6I2DGKC.cjs.map → chunk-SK4IVCSI.cjs.map} +1 -1
  47. package/dist/{chunk-VUGQ3Z6E.js → chunk-T2JAJ7MR.js} +3 -3
  48. package/dist/{chunk-BTF3CNDP.js → chunk-TDEQ26A2.js} +10 -2
  49. package/dist/{chunk-BTF3CNDP.js.map → chunk-TDEQ26A2.js.map} +1 -1
  50. package/dist/{chunk-R2J6XMP6.js → chunk-U4QRK4MX.js} +3 -3
  51. package/dist/{chunk-MV3XJXPG.js → chunk-UPKN5CYH.js} +6 -6
  52. package/dist/{chunk-TVPJ5DIB.cjs → chunk-YYHYCQD6.cjs} +437 -354
  53. package/dist/chunk-YYHYCQD6.cjs.map +1 -0
  54. package/dist/{chunk-ZR72HRUJ.js → chunk-ZRXJX3JK.js} +4 -4
  55. package/dist/{chunk-HMRWH2HC.cjs → chunk-ZY3Z3F4X.cjs} +20 -20
  56. package/dist/{chunk-HMRWH2HC.cjs.map → chunk-ZY3Z3F4X.cjs.map} +1 -1
  57. package/dist/components/case-studies/index.cjs +10 -10
  58. package/dist/components/case-studies/index.js +4 -4
  59. package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -1
  60. package/dist/components/chat/index.cjs +3 -3
  61. package/dist/components/chat/index.js +2 -2
  62. package/dist/components/contact/index.cjs +5 -5
  63. package/dist/components/contact/index.js +4 -4
  64. package/dist/components/docs/index.cjs +8 -8
  65. package/dist/components/docs/index.js +7 -7
  66. package/dist/components/embeds/index.cjs +5 -5
  67. package/dist/components/embeds/index.js +4 -4
  68. package/dist/components/faq/index.cjs +5 -5
  69. package/dist/components/faq/index.js +4 -4
  70. package/dist/components/features/index.cjs +4 -4
  71. package/dist/components/features/index.js +3 -3
  72. package/dist/components/help-center-pages/index.cjs +24 -24
  73. package/dist/components/help-center-pages/index.js +15 -15
  74. package/dist/components/index.cjs +53 -53
  75. package/dist/components/index.js +15 -15
  76. package/dist/components/meeting-scheduler/index.cjs +31 -31
  77. package/dist/components/meeting-scheduler/index.js +3 -3
  78. package/dist/components/navigation/index.cjs +7 -7
  79. package/dist/components/navigation/index.js +6 -6
  80. package/dist/components/onboarding-guides/index.cjs +7 -7
  81. package/dist/components/onboarding-guides/index.js +6 -6
  82. package/dist/components/related-content/index.cjs +3 -3
  83. package/dist/components/related-content/index.js +2 -2
  84. package/dist/components/tickets/index.cjs +8 -8
  85. package/dist/components/tickets/index.js +7 -7
  86. package/dist/components/ui/index.cjs +4 -4
  87. package/dist/components/ui/index.js +3 -3
  88. package/dist/index.cjs +8 -8
  89. package/dist/index.js +7 -7
  90. package/dist/utils/index.cjs +25 -3
  91. package/dist/utils/index.cjs.map +1 -1
  92. package/dist/utils/index.js +25 -3
  93. package/dist/utils/index.js.map +1 -1
  94. package/dist/utils/list-url.d.ts.map +1 -1
  95. package/dist/utils/source-icons.d.ts.map +1 -1
  96. package/package.json +1 -1
  97. package/src/components/chat/entity-cards/dispatch.tsx +88 -0
  98. package/src/utils/__tests__/list-url.test.ts +6 -0
  99. package/src/utils/list-url.ts +8 -0
  100. package/src/utils/source-icons.ts +27 -0
  101. package/dist/chunk-TVPJ5DIB.cjs.map +0 -1
  102. /package/dist/{chunk-KPO6TWEV.js.map → chunk-2WLW5HDU.js.map} +0 -0
  103. /package/dist/{chunk-GEP3O6NU.js.map → chunk-3WZLPCJ7.js.map} +0 -0
  104. /package/dist/{chunk-3ZHDEZQB.js.map → chunk-63PXZXCT.js.map} +0 -0
  105. /package/dist/{chunk-MPNCYET3.js.map → chunk-7N2NJPUK.js.map} +0 -0
  106. /package/dist/{chunk-J3D2WHWC.js.map → chunk-A57HKYLY.js.map} +0 -0
  107. /package/dist/{chunk-XH5QBMXD.js.map → chunk-BKMSI2AW.js.map} +0 -0
  108. /package/dist/{chunk-X7XO73M5.js.map → chunk-DYXVQ24Q.js.map} +0 -0
  109. /package/dist/{chunk-ZZHHKE2Q.js.map → chunk-MUNVPRT2.js.map} +0 -0
  110. /package/dist/{chunk-2645GIM2.js.map → chunk-NNMAMTA5.js.map} +0 -0
  111. /package/dist/{chunk-GXPOEAXL.js.map → chunk-PYEJL2UG.js.map} +0 -0
  112. /package/dist/{chunk-UG27ITVP.js.map → chunk-QLJMXCB5.js.map} +0 -0
  113. /package/dist/{chunk-YAZY24ZK.js.map → chunk-SEVD4AST.js.map} +0 -0
  114. /package/dist/{chunk-VUGQ3Z6E.js.map → chunk-T2JAJ7MR.js.map} +0 -0
  115. /package/dist/{chunk-R2J6XMP6.js.map → chunk-U4QRK4MX.js.map} +0 -0
  116. /package/dist/{chunk-MV3XJXPG.js.map → chunk-UPKN5CYH.js.map} +0 -0
  117. /package/dist/{chunk-ZR72HRUJ.js.map → chunk-ZRXJX3JK.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"list-url.d.ts","sourceRoot":"","sources":["../../src/utils/list-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAWH;;;;iEAIiE;AACjE,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAKtE;AA2DD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,SAAK,GAAG,MAAM,GAAG,IAAI,CAa5F"}
1
+ {"version":3,"file":"list-url.d.ts","sourceRoot":"","sources":["../../src/utils/list-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAWH;;;;iEAIiE;AACjE,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAKtE;AAmED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,SAAK,GAAG,MAAM,GAAG,IAAI,CAa5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"source-icons.d.ts","sourceRoot":"","sources":["../../src/utils/source-icons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2CpD,CAAC;AAEF;;6DAE6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGxF;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiDzD,CAAC;AAEF;;kEAEkE;AAClE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2CpE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjF"}
1
+ {"version":3,"file":"source-icons.d.ts","sourceRoot":"","sources":["../../src/utils/source-icons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoDpD,CAAC;AAEF;;6DAE6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGxF;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0DzD,CAAC;AAEF;;kEAEkE;AAClE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoDpE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.593",
3
+ "version": "0.0.594-snapshot.20260905135632",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -45,6 +45,7 @@ import { MingoIcon } from '../../icons';
45
45
  import { ArrowRightUpIcon } from '../../icons-v2-generated/arrows/arrow-right-up-icon';
46
46
  import { ClickupLogoIcon } from '../../icons-v2-generated/brand-logos/clickup-logo-icon';
47
47
  import { SlackLogoGreyIcon } from '../../icons-v2-generated/brand-logos/slack-logo-grey-icon';
48
+ import { BuildingsIcon } from '../../icons-v2-generated/buildings/buildings-icon';
48
49
  import { ChartBar01VerIcon } from '../../icons-v2-generated/charts/chart-bar-01-ver-icon';
49
50
  import { ChartPieIcon } from '../../icons-v2-generated/charts/chart-pie-icon';
50
51
  import { PresentationBarIcon } from '../../icons-v2-generated/charts/presentation-bar-icon';
@@ -53,6 +54,7 @@ import { CodeIcon } from '../../icons-v2-generated/coding/code-icon';
53
54
  import { CodingCommitIcon } from '../../icons-v2-generated/coding/coding-commit-icon';
54
55
  import { CodingPullRequestIcon } from '../../icons-v2-generated/coding/coding-pull-request-icon';
55
56
  import { CalendarIcon } from '../../icons-v2-generated/date-and-time/calendar-icon';
57
+ import { ClipboardListIcon } from '../../icons-v2-generated/documents/clipboard-list-icon';
56
58
  import { FileContentIcon } from '../../icons-v2-generated/documents/file-content-icon';
57
59
  import { NewspaperIcon } from '../../icons-v2-generated/documents/newspaper-icon';
58
60
  import { BankIcon } from '../../icons-v2-generated/finance/bank-icon';
@@ -616,6 +618,34 @@ function SlackChatCard({
616
618
  );
617
619
  }
618
620
 
621
+ /**
622
+ * Generic glyph card for ChatRef-shaped items (title / preview / url) whose
623
+ * only per-type variation is the leading icon — used by the ref-hydrated
624
+ * product-hub objects (design docs, tenants) and the people-hub feeds.
625
+ */
626
+ function GlyphChatCard({
627
+ chatRef,
628
+ icon,
629
+ isNewTab,
630
+ discuss,
631
+ }: {
632
+ chatRef: ChatRef;
633
+ icon: React.ReactNode;
634
+ isNewTab: boolean;
635
+ discuss?: CardDiscussAction;
636
+ }) {
637
+ return (
638
+ <MingoInfoCard
639
+ title={chatRef.title}
640
+ description={chatRef.preview ?? undefined}
641
+ icon={icon}
642
+ anchorProps={buildAnchorProps(chatRef.url, isNewTab)}
643
+ menuGroups={cardMenuGroups(chatRef.url, discuss)}
644
+ menuAriaLabel="Card actions"
645
+ />
646
+ );
647
+ }
648
+
619
649
  function DataRoomDocChatCard({
620
650
  chatRef,
621
651
  isNewTab,
@@ -1312,6 +1342,61 @@ const GITHUB_CARD_CONFIGS: Record<string, GitHubCardConfig> = {
1312
1342
  github_pr_review: { label: 'GitHub review', kind: 'pr_review' },
1313
1343
  github_pr_review_public: { label: 'GitHub review (public)', kind: 'pr_review' },
1314
1344
  };
1345
+ interface GlyphCardConfig {
1346
+ label: string;
1347
+ icon: () => React.ReactNode;
1348
+ }
1349
+ /** Product-hub internal objects hydrated by their per-object card routes
1350
+ * (`/api/design-docs`, `/api/openframe-tenants` — ChatRef-shaped items,
1351
+ * same preset as github / slack). Adding one = one line here + the
1352
+ * `list-url.ts` builder + the `source-icons.ts` label / icon / type entries. */
1353
+ const REF_GLYPH_CARD_CONFIGS: Record<string, GlyphCardConfig> = {
1354
+ design_doc: { label: 'Design doc', icon: () => <FileContentIcon size={24} /> },
1355
+ openframe_tenant: { label: 'OpenFrame tenant', icon: () => <BuildingsIcon size={24} /> },
1356
+ };
1357
+ function refGlyphRegistryEntries(): Record<string, ChatCardRegistryEntry> {
1358
+ return registryEntries(REF_GLYPH_CARD_CONFIGS, (cfg, docType) =>
1359
+ refHydratedEntry(docType, cfg.label, (displayRef, opts) => (
1360
+ <GlyphChatCard chatRef={displayRef} icon={cfg.icon()} isNewTab={opts.isNewTab} discuss={opts.discuss} />
1361
+ )),
1362
+ );
1363
+ }
1364
+
1365
+ /** People-hub employee feeds hydrate from their EXISTING list APIs
1366
+ * (`/api/what-i-shipped?ids=`, `/api/how-i-work?ids=`) — entry-shaped rows
1367
+ * (title / summary / author), not ChatRefs, hence the bespoke row→display
1368
+ * mapping (the FAQ precedent). The destination comes from the ref (the
1369
+ * server-resolved entry url) or, on a bare marker, the host's
1370
+ * `composeContentUrl` seam for the type. */
1371
+ function fetchedEmployeeEntryDisplayRef(item: unknown, chatRef: ChatRef): ChatRef {
1372
+ const it = item as { title?: unknown; summary?: unknown; author?: { full_name?: unknown } | null };
1373
+ const title = typeof it?.title === 'string' && it.title.trim().length > 0 ? it.title.trim() : chatRef.title;
1374
+ const author = typeof it?.author?.full_name === 'string' ? it.author.full_name.trim() : '';
1375
+ const summary = typeof it?.summary === 'string' ? it.summary.trim() : '';
1376
+ const preview = [author, summary].filter(x => x.length > 0).join(' · ');
1377
+ return { ...chatRef, title, preview: preview.length > 0 ? preview : chatRef.preview };
1378
+ }
1379
+ const EMPLOYEE_ENTRY_CARD_CONFIGS: Record<string, GlyphCardConfig> = {
1380
+ what_i_shipped: { label: 'What I Shipped', icon: () => <Rocket02Icon size={24} /> },
1381
+ how_i_work: { label: 'How I Work', icon: () => <ClipboardListIcon size={24} /> },
1382
+ };
1383
+ function employeeEntryRegistryEntries(): Record<string, ChatCardRegistryEntry> {
1384
+ return registryEntries(EMPLOYEE_ENTRY_CARD_CONFIGS, (cfg, docType) => ({
1385
+ label: cfg.label,
1386
+ bareInline: true,
1387
+ contentRefType: docType,
1388
+ skeleton: () => <MingoInfoCardSkeleton />,
1389
+ render: (item, chatRef, opts) => (
1390
+ <GlyphChatCard
1391
+ chatRef={fetchedEmployeeEntryDisplayRef(item, chatRef)}
1392
+ icon={cfg.icon()}
1393
+ isNewTab={opts.isNewTab}
1394
+ discuss={opts.discuss}
1395
+ />
1396
+ ),
1397
+ }));
1398
+ }
1399
+
1315
1400
  function githubRegistryEntries(): Record<string, ChatCardRegistryEntry> {
1316
1401
  return registryEntries(GITHUB_CARD_CONFIGS, (cfg, docType) =>
1317
1402
  refHydratedEntry(docType, cfg.label, (displayRef, opts) => (
@@ -1423,6 +1508,9 @@ const CHAT_CARD_REGISTRY: Record<string, ChatCardRegistryEntry> = {
1423
1508
  />
1424
1509
  ),
1425
1510
  },
1511
+ // ───────── ref-only types (no list endpoint; the ChatRef IS the card) ─────────
1512
+ ...refGlyphRegistryEntries(),
1513
+ ...employeeEntryRegistryEntries(),
1426
1514
  slack_message: refHydratedEntry('slack_message', 'Slack message', (displayRef, opts) => (
1427
1515
  <SlackChatCard chatRef={displayRef} isNewTab={opts.isNewTab} discuss={opts.discuss} />
1428
1516
  )),
@@ -48,6 +48,12 @@ const BASELINE: Record<string, string> = {
48
48
  profit_loss: '/api/financials/profit-loss?ids=a,b',
49
49
  balance_sheet: '/api/financials/balance-sheet?ids=a,b',
50
50
  cash_flow: '/api/financials/cash-flow?ids=a,b',
51
+ // 2026-09: hub-internal chat sources (people-hub feeds via their list APIs,
52
+ // product-hub design docs + tenants via per-object card routes).
53
+ what_i_shipped: '/api/what-i-shipped?ids=a,b&limit=2',
54
+ how_i_work: '/api/how-i-work?ids=a,b&limit=2',
55
+ design_doc: '/api/design-docs?ids=a,b',
56
+ openframe_tenant: '/api/openframe-tenants?ids=a,b',
51
57
  };
52
58
 
53
59
  describe('buildListUrl — byte parity with the hub mappers', () => {
@@ -104,6 +104,14 @@ const BUILDERS: Record<string, (ids: string[], base: string) => string> = {
104
104
  profit_loss: (ids, b) => `${b}/api/financials/profit-loss?ids=${ids.join(',')}`,
105
105
  balance_sheet: (ids, b) => `${b}/api/financials/balance-sheet?ids=${ids.join(',')}`,
106
106
  cash_flow: (ids, b) => `${b}/api/financials/cash-flow?ids=${ids.join(',')}`,
107
+ // People-hub employee feeds — their EXISTING list APIs (`?ids=`, also feeding
108
+ // the related-content rail + author page), entry-shaped rows.
109
+ what_i_shipped: (ids, b) => `${b}/api/what-i-shipped?ids=${ids.join(',')}&limit=${ids.length}`,
110
+ how_i_work: (ids, b) => `${b}/api/how-i-work?ids=${ids.join(',')}&limit=${ids.length}`,
111
+ // Product-hub internal objects — per-object card-hydration routes
112
+ // (ChatRef-shaped items, `handleEntityCardList`), like github / slack.
113
+ design_doc: (ids, b) => `${b}/api/design-docs?ids=${ids.join(',')}`,
114
+ openframe_tenant: (ids, b) => `${b}/api/openframe-tenants?ids=${ids.join(',')}`,
107
115
  };
108
116
 
109
117
  /**
@@ -39,6 +39,7 @@ export const SOURCE_ICON_NAMES: Record<string, string> = {
39
39
  events: 'calendar',
40
40
  podcasts: 'headphones',
41
41
  'customer-interviews': 'users',
42
+ faqs: 'info',
42
43
 
43
44
  // Financials
44
45
  'investor-updates': 'mail',
@@ -68,6 +69,14 @@ export const SOURCE_ICON_NAMES: Record<string, string> = {
68
69
 
69
70
  // Communications
70
71
  'slack-messages': 'slack',
72
+
73
+ // People-hub employee content
74
+ 'what-i-shipped': 'package',
75
+ 'how-i-work': 'book-open',
76
+
77
+ // Product-hub internal
78
+ 'design-docs': 'file-text',
79
+ 'openframe-tenants': 'globe',
71
80
  };
72
81
 
73
82
  /** Lookup an icon name by RagTableConfig.id. Returns undefined when
@@ -104,6 +113,7 @@ export const SOURCE_LABELS_BY_TABLE: Record<string, string> = {
104
113
  events: 'Events',
105
114
  podcasts: 'Podcasts',
106
115
  'customer-interviews': 'Customer Interviews',
116
+ faqs: 'FAQs',
107
117
 
108
118
  // Financials
109
119
  'investor-updates': 'Investor Updates',
@@ -139,6 +149,14 @@ export const SOURCE_LABELS_BY_TABLE: Record<string, string> = {
139
149
 
140
150
  // Communications
141
151
  'slack-messages': 'OpenMSP Community',
152
+
153
+ // People-hub employee content
154
+ 'what-i-shipped': 'What I Shipped',
155
+ 'how-i-work': 'How I Work',
156
+
157
+ // Product-hub internal
158
+ 'design-docs': 'Design Docs',
159
+ 'openframe-tenants': 'OpenFrame Tenants',
142
160
  };
143
161
 
144
162
  /** Lookup a human-readable label by RagTableConfig.id. Falls back
@@ -183,6 +201,7 @@ export const DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID: Record<string, string> = {
183
201
  event: 'events',
184
202
  podcast: 'podcasts',
185
203
  customer_interview: 'customer-interviews',
204
+ faq: 'faqs',
186
205
 
187
206
  // Financials
188
207
  investor_update: 'investor-updates',
@@ -212,6 +231,14 @@ export const DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID: Record<string, string> = {
212
231
 
213
232
  // Communications
214
233
  slack_message: 'slack-messages',
234
+
235
+ // People-hub employee content
236
+ what_i_shipped: 'what-i-shipped',
237
+ how_i_work: 'how-i-work',
238
+
239
+ // Product-hub internal
240
+ design_doc: 'design-docs',
241
+ openframe_tenant: 'openframe-tenants',
215
242
  };
216
243
 
217
244
  /**