fix: support tab completions for graph-based agents with variables as well as standard agents
This commit is contained in:
+56
-9
@@ -1131,6 +1131,12 @@ struct AgentMetadataStub {
|
|||||||
description: String,
|
description: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct AgentVariablesStub {
|
||||||
|
#[serde(default)]
|
||||||
|
variables: Vec<AgentVariable>,
|
||||||
|
}
|
||||||
|
|
||||||
fn load_agent_description(name: &str) -> String {
|
fn load_agent_description(name: &str) -> String {
|
||||||
if let Ok(config) = AgentConfig::load(&paths::agent_config_file(name)) {
|
if let Ok(config) = AgentConfig::load(&paths::agent_config_file(name)) {
|
||||||
return config.description;
|
return config.description;
|
||||||
@@ -1145,16 +1151,22 @@ fn load_agent_description(name: &str) -> String {
|
|||||||
String::new()
|
String::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn complete_agent_variables(agent_name: &str) -> Vec<(String, Option<String>)> {
|
fn load_agent_variables(name: &str) -> Vec<AgentVariable> {
|
||||||
let config_path = paths::agent_config_file(agent_name);
|
if let Ok(config) = AgentConfig::load(&paths::agent_config_file(name)) {
|
||||||
if !config_path.exists() {
|
return config.variables;
|
||||||
return vec![];
|
|
||||||
}
|
}
|
||||||
let Ok(config) = AgentConfig::load(&config_path) else {
|
|
||||||
return vec![];
|
if let Ok(contents) = read_to_string(paths::agent_graph_file(name))
|
||||||
};
|
&& let Ok(stub) = serde_yaml::from_str::<AgentVariablesStub>(&contents)
|
||||||
config
|
{
|
||||||
.variables
|
return stub.variables;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn complete_agent_variables(agent_name: &str) -> Vec<(String, Option<String>)> {
|
||||||
|
load_agent_variables(agent_name)
|
||||||
.iter()
|
.iter()
|
||||||
.map(|v| {
|
.map(|v| {
|
||||||
let description = match &v.default {
|
let description = match &v.default {
|
||||||
@@ -1399,6 +1411,41 @@ version: "1.0"
|
|||||||
assert_eq!(meta.description, "");
|
assert_eq!(meta.description, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn agent_variables_stub_extracts_variables_from_graph_yaml() {
|
||||||
|
let yaml = r#"
|
||||||
|
name: coder
|
||||||
|
description: Implementation agent.
|
||||||
|
version: "1.0"
|
||||||
|
variables:
|
||||||
|
- name: task
|
||||||
|
description: The task to implement
|
||||||
|
- name: scope
|
||||||
|
description: Directory scope
|
||||||
|
default: src/
|
||||||
|
start: plan
|
||||||
|
nodes: {}
|
||||||
|
"#;
|
||||||
|
|
||||||
|
let stub: AgentVariablesStub = serde_yaml::from_str(yaml).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(stub.variables.len(), 2);
|
||||||
|
assert_eq!(stub.variables[0].name, "task");
|
||||||
|
assert_eq!(stub.variables[0].description, "The task to implement");
|
||||||
|
assert_eq!(stub.variables[0].default, None);
|
||||||
|
assert_eq!(stub.variables[1].name, "scope");
|
||||||
|
assert_eq!(stub.variables[1].default.as_deref(), Some("src/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn agent_variables_stub_defaults_when_variables_missing() {
|
||||||
|
let yaml = "name: coder\nversion: \"1.0\"\nstart: plan\nnodes: {}\n";
|
||||||
|
|
||||||
|
let stub: AgentVariablesStub = serde_yaml::from_str(yaml).unwrap();
|
||||||
|
|
||||||
|
assert!(stub.variables.is_empty());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn rag_init_config_forwards_an_explicit_driver() {
|
fn rag_init_config_forwards_an_explicit_driver() {
|
||||||
let node: RagNode =
|
let node: RagNode =
|
||||||
|
|||||||
Reference in New Issue
Block a user