agentic_memory_mcp/tools/
memory_resolve.rs1use std::sync::Arc;
4use tokio::sync::Mutex;
5
6use serde::Deserialize;
7use serde_json::{json, Value};
8
9use crate::session::SessionManager;
10use crate::types::{McpError, McpResult, ToolCallResult, ToolDefinition};
11
12#[derive(Debug, Deserialize)]
13struct ResolveParams {
14 node_id: u64,
15}
16
17pub fn definition() -> ToolDefinition {
19 ToolDefinition {
20 name: "memory_resolve".to_string(),
21 description: Some(
22 "Follow the supersedes chain to get the latest version of a belief".to_string(),
23 ),
24 input_schema: json!({
25 "type": "object",
26 "properties": {
27 "node_id": { "type": "integer", "description": "Node ID to resolve" }
28 },
29 "required": ["node_id"]
30 }),
31 }
32}
33
34pub async fn execute(
36 args: Value,
37 session: &Arc<Mutex<SessionManager>>,
38) -> McpResult<ToolCallResult> {
39 let params: ResolveParams =
40 serde_json::from_value(args).map_err(|e| McpError::InvalidParams(e.to_string()))?;
41
42 let session = session.lock().await;
43
44 let resolved = session
45 .query_engine()
46 .resolve(session.graph(), params.node_id)
47 .map_err(|e| McpError::AgenticMemory(format!("Resolve failed: {e}")))?;
48
49 let latest = json!({
50 "id": resolved.id,
51 "event_type": resolved.event_type.name(),
52 "content": resolved.content,
53 "confidence": resolved.confidence,
54 "session_id": resolved.session_id,
55 "created_at": resolved.created_at,
56 });
57
58 let is_same = resolved.id == params.node_id;
59
60 Ok(ToolCallResult::json(&json!({
61 "original_id": params.node_id,
62 "resolved_id": resolved.id,
63 "is_latest": is_same,
64 "latest": latest,
65 })))
66}