@flamingo-stack/openframe-frontend-core 0.0.492-1506.3956.1 → 0.0.492
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/{chunk-KX3K2EH4.cjs → chunk-2XAAFAQT.cjs} +11 -11
- package/dist/{chunk-KX3K2EH4.cjs.map → chunk-2XAAFAQT.cjs.map} +1 -1
- package/dist/{chunk-JHEIOXXZ.js → chunk-4AWRPTKE.js} +5 -6
- package/dist/chunk-4AWRPTKE.js.map +1 -0
- package/dist/{chunk-PTXZB2KW.js → chunk-4J3CB4KO.js} +2 -2
- package/dist/{chunk-7N7YZCHR.cjs → chunk-4MLOMMDX.cjs} +5519 -7555
- package/dist/chunk-4MLOMMDX.cjs.map +1 -0
- package/dist/{chunk-MEMRQTOI.js → chunk-56J7RLMM.js} +10434 -12470
- package/dist/chunk-56J7RLMM.js.map +1 -0
- package/dist/{chunk-MEIGDK7M.cjs → chunk-5ICPQAUI.cjs} +60 -60
- package/dist/chunk-5ICPQAUI.cjs.map +1 -0
- package/dist/{chunk-BEEPU44B.js → chunk-5RHJVPL7.js} +10 -10
- package/dist/chunk-5RHJVPL7.js.map +1 -0
- package/dist/{chunk-XOFE2RT4.js → chunk-BTIRYGDT.js} +4 -4
- package/dist/{chunk-JSEJ5MH5.cjs → chunk-DY6AJNVK.cjs} +5 -5
- package/dist/{chunk-JSEJ5MH5.cjs.map → chunk-DY6AJNVK.cjs.map} +1 -1
- package/dist/{chunk-PLB6CQSO.js → chunk-FG5ALORQ.js} +2 -2
- package/dist/{chunk-QG2EBIH5.cjs → chunk-J2J36PEN.cjs} +31 -31
- package/dist/{chunk-QG2EBIH5.cjs.map → chunk-J2J36PEN.cjs.map} +1 -1
- package/dist/{chunk-A6FPYAUD.cjs → chunk-LIRXKEOE.cjs} +15 -15
- package/dist/{chunk-A6FPYAUD.cjs.map → chunk-LIRXKEOE.cjs.map} +1 -1
- package/dist/{chunk-MSL5NE3N.cjs → chunk-LVDI7R7T.cjs} +37 -37
- package/dist/{chunk-MSL5NE3N.cjs.map → chunk-LVDI7R7T.cjs.map} +1 -1
- package/dist/{chunk-MPUQFRJG.cjs → chunk-M4SCYPCR.cjs} +7 -7
- package/dist/{chunk-MPUQFRJG.cjs.map → chunk-M4SCYPCR.cjs.map} +1 -1
- package/dist/{chunk-QDGB2DKY.cjs → chunk-O6S6Q52W.cjs} +26 -26
- package/dist/{chunk-QDGB2DKY.cjs.map → chunk-O6S6Q52W.cjs.map} +1 -1
- package/dist/{chunk-W56JYDSC.cjs → chunk-OFFYASUY.cjs} +27 -28
- package/dist/chunk-OFFYASUY.cjs.map +1 -0
- package/dist/{chunk-NCAN6VUF.js → chunk-P3ITKTUE.js} +2 -2
- package/dist/{chunk-M6FEGPQJ.cjs → chunk-PI5BMKV3.cjs} +62 -62
- package/dist/{chunk-M6FEGPQJ.cjs.map → chunk-PI5BMKV3.cjs.map} +1 -1
- package/dist/{chunk-34TDA22K.js → chunk-QHRNQTW5.js} +2 -2
- package/dist/{chunk-OL3MJKUI.js → chunk-SZWMJIH3.js} +2 -2
- package/dist/{chunk-MZRIRQYV.js → chunk-U5LU56JE.js} +2 -2
- package/dist/{chunk-C65NCIMV.cjs → chunk-VML66FJQ.cjs} +9 -9
- package/dist/{chunk-C65NCIMV.cjs.map → chunk-VML66FJQ.cjs.map} +1 -1
- package/dist/{chunk-3LKB722U.js → chunk-WKWZ7LVC.js} +2 -2
- package/dist/{chunk-J3VBVR4W.js → chunk-WPFLV4QJ.js} +4 -4
- 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 +1 -0
- 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-nats-chat-adapter.d.ts +48 -15
- package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts +6 -0
- package/dist/components/chat/hooks/use-realtime-chunk-processor.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts +57 -10
- package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +2 -10
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.d.ts +0 -1
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +13 -21
- package/dist/components/chat/types/api.types.d.ts +81 -1
- package/dist/components/chat/types/api.types.d.ts.map +1 -1
- package/dist/components/chat/types/processing.types.d.ts +93 -2
- package/dist/components/chat/types/processing.types.d.ts.map +1 -1
- package/dist/components/chat/utils/chunk-parser.d.ts +25 -0
- package/dist/components/chat/utils/chunk-parser.d.ts.map +1 -0
- package/dist/components/chat/utils/extract-incomplete-message-state.d.ts +6 -34
- package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
- package/dist/components/chat/utils/index.d.ts +3 -2
- package/dist/components/chat/utils/index.d.ts.map +1 -1
- package/dist/components/chat/utils/process-historical-messages.d.ts +11 -59
- 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/floating-walkthrough-video.d.ts.map +1 -1
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.js +1 -1
- package/dist/components/help-center-pages/index.cjs +20 -20
- package/dist/components/help-center-pages/index.js +11 -11
- package/dist/components/index.cjs +130 -172
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +21 -63
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/navigation/navigation-sidebar-item.d.ts +23 -1
- package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
- package/dist/components/navigation/navigation-sidebar.d.ts.map +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 +5 -5
- package/dist/components/tickets/index.js +4 -4
- package/dist/components/ui/data-table/data-table-column-filter.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-header.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
- package/dist/components/ui/index.cjs +2 -44
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.d.ts +2 -1
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +13 -55
- package/dist/components/ui/rich-markdown-renderer.d.ts +34 -0
- package/dist/components/ui/rich-markdown-renderer.d.ts.map +1 -0
- package/dist/components/ui/simple-markdown-renderer.d.ts +73 -0
- package/dist/components/ui/simple-markdown-renderer.d.ts.map +1 -0
- package/dist/components/ui/tab-navigation.d.ts.map +1 -1
- package/dist/index.cjs +2 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +13 -71
- package/dist/utils/index.cjs +40 -169
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +41 -162
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/markdown-section-extractor.d.ts.map +1 -1
- package/package.json +1 -7
- package/src/components/chat/__tests__/chat-message-list.test.tsx +5 -293
- package/src/components/chat/chat-message-enhanced.tsx +20 -122
- package/src/components/chat/chat-message-list.tsx +109 -358
- package/src/components/chat/embeddable-chat.tsx +0 -6
- package/src/components/chat/hooks/.index.md +33 -30
- package/src/components/chat/hooks/.use-nats-chat-adapter.md +55 -36
- package/src/components/chat/hooks/.use-realtime-chunk-processor.md +77 -0
- package/src/components/chat/hooks/index.ts +1 -0
- package/src/components/chat/hooks/use-chat.ts +0 -8
- package/src/components/chat/hooks/use-nats-chat-adapter.ts +825 -243
- package/src/components/chat/hooks/use-realtime-chunk-processor.ts +489 -0
- package/src/components/chat/hooks/use-sse-chat-adapter.ts +684 -380
- package/src/components/chat/index.ts +0 -5
- package/src/components/chat/thinking-display.tsx +1 -1
- package/src/components/chat/types/.api.types.md +49 -39
- package/src/components/chat/types/.processing.types.md +58 -29
- package/src/components/chat/types/api.types.ts +73 -6
- package/src/components/chat/types/processing.types.ts +53 -11
- package/src/components/chat/utils/.chunk-parser.md +62 -0
- package/src/components/chat/utils/.index.md +40 -31
- package/src/components/chat/utils/chunk-parser.ts +262 -0
- package/src/components/chat/utils/extract-incomplete-message-state.ts +5 -63
- package/src/components/chat/utils/index.ts +8 -5
- package/src/components/chat/utils/process-historical-messages.ts +386 -358
- package/src/components/features/floating-walkthrough-video.tsx +3 -1
- package/src/components/navigation/navigation-sidebar-item.tsx +80 -30
- package/src/components/navigation/navigation-sidebar.tsx +106 -46
- package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +4 -22
- package/src/components/shared/legal-document/legal-document-page.tsx +1 -1
- package/src/components/shared/product-release/release-detail-page.tsx +4 -19
- package/src/components/ui/.simple-markdown-renderer.md +52 -0
- package/src/components/ui/__tests__/tab-navigation.test.tsx +159 -0
- package/src/components/ui/data-table/data-table-column-filter.tsx +7 -1
- package/src/components/ui/data-table/data-table-header.tsx +4 -1
- package/src/components/ui/data-table/data-table-skeleton.tsx +7 -0
- package/src/components/ui/index.ts +2 -1
- package/src/components/ui/release-changelog-section.tsx +1 -1
- package/src/components/ui/rich-markdown-renderer.tsx +1223 -0
- package/src/components/ui/simple-markdown-renderer.tsx +964 -0
- package/src/components/ui/tab-navigation.tsx +370 -171
- package/src/components/ui/ticket-info-section.tsx +1 -1
- package/src/utils/index.ts +0 -1
- package/src/utils/markdown-section-extractor.ts +56 -41
- package/dist/chat-protocol/decode.d.ts +0 -58
- package/dist/chat-protocol/decode.d.ts.map +0 -1
- package/dist/chat-protocol/encode.d.ts +0 -44
- package/dist/chat-protocol/encode.d.ts.map +0 -1
- package/dist/chat-protocol/env-flag.d.ts +0 -35
- package/dist/chat-protocol/env-flag.d.ts.map +0 -1
- package/dist/chat-protocol/events.d.ts +0 -207
- package/dist/chat-protocol/events.d.ts.map +0 -1
- package/dist/chat-protocol/frames.d.ts +0 -213
- package/dist/chat-protocol/frames.d.ts.map +0 -1
- package/dist/chat-protocol/index.cjs +0 -500
- package/dist/chat-protocol/index.cjs.map +0 -1
- package/dist/chat-protocol/index.d.ts +0 -18
- package/dist/chat-protocol/index.d.ts.map +0 -1
- package/dist/chat-protocol/index.js +0 -484
- package/dist/chat-protocol/index.js.map +0 -1
- package/dist/chat-protocol/ip-normalize.d.ts +0 -44
- package/dist/chat-protocol/ip-normalize.d.ts.map +0 -1
- package/dist/chat-protocol/nats-decoder.d.ts +0 -26
- package/dist/chat-protocol/nats-decoder.d.ts.map +0 -1
- package/dist/chunk-7N7YZCHR.cjs.map +0 -1
- package/dist/chunk-BEEPU44B.js.map +0 -1
- package/dist/chunk-JHEIOXXZ.js.map +0 -1
- package/dist/chunk-MEIGDK7M.cjs.map +0 -1
- package/dist/chunk-MEMRQTOI.js.map +0 -1
- package/dist/chunk-W56JYDSC.cjs.map +0 -1
- package/dist/components/chat/stream/chat-dialog-store.d.ts +0 -184
- package/dist/components/chat/stream/chat-dialog-store.d.ts.map +0 -1
- package/dist/components/chat/stream/chat-stream-reducer.d.ts +0 -367
- package/dist/components/chat/stream/chat-stream-reducer.d.ts.map +0 -1
- package/dist/components/chat/stream/delta-batcher.d.ts +0 -51
- package/dist/components/chat/stream/delta-batcher.d.ts.map +0 -1
- package/dist/components/chat/stream/index.d.ts +0 -17
- package/dist/components/chat/stream/index.d.ts.map +0 -1
- package/dist/components/chat/stream/message-mutations.d.ts +0 -77
- package/dist/components/chat/stream/message-mutations.d.ts.map +0 -1
- package/dist/components/chat/stream/use-chat-stream-reducer.d.ts +0 -22
- package/dist/components/chat/stream/use-chat-stream-reducer.d.ts.map +0 -1
- package/dist/components/ui/markdown/base-components.d.ts +0 -51
- package/dist/components/ui/markdown/base-components.d.ts.map +0 -1
- package/dist/components/ui/markdown/engine.d.ts +0 -99
- package/dist/components/ui/markdown/engine.d.ts.map +0 -1
- package/dist/components/ui/markdown/heading-ids.d.ts +0 -65
- package/dist/components/ui/markdown/heading-ids.d.ts.map +0 -1
- package/dist/components/ui/markdown/index.d.ts +0 -18
- package/dist/components/ui/markdown/index.d.ts.map +0 -1
- package/dist/components/ui/markdown/mermaid-diagram.d.ts +0 -79
- package/dist/components/ui/markdown/mermaid-diagram.d.ts.map +0 -1
- package/dist/components/ui/markdown/rich/embed-overrides.d.ts +0 -14
- package/dist/components/ui/markdown/rich/embed-overrides.d.ts.map +0 -1
- package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts +0 -40
- package/dist/components/ui/markdown/rich/rich-markdown-renderer.d.ts.map +0 -1
- package/dist/components/ui/markdown/rich/shortcodes.d.ts +0 -8
- package/dist/components/ui/markdown/rich/shortcodes.d.ts.map +0 -1
- package/dist/components/ui/markdown/sanitize.d.ts +0 -153
- package/dist/components/ui/markdown/sanitize.d.ts.map +0 -1
- package/dist/components/ui/markdown/simple-markdown-renderer.d.ts +0 -23
- package/dist/components/ui/markdown/simple-markdown-renderer.d.ts.map +0 -1
- package/dist/components/ui/markdown/streaming.d.ts +0 -78
- package/dist/components/ui/markdown/streaming.d.ts.map +0 -1
- package/dist/components/ui/markdown/text-size.d.ts +0 -34
- package/dist/components/ui/markdown/text-size.d.ts.map +0 -1
- package/dist/utils/markdown-fences.d.ts +0 -42
- package/dist/utils/markdown-fences.d.ts.map +0 -1
- package/dist/utils/markdown-heading-id.d.ts +0 -85
- package/dist/utils/markdown-heading-id.d.ts.map +0 -1
- package/src/chat-protocol/__tests__/__snapshots__/nats-decoder-golden.test.ts.snap +0 -317
- package/src/chat-protocol/__tests__/chat-protocol.test.ts +0 -516
- package/src/chat-protocol/__tests__/env-flag.test.ts +0 -52
- package/src/chat-protocol/__tests__/ip-normalize.test.ts +0 -136
- package/src/chat-protocol/__tests__/nats-decoder-golden.test.ts +0 -232
- package/src/chat-protocol/decode.ts +0 -278
- package/src/chat-protocol/encode.ts +0 -71
- package/src/chat-protocol/env-flag.ts +0 -39
- package/src/chat-protocol/events.ts +0 -245
- package/src/chat-protocol/frames.ts +0 -245
- package/src/chat-protocol/index.ts +0 -21
- package/src/chat-protocol/ip-normalize.ts +0 -146
- package/src/chat-protocol/nats-decoder.ts +0 -258
- package/src/components/chat/__tests__/chat-message-streaming-memo.test.tsx +0 -207
- package/src/components/chat/__tests__/chat-pending-turn.test.tsx +0 -230
- package/src/components/chat/hooks/__tests__/__snapshots__/conversation-id-persistence-golden.test.ts.snap +0 -37
- package/src/components/chat/hooks/__tests__/__snapshots__/sse-stream-golden.test.ts.snap +0 -0
- package/src/components/chat/hooks/__tests__/conversation-id-persistence-golden.test.ts +0 -438
- package/src/components/chat/hooks/__tests__/sse-stream-golden.test.ts +0 -318
- package/src/components/chat/stream/__tests__/__snapshots__/chat-stream-reducer-golden.test.ts.snap +0 -940
- package/src/components/chat/stream/__tests__/chat-dialog-store.test.ts +0 -756
- package/src/components/chat/stream/__tests__/chat-stream-reducer-golden.test.ts +0 -460
- package/src/components/chat/stream/__tests__/chat-stream-reducer.test.ts +0 -973
- package/src/components/chat/stream/__tests__/delta-batcher.test.ts +0 -255
- package/src/components/chat/stream/__tests__/use-chat-stream-reducer.test.ts +0 -98
- package/src/components/chat/stream/chat-dialog-store.ts +0 -536
- package/src/components/chat/stream/chat-stream-reducer.ts +0 -1808
- package/src/components/chat/stream/delta-batcher.ts +0 -168
- package/src/components/chat/stream/index.ts +0 -55
- package/src/components/chat/stream/message-mutations.ts +0 -340
- package/src/components/chat/stream/use-chat-stream-reducer.ts +0 -126
- package/src/components/chat/utils/__tests__/__snapshots__/process-historical-messages-golden.test.ts.snap +0 -420
- package/src/components/chat/utils/__tests__/__snapshots__/segment-accumulator-golden.test.ts.snap +0 -605
- package/src/components/chat/utils/__tests__/process-historical-messages-golden.test.ts +0 -394
- package/src/components/chat/utils/__tests__/segment-accumulator-golden.test.ts +0 -270
- package/src/components/ui/__tests__/__snapshots__/markdown-parity.test.tsx.snap +0 -2420
- package/src/components/ui/__tests__/markdown-parity.test.tsx +0 -2528
- package/src/components/ui/markdown/__tests__/mermaid-security.test.ts +0 -115
- package/src/components/ui/markdown/__tests__/mermaid-stale-render.test.tsx +0 -95
- package/src/components/ui/markdown/__tests__/sanitize-invariant.test.ts +0 -309
- package/src/components/ui/markdown/__tests__/streaming.test.tsx +0 -388
- package/src/components/ui/markdown/base-components.tsx +0 -360
- package/src/components/ui/markdown/engine.tsx +0 -315
- package/src/components/ui/markdown/heading-ids.ts +0 -239
- package/src/components/ui/markdown/index.ts +0 -49
- package/src/components/ui/markdown/mermaid-diagram.tsx +0 -291
- package/src/components/ui/markdown/rich/embed-overrides.tsx +0 -199
- package/src/components/ui/markdown/rich/rich-markdown-renderer.tsx +0 -184
- package/src/components/ui/markdown/rich/shortcodes.ts +0 -170
- package/src/components/ui/markdown/sanitize.ts +0 -3499
- package/src/components/ui/markdown/simple-markdown-renderer.tsx +0 -28
- package/src/components/ui/markdown/streaming.ts +0 -362
- package/src/components/ui/markdown/text-size.ts +0 -106
- package/src/utils/markdown-fences.ts +0 -127
- package/src/utils/markdown-heading-id.ts +0 -348
- /package/dist/{chunk-PTXZB2KW.js.map → chunk-4J3CB4KO.js.map} +0 -0
- /package/dist/{chunk-XOFE2RT4.js.map → chunk-BTIRYGDT.js.map} +0 -0
- /package/dist/{chunk-PLB6CQSO.js.map → chunk-FG5ALORQ.js.map} +0 -0
- /package/dist/{chunk-NCAN6VUF.js.map → chunk-P3ITKTUE.js.map} +0 -0
- /package/dist/{chunk-34TDA22K.js.map → chunk-QHRNQTW5.js.map} +0 -0
- /package/dist/{chunk-OL3MJKUI.js.map → chunk-SZWMJIH3.js.map} +0 -0
- /package/dist/{chunk-MZRIRQYV.js.map → chunk-U5LU56JE.js.map} +0 -0
- /package/dist/{chunk-3LKB722U.js.map → chunk-WKWZ7LVC.js.map} +0 -0
- /package/dist/{chunk-J3VBVR4W.js.map → chunk-WPFLV4QJ.js.map} +0 -0
|
@@ -1,52 +1,71 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 3fbde71f6e5fc7f9b4576423ebdb08e2 -->
|
|
2
|
+
Thin wrapper that wires together NATS subscriptions, real-time chunk processing, and dialog management into a single `UnifiedChatState` object for the Mingo/NATS transport mode of the unified chat surface.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
6
|
### `UseNatsChatAdapterConfig`
|
|
7
|
-
|
|
8
|
-
- `dialogId`
|
|
9
|
-
- `
|
|
10
|
-
- `publishUserMessage` — consumer-owned send callback (HTTP POST or NATS publish)
|
|
11
|
-
- `fetchChunks` — optional historical chunk fetcher for catchup
|
|
12
|
-
- `clientConfig` — optional NATS auth credentials
|
|
13
|
-
- `enableThinking` / `batchApprovalsEnabled` — processor feature flags
|
|
7
|
+
Primary configuration interface with two operational modes:
|
|
8
|
+
- **Bare-transport mode** — caller supplies `dialogId` explicitly and owns dialog lifecycle (original v0 API, used by Tauri Fae Chat)
|
|
9
|
+
- **Managed-dialog mode** — caller supplies `fetchDialogs` and related callbacks; the adapter owns dialog state, pagination, and history
|
|
14
10
|
|
|
15
|
-
###
|
|
16
|
-
- `active` — gates the live subscription; keeps message state alive while the mode is hidden
|
|
11
|
+
### Core Config Fields
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
| Field | Required | Description |
|
|
14
|
+
|-------|----------|-------------|
|
|
15
|
+
| `getNatsWsUrl` | ✅ | Returns the NATS WebSocket URL or `null` to suspend |
|
|
16
|
+
| `publishUserMessage` | ✅ | Consumer-owned send callback (HTTP POST or NATS publish) |
|
|
17
|
+
| `dialogId` | ❌ | Explicit dialog ID (bare-transport mode) |
|
|
18
|
+
| `fetchDialogs` | ❌ | Enables managed-dialog mode with sidebar support |
|
|
19
|
+
| `fetchDialogMessages` | ❌ | Populates history on dialog switch |
|
|
20
|
+
| `topics` | ❌ | NATS subject suffixes to tail (default: `['message']`) |
|
|
21
|
+
|
|
22
|
+
### Supporting Interfaces
|
|
23
|
+
|
|
24
|
+
- **`FetchDialogsParams`** / **`FetchDialogsResult`** — paginated dialog list with cursor-based pagination
|
|
25
|
+
- **`FetchDialogMessagesParams`** / **`FetchDialogMessagesResult`** — paginated message history with optional `tokenUsage`
|
|
26
|
+
|
|
27
|
+
### Composition Stack
|
|
20
28
|
|
|
21
29
|
```text
|
|
22
|
-
useNatsDialogSubscription →
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
useChunkCatchup →
|
|
30
|
+
useNatsDialogSubscription → live NATS event tail
|
|
31
|
+
↓
|
|
32
|
+
useRealtimeChunkProcessor → chunk → MessageSegment[]
|
|
33
|
+
↓
|
|
34
|
+
useChunkCatchup → back-fills missed chunks on reconnect
|
|
35
|
+
↓
|
|
36
|
+
config.publishUserMessage → consumer-owned send (HTTP/NATS)
|
|
27
37
|
```
|
|
28
38
|
|
|
29
|
-
Returns a full `UnifiedChatState` object including `messages`, `isLoading`, `streamingPhase`, `sendMessage`, `stopMessage`, and `clearMessages`.
|
|
30
|
-
|
|
31
39
|
## Usage Example
|
|
32
40
|
|
|
33
41
|
```typescript
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
},
|
|
44
|
-
fetchChunks: ({ dialogId, after }) =>
|
|
45
|
-
fetch(`/api/chunks?dialogId=${dialogId}&after=${after}`).then(r => r.json()),
|
|
46
|
-
batchApprovalsEnabled: true,
|
|
42
|
+
// Bare-transport mode (v0 — Tauri Fae Chat)
|
|
43
|
+
const chatState = useNatsChatAdapter({
|
|
44
|
+
dialogId: activeDialogId,
|
|
45
|
+
getNatsWsUrl: () => `wss://nats.example.com`,
|
|
46
|
+
publishUserMessage: async (text, { dialogId }) => {
|
|
47
|
+
await fetch(`/api/chat/${dialogId}/message`, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
body: JSON.stringify({ text }),
|
|
50
|
+
})
|
|
47
51
|
},
|
|
48
|
-
|
|
49
|
-
)
|
|
52
|
+
topics: ['admin-message'],
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
// Managed-dialog mode (openframe-frontend / EmbeddableChat)
|
|
56
|
+
const chatState = useNatsChatAdapter({
|
|
57
|
+
getNatsWsUrl: () => natsUrl,
|
|
58
|
+
publishUserMessage: sendMessage,
|
|
59
|
+
fetchDialogs: async ({ cursor, limit }) => api.listDialogs({ cursor, limit }),
|
|
60
|
+
fetchDialogMessages: async ({ dialogId, cursor }) =>
|
|
61
|
+
api.getMessages(dialogId, { cursor }),
|
|
62
|
+
createDialog: () => api.createDialog(),
|
|
63
|
+
deleteDialog: (id) => api.deleteDialog(id),
|
|
64
|
+
approveRequest: (requestId) => api.approve(requestId),
|
|
65
|
+
rejectRequest: (requestId, reason) => api.reject(requestId, reason),
|
|
66
|
+
})
|
|
50
67
|
```
|
|
51
68
|
|
|
52
|
-
> **Note:** `
|
|
69
|
+
> **Note:** Set `topics: ['admin-message']` for Mingo/admin deployments. The default `'message'` topic is for Fae client-chat. Mismatched topics cause the assistant to hang in the `thinking` phase indefinitely.
|
|
70
|
+
|
|
71
|
+
**Source:** [`use-nats-chat-adapter.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-nats-chat-adapter.ts)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<!-- source-hash: 681c783784fdc89f0c86eb3e539c482b -->
|
|
2
|
+
Processes real-time NATS streaming chunks into structured message segments, managing streaming state, approval flows, direct-mode barriers, and tool execution events for AI assistant chat interfaces.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `useRealtimeChunkProcessor(options)`
|
|
7
|
+
|
|
8
|
+
Main hook export. Accepts `UseRealtimeChunkProcessorOptions` and returns `UseRealtimeChunkProcessorReturn`.
|
|
9
|
+
|
|
10
|
+
**Options:**
|
|
11
|
+
|
|
12
|
+
| Option | Type | Default | Description |
|
|
13
|
+
|---|---|---|---|
|
|
14
|
+
| `callbacks` | `object` | required | Event handlers (`onSegmentsUpdate`, `onStreamStart`, `onStreamEnd`, `onApprove`, `onReject`, etc.) |
|
|
15
|
+
| `displayApprovalTypes` | `string[]` | `['CLIENT']` | Approval types rendered inline; others are escalated |
|
|
16
|
+
| `approvalStatuses` | `object` | `{}` | Current status map keyed by `requestId` |
|
|
17
|
+
| `initialState` | `object` | — | Hydrates accumulator for resumed dialogs |
|
|
18
|
+
| `batchApprovalsEnabled` | `boolean` | `true` | Renders batch approvals as a single card; `false` unfolds into individual cards |
|
|
19
|
+
| `isDirectMode` | `boolean` | `false` | Activates the direct-mode barrier, dropping AI assistant chunks |
|
|
20
|
+
|
|
21
|
+
### Internal Refs
|
|
22
|
+
|
|
23
|
+
| Ref | Purpose |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `accumulatorRef` | `MessageSegmentAccumulator` instance managing segment state |
|
|
26
|
+
| `isInStreamRef` | Tracks open/closed stream window (`MESSAGE_START` → `MESSAGE_END`) |
|
|
27
|
+
| `hasEverStreamedRef` | Distinguishes cold-start vs. post-stream continuation for append mode |
|
|
28
|
+
| `directModeFlagRef` / `sawDirectMessageRef` | Direct-mode barrier gate |
|
|
29
|
+
| `directTeardownFiredRef` | One-shot guard: ensures teardown fires exactly once on barrier entry |
|
|
30
|
+
| `pendingEscalatedRef` | Map of escalated approval requests not shown inline |
|
|
31
|
+
|
|
32
|
+
### Supported Chunk Actions
|
|
33
|
+
|
|
34
|
+
| Action | Behavior |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `message_start` / `message_end` | Opens/closes stream, resets accumulator |
|
|
37
|
+
| `text` / `thinking` | Appends to accumulator; uses append-mode after `MESSAGE_END` |
|
|
38
|
+
| `tool_execution` | Routes in-stream to accumulator; post-stream to `onToolExecuted` callback |
|
|
39
|
+
| `approval_request` | Inline or escalated based on `displayApprovalTypes` |
|
|
40
|
+
| `approval_batch` | Single batch card, legacy card fan-out, or escalated |
|
|
41
|
+
| `metadata` | Forwarded directly to `onMetadata` |
|
|
42
|
+
| `direct_message` | Activates direct-mode barrier |
|
|
43
|
+
|
|
44
|
+
## Usage Example
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
const { processChunk } = useRealtimeChunkProcessor({
|
|
48
|
+
callbacks: {
|
|
49
|
+
onSegmentsUpdate: (segments, meta) => setSegments(segments),
|
|
50
|
+
onStreamStart: () => setIsStreaming(true),
|
|
51
|
+
onStreamEnd: () => setIsStreaming(false),
|
|
52
|
+
onApprove: (requestId) => approveAction(requestId),
|
|
53
|
+
onReject: (requestId) => rejectAction(requestId),
|
|
54
|
+
onEscalatedApproval: (requestId, data) => notifyAdmin(requestId, data),
|
|
55
|
+
onToolExecuted: (segment) => updateToolCard(segment),
|
|
56
|
+
onAgentBusy: () => showTypingIndicator(),
|
|
57
|
+
onMetadata: (meta) => handleMetadata(meta),
|
|
58
|
+
},
|
|
59
|
+
displayApprovalTypes: ['CLIENT'],
|
|
60
|
+
batchApprovalsEnabled: true,
|
|
61
|
+
isDirectMode: false,
|
|
62
|
+
approvalStatuses: { 'req-123': 'approved' },
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
// Wire to your NATS subscription
|
|
66
|
+
natsSubscription.onMessage((rawChunk) => {
|
|
67
|
+
processChunk(rawChunk)
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Direct-Mode Barrier
|
|
72
|
+
|
|
73
|
+
When `isDirectMode` is `true` or a `direct_message` chunk arrives, the hook drops all subsequent AI-assistant chunks (everything not in `DIRECT_MODE_ALLOWED`). Teardown fires exactly once — clearing the typing indicator, composer lock, and in-progress bubble — even if no stream is currently open (e.g., during post-approval tool execution).
|
|
74
|
+
|
|
75
|
+
## Source
|
|
76
|
+
|
|
77
|
+
[`use-realtime-chunk-processor.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-realtime-chunk-processor.ts)
|
|
@@ -5,6 +5,7 @@ export * from './use-collapsible'
|
|
|
5
5
|
export * from './use-scripted-stream'
|
|
6
6
|
export * from './use-jetstream-dialog-subscription'
|
|
7
7
|
export * from './use-nats-dialog-subscription'
|
|
8
|
+
export * from './use-realtime-chunk-processor'
|
|
8
9
|
|
|
9
10
|
// Chat hooks migrated from hub `hooks/*` (Task #7).
|
|
10
11
|
export * from './use-slash-commands'
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* @deprecated Phase 3 of the chat unification moved the SSE adapter off this
|
|
5
|
-
* hook — its trailing-assistant merge + `decision_resolved` receipt path now
|
|
6
|
-
* live in `../stream/chat-stream-reducer` (transport: 'sse'). No lib-internal
|
|
7
|
-
* code consumes `useChat`/`useSSE` anymore; they remain exported for external
|
|
8
|
-
* consumers until Phase 4 migrates them, then get deleted (Phase 6).
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
3
|
import { useState, useCallback, useEffect, useRef } from 'react'
|
|
12
4
|
import { useSSE, type StreamFn, type StreamFnExtraOptions } from './use-sse'
|
|
13
5
|
import type {
|