@flamingo-stack/openframe-frontend-core 0.0.498-1506.4000.1 → 0.0.498

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 (290) hide show
  1. package/dist/{chunk-ZHC2BCXK.js → chunk-2OPD6KRB.js} +4 -4
  2. package/dist/{chunk-5BQWVNRS.cjs → chunk-2R25CGSO.cjs} +62 -62
  3. package/dist/{chunk-5BQWVNRS.cjs.map → chunk-2R25CGSO.cjs.map} +1 -1
  4. package/dist/{chunk-242K7LZY.cjs → chunk-4EHQEMN4.cjs} +11 -11
  5. package/dist/{chunk-242K7LZY.cjs.map → chunk-4EHQEMN4.cjs.map} +1 -1
  6. package/dist/{chunk-4KKGHPNE.cjs → chunk-4NIBKEED.cjs} +9 -9
  7. package/dist/{chunk-4KKGHPNE.cjs.map → chunk-4NIBKEED.cjs.map} +1 -1
  8. package/dist/{chunk-5QWYIPMH.js → chunk-5ZL7PA63.js} +2 -2
  9. package/dist/{chunk-3VGRZ62V.js → chunk-6GAJETAP.js} +2 -2
  10. package/dist/{chunk-EO35UHFT.cjs → chunk-A3Z63ZL5.cjs} +60 -60
  11. package/dist/chunk-A3Z63ZL5.cjs.map +1 -0
  12. package/dist/{chunk-34C2JV2C.js → chunk-G6ARA2HD.js} +2 -2
  13. package/dist/{chunk-WNXIG6YY.js → chunk-K5HHLTSG.js} +2 -2
  14. package/dist/{chunk-42NYDEHH.js → chunk-KK4M4URN.js} +2 -2
  15. package/dist/{chunk-42SMPKGY.js → chunk-MF3VJKHT.js} +2 -2
  16. package/dist/{chunk-EORFD5WB.cjs → chunk-MSB3PEPP.cjs} +15 -15
  17. package/dist/{chunk-EORFD5WB.cjs.map → chunk-MSB3PEPP.cjs.map} +1 -1
  18. package/dist/{chunk-F7XPMG25.cjs → chunk-MVORKLWX.cjs} +27 -28
  19. package/dist/chunk-MVORKLWX.cjs.map +1 -0
  20. package/dist/{chunk-D3LUKR2Y.js → chunk-OYPUQJJ2.js} +10044 -12292
  21. package/dist/chunk-OYPUQJJ2.js.map +1 -0
  22. package/dist/{chunk-62TM2RVZ.cjs → chunk-T67MZAQJ.cjs} +26 -26
  23. package/dist/{chunk-62TM2RVZ.cjs.map → chunk-T67MZAQJ.cjs.map} +1 -1
  24. package/dist/{chunk-BUBQEZ5J.js → chunk-VLWVM6ZS.js} +2 -2
  25. package/dist/{chunk-632XJ2ZT.js → chunk-VOOEX4IZ.js} +5 -6
  26. package/dist/chunk-VOOEX4IZ.js.map +1 -0
  27. package/dist/{chunk-5ZY5JM4Z.js → chunk-W4XZ3FBZ.js} +10 -10
  28. package/dist/chunk-W4XZ3FBZ.js.map +1 -0
  29. package/dist/{chunk-2LYA3RBT.cjs → chunk-XI44QDCD.cjs} +37 -37
  30. package/dist/{chunk-2LYA3RBT.cjs.map → chunk-XI44QDCD.cjs.map} +1 -1
  31. package/dist/{chunk-WZCQW4MW.js → chunk-XSNKSMB3.js} +4 -4
  32. package/dist/{chunk-J3NHQ4JB.cjs → chunk-ZBTIN7RC.cjs} +31 -31
  33. package/dist/{chunk-J3NHQ4JB.cjs.map → chunk-ZBTIN7RC.cjs.map} +1 -1
  34. package/dist/{chunk-SS3D3DHL.cjs → chunk-ZEZTITQZ.cjs} +4886 -7134
  35. package/dist/chunk-ZEZTITQZ.cjs.map +1 -0
  36. package/dist/{chunk-44C23SSC.cjs → chunk-ZHNWWFIM.cjs} +5 -5
  37. package/dist/{chunk-44C23SSC.cjs.map → chunk-ZHNWWFIM.cjs.map} +1 -1
  38. package/dist/{chunk-H6GFQ4AO.cjs → chunk-ZTE32A7C.cjs} +7 -7
  39. package/dist/{chunk-H6GFQ4AO.cjs.map → chunk-ZTE32A7C.cjs.map} +1 -1
  40. package/dist/components/case-studies/index.cjs +8 -8
  41. package/dist/components/case-studies/index.js +2 -2
  42. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  43. package/dist/components/chat/chat-message-list.d.ts.map +1 -1
  44. package/dist/components/chat/hooks/index.d.ts +1 -0
  45. package/dist/components/chat/hooks/index.d.ts.map +1 -1
  46. package/dist/components/chat/hooks/use-chat.d.ts.map +1 -1
  47. package/dist/components/chat/hooks/use-chunk-catchup.d.ts.map +1 -1
  48. package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts +48 -15
  49. package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts.map +1 -1
  50. package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts +6 -0
  51. package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts.map +1 -0
  52. package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts +57 -10
  53. package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts.map +1 -1
  54. package/dist/components/chat/index.cjs +2 -10
  55. package/dist/components/chat/index.cjs.map +1 -1
  56. package/dist/components/chat/index.d.ts +0 -1
  57. package/dist/components/chat/index.d.ts.map +1 -1
  58. package/dist/components/chat/index.js +13 -21
  59. package/dist/components/chat/types/api.types.d.ts +81 -1
  60. package/dist/components/chat/types/api.types.d.ts.map +1 -1
  61. package/dist/components/chat/types/processing.types.d.ts +93 -2
  62. package/dist/components/chat/types/processing.types.d.ts.map +1 -1
  63. package/dist/components/chat/utils/chunk-parser.d.ts +25 -0
  64. package/dist/components/chat/utils/chunk-parser.d.ts.map +1 -0
  65. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts +6 -34
  66. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
  67. package/dist/components/chat/utils/index.d.ts +3 -2
  68. package/dist/components/chat/utils/index.d.ts.map +1 -1
  69. package/dist/components/chat/utils/process-historical-messages.d.ts +11 -59
  70. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  71. package/dist/components/contact/index.cjs +3 -3
  72. package/dist/components/contact/index.js +2 -2
  73. package/dist/components/docs/index.cjs +5 -5
  74. package/dist/components/docs/index.js +4 -4
  75. package/dist/components/embeds/index.cjs +3 -3
  76. package/dist/components/embeds/index.js +2 -2
  77. package/dist/components/faq/index.cjs +3 -3
  78. package/dist/components/faq/index.js +2 -2
  79. package/dist/components/features/index.cjs +2 -2
  80. package/dist/components/features/index.js +1 -1
  81. package/dist/components/help-center-pages/index.cjs +20 -20
  82. package/dist/components/help-center-pages/index.js +11 -11
  83. package/dist/components/index.cjs +130 -172
  84. package/dist/components/index.cjs.map +1 -1
  85. package/dist/components/index.js +21 -63
  86. package/dist/components/index.js.map +1 -1
  87. package/dist/components/navigation/header.d.ts.map +1 -1
  88. package/dist/components/navigation/index.cjs +2 -2
  89. package/dist/components/navigation/index.js +1 -1
  90. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  91. package/dist/components/onboarding-guides/index.cjs +5 -5
  92. package/dist/components/onboarding-guides/index.js +4 -4
  93. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
  94. package/dist/components/related-content/index.cjs +3 -3
  95. package/dist/components/related-content/index.js +2 -2
  96. package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
  97. package/dist/components/tickets/index.cjs +5 -5
  98. package/dist/components/tickets/index.js +4 -4
  99. package/dist/components/ui/index.cjs +2 -44
  100. package/dist/components/ui/index.cjs.map +1 -1
  101. package/dist/components/ui/index.d.ts +2 -1
  102. package/dist/components/ui/index.d.ts.map +1 -1
  103. package/dist/components/ui/index.js +13 -55
  104. package/dist/components/ui/rich-markdown-renderer.d.ts +34 -0
  105. package/dist/components/ui/rich-markdown-renderer.d.ts.map +1 -0
  106. package/dist/components/ui/simple-markdown-renderer.d.ts +73 -0
  107. package/dist/components/ui/simple-markdown-renderer.d.ts.map +1 -0
  108. package/dist/index.cjs +2 -60
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.js +13 -71
  111. package/dist/utils/index.cjs +40 -169
  112. package/dist/utils/index.cjs.map +1 -1
  113. package/dist/utils/index.d.ts +0 -1
  114. package/dist/utils/index.d.ts.map +1 -1
  115. package/dist/utils/index.js +41 -162
  116. package/dist/utils/index.js.map +1 -1
  117. package/dist/utils/markdown-section-extractor.d.ts.map +1 -1
  118. package/package.json +1 -7
  119. package/src/components/chat/__tests__/chat-message-list.test.tsx +6 -381
  120. package/src/components/chat/chat-message-enhanced.tsx +20 -122
  121. package/src/components/chat/chat-message-list.tsx +132 -409
  122. package/src/components/chat/embeddable-chat.tsx +0 -6
  123. package/src/components/chat/hooks/.index.md +33 -30
  124. package/src/components/chat/hooks/.use-nats-chat-adapter.md +55 -36
  125. package/src/components/chat/hooks/.use-realtime-chunk-processor.md +77 -0
  126. package/src/components/chat/hooks/index.ts +1 -0
  127. package/src/components/chat/hooks/use-chat.ts +0 -8
  128. package/src/components/chat/hooks/use-chunk-catchup.ts +1 -26
  129. package/src/components/chat/hooks/use-nats-chat-adapter.ts +825 -254
  130. package/src/components/chat/hooks/use-realtime-chunk-processor.ts +489 -0
  131. package/src/components/chat/hooks/use-sse-chat-adapter.ts +684 -380
  132. package/src/components/chat/index.ts +0 -5
  133. package/src/components/chat/thinking-display.tsx +1 -1
  134. package/src/components/chat/types/.api.types.md +49 -39
  135. package/src/components/chat/types/.processing.types.md +58 -29
  136. package/src/components/chat/types/api.types.ts +73 -6
  137. package/src/components/chat/types/processing.types.ts +53 -11
  138. package/src/components/chat/utils/.chunk-parser.md +62 -0
  139. package/src/components/chat/utils/.index.md +40 -31
  140. package/src/components/chat/utils/__tests__/process-historical-messages-approvals.test.ts +0 -61
  141. package/src/components/chat/utils/chunk-parser.ts +262 -0
  142. package/src/components/chat/utils/extract-incomplete-message-state.ts +5 -63
  143. package/src/components/chat/utils/index.ts +8 -5
  144. package/src/components/chat/utils/process-historical-messages.ts +386 -358
  145. package/src/components/navigation/header.tsx +2 -1
  146. package/src/components/navigation/mingo-ai-button.tsx +4 -1
  147. package/src/components/navigation/mobile-nav-panel.tsx +5 -5
  148. package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +4 -22
  149. package/src/components/shared/legal-document/legal-document-page.tsx +1 -1
  150. package/src/components/shared/product-release/release-detail-page.tsx +4 -19
  151. package/src/components/ui/.simple-markdown-renderer.md +52 -0
  152. package/src/components/ui/index.ts +2 -1
  153. package/src/components/ui/release-changelog-section.tsx +1 -1
  154. package/src/components/ui/rich-markdown-renderer.tsx +1223 -0
  155. package/src/components/ui/simple-markdown-renderer.tsx +964 -0
  156. package/src/components/ui/ticket-info-section.tsx +1 -1
  157. package/src/utils/index.ts +0 -1
  158. package/src/utils/markdown-section-extractor.ts +56 -41
  159. package/dist/chat-protocol/decode.d.ts +0 -58
  160. package/dist/chat-protocol/decode.d.ts.map +0 -1
  161. package/dist/chat-protocol/encode.d.ts +0 -44
  162. package/dist/chat-protocol/encode.d.ts.map +0 -1
  163. package/dist/chat-protocol/env-flag.d.ts +0 -35
  164. package/dist/chat-protocol/env-flag.d.ts.map +0 -1
  165. package/dist/chat-protocol/events.d.ts +0 -207
  166. package/dist/chat-protocol/events.d.ts.map +0 -1
  167. package/dist/chat-protocol/frames.d.ts +0 -213
  168. package/dist/chat-protocol/frames.d.ts.map +0 -1
  169. package/dist/chat-protocol/index.cjs +0 -500
  170. package/dist/chat-protocol/index.cjs.map +0 -1
  171. package/dist/chat-protocol/index.d.ts +0 -18
  172. package/dist/chat-protocol/index.d.ts.map +0 -1
  173. package/dist/chat-protocol/index.js +0 -484
  174. package/dist/chat-protocol/index.js.map +0 -1
  175. package/dist/chat-protocol/ip-normalize.d.ts +0 -44
  176. package/dist/chat-protocol/ip-normalize.d.ts.map +0 -1
  177. package/dist/chat-protocol/nats-decoder.d.ts +0 -26
  178. package/dist/chat-protocol/nats-decoder.d.ts.map +0 -1
  179. package/dist/chunk-5ZY5JM4Z.js.map +0 -1
  180. package/dist/chunk-632XJ2ZT.js.map +0 -1
  181. package/dist/chunk-D3LUKR2Y.js.map +0 -1
  182. package/dist/chunk-EO35UHFT.cjs.map +0 -1
  183. package/dist/chunk-F7XPMG25.cjs.map +0 -1
  184. package/dist/chunk-SS3D3DHL.cjs.map +0 -1
  185. package/dist/components/chat/stream/chat-dialog-store.d.ts +0 -184
  186. package/dist/components/chat/stream/chat-dialog-store.d.ts.map +0 -1
  187. package/dist/components/chat/stream/chat-stream-reducer.d.ts +0 -367
  188. package/dist/components/chat/stream/chat-stream-reducer.d.ts.map +0 -1
  189. package/dist/components/chat/stream/delta-batcher.d.ts +0 -51
  190. package/dist/components/chat/stream/delta-batcher.d.ts.map +0 -1
  191. package/dist/components/chat/stream/index.d.ts +0 -17
  192. package/dist/components/chat/stream/index.d.ts.map +0 -1
  193. package/dist/components/chat/stream/message-mutations.d.ts +0 -77
  194. package/dist/components/chat/stream/message-mutations.d.ts.map +0 -1
  195. package/dist/components/chat/stream/use-chat-stream-reducer.d.ts +0 -22
  196. package/dist/components/chat/stream/use-chat-stream-reducer.d.ts.map +0 -1
  197. package/dist/components/ui/markdown/base-components.d.ts +0 -51
  198. package/dist/components/ui/markdown/base-components.d.ts.map +0 -1
  199. package/dist/components/ui/markdown/engine.d.ts +0 -99
  200. package/dist/components/ui/markdown/engine.d.ts.map +0 -1
  201. package/dist/components/ui/markdown/heading-ids.d.ts +0 -65
  202. package/dist/components/ui/markdown/heading-ids.d.ts.map +0 -1
  203. package/dist/components/ui/markdown/index.d.ts +0 -18
  204. package/dist/components/ui/markdown/index.d.ts.map +0 -1
  205. package/dist/components/ui/markdown/mermaid-diagram.d.ts +0 -79
  206. package/dist/components/ui/markdown/mermaid-diagram.d.ts.map +0 -1
  207. package/dist/components/ui/markdown/rich/embed-overrides.d.ts +0 -14
  208. package/dist/components/ui/markdown/rich/embed-overrides.d.ts.map +0 -1
  209. package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts +0 -40
  210. package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts.map +0 -1
  211. package/dist/components/ui/markdown/rich/shortcodes.d.ts +0 -8
  212. package/dist/components/ui/markdown/rich/shortcodes.d.ts.map +0 -1
  213. package/dist/components/ui/markdown/sanitize.d.ts +0 -153
  214. package/dist/components/ui/markdown/sanitize.d.ts.map +0 -1
  215. package/dist/components/ui/markdown/simple-markdown-renderer.d.ts +0 -23
  216. package/dist/components/ui/markdown/simple-markdown-renderer.d.ts.map +0 -1
  217. package/dist/components/ui/markdown/streaming.d.ts +0 -78
  218. package/dist/components/ui/markdown/streaming.d.ts.map +0 -1
  219. package/dist/components/ui/markdown/text-size.d.ts +0 -34
  220. package/dist/components/ui/markdown/text-size.d.ts.map +0 -1
  221. package/dist/utils/markdown-fences.d.ts +0 -42
  222. package/dist/utils/markdown-fences.d.ts.map +0 -1
  223. package/dist/utils/markdown-heading-id.d.ts +0 -85
  224. package/dist/utils/markdown-heading-id.d.ts.map +0 -1
  225. package/src/chat-protocol/__tests__/__snapshots__/nats-decoder-golden.test.ts.snap +0 -317
  226. package/src/chat-protocol/__tests__/chat-protocol.test.ts +0 -516
  227. package/src/chat-protocol/__tests__/env-flag.test.ts +0 -52
  228. package/src/chat-protocol/__tests__/ip-normalize.test.ts +0 -136
  229. package/src/chat-protocol/__tests__/nats-decoder-golden.test.ts +0 -232
  230. package/src/chat-protocol/decode.ts +0 -278
  231. package/src/chat-protocol/encode.ts +0 -71
  232. package/src/chat-protocol/env-flag.ts +0 -39
  233. package/src/chat-protocol/events.ts +0 -245
  234. package/src/chat-protocol/frames.ts +0 -245
  235. package/src/chat-protocol/index.ts +0 -21
  236. package/src/chat-protocol/ip-normalize.ts +0 -146
  237. package/src/chat-protocol/nats-decoder.ts +0 -258
  238. package/src/components/chat/__tests__/chat-message-streaming-memo.test.tsx +0 -207
  239. package/src/components/chat/__tests__/chat-pending-turn.test.tsx +0 -250
  240. package/src/components/chat/hooks/__tests__/__snapshots__/conversation-id-persistence-golden.test.ts.snap +0 -37
  241. package/src/components/chat/hooks/__tests__/__snapshots__/sse-stream-golden.test.ts.snap +0 -0
  242. package/src/components/chat/hooks/__tests__/chunk-catchup-dialog-staleness.test.ts +0 -92
  243. package/src/components/chat/hooks/__tests__/conversation-id-persistence-golden.test.ts +0 -438
  244. package/src/components/chat/hooks/__tests__/sse-stream-golden.test.ts +0 -318
  245. package/src/components/chat/stream/__tests__/__snapshots__/chat-stream-reducer-golden.test.ts.snap +0 -940
  246. package/src/components/chat/stream/__tests__/chat-dialog-store.test.ts +0 -806
  247. package/src/components/chat/stream/__tests__/chat-stream-reducer-golden.test.ts +0 -467
  248. package/src/components/chat/stream/__tests__/chat-stream-reducer.test.ts +0 -1248
  249. package/src/components/chat/stream/__tests__/delta-batcher.test.ts +0 -255
  250. package/src/components/chat/stream/__tests__/use-chat-stream-reducer.test.ts +0 -105
  251. package/src/components/chat/stream/chat-dialog-store.ts +0 -536
  252. package/src/components/chat/stream/chat-stream-reducer.ts +0 -1876
  253. package/src/components/chat/stream/delta-batcher.ts +0 -168
  254. package/src/components/chat/stream/index.ts +0 -55
  255. package/src/components/chat/stream/message-mutations.ts +0 -340
  256. package/src/components/chat/stream/use-chat-stream-reducer.ts +0 -126
  257. package/src/components/chat/utils/__tests__/__snapshots__/process-historical-messages-golden.test.ts.snap +0 -420
  258. package/src/components/chat/utils/__tests__/__snapshots__/segment-accumulator-golden.test.ts.snap +0 -605
  259. package/src/components/chat/utils/__tests__/process-historical-messages-golden.test.ts +0 -394
  260. package/src/components/chat/utils/__tests__/segment-accumulator-golden.test.ts +0 -270
  261. package/src/components/ui/__tests__/__snapshots__/markdown-parity.test.tsx.snap +0 -2420
  262. package/src/components/ui/__tests__/markdown-parity.test.tsx +0 -2540
  263. package/src/components/ui/markdown/__tests__/mermaid-security.test.ts +0 -176
  264. package/src/components/ui/markdown/__tests__/mermaid-stale-render.test.tsx +0 -151
  265. package/src/components/ui/markdown/__tests__/sanitize-invariant.test.ts +0 -354
  266. package/src/components/ui/markdown/__tests__/sanitize-render.test.tsx +0 -118
  267. package/src/components/ui/markdown/__tests__/streaming.test.tsx +0 -436
  268. package/src/components/ui/markdown/base-components.tsx +0 -360
  269. package/src/components/ui/markdown/engine.tsx +0 -315
  270. package/src/components/ui/markdown/heading-ids.ts +0 -239
  271. package/src/components/ui/markdown/index.ts +0 -49
  272. package/src/components/ui/markdown/mermaid-diagram.tsx +0 -323
  273. package/src/components/ui/markdown/rich/embed-overrides.tsx +0 -199
  274. package/src/components/ui/markdown/rich/rich-markdown-renderer.tsx +0 -184
  275. package/src/components/ui/markdown/rich/shortcodes.ts +0 -170
  276. package/src/components/ui/markdown/sanitize.ts +0 -3584
  277. package/src/components/ui/markdown/simple-markdown-renderer.tsx +0 -28
  278. package/src/components/ui/markdown/streaming.ts +0 -390
  279. package/src/components/ui/markdown/text-size.ts +0 -106
  280. package/src/utils/markdown-fences.ts +0 -127
  281. package/src/utils/markdown-heading-id.ts +0 -348
  282. /package/dist/{chunk-ZHC2BCXK.js.map → chunk-2OPD6KRB.js.map} +0 -0
  283. /package/dist/{chunk-5QWYIPMH.js.map → chunk-5ZL7PA63.js.map} +0 -0
  284. /package/dist/{chunk-3VGRZ62V.js.map → chunk-6GAJETAP.js.map} +0 -0
  285. /package/dist/{chunk-34C2JV2C.js.map → chunk-G6ARA2HD.js.map} +0 -0
  286. /package/dist/{chunk-WNXIG6YY.js.map → chunk-K5HHLTSG.js.map} +0 -0
  287. /package/dist/{chunk-42NYDEHH.js.map → chunk-KK4M4URN.js.map} +0 -0
  288. /package/dist/{chunk-42SMPKGY.js.map → chunk-MF3VJKHT.js.map} +0 -0
  289. /package/dist/{chunk-BUBQEZ5J.js.map → chunk-VLWVM6ZS.js.map} +0 -0
  290. /package/dist/{chunk-WZCQW4MW.js.map → chunk-XSNKSMB3.js.map} +0 -0
@@ -1,46 +1,49 @@
1
- <!-- source-hash: d1cebe46eff04115f214c16b75a69467 -->
2
- Barrel export file for the chat hooks module, re-exporting all public hooks from their individual files into a single `'use client'` entry point.
1
+ <!-- source-hash: 31ada6e53cd71ce93d35361e48559a56 -->
2
+ Barrel export file (`'use client'`) that re-exports all React hooks from the chat hooks module, providing a single import surface for consumers.
3
3
 
4
4
  ## Key Components
5
5
 
6
- | Export Group | Hooks |
7
- |---|---|
8
- | **Realtime / Streaming** | `useChunkCatchup`, `useJetstreamDialogSubscription`, `useNatsDialogSubscription` |
9
- | **UI Utilities** | `useCollapsible`, `useCloseOnNavigation`, `useChatCardItem` |
10
- | **Chat Core** | `useChat`, `useSSE`, `useChatIdentity`, `useChatAttachments`, `useChatAttachmentImageGallery`, `useSlashCommands` |
11
- | **Transport Adapters** | `useSSEChatAdapter`, `useNatsChatAdapter` |
12
- | **Unified Surface** | `useUnifiedChat` (primary), `useEmbeddedChat` (legacy SSE alias) |
13
- | **Image Proxy** | `useProxiedImageUrl` |
6
+ ### Streaming & Real-time Hooks
7
+ - **`useChunkCatchup`** — Replays missed chunks after reconnection
8
+ - **`useScriptedStream`** Drives scripted/mock streaming sequences
9
+ - **`useRealtimeChunkProcessor`** Processes incoming real-time message chunks
10
+ - **`useJetstreamDialogSubscription`** / **`useNatsDialogSubscription`** NATS/JetStream transport subscriptions
11
+ - **`useCollapsible`** Collapsible UI state management
12
+
13
+ ### Chat Core Hooks
14
+ - **`useChat`** / **`useSSE`** — Core chat and Server-Sent Events hooks (ported from hub, without `MockChatService`/`useChatConfig`)
15
+ - **`useSlashCommands`** — Slash command parsing and dispatch
16
+ - **`useEmptyStateConfig`** — Empty state configuration
17
+ - **`useChatAttachments`** / **`useChatAttachmentImageGallery`** — File attachment handling and image gallery
18
+ - **`useChatIdentity`** — Chat user/agent identity resolution
19
+ - **`useChatCardItem`** — Chat card rendering state
20
+ - **`useCloseOnNavigation`** — Dismisses dialogs/panels on route change
21
+
22
+ ### Unified Chat Surface
23
+ - **`useUnifiedChat`** — Primary public hook; selects transport by `activeMode`
24
+ - **`useSSEChatAdapter`** / **`useNatsChatAdapter`** — Transport adapters (SSE and NATS)
25
+ - **`useEmbeddedChat`** — Legacy SSE alias for embedded surfaces
26
+
27
+ ### Utilities
28
+ - **`useProxiedImageUrl`** — Resolves proxied image URLs from `ChatRuntime.endpoints`
14
29
 
15
30
  ## Usage Example
16
31
 
17
32
  ```typescript
18
- // Typical consumer — import directly from the module index
33
+ // Preferred: import everything from the barrel
19
34
  import {
20
35
  useUnifiedChat,
21
36
  useChatAttachments,
22
- useSlashCommands,
23
- } from '@flamingo/chat-hooks'
37
+ useProxiedImageUrl,
38
+ } from '@openframe/chat-hooks'
24
39
 
25
40
  function ChatPanel({ modes, activeMode }) {
26
- const chat = useUnifiedChat({ modes, activeMode })
27
- const attachments = useChatAttachments()
28
- const slashCommands = useSlashCommands()
41
+ const { messages, send } = useUnifiedChat({ modes, activeMode })
42
+ const { attachments, addAttachment } = useChatAttachments()
43
+ const proxied = useProxiedImageUrl(rawImageUrl)
29
44
 
30
- // ...
31
- }
32
-
33
- // Advanced: direct transport access
34
- import { useNatsChatAdapter } from '@flamingo/chat-hooks'
35
-
36
- function CustomTransportPanel() {
37
- const nats = useNatsChatAdapter({ /* config */ })
38
- // ...
45
+ return <ChatUI messages={messages} onSend={send} />
39
46
  }
40
47
  ```
41
48
 
42
- ## Notes
43
-
44
- - Marked `'use client'` — safe for React Server Component trees; hooks run only on the client.
45
- - `useUnifiedChat` is the recommended entry point for new consumers; `useEmbeddedChat` is the legacy SSE alias kept for backward compatibility.
46
- - `useProxiedImageUrl` reads proxy config from `ChatRuntime.endpoints`, keeping image-proxy resolution consistent between hub and embedder environments.
49
+ > **Note:** For standard usage, prefer `useUnifiedChat`. The adapter hooks (`useSSEChatAdapter`, `useNatsChatAdapter`) are exposed for advanced cases requiring direct transport access.
@@ -1,52 +1,71 @@
1
- <!-- source-hash: 6c5780e92306ea381bac35aaf97c435f -->
2
- Provides the NATS/Mingo-mode transport adapter for the unified chat surface, implementing the `UnifiedChatState` contract so the `useChat({ mode })` dispatcher can switch between NATS and SSE adapters without shell-side branching.
1
+ <!-- source-hash: 3fbde71f6e5fc7f9b4576423ebdb08e2 -->
2
+ Thin wrapper that wires together NATS subscriptions, real-time chunk processing, and dialog management into a single `UnifiedChatState` object for the Mingo/NATS transport mode of the unified chat surface.
3
3
 
4
4
  ## Key Components
5
5
 
6
6
  ### `UseNatsChatAdapterConfig`
7
- Consumer-supplied configuration interface covering:
8
- - `dialogId` active conversation identifier
9
- - `getNatsWsUrl` factory returning the NATS WebSocket URL
10
- - `publishUserMessage` — consumer-owned send callback (HTTP POST or NATS publish)
11
- - `fetchChunks` — optional historical chunk fetcher for catchup
12
- - `clientConfig` — optional NATS auth credentials
13
- - `enableThinking` / `batchApprovalsEnabled` — processor feature flags
7
+ Primary configuration interface with two operational modes:
8
+ - **Bare-transport mode** — caller supplies `dialogId` explicitly and owns dialog lifecycle (original v0 API, used by Tauri Fae Chat)
9
+ - **Managed-dialog mode** — caller supplies `fetchDialogs` and related callbacks; the adapter owns dialog state, pagination, and history
14
10
 
15
- ### `UseNatsChatAdapterOptions`
16
- - `active` — gates the live subscription; keeps message state alive while the mode is hidden
11
+ ### Core Config Fields
17
12
 
18
- ### `useNatsChatAdapter(config, options)`
19
- Main hook. Composes three internal hooks:
13
+ | Field | Required | Description |
14
+ |-------|----------|-------------|
15
+ | `getNatsWsUrl` | ✅ | Returns the NATS WebSocket URL or `null` to suspend |
16
+ | `publishUserMessage` | ✅ | Consumer-owned send callback (HTTP POST or NATS publish) |
17
+ | `dialogId` | ❌ | Explicit dialog ID (bare-transport mode) |
18
+ | `fetchDialogs` | ❌ | Enables managed-dialog mode with sidebar support |
19
+ | `fetchDialogMessages` | ❌ | Populates history on dialog switch |
20
+ | `topics` | ❌ | NATS subject suffixes to tail (default: `['message']`) |
21
+
22
+ ### Supporting Interfaces
23
+
24
+ - **`FetchDialogsParams`** / **`FetchDialogsResult`** — paginated dialog list with cursor-based pagination
25
+ - **`FetchDialogMessagesParams`** / **`FetchDialogMessagesResult`** — paginated message history with optional `tokenUsage`
26
+
27
+ ### Composition Stack
20
28
 
21
29
  ```text
22
- useNatsDialogSubscription → live NATS event tail
23
-
24
- decodeNatsChunk + reducer chunk → ChatStreamEvent → state
25
-
26
- useChunkCatchup → back-fills missed chunks on reconnect/activation
30
+ useNatsDialogSubscription → live NATS event tail
31
+
32
+ useRealtimeChunkProcessor chunk → MessageSegment[]
33
+
34
+ useChunkCatchup → back-fills missed chunks on reconnect
35
+
36
+ config.publishUserMessage → consumer-owned send (HTTP/NATS)
27
37
  ```
28
38
 
29
- Returns a full `UnifiedChatState` object including `messages`, `isLoading`, `streamingPhase`, `sendMessage`, `stopMessage`, and `clearMessages`.
30
-
31
39
  ## Usage Example
32
40
 
33
41
  ```typescript
34
- const chatState = useNatsChatAdapter(
35
- {
36
- dialogId: 'dialog-abc123',
37
- getNatsWsUrl: () => `wss://nats.example.com`,
38
- publishUserMessage: async (text, { dialogId }) => {
39
- await fetch('/api/chat', {
40
- method: 'POST',
41
- body: JSON.stringify({ text, dialogId }),
42
- })
43
- },
44
- fetchChunks: ({ dialogId, after }) =>
45
- fetch(`/api/chunks?dialogId=${dialogId}&after=${after}`).then(r => r.json()),
46
- batchApprovalsEnabled: true,
42
+ // Bare-transport mode (v0 — Tauri Fae Chat)
43
+ const chatState = useNatsChatAdapter({
44
+ dialogId: activeDialogId,
45
+ getNatsWsUrl: () => `wss://nats.example.com`,
46
+ publishUserMessage: async (text, { dialogId }) => {
47
+ await fetch(`/api/chat/${dialogId}/message`, {
48
+ method: 'POST',
49
+ body: JSON.stringify({ text }),
50
+ })
47
51
  },
48
- { active: isNatsModeVisible },
49
- )
52
+ topics: ['admin-message'],
53
+ })
54
+
55
+ // Managed-dialog mode (openframe-frontend / EmbeddableChat)
56
+ const chatState = useNatsChatAdapter({
57
+ getNatsWsUrl: () => natsUrl,
58
+ publishUserMessage: sendMessage,
59
+ fetchDialogs: async ({ cursor, limit }) => api.listDialogs({ cursor, limit }),
60
+ fetchDialogMessages: async ({ dialogId, cursor }) =>
61
+ api.getMessages(dialogId, { cursor }),
62
+ createDialog: () => api.createDialog(),
63
+ deleteDialog: (id) => api.deleteDialog(id),
64
+ approveRequest: (requestId) => api.approve(requestId),
65
+ rejectRequest: (requestId, reason) => api.reject(requestId, reason),
66
+ })
50
67
  ```
51
68
 
52
- > **Note:** `publishUserMessage` is intentionally consumer-owned the adapter only handles optimistic UI updates and phase transitions; the actual transport is wired externally.
69
+ > **Note:** Set `topics: ['admin-message']` for Mingo/admin deployments. The default `'message'` topic is for Fae client-chat. Mismatched topics cause the assistant to hang in the `thinking` phase indefinitely.
70
+
71
+ **Source:** [`use-nats-chat-adapter.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-nats-chat-adapter.ts)
@@ -0,0 +1,77 @@
1
+ <!-- source-hash: 681c783784fdc89f0c86eb3e539c482b -->
2
+ Processes real-time NATS streaming chunks into structured message segments, managing streaming state, approval flows, direct-mode barriers, and tool execution events for AI assistant chat interfaces.
3
+
4
+ ## Key Components
5
+
6
+ ### `useRealtimeChunkProcessor(options)`
7
+
8
+ Main hook export. Accepts `UseRealtimeChunkProcessorOptions` and returns `UseRealtimeChunkProcessorReturn`.
9
+
10
+ **Options:**
11
+
12
+ | Option | Type | Default | Description |
13
+ |---|---|---|---|
14
+ | `callbacks` | `object` | required | Event handlers (`onSegmentsUpdate`, `onStreamStart`, `onStreamEnd`, `onApprove`, `onReject`, etc.) |
15
+ | `displayApprovalTypes` | `string[]` | `['CLIENT']` | Approval types rendered inline; others are escalated |
16
+ | `approvalStatuses` | `object` | `{}` | Current status map keyed by `requestId` |
17
+ | `initialState` | `object` | — | Hydrates accumulator for resumed dialogs |
18
+ | `batchApprovalsEnabled` | `boolean` | `true` | Renders batch approvals as a single card; `false` unfolds into individual cards |
19
+ | `isDirectMode` | `boolean` | `false` | Activates the direct-mode barrier, dropping AI assistant chunks |
20
+
21
+ ### Internal Refs
22
+
23
+ | Ref | Purpose |
24
+ |---|---|
25
+ | `accumulatorRef` | `MessageSegmentAccumulator` instance managing segment state |
26
+ | `isInStreamRef` | Tracks open/closed stream window (`MESSAGE_START` → `MESSAGE_END`) |
27
+ | `hasEverStreamedRef` | Distinguishes cold-start vs. post-stream continuation for append mode |
28
+ | `directModeFlagRef` / `sawDirectMessageRef` | Direct-mode barrier gate |
29
+ | `directTeardownFiredRef` | One-shot guard: ensures teardown fires exactly once on barrier entry |
30
+ | `pendingEscalatedRef` | Map of escalated approval requests not shown inline |
31
+
32
+ ### Supported Chunk Actions
33
+
34
+ | Action | Behavior |
35
+ |---|---|
36
+ | `message_start` / `message_end` | Opens/closes stream, resets accumulator |
37
+ | `text` / `thinking` | Appends to accumulator; uses append-mode after `MESSAGE_END` |
38
+ | `tool_execution` | Routes in-stream to accumulator; post-stream to `onToolExecuted` callback |
39
+ | `approval_request` | Inline or escalated based on `displayApprovalTypes` |
40
+ | `approval_batch` | Single batch card, legacy card fan-out, or escalated |
41
+ | `metadata` | Forwarded directly to `onMetadata` |
42
+ | `direct_message` | Activates direct-mode barrier |
43
+
44
+ ## Usage Example
45
+
46
+ ```typescript
47
+ const { processChunk } = useRealtimeChunkProcessor({
48
+ callbacks: {
49
+ onSegmentsUpdate: (segments, meta) => setSegments(segments),
50
+ onStreamStart: () => setIsStreaming(true),
51
+ onStreamEnd: () => setIsStreaming(false),
52
+ onApprove: (requestId) => approveAction(requestId),
53
+ onReject: (requestId) => rejectAction(requestId),
54
+ onEscalatedApproval: (requestId, data) => notifyAdmin(requestId, data),
55
+ onToolExecuted: (segment) => updateToolCard(segment),
56
+ onAgentBusy: () => showTypingIndicator(),
57
+ onMetadata: (meta) => handleMetadata(meta),
58
+ },
59
+ displayApprovalTypes: ['CLIENT'],
60
+ batchApprovalsEnabled: true,
61
+ isDirectMode: false,
62
+ approvalStatuses: { 'req-123': 'approved' },
63
+ })
64
+
65
+ // Wire to your NATS subscription
66
+ natsSubscription.onMessage((rawChunk) => {
67
+ processChunk(rawChunk)
68
+ })
69
+ ```
70
+
71
+ ## Direct-Mode Barrier
72
+
73
+ When `isDirectMode` is `true` or a `direct_message` chunk arrives, the hook drops all subsequent AI-assistant chunks (everything not in `DIRECT_MODE_ALLOWED`). Teardown fires exactly once — clearing the typing indicator, composer lock, and in-progress bubble — even if no stream is currently open (e.g., during post-approval tool execution).
74
+
75
+ ## Source
76
+
77
+ [`use-realtime-chunk-processor.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-realtime-chunk-processor.ts)
@@ -5,6 +5,7 @@ export * from './use-collapsible'
5
5
  export * from './use-scripted-stream'
6
6
  export * from './use-jetstream-dialog-subscription'
7
7
  export * from './use-nats-dialog-subscription'
8
+ export * from './use-realtime-chunk-processor'
8
9
 
9
10
  // Chat hooks migrated from hub `hooks/*` (Task #7).
10
11
  export * from './use-slash-commands'
@@ -1,13 +1,5 @@
1
1
  'use client'
2
2
 
3
- /**
4
- * @deprecated Phase 3 of the chat unification moved the SSE adapter off this
5
- * hook — its trailing-assistant merge + `decision_resolved` receipt path now
6
- * live in `../stream/chat-stream-reducer` (transport: 'sse'). No lib-internal
7
- * code consumes `useChat`/`useSSE` anymore; they remain exported for external
8
- * consumers until Phase 4 migrates them, then get deleted (Phase 6).
9
- */
10
-
11
3
  import { useState, useCallback, useEffect, useRef } from 'react'
12
4
  import { useSSE, type StreamFn, type StreamFnExtraOptions } from './use-sse'
13
5
  import type {
@@ -217,33 +217,8 @@ export function useChunkCatchup({
217
217
  })
218
218
 
219
219
  const allChunkResults = await Promise.all(chunkPromises)
220
-
221
- // STALENESS GATE — the FIRST thing after the await, because everything
222
- // below this line is bound to the CURRENTLY active dialog, not to the one
223
- // this fetch was issued for:
224
- // - `onChunkReceivedRef.current` is reassigned every render, so it
225
- // routes into whichever dialog's reducer is mounted now;
226
- // - `processedSequenceKeys` / `lastSequenceId` / `lastSequenceIdByType`
227
- // were re-armed by `resetChunkTracking` for the new dialog;
228
- // - `chunkBuffer` holds the NEW dialog's buffered live deliveries;
229
- // - `hasCompletedInitialCatchup` / `bufferUntilInitialCatchupComplete`
230
- // govern the NEW dialog's buffering window.
231
- // So a fetch that resolved after a dialog switch used to write dialog A's
232
- // transcript into dialog B AND advance B's seq cursor to A's JetStream
233
- // sequence — and because the reducer drops any event at or below
234
- // `lastAppliedSeq`, an unrelated (higher) position permanently discards
235
- // B's own live chunks. Switching dialogs mid-fetch is the ordinary
236
- // interaction, not an edge case.
237
- //
238
- // The `finally` below already handles stale bookkeeping correctly (it
239
- // keeps the new dialog's cycle intact and only discards a pending entry
240
- // belonging to THIS dialog); it still runs on this early return. The
241
- // guard could not live there — by then the chunks had already been
242
- // applied.
243
- if (dialogId !== dialogIdRef.current) return
244
-
245
220
  const allCatchupChunks: BufferedChunk[] = allChunkResults.flat()
246
-
221
+
247
222
  if (allCatchupChunks.length === 0) {
248
223
  flushBufferedRealtimeChunks()
249
224
  bufferUntilInitialCatchupComplete.current = false