feat: enhance edit logging in subagent execution and streamline edit tracking in run_agent_turn

This commit is contained in:
asepharyana
2026-07-13 14:47:03 +07:00
parent 4a297669b4
commit c60fadb88a
2 changed files with 83 additions and 15 deletions
+67 -1
View File
@@ -424,7 +424,73 @@ pub fn run_subagent(ctx: &SubagentContext, tx: &mpsc::Sender<SubagentEvent>) ->
}
let result = match tools_ref.iter().find(|t| t.name() == tool_name.as_str()) {
Some(tool) => tool.run(tool_ctx_ref, &args),
Some(tool) => {
let is_edit = tool_name == "write" || tool_name == "edit";
if is_edit && !tool_call.id.is_empty() {
if let Ok(conn) = crate::model::msglog::open_or_create(&ctx.session_dir) {
let path = args.get("path").and_then(|v| v.as_str()).unwrap_or("");
if let Ok(abs_path) = crate::tool::resolve_path(&tool_ctx_ref.workspaces, path) {
if let Ok(bytes) = std::fs::read(&abs_path) {
let session_id = ctx.session_dir
.file_name()
.and_then(|n| n.to_str())
.unwrap_or("unknown");
let _ = crate::model::msglog::store_blob(
&conn, session_id, &tool_call.id, &bytes, None,
);
}
}
}
}
let run_res = tool.run(tool_ctx_ref, &args);
if is_edit && run_res.is_ok() {
let reason = args
.get("reason")
.and_then(|v| v.as_str())
.unwrap_or("unnamed");
let path = args
.get("path")
.and_then(|v| v.as_str())
.unwrap_or("unknown");
let content_sha256 = {
let content = args.get("content").or_else(|| args.get("new"));
use sha2::Digest;
let hash = sha2::Sha256::digest(
content.and_then(|v| v.as_str()).unwrap_or("").as_bytes(),
);
hex::encode(hash)
};
let bytes_delta = if tool_name == "write" {
args.get("content")
.and_then(|v| v.as_str())
.map_or(0, |s| s.len() as i64)
} else {
let old = args.get("old").and_then(|v| v.as_str()).unwrap_or("");
let new = args.get("new").and_then(|v| v.as_str()).unwrap_or("");
(new.len() as i64 - old.len() as i64).abs()
};
let session_id = ctx.session_dir
.file_name()
.and_then(|n| n.to_str())
.unwrap_or("unknown")
.to_string();
let entry = crate::model::editlog::EditLogEntry {
ts: chrono::Utc::now().timestamp_millis(),
tool: tool_name.clone(),
path: path.to_string(),
reason: reason.to_string(),
content_sha256,
bytes_delta,
origin: tool_ctx_ref.origin.tag(),
session_id,
};
let mut el = crate::model::editlog::EditLog::new(&ctx.session_dir);
el.append(entry).ok();
}
run_res
}
None => Err(anyhow::anyhow!("tool '{tool_name}' not found")),
};
(tool_call, result)