Skip to main content

agentic_memory_mcp/tools/
memory_resolve.rs

1//! Tool: memory_resolve — Follow supersedes chain to get the latest version.
2
3use 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
17/// Return the tool definition for memory_resolve.
18pub 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
34/// Execute the memory_resolve tool.
35pub 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}