diff --git a/server/packages/agent-management/src/agents.rs b/server/packages/agent-management/src/agents.rs index 785603d0..4f906344 100644 --- a/server/packages/agent-management/src/agents.rs +++ b/server/packages/agent-management/src/agents.rs @@ -1093,9 +1093,9 @@ fn write_mock_agent_process_launcher(path: &Path) -> Result<(), AgentError> { fs::create_dir_all(parent)?; } let script = if cfg!(windows) { - "@echo off\r\nsandbox-agent mock-agent-process %*\r\n" + "@echo off\r\nif not \"%SANDBOX_AGENT_BIN%\"==\"\" (\r\n \"%SANDBOX_AGENT_BIN%\" mock-agent-process %*\r\n exit /b %errorlevel%\r\n)\r\nsandbox-agent mock-agent-process %*\r\n" } else { - "#!/usr/bin/env sh\nexec sandbox-agent mock-agent-process \"$@\"\n" + "#!/usr/bin/env sh\nif [ -n \"${SANDBOX_AGENT_BIN:-}\" ]; then\n exec \"$SANDBOX_AGENT_BIN\" mock-agent-process \"$@\"\nfi\nexec sandbox-agent mock-agent-process \"$@\"\n" }; write_text_file(path, script) } @@ -1969,6 +1969,34 @@ exit 0 assert_eq!(result.artifacts[0].source, InstallSource::Builtin); } + #[test] + fn mock_launcher_prefers_sandbox_agent_bin() { + let temp_dir = tempfile::tempdir().expect("create tempdir"); + let manager = AgentManager::with_platform(temp_dir.path(), Platform::LinuxX64); + + manager + .install( + AgentId::Mock, + InstallOptions { + reinstall: true, + version: None, + agent_process_version: None, + }, + ) + .expect("mock install"); + + let launcher = manager.agent_process_path(AgentId::Mock); + let mut file = fs::File::open(&launcher).expect("open mock launcher"); + let mut contents = String::new(); + file.read_to_string(&mut contents) + .expect("read mock launcher"); + + assert!( + contents.contains("SANDBOX_AGENT_BIN"), + "mock launcher should reference SANDBOX_AGENT_BIN" + ); + } + #[test] fn install_pi_skips_native_and_installs_fallback_npm_launcher() { let _env_lock = env_lock().lock().expect("env lock"); diff --git a/server/packages/sandbox-agent/src/acp_proxy_runtime.rs b/server/packages/sandbox-agent/src/acp_proxy_runtime.rs index 3f5a5945..e0a4f991 100644 --- a/server/packages/sandbox-agent/src/acp_proxy_runtime.rs +++ b/server/packages/sandbox-agent/src/acp_proxy_runtime.rs @@ -298,7 +298,7 @@ impl AcpProxyRuntime { let resolve_started = std::time::Instant::now(); let manager = self.inner.agent_manager.clone(); - let launch = tokio::task::spawn_blocking(move || manager.resolve_agent_process(agent)) + let mut launch = tokio::task::spawn_blocking(move || manager.resolve_agent_process(agent)) .await .map_err(|err| SandboxError::StreamError { message: format!("failed to resolve agent process launch spec: {err}"), @@ -307,6 +307,16 @@ impl AcpProxyRuntime { message: err.to_string(), })?; + if agent == AgentId::Mock { + if let Ok(exe) = std::env::current_exe() { + let path = exe.to_string_lossy().to_string(); + launch + .env + .entry("SANDBOX_AGENT_BIN".to_string()) + .or_insert(path); + } + } + tracing::info!( server_id = server_id, agent = agent.as_str(),