@@ -22,6 +22,7 @@ import {
2222 consumeCompressionStart ,
2323 resolveCompressionDuration ,
2424} from "./compress/timing"
25+ import { filterProcessableMessages } from "./messages/shape"
2526import {
2627 applyPendingManualTrigger ,
2728 handleContextCommand ,
@@ -103,41 +104,49 @@ export function createChatMessageTransformHandler(
103104 hostPermissions : HostPermissionSnapshot ,
104105) {
105106 return async ( input : { } , output : { messages : WithParts [ ] } ) => {
106- await checkSession ( client , state , logger , output . messages , config . manualMode . enabled )
107+ const messages = filterProcessableMessages ( output . messages )
108+ if ( messages . length !== output . messages . length ) {
109+ logger . warn ( "Skipping messages with unexpected shape during chat transform" , {
110+ received : output . messages . length ,
111+ usable : messages . length ,
112+ } )
113+ }
114+
115+ await checkSession ( client , state , logger , messages , config . manualMode . enabled )
107116
108- syncCompressPermissionState ( state , config , hostPermissions , output . messages )
117+ syncCompressPermissionState ( state , config , hostPermissions , messages )
109118
110119 if ( state . isSubAgent && ! config . experimental . allowSubAgents ) {
111120 return
112121 }
113122
114123 stripHallucinations ( output . messages )
115- cacheSystemPromptTokens ( state , output . messages )
116- assignMessageRefs ( state , output . messages )
117- syncCompressionBlocks ( state , logger , output . messages )
118- syncToolCache ( state , config , logger , output . messages )
119- buildToolIdList ( state , output . messages )
120- prune ( state , logger , config , output . messages )
124+ cacheSystemPromptTokens ( state , messages )
125+ assignMessageRefs ( state , messages )
126+ syncCompressionBlocks ( state , logger , messages )
127+ syncToolCache ( state , config , logger , messages )
128+ buildToolIdList ( state , messages )
129+ prune ( state , logger , config , messages )
121130 await injectExtendedSubAgentResults (
122131 client ,
123132 state ,
124133 logger ,
125- output . messages ,
134+ messages ,
126135 config . experimental . allowSubAgents ,
127136 )
128- const compressionPriorities = buildPriorityMap ( config , state , output . messages )
137+ const compressionPriorities = buildPriorityMap ( config , state , messages )
129138 prompts . reload ( )
130139 injectCompressNudges (
131140 state ,
132141 config ,
133142 logger ,
134- output . messages ,
143+ messages ,
135144 prompts . getRuntimePrompts ( ) ,
136145 compressionPriorities ,
137146 )
138- injectMessageIds ( state , config , output . messages , compressionPriorities )
139- applyPendingManualTrigger ( state , output . messages , logger )
140- stripStaleMetadata ( output . messages )
147+ injectMessageIds ( state , config , messages , compressionPriorities )
148+ applyPendingManualTrigger ( state , messages , logger )
149+ stripStaleMetadata ( messages )
141150
142151 if ( state . sessionId ) {
143152 await logger . saveContext ( state . sessionId , output . messages )
@@ -165,7 +174,7 @@ export function createCommandExecuteHandler(
165174 const messagesResponse = await client . session . messages ( {
166175 path : { id : input . sessionID } ,
167176 } )
168- const messages = ( messagesResponse . data || messagesResponse ) as WithParts [ ]
177+ const messages = filterProcessableMessages ( messagesResponse . data || messagesResponse )
169178
170179 await ensureSessionInitialized (
171180 client ,
0 commit comments