@@ -222,6 +222,7 @@ def fake_start_background(paths, settings, verbose_proxy):
222222 self .assertTrue (config ["features" ]["codex_hooks" ])
223223 self .assertTrue (has_startup_hook (paths ))
224224 self .assertEqual (session_start [0 ]["matcher" ], "startup|resume" )
225+ self .assertIn (sys .executable , command )
225226 self .assertIn ("codex_fast_proxy" , command )
226227 self .assertIn ("autostart" , command )
227228 self .assertIn ("--quiet" , command )
@@ -890,6 +891,45 @@ def fake_launch_background(paths, settings, verbose_proxy):
890891 self .assertEqual (result ["reason" ], "runtime_changed" )
891892 self .assertEqual (calls , ["stop" , "start" ])
892893
894+ def test_launch_background_detaches_process_on_posix (self ) -> None :
895+ codex_home = self .temp_dir / ".codex"
896+ paths = paths_for (codex_home )
897+ settings = manager .ProxySettings (
898+ provider = "acme" ,
899+ host = "127.0.0.1" ,
900+ port = 18787 ,
901+ proxy_base = "/v1" ,
902+ upstream_base = "https://api.acme.test/v1" ,
903+ service_tier = "priority" ,
904+ )
905+ captured : dict [str , object ] = {}
906+
907+ class FakeProcess :
908+ pid = 1234
909+
910+ original_is_port_available = manager .is_port_available
911+ original_wait_for_proxy_health = manager .wait_for_proxy_health
912+ original_popen = manager .subprocess .Popen
913+
914+ def fake_popen (command , ** kwargs ):
915+ captured ["command" ] = command
916+ captured ["kwargs" ] = kwargs
917+ return FakeProcess ()
918+
919+ manager .is_port_available = lambda _host , _port : True
920+ manager .wait_for_proxy_health = lambda _settings , _process : {"ok" : True , "pid" : _process .pid }
921+ manager .subprocess .Popen = fake_popen
922+ try :
923+ result = manager .launch_background (paths , settings , verbose_proxy = False )
924+ finally :
925+ manager .is_port_available = original_is_port_available
926+ manager .wait_for_proxy_health = original_wait_for_proxy_health
927+ manager .subprocess .Popen = original_popen
928+
929+ self .assertEqual (result ["status" ], "started" )
930+ self .assertEqual (captured ["command" ][0 ], sys .executable )
931+ self .assertEqual (captured ["kwargs" ]["start_new_session" ], manager .os .name != "nt" )
932+
893933 def test_quiet_autostart_does_not_log_noop_events (self ) -> None :
894934 codex_home = self .temp_dir / ".codex"
895935 paths = paths_for (codex_home )
0 commit comments