@@ -63,7 +63,7 @@ test("getProjectCode shortens long project roots for Windows-compatible storage
6363 assert . notEqual ( projectCode , longRoot . replace ( / [ \\ / ] / g, "-" ) . replace ( / : / g, "" ) ) ;
6464} ) ;
6565
66- test ( "SessionManager preserves structured system content when building OpenAI messages" , ( ) => {
66+ test ( "SessionManager preserves structured user content when building OpenAI messages" , ( ) => {
6767 const manager = new SessionManager ( {
6868 projectRoot : process . cwd ( ) ,
6969 createOpenAIClient : ( ) => ( {
@@ -78,9 +78,9 @@ test("SessionManager preserves structured system content when building OpenAI me
7878
7979 const messages : SessionMessage [ ] = [
8080 {
81- id : "system -image" ,
81+ id : "user -image" ,
8282 sessionId : "session-1" ,
83- role : "system " ,
83+ role : "user " ,
8484 content : "The read tool has loaded `pixel.png`." ,
8585 contentParams : [
8686 {
@@ -102,7 +102,7 @@ test("SessionManager preserves structured system content when building OpenAI me
102102 } > ;
103103
104104 assert . equal ( openAIMessages . length , 1 ) ;
105- assert . equal ( openAIMessages [ 0 ] ?. role , "system " ) ;
105+ assert . equal ( openAIMessages [ 0 ] ?. role , "user " ) ;
106106 assert . deepEqual ( openAIMessages [ 0 ] ?. content , [
107107 { type : "text" , text : "The read tool has loaded `pixel.png`." } ,
108108 {
@@ -112,6 +112,32 @@ test("SessionManager preserves structured system content when building OpenAI me
112112 ] ) ;
113113} ) ;
114114
115+ test ( "SessionManager builds hidden user messages for image follow-ups" , ( ) => {
116+ const manager = new SessionManager ( {
117+ projectRoot : process . cwd ( ) ,
118+ createOpenAIClient : ( ) => ( {
119+ client : null ,
120+ model : "test-model" ,
121+ thinkingEnabled : false ,
122+ } ) ,
123+ getResolvedSettings : ( ) => ( { model : "test-model" } ) ,
124+ renderMarkdown : ( text ) => text ,
125+ onAssistantMessage : ( ) => { } ,
126+ } ) ;
127+
128+ const message = ( manager as any ) . buildFollowUpMessage ( "session-1" , {
129+ role : "user" ,
130+ content : "The read tool has loaded `pixel.png`." ,
131+ contentParams : [ { type : "image_url" , image_url : { url : "data:image/png;base64,abc123" } } ] ,
132+ visible : false ,
133+ } ) ;
134+
135+ assert . equal ( message . role , "user" ) ;
136+ assert . equal ( message . visible , false ) ;
137+ assert . equal ( message . meta , undefined ) ;
138+ assert . equal ( message . checkpointHash , undefined ) ;
139+ } ) ;
140+
115141test ( "non-interactive SessionManager removes AskUserQuestion docs from restored requests" , ( ) => {
116142 const manager = new SessionManager ( {
117143 projectRoot : process . cwd ( ) ,
0 commit comments