@@ -149,10 +149,9 @@ import { isP2pDiscussionVisibleInSubSessionBar } from './p2p-discussion-scope.js
149149import {
150150 extractTransportPendingMessages ,
151151 extractTransportPendingVersion ,
152+ hasExplicitTransportPendingSnapshot ,
152153 mergeTransportPendingEntriesForIdleState ,
153154 mergeTransportPendingEntriesForRunningState ,
154- mergeTransportPendingMessagesForIdleState ,
155- mergeTransportPendingMessagesForRunningState ,
156155 nextTransportQueueVersion ,
157156 normalizeTransportPendingEntries ,
158157 removeTransportPendingEntryForUserMessage ,
@@ -2957,15 +2956,19 @@ export function App() {
29572956 // Sync session state from live timeline events (running/idle)
29582957 if ( event . type === 'session.state' && ! event . sessionId . startsWith ( 'deck_sub_' ) ) {
29592958 const liveState = String ( event . payload . state ?? '' ) ;
2960- const hasPendingMessagesField = Object . prototype . hasOwnProperty . call ( event . payload ?? { } , 'pendingMessages' ) ;
2959+ const hasPendingSnapshot = hasExplicitTransportPendingSnapshot ( event . payload ) ;
29612960 const incomingVersion = extractTransportPendingVersion ( event . payload . pendingMessageVersion ) ;
29622961 if ( liveState === 'queued' ) {
2963- const pendingMessages = extractTransportPendingMessages ( event . payload . pendingMessages ) ;
2962+ const hasPendingEntriesField = Object . prototype . hasOwnProperty . call ( event . payload , 'pendingMessageEntries' ) ;
2963+ const hasPendingMessagesField = Object . prototype . hasOwnProperty . call ( event . payload , 'pendingMessages' ) ;
2964+ const parsedPendingMessages = extractTransportPendingMessages ( event . payload . pendingMessages ) ;
29642965 const pendingEntries = normalizeTransportPendingEntries (
29652966 event . payload . pendingMessageEntries ,
2966- pendingMessages ,
2967+ parsedPendingMessages ,
29672968 event . sessionId ,
2969+ { hasEntriesField : hasPendingEntriesField , hasMessagesField : hasPendingMessagesField } ,
29682970 ) ;
2971+ const pendingMessages = hasPendingEntriesField ? pendingEntries . map ( ( entry ) => entry . text ) : parsedPendingMessages ;
29692972 setSessions ( ( prev ) => prev . map ( ( s ) => {
29702973 if ( s . name !== event . sessionId ) return s ;
29712974 // Drop a stale `queued` snapshot wholesale: it would otherwise
@@ -2986,33 +2989,34 @@ export function App() {
29862989 } else if ( liveState === 'running' ) {
29872990 setSessions ( ( prev ) => prev . map ( ( s ) => {
29882991 if ( s . name !== event . sessionId ) return s ;
2989- const incomingMessages = extractTransportPendingMessages ( event . payload . pendingMessages ) ;
2992+ const hasPendingEntriesField = Object . prototype . hasOwnProperty . call ( event . payload , 'pendingMessageEntries' ) ;
2993+ const hasPendingMessagesField = Object . prototype . hasOwnProperty . call ( event . payload , 'pendingMessages' ) ;
2994+ const parsedIncomingMessages = extractTransportPendingMessages ( event . payload . pendingMessages ) ;
29902995 const incomingEntries = normalizeTransportPendingEntries (
29912996 event . payload . pendingMessageEntries ,
2992- incomingMessages ,
2997+ parsedIncomingMessages ,
29932998 event . sessionId ,
2999+ { hasEntriesField : hasPendingEntriesField , hasMessagesField : hasPendingMessagesField } ,
29943000 ) ;
3001+ const incomingMessages = hasPendingEntriesField ? incomingEntries . map ( ( entry ) => entry . text ) : parsedIncomingMessages ;
29953002 const applyPending = shouldApplyTransportQueueSnapshotForPayload ( s . transportPendingMessageVersion , incomingVersion , {
2996- hasExplicitSnapshot : hasPendingMessagesField ,
2997- isExplicitEmpty : hasPendingMessagesField && incomingMessages . length === 0 && incomingEntries . length === 0 ,
3003+ hasExplicitSnapshot : hasPendingSnapshot ,
3004+ isExplicitEmpty : hasPendingSnapshot && incomingMessages . length === 0 && incomingEntries . length === 0 ,
29983005 } ) ;
29993006 return {
30003007 ...s ,
30013008 state : 'running' as SessionInfo [ 'state' ] ,
30023009 transportPendingMessages : applyPending
3003- ? mergeTransportPendingMessagesForRunningState (
3004- s . transportPendingMessages ,
3005- event . payload . pendingMessages ,
3006- hasPendingMessagesField ,
3007- )
3010+ ? incomingMessages
30083011 : ( s . transportPendingMessages ?? [ ] ) ,
30093012 transportPendingMessageEntries : applyPending
30103013 ? mergeTransportPendingEntriesForRunningState (
30113014 s . transportPendingMessageEntries ,
30123015 event . payload . pendingMessageEntries ,
30133016 event . payload . pendingMessages ,
3014- hasPendingMessagesField ,
3017+ hasPendingSnapshot ,
30153018 event . sessionId ,
3019+ hasPendingEntriesField ,
30163020 )
30173021 : ( s . transportPendingMessageEntries ?? [ ] ) ,
30183022 transportPendingMessageVersion : applyPending
@@ -3023,33 +3027,34 @@ export function App() {
30233027 } else if ( liveState === 'idle' ) {
30243028 setSessions ( ( prev ) => prev . map ( ( s ) => {
30253029 if ( s . name !== event . sessionId ) return s ;
3026- const incomingMessages = extractTransportPendingMessages ( event . payload . pendingMessages ) ;
3030+ const hasPendingEntriesField = Object . prototype . hasOwnProperty . call ( event . payload , 'pendingMessageEntries' ) ;
3031+ const hasPendingMessagesField = Object . prototype . hasOwnProperty . call ( event . payload , 'pendingMessages' ) ;
3032+ const parsedIncomingMessages = extractTransportPendingMessages ( event . payload . pendingMessages ) ;
30273033 const incomingEntries = normalizeTransportPendingEntries (
30283034 event . payload . pendingMessageEntries ,
3029- incomingMessages ,
3035+ parsedIncomingMessages ,
30303036 event . sessionId ,
3037+ { hasEntriesField : hasPendingEntriesField , hasMessagesField : hasPendingMessagesField } ,
30313038 ) ;
3039+ const incomingMessages = hasPendingEntriesField ? incomingEntries . map ( ( entry ) => entry . text ) : parsedIncomingMessages ;
30323040 const applyPending = shouldApplyTransportQueueSnapshotForPayload ( s . transportPendingMessageVersion , incomingVersion , {
3033- hasExplicitSnapshot : hasPendingMessagesField ,
3034- isExplicitEmpty : hasPendingMessagesField && incomingMessages . length === 0 && incomingEntries . length === 0 ,
3041+ hasExplicitSnapshot : hasPendingSnapshot ,
3042+ isExplicitEmpty : hasPendingSnapshot && incomingMessages . length === 0 && incomingEntries . length === 0 ,
30353043 } ) ;
30363044 return {
30373045 ...s ,
30383046 state : liveState as SessionInfo [ 'state' ] ,
30393047 transportPendingMessages : applyPending
3040- ? mergeTransportPendingMessagesForIdleState (
3041- s . transportPendingMessages ,
3042- event . payload . pendingMessages ,
3043- hasPendingMessagesField ,
3044- )
3048+ ? incomingMessages
30453049 : ( s . transportPendingMessages ?? [ ] ) ,
30463050 transportPendingMessageEntries : applyPending
30473051 ? mergeTransportPendingEntriesForIdleState (
30483052 s . transportPendingMessageEntries ,
30493053 event . payload . pendingMessageEntries ,
30503054 event . payload . pendingMessages ,
3051- hasPendingMessagesField ,
3055+ hasPendingSnapshot ,
30523056 event . sessionId ,
3057+ hasPendingEntriesField ,
30533058 )
30543059 : ( s . transportPendingMessageEntries ?? [ ] ) ,
30553060 transportPendingMessageVersion : applyPending
0 commit comments