@@ -244,13 +244,48 @@ async def _failing_rpc(*args, **kwargs):
244244class TestSessionCwd :
245245 """Tests for session cwd resolution in create_session and _load_session_rpc."""
246246
247- async def test_create_session_uses_root_dir (self ):
248- """create_session uses persona.parent.root_dir as cwd."""
247+ async def test_create_session_uses_chat_metadata_cwd (self ):
248+ """create_session joins chat metadata cwd with root_dir ."""
249249 client , conn , _ = _make_client_and_persona ()
250250 client ._get_mcp_servers = AsyncMock (return_value = [])
251251
252252 persona = MagicMock ()
253253 persona .parent .root_dir = "/home/user/notebooks"
254+ persona .ychat .get_metadata .return_value = {"cwd" : "projects/my-repo" }
255+ persona .get_chat_dir .return_value = "/home/user/notebooks/.jupyter/chats"
256+
257+ conn .new_session = AsyncMock (return_value = MagicMock (session_id = "s1" ))
258+
259+ await client .create_session (persona )
260+
261+ conn .new_session .assert_called_once ()
262+ assert conn .new_session .call_args .kwargs ["cwd" ] == "/home/user/notebooks/projects/my-repo"
263+
264+ async def test_create_session_uses_root_dir_when_no_chat_cwd (self ):
265+ """create_session falls back to root_dir when chat metadata has no cwd."""
266+ client , conn , _ = _make_client_and_persona ()
267+ client ._get_mcp_servers = AsyncMock (return_value = [])
268+
269+ persona = MagicMock ()
270+ persona .parent .root_dir = "/home/user/notebooks"
271+ persona .ychat .get_metadata .return_value = {}
272+ persona .get_chat_dir .return_value = "/home/user/notebooks/.jupyter/chats"
273+
274+ conn .new_session = AsyncMock (return_value = MagicMock (session_id = "s1" ))
275+
276+ await client .create_session (persona )
277+
278+ conn .new_session .assert_called_once ()
279+ assert conn .new_session .call_args .kwargs ["cwd" ] == "/home/user/notebooks"
280+
281+ async def test_create_session_uses_root_dir_when_chat_cwd_is_root (self ):
282+ """create_session uses root_dir when chat cwd is '/' (file browser root)."""
283+ client , conn , _ = _make_client_and_persona ()
284+ client ._get_mcp_servers = AsyncMock (return_value = [])
285+
286+ persona = MagicMock ()
287+ persona .parent .root_dir = "/home/user/notebooks"
288+ persona .ychat .get_metadata .return_value = {"cwd" : "/" }
254289 persona .get_chat_dir .return_value = "/home/user/notebooks/.jupyter/chats"
255290
256291 conn .new_session = AsyncMock (return_value = MagicMock (session_id = "s1" ))
@@ -267,6 +302,7 @@ async def test_create_session_falls_back_to_chat_dir(self):
267302
268303 persona = MagicMock ()
269304 persona .parent .root_dir = None
305+ persona .ychat .get_metadata .return_value = {}
270306 persona .get_chat_dir .return_value = "/home/user/.jupyter/chats"
271307
272308 conn .new_session = AsyncMock (return_value = MagicMock (session_id = "s1" ))
@@ -276,18 +312,19 @@ async def test_create_session_falls_back_to_chat_dir(self):
276312 conn .new_session .assert_called_once ()
277313 assert conn .new_session .call_args .kwargs ["cwd" ] == "/home/user/.jupyter/chats"
278314
279- async def test_load_session_uses_root_dir (self ):
280- """_load_session_rpc uses persona.parent.root_dir as cwd."""
315+ async def test_load_session_uses_chat_metadata_cwd (self ):
316+ """_load_session_rpc joins chat metadata cwd with root_dir ."""
281317 client , conn , _ = _make_client_and_persona ()
282318 client ._get_mcp_servers = AsyncMock (return_value = [])
283319
284320 persona = MagicMock ()
285321 persona .parent .root_dir = "/home/user/notebooks"
322+ persona .ychat .get_metadata .return_value = {"cwd" : "projects/my-repo" }
286323 persona .get_chat_dir .return_value = "/home/user/notebooks/.jupyter/chats"
287324
288325 conn .load_session = AsyncMock (return_value = MagicMock (session_id = "s1" ))
289326
290327 await client ._load_session_rpc (persona , "s1" )
291328
292329 conn .load_session .assert_called_once ()
293- assert conn .load_session .call_args .kwargs ["cwd" ] == "/home/user/notebooks"
330+ assert conn .load_session .call_args .kwargs ["cwd" ] == "/home/user/notebooks/projects/my-repo "
0 commit comments