use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct AgentConfig {
pub name: String,
pub description: String,
pub command: String,
#[serde(default = "default_workdir")]
pub workdir: String,
}
fn default_workdir() -> String {
".".to_string()
}
impl AgentConfig {
pub fn get_resolved_workdir(&self, session_workdir: &Path) -> PathBuf {
let workdir_path = PathBuf::from(&self.workdir);
if workdir_path.is_absolute() {
workdir_path
} else {
session_workdir.join(&self.workdir)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_resolved_workdir_relative() {
let agent = AgentConfig {
name: "test".to_string(),
description: "Test".to_string(),
command: "octomind acp --role test".to_string(),
workdir: ".".to_string(),
};
let session_dir = PathBuf::from("/home/user/project");
assert_eq!(
agent.get_resolved_workdir(&session_dir),
PathBuf::from("/home/user/project")
);
}
#[test]
fn test_get_resolved_workdir_absolute() {
let agent = AgentConfig {
name: "test".to_string(),
description: "Test".to_string(),
command: "octomind acp --role test".to_string(),
workdir: "/absolute/path".to_string(),
};
let session_dir = PathBuf::from("/home/user/project");
assert_eq!(
agent.get_resolved_workdir(&session_dir),
PathBuf::from("/absolute/path")
);
}
}