From 722d584cd15a64417a8cdffb39f923cceb858e6b Mon Sep 17 00:00:00 2001 From: Kayshen-X Date: Fri, 19 Jun 2026 19:17:46 +0800 Subject: [PATCH] refactor(host): move chat_spawn to op-web-daemon (Phase 2 leaf) Process-spawn helpers (find_binary / build_command / exit_status_label) for the CLI chat bridges. Promoted to pub; consumers chat_http_server + chat_subprocess repointed to op_web_daemon::chat_spawn. No new deps (no Cargo.lock change). --- crates/op-host-desktop/src/chat_http_server.rs | 2 +- crates/op-host-desktop/src/chat_subprocess.rs | 2 +- crates/op-host-desktop/src/main.rs | 1 - crates/{op-host-desktop => op-web-daemon}/src/chat_spawn.rs | 6 +++--- crates/op-web-daemon/src/lib.rs | 1 + 5 files changed, 6 insertions(+), 6 deletions(-) rename crates/{op-host-desktop => op-web-daemon}/src/chat_spawn.rs (97%) diff --git a/crates/op-host-desktop/src/chat_http_server.rs b/crates/op-host-desktop/src/chat_http_server.rs index 20be6650f..122be9272 100644 --- a/crates/op-host-desktop/src/chat_http_server.rs +++ b/crates/op-host-desktop/src/chat_http_server.rs @@ -41,7 +41,7 @@ use tokio::io::{AsyncBufReadExt, BufReader}; use tokio::sync::mpsc; use crate::chat_runtime::{shared_runtime, BlockingRecvIter}; -use crate::chat_spawn::{build_command, find_binary}; +use op_web_daemon::chat_spawn::{build_command, find_binary}; /// TS `opencode-client.ts` reuses an existing server on the default /// port before spawning its own. diff --git a/crates/op-host-desktop/src/chat_subprocess.rs b/crates/op-host-desktop/src/chat_subprocess.rs index 65fa80b78..8fcc1dcb7 100644 --- a/crates/op-host-desktop/src/chat_subprocess.rs +++ b/crates/op-host-desktop/src/chat_subprocess.rs @@ -63,7 +63,7 @@ use tokio::io::{AsyncBufReadExt, BufReader}; use tokio::sync::mpsc; use crate::chat_runtime::{prompt_with_system_prompt, shared_runtime, BlockingRecvIter}; -use crate::chat_spawn::{build_command, exit_status_label, find_binary}; +use op_web_daemon::chat_spawn::{build_command, exit_status_label, find_binary}; use crate::chat_subprocess_quirks as quirks; /// How the user's prompt reaches the CLI. Claude Code's `--print` diff --git a/crates/op-host-desktop/src/main.rs b/crates/op-host-desktop/src/main.rs index 1f9697f9c..7a210dd83 100644 --- a/crates/op-host-desktop/src/main.rs +++ b/crates/op-host-desktop/src/main.rs @@ -19,7 +19,6 @@ mod chat_intent; mod chat_provider_llm; mod chat_runtime; mod chat_session; -mod chat_spawn; mod chat_subprocess; mod chat_subprocess_quirks; mod chat_system_prompt; diff --git a/crates/op-host-desktop/src/chat_spawn.rs b/crates/op-web-daemon/src/chat_spawn.rs similarity index 97% rename from crates/op-host-desktop/src/chat_spawn.rs rename to crates/op-web-daemon/src/chat_spawn.rs index 155097dcf..a2f189d8d 100644 --- a/crates/op-host-desktop/src/chat_spawn.rs +++ b/crates/op-web-daemon/src/chat_spawn.rs @@ -18,7 +18,7 @@ use tokio::process::Command; /// /// Cross-platform: each branch only probes paths that exist on that /// OS so we don't pay for filesystem-stat misses on the wrong OS. -pub(crate) fn find_binary(name: &str) -> String { +pub fn find_binary(name: &str) -> String { // PATH-relative entries first (cross-platform). if let Ok(path_env) = std::env::var("PATH") { let sep = if cfg!(windows) { ';' } else { ':' }; @@ -122,7 +122,7 @@ fn well_known_install_paths(name: &str) -> Vec { /// Unix so Ctrl-C in the OP terminal doesn't kill the CLI; on Windows /// `creation_flags(CREATE_NO_WINDOW)` so spawning the CLI doesn't /// pop a console window for users running the GUI build). -pub(crate) fn build_command(binary: &str, args: &[String]) -> Command { +pub fn build_command(binary: &str, args: &[String]) -> Command { #[cfg(windows)] { // CREATE_NO_WINDOW from winbase.h — keeps the console hidden @@ -173,7 +173,7 @@ pub(crate) fn build_command(binary: &str, args: &[String]) -> Command { /// Stringify an `ExitStatus` for chat error reporting. Cross-platform: /// on Unix `.code()` is `None` when killed by signal — show the signal /// number instead; on Windows `.code()` is always populated. -pub(crate) fn exit_status_label(status: &std::process::ExitStatus) -> String { +pub fn exit_status_label(status: &std::process::ExitStatus) -> String { if let Some(code) = status.code() { return code.to_string(); } diff --git a/crates/op-web-daemon/src/lib.rs b/crates/op-web-daemon/src/lib.rs index 66334ce74..12d98167e 100644 --- a/crates/op-web-daemon/src/lib.rs +++ b/crates/op-web-daemon/src/lib.rs @@ -14,4 +14,5 @@ //! `op-host-web-server` binary depend on this crate. // Phase 2 — host-free leaf modules. +pub mod chat_spawn; pub mod web_static;