@flamingo-stack/openframe-frontend-core 0.0.508 → 0.0.509
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.
- package/dist/chat-protocol/decode.d.ts +58 -0
- package/dist/chat-protocol/decode.d.ts.map +1 -0
- package/dist/chat-protocol/encode.d.ts +44 -0
- package/dist/chat-protocol/encode.d.ts.map +1 -0
- package/dist/chat-protocol/env-flag.d.ts +35 -0
- package/dist/chat-protocol/env-flag.d.ts.map +1 -0
- package/dist/chat-protocol/events.d.ts +216 -0
- package/dist/chat-protocol/events.d.ts.map +1 -0
- package/dist/chat-protocol/frames.d.ts +213 -0
- package/dist/chat-protocol/frames.d.ts.map +1 -0
- package/dist/chat-protocol/index.cjs +506 -0
- package/dist/chat-protocol/index.cjs.map +1 -0
- package/dist/chat-protocol/index.d.ts +18 -0
- package/dist/chat-protocol/index.d.ts.map +1 -0
- package/dist/chat-protocol/index.js +490 -0
- package/dist/chat-protocol/index.js.map +1 -0
- package/dist/chat-protocol/ip-normalize.d.ts +44 -0
- package/dist/chat-protocol/ip-normalize.d.ts.map +1 -0
- package/dist/chat-protocol/nats-decoder.d.ts +26 -0
- package/dist/chat-protocol/nats-decoder.d.ts.map +1 -0
- package/dist/{chunk-3SQ5KXHQ.cjs → chunk-2T4GTV25.cjs} +9 -9
- package/dist/{chunk-3SQ5KXHQ.cjs.map → chunk-2T4GTV25.cjs.map} +1 -1
- package/dist/{chunk-CWAOV2FK.cjs → chunk-3CGZPAGR.cjs} +3 -3
- package/dist/{chunk-CWAOV2FK.cjs.map → chunk-3CGZPAGR.cjs.map} +1 -1
- package/dist/{chunk-TLMJHMXJ.js → chunk-3QSR22IC.js} +12 -12
- package/dist/chunk-3QSR22IC.js.map +1 -0
- package/dist/{chunk-TWYNR4TZ.cjs → chunk-4G5TLHJD.cjs} +7141 -4799
- package/dist/chunk-4G5TLHJD.cjs.map +1 -0
- package/dist/{chunk-ADPMHWOE.js → chunk-72XAID7Y.js} +4 -4
- package/dist/{chunk-PAGKRNWK.js → chunk-7WZHBQ4J.js} +2 -2
- package/dist/{chunk-OCEKO5CW.js → chunk-AEELJC4N.js} +12106 -9764
- package/dist/chunk-AEELJC4N.js.map +1 -0
- package/dist/{chunk-Z42BGM6Q.cjs → chunk-BT2WWDFP.cjs} +5 -5
- package/dist/{chunk-Z42BGM6Q.cjs.map → chunk-BT2WWDFP.cjs.map} +1 -1
- package/dist/{chunk-7LEL3RIX.cjs → chunk-C7OY3PQP.cjs} +11 -11
- package/dist/{chunk-7LEL3RIX.cjs.map → chunk-C7OY3PQP.cjs.map} +1 -1
- package/dist/{chunk-RHGGEKPQ.cjs → chunk-CIOLOQKQ.cjs} +4 -4
- package/dist/{chunk-RHGGEKPQ.cjs.map → chunk-CIOLOQKQ.cjs.map} +1 -1
- package/dist/{chunk-TSZHM74B.js → chunk-DC2TKS7C.js} +2 -2
- package/dist/{chunk-M2GOR3XQ.cjs → chunk-DYPYR7FR.cjs} +87 -87
- package/dist/{chunk-M2GOR3XQ.cjs.map → chunk-DYPYR7FR.cjs.map} +1 -1
- package/dist/{chunk-I64ABCDX.js → chunk-I2B6X77L.js} +2 -2
- package/dist/{chunk-NIZDKTGL.cjs → chunk-K5MSCMDK.cjs} +37 -37
- package/dist/{chunk-NIZDKTGL.cjs.map → chunk-K5MSCMDK.cjs.map} +1 -1
- package/dist/{chunk-DTYRYB2N.js → chunk-K6QTZ7CZ.js} +2 -2
- package/dist/{chunk-4LTMXDUS.js → chunk-KBN7PMFT.js} +2 -2
- package/dist/{chunk-TBMV7I5N.js → chunk-KXZO2WZX.js} +2 -2
- package/dist/{chunk-QTYZMP6D.cjs → chunk-LBAKLT6T.cjs} +62 -62
- package/dist/chunk-LBAKLT6T.cjs.map +1 -0
- package/dist/{chunk-KEBYLU3U.js → chunk-LFUPI7VX.js} +2 -2
- package/dist/{chunk-LDTR4IVZ.cjs → chunk-M37PBG4N.cjs} +31 -31
- package/dist/{chunk-LDTR4IVZ.cjs.map → chunk-M37PBG4N.cjs.map} +1 -1
- package/dist/{chunk-WA7RR64F.js → chunk-PO5O654H.js} +6 -5
- package/dist/chunk-PO5O654H.js.map +1 -0
- package/dist/{chunk-WK4N5VBX.cjs → chunk-QJJISLPA.cjs} +28 -27
- package/dist/chunk-QJJISLPA.cjs.map +1 -0
- package/dist/{chunk-2F44PLTV.cjs → chunk-T7MCSA55.cjs} +26 -26
- package/dist/{chunk-2F44PLTV.cjs.map → chunk-T7MCSA55.cjs.map} +1 -1
- package/dist/{chunk-WJQHJD7J.js → chunk-TWSKTJHW.js} +2 -2
- package/dist/{chunk-ZSQHZYCO.cjs → chunk-UQDMJ6DH.cjs} +13 -13
- package/dist/{chunk-ZSQHZYCO.cjs.map → chunk-UQDMJ6DH.cjs.map} +1 -1
- package/dist/{chunk-TZRUCD56.js → chunk-V3ZAAFE3.js} +5 -5
- package/dist/{chunk-LRGHJPET.js → chunk-XGIFOHKE.js} +2 -2
- package/dist/{chunk-POOMO3PA.cjs → chunk-YQEPRYT5.cjs} +7 -7
- package/dist/{chunk-POOMO3PA.cjs.map → chunk-YQEPRYT5.cjs.map} +1 -1
- package/dist/components/case-studies/index.cjs +8 -8
- package/dist/components/case-studies/index.js +2 -2
- package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
- package/dist/components/chat/chat-message-list.d.ts.map +1 -1
- package/dist/components/chat/hooks/index.d.ts +0 -1
- package/dist/components/chat/hooks/index.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-chat.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-chunk-catchup.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts +15 -48
- package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts +10 -57
- package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +10 -2
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.d.ts +1 -0
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +21 -13
- package/dist/components/chat/stream/chat-dialog-store.d.ts +184 -0
- package/dist/components/chat/stream/chat-dialog-store.d.ts.map +1 -0
- package/dist/components/chat/stream/chat-stream-reducer.d.ts +380 -0
- package/dist/components/chat/stream/chat-stream-reducer.d.ts.map +1 -0
- package/dist/components/chat/stream/delta-batcher.d.ts +51 -0
- package/dist/components/chat/stream/delta-batcher.d.ts.map +1 -0
- package/dist/components/chat/stream/index.d.ts +17 -0
- package/dist/components/chat/stream/index.d.ts.map +1 -0
- package/dist/components/chat/stream/message-mutations.d.ts +77 -0
- package/dist/components/chat/stream/message-mutations.d.ts.map +1 -0
- package/dist/components/chat/stream/use-chat-stream-reducer.d.ts +22 -0
- package/dist/components/chat/stream/use-chat-stream-reducer.d.ts.map +1 -0
- package/dist/components/chat/types/api.types.d.ts +1 -81
- package/dist/components/chat/types/api.types.d.ts.map +1 -1
- package/dist/components/chat/types/processing.types.d.ts +2 -93
- package/dist/components/chat/types/processing.types.d.ts.map +1 -1
- package/dist/components/chat/types/unified-chat-state.types.d.ts +15 -0
- package/dist/components/chat/types/unified-chat-state.types.d.ts.map +1 -1
- package/dist/components/chat/utils/extract-incomplete-message-state.d.ts +34 -6
- package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
- package/dist/components/chat/utils/history-merge.d.ts.map +1 -1
- package/dist/components/chat/utils/index.d.ts +2 -3
- package/dist/components/chat/utils/index.d.ts.map +1 -1
- package/dist/components/chat/utils/process-historical-messages.d.ts +59 -11
- package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/docs/index.cjs +5 -5
- package/dist/components/docs/index.js +4 -4
- package/dist/components/embeds/index.cjs +3 -3
- package/dist/components/embeds/index.js +2 -2
- package/dist/components/faq/index.cjs +3 -3
- package/dist/components/faq/index.js +2 -2
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.js +1 -1
- package/dist/components/help-center-pages/index.cjs +22 -22
- package/dist/components/help-center-pages/index.js +13 -13
- package/dist/components/index.cjs +174 -132
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +65 -23
- package/dist/components/index.js.map +1 -1
- package/dist/components/meeting-scheduler/index.cjs +34 -34
- package/dist/components/meeting-scheduler/index.js +3 -3
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/onboarding-guides/index.cjs +5 -5
- package/dist/components/onboarding-guides/index.js +4 -4
- package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
- package/dist/components/related-content/index.cjs +3 -3
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
- package/dist/components/tickets/index.cjs +6 -6
- package/dist/components/tickets/index.js +5 -5
- package/dist/components/ui/index.cjs +44 -2
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.d.ts +1 -2
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +55 -13
- package/dist/components/ui/markdown/base-components.d.ts +51 -0
- package/dist/components/ui/markdown/base-components.d.ts.map +1 -0
- package/dist/components/ui/markdown/engine.d.ts +99 -0
- package/dist/components/ui/markdown/engine.d.ts.map +1 -0
- package/dist/components/ui/markdown/heading-ids.d.ts +65 -0
- package/dist/components/ui/markdown/heading-ids.d.ts.map +1 -0
- package/dist/components/ui/markdown/index.d.ts +18 -0
- package/dist/components/ui/markdown/index.d.ts.map +1 -0
- package/dist/components/ui/markdown/mermaid-diagram.d.ts +79 -0
- package/dist/components/ui/markdown/mermaid-diagram.d.ts.map +1 -0
- package/dist/components/ui/markdown/rich/embed-overrides.d.ts +14 -0
- package/dist/components/ui/markdown/rich/embed-overrides.d.ts.map +1 -0
- package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts +40 -0
- package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts.map +1 -0
- package/dist/components/ui/markdown/rich/shortcodes.d.ts +8 -0
- package/dist/components/ui/markdown/rich/shortcodes.d.ts.map +1 -0
- package/dist/components/ui/markdown/sanitize.d.ts +153 -0
- package/dist/components/ui/markdown/sanitize.d.ts.map +1 -0
- package/dist/components/ui/markdown/simple-markdown-renderer.d.ts +23 -0
- package/dist/components/ui/markdown/simple-markdown-renderer.d.ts.map +1 -0
- package/dist/components/ui/markdown/streaming.d.ts +78 -0
- package/dist/components/ui/markdown/streaming.d.ts.map +1 -0
- package/dist/components/ui/markdown/text-size.d.ts +34 -0
- package/dist/components/ui/markdown/text-size.d.ts.map +1 -0
- package/dist/index.cjs +60 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +71 -13
- package/dist/utils/index.cjs +169 -40
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +162 -41
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/markdown-fences.d.ts +42 -0
- package/dist/utils/markdown-fences.d.ts.map +1 -0
- package/dist/utils/markdown-heading-id.d.ts +85 -0
- package/dist/utils/markdown-heading-id.d.ts.map +1 -0
- package/dist/utils/markdown-section-extractor.d.ts.map +1 -1
- package/package.json +7 -1
- package/src/chat-protocol/__tests__/__snapshots__/nats-decoder-golden.test.ts.snap +319 -0
- package/src/chat-protocol/__tests__/chat-protocol.test.ts +516 -0
- package/src/chat-protocol/__tests__/env-flag.test.ts +52 -0
- package/src/chat-protocol/__tests__/ip-normalize.test.ts +136 -0
- package/src/chat-protocol/__tests__/nats-decoder-golden.test.ts +237 -0
- package/src/chat-protocol/decode.ts +278 -0
- package/src/chat-protocol/encode.ts +71 -0
- package/src/chat-protocol/env-flag.ts +39 -0
- package/src/chat-protocol/events.ts +254 -0
- package/src/chat-protocol/frames.ts +245 -0
- package/src/chat-protocol/index.ts +21 -0
- package/src/chat-protocol/ip-normalize.ts +146 -0
- package/src/chat-protocol/nats-decoder.ts +264 -0
- package/src/components/chat/.chat-message-list.md +10 -6
- package/src/components/chat/__tests__/chat-message-list.test.tsx +450 -9
- package/src/components/chat/__tests__/chat-message-streaming-memo.test.tsx +207 -0
- package/src/components/chat/__tests__/chat-pending-turn.test.tsx +250 -0
- package/src/components/chat/chat-message-enhanced.tsx +122 -20
- package/src/components/chat/chat-message-list.tsx +515 -133
- package/src/components/chat/embeddable-chat.tsx +6 -0
- package/src/components/chat/hooks/.index.md +30 -33
- package/src/components/chat/hooks/.use-nats-chat-adapter.md +36 -55
- package/src/components/chat/hooks/__tests__/__snapshots__/conversation-id-persistence-golden.test.ts.snap +37 -0
- package/src/components/chat/hooks/__tests__/__snapshots__/sse-stream-golden.test.ts.snap +0 -0
- package/src/components/chat/hooks/__tests__/chunk-catchup-dialog-staleness.test.ts +92 -0
- package/src/components/chat/hooks/__tests__/conversation-id-persistence-golden.test.ts +438 -0
- package/src/components/chat/hooks/__tests__/sse-stream-golden.test.ts +318 -0
- package/src/components/chat/hooks/index.ts +0 -1
- package/src/components/chat/hooks/use-chat.ts +8 -0
- package/src/components/chat/hooks/use-chunk-catchup.ts +26 -1
- package/src/components/chat/hooks/use-nats-chat-adapter.ts +254 -825
- package/src/components/chat/hooks/use-sse-chat-adapter.ts +380 -684
- package/src/components/chat/index.ts +5 -0
- package/src/components/chat/stream/__tests__/__snapshots__/chat-stream-reducer-golden.test.ts.snap +944 -0
- package/src/components/chat/stream/__tests__/chat-dialog-store.test.ts +806 -0
- package/src/components/chat/stream/__tests__/chat-stream-reducer-golden.test.ts +467 -0
- package/src/components/chat/stream/__tests__/chat-stream-reducer.test.ts +1330 -0
- package/src/components/chat/stream/__tests__/delta-batcher.test.ts +255 -0
- package/src/components/chat/stream/__tests__/use-chat-stream-reducer.test.ts +105 -0
- package/src/components/chat/stream/chat-dialog-store.ts +536 -0
- package/src/components/chat/stream/chat-stream-reducer.ts +1928 -0
- package/src/components/chat/stream/delta-batcher.ts +168 -0
- package/src/components/chat/stream/index.ts +55 -0
- package/src/components/chat/stream/message-mutations.ts +340 -0
- package/src/components/chat/stream/use-chat-stream-reducer.ts +126 -0
- package/src/components/chat/thinking-display.tsx +1 -1
- package/src/components/chat/types/.api.types.md +39 -49
- package/src/components/chat/types/.processing.types.md +29 -58
- package/src/components/chat/types/.unified-chat-state.types.md +2 -2
- package/src/components/chat/types/api.types.ts +6 -73
- package/src/components/chat/types/processing.types.ts +11 -53
- package/src/components/chat/types/unified-chat-state.types.ts +16 -0
- package/src/components/chat/utils/.extract-incomplete-message-state.md +21 -3
- package/src/components/chat/utils/.history-merge.md +44 -3
- package/src/components/chat/utils/.index.md +31 -40
- package/src/components/chat/utils/__tests__/__snapshots__/process-historical-messages-golden.test.ts.snap +420 -0
- package/src/components/chat/utils/__tests__/__snapshots__/segment-accumulator-golden.test.ts.snap +605 -0
- package/src/components/chat/utils/__tests__/extract-incomplete-message-state.test.ts +106 -0
- package/src/components/chat/utils/__tests__/history-merge.test.ts +160 -0
- package/src/components/chat/utils/__tests__/process-historical-messages-approvals.test.ts +61 -0
- package/src/components/chat/utils/__tests__/process-historical-messages-golden.test.ts +394 -0
- package/src/components/chat/utils/__tests__/segment-accumulator-golden.test.ts +270 -0
- package/src/components/chat/utils/extract-incomplete-message-state.ts +93 -6
- package/src/components/chat/utils/history-merge.ts +85 -5
- package/src/components/chat/utils/index.ts +5 -8
- package/src/components/chat/utils/process-historical-messages.ts +361 -385
- package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +22 -4
- package/src/components/shared/legal-document/legal-document-page.tsx +1 -1
- package/src/components/shared/product-release/release-detail-page.tsx +19 -4
- package/src/components/ui/__tests__/__snapshots__/markdown-parity.test.tsx.snap +2420 -0
- package/src/components/ui/__tests__/markdown-parity.test.tsx +2540 -0
- package/src/components/ui/index.ts +1 -2
- package/src/components/ui/markdown/__tests__/mermaid-security.test.ts +176 -0
- package/src/components/ui/markdown/__tests__/mermaid-stale-render.test.tsx +151 -0
- package/src/components/ui/markdown/__tests__/sanitize-invariant.test.ts +354 -0
- package/src/components/ui/markdown/__tests__/sanitize-render.test.tsx +118 -0
- package/src/components/ui/markdown/__tests__/streaming.test.tsx +436 -0
- package/src/components/ui/markdown/base-components.tsx +360 -0
- package/src/components/ui/markdown/engine.tsx +315 -0
- package/src/components/ui/markdown/heading-ids.ts +239 -0
- package/src/components/ui/markdown/index.ts +49 -0
- package/src/components/ui/markdown/mermaid-diagram.tsx +323 -0
- package/src/components/ui/markdown/rich/embed-overrides.tsx +199 -0
- package/src/components/ui/markdown/rich/rich-markdown-renderer.tsx +184 -0
- package/src/components/ui/markdown/rich/shortcodes.ts +170 -0
- package/src/components/ui/markdown/sanitize.ts +3584 -0
- package/src/components/ui/markdown/simple-markdown-renderer.tsx +28 -0
- package/src/components/ui/markdown/streaming.ts +390 -0
- package/src/components/ui/markdown/text-size.ts +106 -0
- package/src/components/ui/release-changelog-section.tsx +1 -1
- package/src/components/ui/ticket-info-section.tsx +1 -1
- package/src/utils/index.ts +1 -0
- package/src/utils/markdown-fences.ts +127 -0
- package/src/utils/markdown-heading-id.ts +348 -0
- package/src/utils/markdown-section-extractor.ts +41 -56
- package/dist/chunk-OCEKO5CW.js.map +0 -1
- package/dist/chunk-QTYZMP6D.cjs.map +0 -1
- package/dist/chunk-TLMJHMXJ.js.map +0 -1
- package/dist/chunk-TWYNR4TZ.cjs.map +0 -1
- package/dist/chunk-WA7RR64F.js.map +0 -1
- package/dist/chunk-WK4N5VBX.cjs.map +0 -1
- package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts +0 -6
- package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts.map +0 -1
- package/dist/components/chat/utils/chunk-parser.d.ts +0 -25
- package/dist/components/chat/utils/chunk-parser.d.ts.map +0 -1
- package/dist/components/ui/rich-markdown-renderer.d.ts +0 -34
- package/dist/components/ui/rich-markdown-renderer.d.ts.map +0 -1
- package/dist/components/ui/simple-markdown-renderer.d.ts +0 -73
- package/dist/components/ui/simple-markdown-renderer.d.ts.map +0 -1
- package/src/components/chat/hooks/.use-realtime-chunk-processor.md +0 -77
- package/src/components/chat/hooks/use-realtime-chunk-processor.ts +0 -489
- package/src/components/chat/utils/.chunk-parser.md +0 -62
- package/src/components/chat/utils/chunk-parser.ts +0 -262
- package/src/components/ui/.simple-markdown-renderer.md +0 -52
- package/src/components/ui/rich-markdown-renderer.tsx +0 -1223
- package/src/components/ui/simple-markdown-renderer.tsx +0 -964
- /package/dist/{chunk-ADPMHWOE.js.map → chunk-72XAID7Y.js.map} +0 -0
- /package/dist/{chunk-PAGKRNWK.js.map → chunk-7WZHBQ4J.js.map} +0 -0
- /package/dist/{chunk-TSZHM74B.js.map → chunk-DC2TKS7C.js.map} +0 -0
- /package/dist/{chunk-I64ABCDX.js.map → chunk-I2B6X77L.js.map} +0 -0
- /package/dist/{chunk-DTYRYB2N.js.map → chunk-K6QTZ7CZ.js.map} +0 -0
- /package/dist/{chunk-4LTMXDUS.js.map → chunk-KBN7PMFT.js.map} +0 -0
- /package/dist/{chunk-TBMV7I5N.js.map → chunk-KXZO2WZX.js.map} +0 -0
- /package/dist/{chunk-KEBYLU3U.js.map → chunk-LFUPI7VX.js.map} +0 -0
- /package/dist/{chunk-WJQHJD7J.js.map → chunk-TWSKTJHW.js.map} +0 -0
- /package/dist/{chunk-TZRUCD56.js.map → chunk-V3ZAAFE3.js.map} +0 -0
- /package/dist/{chunk-LRGHJPET.js.map → chunk-XGIFOHKE.js.map} +0 -0
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utilities for parsing NATS chunks into structured actions
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { MESSAGE_TYPE, type ChunkData, type ParsedChunkAction, type ToolExecutionSegment, type PendingToolCallData } from '../types'
|
|
6
|
-
|
|
7
|
-
function normalizeToolCalls(raw: unknown): PendingToolCallData[] {
|
|
8
|
-
if (!Array.isArray(raw)) return []
|
|
9
|
-
return raw
|
|
10
|
-
.filter((item): item is Record<string, any> => !!item && typeof item === 'object')
|
|
11
|
-
.map((item) => ({
|
|
12
|
-
toolExecutionRequestId: String(item.toolExecutionRequestId ?? ''),
|
|
13
|
-
toolName: String(item.toolName ?? ''),
|
|
14
|
-
toolTitle: typeof item.toolTitle === 'string' ? item.toolTitle : undefined,
|
|
15
|
-
toolExplanation: typeof item.toolExplanation === 'string' ? item.toolExplanation : undefined,
|
|
16
|
-
toolType: typeof item.toolType === 'string' ? item.toolType : undefined,
|
|
17
|
-
requiresApproval: item.requiresApproval === true,
|
|
18
|
-
approvalType: typeof item.approvalType === 'string' ? item.approvalType : null,
|
|
19
|
-
toolCallArguments:
|
|
20
|
-
item.toolCallArguments && typeof item.toolCallArguments === 'object'
|
|
21
|
-
? (item.toolCallArguments as Record<string, any>)
|
|
22
|
-
: null,
|
|
23
|
-
}))
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Parse a raw NATS chunk into a structured action
|
|
28
|
-
*/
|
|
29
|
-
export function parseChunkToAction(chunk: unknown): ParsedChunkAction | null {
|
|
30
|
-
if (!chunk || typeof chunk !== 'object') return null
|
|
31
|
-
|
|
32
|
-
const data = chunk as ChunkData
|
|
33
|
-
const type = String(data.type || '')
|
|
34
|
-
|
|
35
|
-
switch (type) {
|
|
36
|
-
case MESSAGE_TYPE.MESSAGE_START:
|
|
37
|
-
return { action: 'message_start' }
|
|
38
|
-
|
|
39
|
-
case MESSAGE_TYPE.MESSAGE_END:
|
|
40
|
-
return { action: 'message_end' }
|
|
41
|
-
|
|
42
|
-
case MESSAGE_TYPE.AI_METADATA: {
|
|
43
|
-
const providerName = data.providerName || data.provider
|
|
44
|
-
if (typeof data.modelName === 'string' && typeof providerName === 'string') {
|
|
45
|
-
return {
|
|
46
|
-
action: 'metadata',
|
|
47
|
-
modelDisplayName: data.modelDisplayName,
|
|
48
|
-
modelName: data.modelName,
|
|
49
|
-
providerName,
|
|
50
|
-
contextWindow: typeof data.contextWindow === 'number' ? data.contextWindow : 0,
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return null
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
case MESSAGE_TYPE.TEXT:
|
|
57
|
-
if (typeof data.text === 'string') {
|
|
58
|
-
return { action: 'text', text: data.text }
|
|
59
|
-
}
|
|
60
|
-
return null
|
|
61
|
-
|
|
62
|
-
case MESSAGE_TYPE.THINKING:
|
|
63
|
-
if (typeof data.text === 'string') {
|
|
64
|
-
return { action: 'thinking', text: data.text }
|
|
65
|
-
}
|
|
66
|
-
return null
|
|
67
|
-
|
|
68
|
-
case MESSAGE_TYPE.GUIDE:
|
|
69
|
-
if (typeof data.text === 'string') {
|
|
70
|
-
return { action: 'guide', text: data.text }
|
|
71
|
-
}
|
|
72
|
-
return null
|
|
73
|
-
|
|
74
|
-
case MESSAGE_TYPE.EXECUTING_TOOL:
|
|
75
|
-
return {
|
|
76
|
-
action: 'tool_execution',
|
|
77
|
-
segment: {
|
|
78
|
-
type: 'tool_execution',
|
|
79
|
-
data: {
|
|
80
|
-
type: 'EXECUTING_TOOL',
|
|
81
|
-
integratedToolType: data.integratedToolType || '',
|
|
82
|
-
toolFunction: data.toolFunction || '',
|
|
83
|
-
toolTitle: typeof data.title === 'string' ? data.title : undefined,
|
|
84
|
-
toolExplanation: typeof data.toolExplanation === 'string' ? data.toolExplanation : undefined,
|
|
85
|
-
parameters: data.parameters,
|
|
86
|
-
toolExecutionRequestId: typeof data.toolExecutionRequestId === 'string' ? data.toolExecutionRequestId : undefined,
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
case MESSAGE_TYPE.EXECUTED_TOOL:
|
|
92
|
-
return {
|
|
93
|
-
action: 'tool_execution',
|
|
94
|
-
segment: {
|
|
95
|
-
type: 'tool_execution',
|
|
96
|
-
data: {
|
|
97
|
-
type: 'EXECUTED_TOOL',
|
|
98
|
-
integratedToolType: data.integratedToolType || '',
|
|
99
|
-
toolFunction: data.toolFunction || '',
|
|
100
|
-
toolTitle: typeof data.title === 'string' ? data.title : undefined,
|
|
101
|
-
parameters: data.parameters,
|
|
102
|
-
result: data.result,
|
|
103
|
-
success: data.success,
|
|
104
|
-
toolExecutionRequestId: typeof data.toolExecutionRequestId === 'string' ? data.toolExecutionRequestId : undefined,
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
case MESSAGE_TYPE.APPROVAL_REQUEST: {
|
|
110
|
-
const requestId = data.approvalRequestId || data.approval_request_id || ''
|
|
111
|
-
const approvalType = data.approvalType || 'USER'
|
|
112
|
-
const toolCalls = normalizeToolCalls(data.toolCalls)
|
|
113
|
-
|
|
114
|
-
if (toolCalls.length > 0) {
|
|
115
|
-
return {
|
|
116
|
-
action: 'approval_batch',
|
|
117
|
-
requestId,
|
|
118
|
-
approvalType,
|
|
119
|
-
toolCalls,
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return {
|
|
124
|
-
action: 'approval_request',
|
|
125
|
-
requestId,
|
|
126
|
-
command: data.command || '',
|
|
127
|
-
explanation: data.explanation,
|
|
128
|
-
approvalType,
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
case MESSAGE_TYPE.APPROVAL_RESULT: {
|
|
133
|
-
// The realtime NATS chunk carries the resolver's name as `displayName`; the
|
|
134
|
-
// persisted GraphQL message exposes the same value as `resolvedByName`. Accept
|
|
135
|
-
// either so realtime and history-replay render "by {name}" identically.
|
|
136
|
-
const resolvedByName =
|
|
137
|
-
typeof data.resolvedByName === 'string'
|
|
138
|
-
? data.resolvedByName
|
|
139
|
-
: typeof data.displayName === 'string'
|
|
140
|
-
? data.displayName
|
|
141
|
-
: undefined
|
|
142
|
-
return {
|
|
143
|
-
action: 'approval_result',
|
|
144
|
-
requestId: data.approvalRequestId || data.approval_request_id || '',
|
|
145
|
-
approved: data.approved === true,
|
|
146
|
-
approvalType: data.approvalType || 'CLIENT',
|
|
147
|
-
resolvedByName,
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
case MESSAGE_TYPE.ERROR:
|
|
152
|
-
return {
|
|
153
|
-
action: 'error',
|
|
154
|
-
error: data.error || 'An error occurred',
|
|
155
|
-
details: data.details,
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
case MESSAGE_TYPE.MESSAGE_REQUEST:
|
|
159
|
-
return {
|
|
160
|
-
action: 'message_request',
|
|
161
|
-
text: String(data.text || ''),
|
|
162
|
-
ownerType: typeof data.ownerType === 'string' ? data.ownerType : undefined,
|
|
163
|
-
displayName: typeof data.displayName === 'string' ? data.displayName : undefined,
|
|
164
|
-
userId: typeof data.userId === 'string' ? data.userId : undefined,
|
|
165
|
-
// Entity-context refs the user attached to this message (backend
|
|
166
|
-
// `MESSAGE_REQUEST` chunk → `contextItems: [{ type, id }]`). The wire
|
|
167
|
-
// shape carries no label; the host resolves display text + icon. `label`
|
|
168
|
-
// is REQUIRED on `ChatContextItem`, so fall back to the id (same as the
|
|
169
|
-
// historical path in `process-historical-messages.ts`) — keeps both
|
|
170
|
-
// message sources producing an identical shape.
|
|
171
|
-
contextItems: Array.isArray(data.contextItems)
|
|
172
|
-
? (data.contextItems as Array<{ type?: unknown; id?: unknown }>)
|
|
173
|
-
.filter((it) => typeof it?.type === 'string' && typeof it?.id === 'string')
|
|
174
|
-
.map((it) => ({ type: it.type as string, id: it.id as string, label: it.id as string }))
|
|
175
|
-
: undefined,
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
case MESSAGE_TYPE.TOKEN_USAGE:
|
|
179
|
-
return {
|
|
180
|
-
action: 'token_usage',
|
|
181
|
-
data: {
|
|
182
|
-
inputTokensSize: data.inputTokensSize ?? 0,
|
|
183
|
-
outputTokensSize: data.outputTokensSize ?? 0,
|
|
184
|
-
totalTokensSize: data.totalTokensSize ?? 0,
|
|
185
|
-
contextSize: data.contextSize ?? 0,
|
|
186
|
-
},
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
case MESSAGE_TYPE.CONTEXT_COMPACTION_START:
|
|
190
|
-
return { action: 'context_compaction_start' }
|
|
191
|
-
|
|
192
|
-
case MESSAGE_TYPE.CONTEXT_COMPACTION_END:
|
|
193
|
-
return {
|
|
194
|
-
action: 'context_compaction_end',
|
|
195
|
-
summary: typeof data.text === 'string' ? data.text : undefined,
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
case MESSAGE_TYPE.SYSTEM:
|
|
199
|
-
if (typeof data.text === 'string') {
|
|
200
|
-
return { action: 'system', text: data.text }
|
|
201
|
-
}
|
|
202
|
-
return null
|
|
203
|
-
|
|
204
|
-
case MESSAGE_TYPE.DIRECT_MESSAGE:
|
|
205
|
-
if (typeof data.text === 'string') {
|
|
206
|
-
return {
|
|
207
|
-
action: 'direct_message',
|
|
208
|
-
text: data.text,
|
|
209
|
-
ownerType: typeof data.ownerType === 'string' ? data.ownerType : undefined,
|
|
210
|
-
displayName: typeof data.displayName === 'string' ? data.displayName : undefined,
|
|
211
|
-
userId: typeof data.userId === 'string' ? data.userId : undefined,
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return null
|
|
215
|
-
|
|
216
|
-
case MESSAGE_TYPE.DIALOG_CLOSED:
|
|
217
|
-
return { action: 'dialog_closed' }
|
|
218
|
-
|
|
219
|
-
default:
|
|
220
|
-
return null
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Check if a chunk represents a control message (start/end)
|
|
226
|
-
*/
|
|
227
|
-
export function isControlChunk(chunk: unknown): boolean {
|
|
228
|
-
if (!chunk || typeof chunk !== 'object') return false
|
|
229
|
-
const data = chunk as ChunkData
|
|
230
|
-
const type = String(data.type || '')
|
|
231
|
-
return type === MESSAGE_TYPE.MESSAGE_START || type === MESSAGE_TYPE.MESSAGE_END
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Check if a chunk represents an error
|
|
236
|
-
*/
|
|
237
|
-
export function isErrorChunk(chunk: unknown): boolean {
|
|
238
|
-
if (!chunk || typeof chunk !== 'object') return false
|
|
239
|
-
const data = chunk as ChunkData
|
|
240
|
-
return data.type === MESSAGE_TYPE.ERROR
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Check if a chunk represents metadata
|
|
245
|
-
*/
|
|
246
|
-
export function isMetadataChunk(chunk: unknown): boolean {
|
|
247
|
-
if (!chunk || typeof chunk !== 'object') return false
|
|
248
|
-
const data = chunk as ChunkData
|
|
249
|
-
return data.type === MESSAGE_TYPE.AI_METADATA
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Extract text content from a chunk if it's a text chunk
|
|
254
|
-
*/
|
|
255
|
-
export function extractTextFromChunk(chunk: unknown): string | null {
|
|
256
|
-
if (!chunk || typeof chunk !== 'object') return null
|
|
257
|
-
const data = chunk as ChunkData
|
|
258
|
-
if (data.type === MESSAGE_TYPE.TEXT && typeof data.text === 'string') {
|
|
259
|
-
return data.text
|
|
260
|
-
}
|
|
261
|
-
return null
|
|
262
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
<!-- source-hash: 9a47236bd9fd4f90eece958d3708b946 -->
|
|
2
|
-
A client-side React component that renders Markdown content with GFM support, syntax highlighting, raw HTML passthrough, and a layered XSS sanitization pipeline designed for safe rendering of LLM-generated output.
|
|
3
|
-
|
|
4
|
-
## Key Components
|
|
5
|
-
|
|
6
|
-
### Rehype Plugins
|
|
7
|
-
|
|
8
|
-
- **`rehypeStripUnsafe()`** — Custom HAST sanitizer that runs after `rehype-raw`. Strips dangerous elements (`<script>`, `<style>`, `<object>`, etc.), removes `on*` event handler attributes, and blocks `javascript:` / `data:` URI schemes on all URL-bearing attributes including multi-candidate `srcset`.
|
|
9
|
-
|
|
10
|
-
- **`srcsetHasUnsafeCandidate(srcset)`** — Helper that splits `srcset` attribute values by comma and validates each URL candidate individually to prevent injection via secondary candidates.
|
|
11
|
-
|
|
12
|
-
- **`escapeUnknownHtmlT...` (truncated)** — Pre-pass that escapes unrecognized HTML-like tags in raw markdown text before `rehype-raw` processes them, preventing React warnings/errors from LLM-emitted pseudo-XML tags like `<ticket>` or `<their>`.
|
|
13
|
-
|
|
14
|
-
### URL Transform
|
|
15
|
-
|
|
16
|
-
- **`cardAwareUrlTransform(url, key)`** — Extends `react-markdown`'s default URL sanitizer to allow `card://` and `mention://` internal schemes on `href` attributes only (used by `remarkCardLinks` and `remarkMentionChips` plugins), while keeping all other dangerous schemes blocked.
|
|
17
|
-
|
|
18
|
-
### Constants
|
|
19
|
-
|
|
20
|
-
- **`SAFE_HTML_TAGS`** — Allowlist of permitted HTML tag names forwarded to React. Explicitly excludes `<video>` (handled by a separate pipeline component).
|
|
21
|
-
- **`TAG_LIKE_REGEX`** — ReDoS-safe regex (CodeQL-hardened, bounded quantifiers) for matching HTML-like tags in markdown source.
|
|
22
|
-
|
|
23
|
-
## Usage Example
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
import { SimpleMarkdownRenderer } from './simple-markdown-renderer';
|
|
27
|
-
|
|
28
|
-
// Basic rendering with safe LLM output
|
|
29
|
-
<SimpleMarkdownRenderer content="## Hello\n\nThis is **markdown** with `code`." />
|
|
30
|
-
|
|
31
|
-
// With authenticated image sources and link resolution
|
|
32
|
-
<SimpleMarkdownRenderer
|
|
33
|
-
content={llmMarkdownOutput}
|
|
34
|
-
resolveLink={(href) => ({ url: href, label: href })}
|
|
35
|
-
/>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Security Model
|
|
39
|
-
|
|
40
|
-
The sanitization runs in two layers:
|
|
41
|
-
|
|
42
|
-
```mermaid
|
|
43
|
-
graph TD
|
|
44
|
-
A[Raw Markdown] --> B[escapeUnknownHtmlTags pre-pass]
|
|
45
|
-
B --> C[remark-gfm / remark-breaks]
|
|
46
|
-
C --> D[rehype-raw]
|
|
47
|
-
D --> E[rehypeStripUnsafe HAST sanitizer]
|
|
48
|
-
E --> F[rehype-highlight]
|
|
49
|
-
F --> G[Safe React Output]
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
> **Source:** [`simple-markdown-renderer.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/simple-markdown-renderer.tsx)
|