use super::{MigrateError, MigrationResult, section_header_present};
pub fn migrate_agents_delegation_mode(toml_src: &str) -> Result<MigrationResult, MigrateError> {
if toml_src.contains("delegation_mode") || !section_header_present(toml_src, "agents") {
return Ok(MigrationResult {
output: toml_src.to_owned(),
changed_count: 0,
sections_changed: Vec::new(),
});
}
let mut doc = toml_src.parse::<toml_edit::DocumentMut>()?;
let Some(agents_table) = doc
.get_mut("agents")
.and_then(toml_edit::Item::as_table_mut)
else {
return Ok(MigrationResult {
output: toml_src.to_owned(),
changed_count: 0,
sections_changed: Vec::new(),
});
};
let enabled = agents_table
.get("enabled")
.and_then(toml_edit::Item::as_value)
.and_then(toml_edit::Value::as_bool)
.unwrap_or(false);
if !enabled {
return Ok(MigrationResult {
output: toml_src.to_owned(),
changed_count: 0,
sections_changed: Vec::new(),
});
}
agents_table.insert("delegation_mode", toml_edit::value("proactive"));
Ok(MigrationResult {
output: doc.to_string(),
changed_count: 1,
sections_changed: vec!["agents.delegation_mode".to_owned()],
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn inserts_proactive_when_enabled_and_key_absent() {
let src = "[agents]\nenabled = true\nmax_concurrent = 3\n";
let result = migrate_agents_delegation_mode(src).expect("migrate");
assert_eq!(result.changed_count, 1);
assert!(result.output.contains("delegation_mode = \"proactive\""));
}
#[test]
fn noop_when_disabled() {
let src = "[agents]\nenabled = false\n";
let result = migrate_agents_delegation_mode(src).expect("migrate");
assert_eq!(result.changed_count, 0);
assert!(!result.output.contains("delegation_mode"));
}
#[test]
fn noop_when_key_already_present() {
let src = "[agents]\nenabled = true\ndelegation_mode = \"explicit_request_only\"\n";
let result = migrate_agents_delegation_mode(src).expect("migrate");
assert_eq!(result.changed_count, 0);
assert_eq!(result.output, src);
}
#[test]
fn noop_when_section_absent() {
let src = "[llm]\nprovider = \"claude\"\n";
let result = migrate_agents_delegation_mode(src).expect("migrate");
assert_eq!(result.changed_count, 0);
assert_eq!(result.output, src);
}
#[test]
fn noop_when_section_only_commented_out() {
let src = "# [agents]\n# enabled = true\n";
let result = migrate_agents_delegation_mode(src).expect("migrate");
assert_eq!(result.changed_count, 0);
assert_eq!(result.output, src);
}
#[test]
fn idempotent() {
let src = "[agents]\nenabled = true\n";
let once = migrate_agents_delegation_mode(src).expect("migrate");
let twice = migrate_agents_delegation_mode(&once.output).expect("migrate");
assert_eq!(twice.changed_count, 0);
assert_eq!(twice.output, once.output);
}
}