From c8b7a2a0b9ca57ae646f7ece0e2e6349a86066c4 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 1 Nov 2026 15:54:39 +0530 Subject: [PATCH] refactor(cli): bind Codex host options in the existing adapter owner Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- loopx/cli_commands/turn_host_request.py | 53 +++++++++++++++++++++++++ loopx/cli_commands/turn_run_once.py | 50 ++++------------------- 2 files changed, 61 insertions(+), 42 deletions(-) diff --git a/loopx/cli_commands/turn_host_request.py b/loopx/cli_commands/turn_host_request.py index 7cc0f4a41d..3e79bf5bd2 100644 --- a/loopx/cli_commands/turn_host_request.py +++ b/loopx/cli_commands/turn_host_request.py @@ -11,6 +11,8 @@ from pathlib import Path from typing import Any, cast +from ..control_plane.goals.first_party_host_admission import FirstPartyHostGoalAdmission + def prepare_turn_host_request( args: argparse.Namespace, payload: Mapping[str, Any], *, @@ -74,3 +76,54 @@ def prepare_turn_host_request( else {} ) return project, raw_argv, task_validator, envelope + + +def build_codex_cli_host_runner( + args: argparse.Namespace, *, runtime_root: Path, project: Path, + registry_path: Path, goal_ref: Mapping[str, object] | None, + goal_admission: FirstPartyHostGoalAdmission | None, + current_launch_decision: Callable[[Path], Mapping[str, Any]], + run_codex_cli_host: Callable[..., dict[str, Any]], +) -> Callable[[Mapping[str, Any]], dict[str, Any]]: + """Bind the existing Codex adapter; resolve options/admission only at launch.""" + def run_built_in_host( + request: Mapping[str, Any], + ) -> dict[str, Any]: + options = { + "runtime_root": runtime_root, + "project": project, + "codex_bin": args.codex_bin, + "sandbox": args.codex_sandbox, + "model": args.codex_model, + "reasoning_effort": args.codex_reasoning_effort, + "mcp_server": args.codex_mcp_server_json, + "timeout_seconds": None if args.timeout_seconds is None else max(1.0, args.timeout_seconds - 5.0), + } + options["goal_admission"] = ( + goal_admission or FirstPartyHostGoalAdmission.for_plan( + registry_path=registry_path, goal_id=args.goal_id, + planned_goal_ref=goal_ref, + ) + ).with_launch_decision(current_launch_decision) + if getattr(args, "codex_operation_tools", False): + from ..control_plane.turn_driver.codex_operation_host import ( + run_codex_operation_host, + ) + + return run_codex_operation_host( + request, + registry_path=registry_path, + confirmed_operation_id=getattr( + args, "codex_confirmed_operation_id", None + ), + source_route=getattr( + args, "codex_operation_source_route_json", None + ), + operation_request_file=(Path(args.operation_request_file) + if getattr(args, "operation_request_file", None) else None), + operation_request_sha256=getattr(args, "operation_request_sha256", None), + **options, + ) + return run_codex_cli_host(request, registry_path=registry_path, **options) + + return run_built_in_host diff --git a/loopx/cli_commands/turn_run_once.py b/loopx/cli_commands/turn_run_once.py index daf6227de7..f908d58fc6 100644 --- a/loopx/cli_commands/turn_run_once.py +++ b/loopx/cli_commands/turn_run_once.py @@ -47,7 +47,7 @@ from ..state_refresh import refresh_state_run from ..control_plane.todos.path_resolution import resolve_todo_state_path from .turn_cadence import managed_cadence_start -from .turn_host_request import prepare_turn_host_request +from .turn_host_request import build_codex_cli_host_runner, prepare_turn_host_request from .turn_decision import collect_turn_status_payload, current_turn_host_launch_decision from .turn_dsh_host import build_dsh_host_runner, build_dsh_operation_host_runner from .turn_rendering import build_turn_error_payload @@ -835,47 +835,13 @@ def current_launch_decision(current_registry: Path) -> Mapping[str, Any]: goal_ref=goal_ref, ) - def run_built_in_host( - request: Mapping[str, Any], - ) -> dict[str, Any]: - options = { - "runtime_root": runtime_root, - "project": project, - "codex_bin": args.codex_bin, - "sandbox": args.codex_sandbox, - "model": args.codex_model, - "reasoning_effort": args.codex_reasoning_effort, - "mcp_server": args.codex_mcp_server_json, - "timeout_seconds": None if args.timeout_seconds is None else max(1.0, args.timeout_seconds - 5.0), - } - options["goal_admission"] = ( - goal_admission or FirstPartyHostGoalAdmission.for_plan( - registry_path=registry_path, goal_id=args.goal_id, - planned_goal_ref=goal_ref, - ) - ).with_launch_decision(current_launch_decision) - if getattr(args, "codex_operation_tools", False): - from ..control_plane.turn_driver.codex_operation_host import ( - run_codex_operation_host, - ) - - return run_codex_operation_host( - request, - registry_path=registry_path, - confirmed_operation_id=getattr( - args, "codex_confirmed_operation_id", None - ), - source_route=getattr( - args, "codex_operation_source_route_json", None - ), - operation_request_file=(Path(args.operation_request_file) - if getattr(args, "operation_request_file", None) else None), - operation_request_sha256=getattr(args, "operation_request_sha256", None), - **options, - ) - return run_codex_cli_host(request, registry_path=registry_path, **options) - - host_runner = run_built_in_host + host_runner = build_codex_cli_host_runner( + args, runtime_root=runtime_root, project=project, + registry_path=registry_path, goal_ref=goal_ref, + goal_admission=goal_admission, + current_launch_decision=current_launch_decision, + run_codex_cli_host=run_codex_cli_host, + ) def resolve_built_in_session_binding( turn_envelope: Mapping[str, Any],