diff --git a/src/main.rs b/src/main.rs index 20f2b065..5f491827 100644 --- a/src/main.rs +++ b/src/main.rs @@ -164,10 +164,7 @@ async fn run_server(ready: Option>) -> Result<()> { .context("start filesystem journal persistence")?, ); - let root = std::env::current_dir() - .context("resolve current workspace")? - .canonicalize() - .context("canonicalize workspace")?; + let root = resolve_workspace_root()?; let policy = ExecutionPolicy { default: PolicyDecision::Allow, per_agent_tool: BTreeMap::new(), @@ -437,6 +434,28 @@ fn user_home() -> Option { std::env::var_os(if cfg!(windows) { "USERPROFILE" } else { "HOME" }).map(PathBuf::from) } +fn resolve_workspace_root() -> Result { + #[cfg(all(not(debug_assertions), feature = "embedded-web"))] + if let Some(home) = user_home() { + let workspace = if cfg!(target_os = "macos") { + home.join("Library/Application Support/ChatCmdClient/workspace") + } else if cfg!(target_os = "windows") { + home.join("AppData/Roaming/ChatCmdClient/workspace") + } else { + home.join(".local/share/ChatCmdClient/workspace") + }; + std::fs::create_dir_all(&workspace).context("create packaged workspace")?; + return workspace + .canonicalize() + .context("canonicalize packaged workspace"); + } + + std::env::current_dir() + .context("resolve current workspace")? + .canonicalize() + .context("canonicalize workspace") +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/runtime_host/subagent_tests.rs b/src/runtime_host/subagent_tests.rs index 10e11515..3acaaadc 100644 --- a/src/runtime_host/subagent_tests.rs +++ b/src/runtime_host/subagent_tests.rs @@ -1,5 +1,5 @@ use chatcmd_mcp::catalog_hash; -use chatcmd_runtime::OperationContext; +use chatcmd_runtime::{OperationContext, ShellCreateRequest}; use serde_json::{Value, json}; use sqlx::Row as _; use tempfile::TempDir;