api: retry transient connection errors, misc fixes

- Retry up to 5 times with exponential backoff (2s, 4s, 8s, 16s)
  on transient errors: IncompleteMessage, connection closed/reset/
  refused, timeouts. Non-transient errors fail immediately.
- tail command: print to stdout instead of stderr
- state_dir rename: output_dir → state_dir throughout knowledge.rs

Co-Authored-By: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
ProofOfConcept 2026-03-26 17:48:44 -04:00
parent 5d803441c9
commit 3e410347a2
3 changed files with 53 additions and 31 deletions

View file

@ -33,18 +33,18 @@ pub fn cmd_tail(n: usize, full: bool) -> Result<(), String> {
};
let del = if node.deleted { " [DELETED]" } else { "" };
if full {
eprintln!("--- {} (v{}) {} via {} w={:.3}{} ---",
println!("--- {} (v{}) {} via {} w={:.3}{} ---",
node.key, node.version, ts, node.provenance, node.weight, del);
eprintln!("{}\n", node.content);
println!("{}\n", node.content);
} else {
let preview = crate::util::first_n_chars(&node.content, 100).replace('\n', "\\n");
eprintln!(" {} v{} w={:.2}{}",
println!(" {} v{} w={:.2}{}",
ts, node.version, node.weight, del);
eprintln!(" {} via {}", node.key, node.provenance);
println!(" {} via {}", node.key, node.provenance);
if !preview.is_empty() {
eprintln!(" {}", preview);
println!(" {}", preview);
}
eprintln!();
println!();
}
}