Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion crates/tui/src/tools/fim.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,10 @@ impl ToolSpec for FimEditTool {
}

fn capabilities(&self) -> Vec<ToolCapability> {
// Writes the target file atomically (see execute step 7), so ReadOnly
// would be false; repo_law::WRITE_TOOLS also relies on this tool being
// recognized as write-capable.
vec![
ToolCapability::ReadOnly,
ToolCapability::WritesFiles,
ToolCapability::RequiresApproval,
]
Expand Down Expand Up @@ -180,3 +182,24 @@ impl ToolSpec for FimEditTool {
ToolResult::json(&result).map_err(|e| ToolError::execution_failed(e.to_string()))
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn fim_edit_declares_write_capability_without_read_only() {
let tool = FimEditTool::new(None, "fim-model".to_string());
let capabilities = tool.capabilities();

assert!(
capabilities.contains(&ToolCapability::WritesFiles),
"fim_edit writes the target file atomically"
);
assert!(
!capabilities.contains(&ToolCapability::ReadOnly),
"a file-writing tool must not claim ReadOnly"
);
assert!(!tool.is_read_only());
}
}
20 changes: 18 additions & 2 deletions crates/tui/src/tools/plan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,8 @@ impl ToolSpec for UpdatePlanTool {
}

fn capabilities(&self) -> Vec<ToolCapability> {
vec![ToolCapability::WritesFiles]
// Mutates only in-memory session plan state; no filesystem writes.
vec![]
}

fn approval_requirement(&self) -> ApprovalRequirement {
Expand Down Expand Up @@ -664,9 +665,24 @@ fn string_vec_field(input: &serde_json::Value, field: &str) -> Vec<String> {
#[cfg(test)]
mod tests {
use super::*;
use crate::tools::spec::{ToolContext, ToolSpec};
use crate::tools::spec::{ToolCapability, ToolContext, ToolSpec};
use serde_json::json;

#[test]
fn update_plan_declares_no_filesystem_write_capability() {
let tool = UpdatePlanTool::new(new_shared_plan_state());
let capabilities = tool.capabilities();

assert!(
!capabilities.contains(&ToolCapability::WritesFiles),
"update_plan mutates only in-memory session plan state"
);
assert!(
!tool.is_read_only(),
"update_plan still mutates session state"
);
}

#[test]
fn update_plan_description_keeps_work_update_as_primary_progress() {
let tool = UpdatePlanTool::new(new_shared_plan_state());
Expand Down
Loading