Skip to main content

lean_ctx/tools/registered/
ctx_task.rs

1use rmcp::model::Tool;
2use rmcp::ErrorData;
3use serde_json::{json, Map, Value};
4
5use crate::server::tool_trait::{get_str, McpTool, ToolContext, ToolOutput};
6use crate::tool_defs::tool_def;
7
8pub struct CtxTaskTool;
9
10impl McpTool for CtxTaskTool {
11    fn name(&self) -> &'static str {
12        "ctx_task"
13    }
14
15    fn tool_def(&self) -> Tool {
16        tool_def(
17            "ctx_task",
18            "Multi-agent task orchestration. Actions: create|update|list|get|cancel|message|info.",
19            json!({
20                "type": "object",
21                "properties": {
22                    "action": {
23                        "type": "string",
24                        "enum": ["create", "update", "list", "get", "cancel", "message", "info"],
25                        "description": "Task operation"
26                    },
27                    "task_id": { "type": "string", "description": "Task ID (required for update|get|cancel|message)" },
28                    "to_agent": { "type": "string", "description": "Target agent ID (required for create)" },
29                    "description": { "type": "string", "description": "Task description (for create)" },
30                    "state": { "type": "string", "description": "New state for update (working|input-required|completed|failed|canceled)" },
31                    "message": { "type": "string", "description": "Optional message / reason" }
32                },
33                "required": ["action"]
34            }),
35        )
36    }
37
38    fn handle(
39        &self,
40        args: &Map<String, Value>,
41        ctx: &ToolContext,
42    ) -> Result<ToolOutput, ErrorData> {
43        let action = get_str(args, "action").unwrap_or_else(|| "list".to_string());
44        let current_agent_id = {
45            let guard = ctx.agent_id.as_ref().unwrap().blocking_read();
46            guard.clone()
47        };
48        let task_id = get_str(args, "task_id");
49        let to_agent = get_str(args, "to_agent");
50        let description = get_str(args, "description");
51        let state = get_str(args, "state");
52        let message = get_str(args, "message");
53
54        let result = crate::tools::ctx_task::handle(
55            &action,
56            current_agent_id.as_deref(),
57            task_id.as_deref(),
58            to_agent.as_deref(),
59            description.as_deref(),
60            state.as_deref(),
61            message.as_deref(),
62        );
63
64        Ok(ToolOutput {
65            text: result,
66            original_tokens: 0,
67            saved_tokens: 0,
68            mode: Some(action),
69            path: None,
70            changed: false,
71        })
72    }
73}