@flamingo-stack/openframe-frontend-core 0.0.467 → 0.0.468-snapshot.20260723140929

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 (289) hide show
  1. package/dist/chat-protocol/decode.d.ts +58 -0
  2. package/dist/chat-protocol/decode.d.ts.map +1 -0
  3. package/dist/chat-protocol/encode.d.ts +44 -0
  4. package/dist/chat-protocol/encode.d.ts.map +1 -0
  5. package/dist/chat-protocol/env-flag.d.ts +35 -0
  6. package/dist/chat-protocol/env-flag.d.ts.map +1 -0
  7. package/dist/chat-protocol/events.d.ts +192 -0
  8. package/dist/chat-protocol/events.d.ts.map +1 -0
  9. package/dist/chat-protocol/frames.d.ts +206 -0
  10. package/dist/chat-protocol/frames.d.ts.map +1 -0
  11. package/dist/chat-protocol/index.cjs +493 -0
  12. package/dist/chat-protocol/index.cjs.map +1 -0
  13. package/dist/chat-protocol/index.d.ts +18 -0
  14. package/dist/chat-protocol/index.d.ts.map +1 -0
  15. package/dist/chat-protocol/index.js +477 -0
  16. package/dist/chat-protocol/index.js.map +1 -0
  17. package/dist/chat-protocol/ip-normalize.d.ts +44 -0
  18. package/dist/chat-protocol/ip-normalize.d.ts.map +1 -0
  19. package/dist/chat-protocol/nats-decoder.d.ts +26 -0
  20. package/dist/chat-protocol/nats-decoder.d.ts.map +1 -0
  21. package/dist/{chunk-BIDOIPIT.js → chunk-2BJSRTKU.js} +2 -2
  22. package/dist/{chunk-4DFPQKKJ.js → chunk-33FDAZDB.js} +2 -2
  23. package/dist/{chunk-LOWJWKM5.js → chunk-4QDFNDVW.js} +4 -4
  24. package/dist/{chunk-72NEN4G4.cjs → chunk-4UFRQT7Z.cjs} +15 -15
  25. package/dist/{chunk-72NEN4G4.cjs.map → chunk-4UFRQT7Z.cjs.map} +1 -1
  26. package/dist/{chunk-WWC75D3J.cjs → chunk-4W54HUP7.cjs} +6853 -4609
  27. package/dist/chunk-4W54HUP7.cjs.map +1 -0
  28. package/dist/{chunk-6DZ5QOUM.cjs → chunk-5HUTT3FD.cjs} +11 -11
  29. package/dist/{chunk-6DZ5QOUM.cjs.map → chunk-5HUTT3FD.cjs.map} +1 -1
  30. package/dist/{chunk-GXXLJHQX.js → chunk-7I2QMUEZ.js} +2 -2
  31. package/dist/{chunk-QJ7NIL6A.js → chunk-AJSNF5YF.js} +6 -5
  32. package/dist/chunk-AJSNF5YF.js.map +1 -0
  33. package/dist/{chunk-NYOQNYSI.js → chunk-AW3LVWVV.js} +2 -2
  34. package/dist/{chunk-25YYEVSE.js → chunk-DG7TX763.js} +2 -2
  35. package/dist/{chunk-CZFPPNYV.js → chunk-E6O6XATC.js} +11899 -9655
  36. package/dist/chunk-E6O6XATC.js.map +1 -0
  37. package/dist/{chunk-ZYPHZ3R3.cjs → chunk-GLKULDQN.cjs} +9 -9
  38. package/dist/{chunk-ZYPHZ3R3.cjs.map → chunk-GLKULDQN.cjs.map} +1 -1
  39. package/dist/{chunk-TZSPLSDU.js → chunk-GYEZV4GK.js} +2 -2
  40. package/dist/{chunk-G5D7NRH5.cjs → chunk-LRESZO4L.cjs} +26 -26
  41. package/dist/{chunk-G5D7NRH5.cjs.map → chunk-LRESZO4L.cjs.map} +1 -1
  42. package/dist/{chunk-ABU37QSG.js → chunk-MMF6HJB7.js} +4 -4
  43. package/dist/{chunk-O7LQYYUA.cjs → chunk-MTLBBSLP.cjs} +5 -5
  44. package/dist/{chunk-O7LQYYUA.cjs.map → chunk-MTLBBSLP.cjs.map} +1 -1
  45. package/dist/{chunk-UWW4PQQS.cjs → chunk-OVIUQJ2H.cjs} +28 -27
  46. package/dist/chunk-OVIUQJ2H.cjs.map +1 -0
  47. package/dist/{chunk-3L44PPMF.js → chunk-RPAOSHBN.js} +2 -2
  48. package/dist/{chunk-VERK32MO.cjs → chunk-TOFOK7G5.cjs} +37 -37
  49. package/dist/{chunk-VERK32MO.cjs.map → chunk-TOFOK7G5.cjs.map} +1 -1
  50. package/dist/{chunk-QITN43HN.cjs → chunk-U2KPMWO6.cjs} +7 -7
  51. package/dist/{chunk-QITN43HN.cjs.map → chunk-U2KPMWO6.cjs.map} +1 -1
  52. package/dist/{chunk-YGW7T57C.cjs → chunk-V5YWOQBP.cjs} +31 -31
  53. package/dist/{chunk-YGW7T57C.cjs.map → chunk-V5YWOQBP.cjs.map} +1 -1
  54. package/dist/{chunk-ILZ66CS6.js → chunk-VUCYS36H.js} +10 -10
  55. package/dist/chunk-VUCYS36H.js.map +1 -0
  56. package/dist/{chunk-SGDXS7VT.cjs → chunk-WHWDGCQV.cjs} +60 -60
  57. package/dist/chunk-WHWDGCQV.cjs.map +1 -0
  58. package/dist/{chunk-G2H4AKL3.cjs → chunk-YXNWEVER.cjs} +62 -62
  59. package/dist/{chunk-G2H4AKL3.cjs.map → chunk-YXNWEVER.cjs.map} +1 -1
  60. package/dist/components/case-studies/index.cjs +8 -8
  61. package/dist/components/case-studies/index.js +2 -2
  62. package/dist/components/chat/chat-composer.d.ts +8 -1
  63. package/dist/components/chat/chat-composer.d.ts.map +1 -1
  64. package/dist/components/chat/chat-context-memory-bar.d.ts +37 -0
  65. package/dist/components/chat/chat-context-memory-bar.d.ts.map +1 -0
  66. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  67. package/dist/components/chat/chat-message-list.d.ts.map +1 -1
  68. package/dist/components/chat/embeddable-chat.d.ts +14 -6
  69. package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
  70. package/dist/components/chat/hooks/index.d.ts +0 -1
  71. package/dist/components/chat/hooks/index.d.ts.map +1 -1
  72. package/dist/components/chat/hooks/use-chat.d.ts.map +1 -1
  73. package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts +15 -48
  74. package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts.map +1 -1
  75. package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts +3 -47
  76. package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts.map +1 -1
  77. package/dist/components/chat/index.cjs +12 -2
  78. package/dist/components/chat/index.cjs.map +1 -1
  79. package/dist/components/chat/index.d.ts +2 -0
  80. package/dist/components/chat/index.d.ts.map +1 -1
  81. package/dist/components/chat/index.js +23 -13
  82. package/dist/components/chat/stream/chat-dialog-store.d.ts +184 -0
  83. package/dist/components/chat/stream/chat-dialog-store.d.ts.map +1 -0
  84. package/dist/components/chat/stream/chat-stream-reducer.d.ts +367 -0
  85. package/dist/components/chat/stream/chat-stream-reducer.d.ts.map +1 -0
  86. package/dist/components/chat/stream/delta-batcher.d.ts +51 -0
  87. package/dist/components/chat/stream/delta-batcher.d.ts.map +1 -0
  88. package/dist/components/chat/stream/index.d.ts +17 -0
  89. package/dist/components/chat/stream/index.d.ts.map +1 -0
  90. package/dist/components/chat/stream/message-mutations.d.ts +77 -0
  91. package/dist/components/chat/stream/message-mutations.d.ts.map +1 -0
  92. package/dist/components/chat/stream/use-chat-stream-reducer.d.ts +22 -0
  93. package/dist/components/chat/stream/use-chat-stream-reducer.d.ts.map +1 -0
  94. package/dist/components/chat/types/api.types.d.ts +1 -81
  95. package/dist/components/chat/types/api.types.d.ts.map +1 -1
  96. package/dist/components/chat/types/processing.types.d.ts +2 -90
  97. package/dist/components/chat/types/processing.types.d.ts.map +1 -1
  98. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts +34 -6
  99. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
  100. package/dist/components/chat/utils/index.d.ts +2 -3
  101. package/dist/components/chat/utils/index.d.ts.map +1 -1
  102. package/dist/components/chat/utils/process-historical-messages.d.ts +59 -11
  103. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  104. package/dist/components/contact/index.cjs +3 -3
  105. package/dist/components/contact/index.js +2 -2
  106. package/dist/components/docs/index.cjs +5 -5
  107. package/dist/components/docs/index.js +4 -4
  108. package/dist/components/embeds/index.cjs +3 -3
  109. package/dist/components/embeds/index.js +2 -2
  110. package/dist/components/faq/index.cjs +3 -3
  111. package/dist/components/faq/index.js +2 -2
  112. package/dist/components/features/index.cjs +2 -2
  113. package/dist/components/features/index.js +1 -1
  114. package/dist/components/help-center-pages/index.cjs +20 -20
  115. package/dist/components/help-center-pages/index.js +11 -11
  116. package/dist/components/index.cjs +174 -130
  117. package/dist/components/index.cjs.map +1 -1
  118. package/dist/components/index.js +65 -21
  119. package/dist/components/index.js.map +1 -1
  120. package/dist/components/navigation/index.cjs +2 -2
  121. package/dist/components/navigation/index.js +1 -1
  122. package/dist/components/onboarding-guides/index.cjs +5 -5
  123. package/dist/components/onboarding-guides/index.js +4 -4
  124. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
  125. package/dist/components/related-content/index.cjs +3 -3
  126. package/dist/components/related-content/index.js +2 -2
  127. package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
  128. package/dist/components/tickets/index.cjs +5 -5
  129. package/dist/components/tickets/index.js +4 -4
  130. package/dist/components/ui/index.cjs +46 -2
  131. package/dist/components/ui/index.cjs.map +1 -1
  132. package/dist/components/ui/index.d.ts +1 -2
  133. package/dist/components/ui/index.d.ts.map +1 -1
  134. package/dist/components/ui/index.js +57 -13
  135. package/dist/components/ui/markdown/base-components.d.ts +56 -0
  136. package/dist/components/ui/markdown/base-components.d.ts.map +1 -0
  137. package/dist/components/ui/markdown/engine.d.ts +99 -0
  138. package/dist/components/ui/markdown/engine.d.ts.map +1 -0
  139. package/dist/components/ui/markdown/heading-ids.d.ts +65 -0
  140. package/dist/components/ui/markdown/heading-ids.d.ts.map +1 -0
  141. package/dist/components/ui/markdown/index.d.ts +18 -0
  142. package/dist/components/ui/markdown/index.d.ts.map +1 -0
  143. package/dist/components/ui/markdown/mermaid-diagram.d.ts +79 -0
  144. package/dist/components/ui/markdown/mermaid-diagram.d.ts.map +1 -0
  145. package/dist/components/ui/markdown/rich/embed-overrides.d.ts +14 -0
  146. package/dist/components/ui/markdown/rich/embed-overrides.d.ts.map +1 -0
  147. package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts +40 -0
  148. package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts.map +1 -0
  149. package/dist/components/ui/markdown/rich/shortcodes.d.ts +8 -0
  150. package/dist/components/ui/markdown/rich/shortcodes.d.ts.map +1 -0
  151. package/dist/components/ui/markdown/sanitize.d.ts +153 -0
  152. package/dist/components/ui/markdown/sanitize.d.ts.map +1 -0
  153. package/dist/components/ui/markdown/simple-markdown-renderer.d.ts +23 -0
  154. package/dist/components/ui/markdown/simple-markdown-renderer.d.ts.map +1 -0
  155. package/dist/components/ui/markdown/streaming.d.ts +78 -0
  156. package/dist/components/ui/markdown/streaming.d.ts.map +1 -0
  157. package/dist/components/ui/markdown/text-size.d.ts +34 -0
  158. package/dist/components/ui/markdown/text-size.d.ts.map +1 -0
  159. package/dist/index.cjs +62 -2
  160. package/dist/index.cjs.map +1 -1
  161. package/dist/index.js +73 -13
  162. package/dist/utils/index.cjs +169 -40
  163. package/dist/utils/index.cjs.map +1 -1
  164. package/dist/utils/index.d.ts +1 -0
  165. package/dist/utils/index.d.ts.map +1 -1
  166. package/dist/utils/index.js +162 -41
  167. package/dist/utils/index.js.map +1 -1
  168. package/dist/utils/markdown-fences.d.ts +42 -0
  169. package/dist/utils/markdown-fences.d.ts.map +1 -0
  170. package/dist/utils/markdown-heading-id.d.ts +85 -0
  171. package/dist/utils/markdown-heading-id.d.ts.map +1 -0
  172. package/dist/utils/markdown-section-extractor.d.ts.map +1 -1
  173. package/package.json +7 -1
  174. package/src/chat-protocol/__tests__/__snapshots__/nats-decoder-golden.test.ts.snap +307 -0
  175. package/src/chat-protocol/__tests__/chat-protocol.test.ts +515 -0
  176. package/src/chat-protocol/__tests__/env-flag.test.ts +52 -0
  177. package/src/chat-protocol/__tests__/ip-normalize.test.ts +136 -0
  178. package/src/chat-protocol/__tests__/nats-decoder-golden.test.ts +228 -0
  179. package/src/chat-protocol/decode.ts +277 -0
  180. package/src/chat-protocol/encode.ts +71 -0
  181. package/src/chat-protocol/env-flag.ts +39 -0
  182. package/src/chat-protocol/events.ts +228 -0
  183. package/src/chat-protocol/frames.ts +238 -0
  184. package/src/chat-protocol/index.ts +21 -0
  185. package/src/chat-protocol/ip-normalize.ts +146 -0
  186. package/src/chat-protocol/nats-decoder.ts +252 -0
  187. package/src/components/chat/__tests__/chat-message-list.test.tsx +293 -5
  188. package/src/components/chat/__tests__/chat-message-streaming-memo.test.tsx +207 -0
  189. package/src/components/chat/__tests__/chat-pending-turn.test.tsx +209 -0
  190. package/src/components/chat/chat-composer.tsx +32 -5
  191. package/src/components/chat/chat-context-memory-bar.tsx +159 -0
  192. package/src/components/chat/chat-message-enhanced.tsx +111 -17
  193. package/src/components/chat/chat-message-list.tsx +358 -109
  194. package/src/components/chat/embeddable-chat.tsx +23 -15
  195. package/src/components/chat/hooks/.index.md +1 -1
  196. package/src/components/chat/hooks/.use-nats-chat-adapter.md +1 -1
  197. package/src/components/chat/hooks/__tests__/__snapshots__/persisted-state-v1-golden.test.ts.snap +297 -0
  198. package/src/components/chat/hooks/__tests__/__snapshots__/sse-stream-golden.test.ts.snap +0 -0
  199. package/src/components/chat/hooks/__tests__/persisted-state-v1-golden.test.ts +272 -0
  200. package/src/components/chat/hooks/__tests__/sse-stream-golden.test.ts +318 -0
  201. package/src/components/chat/hooks/index.ts +0 -1
  202. package/src/components/chat/hooks/use-chat.ts +8 -0
  203. package/src/components/chat/hooks/use-nats-chat-adapter.ts +243 -822
  204. package/src/components/chat/hooks/use-sse-chat-adapter.ts +318 -666
  205. package/src/components/chat/index.ts +6 -0
  206. package/src/components/chat/stream/__tests__/__snapshots__/chat-stream-reducer-golden.test.ts.snap +937 -0
  207. package/src/components/chat/stream/__tests__/chat-dialog-store.test.ts +756 -0
  208. package/src/components/chat/stream/__tests__/chat-stream-reducer-golden.test.ts +460 -0
  209. package/src/components/chat/stream/__tests__/chat-stream-reducer.test.ts +894 -0
  210. package/src/components/chat/stream/__tests__/delta-batcher.test.ts +255 -0
  211. package/src/components/chat/stream/__tests__/use-chat-stream-reducer.test.ts +98 -0
  212. package/src/components/chat/stream/chat-dialog-store.ts +536 -0
  213. package/src/components/chat/stream/chat-stream-reducer.ts +1796 -0
  214. package/src/components/chat/stream/delta-batcher.ts +159 -0
  215. package/src/components/chat/stream/index.ts +55 -0
  216. package/src/components/chat/stream/message-mutations.ts +338 -0
  217. package/src/components/chat/stream/use-chat-stream-reducer.ts +126 -0
  218. package/src/components/chat/thinking-display.tsx +1 -1
  219. package/src/components/chat/types/.api.types.md +1 -3
  220. package/src/components/chat/types/.processing.types.md +6 -23
  221. package/src/components/chat/types/api.types.ts +6 -73
  222. package/src/components/chat/types/processing.types.ts +11 -52
  223. package/src/components/chat/utils/.index.md +0 -5
  224. package/src/components/chat/utils/__tests__/__snapshots__/process-historical-messages-golden.test.ts.snap +418 -0
  225. package/src/components/chat/utils/__tests__/__snapshots__/segment-accumulator-golden.test.ts.snap +599 -0
  226. package/src/components/chat/utils/__tests__/process-historical-messages-golden.test.ts +317 -0
  227. package/src/components/chat/utils/__tests__/segment-accumulator-golden.test.ts +270 -0
  228. package/src/components/chat/utils/extract-incomplete-message-state.ts +63 -5
  229. package/src/components/chat/utils/index.ts +5 -8
  230. package/src/components/chat/utils/process-historical-messages.ts +352 -383
  231. package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +22 -4
  232. package/src/components/shared/legal-document/legal-document-page.tsx +1 -1
  233. package/src/components/shared/product-release/release-detail-page.tsx +19 -4
  234. package/src/components/ui/__tests__/__snapshots__/markdown-parity.test.tsx.snap +2420 -0
  235. package/src/components/ui/__tests__/markdown-parity.test.tsx +2528 -0
  236. package/src/components/ui/index.ts +1 -2
  237. package/src/components/ui/markdown/__tests__/mermaid-security.test.ts +115 -0
  238. package/src/components/ui/markdown/__tests__/mermaid-stale-render.test.tsx +95 -0
  239. package/src/components/ui/markdown/__tests__/sanitize-invariant.test.ts +309 -0
  240. package/src/components/ui/markdown/__tests__/streaming.test.tsx +388 -0
  241. package/src/components/ui/markdown/base-components.tsx +341 -0
  242. package/src/components/ui/markdown/engine.tsx +315 -0
  243. package/src/components/ui/markdown/heading-ids.ts +239 -0
  244. package/src/components/ui/markdown/index.ts +49 -0
  245. package/src/components/ui/markdown/mermaid-diagram.tsx +291 -0
  246. package/src/components/ui/markdown/rich/embed-overrides.tsx +199 -0
  247. package/src/components/ui/markdown/rich/rich-markdown-renderer.tsx +184 -0
  248. package/src/components/ui/markdown/rich/shortcodes.ts +170 -0
  249. package/src/components/ui/markdown/sanitize.ts +3499 -0
  250. package/src/components/ui/markdown/simple-markdown-renderer.tsx +28 -0
  251. package/src/components/ui/markdown/streaming.ts +362 -0
  252. package/src/components/ui/markdown/text-size.ts +106 -0
  253. package/src/components/ui/release-changelog-section.tsx +1 -1
  254. package/src/components/ui/tab-selector.tsx +8 -8
  255. package/src/components/ui/ticket-info-section.tsx +1 -1
  256. package/src/utils/index.ts +1 -0
  257. package/src/utils/markdown-fences.ts +127 -0
  258. package/src/utils/markdown-heading-id.ts +348 -0
  259. package/src/utils/markdown-section-extractor.ts +41 -56
  260. package/dist/chunk-CZFPPNYV.js.map +0 -1
  261. package/dist/chunk-ILZ66CS6.js.map +0 -1
  262. package/dist/chunk-QJ7NIL6A.js.map +0 -1
  263. package/dist/chunk-SGDXS7VT.cjs.map +0 -1
  264. package/dist/chunk-UWW4PQQS.cjs.map +0 -1
  265. package/dist/chunk-WWC75D3J.cjs.map +0 -1
  266. package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts +0 -6
  267. package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts.map +0 -1
  268. package/dist/components/chat/utils/chunk-parser.d.ts +0 -25
  269. package/dist/components/chat/utils/chunk-parser.d.ts.map +0 -1
  270. package/dist/components/ui/rich-markdown-renderer.d.ts +0 -34
  271. package/dist/components/ui/rich-markdown-renderer.d.ts.map +0 -1
  272. package/dist/components/ui/simple-markdown-renderer.d.ts +0 -73
  273. package/dist/components/ui/simple-markdown-renderer.d.ts.map +0 -1
  274. package/src/components/chat/hooks/.use-realtime-chunk-processor.md +0 -50
  275. package/src/components/chat/hooks/use-realtime-chunk-processor.ts +0 -479
  276. package/src/components/chat/utils/.chunk-parser.md +0 -51
  277. package/src/components/chat/utils/chunk-parser.ts +0 -255
  278. package/src/components/ui/.simple-markdown-renderer.md +0 -40
  279. package/src/components/ui/rich-markdown-renderer.tsx +0 -1223
  280. package/src/components/ui/simple-markdown-renderer.tsx +0 -965
  281. /package/dist/{chunk-BIDOIPIT.js.map → chunk-2BJSRTKU.js.map} +0 -0
  282. /package/dist/{chunk-4DFPQKKJ.js.map → chunk-33FDAZDB.js.map} +0 -0
  283. /package/dist/{chunk-LOWJWKM5.js.map → chunk-4QDFNDVW.js.map} +0 -0
  284. /package/dist/{chunk-GXXLJHQX.js.map → chunk-7I2QMUEZ.js.map} +0 -0
  285. /package/dist/{chunk-NYOQNYSI.js.map → chunk-AW3LVWVV.js.map} +0 -0
  286. /package/dist/{chunk-25YYEVSE.js.map → chunk-DG7TX763.js.map} +0 -0
  287. /package/dist/{chunk-TZSPLSDU.js.map → chunk-GYEZV4GK.js.map} +0 -0
  288. /package/dist/{chunk-ABU37QSG.js.map → chunk-MMF6HJB7.js.map} +0 -0
  289. /package/dist/{chunk-3L44PPMF.js.map → chunk-RPAOSHBN.js.map} +0 -0
@@ -109,6 +109,7 @@ import {
109
109
  ChatContainer,
110
110
  ChatContent,
111
111
  ChatContextChipStrip,
112
+ ChatContextMemoryBar,
112
113
  ChatContextPicker,
113
114
  ChatDialogModals,
114
115
  ChatFooter,
@@ -152,7 +153,9 @@ import {
152
153
  CustomerInterviewCard,
153
154
  CustomerInterviewCardSkeleton,
154
155
  DEFAULT_CUSTOM_STATUS_COLOR,
156
+ DEFAULT_DIALOG_SIDE,
155
157
  DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID,
158
+ DEFAULT_MAX_REDUCERS,
156
159
  DashboardInfoCard,
157
160
  DataRoomDocCard,
158
161
  DataRoomDocCardSkeleton,
@@ -253,9 +256,11 @@ import {
253
256
  ListPageContainer,
254
257
  ListPageLayout,
255
258
  LoadError,
259
+ MAX_PENDING_RETAIN_KEYS,
256
260
  MESSAGE_ROLE,
257
261
  MESSAGE_TYPE,
258
262
  MarkdownEditor,
263
+ MarkdownEngine,
259
264
  MarqueeWall,
260
265
  MarqueeWallFades,
261
266
  MediaTypeSelector,
@@ -276,6 +281,7 @@ import {
276
281
  MenubarSubContent,
277
282
  MenubarSubTrigger,
278
283
  MenubarTrigger,
284
+ MermaidDiagram,
279
285
  MessageSegmentAccumulator,
280
286
  MingoChatHistory,
281
287
  MingoChatHistorySkeleton,
@@ -358,11 +364,13 @@ import {
358
364
  RoadmapCard,
359
365
  RoadmapCardSkeleton,
360
366
  RoadmapVoteButton,
367
+ SAFE_HTML_TAGS,
361
368
  SCROLL_ANCHOR,
362
369
  SCROLL_ANCHOR_WIRE_KEY,
363
370
  SECTION_HEADING_CLASS,
364
371
  SOURCE_ICON_NAMES,
365
372
  SOURCE_LABELS_BY_TABLE,
373
+ SVG_TAGS,
366
374
  SYNTHETIC_REALTIME_ID_PREFIXES,
367
375
  ScrollFadeOverlay,
368
376
  SearchInput,
@@ -400,6 +408,7 @@ import {
400
408
  StatusBadge,
401
409
  StatusIndicator,
402
410
  Switch,
411
+ TEXT_SIZE_PRESETS,
403
412
  TICKET_STATUS_COLOR_PRESETS,
404
413
  TITLE_BLOCK_MIN_HEIGHT,
405
414
  TabContent,
@@ -460,27 +469,39 @@ import {
460
469
  buildChatAttachmentViewUrl,
461
470
  buildChatRefKey,
462
471
  buildDiscussAddendum,
472
+ buildEffectiveTagSet,
473
+ buildHeadingIdMap,
463
474
  buildNatsWsUrl,
464
475
  buildProductReleaseCardProps,
476
+ buildSanitizeSchema,
465
477
  buildStreamFrames,
478
+ cardAwareUrlTransform,
466
479
  chatChipClass,
467
480
  clickupTaskUrl,
481
+ completeStreamingTail,
468
482
  computeHistoryPrepend,
469
483
  computeIsNewTab,
484
+ createChatDialogStore,
485
+ createChatStreamReducer,
470
486
  createColumnHelper,
487
+ createDeltaBatcher,
488
+ createEmptyTurnMeta,
471
489
  createMessageSegmentAccumulator,
472
490
  decideNewTab,
491
+ decodeHistoricalMessageData,
473
492
  defaultBuildProductReleaseCardProps,
474
493
  defaultTableIdForDocumentType,
475
494
  deriveColumns,
476
495
  escapeMarkdownInline,
496
+ escapeUnknownHtmlTags,
477
497
  executeNavigation,
478
498
  executeNavigationImperative,
479
499
  exportToCSV,
480
500
  extractEntityIdFilter,
481
501
  extractErrorMessages,
482
502
  extractIncompleteMessageState,
483
- extractTextFromChunk,
503
+ extractIncompleteTailState,
504
+ extractText,
484
505
  fetchEmptyStateConfig,
485
506
  fetchSlashCommands,
486
507
  flattenAssistantContent,
@@ -519,11 +540,8 @@ import {
519
540
  hideOnError,
520
541
  historicalToUnified,
521
542
  interleave,
522
- isControlChunk,
523
543
  isCrossOriginUrl,
524
- isErrorChunk,
525
544
  isHistoricalUserTurn,
526
- isMetadataChunk,
527
545
  isModifierClick,
528
546
  isQuickActionIconSpec,
529
547
  isStructuredContent,
@@ -539,12 +557,13 @@ import {
539
557
  normalizeContent,
540
558
  normalizeHistoricalMessageData,
541
559
  normalizeIconKey,
542
- parseChunkToAction,
543
560
  parseScrollAnchor,
544
561
  parseWireCommandOverride,
545
562
  processHistoricalMessages,
546
563
  processHistoricalMessagesWithErrors,
564
+ processShortcodes,
547
565
  programItemToStripProfile,
566
+ rehypeStripUnsafe,
548
567
  remarkCardLinks,
549
568
  remarkMentionChips,
550
569
  renderChatInlineEntityCard,
@@ -554,9 +573,11 @@ import {
554
573
  resolveSourceIcon,
555
574
  resolveSourceRowCTA,
556
575
  resolveStatusTagProps,
576
+ resolveTextSizeConfig,
557
577
  resolveTicketStatus,
558
578
  safeHref,
559
579
  sanitizeTitleForChat,
580
+ splitStreamingBlocks,
560
581
  statusBadgeVariants,
561
582
  stripChatAttachmentMarkdown,
562
583
  stripSameOriginToPath,
@@ -571,6 +592,7 @@ import {
571
592
  useChatAttachments,
572
593
  useChatCardItem,
573
594
  useChatIdentity,
595
+ useChatStreamReducer,
574
596
  useChunkCatchup,
575
597
  useCloseOnNavigation,
576
598
  useCollapsible,
@@ -578,13 +600,13 @@ import {
578
600
  useDataTable,
579
601
  useDataTableContext,
580
602
  useEmptyStateConfig,
603
+ useHeadingIdMap,
581
604
  useJetStreamDialogSubscription,
582
605
  useMarqueeSync,
583
606
  useNatsChatAdapter,
584
607
  useNatsDialogSubscription,
585
608
  usePageActionsBottomPadding,
586
609
  useProxiedImageUrl,
587
- useRealtimeChunkProcessor,
588
610
  useSSE,
589
611
  useScriptedStream,
590
612
  useScrollFade,
@@ -593,7 +615,7 @@ import {
593
615
  useSseChatAdapter,
594
616
  useUnifiedChat,
595
617
  usesCanonicalStatusStyle
596
- } from "../../chunk-CZFPPNYV.js";
618
+ } from "../../chunk-E6O6XATC.js";
597
619
  import {
598
620
  CommandApprovalToast,
599
621
  ToastCard,
@@ -763,6 +785,7 @@ export {
763
785
  ChatContainer,
764
786
  ChatContent,
765
787
  ChatContextChipStrip,
788
+ ChatContextMemoryBar,
766
789
  ChatContextPicker,
767
790
  ChatDialogModals,
768
791
  ChatFooter,
@@ -808,7 +831,9 @@ export {
808
831
  CustomerInterviewCard,
809
832
  CustomerInterviewCardSkeleton,
810
833
  DEFAULT_CUSTOM_STATUS_COLOR,
834
+ DEFAULT_DIALOG_SIDE,
811
835
  DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID,
836
+ DEFAULT_MAX_REDUCERS,
812
837
  DashboardInfoCard,
813
838
  DataRoomDocCard,
814
839
  DataRoomDocCardSkeleton,
@@ -928,9 +953,11 @@ export {
928
953
  LoadError,
929
954
  CheckCircleIcon as LucideCheckCircleIcon,
930
955
  XIcon as LucideXIcon,
956
+ MAX_PENDING_RETAIN_KEYS,
931
957
  MESSAGE_ROLE,
932
958
  MESSAGE_TYPE,
933
959
  MarkdownEditor,
960
+ MarkdownEngine,
934
961
  MarqueeWall,
935
962
  MarqueeWallFades,
936
963
  MediaTypeSelector,
@@ -950,6 +977,7 @@ export {
950
977
  MenubarSubContent,
951
978
  MenubarSubTrigger,
952
979
  MenubarTrigger,
980
+ MermaidDiagram,
953
981
  MessageSegmentAccumulator,
954
982
  MingoChatHistory,
955
983
  MingoChatHistorySkeleton,
@@ -1032,11 +1060,13 @@ export {
1032
1060
  RoadmapCard,
1033
1061
  RoadmapCardSkeleton,
1034
1062
  RoadmapVoteButton,
1063
+ SAFE_HTML_TAGS,
1035
1064
  SCROLL_ANCHOR,
1036
1065
  SCROLL_ANCHOR_WIRE_KEY,
1037
1066
  SECTION_HEADING_CLASS,
1038
1067
  SOURCE_ICON_NAMES,
1039
1068
  SOURCE_LABELS_BY_TABLE,
1069
+ SVG_TAGS,
1040
1070
  SYNTHETIC_REALTIME_ID_PREFIXES,
1041
1071
  ScrollFadeOverlay,
1042
1072
  SearchInput,
@@ -1083,6 +1113,7 @@ export {
1083
1113
  StatusBadge,
1084
1114
  StatusIndicator,
1085
1115
  Switch,
1116
+ TEXT_SIZE_PRESETS,
1086
1117
  TICKET_STATUS_COLOR_PRESETS,
1087
1118
  TITLE_BLOCK_MIN_HEIGHT,
1088
1119
  TabContent,
@@ -1145,31 +1176,43 @@ export {
1145
1176
  buildChatAttachmentViewUrl,
1146
1177
  buildChatRefKey,
1147
1178
  buildDiscussAddendum,
1179
+ buildEffectiveTagSet,
1180
+ buildHeadingIdMap,
1148
1181
  buildNatsWsUrl,
1149
1182
  buildProductReleaseCardProps,
1183
+ buildSanitizeSchema,
1150
1184
  buildStreamFrames,
1151
1185
  buttonVariants,
1186
+ cardAwareUrlTransform,
1152
1187
  embedAuthedFetch as chatAuthedFetch,
1153
1188
  chatChipClass,
1154
1189
  clearEmbedProxyAuth as clearChatProxyAuth,
1155
1190
  clickupTaskUrl,
1191
+ completeStreamingTail,
1156
1192
  computeHistoryPrepend,
1157
1193
  computeIsNewTab,
1194
+ createChatDialogStore,
1195
+ createChatStreamReducer,
1158
1196
  createColumnHelper,
1197
+ createDeltaBatcher,
1198
+ createEmptyTurnMeta,
1159
1199
  createMessageSegmentAccumulator,
1160
1200
  decideNewTab,
1201
+ decodeHistoricalMessageData,
1161
1202
  defaultBuildProductReleaseCardProps,
1162
1203
  defaultTableIdForDocumentType,
1163
1204
  deriveColumns,
1164
1205
  dotColorByVariant,
1165
1206
  escapeMarkdownInline,
1207
+ escapeUnknownHtmlTags,
1166
1208
  executeNavigation,
1167
1209
  executeNavigationImperative,
1168
1210
  exportToCSV,
1169
1211
  extractEntityIdFilter,
1170
1212
  extractErrorMessages,
1171
1213
  extractIncompleteMessageState,
1172
- extractTextFromChunk,
1214
+ extractIncompleteTailState,
1215
+ extractText,
1173
1216
  fetchEmptyStateConfig,
1174
1217
  fetchSlashCommands,
1175
1218
  flattenAssistantContent,
@@ -1210,11 +1253,8 @@ export {
1210
1253
  hideOnError,
1211
1254
  historicalToUnified,
1212
1255
  interleave,
1213
- isControlChunk,
1214
1256
  isCrossOriginUrl,
1215
- isErrorChunk,
1216
1257
  isHistoricalUserTurn,
1217
- isMetadataChunk,
1218
1258
  isModifierClick,
1219
1259
  isQuickActionIconSpec,
1220
1260
  isStructuredContent,
@@ -1230,13 +1270,14 @@ export {
1230
1270
  normalizeContent,
1231
1271
  normalizeHistoricalMessageData,
1232
1272
  normalizeIconKey,
1233
- parseChunkToAction,
1234
1273
  parseScrollAnchor,
1235
1274
  parseWireCommandOverride,
1236
1275
  processHistoricalMessages,
1237
1276
  processHistoricalMessagesWithErrors,
1277
+ processShortcodes,
1238
1278
  programItemToStripProfile,
1239
1279
  progressColorByVariant,
1280
+ rehypeStripUnsafe,
1240
1281
  remarkCardLinks,
1241
1282
  remarkMentionChips,
1242
1283
  renderChatInlineEntityCard,
@@ -1246,12 +1287,14 @@ export {
1246
1287
  resolveSourceIcon,
1247
1288
  resolveSourceRowCTA,
1248
1289
  resolveStatusTagProps,
1290
+ resolveTextSizeConfig,
1249
1291
  resolveTicketStatus,
1250
1292
  safeHref,
1251
1293
  sanitizeTitleForChat,
1252
1294
  setEmbedProxyAuth as setChatProxyAuth,
1253
1295
  showCommandApprovalToast,
1254
1296
  showToast,
1297
+ splitStreamingBlocks,
1255
1298
  statusBadgeVariants,
1256
1299
  stripChatAttachmentMarkdown,
1257
1300
  stripSameOriginToPath,
@@ -1266,6 +1309,7 @@ export {
1266
1309
  useChatAttachments,
1267
1310
  useChatCardItem,
1268
1311
  useChatIdentity,
1312
+ useChatStreamReducer,
1269
1313
  useChunkCatchup,
1270
1314
  useCloseOnNavigation,
1271
1315
  useCollapsible,
@@ -1274,13 +1318,13 @@ export {
1274
1318
  useDataTableContext,
1275
1319
  useSseChatAdapter as useEmbeddedChat,
1276
1320
  useEmptyStateConfig,
1321
+ useHeadingIdMap,
1277
1322
  useJetStreamDialogSubscription,
1278
1323
  useMarqueeSync,
1279
1324
  useNatsChatAdapter,
1280
1325
  useNatsDialogSubscription,
1281
1326
  usePageActionsBottomPadding,
1282
1327
  useProxiedImageUrl,
1283
- useRealtimeChunkProcessor,
1284
1328
  useSSE,
1285
1329
  useScriptedStream,
1286
1330
  useScrollFade,
@@ -0,0 +1,56 @@
1
+ import type { Components } from 'react-markdown';
2
+ import type { ResolveLinkResult } from '../../../types/doc-source';
3
+ import type { TextSizeElement } from './text-size';
4
+ /**
5
+ * True when an image `src` is worth rendering. Shared by the base `img` and
6
+ * the rich composition's `img` / `video` overrides so the empty-`![]()`
7
+ * guard has exactly one definition.
8
+ */
9
+ export declare function hasRenderableSrc(src: unknown): src is string;
10
+ export interface BuildBaseComponentsOptions {
11
+ textSizes: Record<TextSizeElement, string>;
12
+ demoteMarkdownH1ToH2: boolean;
13
+ brokenLinks: readonly string[];
14
+ currentPath?: string;
15
+ onInternalLinkClick?: (path: string, options?: {
16
+ expandFolder?: boolean;
17
+ fromInternalLink?: boolean;
18
+ }) => void;
19
+ onResolveLink?: (href: string, currentPath: string) => Promise<ResolveLinkResult>;
20
+ }
21
+ /**
22
+ * The standard leaf renderers (`code` block + inline, `blockquote`, `div`
23
+ * pass-through) as standalone functions.
24
+ *
25
+ * SSOT for compositions that must OVERRIDE these renderers for a narrow
26
+ * special case and then fall through: the rich composition intercepts embed
27
+ * fence languages, shortcode-expanded `div`s and Reddit's `reddit-embed-bq`
28
+ * blockquote, and delegates everything else here. Previously it reproduced
29
+ * these renderers byte-for-byte, so any class change here silently drifted
30
+ * on content surfaces.
31
+ *
32
+ * THESE MUST STAY HOOK-FREE: the rich composition calls them as plain
33
+ * functions from inside its own renderers (`standard.code(props)`), which is
34
+ * not a React render of a component and would break the rules of hooks.
35
+ * Hook-using renderers (the headings, which read the heading-line offset
36
+ * from context) live in `buildBaseComponents` below and are never delegated
37
+ * to this way.
38
+ *
39
+ * ODS-TOKENS FLAG (ODS_TOKEN_RULES §Typography / §General): inline code keeps
40
+ * an inline `text-[0.9em]`, carried over verbatim from the pre-unification
41
+ * renderers — ODS has no relative-to-parent code size, so mapping it onto an
42
+ * existing token would visibly change every inline code span. Same shape as
43
+ * the flag in ./text-size.ts — flagged for addition to ODS, not copied
44
+ * anywhere else.
45
+ *
46
+ * The code BLOCK's font is NOT flagged: the raw "JetBrains Mono", "SF Mono",
47
+ * Consolas stack the old renderer inlined is gone, replaced by Tailwind's
48
+ * `font-mono` (→ `var(--font-family-heading)`, the Azeret Mono ODS stack) —
49
+ * the same class the inline-code branch below already used, so the two code
50
+ * surfaces no longer disagree about their family.
51
+ */
52
+ export declare function buildStandardLeafRenderers({ textSizes, }: {
53
+ textSizes: Record<TextSizeElement, string>;
54
+ }): Pick<Components, 'code' | 'blockquote' | 'div'>;
55
+ export declare function buildBaseComponents({ textSizes, demoteMarkdownH1ToH2, brokenLinks, currentPath: propCurrentPath, onInternalLinkClick, onResolveLink, }: BuildBaseComponentsOptions): Components;
56
+ //# sourceMappingURL=base-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-components.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/markdown/base-components.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAUnD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAE5D;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/G,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACnF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,SAAS,GACV,EAAE;IACD,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;CAC5C,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK,CAAC,CA4DlD;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,oBAAoB,EACpB,WAAW,EACX,WAAW,EAAE,eAAe,EAC5B,mBAAmB,EACnB,aAAa,GACd,EAAE,0BAA0B,GAAG,UAAU,CAmMzC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * MarkdownEngine — THE one react-markdown pipeline for every surface
3
+ * (chat messages, blog, docs, KB articles, legal, releases, admin previews).
4
+ *
5
+ * `SimpleMarkdownRenderer` and `RichMarkdownRenderer` are thin compositions
6
+ * over this engine (see ./simple-markdown-renderer.tsx and ./rich/) — there
7
+ * is exactly ONE parse path, ONE sanitizer stack, ONE mermaid, ONE
8
+ * heading-id algorithm, ONE link-click model. Do not fork this pipeline;
9
+ * extend via `componentOverrides` / `additionalRemarkPlugins` /
10
+ * `preprocessContent` / `extraAllowedHtmlTags`.
11
+ *
12
+ * Pipeline order (each stage documented in ./sanitize.ts):
13
+ * preprocessContent (composition hook, e.g. shortcodes)
14
+ * → completeStreamingTail (streaming only — MUST precede the escape pass)
15
+ * → escapeUnknownHtmlTags (text pre-pass, React 19 crash guard)
16
+ * → remark: remarkGfm, remarkBreaks, ...additionalRemarkPlugins
17
+ * → rehype: rehypeRaw → rehypeSanitize(schema) → rehypeStripUnsafe
18
+ * → rehypeHighlight
19
+ * → urlTransform: cardAwareUrlTransform
20
+ * → components: buildBaseComponents(...) spread-last componentOverrides
21
+ */
22
+ import React from 'react';
23
+ import { type Components } from 'react-markdown';
24
+ import type { PluggableList } from 'unified';
25
+ import type { ResolveLinkResult } from '../../../types/doc-source';
26
+ import { type TextSizeConfig } from './text-size';
27
+ import { type HeadingSection } from './heading-ids';
28
+ export type { ResolveLinkResult };
29
+ /**
30
+ * Module-scope empty default for `brokenLinks`.
31
+ *
32
+ * A `brokenLinks = []` DEFAULT PARAMETER allocates a fresh array on every
33
+ * render, so the `components` useMemo (which lists it as a dep) recomputed
34
+ * every render, which changed `StreamingBlockRenderer`'s `components` prop
35
+ * identity, which made its `memo` bail EVERY time — every completed block
36
+ * re-parsed on every streamed token, defeating the entire atomic-block
37
+ * optimization. Any new default that is an object/array/function MUST be
38
+ * hoisted here for the same reason.
39
+ *
40
+ * Exported so the compositions that apply the SAME default before handing
41
+ * props down (rich) share this ONE identity instead of declaring a second
42
+ * module-scope empty array with a copy of this rationale. Deliberately NOT
43
+ * re-exported from ./index — it is an internal identity contract between the
44
+ * engine and its compositions, not public API.
45
+ */
46
+ export declare const NO_BROKEN_LINKS: readonly string[];
47
+ export interface MarkdownEngineProps {
48
+ content: string;
49
+ className?: string;
50
+ /** Backend-provided heading IDs for deep-link anchors */
51
+ sectionIds?: HeadingSection[];
52
+ /** When the page already has an H1, render markdown `#` as `<h2>` */
53
+ demoteMarkdownH1ToH2?: boolean;
54
+ /** List of broken link hrefs detected server-side (shown with [BROKEN] badge) */
55
+ brokenLinks?: readonly string[];
56
+ /** Callback for internal (non-http, non-anchor) link clicks */
57
+ onInternalLinkClick?: (path: string, options?: {
58
+ expandFolder?: boolean;
59
+ fromInternalLink?: boolean;
60
+ }) => void;
61
+ /** Current documentation path — enables internal-link mode when set */
62
+ currentPath?: string;
63
+ /** Resolve an internal link href to a navigation path. */
64
+ onResolveLink?: (href: string, currentPath: string) => Promise<ResolveLinkResult>;
65
+ /** Pre-process the raw markdown string before rendering (e.g. shortcode expansion) */
66
+ preprocessContent?: (content: string) => string;
67
+ /** Merge additional or override react-markdown component renderers (spread LAST — caller wins) */
68
+ componentOverrides?: Partial<Components>;
69
+ /** Extra remark plugins appended after the built-in remarkGfm + remarkBreaks */
70
+ additionalRemarkPlugins?: PluggableList;
71
+ /** Text sizing preset / per-element overrides */
72
+ textSize?: TextSizeConfig;
73
+ /**
74
+ * Extra raw-HTML tags this composition admits. Unioned into BOTH the
75
+ * text pre-pass allowlist AND the sanitize schema together (the
76
+ * coupled-allowlist invariant — see ./sanitize.ts).
77
+ */
78
+ extraAllowedHtmlTags?: string[];
79
+ /**
80
+ * Set true for the actively streaming message ONLY. Enables atomic-block
81
+ * memoization + fence tail-completion + an aria-live wrapper. The caller
82
+ * MUST flip back to false on completion — that final render is one
83
+ * authoritative whole-document parse (block cache discarded), so
84
+ * streaming can never permanently diverge from the settled output.
85
+ */
86
+ streaming?: boolean;
87
+ }
88
+ /**
89
+ * Memoized so a parent re-render with UNCHANGED props (same `content`
90
+ * string, same memoized `componentOverrides`/plugins) does NOT re-parse the
91
+ * markdown. Re-parsing rebuilds the entire react-markdown subtree, which
92
+ * RE-MOUNTS any embedded inline entity cards — closing their open menus and
93
+ * re-triggering their fetch on every chat re-render (streaming chunk AND
94
+ * scroll). With stable props the renderer bails, so completed messages'
95
+ * cards stay mounted. The streaming path additionally memoizes completed
96
+ * atomic blocks so the in-flight message re-parses only its live tail.
97
+ */
98
+ export declare const MarkdownEngine: React.NamedExoticComponent<MarkdownEngineProps>;
99
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/markdown/engine.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAM7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAQnE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAIvB,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAAO,CAAC;AAErD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,qEAAqE;IACrE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iFAAiF;IACjF,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/G,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClF,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,kGAAkG;IAClG,kBAAkB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,gFAAgF;IAChF,uBAAuB,CAAC,EAAE,aAAa,CAAC;IACxC,iDAAiD;IACjD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAqMD;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,iDAA2B,CAAC"}
@@ -0,0 +1,65 @@
1
+ export interface HeadingSection {
2
+ id: string;
3
+ title: string;
4
+ level: number;
5
+ }
6
+ /** `line (1-based, document-wide) → heading id`. */
7
+ export type HeadingIdMap = ReadonlyMap<number, string>;
8
+ /**
9
+ * Line offset added to unit-relative hast positions. Non-zero only on the
10
+ * streaming path, where each atomic unit is parsed by its own
11
+ * `ReactMarkdown` (see `StreamingBlock.startLine`).
12
+ */
13
+ export declare const HeadingLineOffsetContext: import("react").Context<number>;
14
+ /**
15
+ * The document's heading-id map, delivered by CONTEXT rather than baked into
16
+ * the react-markdown `components` map on purpose: the map is rebuilt on every
17
+ * streamed token (its input is the growing `processedContent`), so listing it
18
+ * as a `components` memo dep would change that map's identity each token and
19
+ * make every completed streaming block's `memo` bail — the exact regression
20
+ * `NO_BROKEN_LINKS` was introduced to fix. Through context only the heading
21
+ * renderers re-render.
22
+ */
23
+ export declare const HeadingIdMapContext: import("react").Context<HeadingIdMap>;
24
+ /** Look up the pre-computed id for a heading hast node. Pure. */
25
+ export declare function useHeadingId(node: any): string | undefined;
26
+ /**
27
+ * Build the document's `line → id` map. Pure: same content + same
28
+ * `sectionIds` always yields the same map.
29
+ */
30
+ export declare function buildHeadingIdMap(content: string, sectionIds?: HeadingSection[]): HeadingIdMap;
31
+ /**
32
+ * Memoized `buildHeadingIdMap` for the engine, with the map's IDENTITY held
33
+ * stable across content changes that don't touch any heading.
34
+ *
35
+ * `content` changes on every streamed token, so the `useMemo` alone rebuilt
36
+ * a fresh `Map` per token; that map is the context value, so EVERY heading
37
+ * consumer in every already-completed block re-rendered on every token —
38
+ * the same identity-churn class `NO_BROKEN_LINKS` exists to prevent, just
39
+ * one layer down. Rebuilding is cheap; re-rendering the consumers is not, so
40
+ * the newly built map is compared to the previous one and the previous
41
+ * object is returned when the entries match.
42
+ */
43
+ export declare function useHeadingIdMap(content: string, sectionIds?: HeadingSection[]): HeadingIdMap;
44
+ /**
45
+ * Fallback id for a heading the source scan could NOT see — in practice only
46
+ * a heading synthesized by a caller remark/rehype plugin, which carries no
47
+ * source position. (Setext, blockquote/list-nested ATX and multiple raw
48
+ * `<hN>`s on one line are all scanned now, so they no longer land here.)
49
+ *
50
+ * Routed through the SAME dedupe shape as the map so a fallback id can never
51
+ * collide with an assigned one. It stays PURE — `taken` is derived from the
52
+ * map, not from render order — which is why two position-less headings with
53
+ * IDENTICAL text still collide with each other: disambiguating those would
54
+ * require the shared mutable counter this module deleted.
55
+ */
56
+ export declare function resolveFallbackHeadingId(base: string, taken: ReadonlySet<string>): string;
57
+ /**
58
+ * The ids already assigned by the document's heading-id map. Cached per map
59
+ * IDENTITY, which `useHeadingIdMap` now keeps stable across heading-free
60
+ * token growth — so this is O(headings) once, not per heading per token.
61
+ */
62
+ export declare function useAssignedHeadingIds(): ReadonlySet<string>;
63
+ /** Extract plain text from React children (headings receive mixed nodes). */
64
+ export declare function extractText(node: any): string;
65
+ //# sourceMappingURL=heading-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heading-ids.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/markdown/heading-ids.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,oDAAoD;AACpD,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAUtD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,iCAAmB,CAAA;AAIxD;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,uCAAiD,CAAA;AAEjF,iEAAiE;AAEjE,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS,CAK1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,cAAc,EAAE,GAC5B,YAAY,CAoEd;AAYD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,cAAc,EAAE,GAC5B,YAAY,CAQd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAMzF;AAKD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,CAAC,MAAM,CAAC,CAO3D;AAED,6EAA6E;AAE7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAK7C"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Unified markdown module — public surface.
3
+ *
4
+ * ONE engine (`MarkdownEngine`), two named compositions:
5
+ * - `SimpleMarkdownRenderer` — chat/doc surfaces (embed-free bundle)
6
+ * - `RichMarkdownRenderer` — authored-content surfaces (shortcodes,
7
+ * social embeds, Video SSOT, OG previews)
8
+ */
9
+ export { MarkdownEngine, type MarkdownEngineProps } from './engine';
10
+ export { SimpleMarkdownRenderer, type SimpleMarkdownRendererProps, type ResolveLinkResult, } from './simple-markdown-renderer';
11
+ export { RichMarkdownRenderer, type RichMarkdownRendererProps, } from './rich/rich-markdown-renderer';
12
+ export { processShortcodes } from './rich/shortcodes';
13
+ export { SAFE_HTML_TAGS, SVG_TAGS, buildEffectiveTagSet, buildSanitizeSchema, cardAwareUrlTransform, escapeUnknownHtmlTags, rehypeStripUnsafe, } from './sanitize';
14
+ export { TEXT_SIZE_PRESETS, resolveTextSizeConfig, type TextSizeConfig, type TextSizeClassMap, type TextSizeElement, type TextSizePreset, } from './text-size';
15
+ export { MermaidDiagram } from './mermaid-diagram';
16
+ export { buildHeadingIdMap, useHeadingIdMap, extractText, type HeadingSection, type HeadingIdMap, } from './heading-ids';
17
+ export { splitStreamingBlocks, completeStreamingTail, type StreamingBlock } from './streaming';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/markdown/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,GAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACL,cAAc,EACd,QAAQ,EACR,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Single MermaidDiagram for the unified markdown engine (dark theme only —
3
+ * the old RichMarkdownRenderer's light-theme branch was dead code behind a
4
+ * hardcoded `isDarkMode = true` and is deleted, not carried over).
5
+ *
6
+ * `mermaid` stays a dynamic import so neither chat nor content bundles pay
7
+ * for it unless a diagram is actually rendered.
8
+ */
9
+ import React from 'react';
10
+ /**
11
+ * SECURITY SSOT for the mermaid renderer — the ONLY place these knobs are
12
+ * written. `./__tests__/mermaid-security.test.ts` imports THIS constant and
13
+ * spreads it into its own `mermaid.initialize`, so the fixture and the
14
+ * component can no longer drift: flipping `securityLevel` to `'loose'` here
15
+ * fails the suite (verified by doing exactly that).
16
+ *
17
+ * This renderer sits on the CHAT path, so the diagram source is MODEL output
18
+ * — untrusted by construction — and the rendered SVG goes through
19
+ * `dangerouslySetInnerHTML`. The pre-unification renderer used `'loose'`,
20
+ * which permits raw HTML inside labels and enables mermaid's `click`
21
+ * interaction directive: a node label like `A["<img src=x onerror=...>"]`
22
+ * would have produced LIVE HTML.
23
+ *
24
+ * - `securityLevel: 'strict'` encodes HTML tags in text and disables click
25
+ * handlers.
26
+ * - `htmlLabels: false` renders labels as SVG `<text>` instead of a
27
+ * foreignObject HTML subtree, so there is no HTML surface at all. Verified:
28
+ * no authored diagram in this repo or in the consuming hub's markdown uses
29
+ * HTML labels (not even `<br/>`), so 'antiscript' (which still allows tags)
30
+ * is not needed. (`htmlLabels` is set at the ROOT — `flowchart.htmlLabels`
31
+ * is deprecated in mermaid 11 and the root value takes precedence.)
32
+ * - `secure` is the allowlist of config keys a `%%{init}%%` directive in the
33
+ * diagram SOURCE may NOT override. mermaid's default list covers
34
+ * `securityLevel` but NOT `htmlLabels`, so model-authored source could
35
+ * otherwise re-enable HTML labels while `securityLevel` stayed locked.
36
+ * Adding `htmlLabels` (plus `secure` itself and the resource limits) closes
37
+ * that hole.
38
+ *
39
+ * jsdom NOTE: with `htmlLabels` unlocked, a `%%{init: {"htmlLabels": true}}%%`
40
+ * directive was observed to make `mermaid.render` never settle under jsdom
41
+ * (>60s, against a passing two-render control). This was NOT reproduced in a
42
+ * real browser and may well be an artifact of jsdom having no layout — do not
43
+ * read it as a confirmed browser DoS. Either way the render below is wrapped
44
+ * in a timeout so a non-settling render surfaces the error state instead of
45
+ * sitting on "Rendering diagram…" forever.
46
+ */
47
+ export declare const MERMAID_SECURITY_OPTIONS: {
48
+ htmlLabels: false;
49
+ securityLevel: "strict";
50
+ secure: string[];
51
+ };
52
+ /** Upper bound on a single `mermaid.render`. Generous enough that no honest
53
+ * diagram hits it; short enough that a wedged render becomes a visible error
54
+ * instead of a permanent skeleton. */
55
+ export declare const MERMAID_RENDER_TIMEOUT_MS = 15000;
56
+ /**
57
+ * ODS-TOKENS FLAG (ODS_TOKEN_RULES §Colors / §Typography / §General):
58
+ * `mermaidStyles` below and the `themeVariables` / `fontFamily` / `fontSize`
59
+ * block in `MermaidDiagram` carry RAW hex colors, a literal font-family and
60
+ * literal px font sizes.
61
+ *
62
+ * Reason: mermaid's configuration is not CSS — `themeVariables` is a
63
+ * JavaScript API whose values are baked into the generated SVG as literal
64
+ * attribute strings, so a `var(--color-…)` reference resolves to nothing
65
+ * there. On top of that, ODS has NO 10-step categorical color ramp, and
66
+ * mermaid's `cScale0…cScale9` requires exactly one. The palette is carried
67
+ * over VERBATIM from the pre-unification RichMarkdownRenderer, so this is
68
+ * parity, not new divergence; the missing categorical-ramp tokens are
69
+ * flagged here for addition to ODS.
70
+ *
71
+ * Scope: this exemption covers THIS file only, and only the mermaid config
72
+ * surface. Do NOT copy this pattern — every other style in the markdown
73
+ * module uses ODS semantic classes.
74
+ */
75
+ export declare const mermaidStyles = "\n .mermaid-svg-container svg {\n max-width: 100% !important;\n height: auto !important;\n min-height: 200px;\n font-family: 'DM Sans', sans-serif !important;\n font-size: 14px !important;\n }\n @media (min-width: 1520px) {\n .mermaid-svg-container svg {\n max-width: 900px !important;\n max-height: 700px !important;\n min-height: 300px;\n font-size: 16px !important;\n }\n }\n @media (min-width: 768px) and (max-width: 1519px) {\n .mermaid-svg-container svg {\n max-width: 700px !important;\n max-height: 600px !important;\n min-height: 250px;\n font-size: 15px !important;\n }\n }\n @media (max-width: 767px) {\n .mermaid-svg-container svg {\n max-width: 90vw !important;\n max-height: 400px !important;\n min-height: 200px;\n font-size: 13px !important;\n }\n }\n .mermaid-svg-container svg[width] { width: 100% !important; }\n .mermaid-svg-container .node rect,\n .mermaid-svg-container .node circle,\n .mermaid-svg-container .node ellipse,\n .mermaid-svg-container .node polygon { stroke-width: 2px !important; }\n .mermaid-svg-container .edgePath path { stroke-width: 2px !important; }\n @media (min-width: 768px) {\n .mermaid-svg-container .node text,\n .mermaid-svg-container .edgeLabel text { font-size: 14px !important; }\n }\n @media (min-width: 1520px) {\n .mermaid-svg-container .node text,\n .mermaid-svg-container .edgeLabel text { font-size: 16px !important; }\n }\n";
76
+ export declare const MermaidDiagram: React.FC<{
77
+ chart: string;
78
+ }>;
79
+ //# sourceMappingURL=mermaid-diagram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid-diagram.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/markdown/mermaid-diagram.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,wBAAwB;;;;CAIqC,CAAC;AAE3E;;uCAEuC;AACvC,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAkBhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,u+CA8CzB,CAAC;AAQF,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CA2ItD,CAAC"}