1111from ...kernel .group import load_group
1212from ...kernel .ledger import append_event
1313from ...kernel .permissions import require_actor_permission
14+ from ...kernel .runtime import inject_runtime_home_env
15+ from ..codex_app_sessions import SUPERVISOR as codex_app_supervisor
1416from ...runners import headless as headless_runner
1517from ...runners import pty as pty_runner
1618from ...util .conv import coerce_bool
@@ -114,7 +116,12 @@ def handle_actor_stop(
114116 actor = update_actor (group , actor_id , {"enabled" : False })
115117 runner_kind = str (actor .get ("runner" ) or "pty" ).strip ()
116118 runner_effective = effective_runner_kind (runner_kind )
117- if runner_effective == "headless" :
119+ runtime = str (actor .get ("runtime" ) or "codex" ).strip () or "codex"
120+ if runtime == "codex" and runner_effective == "headless" :
121+ codex_app_supervisor .stop_actor (group_id = group .group_id , actor_id = actor_id )
122+ remove_headless_state (group .group_id , actor_id )
123+ remove_pty_state_if_pid (group .group_id , actor_id , pid = 0 )
124+ elif runner_effective == "headless" :
118125 headless_runner .SUPERVISOR .stop_actor (group_id = group .group_id , actor_id = actor_id )
119126 remove_headless_state (group .group_id , actor_id )
120127 remove_pty_state_if_pid (group .group_id , actor_id , pid = 0 )
@@ -211,8 +218,12 @@ def handle_actor_restart(
211218 is_admin = is_admin ,
212219 )
213220 runner_kind = str (actor .get ("runner" ) or "pty" ).strip ()
214- runner_effective = effective_runner_kind (runner_kind )
215- if runner_effective == "headless" :
221+ runtime = str (actor .get ("runtime" ) or "codex" ).strip () or "codex"
222+ if runtime == "codex" and effective_runner_kind (runner_kind ) == "headless" :
223+ codex_app_supervisor .stop_actor (group_id = group .group_id , actor_id = actor_id )
224+ remove_headless_state (group .group_id , actor_id )
225+ remove_pty_state_if_pid (group .group_id , actor_id , pid = 0 )
226+ elif effective_runner_kind (runner_kind ) == "headless" :
216227 headless_runner .SUPERVISOR .stop_actor (group_id = group .group_id , actor_id = actor_id )
217228 remove_headless_state (group .group_id , actor_id )
218229 remove_pty_state_if_pid (group .group_id , actor_id , pid = 0 )
@@ -308,6 +319,12 @@ def handle_actor_restart(
308319 runner_kind = str (launch_spec ["runner" ])
309320 runner_effective = str (launch_spec ["effective_runner" ])
310321 runtime = str (launch_spec ["runtime" ])
322+ effective_env = inject_runtime_home_env (
323+ launch_spec ["merged_env" ],
324+ runtime = runtime ,
325+ group_id = group .group_id ,
326+ actor_id = actor_id ,
327+ )
311328 if runner_effective != "headless" :
312329 try :
313330 mcp_ready = bool (ensure_mcp_installed (runtime , cwd ))
@@ -316,12 +333,19 @@ def handle_actor_restart(
316333 if not mcp_ready :
317334 return _error ("actor_restart_failed" , f"failed to install MCP for runtime: { runtime } " )
318335
319- if runner_effective == "headless" :
336+ if runtime == "codex" and runner_effective == "headless" :
337+ codex_app_supervisor .start_actor (
338+ group_id = group .group_id ,
339+ actor_id = actor_id ,
340+ cwd = cwd ,
341+ env = dict (inject_actor_context_env (effective_env , group_id = group .group_id , actor_id = actor_id )),
342+ )
343+ elif runner_effective == "headless" :
320344 headless_runner .SUPERVISOR .start_actor (
321345 group_id = group .group_id ,
322346 actor_id = actor_id ,
323347 cwd = cwd ,
324- env = dict (inject_actor_context_env (launch_spec [ "merged_env" ] , group_id = group .group_id , actor_id = actor_id )),
348+ env = dict (inject_actor_context_env (effective_env , group_id = group .group_id , actor_id = actor_id )),
325349 )
326350 try :
327351 write_headless_state (group .group_id , actor_id )
@@ -333,9 +357,8 @@ def handle_actor_restart(
333357 actor_id = actor_id ,
334358 cwd = cwd ,
335359 command = launch_spec ["effective_command" ],
336- env = prepare_pty_env (
337- inject_actor_context_env (launch_spec ["merged_env" ], group_id = group .group_id , actor_id = actor_id )
338- ),
360+ env = prepare_pty_env (inject_actor_context_env (effective_env , group_id = group .group_id , actor_id = actor_id )),
361+ runtime = runtime ,
339362 max_backlog_bytes = pty_backlog_bytes (),
340363 )
341364 try :
@@ -346,6 +369,13 @@ def handle_actor_restart(
346369 ContextStorage (group ).clear_agent_status_if_present (actor_id )
347370 except Exception :
348371 pass
372+ try :
373+ if str (group .doc .get ("state" ) or "" ).strip () == "stopped" :
374+ group .doc ["state" ] = "active"
375+ group .doc ["running" ] = True
376+ group .save ()
377+ except Exception :
378+ pass
349379
350380 maybe_reset_automation_on_foreman_change (group , before_foreman_id = before_foreman )
351381 event = append_event (
@@ -354,7 +384,11 @@ def handle_actor_restart(
354384 group_id = group .group_id ,
355385 scope_key = "" ,
356386 by = by ,
357- data = {"actor_id" : actor_id , "runner" : str (actor .get ("runner" ) or "pty" )},
387+ data = {
388+ "actor_id" : actor_id ,
389+ "runner" : str (actor .get ("runner" ) or "pty" ),
390+ "runner_effective" : runner_effective ,
391+ },
358392 )
359393
360394 from ...kernel .events import publish_event
0 commit comments