forked from kent/consciousness
cli: add memory_history, remove dump-json/edges/lookups
- Add memory_history MCP tool for version history - Convert cmd_history to use memory_rpc - Add raw parameter to memory_render for editing - Remove unused: dump-json, list-edges, lookup-bump, lookups - Fix render_node path in defs.rs/subconscious.rs Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
parent
3e0c6b039f
commit
ad59596335
8 changed files with 188 additions and 132 deletions
115
src/cli/node.rs
115
src/cli/node.rs
|
|
@ -48,23 +48,6 @@ pub fn cmd_list_keys(pattern: Option<&str>) -> Result<(), String> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn cmd_list_edges() -> Result<(), String> {
|
||||
let store = store::Store::load()?;
|
||||
for rel in &store.relations {
|
||||
println!("{}\t{}\t{:.2}\t{:?}",
|
||||
rel.source_key, rel.target_key, rel.strength, rel.rel_type);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn cmd_dump_json() -> Result<(), String> {
|
||||
let store = store::Store::load()?;
|
||||
let json = serde_json::to_string_pretty(&store)
|
||||
.map_err(|e| format!("serialize: {}", e))?;
|
||||
println!("{}", json);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn cmd_node_delete(key: &[String]) -> Result<(), String> {
|
||||
if key.is_empty() {
|
||||
return Err("node-delete requires a key".into());
|
||||
|
|
@ -127,68 +110,12 @@ pub fn cmd_history(key: &[String], full: bool) -> Result<(), String> {
|
|||
if key.is_empty() {
|
||||
return Err("history requires a key".into());
|
||||
}
|
||||
let raw_key = key.join(" ");
|
||||
|
||||
let store = store::Store::load()?;
|
||||
let key = store.resolve_key(&raw_key).unwrap_or(raw_key);
|
||||
drop(store);
|
||||
|
||||
let path = store::nodes_path();
|
||||
if !path.exists() {
|
||||
return Err("No node log found".into());
|
||||
}
|
||||
|
||||
use std::io::BufReader;
|
||||
let file = std::fs::File::open(&path)
|
||||
.map_err(|e| format!("open {}: {}", path.display(), e))?;
|
||||
let mut reader = BufReader::new(file);
|
||||
|
||||
let mut versions: Vec<store::Node> = Vec::new();
|
||||
while let Ok(msg) = capnp::serialize::read_message(&mut reader, capnp::message::ReaderOptions::new()) {
|
||||
let log = msg.get_root::<crate::memory_capnp::node_log::Reader>()
|
||||
.map_err(|e| format!("read log: {}", e))?;
|
||||
for node_reader in log.get_nodes()
|
||||
.map_err(|e| format!("get nodes: {}", e))? {
|
||||
let node = store::Node::from_capnp_migrate(node_reader)?;
|
||||
if node.key == key {
|
||||
versions.push(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if versions.is_empty() {
|
||||
return Err(format!("No history found for '{}'", key));
|
||||
}
|
||||
|
||||
eprintln!("{} versions of '{}':\n", versions.len(), key);
|
||||
for node in &versions {
|
||||
let ts = if node.timestamp > 0 && node.timestamp < 4_000_000_000 {
|
||||
store::format_datetime(node.timestamp)
|
||||
} else {
|
||||
format!("(raw:{})", node.timestamp)
|
||||
};
|
||||
let deleted_marker = if node.deleted { " DELETED" } else { "" };
|
||||
let content_len = node.content.len();
|
||||
if full {
|
||||
eprintln!("=== v{} {} {}{} w={:.3} {}b ===",
|
||||
node.version, ts, node.provenance, deleted_marker, node.weight, content_len);
|
||||
eprintln!("{}", node.content);
|
||||
} else {
|
||||
let preview = crate::util::first_n_chars(&node.content, 120);
|
||||
let preview = preview.replace('\n', "\\n");
|
||||
eprintln!(" v{:<3} {} {:24} w={:.3} {}b{}",
|
||||
node.version, ts, node.provenance, node.weight, content_len, deleted_marker);
|
||||
eprintln!(" {}", preview);
|
||||
}
|
||||
}
|
||||
|
||||
if !full
|
||||
&& let Some(latest) = versions.last() {
|
||||
eprintln!("\n--- Latest content (v{}, {}) ---",
|
||||
latest.version, latest.provenance);
|
||||
print!("{}", latest.content);
|
||||
}
|
||||
|
||||
let key = key.join(" ");
|
||||
let result = crate::mcp_server::memory_rpc(
|
||||
"memory_history",
|
||||
serde_json::json!({"key": key, "full": full}),
|
||||
).map_err(|e| e.to_string())?;
|
||||
print!("{}", result);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
@ -263,33 +190,3 @@ pub fn cmd_edit(key: &[String]) -> Result<(), String> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub fn cmd_lookup_bump(keys: &[String]) -> Result<(), String> {
|
||||
if keys.is_empty() {
|
||||
return Err("lookup-bump requires at least one key".into());
|
||||
}
|
||||
let keys: Vec<&str> = keys.iter().map(|s| s.as_str()).collect();
|
||||
crate::lookups::bump_many(&keys)
|
||||
}
|
||||
|
||||
pub fn cmd_lookups(date: Option<&str>) -> Result<(), String> {
|
||||
let date = date.map(|d| d.to_string())
|
||||
.unwrap_or_else(|| chrono::Local::now().format("%Y-%m-%d").to_string());
|
||||
|
||||
let store = store::Store::load()?;
|
||||
let keys: Vec<String> = store.nodes.values().map(|n| n.key.clone()).collect();
|
||||
let resolved = crate::lookups::dump_resolved(&date, &keys)?;
|
||||
|
||||
if resolved.is_empty() {
|
||||
println!("No lookups for {}", date);
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
println!("Lookups for {}:", date);
|
||||
for (key, count) in &resolved {
|
||||
println!(" {:4} {}", count, key);
|
||||
}
|
||||
println!("\n{} distinct keys, {} total lookups",
|
||||
resolved.len(),
|
||||
resolved.iter().map(|(_, c)| *c as u64).sum::<u64>());
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue