@flamingo-stack/openframe-frontend-core 0.0.750 → 0.0.752

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 (82) hide show
  1. package/dist/{chunk-OFO75R2O.cjs → chunk-35RU25PJ.cjs} +130 -130
  2. package/dist/{chunk-ALPRQ3ZX.cjs → chunk-3GG3QAPT.cjs} +15 -15
  3. package/dist/{chunk-7RCTOWBA.cjs → chunk-4OTCQEP3.cjs} +28 -28
  4. package/dist/{chunk-XJ3J4UIS.cjs → chunk-4PEG4JTM.cjs} +19 -19
  5. package/dist/{chunk-3TELPOVH.cjs → chunk-7OEVVMAU.cjs} +2 -2
  6. package/dist/{chunk-CNUZLOVA.cjs → chunk-7WEGXNNS.cjs} +40 -40
  7. package/dist/{chunk-C6LPOYDM.cjs → chunk-AG4HR6Z6.cjs} +8 -8
  8. package/dist/{chunk-V3UJ6NDR.cjs → chunk-EM4OEWCM.cjs} +171 -171
  9. package/dist/{chunk-HOEVD6EN.cjs → chunk-EUQJ7QHW.cjs} +4 -4
  10. package/dist/{chunk-FP6HAJQV.cjs → chunk-G44V3UGE.cjs} +105 -105
  11. package/dist/{chunk-2YXOD2KL.cjs → chunk-H3RYUTND.cjs} +5 -0
  12. package/dist/{chunk-JPUTILTV.cjs → chunk-IPVJAML5.cjs} +94 -94
  13. package/dist/{chunk-KVSEWACW.cjs → chunk-J5G4CF2V.cjs} +28 -28
  14. package/dist/{chunk-2J2OBP4N.cjs → chunk-JI6NRWCC.cjs} +21 -21
  15. package/dist/{chunk-4O2KYY4K.cjs → chunk-KBJSZFBZ.cjs} +3 -3
  16. package/dist/{chunk-G7SBHMRR.cjs → chunk-KHKPLOU4.cjs} +69 -39
  17. package/dist/{chunk-45YRDD7W.cjs → chunk-KUVYVAS2.cjs} +22 -22
  18. package/dist/{chunk-UGCRLRCT.cjs → chunk-NO5UJLLQ.cjs} +2 -5
  19. package/dist/{chunk-WZX26ODJ.cjs → chunk-OXCGQV6B.cjs} +152 -133
  20. package/dist/{chunk-FHT7SMA7.cjs → chunk-OXEAN3EQ.cjs} +47 -47
  21. package/dist/{chunk-E3KFEOFA.cjs → chunk-P4ODFQGA.cjs} +7 -7
  22. package/dist/{chunk-AW6GP3JK.cjs → chunk-RDH63XXW.cjs} +83 -83
  23. package/dist/{chunk-CLAJIQ7E.cjs → chunk-U2AE4UG7.cjs} +19 -19
  24. package/dist/{chunk-6KEJQR6L.cjs → chunk-VD3XBUQR.cjs} +797 -797
  25. package/dist/{chunk-4FWURR3W.cjs → chunk-VUWPLQBY.cjs} +2 -2
  26. package/dist/{chunk-YL62VAHC.cjs → chunk-WQCLN27R.cjs} +6 -6
  27. package/dist/{chunk-GVETSV7H.cjs → chunk-XADJG35G.cjs} +48 -48
  28. package/dist/{chunk-BO6ZOAPB.cjs → chunk-Y6PVZRYL.cjs} +12 -12
  29. package/dist/{chunk-DGEB5GUZ.cjs → chunk-ZVOXBSDP.cjs} +2 -2
  30. package/dist/{chunk-34TWK3JE.cjs → chunk-ZYRRRKSZ.cjs} +3 -3
  31. package/dist/{cloud-tenants-E4JSG3GH.cjs → cloud-tenants-WAOMZZQ2.cjs} +13 -13
  32. package/dist/components/case-studies/index.cjs +26 -26
  33. package/dist/components/chat/hooks/use-jetstream-dialog-subscription.d.ts +7 -5
  34. package/dist/components/chat/hooks/use-jetstream-dialog-subscription.d.ts.map +1 -1
  35. package/dist/components/chat/hooks/use-jetstream-dialog-subscription.js +33 -14
  36. package/dist/components/chat/index.cjs +8 -8
  37. package/dist/components/chat/types/api.types.d.ts +27 -8
  38. package/dist/components/chat/types/api.types.d.ts.map +1 -1
  39. package/dist/components/chat/types/network.types.d.ts +2 -1
  40. package/dist/components/chat/types/network.types.d.ts.map +1 -1
  41. package/dist/components/contact/index.cjs +14 -14
  42. package/dist/components/docs/index.cjs +17 -17
  43. package/dist/components/embeds/index.cjs +14 -14
  44. package/dist/components/faq/index.cjs +15 -15
  45. package/dist/components/features/index.cjs +13 -13
  46. package/dist/components/help-center-pages/index.cjs +123 -123
  47. package/dist/components/index.cjs +64 -64
  48. package/dist/components/loading/loading-region.d.ts.map +1 -1
  49. package/dist/components/loading/loading-region.js +2 -5
  50. package/dist/components/loading/unified-skeleton.d.ts +2 -0
  51. package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
  52. package/dist/components/loading/unified-skeleton.js +5 -0
  53. package/dist/components/meeting-scheduler/index.cjs +79 -79
  54. package/dist/components/navigation/index.cjs +16 -16
  55. package/dist/components/onboarding-guides/index.cjs +16 -16
  56. package/dist/components/product-demo/index.cjs +12 -12
  57. package/dist/components/related-content/index.cjs +7 -7
  58. package/dist/components/tickets/index.cjs +19 -19
  59. package/dist/components/ui/file-manager/index.cjs +30 -30
  60. package/dist/components/ui/index.cjs +13 -13
  61. package/dist/{devices-AVRQGB2N.cjs → devices-VFEPXW2N.cjs} +14 -14
  62. package/dist/{embeddable-chat-SNYQSMS7.cjs → embeddable-chat-BYQBABDV.cjs} +74 -74
  63. package/dist/hooks/index.cjs +3 -3
  64. package/dist/index.cjs +17 -17
  65. package/dist/{knowledge-S3CNISQH.cjs → knowledge-4TE7AWZX.cjs} +14 -14
  66. package/dist/{logs-WDLOKDXT.cjs → logs-3B2P3JXN.cjs} +21 -21
  67. package/dist/nats/index.cjs +2 -2
  68. package/dist/nats/nats.d.ts +33 -7
  69. package/dist/nats/nats.d.ts.map +1 -1
  70. package/dist/nats/nats.js +41 -11
  71. package/dist/{policies-STML7NEZ.cjs → policies-DVI6V22X.cjs} +17 -17
  72. package/dist/{remote-session-ZKP2W3IS.cjs → remote-session-57DGC4X3.cjs} +6 -6
  73. package/dist/{scripts-HO53VYGX.cjs → scripts-JJ2BVYQ5.cjs} +20 -20
  74. package/dist/{software-update-4VTK7LWQ.cjs → software-update-BN23RATE.cjs} +17 -17
  75. package/dist/{tickets-board-BNW4AYFL.cjs → tickets-board-EP6L3BSV.cjs} +7 -7
  76. package/package.json +1 -1
  77. package/src/components/chat/hooks/use-jetstream-dialog-subscription.ts +59 -23
  78. package/src/components/chat/types/api.types.ts +27 -8
  79. package/src/components/chat/types/network.types.ts +2 -1
  80. package/src/components/loading/loading-region.tsx +4 -9
  81. package/src/components/loading/unified-skeleton.tsx +13 -0
  82. package/src/nats/nats.ts +91 -20
@@ -13,23 +13,23 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunk6KEJQR6Lcjs = require('./chunk-6KEJQR6L.cjs');
17
- require('./chunk-C6LPOYDM.cjs');
16
+ var _chunkVD3XBUQRcjs = require('./chunk-VD3XBUQR.cjs');
17
+ require('./chunk-AG4HR6Z6.cjs');
18
18
  require('./chunk-NTGIQP7O.cjs');
19
19
 
20
20
 
21
- var _chunkALPRQ3ZXcjs = require('./chunk-ALPRQ3ZX.cjs');
21
+ var _chunk3GG3QAPTcjs = require('./chunk-3GG3QAPT.cjs');
22
22
  require('./chunk-HQQE74RO.cjs');
23
23
  require('./chunk-DEY6XXGO.cjs');
24
- require('./chunk-4FWURR3W.cjs');
24
+ require('./chunk-VUWPLQBY.cjs');
25
25
  require('./chunk-LU7TD6QS.cjs');
26
26
  require('./chunk-24I6RFVU.cjs');
27
27
  require('./chunk-A6P6DHEZ.cjs');
28
28
  require('./chunk-MZ4KBSH7.cjs');
29
- require('./chunk-3TELPOVH.cjs');
29
+ require('./chunk-7OEVVMAU.cjs');
30
30
  require('./chunk-YUMFVQIN.cjs');
31
- require('./chunk-WZX26ODJ.cjs');
32
- require('./chunk-V3UJ6NDR.cjs');
31
+ require('./chunk-OXCGQV6B.cjs');
32
+ require('./chunk-EM4OEWCM.cjs');
33
33
  require('./chunk-LVO7FALW.cjs');
34
34
  require('./chunk-3RFQPQ7Z.cjs');
35
35
  require('./chunk-YRULLK7N.cjs');
@@ -1832,8 +1832,8 @@ require('./chunk-7DNL734S.cjs');
1832
1832
  require('./chunk-WWUSFOJ7.cjs');
1833
1833
  require('./chunk-SKI6NKOE.cjs');
1834
1834
  require('./chunk-EWPR7662.cjs');
1835
- require('./chunk-XJ3J4UIS.cjs');
1836
- require('./chunk-OFO75R2O.cjs');
1835
+ require('./chunk-4PEG4JTM.cjs');
1836
+ require('./chunk-35RU25PJ.cjs');
1837
1837
  require('./chunk-QYLIHZKZ.cjs');
1838
1838
  require('./chunk-63N4FN5V.cjs');
1839
1839
  require('./chunk-L2IQESTQ.cjs');
@@ -1859,15 +1859,15 @@ require('./chunk-K6VWTUCH.cjs');
1859
1859
  require('./chunk-MGF3FUKD.cjs');
1860
1860
  require('./chunk-Z74QE57T.cjs');
1861
1861
  require('./chunk-XZJCBIYR.cjs');
1862
- require('./chunk-UGCRLRCT.cjs');
1862
+ require('./chunk-NO5UJLLQ.cjs');
1863
1863
  require('./chunk-2QMBXGMQ.cjs');
1864
1864
  require('./chunk-V45KLJQP.cjs');
1865
- require('./chunk-G7SBHMRR.cjs');
1865
+ require('./chunk-KHKPLOU4.cjs');
1866
1866
  require('./chunk-L4UI63K6.cjs');
1867
1867
  require('./chunk-OF336YWG.cjs');
1868
1868
  require('./chunk-3LU4UFPS.cjs');
1869
1869
  require('./chunk-RB6BSE3O.cjs');
1870
- require('./chunk-2YXOD2KL.cjs');
1870
+ require('./chunk-H3RYUTND.cjs');
1871
1871
  require('./chunk-3ATAYP36.cjs');
1872
1872
 
1873
1873
  // src/components/product-demo/screens/scripts.tsx
@@ -1997,8 +1997,8 @@ function buildScriptsFixture(cast) {
1997
1997
  var _jsxruntime = require('react/jsx-runtime');
1998
1998
  var WIDE_HIDDEN_COLUMNS = ["result", "open"];
1999
1999
  var COMPACT_COLUMNS = [
2000
- { ..._chunk6KEJQR6Lcjs.EXECUTION_COLUMNS.machineId, width: "flex-1 min-w-0", hideAt: void 0 },
2001
- _chunk6KEJQR6Lcjs.EXECUTION_COLUMNS.status
2000
+ { ..._chunkVD3XBUQRcjs.EXECUTION_COLUMNS.machineId, width: "flex-1 min-w-0", hideAt: void 0 },
2001
+ _chunkVD3XBUQRcjs.EXECUTION_COLUMNS.status
2002
2002
  ];
2003
2003
  var COMPACT_ROWS = 4;
2004
2004
  var TOKEN_CLASS = {
@@ -2048,16 +2048,16 @@ function ScriptCodePicture({ script }) {
2048
2048
  children: [
2049
2049
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-[var(--spacing-system-xxs)] border-b border-ods-border p-[var(--spacing-system-m)]", children: [
2050
2050
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 items-center justify-between gap-[var(--spacing-system-m)]", children: [
2051
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkALPRQ3ZXcjs.TruncateText, { variant: "h4", children: script.name }),
2051
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3GG3QAPTcjs.TruncateText, { variant: "h4", children: script.name }),
2052
2052
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex shrink-0 items-center gap-[var(--spacing-system-xxs)] text-ods-text-primary text-h6", children: [
2053
2053
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTPKKRHUMcjs.TimerIcon, { className: "size-4 text-ods-text-secondary" }),
2054
2054
  `${schedule.repeat} ${schedule.time} \xB7 ${schedule.deviceCount} devices`
2055
2055
  ] })
2056
2056
  ] }),
2057
2057
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 items-center justify-between gap-[var(--spacing-system-m)]", children: [
2058
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkALPRQ3ZXcjs.TruncateText, { variant: "h6", tone: "secondary", children: `Written by ${provenance.author} \xB7 approved by ${provenance.approver}` }),
2058
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3GG3QAPTcjs.TruncateText, { variant: "h6", tone: "secondary", children: `Written by ${provenance.author} \xB7 approved by ${provenance.approver}` }),
2059
2059
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2060
- _chunk6KEJQR6Lcjs.ScriptShellBadge,
2060
+ _chunkVD3XBUQRcjs.ScriptShellBadge,
2061
2061
  {
2062
2062
  value: script.shellType,
2063
2063
  className: "shrink-0 text-ods-text-secondary text-h6",
@@ -2081,7 +2081,7 @@ function ScriptsScreen({ compact = false }) {
2081
2081
  return (
2082
2082
  // Four runs of the card's row height fill the frame; the padding is what is left round them.
2083
2083
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full overflow-hidden bg-ods-bg p-[var(--spacing-system-xsf)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2084
- _chunk6KEJQR6Lcjs.ScriptExecutionsTable,
2084
+ _chunkVD3XBUQRcjs.ScriptExecutionsTable,
2085
2085
  {
2086
2086
  rows: fixture.executions.slice(0, COMPACT_ROWS),
2087
2087
  columns: COMPACT_COLUMNS,
@@ -2091,13 +2091,13 @@ function ScriptsScreen({ compact = false }) {
2091
2091
  ) })
2092
2092
  );
2093
2093
  }
2094
- const renderOutput = (row) => row.id === fixture.openExecutionId ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk6KEJQR6Lcjs.ScriptExecutionResult, { result: row.result, empty: "\u2014" }) : null;
2094
+ const renderOutput = (row) => row.id === fixture.openExecutionId ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVD3XBUQRcjs.ScriptExecutionResult, { result: row.result, empty: "\u2014" }) : null;
2095
2095
  return (
2096
2096
  // The frame's tighter padding and no header row: the output opened under a run needs the height.
2097
2097
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-full gap-[var(--spacing-system-m)] overflow-hidden bg-ods-bg p-[var(--spacing-system-m)]", children: [
2098
2098
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-[39%] shrink-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ScriptCodePicture, { script: fixture.script }) }),
2099
2099
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2100
- _chunk6KEJQR6Lcjs.ScriptExecutionsTable,
2100
+ _chunkVD3XBUQRcjs.ScriptExecutionsTable,
2101
2101
  {
2102
2102
  rows: fixture.executions,
2103
2103
  hideColumns: WIDE_HIDDEN_COLUMNS,
@@ -15,23 +15,23 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
15
15
 
16
16
 
17
17
 
18
- var _chunk6KEJQR6Lcjs = require('./chunk-6KEJQR6L.cjs');
19
- require('./chunk-C6LPOYDM.cjs');
18
+ var _chunkVD3XBUQRcjs = require('./chunk-VD3XBUQR.cjs');
19
+ require('./chunk-AG4HR6Z6.cjs');
20
20
  require('./chunk-NTGIQP7O.cjs');
21
21
 
22
22
 
23
- var _chunkALPRQ3ZXcjs = require('./chunk-ALPRQ3ZX.cjs');
23
+ var _chunk3GG3QAPTcjs = require('./chunk-3GG3QAPT.cjs');
24
24
  require('./chunk-HQQE74RO.cjs');
25
25
  require('./chunk-DEY6XXGO.cjs');
26
- require('./chunk-4FWURR3W.cjs');
26
+ require('./chunk-VUWPLQBY.cjs');
27
27
  require('./chunk-LU7TD6QS.cjs');
28
28
  require('./chunk-24I6RFVU.cjs');
29
29
  require('./chunk-A6P6DHEZ.cjs');
30
30
  require('./chunk-MZ4KBSH7.cjs');
31
- require('./chunk-3TELPOVH.cjs');
31
+ require('./chunk-7OEVVMAU.cjs');
32
32
  require('./chunk-YUMFVQIN.cjs');
33
- require('./chunk-WZX26ODJ.cjs');
34
- require('./chunk-V3UJ6NDR.cjs');
33
+ require('./chunk-OXCGQV6B.cjs');
34
+ require('./chunk-EM4OEWCM.cjs');
35
35
  require('./chunk-LVO7FALW.cjs');
36
36
  require('./chunk-3RFQPQ7Z.cjs');
37
37
  require('./chunk-YRULLK7N.cjs');
@@ -1832,8 +1832,8 @@ require('./chunk-7DNL734S.cjs');
1832
1832
  require('./chunk-WWUSFOJ7.cjs');
1833
1833
  require('./chunk-SKI6NKOE.cjs');
1834
1834
  require('./chunk-EWPR7662.cjs');
1835
- require('./chunk-XJ3J4UIS.cjs');
1836
- require('./chunk-OFO75R2O.cjs');
1835
+ require('./chunk-4PEG4JTM.cjs');
1836
+ require('./chunk-35RU25PJ.cjs');
1837
1837
  require('./chunk-QYLIHZKZ.cjs');
1838
1838
  require('./chunk-63N4FN5V.cjs');
1839
1839
  require('./chunk-L2IQESTQ.cjs');
@@ -1859,15 +1859,15 @@ require('./chunk-K6VWTUCH.cjs');
1859
1859
  require('./chunk-MGF3FUKD.cjs');
1860
1860
  require('./chunk-Z74QE57T.cjs');
1861
1861
  require('./chunk-XZJCBIYR.cjs');
1862
- require('./chunk-UGCRLRCT.cjs');
1862
+ require('./chunk-NO5UJLLQ.cjs');
1863
1863
  require('./chunk-2QMBXGMQ.cjs');
1864
1864
  require('./chunk-V45KLJQP.cjs');
1865
- require('./chunk-G7SBHMRR.cjs');
1865
+ require('./chunk-KHKPLOU4.cjs');
1866
1866
  require('./chunk-L4UI63K6.cjs');
1867
1867
  require('./chunk-OF336YWG.cjs');
1868
1868
  require('./chunk-3LU4UFPS.cjs');
1869
1869
  require('./chunk-RB6BSE3O.cjs');
1870
- require('./chunk-2YXOD2KL.cjs');
1870
+ require('./chunk-H3RYUTND.cjs');
1871
1871
  require('./chunk-3ATAYP36.cjs');
1872
1872
 
1873
1873
  // src/components/product-demo/screens/software-update.tsx
@@ -1922,14 +1922,14 @@ var noop = () => {
1922
1922
  var HIDDEN_WHEN_COMPACT = ["organization"];
1923
1923
  function StaticPackageField({ value }) {
1924
1924
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1925
- _chunkALPRQ3ZXcjs.Autocomplete,
1925
+ _chunk3GG3QAPTcjs.Autocomplete,
1926
1926
  {
1927
- label: _chunk6KEJQR6Lcjs.PACKAGE_SEARCH_LABEL,
1927
+ label: _chunkVD3XBUQRcjs.PACKAGE_SEARCH_LABEL,
1928
1928
  labelVariant: "large",
1929
1929
  options: value ? [{ value: value.id, label: value.name, description: _nullishCoalesce(value.description, () => ( void 0)) }] : [],
1930
1930
  value: _nullishCoalesce(_optionalChain([value, 'optionalAccess', _ => _.id]), () => ( null)),
1931
1931
  onChange: noop,
1932
- placeholder: _chunk6KEJQR6Lcjs.PACKAGE_SEARCH_PLACEHOLDER
1932
+ placeholder: _chunkVD3XBUQRcjs.PACKAGE_SEARCH_PLACEHOLDER
1933
1933
  }
1934
1934
  );
1935
1935
  }
@@ -1943,7 +1943,7 @@ function SoftwareUpdateScreen({ compact = false }) {
1943
1943
  [fixture.devices, fixture.selectedIds]
1944
1944
  );
1945
1945
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg pt-[var(--spacing-system-l)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1946
- _chunk6KEJQR6Lcjs.SoftwareActionForm,
1946
+ _chunkVD3XBUQRcjs.SoftwareActionForm,
1947
1947
  {
1948
1948
  action: fixture.action,
1949
1949
  showHeader: false,
@@ -1955,7 +1955,7 @@ function SoftwareUpdateScreen({ compact = false }) {
1955
1955
  initialValues: fixture.initialValues,
1956
1956
  renderPackageSearch,
1957
1957
  renderDevicePicker: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1958
- _chunk6KEJQR6Lcjs.DeviceSelector,
1958
+ _chunkVD3XBUQRcjs.DeviceSelector,
1959
1959
  {
1960
1960
  devices: selected,
1961
1961
  loading: false,
@@ -10,7 +10,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
10
10
 
11
11
 
12
12
 
13
- var _chunkC6LPOYDMcjs = require('./chunk-C6LPOYDM.cjs');
13
+ var _chunkAG4HR6Z6cjs = require('./chunk-AG4HR6Z6.cjs');
14
14
  require('./chunk-LU7TD6QS.cjs');
15
15
  require('./chunk-LVO7FALW.cjs');
16
16
  require('./chunk-P6F6PHVK.cjs');
@@ -1825,7 +1825,7 @@ require('./chunk-2QMBXGMQ.cjs');
1825
1825
  require('./chunk-V45KLJQP.cjs');
1826
1826
  require('./chunk-3LU4UFPS.cjs');
1827
1827
  require('./chunk-RB6BSE3O.cjs');
1828
- require('./chunk-2YXOD2KL.cjs');
1828
+ require('./chunk-H3RYUTND.cjs');
1829
1829
  require('./chunk-3ATAYP36.cjs');
1830
1830
 
1831
1831
  // src/components/product-demo/screens/tickets-board.tsx
@@ -1840,7 +1840,7 @@ function buildTicketsBoardFixture(cast) {
1840
1840
  const dana = assignee(cast.person("dana"));
1841
1841
  const alex = assignee(cast.person("alex"));
1842
1842
  return [
1843
- _chunkC6LPOYDMcjs.columnFromTicketStatus.call(void 0, "ACTIVE", [
1843
+ _chunkAG4HR6Z6cjs.columnFromTicketStatus.call(void 0, "ACTIVE", [
1844
1844
  ticket("tk-1051", "Printer offline at the front desk", "ACTIVE", {
1845
1845
  ticketNumber: "1051",
1846
1846
  agent: "fae",
@@ -1858,7 +1858,7 @@ function buildTicketsBoardFixture(cast) {
1858
1858
  tags: ["onboarding"]
1859
1859
  })
1860
1860
  ]),
1861
- _chunkC6LPOYDMcjs.columnFromTicketStatus.call(void 0, "TECH_REQUIRED", [
1861
+ _chunkAG4HR6Z6cjs.columnFromTicketStatus.call(void 0, "TECH_REQUIRED", [
1862
1862
  ticket("tk-1049", "Acrobat Pro for Maya", "TECH_REQUIRED", {
1863
1863
  ticketNumber: "1049",
1864
1864
  agent: "fae",
@@ -1882,7 +1882,7 @@ function buildTicketsBoardFixture(cast) {
1882
1882
  escalatedByUser: true
1883
1883
  })
1884
1884
  ]),
1885
- _chunkC6LPOYDMcjs.columnFromTicketStatus.call(void 0, "ON_HOLD", [
1885
+ _chunkAG4HR6Z6cjs.columnFromTicketStatus.call(void 0, "ON_HOLD", [
1886
1886
  ticket("tk-1046", "Replace the conference room display", "ON_HOLD", {
1887
1887
  ticketNumber: "1046",
1888
1888
  organizationName: _chunkDKOLQPE7cjs.DEMO_ORGANIZATIONS.acme.name,
@@ -1891,7 +1891,7 @@ function buildTicketsBoardFixture(cast) {
1891
1891
  activity: { kind: "waiting-external" }
1892
1892
  })
1893
1893
  ]),
1894
- _chunkC6LPOYDMcjs.columnFromTicketStatus.call(void 0,
1894
+ _chunkAG4HR6Z6cjs.columnFromTicketStatus.call(void 0,
1895
1895
  "RESOLVED",
1896
1896
  [
1897
1897
  ticket("tk-1048", "Slow laptop", "RESOLVED", {
@@ -1927,7 +1927,7 @@ function TicketsBoardScreen({ compact = false }) {
1927
1927
  const cast = _chunkSTEJZPIOcjs.useProductDemoCast.call(void 0, );
1928
1928
  const board = _react.useMemo.call(void 0, () => buildTicketsBoardFixture(cast), [cast]);
1929
1929
  const columns = compact ? board.filter((column) => column.id !== "ON_HOLD") : board;
1930
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg p-[var(--spacing-system-m)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkC6LPOYDMcjs.Board, { columns, onChange: noop, initialCollapsed: compact ? void 0 : FOLDED }) });
1930
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg p-[var(--spacing-system-m)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkAG4HR6Z6cjs.Board, { columns, onChange: noop, initialCollapsed: compact ? void 0 : FOLDED }) });
1931
1931
  }
1932
1932
 
1933
1933
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.750",
3
+ "version": "0.0.752",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -49,14 +49,16 @@ const RECOVERY_REPORT_FLOOR_MS = 5_000;
49
49
  * - Subject: `chat.{dialogId}.{topic}`
50
50
  * - When `optStartSeq` is a number, the consumer resumes at `optStartSeq + 1`
51
51
  * (`DeliverPolicy.ByStartSequence`). When null/undefined, it live-tails
52
- * (`DeliverPolicy.New`).
52
+ * (`DeliverPolicy.New`) from whenever the server creates the consumer.
53
53
  * - On reconnect, the consumer is recreated starting from the highest stream
54
54
  * sequence we've already observed + 1, so no chunk is replayed or skipped.
55
- * - Consumer is ephemeral with `AckPolicy.None` and the client's default
56
- * inactivity threshold (overridable via `inactiveThresholdMs`).
55
+ * - Consumer is ephemeral with `AckPolicy.None` and nats.ws's default
56
+ * inactivity threshold (`inactiveThresholdMs` only reaches a live-tail
57
+ * consumer — see the option).
57
58
  * - `reconnectionCount` also counts consumer recreations and post-absence
58
- * resyncs, not just NATS reconnects — see the counter's docs. Callers refetch
59
- * persisted history whenever it moves.
59
+ * resyncs, not just NATS reconnects — see the counter's docs.
60
+ * - `caughtUpCount` is when callers refetch persisted history after a gap —
61
+ * not `reconnectionCount` (see its docs).
60
62
  */
61
63
  export function useJetStreamDialogSubscription({
62
64
  enabled,
@@ -84,6 +86,11 @@ export function useJetStreamDialogSubscription({
84
86
  // churn — and churn that can feed itself, since each new consumer can report
85
87
  // its own recoveries. Callers see the two summed (see the return).
86
88
  const [recoveryCount, setRecoveryCount] = useState(0);
89
+ const [caughtUpCount, setCaughtUpCount] = useState(0);
90
+ // The dialog this hook last opened a tail for, and the reconnection count it
91
+ // opened it at: a consumer created for the same dialog at a higher count is
92
+ // one coming back after a gap, which owes the caller a history refetch.
93
+ const tailOpenedAtRef = useRef<{ dialogId: string; count: number } | null>(null);
87
94
  // The highest sequence seen, TAGGED with the dialog it belongs to. The tag is
88
95
  // what makes the per-dialog reset implicit — a sequence from another
89
96
  // conversation simply stops matching — so the dialog-change effect below no
@@ -381,11 +388,28 @@ export function useJetStreamDialogSubscription({
381
388
  const initialOptStart = optStartSeqRef.current;
382
389
  const startSeq = resumeSeq != null ? resumeSeq + 1 : initialOptStart != null ? initialOptStart + 1 : undefined;
383
390
 
391
+ // A first consumer reports nothing: the caller has just loaded the history
392
+ // it resumes after. A reconnect or resync recreates it at a higher count,
393
+ // and from then on the caller's history may predate a gap.
394
+ const opened = tailOpenedAtRef.current;
395
+ let owesCatchUp = opened !== null && opened.dialogId === dialogId && reconnectionCount > opened.count;
396
+ if (!owesCatchUp) tailOpenedAtRef.current = { dialogId, count: reconnectionCount };
397
+
384
398
  let cancelled = false;
399
+ // Settles an owed catch-up once the replay is in, or once there can be none
400
+ // (a failed resume, below) — never as the tail comes back: a refetch that
401
+ // lands first merges without the turns the replay is still delivering, and
402
+ // they then render twice.
403
+ const settleCatchUp = () => {
404
+ if (cancelled || !owesCatchUp) return;
405
+ owesCatchUp = false;
406
+ setCaughtUpCount(c => c + 1);
407
+ };
385
408
 
386
409
  void (async () => {
410
+ let handle: JetStreamSubscriptionHandle;
387
411
  try {
388
- const handle = await client.subscribeJetStreamOrdered(
412
+ handle = await client.subscribeJetStreamOrdered(
389
413
  msg => {
390
414
  if (cancelled) return;
391
415
  const streamSeq = msg.info.streamSequence;
@@ -424,27 +448,39 @@ export function useJetStreamDialogSubscription({
424
448
  const now = Date.now();
425
449
  if (now - lastRecoveryReportRef.current < RECOVERY_REPORT_FLOOR_MS) return;
426
450
  lastRecoveryReportRef.current = now;
451
+ owesCatchUp = true;
427
452
  setRecoveryCount(c => c + 1);
428
453
  },
454
+ onCaughtUp: settleCatchUp,
429
455
  },
430
456
  );
457
+ } catch {
458
+ if (cancelled) return;
459
+ setIsSubscribed(false);
460
+ // With no consumer the refetch cannot wait for a replay. The next resume
461
+ // still owes one (`tailOpenedAtRef` did not move), and its own catch-up
462
+ // refetch clears what its replay re-renders meanwhile.
463
+ settleCatchUp();
464
+ return;
465
+ }
431
466
 
432
- if (cancelled) {
433
- try {
434
- handle.unsubscribe();
435
- } catch {
436
- // ignore
437
- }
438
- return;
467
+ if (cancelled) {
468
+ try {
469
+ handle.unsubscribe();
470
+ } catch {
471
+ // ignore
439
472
  }
473
+ return;
474
+ }
440
475
 
441
- subscriptionRef.current = handle;
442
- setIsSubscribed(true);
476
+ subscriptionRef.current = handle;
477
+ setIsSubscribed(true);
478
+ // A host callback, outside the subscribe's catch: a throw there must not
479
+ // read as a failed subscribe and settle the catch-up before the replay.
480
+ try {
443
481
  onSubscribedRef.current?.();
444
- } catch {
445
- if (!cancelled) {
446
- setIsSubscribed(false);
447
- }
482
+ } catch (e) {
483
+ console.warn('[JetStream] onSubscribed threw:', e);
448
484
  }
449
485
  })();
450
486
 
@@ -464,14 +500,14 @@ export function useJetStreamDialogSubscription({
464
500
  }, [enabled, dialogId, isConnected, streamName, topic, reconnectionCount]);
465
501
 
466
502
  // One counter for every way the tail comes back — reconnect, consumer
467
- // recreation, post-absence resync — because callers do the same thing for all
468
- // of them: refetch persisted history, since the gap may predate what the
469
- // stream still holds. The last two are the quiet ones; no connection event
470
- // fires for either.
503
+ // recreation, post-absence resync. The last two are the quiet ones; no
504
+ // connection event fires for either. `caughtUpCount` counts the same events,
505
+ // each once its replay is in or once it could not be resumed (see its docs).
471
506
  return {
472
507
  isConnected,
473
508
  isSubscribed,
474
509
  reconnectionCount: reconnectionCount + recoveryCount,
510
+ caughtUpCount,
475
511
  currentStreamSeq,
476
512
  };
477
513
  }
@@ -103,8 +103,9 @@ export interface UseJetStreamDialogSubscriptionOptions {
103
103
  /** Single topic to subscribe to. */
104
104
  topic: NatsMessageType;
105
105
  /**
106
- * Resume from this JetStream sequence + 1. When null/undefined, the consumer starts with
107
- * DeliverPolicy.New (live tail only).
106
+ * Resume from this JetStream sequence + 1 (0 replays everything the stream retains for the
107
+ * dialog). When null/undefined, the consumer starts with DeliverPolicy.New: live tail only,
108
+ * from whenever the server creates the consumer — after `onSubscribed` has fired.
108
109
  */
109
110
  optStartSeq?: number | null;
110
111
  onEvent?: (payload: unknown, messageType: NatsMessageType) => void;
@@ -127,8 +128,10 @@ export interface UseJetStreamDialogSubscriptionOptions {
127
128
  maxDelayMs?: number;
128
129
  multiplier?: number;
129
130
  };
130
- /** Consumer inactivity threshold in ms before NATS auto-cleans it. Defaults to the
131
- * client's, and applies only to the first consumer — recreations use nats.ws's. */
131
+ /** Consumer inactivity threshold in ms before NATS auto-cleans it, passed to the client
132
+ * (see `JetStreamOrderedSubscribeOptions.inactiveThresholdMs`). It takes effect only
133
+ * while the hook live-tails (`optStartSeq` null, nothing seen yet): every other consumer
134
+ * it opens starts from a sequence ≥ 1, which nats.ws gives its own default. */
132
135
  inactiveThresholdMs?: number;
133
136
  /**
134
137
  * A counter the host bumps when it knows, from outside the page, that the tail
@@ -140,7 +143,8 @@ export interface UseJetStreamDialogSubscriptionOptions {
140
143
  * either kind of knowledge bumps this instead of hoping the page noticed.
141
144
  *
142
145
  * Treated exactly like a reconnect: the consumer is rebuilt from the highest
143
- * sequence already seen, and `reconnectionCount` moves so callers refetch
146
+ * sequence already seen, `reconnectionCount` moves, and `caughtUpCount` moves
147
+ * once the rebuilt consumer has replayed what it missed, so callers refetch
144
148
  * persisted history. Any increase counts; the value itself means nothing, and
145
149
  * an increase arriving alongside a `visibilitychange` costs one rebuild, not
146
150
  * two.
@@ -156,11 +160,26 @@ export interface UseJetStreamDialogSubscriptionReturn {
156
160
  * JetStream ordered-consumer recreation, the page returning to view after
157
161
  * being hidden long enough to have missed something, or a host reporting the
158
162
  * same via `resyncSignal`. All of them mean the same thing to the caller —
159
- * the tail may have skipped messages, so persisted history has to be
160
- * refetched. One absence counts once even when two sources report it.
161
- * Starts at 0.
163
+ * the tail may have skipped messages. One absence counts once even when two
164
+ * sources report it. Starts at 0.
165
+ *
166
+ * Not the moment to refetch persisted history: the replay is still arriving
167
+ * when this moves. See `caughtUpCount`.
162
168
  */
163
169
  reconnectionCount: number;
170
+ /**
171
+ * Incremented once a tail that came back — any of the events
172
+ * `reconnectionCount` counts, recoveries past its report floor — has
173
+ * delivered everything the stream still held for the dialog. Refetch
174
+ * persisted history on this: the gap may predate what the stream retains,
175
+ * and only a refetch that lands after the replay merges against the turns it
176
+ * re-delivered. One that lands first merges without them, and they then
177
+ * render a second time. Also moves when such a tail could not be resumed at
178
+ * all, so history is not left at its pre-gap snapshot: the next resume then
179
+ * replays the gap over that refetch, and its own increment's refetch clears
180
+ * the copies. Never moves for the first consumer of a dialog. Starts at 0.
181
+ */
182
+ caughtUpCount: number;
164
183
  /** Highest JetStream stream sequence observed so far (null before first delivery). */
165
184
  currentStreamSeq: number | null;
166
185
  }
@@ -36,7 +36,8 @@ export interface ChunkData {
36
36
  sequenceId?: number;
37
37
  /** JetStream stream sequence, populated from JsMsg.info.streamSequence when delivered via JetStream. */
38
38
  streamSeq?: number;
39
- /** Authoritative dialog streaming state at the time this chunk was emitted; consumers should mirror it into their dialog cache. */
39
+ /** @deprecated Not set by the ai-agent: its chunks carry no stream state, which exists only
40
+ * as the GraphQL `Dialog.streamState` field (resolved from the dialog lock). Read that instead. */
40
41
  streamState?: 'IDLE' | 'STREAMING';
41
42
  type: string;
42
43
  text?: string;
@@ -40,16 +40,11 @@ export function LoadingRegion({
40
40
  children,
41
41
  ...props
42
42
  }: LoadingRegionProps) {
43
- if (!announce) {
44
- return (
45
- <Tag className={className} {...props}>
46
- {children}
47
- </Tag>
48
- );
49
- }
43
+ // One tree for both states: `children` keeps its slot whether or not the status is drawn, so an
44
+ // `announce` that flips at runtime does not remount the content (and drop its state and focus).
50
45
  return (
51
- <Tag aria-busy="true" className={className} {...props}>
52
- {status && (
46
+ <Tag aria-busy={announce ? 'true' : undefined} className={className} {...props}>
47
+ {announce && status && (
53
48
  <span role="status" aria-live="polite" className="sr-only">
54
49
  {label}
55
50
  </span>
@@ -19,6 +19,8 @@ interface UnifiedSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
19
19
  /**
20
20
  * The element drawn. `span` keeps the placeholder valid phrasing content where
21
21
  * a `div` may not stand (inside a `p`, a heading, a label or an inline card).
22
+ * A span bar whose classes set no base display gets one of its own, capped to
23
+ * its line and centred on it; a caller that sets one gets none of the three.
22
24
  */
23
25
  as?: 'div' | 'span';
24
26
  }
@@ -68,6 +70,15 @@ export function UnifiedSkeleton({
68
70
  // An `aspect-*` utility sizes the box itself; a default height would win
69
71
  // over it (explicit height beats aspect-ratio) and collapse the box to 16px.
70
72
  const sizedByAspect = /(?:^|\s)aspect-/.test(className ?? '');
73
+ // A span that already names its base display keeps it, with its own cap and alignment: the frozen
74
+ // TitleBlock's bars and the chip and breadcrumb skeletons are `inline-block` on the baseline, tuned to
75
+ // their text. Only an unprefixed display counts: `md:hidden` leaves the base span inline, and a bar
76
+ // without the default would draw at 0×0 below that breakpoint. The list is the displays bars use;
77
+ // any other falls back to the default, and twMerge still lets the caller's display win.
78
+ const setsDisplay =
79
+ /(?:^|\s)(?:inline-block|inline-flex|inline-grid|inline|block|flex|grid|contents|hidden)(?=\s|$)/.test(
80
+ className ?? '',
81
+ );
71
82
 
72
83
  const style: React.CSSProperties = {
73
84
  width: width,
@@ -77,6 +88,8 @@ export function UnifiedSkeleton({
77
88
  return (
78
89
  <Tag
79
90
  className={cn(
91
+ // An inline span ignores width and height: without a display of its own the bar draws at 0×0.
92
+ Tag === 'span' && !setsDisplay && 'inline-block max-w-full align-middle',
80
93
  animate ? SKELETON_SURFACE_CLASS : 'bg-ods-skeleton',
81
94
  variantClasses[variant],
82
95
  !height && !style.height && !sizedByAspect && defaultHeights[variant],