From c688b812efd8fdb60b9938b0c1b1fe643c4e6618 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Mon, 13 Apr 2026 01:45:12 -0400 Subject: [PATCH] defs.rs: convert organize placeholder to use RPC Uses memory_render RPC instead of direct store access. Simplifies from ~60 to ~20 lines. Co-Authored-By: Proof of Concept --- src/subconscious/defs.rs | 56 +++++++--------------------------------- 1 file changed, 9 insertions(+), 47 deletions(-) diff --git a/src/subconscious/defs.rs b/src/subconscious/defs.rs index b2bcfdb..967df72 100644 --- a/src/subconscious/defs.rs +++ b/src/subconscious/defs.rs @@ -235,62 +235,24 @@ fn resolve( } "organize" => { - // Show seed nodes with their neighbors for exploratory organizing - use crate::store::NodeType; - - // Helper: shell-quote keys containing # - let sq = |k: &str| -> String { - if k.contains('#') { format!("'{}'", k) } else { k.to_string() } - }; - + // Show seed nodes with content and links via RPC let mut text = format!("### Seed nodes ({} starting points)\n\n", keys.len()); let mut result_keys = Vec::new(); for key in keys { - let Some(node) = store.nodes.get(key) else { continue }; - if node.deleted { continue; } - - let is_journal = node.node_type == NodeType::EpisodicSession; - let tag = if is_journal { " [JOURNAL — no delete]" } else { "" }; - let words = node.content.split_whitespace().count(); - - text.push_str(&format!("#### {}{} ({} words)\n\n", sq(key), tag, words)); - - // Show first ~200 words of content as preview - let preview: String = node.content.split_whitespace() - .take(200).collect::>().join(" "); - if words > 200 { - text.push_str(&format!("{}...\n\n", preview)); - } else { - text.push_str(&format!("{}\n\n", node.content)); - } - - // Show neighbors with strengths - let neighbors = graph.neighbors(key); - if !neighbors.is_empty() { - text.push_str("**Neighbors:**\n"); - for (nbr, strength) in neighbors.iter().take(15) { - let nbr_type = store.nodes.get(nbr.as_str()) - .map(|n| match n.node_type { - NodeType::EpisodicSession => " [journal]", - NodeType::EpisodicDaily => " [daily]", - _ => "", - }) - .unwrap_or(""); - text.push_str(&format!(" [{:.1}] {}{}\n", strength, sq(nbr), nbr_type)); + match crate::mcp_server::memory_rpc( + "memory_render", + serde_json::json!({"key": key}), + ) { + Ok(content) if !content.trim().is_empty() => { + text.push_str(&format!("#### {}\n\n{}\n\n---\n\n", key, content)); + result_keys.push(key.clone()); } - if neighbors.len() > 15 { - text.push_str(&format!(" ... and {} more\n", neighbors.len() - 15)); - } - text.push('\n'); + _ => continue, } - - text.push_str("---\n\n"); - result_keys.push(key.clone()); } text.push_str("Use memory_render(KEY) and memory_links(KEY) to explore further.\n"); - Some(Resolved { text, keys: result_keys }) }