summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop/src-tauri/src/cli.rs
diff options
context:
space:
mode:
authorBrendan Allan <[email protected]>2026-02-06 23:03:07 +0800
committerGitHub <[email protected]>2026-02-06 23:03:07 +0800
commitb7ad8e459cae11ca74d976f6bd2e02559912716a (patch)
tree6a14053372260d23834349a6fae4023722cdfbbb /packages/desktop/src-tauri/src/cli.rs
parent5a1bf3a9687bd08ffb9c3cab3ffd4ed2346c19da (diff)
downloadopencode-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.rs59
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
+}