add node-delete command and redirect table for split files

node-delete: soft-deletes a node by appending a deleted version to
the capnp log, then removing it from the in-memory cache.

resolve_redirect: when resolve_key can't find a node, checks a static
redirect table for sections that moved during file splits (like the
reflections.md → reflections-{reading,dreams,zoom}.md split). This
handles immutable files (journal.md with chattr +a) that can't have
their references updated.
This commit is contained in:
ProofOfConcept 2026-02-28 22:40:17 -05:00
parent 4b0bba7c56
commit 2d6c8d5199
2 changed files with 64 additions and 1 deletions

View file

@ -62,6 +62,7 @@ fn main() {
"list-keys" => cmd_list_keys(),
"list-edges" => cmd_list_edges(),
"dump-json" => cmd_dump_json(),
"node-delete" => cmd_node_delete(&args[2..]),
_ => {
eprintln!("Unknown command: {}", args[1]);
usage();
@ -109,7 +110,8 @@ Commands:
trace KEY Walk temporal links: semantic episodic conversation
list-keys List all node keys (one per line)
list-edges List all edges (tsv: source target strength type)
dump-json Dump entire store as JSON");
dump-json Dump entire store as JSON
node-delete KEY Soft-delete a node (appends deleted version to log)");
}
fn cmd_search(args: &[String]) -> Result<(), String> {
@ -771,6 +773,33 @@ fn cmd_dump_json() -> Result<(), String> {
Ok(())
}
fn cmd_node_delete(args: &[String]) -> Result<(), String> {
if args.is_empty() {
return Err("Usage: poc-memory node-delete KEY".into());
}
let key = args.join(" ");
let mut store = capnp_store::Store::load()?;
let resolved = store.resolve_key(&key)?;
let updated = if let Some(node) = store.nodes.get_mut(&resolved) {
node.deleted = true;
node.version += 1;
Some(node.clone())
} else {
None
};
if let Some(node) = updated {
store.append_nodes(&[node])?;
store.nodes.remove(&resolved);
store.save()?;
println!("Deleted '{}'", resolved);
Ok(())
} else {
Err(format!("No node '{}'", resolved))
}
}
fn cmd_interference(args: &[String]) -> Result<(), String> {
let mut threshold = 0.4f32;
let mut i = 0;