Skip to main content

skilllite_executor/
lib.rs

1pub mod error;
2pub mod memory;
3pub mod plan;
4pub mod rpc;
5pub mod session;
6pub mod transcript;
7
8use crate::error::ExecutorError;
9
10/// Resolve skilllite data root. Delegates to [`skilllite_core::paths::data_root`].
11pub fn skilllite_data_root() -> std::path::PathBuf {
12    skilllite_core::paths::data_root()
13}
14
15/// Resolve chat root. Delegates to [`skilllite_core::paths::chat_root`].
16pub fn chat_root() -> std::path::PathBuf {
17    skilllite_core::paths::chat_root()
18}
19
20/// Resolve workspace root. Prefers SKILLLITE_WORKSPACE env, else ~/.skilllite
21pub fn workspace_root(workspace_path: Option<&str>) -> Result<std::path::PathBuf, ExecutorError> {
22    if let Some(p) = workspace_path {
23        let path = std::path::PathBuf::from(p);
24        if path.is_absolute() {
25            return Ok(path);
26        }
27        return Ok(std::env::current_dir()?.join(p));
28    }
29    Ok(skilllite_data_root())
30}
31
32/// Resolve chat root for session/transcript/memory RPC.
33/// When workspace_path is None: use chat_root() (SKILLLITE_WORKSPACE/chat or ~/.skilllite/chat).
34/// When provided: treat as data root and return path/chat. If path already ends with "chat", use as-is.
35pub fn chat_root_for_rpc(
36    workspace_path: Option<&str>,
37) -> Result<std::path::PathBuf, ExecutorError> {
38    if let Some(p) = workspace_path {
39        let path = std::path::PathBuf::from(p);
40        let data_root = if path.is_absolute() {
41            path
42        } else {
43            std::env::current_dir()?.join(p)
44        };
45        // 兼容:若传入的已是 chat root,不再追加 chat
46        let is_chat_root = data_root.ends_with(std::path::Path::new("chat"));
47        return Ok(if is_chat_root {
48            data_root
49        } else {
50            data_root.join("chat")
51        });
52    }
53    Ok(chat_root())
54}