@flamingo-stack/openframe-frontend-core 0.0.490 → 0.0.492-1506.3956.1

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 (353) 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 +207 -0
  8. package/dist/chat-protocol/events.d.ts.map +1 -0
  9. package/dist/chat-protocol/frames.d.ts +213 -0
  10. package/dist/chat-protocol/frames.d.ts.map +1 -0
  11. package/dist/chat-protocol/index.cjs +500 -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 +484 -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-WLM3F3WU.js → chunk-34TDA22K.js} +3 -3
  22. package/dist/{chunk-EGXCWZYP.js → chunk-3LKB722U.js} +3 -3
  23. package/dist/{chunk-RW2LPL72.js → chunk-6WTCJI5R.js} +2 -2
  24. package/dist/{chunk-VUXNXWOQ.cjs → chunk-7N7YZCHR.cjs} +7503 -5167
  25. package/dist/chunk-7N7YZCHR.cjs.map +1 -0
  26. package/dist/{chunk-AW63ET2A.cjs → chunk-A6FPYAUD.cjs} +19 -19
  27. package/dist/{chunk-AW63ET2A.cjs.map → chunk-A6FPYAUD.cjs.map} +1 -1
  28. package/dist/{chunk-BZMOEWWS.js → chunk-BEEPU44B.js} +12 -12
  29. package/dist/chunk-BEEPU44B.js.map +1 -0
  30. package/dist/{chunk-EJQUYZXF.cjs → chunk-C65NCIMV.cjs} +12 -12
  31. package/dist/{chunk-EJQUYZXF.cjs.map → chunk-C65NCIMV.cjs.map} +1 -1
  32. package/dist/{chunk-VL2YMDPH.js → chunk-J3VBVR4W.js} +6 -6
  33. package/dist/{chunk-AIRNG27G.js → chunk-JHEIOXXZ.js} +8 -7
  34. package/dist/chunk-JHEIOXXZ.js.map +1 -0
  35. package/dist/{chunk-D5LQMRPU.cjs → chunk-JSEJ5MH5.cjs} +5 -5
  36. package/dist/{chunk-D5LQMRPU.cjs.map → chunk-JSEJ5MH5.cjs.map} +1 -1
  37. package/dist/{chunk-FY5XAW3H.cjs → chunk-KX3K2EH4.cjs} +18 -18
  38. package/dist/{chunk-FY5XAW3H.cjs.map → chunk-KX3K2EH4.cjs.map} +1 -1
  39. package/dist/{chunk-3IEVA5AO.cjs → chunk-M6FEGPQJ.cjs} +93 -93
  40. package/dist/{chunk-3IEVA5AO.cjs.map → chunk-M6FEGPQJ.cjs.map} +1 -1
  41. package/dist/{chunk-7I42V2OD.cjs → chunk-MEIGDK7M.cjs} +74 -74
  42. package/dist/chunk-MEIGDK7M.cjs.map +1 -0
  43. package/dist/{chunk-OQIMH2WQ.js → chunk-MEMRQTOI.js} +12263 -9927
  44. package/dist/chunk-MEMRQTOI.js.map +1 -0
  45. package/dist/{chunk-GUTYUMGV.cjs → chunk-MPUQFRJG.cjs} +12 -12
  46. package/dist/{chunk-GUTYUMGV.cjs.map → chunk-MPUQFRJG.cjs.map} +1 -1
  47. package/dist/{chunk-UZZT65PQ.cjs → chunk-MSL5NE3N.cjs} +40 -40
  48. package/dist/{chunk-UZZT65PQ.cjs.map → chunk-MSL5NE3N.cjs.map} +1 -1
  49. package/dist/{chunk-6CJ2K7BD.js → chunk-MZRIRQYV.js} +3 -3
  50. package/dist/{chunk-NGEFYPY7.js → chunk-NCAN6VUF.js} +4 -4
  51. package/dist/{chunk-6QK3ONDD.js → chunk-OL3MJKUI.js} +2 -2
  52. package/dist/{chunk-MPYDX5WX.js → chunk-PLB6CQSO.js} +4 -4
  53. package/dist/{chunk-6CFFISUC.js → chunk-PTXZB2KW.js} +3 -3
  54. package/dist/{chunk-GMPYR3MX.cjs → chunk-QDGB2DKY.cjs} +33 -33
  55. package/dist/{chunk-GMPYR3MX.cjs.map → chunk-QDGB2DKY.cjs.map} +1 -1
  56. package/dist/{chunk-2MKUHJ3O.cjs → chunk-QG2EBIH5.cjs} +40 -40
  57. package/dist/{chunk-2MKUHJ3O.cjs.map → chunk-QG2EBIH5.cjs.map} +1 -1
  58. package/dist/{chunk-GZK7FWJJ.js → chunk-QKWOBV55.js} +12 -12
  59. package/dist/chunk-QKWOBV55.js.map +1 -0
  60. package/dist/{chunk-STYA77PH.cjs → chunk-SGL6URIJ.cjs} +12 -12
  61. package/dist/chunk-SGL6URIJ.cjs.map +1 -0
  62. package/dist/{chunk-KP5KRRD6.cjs → chunk-THC3K262.cjs} +3 -3
  63. package/dist/{chunk-KP5KRRD6.cjs.map → chunk-THC3K262.cjs.map} +1 -1
  64. package/dist/{chunk-BIKOJ4FH.cjs → chunk-TTYJAZ7P.cjs} +58 -32
  65. package/dist/chunk-TTYJAZ7P.cjs.map +1 -0
  66. package/dist/{chunk-IEZ3YBAP.cjs → chunk-W56JYDSC.cjs} +34 -33
  67. package/dist/chunk-W56JYDSC.cjs.map +1 -0
  68. package/dist/{chunk-PB3BTZDU.js → chunk-WEUNPE3S.js} +139 -113
  69. package/dist/chunk-WEUNPE3S.js.map +1 -0
  70. package/dist/{chunk-VDZO6IDR.js → chunk-XOFE2RT4.js} +5 -5
  71. package/dist/components/case-studies/index.cjs +10 -10
  72. package/dist/components/case-studies/index.js +4 -4
  73. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  74. package/dist/components/chat/chat-message-list.d.ts.map +1 -1
  75. package/dist/components/chat/hooks/index.d.ts +0 -1
  76. package/dist/components/chat/hooks/index.d.ts.map +1 -1
  77. package/dist/components/chat/hooks/use-chat.d.ts.map +1 -1
  78. package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts +15 -48
  79. package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts.map +1 -1
  80. package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts +10 -57
  81. package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts.map +1 -1
  82. package/dist/components/chat/index.cjs +12 -4
  83. package/dist/components/chat/index.cjs.map +1 -1
  84. package/dist/components/chat/index.d.ts +1 -0
  85. package/dist/components/chat/index.d.ts.map +1 -1
  86. package/dist/components/chat/index.js +23 -15
  87. package/dist/components/chat/stream/chat-dialog-store.d.ts +184 -0
  88. package/dist/components/chat/stream/chat-dialog-store.d.ts.map +1 -0
  89. package/dist/components/chat/stream/chat-stream-reducer.d.ts +367 -0
  90. package/dist/components/chat/stream/chat-stream-reducer.d.ts.map +1 -0
  91. package/dist/components/chat/stream/delta-batcher.d.ts +51 -0
  92. package/dist/components/chat/stream/delta-batcher.d.ts.map +1 -0
  93. package/dist/components/chat/stream/index.d.ts +17 -0
  94. package/dist/components/chat/stream/index.d.ts.map +1 -0
  95. package/dist/components/chat/stream/message-mutations.d.ts +77 -0
  96. package/dist/components/chat/stream/message-mutations.d.ts.map +1 -0
  97. package/dist/components/chat/stream/use-chat-stream-reducer.d.ts +22 -0
  98. package/dist/components/chat/stream/use-chat-stream-reducer.d.ts.map +1 -0
  99. package/dist/components/chat/types/api.types.d.ts +1 -81
  100. package/dist/components/chat/types/api.types.d.ts.map +1 -1
  101. package/dist/components/chat/types/processing.types.d.ts +2 -93
  102. package/dist/components/chat/types/processing.types.d.ts.map +1 -1
  103. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts +34 -6
  104. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
  105. package/dist/components/chat/utils/index.d.ts +2 -3
  106. package/dist/components/chat/utils/index.d.ts.map +1 -1
  107. package/dist/components/chat/utils/process-historical-messages.d.ts +59 -11
  108. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  109. package/dist/components/contact/index.cjs +5 -5
  110. package/dist/components/contact/index.js +4 -4
  111. package/dist/components/docs/index.cjs +7 -7
  112. package/dist/components/docs/index.js +6 -6
  113. package/dist/components/embeds/index.cjs +5 -5
  114. package/dist/components/embeds/index.js +4 -4
  115. package/dist/components/faq/index.cjs +6 -6
  116. package/dist/components/faq/index.js +5 -5
  117. package/dist/components/features/index.cjs +4 -4
  118. package/dist/components/features/index.js +3 -3
  119. package/dist/components/features/select-button.d.ts.map +1 -1
  120. package/dist/components/help-center-pages/index.cjs +23 -23
  121. package/dist/components/help-center-pages/index.js +14 -14
  122. package/dist/components/index.cjs +203 -161
  123. package/dist/components/index.cjs.map +1 -1
  124. package/dist/components/index.js +66 -24
  125. package/dist/components/index.js.map +1 -1
  126. package/dist/components/layout/page-layout.d.ts +7 -1
  127. package/dist/components/layout/page-layout.d.ts.map +1 -1
  128. package/dist/components/layout/title-block.d.ts +23 -1
  129. package/dist/components/layout/title-block.d.ts.map +1 -1
  130. package/dist/components/navigation/index.cjs +4 -4
  131. package/dist/components/navigation/index.js +3 -3
  132. package/dist/components/onboarding-guides/index.cjs +8 -8
  133. package/dist/components/onboarding-guides/index.js +7 -7
  134. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
  135. package/dist/components/related-content/index.cjs +6 -6
  136. package/dist/components/related-content/index.js +5 -5
  137. package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
  138. package/dist/components/tickets/index.cjs +7 -7
  139. package/dist/components/tickets/index.js +6 -6
  140. package/dist/components/ui/autocomplete.d.ts.map +1 -1
  141. package/dist/components/ui/checkbox-block.d.ts.map +1 -1
  142. package/dist/components/ui/date-picker.d.ts.map +1 -1
  143. package/dist/components/ui/field-wrapper.d.ts +10 -1
  144. package/dist/components/ui/field-wrapper.d.ts.map +1 -1
  145. package/dist/components/ui/file-manager/index.cjs +50 -50
  146. package/dist/components/ui/file-manager/index.js +1 -1
  147. package/dist/components/ui/floating-tooltip.d.ts +8 -1
  148. package/dist/components/ui/floating-tooltip.d.ts.map +1 -1
  149. package/dist/components/ui/index.cjs +46 -4
  150. package/dist/components/ui/index.cjs.map +1 -1
  151. package/dist/components/ui/index.d.ts +1 -2
  152. package/dist/components/ui/index.d.ts.map +1 -1
  153. package/dist/components/ui/index.js +57 -15
  154. package/dist/components/ui/input-trigger.d.ts.map +1 -1
  155. package/dist/components/ui/input.d.ts.map +1 -1
  156. package/dist/components/ui/markdown/base-components.d.ts +51 -0
  157. package/dist/components/ui/markdown/base-components.d.ts.map +1 -0
  158. package/dist/components/ui/markdown/engine.d.ts +99 -0
  159. package/dist/components/ui/markdown/engine.d.ts.map +1 -0
  160. package/dist/components/ui/markdown/heading-ids.d.ts +65 -0
  161. package/dist/components/ui/markdown/heading-ids.d.ts.map +1 -0
  162. package/dist/components/ui/markdown/index.d.ts +18 -0
  163. package/dist/components/ui/markdown/index.d.ts.map +1 -0
  164. package/dist/components/ui/markdown/mermaid-diagram.d.ts +79 -0
  165. package/dist/components/ui/markdown/mermaid-diagram.d.ts.map +1 -0
  166. package/dist/components/ui/markdown/rich/embed-overrides.d.ts +14 -0
  167. package/dist/components/ui/markdown/rich/embed-overrides.d.ts.map +1 -0
  168. package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts +40 -0
  169. package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts.map +1 -0
  170. package/dist/components/ui/markdown/rich/shortcodes.d.ts +8 -0
  171. package/dist/components/ui/markdown/rich/shortcodes.d.ts.map +1 -0
  172. package/dist/components/ui/markdown/sanitize.d.ts +153 -0
  173. package/dist/components/ui/markdown/sanitize.d.ts.map +1 -0
  174. package/dist/components/ui/markdown/simple-markdown-renderer.d.ts +23 -0
  175. package/dist/components/ui/markdown/simple-markdown-renderer.d.ts.map +1 -0
  176. package/dist/components/ui/markdown/streaming.d.ts +78 -0
  177. package/dist/components/ui/markdown/streaming.d.ts.map +1 -0
  178. package/dist/components/ui/markdown/text-size.d.ts +34 -0
  179. package/dist/components/ui/markdown/text-size.d.ts.map +1 -0
  180. package/dist/components/ui/page-actions.d.ts +7 -1
  181. package/dist/components/ui/page-actions.d.ts.map +1 -1
  182. package/dist/components/ui/radio-group.d.ts.map +1 -1
  183. package/dist/components/ui/search-input.d.ts.map +1 -1
  184. package/dist/components/ui/select.d.ts.map +1 -1
  185. package/dist/components/ui/tab-navigation.d.ts +10 -1
  186. package/dist/components/ui/tab-navigation.d.ts.map +1 -1
  187. package/dist/components/ui/tag-search-input.d.ts.map +1 -1
  188. package/dist/components/ui/textarea.d.ts.map +1 -1
  189. package/dist/components/ui/truncate-text.d.ts +2 -2
  190. package/dist/components/ui/truncate-text.d.ts.map +1 -1
  191. package/dist/hooks/index.cjs +4 -2
  192. package/dist/hooks/index.cjs.map +1 -1
  193. package/dist/hooks/index.js +3 -1
  194. package/dist/hooks/ui/index.d.ts +1 -0
  195. package/dist/hooks/ui/index.d.ts.map +1 -1
  196. package/dist/hooks/ui/use-is-truncated.d.ts +33 -0
  197. package/dist/hooks/ui/use-is-truncated.d.ts.map +1 -0
  198. package/dist/index.cjs +64 -4
  199. package/dist/index.cjs.map +1 -1
  200. package/dist/index.js +75 -15
  201. package/dist/utils/index.cjs +169 -40
  202. package/dist/utils/index.cjs.map +1 -1
  203. package/dist/utils/index.d.ts +1 -0
  204. package/dist/utils/index.d.ts.map +1 -1
  205. package/dist/utils/index.js +162 -41
  206. package/dist/utils/index.js.map +1 -1
  207. package/dist/utils/markdown-fences.d.ts +42 -0
  208. package/dist/utils/markdown-fences.d.ts.map +1 -0
  209. package/dist/utils/markdown-heading-id.d.ts +85 -0
  210. package/dist/utils/markdown-heading-id.d.ts.map +1 -0
  211. package/dist/utils/markdown-section-extractor.d.ts.map +1 -1
  212. package/package.json +7 -1
  213. package/src/chat-protocol/__tests__/__snapshots__/nats-decoder-golden.test.ts.snap +317 -0
  214. package/src/chat-protocol/__tests__/chat-protocol.test.ts +516 -0
  215. package/src/chat-protocol/__tests__/env-flag.test.ts +52 -0
  216. package/src/chat-protocol/__tests__/ip-normalize.test.ts +136 -0
  217. package/src/chat-protocol/__tests__/nats-decoder-golden.test.ts +232 -0
  218. package/src/chat-protocol/decode.ts +278 -0
  219. package/src/chat-protocol/encode.ts +71 -0
  220. package/src/chat-protocol/env-flag.ts +39 -0
  221. package/src/chat-protocol/events.ts +245 -0
  222. package/src/chat-protocol/frames.ts +245 -0
  223. package/src/chat-protocol/index.ts +21 -0
  224. package/src/chat-protocol/ip-normalize.ts +146 -0
  225. package/src/chat-protocol/nats-decoder.ts +258 -0
  226. package/src/components/chat/__tests__/chat-message-list.test.tsx +293 -5
  227. package/src/components/chat/__tests__/chat-message-streaming-memo.test.tsx +207 -0
  228. package/src/components/chat/__tests__/chat-pending-turn.test.tsx +230 -0
  229. package/src/components/chat/chat-message-enhanced.tsx +122 -20
  230. package/src/components/chat/chat-message-list.tsx +358 -109
  231. package/src/components/chat/embeddable-chat.tsx +6 -0
  232. package/src/components/chat/hooks/.index.md +30 -33
  233. package/src/components/chat/hooks/.use-nats-chat-adapter.md +36 -55
  234. package/src/components/chat/hooks/__tests__/__snapshots__/conversation-id-persistence-golden.test.ts.snap +37 -0
  235. package/src/components/chat/hooks/__tests__/__snapshots__/sse-stream-golden.test.ts.snap +0 -0
  236. package/src/components/chat/hooks/__tests__/conversation-id-persistence-golden.test.ts +438 -0
  237. package/src/components/chat/hooks/__tests__/sse-stream-golden.test.ts +318 -0
  238. package/src/components/chat/hooks/index.ts +0 -1
  239. package/src/components/chat/hooks/use-chat.ts +8 -0
  240. package/src/components/chat/hooks/use-nats-chat-adapter.ts +243 -825
  241. package/src/components/chat/hooks/use-sse-chat-adapter.ts +380 -684
  242. package/src/components/chat/index.ts +5 -0
  243. package/src/components/chat/stream/__tests__/__snapshots__/chat-stream-reducer-golden.test.ts.snap +940 -0
  244. package/src/components/chat/stream/__tests__/chat-dialog-store.test.ts +756 -0
  245. package/src/components/chat/stream/__tests__/chat-stream-reducer-golden.test.ts +460 -0
  246. package/src/components/chat/stream/__tests__/chat-stream-reducer.test.ts +973 -0
  247. package/src/components/chat/stream/__tests__/delta-batcher.test.ts +255 -0
  248. package/src/components/chat/stream/__tests__/use-chat-stream-reducer.test.ts +98 -0
  249. package/src/components/chat/stream/chat-dialog-store.ts +536 -0
  250. package/src/components/chat/stream/chat-stream-reducer.ts +1808 -0
  251. package/src/components/chat/stream/delta-batcher.ts +168 -0
  252. package/src/components/chat/stream/index.ts +55 -0
  253. package/src/components/chat/stream/message-mutations.ts +340 -0
  254. package/src/components/chat/stream/use-chat-stream-reducer.ts +126 -0
  255. package/src/components/chat/thinking-display.tsx +1 -1
  256. package/src/components/chat/types/.api.types.md +39 -49
  257. package/src/components/chat/types/.processing.types.md +29 -58
  258. package/src/components/chat/types/api.types.ts +6 -73
  259. package/src/components/chat/types/processing.types.ts +11 -53
  260. package/src/components/chat/utils/.index.md +31 -40
  261. package/src/components/chat/utils/__tests__/__snapshots__/process-historical-messages-golden.test.ts.snap +420 -0
  262. package/src/components/chat/utils/__tests__/__snapshots__/segment-accumulator-golden.test.ts.snap +605 -0
  263. package/src/components/chat/utils/__tests__/process-historical-messages-golden.test.ts +394 -0
  264. package/src/components/chat/utils/__tests__/segment-accumulator-golden.test.ts +270 -0
  265. package/src/components/chat/utils/extract-incomplete-message-state.ts +63 -5
  266. package/src/components/chat/utils/index.ts +5 -8
  267. package/src/components/chat/utils/process-historical-messages.ts +358 -386
  268. package/src/components/features/select-button.tsx +4 -1
  269. package/src/components/layout/page-layout.tsx +16 -0
  270. package/src/components/layout/title-block.tsx +106 -7
  271. package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +22 -4
  272. package/src/components/shared/legal-document/legal-document-page.tsx +1 -1
  273. package/src/components/shared/product-release/release-detail-page.tsx +19 -4
  274. package/src/components/ui/.field-wrapper.md +5 -4
  275. package/src/components/ui/.tab-navigation.md +14 -1
  276. package/src/components/ui/__tests__/__snapshots__/markdown-parity.test.tsx.snap +2420 -0
  277. package/src/components/ui/__tests__/markdown-parity.test.tsx +2528 -0
  278. package/src/components/ui/autocomplete.tsx +13 -1
  279. package/src/components/ui/button/button.tsx +1 -1
  280. package/src/components/ui/checkbox-block.tsx +27 -3
  281. package/src/components/ui/date-picker.tsx +15 -1
  282. package/src/components/ui/field-wrapper.tsx +12 -6
  283. package/src/components/ui/floating-tooltip.tsx +9 -1
  284. package/src/components/ui/index.ts +1 -2
  285. package/src/components/ui/input-trigger.tsx +8 -1
  286. package/src/components/ui/input.tsx +8 -1
  287. package/src/components/ui/markdown/__tests__/mermaid-security.test.ts +115 -0
  288. package/src/components/ui/markdown/__tests__/mermaid-stale-render.test.tsx +95 -0
  289. package/src/components/ui/markdown/__tests__/sanitize-invariant.test.ts +309 -0
  290. package/src/components/ui/markdown/__tests__/streaming.test.tsx +388 -0
  291. package/src/components/ui/markdown/base-components.tsx +360 -0
  292. package/src/components/ui/markdown/engine.tsx +315 -0
  293. package/src/components/ui/markdown/heading-ids.ts +239 -0
  294. package/src/components/ui/markdown/index.ts +49 -0
  295. package/src/components/ui/markdown/mermaid-diagram.tsx +291 -0
  296. package/src/components/ui/markdown/rich/embed-overrides.tsx +199 -0
  297. package/src/components/ui/markdown/rich/rich-markdown-renderer.tsx +184 -0
  298. package/src/components/ui/markdown/rich/shortcodes.ts +170 -0
  299. package/src/components/ui/markdown/sanitize.ts +3499 -0
  300. package/src/components/ui/markdown/simple-markdown-renderer.tsx +28 -0
  301. package/src/components/ui/markdown/streaming.ts +362 -0
  302. package/src/components/ui/markdown/text-size.ts +106 -0
  303. package/src/components/ui/page-actions.tsx +142 -30
  304. package/src/components/ui/radio-group.tsx +28 -3
  305. package/src/components/ui/release-changelog-section.tsx +1 -1
  306. package/src/components/ui/search-input.tsx +2 -1
  307. package/src/components/ui/select.tsx +7 -0
  308. package/src/components/ui/tab-navigation.tsx +26 -4
  309. package/src/components/ui/tag-search-input.tsx +9 -2
  310. package/src/components/ui/textarea.tsx +8 -1
  311. package/src/components/ui/ticket-info-section.tsx +1 -1
  312. package/src/components/ui/truncate-text.tsx +3 -18
  313. package/src/hooks/ui/index.ts +1 -0
  314. package/src/hooks/ui/use-is-truncated.ts +66 -0
  315. package/src/utils/index.ts +1 -0
  316. package/src/utils/markdown-fences.ts +127 -0
  317. package/src/utils/markdown-heading-id.ts +348 -0
  318. package/src/utils/markdown-section-extractor.ts +41 -56
  319. package/dist/chunk-7I42V2OD.cjs.map +0 -1
  320. package/dist/chunk-AIRNG27G.js.map +0 -1
  321. package/dist/chunk-BIKOJ4FH.cjs.map +0 -1
  322. package/dist/chunk-BZMOEWWS.js.map +0 -1
  323. package/dist/chunk-GZK7FWJJ.js.map +0 -1
  324. package/dist/chunk-IEZ3YBAP.cjs.map +0 -1
  325. package/dist/chunk-OQIMH2WQ.js.map +0 -1
  326. package/dist/chunk-PB3BTZDU.js.map +0 -1
  327. package/dist/chunk-STYA77PH.cjs.map +0 -1
  328. package/dist/chunk-VUXNXWOQ.cjs.map +0 -1
  329. package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts +0 -6
  330. package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts.map +0 -1
  331. package/dist/components/chat/utils/chunk-parser.d.ts +0 -25
  332. package/dist/components/chat/utils/chunk-parser.d.ts.map +0 -1
  333. package/dist/components/ui/rich-markdown-renderer.d.ts +0 -34
  334. package/dist/components/ui/rich-markdown-renderer.d.ts.map +0 -1
  335. package/dist/components/ui/simple-markdown-renderer.d.ts +0 -73
  336. package/dist/components/ui/simple-markdown-renderer.d.ts.map +0 -1
  337. package/src/components/chat/hooks/.use-realtime-chunk-processor.md +0 -77
  338. package/src/components/chat/hooks/use-realtime-chunk-processor.ts +0 -489
  339. package/src/components/chat/utils/.chunk-parser.md +0 -62
  340. package/src/components/chat/utils/chunk-parser.ts +0 -262
  341. package/src/components/ui/.simple-markdown-renderer.md +0 -52
  342. package/src/components/ui/rich-markdown-renderer.tsx +0 -1223
  343. package/src/components/ui/simple-markdown-renderer.tsx +0 -964
  344. /package/dist/{chunk-WLM3F3WU.js.map → chunk-34TDA22K.js.map} +0 -0
  345. /package/dist/{chunk-EGXCWZYP.js.map → chunk-3LKB722U.js.map} +0 -0
  346. /package/dist/{chunk-RW2LPL72.js.map → chunk-6WTCJI5R.js.map} +0 -0
  347. /package/dist/{chunk-VL2YMDPH.js.map → chunk-J3VBVR4W.js.map} +0 -0
  348. /package/dist/{chunk-6CJ2K7BD.js.map → chunk-MZRIRQYV.js.map} +0 -0
  349. /package/dist/{chunk-NGEFYPY7.js.map → chunk-NCAN6VUF.js.map} +0 -0
  350. /package/dist/{chunk-6QK3ONDD.js.map → chunk-OL3MJKUI.js.map} +0 -0
  351. /package/dist/{chunk-MPYDX5WX.js.map → chunk-PLB6CQSO.js.map} +0 -0
  352. /package/dist/{chunk-6CFFISUC.js.map → chunk-PTXZB2KW.js.map} +0 -0
  353. /package/dist/{chunk-VDZO6IDR.js.map → chunk-XOFE2RT4.js.map} +0 -0
@@ -0,0 +1,484 @@
1
+ // src/chat-protocol/frames.ts
2
+ var FRAME_TERMINATOR = "\0";
3
+ var END_OF_LEADING = "";
4
+ var TRAILER_SENTINEL = "";
5
+
6
+ // src/chat-protocol/events.ts
7
+ var CHAT_OWNER_ADMIN = "ADMIN";
8
+
9
+ // src/chat-protocol/encode.ts
10
+ var encoder = new TextEncoder();
11
+ var SENTINEL_BYTES_RE = /[\u0000\u001E\u001F]/g;
12
+ function stripSentinelBytes(text) {
13
+ return text.replace(SENTINEL_BYTES_RE, "");
14
+ }
15
+ function encodeLeadingFrame(frame) {
16
+ return encoder.encode(JSON.stringify(frame) + FRAME_TERMINATOR);
17
+ }
18
+ function encodeEndOfLeading() {
19
+ return encoder.encode(END_OF_LEADING);
20
+ }
21
+ function encodeTextDelta(text) {
22
+ return encoder.encode(stripSentinelBytes(text));
23
+ }
24
+ function encodeTrailingUsageFrame(frame) {
25
+ return encoder.encode(TRAILER_SENTINEL + JSON.stringify(frame));
26
+ }
27
+
28
+ // src/chat-protocol/decode.ts
29
+ function escapeThinkingTags(text) {
30
+ return text.replace(/</g, "&lt;");
31
+ }
32
+ function mapLeadingFrame(meta, out) {
33
+ if (meta.status === "thinking") {
34
+ out.push({ type: "status", phase: "thinking" });
35
+ } else if (meta.kind === "thinking-delta" && typeof meta.text === "string") {
36
+ out.push({ type: "thinking-delta", text: meta.text });
37
+ } else if (meta.kind === "usage" && meta.stage === "start") {
38
+ out.push({
39
+ type: "usage",
40
+ stage: "start",
41
+ input_tokens: meta.input_tokens,
42
+ cache_read_input_tokens: meta.cache_read_input_tokens,
43
+ cache_creation_input_tokens: meta.cache_creation_input_tokens
44
+ });
45
+ } else if (meta.kind === "decision_resolved" && typeof meta.action === "string") {
46
+ const status = meta.action === "rejected" ? "rejected" : "approved";
47
+ const toolName = typeof meta.tool_name === "string" ? meta.tool_name : void 0;
48
+ const result = meta.result ?? null;
49
+ const card = meta.card ?? null;
50
+ out.push({
51
+ type: "approval-resolved",
52
+ status,
53
+ ok: meta.ok === true,
54
+ willAutoContinue: meta.willAutoContinue === true,
55
+ ...toolName ? { toolName } : {},
56
+ ...result ? { result } : {},
57
+ ...card?.marker ? { marker: card.marker } : {},
58
+ ...card?.ref ? { cardRef: card.ref } : {},
59
+ ...card?.type ? { cardType: card.type } : {},
60
+ ...typeof meta.receiptText === "string" ? { receiptText: meta.receiptText } : {},
61
+ requestId: typeof meta.proposalId === "string" ? meta.proposalId : void 0
62
+ });
63
+ } else if (meta.kind === "approval_request" && meta.proposalId) {
64
+ const proposalId = String(meta.proposalId);
65
+ const toolName = String(meta.toolName ?? "tool");
66
+ const headline = typeof meta.title === "string" && meta.title.length > 0 ? meta.title : toolName;
67
+ const rawFields = Array.isArray(meta.fields) ? meta.fields : [];
68
+ const fields = [];
69
+ for (const f of rawFields) {
70
+ if (!f || !f.label || !f.value) continue;
71
+ fields.push({ label: f.label, value: f.value });
72
+ }
73
+ out.push({
74
+ type: "approval-request",
75
+ requestId: proposalId,
76
+ approvalType: toolName,
77
+ command: headline,
78
+ fields,
79
+ status: "pending"
80
+ });
81
+ } else if (meta.kind === "text-leading" && typeof meta.text === "string") {
82
+ out.push({ type: "text-delta", text: meta.text, leading: true });
83
+ } else if (meta.kind === "tool_error") {
84
+ const msg = typeof meta.message === "string" && meta.message.length > 0 ? meta.message : "Could not complete the requested action right now.";
85
+ out.push({ type: "error", title: msg });
86
+ } else if (meta.kind === "routing") {
87
+ if (typeof meta.routedComplexity === "string") {
88
+ out.push({
89
+ type: "metadata",
90
+ routing: {
91
+ routedComplexity: meta.routedComplexity,
92
+ ...typeof meta.routedModel === "string" ? { routedModel: meta.routedModel } : {},
93
+ routedThinkingBudget: typeof meta.routedThinkingBudget === "number" ? meta.routedThinkingBudget : null
94
+ }
95
+ });
96
+ }
97
+ } else {
98
+ out.push({
99
+ type: "metadata",
100
+ sources: meta.sources,
101
+ refs: meta.refs,
102
+ provider: meta.provider,
103
+ modelLabel: meta.modelLabel,
104
+ modelName: meta.model,
105
+ contextWindowMaxTokens: meta.contextWindowMaxTokens,
106
+ scrollAnchor: meta.scrollAnchor,
107
+ conversationId: meta.conversationId
108
+ });
109
+ }
110
+ }
111
+ function createSseFrameDecoder() {
112
+ const textDecoder = new TextDecoder();
113
+ let buffer = "";
114
+ let inText = false;
115
+ let inTrailer = false;
116
+ let trailerBuffer = "";
117
+ let ended = false;
118
+ function push(bytes) {
119
+ const out = [];
120
+ const chunk = textDecoder.decode(bytes, { stream: true });
121
+ if (!inText) {
122
+ buffer += chunk;
123
+ while (!inText) {
124
+ const recIdx = buffer.indexOf(END_OF_LEADING);
125
+ const nullIdx = buffer.indexOf(FRAME_TERMINATOR);
126
+ if (recIdx !== -1 && (nullIdx === -1 || recIdx < nullIdx)) {
127
+ inText = true;
128
+ out.push({ type: "turn-start" });
129
+ const after = buffer.slice(recIdx + 1);
130
+ buffer = "";
131
+ if (after) {
132
+ const unitIdx = after.indexOf(TRAILER_SENTINEL);
133
+ if (unitIdx === -1) {
134
+ out.push({ type: "text-delta", text: after });
135
+ } else {
136
+ const textBefore = after.slice(0, unitIdx);
137
+ const trailerAfter = after.slice(unitIdx + 1);
138
+ if (textBefore) {
139
+ out.push({ type: "text-delta", text: textBefore });
140
+ }
141
+ inTrailer = true;
142
+ trailerBuffer = trailerAfter;
143
+ }
144
+ }
145
+ break;
146
+ }
147
+ if (nullIdx === -1) break;
148
+ const metaStr = buffer.slice(0, nullIdx);
149
+ const remaining = buffer.slice(nullIdx + 1);
150
+ let meta;
151
+ try {
152
+ meta = JSON.parse(metaStr);
153
+ } catch {
154
+ inText = true;
155
+ out.push({ type: "turn-start", implicit: true });
156
+ if (buffer.length > 0) {
157
+ out.push({ type: "text-delta", text: buffer });
158
+ buffer = "";
159
+ }
160
+ break;
161
+ }
162
+ mapLeadingFrame(meta, out);
163
+ buffer = remaining;
164
+ }
165
+ } else if (inTrailer) {
166
+ trailerBuffer += chunk;
167
+ } else {
168
+ const sepIdx = chunk.indexOf(TRAILER_SENTINEL);
169
+ if (sepIdx === -1) {
170
+ out.push({ type: "text-delta", text: chunk });
171
+ } else {
172
+ const before = chunk.slice(0, sepIdx);
173
+ const after = chunk.slice(sepIdx + 1);
174
+ if (before) out.push({ type: "text-delta", text: before });
175
+ inTrailer = true;
176
+ trailerBuffer = after;
177
+ }
178
+ }
179
+ return out;
180
+ }
181
+ function end() {
182
+ if (ended) return [];
183
+ ended = true;
184
+ const out = [];
185
+ if (trailerBuffer.length > 0) {
186
+ const raw = trailerBuffer;
187
+ trailerBuffer = "";
188
+ try {
189
+ const meta = JSON.parse(raw);
190
+ if (meta.kind === "usage" && (meta.stage === "end" || meta.stage === "display")) {
191
+ out.push({
192
+ type: "usage",
193
+ stage: "end",
194
+ input_tokens: meta.input_tokens,
195
+ output_tokens: meta.output_tokens,
196
+ cache_read_input_tokens: meta.cache_read_input_tokens,
197
+ cache_creation_input_tokens: meta.cache_creation_input_tokens,
198
+ hit_rate_pct: meta.hit_rate_pct,
199
+ telemetry: meta.telemetry,
200
+ breakdown: meta.breakdown,
201
+ debug: meta.debug
202
+ });
203
+ }
204
+ } catch {
205
+ }
206
+ }
207
+ return out;
208
+ }
209
+ return { push, end };
210
+ }
211
+
212
+ // src/components/chat/types/message.types.ts
213
+ var MESSAGE_TYPE = {
214
+ TEXT: "TEXT",
215
+ THINKING: "THINKING",
216
+ GUIDE: "GUIDE",
217
+ EXECUTING_TOOL: "EXECUTING_TOOL",
218
+ EXECUTED_TOOL: "EXECUTED_TOOL",
219
+ APPROVAL_REQUEST: "APPROVAL_REQUEST",
220
+ APPROVAL_RESULT: "APPROVAL_RESULT",
221
+ ERROR: "ERROR",
222
+ MESSAGE_START: "MESSAGE_START",
223
+ MESSAGE_END: "MESSAGE_END",
224
+ MESSAGE_REQUEST: "MESSAGE_REQUEST",
225
+ AI_METADATA: "AI_METADATA",
226
+ TOKEN_USAGE: "TOKEN_USAGE",
227
+ CONTEXT_COMPACTION_START: "CONTEXT_COMPACTION_START",
228
+ CONTEXT_COMPACTION_END: "CONTEXT_COMPACTION_END",
229
+ DIRECT_MESSAGE: "DIRECT_MESSAGE",
230
+ SYSTEM: "SYSTEM",
231
+ DIALOG_CLOSED: "DIALOG_CLOSED"
232
+ };
233
+
234
+ // src/chat-protocol/nats-decoder.ts
235
+ function normalizeToolCalls(raw) {
236
+ if (!Array.isArray(raw)) return [];
237
+ return raw.filter((item) => !!item && typeof item === "object").map((item) => ({
238
+ toolExecutionRequestId: String(item.toolExecutionRequestId ?? ""),
239
+ toolName: String(item.toolName ?? ""),
240
+ toolTitle: typeof item.toolTitle === "string" ? item.toolTitle : void 0,
241
+ toolExplanation: typeof item.toolExplanation === "string" ? item.toolExplanation : void 0,
242
+ toolType: typeof item.toolType === "string" ? item.toolType : void 0,
243
+ requiresApproval: item.requiresApproval === true,
244
+ approvalType: typeof item.approvalType === "string" ? item.approvalType : null,
245
+ toolCallArguments: item.toolCallArguments && typeof item.toolCallArguments === "object" ? item.toolCallArguments : null
246
+ }));
247
+ }
248
+ function decodeNatsChunk(chunk) {
249
+ if (!chunk || typeof chunk !== "object") return null;
250
+ const data = chunk;
251
+ const type = String(data.type || "");
252
+ const seq = typeof data.streamSeq === "number" ? { seq: data.streamSeq } : {};
253
+ switch (type) {
254
+ case MESSAGE_TYPE.MESSAGE_START:
255
+ return { type: "turn-start", ...seq };
256
+ case MESSAGE_TYPE.MESSAGE_END:
257
+ return { type: "turn-end", ...seq };
258
+ case MESSAGE_TYPE.AI_METADATA: {
259
+ const providerName = data.providerName || data.provider;
260
+ if (typeof data.modelName === "string" && typeof providerName === "string") {
261
+ return {
262
+ type: "metadata",
263
+ modelLabel: data.modelDisplayName,
264
+ modelName: data.modelName,
265
+ provider: providerName,
266
+ contextWindowMaxTokens: typeof data.contextWindow === "number" ? data.contextWindow : 0,
267
+ ...seq
268
+ };
269
+ }
270
+ return null;
271
+ }
272
+ case MESSAGE_TYPE.TEXT:
273
+ if (typeof data.text === "string") {
274
+ return { type: "text-delta", text: data.text, ...seq };
275
+ }
276
+ return null;
277
+ case MESSAGE_TYPE.THINKING:
278
+ if (typeof data.text === "string") {
279
+ return { type: "thinking-delta", text: data.text, ...seq };
280
+ }
281
+ return null;
282
+ case MESSAGE_TYPE.GUIDE:
283
+ if (typeof data.text === "string") {
284
+ return { type: "guide-delta", text: data.text, ...seq };
285
+ }
286
+ return null;
287
+ case MESSAGE_TYPE.EXECUTING_TOOL:
288
+ return {
289
+ type: "tool-execution",
290
+ data: {
291
+ type: "EXECUTING_TOOL",
292
+ integratedToolType: data.integratedToolType || "",
293
+ toolFunction: data.toolFunction || "",
294
+ toolTitle: typeof data.title === "string" ? data.title : void 0,
295
+ parameters: data.parameters,
296
+ toolExecutionRequestId: typeof data.toolExecutionRequestId === "string" ? data.toolExecutionRequestId : void 0
297
+ },
298
+ ...seq
299
+ };
300
+ case MESSAGE_TYPE.EXECUTED_TOOL:
301
+ return {
302
+ type: "tool-execution",
303
+ data: {
304
+ type: "EXECUTED_TOOL",
305
+ integratedToolType: data.integratedToolType || "",
306
+ toolFunction: data.toolFunction || "",
307
+ toolTitle: typeof data.title === "string" ? data.title : void 0,
308
+ parameters: data.parameters,
309
+ result: data.result,
310
+ success: data.success,
311
+ toolExecutionRequestId: typeof data.toolExecutionRequestId === "string" ? data.toolExecutionRequestId : void 0
312
+ },
313
+ ...seq
314
+ };
315
+ case MESSAGE_TYPE.APPROVAL_REQUEST: {
316
+ const requestId = data.approvalRequestId || data.approval_request_id || "";
317
+ const approvalType = data.approvalType || "USER";
318
+ const toolCalls = normalizeToolCalls(data.toolCalls);
319
+ if (toolCalls.length > 0) {
320
+ return { type: "approval-request", requestId, approvalType, toolCalls, ...seq };
321
+ }
322
+ return {
323
+ type: "approval-request",
324
+ requestId,
325
+ approvalType,
326
+ command: data.command || "",
327
+ explanation: data.explanation,
328
+ ...seq
329
+ };
330
+ }
331
+ case MESSAGE_TYPE.APPROVAL_RESULT: {
332
+ const resolvedByName = typeof data.resolvedByName === "string" ? data.resolvedByName : typeof data.displayName === "string" ? data.displayName : void 0;
333
+ return {
334
+ type: "approval-resolved",
335
+ requestId: data.approvalRequestId || data.approval_request_id || "",
336
+ status: data.approved === true ? "approved" : "rejected",
337
+ approvalType: data.approvalType || "CLIENT",
338
+ resolvedByName,
339
+ ...seq
340
+ };
341
+ }
342
+ case MESSAGE_TYPE.ERROR:
343
+ return {
344
+ type: "error",
345
+ title: data.error || "An error occurred",
346
+ details: data.details,
347
+ ...seq
348
+ };
349
+ case MESSAGE_TYPE.MESSAGE_REQUEST:
350
+ return {
351
+ type: "participant",
352
+ kind: "message-request",
353
+ text: String(data.text || ""),
354
+ ownerType: typeof data.ownerType === "string" ? data.ownerType : void 0,
355
+ displayName: typeof data.displayName === "string" ? data.displayName : void 0,
356
+ userId: typeof data.userId === "string" ? data.userId : void 0,
357
+ // Wire shape carries no label; fall back to the id (parity with
358
+ // the history path in `process-historical-messages.ts`).
359
+ contextItems: Array.isArray(data.contextItems) ? data.contextItems.filter((it) => typeof it?.type === "string" && typeof it?.id === "string").map((it) => ({
360
+ type: it.type,
361
+ id: it.id,
362
+ label: it.id
363
+ })) : void 0,
364
+ ...seq
365
+ };
366
+ case MESSAGE_TYPE.TOKEN_USAGE:
367
+ return {
368
+ type: "token-usage",
369
+ inputTokensSize: data.inputTokensSize ?? 0,
370
+ outputTokensSize: data.outputTokensSize ?? 0,
371
+ totalTokensSize: data.totalTokensSize ?? 0,
372
+ contextSize: data.contextSize ?? 0,
373
+ ...seq
374
+ };
375
+ case MESSAGE_TYPE.CONTEXT_COMPACTION_START:
376
+ return { type: "compaction", phase: "start", ...seq };
377
+ case MESSAGE_TYPE.CONTEXT_COMPACTION_END:
378
+ return {
379
+ type: "compaction",
380
+ phase: "end",
381
+ summary: typeof data.text === "string" ? data.text : void 0,
382
+ ...seq
383
+ };
384
+ case MESSAGE_TYPE.SYSTEM:
385
+ if (typeof data.text === "string") {
386
+ return { type: "participant", kind: "system", text: data.text, ...seq };
387
+ }
388
+ return null;
389
+ case MESSAGE_TYPE.DIRECT_MESSAGE:
390
+ if (typeof data.text === "string") {
391
+ return {
392
+ type: "participant",
393
+ kind: "direct-message",
394
+ text: data.text,
395
+ ownerType: typeof data.ownerType === "string" ? data.ownerType : void 0,
396
+ displayName: typeof data.displayName === "string" ? data.displayName : void 0,
397
+ userId: typeof data.userId === "string" ? data.userId : void 0,
398
+ ...seq
399
+ };
400
+ }
401
+ return null;
402
+ case MESSAGE_TYPE.DIALOG_CLOSED:
403
+ return { type: "dialog-closed", ...seq };
404
+ default:
405
+ return null;
406
+ }
407
+ }
408
+
409
+ // src/chat-protocol/ip-normalize.ts
410
+ var IP_BUCKET_KEY_MAX_LENGTH = 64;
411
+ function isIpv4(value) {
412
+ const parts = value.split(".");
413
+ if (parts.length !== 4) return false;
414
+ for (const part of parts) {
415
+ if (!/^\d{1,3}$/.test(part)) return false;
416
+ if (part.length > 1 && part.startsWith("0")) return false;
417
+ if (Number(part) > 255) return false;
418
+ }
419
+ return true;
420
+ }
421
+ function isIpv6(value) {
422
+ if (!value.includes(":")) return false;
423
+ if (!/^[0-9a-f:.]+$/.test(value)) return false;
424
+ if (value.includes(":::")) return false;
425
+ if (value.endsWith(":") && !value.endsWith("::")) return false;
426
+ if (value.startsWith(":") && !value.startsWith("::")) return false;
427
+ const compressions = value.split("::").length - 1;
428
+ if (compressions > 1) return false;
429
+ const groups = value.split(":");
430
+ if (groups.length > 8) return false;
431
+ for (let i = 0; i < groups.length; i += 1) {
432
+ const group = groups[i];
433
+ if (group === "") continue;
434
+ if (group.includes(".")) {
435
+ if (i !== groups.length - 1) return false;
436
+ if (!isIpv4(group)) return false;
437
+ continue;
438
+ }
439
+ if (!/^[0-9a-f]{1,4}$/.test(group)) return false;
440
+ }
441
+ if (compressions === 0) {
442
+ const embedsIpv4 = groups[groups.length - 1]?.includes(".") ?? false;
443
+ if (groups.length !== (embedsIpv4 ? 7 : 8)) return false;
444
+ }
445
+ return true;
446
+ }
447
+ function normalizeIpForBucketKey(value) {
448
+ if (typeof value !== "string") return null;
449
+ let candidate = value.trim();
450
+ if (candidate === "" || candidate.length > IP_BUCKET_KEY_MAX_LENGTH) return null;
451
+ if (candidate.startsWith("[")) {
452
+ const close = candidate.indexOf("]");
453
+ if (close === -1) return null;
454
+ const trailer = candidate.slice(close + 1);
455
+ if (trailer !== "" && !/^:\d{1,5}$/.test(trailer)) return null;
456
+ candidate = candidate.slice(1, close);
457
+ }
458
+ const zone = candidate.indexOf("%");
459
+ if (zone !== -1) candidate = candidate.slice(0, zone);
460
+ if (candidate === "") return null;
461
+ const portSplit = candidate.lastIndexOf(":");
462
+ if (portSplit > 0 && /^\d{1,5}$/.test(candidate.slice(portSplit + 1))) {
463
+ const head = candidate.slice(0, portSplit);
464
+ if (isIpv4(head)) candidate = head;
465
+ }
466
+ if (isIpv4(candidate)) return candidate;
467
+ const lowered = candidate.toLowerCase();
468
+ const mapped = /^(?:(?:0{1,4}:){5}|::)ffff:(\d{1,3}(?:\.\d{1,3}){3})$/.exec(lowered);
469
+ if (mapped) return isIpv4(mapped[1]) ? mapped[1] : null;
470
+ if (isIpv6(lowered)) return lowered;
471
+ return null;
472
+ }
473
+
474
+ // src/chat-protocol/env-flag.ts
475
+ function envFlagEnabled(name) {
476
+ const raw = process.env[name];
477
+ if (!raw) return false;
478
+ const v = raw.trim().toLowerCase();
479
+ return v !== "" && v !== "0" && v !== "false" && v !== "off";
480
+ }
481
+
482
+ export { CHAT_OWNER_ADMIN, END_OF_LEADING, FRAME_TERMINATOR, IP_BUCKET_KEY_MAX_LENGTH, TRAILER_SENTINEL, createSseFrameDecoder, decodeNatsChunk, encodeEndOfLeading, encodeLeadingFrame, encodeTextDelta, encodeTrailingUsageFrame, envFlagEnabled, escapeThinkingTags, normalizeIpForBucketKey, stripSentinelBytes };
483
+ //# sourceMappingURL=index.js.map
484
+ //# sourceMappingURL=index.js.map