@flamingo-stack/openframe-frontend-core 0.0.497 → 0.0.498-1506.4000.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.
- 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 +207 -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 +500 -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 +484 -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-2DER2JSI.cjs → chunk-242K7LZY.cjs} +11 -11
- package/dist/{chunk-2DER2JSI.cjs.map → chunk-242K7LZY.cjs.map} +1 -1
- package/dist/{chunk-VBSS4TPV.cjs → chunk-2LYA3RBT.cjs} +37 -37
- package/dist/{chunk-VBSS4TPV.cjs.map → chunk-2LYA3RBT.cjs.map} +1 -1
- package/dist/{chunk-ZPUCCSYA.js → chunk-34C2JV2C.js} +2 -2
- package/dist/{chunk-GWVNRXJU.js → chunk-3VGRZ62V.js} +2 -2
- package/dist/{chunk-AAHAVML2.js → chunk-42NYDEHH.js} +2 -2
- package/dist/{chunk-ZEHA4IC7.js → chunk-42SMPKGY.js} +2 -2
- package/dist/{chunk-RTG5DJWM.cjs → chunk-44C23SSC.cjs} +5 -5
- package/dist/{chunk-RTG5DJWM.cjs.map → chunk-44C23SSC.cjs.map} +1 -1
- package/dist/{chunk-SL62IZ3I.cjs → chunk-4KKGHPNE.cjs} +9 -9
- package/dist/{chunk-SL62IZ3I.cjs.map → chunk-4KKGHPNE.cjs.map} +1 -1
- package/dist/{chunk-X2CYUCGL.cjs → chunk-5BQWVNRS.cjs} +62 -62
- package/dist/{chunk-X2CYUCGL.cjs.map → chunk-5BQWVNRS.cjs.map} +1 -1
- package/dist/{chunk-HRUXC3YN.js → chunk-5QWYIPMH.js} +2 -2
- package/dist/{chunk-NT3BKPEC.js → chunk-5ZY5JM4Z.js} +10 -10
- package/dist/chunk-5ZY5JM4Z.js.map +1 -0
- package/dist/{chunk-4C764VBX.cjs → chunk-62TM2RVZ.cjs} +26 -26
- package/dist/{chunk-4C764VBX.cjs.map → chunk-62TM2RVZ.cjs.map} +1 -1
- package/dist/{chunk-YBTYHIXA.js → chunk-632XJ2ZT.js} +6 -5
- package/dist/chunk-632XJ2ZT.js.map +1 -0
- package/dist/{chunk-DGDUOFNY.js → chunk-BUBQEZ5J.js} +2 -2
- package/dist/{chunk-ZAAIVSX6.js → chunk-D3LUKR2Y.js} +11964 -9714
- package/dist/chunk-D3LUKR2Y.js.map +1 -0
- package/dist/{chunk-5KSXMJXF.cjs → chunk-EO35UHFT.cjs} +60 -60
- package/dist/chunk-EO35UHFT.cjs.map +1 -0
- package/dist/{chunk-5YKUEZIA.cjs → chunk-EORFD5WB.cjs} +15 -15
- package/dist/{chunk-5YKUEZIA.cjs.map → chunk-EORFD5WB.cjs.map} +1 -1
- package/dist/{chunk-MEIMDHQ2.cjs → chunk-F7XPMG25.cjs} +28 -27
- package/dist/chunk-F7XPMG25.cjs.map +1 -0
- package/dist/{chunk-I74ADMZS.cjs → chunk-H6GFQ4AO.cjs} +7 -7
- package/dist/{chunk-I74ADMZS.cjs.map → chunk-H6GFQ4AO.cjs.map} +1 -1
- package/dist/{chunk-EOYFMWDT.cjs → chunk-J3NHQ4JB.cjs} +31 -31
- package/dist/{chunk-EOYFMWDT.cjs.map → chunk-J3NHQ4JB.cjs.map} +1 -1
- package/dist/{chunk-23QJPSZJ.cjs → chunk-SS3D3DHL.cjs} +7049 -4799
- package/dist/chunk-SS3D3DHL.cjs.map +1 -0
- package/dist/{chunk-6XQGPFIR.js → chunk-WNXIG6YY.js} +2 -2
- package/dist/{chunk-5INZDVGI.js → chunk-WZCQW4MW.js} +4 -4
- package/dist/{chunk-B3MRHZNZ.js → chunk-ZHC2BCXK.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 +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 +367 -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/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/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 +20 -20
- package/dist/components/help-center-pages/index.js +11 -11
- package/dist/components/index.cjs +172 -130
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +63 -21
- 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/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/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 +317 -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 +232 -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 +245 -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 +258 -0
- package/src/components/chat/__tests__/chat-message-list.test.tsx +381 -6
- 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 +409 -132
- 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 +940 -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 +1248 -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 +1876 -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/api.types.ts +6 -73
- package/src/components/chat/types/processing.types.ts +11 -53
- 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__/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 +63 -5
- package/src/components/chat/utils/index.ts +5 -8
- package/src/components/chat/utils/process-historical-messages.ts +358 -386
- 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-23QJPSZJ.cjs.map +0 -1
- package/dist/chunk-5KSXMJXF.cjs.map +0 -1
- package/dist/chunk-MEIMDHQ2.cjs.map +0 -1
- package/dist/chunk-NT3BKPEC.js.map +0 -1
- package/dist/chunk-YBTYHIXA.js.map +0 -1
- package/dist/chunk-ZAAIVSX6.js.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-ZPUCCSYA.js.map → chunk-34C2JV2C.js.map} +0 -0
- /package/dist/{chunk-GWVNRXJU.js.map → chunk-3VGRZ62V.js.map} +0 -0
- /package/dist/{chunk-AAHAVML2.js.map → chunk-42NYDEHH.js.map} +0 -0
- /package/dist/{chunk-ZEHA4IC7.js.map → chunk-42SMPKGY.js.map} +0 -0
- /package/dist/{chunk-HRUXC3YN.js.map → chunk-5QWYIPMH.js.map} +0 -0
- /package/dist/{chunk-DGDUOFNY.js.map → chunk-BUBQEZ5J.js.map} +0 -0
- /package/dist/{chunk-6XQGPFIR.js.map → chunk-WNXIG6YY.js.map} +0 -0
- /package/dist/{chunk-5INZDVGI.js.map → chunk-WZCQW4MW.js.map} +0 -0
- /package/dist/{chunk-B3MRHZNZ.js.map → chunk-ZHC2BCXK.js.map} +0 -0
|
@@ -9,6 +9,18 @@ import type {
|
|
|
9
9
|
PendingApproval,
|
|
10
10
|
ExecutingToolState,
|
|
11
11
|
} from '../types'
|
|
12
|
+
import type { InitializeExtras } from '../stream/chat-stream-reducer'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* What the realtime accumulator needs to RESUME an unfinished turn.
|
|
16
|
+
*
|
|
17
|
+
* DERIVED, not restated: this is exactly the reducer's `InitializeExtras`
|
|
18
|
+
* minus `escalatedApprovals` (which only the live stream can produce — it has
|
|
19
|
+
* no historical representation to extract). Hosts pass the result straight
|
|
20
|
+
* into `reducer.initializeWithState(messages, extras)`, so the two must not
|
|
21
|
+
* drift; a structural coincidence is not a contract.
|
|
22
|
+
*/
|
|
23
|
+
export type IncompleteMessageState = Omit<InitializeExtras, 'escalatedApprovals'>
|
|
12
24
|
|
|
13
25
|
/**
|
|
14
26
|
* Extract incomplete message state from the last historical assistant message
|
|
@@ -16,11 +28,7 @@ import type {
|
|
|
16
28
|
*/
|
|
17
29
|
export function extractIncompleteMessageState(
|
|
18
30
|
lastMessage: ProcessedMessage | undefined
|
|
19
|
-
): {
|
|
20
|
-
existingSegments?: MessageSegment[]
|
|
21
|
-
pendingApprovals?: Map<string, PendingApproval>
|
|
22
|
-
executingTools?: Map<string, ExecutingToolState>
|
|
23
|
-
} | undefined {
|
|
31
|
+
): IncompleteMessageState | undefined {
|
|
24
32
|
if (!lastMessage || lastMessage.role !== 'assistant' || typeof lastMessage.content === 'string') {
|
|
25
33
|
return undefined
|
|
26
34
|
}
|
|
@@ -92,4 +100,54 @@ export function extractIncompleteMessageState(
|
|
|
92
100
|
pendingApprovals: pendingApprovals.size > 0 ? pendingApprovals : undefined,
|
|
93
101
|
executingTools: executingTools.size > 0 ? executingTools : undefined,
|
|
94
102
|
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* THREAD-level generalization of `extractIncompleteMessageState`: given a
|
|
107
|
+
* processed thread, look at the TRAILING RUN of consecutive assistant
|
|
108
|
+
* messages (not just the very last row), flatten it to one segment list, and
|
|
109
|
+
* ask the single-message extractor whether that tail is unfinished.
|
|
110
|
+
*
|
|
111
|
+
* Why the run and not the last row: the backend can split one logical turn
|
|
112
|
+
* across several assistant messages (a preamble bubble, then the approval
|
|
113
|
+
* card, then the continuation). The unfinished artifact — a pending approval,
|
|
114
|
+
* an EXECUTING_TOOL with no result, an open compaction — can therefore sit in
|
|
115
|
+
* an EARLIER bubble of the same trailing run, and a last-row-only check
|
|
116
|
+
* reports "complete" while the turn is very much still in flight.
|
|
117
|
+
*
|
|
118
|
+
* SSOT for every "is the tail incomplete?" question — the NATS adapter (which
|
|
119
|
+
* used to inline the single-row check) and hosts replaying a stored thread
|
|
120
|
+
* both call this instead of re-deriving the walk.
|
|
121
|
+
*
|
|
122
|
+
* A trailing non-assistant row (user / error) means the last turn closed →
|
|
123
|
+
* `undefined`.
|
|
124
|
+
*/
|
|
125
|
+
export function extractIncompleteTailState(
|
|
126
|
+
messages: readonly ProcessedMessage[] | undefined,
|
|
127
|
+
): IncompleteMessageState | undefined {
|
|
128
|
+
if (!messages || messages.length === 0) return undefined
|
|
129
|
+
|
|
130
|
+
// Walk back over the trailing consecutive assistant run.
|
|
131
|
+
let start = messages.length
|
|
132
|
+
while (start > 0 && messages[start - 1]?.role === 'assistant') start -= 1
|
|
133
|
+
if (start === messages.length) return undefined
|
|
134
|
+
|
|
135
|
+
const segments: MessageSegment[] = []
|
|
136
|
+
for (let i = start; i < messages.length; i += 1) {
|
|
137
|
+
const content = messages[i]?.content
|
|
138
|
+
// A string-content assistant row is a plain-text bubble with nothing to
|
|
139
|
+
// resume; skip it rather than aborting — a later row in the same run may
|
|
140
|
+
// still hold the unfinished segment.
|
|
141
|
+
if (Array.isArray(content)) segments.push(...(content as MessageSegment[]))
|
|
142
|
+
}
|
|
143
|
+
if (segments.length === 0) return undefined
|
|
144
|
+
|
|
145
|
+
// Reuse the single-message extractor verbatim by handing it a synthetic
|
|
146
|
+
// assistant row carrying the flattened run — one incompleteness rule set,
|
|
147
|
+
// not two.
|
|
148
|
+
return extractIncompleteMessageState({
|
|
149
|
+
...messages[messages.length - 1],
|
|
150
|
+
role: 'assistant',
|
|
151
|
+
content: segments,
|
|
152
|
+
} as ProcessedMessage)
|
|
95
153
|
}
|
|
@@ -3,14 +3,9 @@
|
|
|
3
3
|
* Export all utilities for processing chat messages
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
isControlChunk,
|
|
10
|
-
isErrorChunk,
|
|
11
|
-
isMetadataChunk,
|
|
12
|
-
extractTextFromChunk,
|
|
13
|
-
} from './chunk-parser'
|
|
6
|
+
// NOTE: NATS chunk parsing lives in `chat-protocol/nats-decoder`
|
|
7
|
+
// (`decodeNatsChunk`) — the legacy `chunk-parser` module was deleted once the
|
|
8
|
+
// reducer became the single reading path.
|
|
14
9
|
|
|
15
10
|
// Segment accumulator
|
|
16
11
|
export {
|
|
@@ -24,11 +19,13 @@ export {
|
|
|
24
19
|
processHistoricalMessages,
|
|
25
20
|
extractErrorMessages,
|
|
26
21
|
processHistoricalMessagesWithErrors,
|
|
22
|
+
decodeHistoricalMessageData,
|
|
27
23
|
} from './process-historical-messages'
|
|
28
24
|
|
|
29
25
|
// Incomplete message state extraction
|
|
30
26
|
export {
|
|
31
27
|
extractIncompleteMessageState,
|
|
28
|
+
extractIncompleteTailState,
|
|
32
29
|
} from './extract-incomplete-message-state'
|
|
33
30
|
|
|
34
31
|
// History <-> realtime reconciliation
|