@@ -167,6 +167,102 @@ fn initial_session_context_uses_current_cwd_when_inserted() -> Result<()> {
167167 Ok ( ( ) )
168168}
169169
170+ #[ test]
171+ fn initial_session_context_can_refresh_before_real_conversation ( ) -> Result < ( ) > {
172+ let _env_lock = lock_env ( ) ;
173+ let original_cwd = std:: env:: current_dir ( ) . map_err ( |e| anyhow ! ( e) ) ?;
174+ let first_dir = tempfile:: Builder :: new ( )
175+ . prefix ( "jcode-session-context-stale-" )
176+ . tempdir ( )
177+ . map_err ( |e| anyhow ! ( e) ) ?;
178+ let second_dir = tempfile:: Builder :: new ( )
179+ . prefix ( "jcode-session-context-real-" )
180+ . tempdir ( )
181+ . map_err ( |e| anyhow ! ( e) ) ?;
182+
183+ std:: env:: set_current_dir ( first_dir. path ( ) ) . map_err ( |e| anyhow ! ( e) ) ?;
184+ let result: std:: result:: Result < ( ) , anyhow:: Error > = ( || {
185+ let mut session = Session :: create_with_id (
186+ "session_context_remote_cwd_refresh_test" . to_string ( ) ,
187+ None ,
188+ Some ( "Remote cwd refresh" . to_string ( ) ) ,
189+ ) ;
190+ assert ! ( session. ensure_initial_session_context_message( ) ) ;
191+ assert ! ( session. messages[ 0 ] . content_preview( ) . contains( & format!(
192+ "Working directory: {}" ,
193+ first_dir. path( ) . display( )
194+ ) ) ) ;
195+
196+ session. working_dir = Some ( second_dir. path ( ) . display ( ) . to_string ( ) ) ;
197+ assert ! ( session. refresh_initial_session_context_message( ) ) ;
198+ let refreshed = session. messages [ 0 ] . content_preview ( ) ;
199+ assert ! (
200+ refreshed. contains( & format!(
201+ "Working directory: {}" ,
202+ second_dir. path( ) . display( )
203+ ) ) ,
204+ "session context should refresh to subscribed cwd, got: {refreshed}"
205+ ) ;
206+ assert ! ( !refreshed. contains( & format!(
207+ "Working directory: {}" ,
208+ first_dir. path( ) . display( )
209+ ) ) ) ;
210+ Ok ( ( ) )
211+ } ) ( ) ;
212+ std:: env:: set_current_dir ( original_cwd) . map_err ( |e| anyhow ! ( e) ) ?;
213+ result?;
214+
215+ Ok ( ( ) )
216+ }
217+
218+ #[ test]
219+ fn initial_session_context_does_not_refresh_after_real_conversation ( ) -> Result < ( ) > {
220+ let _env_lock = lock_env ( ) ;
221+ let original_cwd = std:: env:: current_dir ( ) . map_err ( |e| anyhow ! ( e) ) ?;
222+ let first_dir = tempfile:: Builder :: new ( )
223+ . prefix ( "jcode-session-context-original-" )
224+ . tempdir ( )
225+ . map_err ( |e| anyhow ! ( e) ) ?;
226+ let second_dir = tempfile:: Builder :: new ( )
227+ . prefix ( "jcode-session-context-late-" )
228+ . tempdir ( )
229+ . map_err ( |e| anyhow ! ( e) ) ?;
230+
231+ std:: env:: set_current_dir ( first_dir. path ( ) ) . map_err ( |e| anyhow ! ( e) ) ?;
232+ let result: std:: result:: Result < ( ) , anyhow:: Error > = ( || {
233+ let mut session = Session :: create_with_id (
234+ "session_context_late_cwd_refresh_test" . to_string ( ) ,
235+ None ,
236+ Some ( "Late cwd refresh" . to_string ( ) ) ,
237+ ) ;
238+ assert ! ( session. ensure_initial_session_context_message( ) ) ;
239+ session. add_message (
240+ Role :: User ,
241+ vec ! [ ContentBlock :: Text {
242+ text: "hello" . to_string( ) ,
243+ cache_control: None ,
244+ } ] ,
245+ ) ;
246+
247+ session. working_dir = Some ( second_dir. path ( ) . display ( ) . to_string ( ) ) ;
248+ assert ! ( !session. refresh_initial_session_context_message( ) ) ;
249+ let original = session. messages [ 0 ] . content_preview ( ) ;
250+ assert ! ( original. contains( & format!(
251+ "Working directory: {}" ,
252+ first_dir. path( ) . display( )
253+ ) ) ) ;
254+ assert ! ( !original. contains( & format!(
255+ "Working directory: {}" ,
256+ second_dir. path( ) . display( )
257+ ) ) ) ;
258+ Ok ( ( ) )
259+ } ) ( ) ;
260+ std:: env:: set_current_dir ( original_cwd) . map_err ( |e| anyhow ! ( e) ) ?;
261+ result?;
262+
263+ Ok ( ( ) )
264+ }
265+
170266#[ test]
171267fn existing_non_empty_session_does_not_get_retroactive_session_context ( ) {
172268 let mut session = Session :: create_with_id (
0 commit comments