diff options
| author | Brendan Allan <[email protected]> | 2026-02-06 23:03:07 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-02-06 23:03:07 +0800 |
| commit | b7ad8e459cae11ca74d976f6bd2e02559912716a (patch) | |
| tree | 6a14053372260d23834349a6fae4023722cdfbbb /packages/desktop/src-tauri/src/cli.rs | |
| parent | 5a1bf3a9687bd08ffb9c3cab3ffd4ed2346c19da (diff) | |
| download | opencode-b7ad8e459cae11ca74d976f6bd2e02559912716a.tar.gz opencode-b7ad8e459cae11ca74d976f6bd2e02559912716a.zip | |
desktop: add loading window and restructure rust (#12176)
Diffstat (limited to 'packages/desktop/src-tauri/src/cli.rs')
| -rw-r--r-- | packages/desktop/src-tauri/src/cli.rs | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/packages/desktop/src-tauri/src/cli.rs b/packages/desktop/src-tauri/src/cli.rs index 16e4bfec9..98c38677b 100644 --- a/packages/desktop/src-tauri/src/cli.rs +++ b/packages/desktop/src-tauri/src/cli.rs @@ -1,5 +1,10 @@ use tauri::{AppHandle, Manager, path::BaseDirectory}; -use tauri_plugin_shell::{ShellExt, process::Command}; +use tauri_plugin_shell::{ + ShellExt, + process::{Command, CommandChild, CommandEvent}, +}; + +use crate::{LogState, constants::MAX_LOG_ENTRIES}; const CLI_INSTALL_DIR: &str = ".opencode/bin"; const CLI_BINARY_NAME: &str = "opencode"; @@ -182,3 +187,55 @@ pub fn create_command(app: &tauri::AppHandle, args: &str) -> Command { .args(["-il", "-c", &cmd]) }; } + +pub fn serve(app: &AppHandle, hostname: &str, port: u32, password: &str) -> CommandChild { + let log_state = app.state::<LogState>(); + let log_state_clone = log_state.inner().clone(); + + println!("spawning sidecar on port {port}"); + + let (mut rx, child) = create_command( + app, + format!("serve --hostname {hostname} --port {port}").as_str(), + ) + .env("OPENCODE_SERVER_USERNAME", "opencode") + .env("OPENCODE_SERVER_PASSWORD", password) + .spawn() + .expect("Failed to spawn opencode"); + + tokio::spawn(async move { + while let Some(event) = rx.recv().await { + match event { + CommandEvent::Stdout(line_bytes) => { + let line = String::from_utf8_lossy(&line_bytes); + print!("{line}"); + + // Store log in shared state + if let Ok(mut logs) = log_state_clone.0.lock() { + logs.push_back(format!("[STDOUT] {}", line)); + // Keep only the last MAX_LOG_ENTRIES + while logs.len() > MAX_LOG_ENTRIES { + logs.pop_front(); + } + } + } + CommandEvent::Stderr(line_bytes) => { + let line = String::from_utf8_lossy(&line_bytes); + eprint!("{line}"); + + // Store log in shared state + if let Ok(mut logs) = log_state_clone.0.lock() { + logs.push_back(format!("[STDERR] {}", line)); + // Keep only the last MAX_LOG_ENTRIES + while logs.len() > MAX_LOG_ENTRIES { + logs.pop_front(); + } + } + } + _ => {} + } + } + }); + + child +} |
