feat: Implemented a built-in task management system to help smaller LLMs complete larger multistep tasks and minimize context drift

This commit is contained in:
2026-02-09 12:49:06 -07:00
parent 8a37a88ffd
commit a935add2a7
13 changed files with 868 additions and 9 deletions
+18 -4
View File
@@ -1,3 +1,5 @@
pub(crate) mod todo;
use crate::{
config::{Agent, Config, GlobalConfig},
utils::*,
@@ -26,6 +28,7 @@ use std::{
process::{Command, Stdio},
};
use strum_macros::AsRefStr;
use todo::TODO_FUNCTION_PREFIX;
#[derive(Embed)]
#[folder = "assets/functions/"]
@@ -262,6 +265,10 @@ impl Functions {
self.declarations.is_empty()
}
pub fn append_todo_functions(&mut self) {
self.declarations.extend(todo::todo_function_declarations());
}
pub fn clear_mcp_meta_functions(&mut self) {
self.declarations.retain(|d| {
!d.name.starts_with(MCP_INVOKE_META_FUNCTION_NAME_PREFIX)
@@ -850,7 +857,7 @@ impl ToolCall {
_ if cmd_name.starts_with(MCP_SEARCH_META_FUNCTION_NAME_PREFIX) => {
Self::search_mcp_tools(config, &cmd_name, &json_data).unwrap_or_else(|e| {
let error_msg = format!("MCP search failed: {e}");
println!("{}", warning_text(&format!("⚠️ {error_msg} ⚠️")));
eprintln!("{}", warning_text(&format!("⚠️ {error_msg} ⚠️")));
json!({"tool_call_error": error_msg})
})
}
@@ -859,7 +866,7 @@ impl ToolCall {
.await
.unwrap_or_else(|e| {
let error_msg = format!("MCP describe failed: {e}");
println!("{}", warning_text(&format!("⚠️ {error_msg} ⚠️")));
eprintln!("{}", warning_text(&format!("⚠️ {error_msg} ⚠️")));
json!({"tool_call_error": error_msg})
})
}
@@ -868,10 +875,17 @@ impl ToolCall {
.await
.unwrap_or_else(|e| {
let error_msg = format!("MCP tool invocation failed: {e}");
println!("{}", warning_text(&format!("⚠️ {error_msg} ⚠️")));
eprintln!("{}", warning_text(&format!("⚠️ {error_msg} ⚠️")));
json!({"tool_call_error": error_msg})
})
}
_ if cmd_name.starts_with(TODO_FUNCTION_PREFIX) => {
todo::handle_todo_tool(config, &cmd_name, &json_data).unwrap_or_else(|e| {
let error_msg = format!("Todo tool failed: {e}");
eprintln!("{}", warning_text(&format!("⚠️ {error_msg} ⚠️")));
json!({"tool_call_error": error_msg})
})
}
_ => match run_llm_function(cmd_name, cmd_args, envs, agent_name) {
Ok(Some(contents)) => serde_json::from_str(&contents)
.ok()
@@ -1052,7 +1066,7 @@ pub fn run_llm_function(
eprintln!("{stderr}");
}
let tool_error_message = format!("Tool call '{command_name}' exited with code {exit_code}");
println!("{}", warning_text(&format!("⚠️ {tool_error_message} ⚠️")));
eprintln!("{}", warning_text(&format!("⚠️ {tool_error_message} ⚠️")));
let mut error_json = json!({"tool_call_error": tool_error_message});
if !stderr.is_empty() {
error_json["stderr"] = json!(stderr);