forked from kent/consciousness
more dead code deletion
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
31aa0f3125
commit
919749dc67
10 changed files with 8 additions and 1710 deletions
327
src/main.rs
327
src/main.rs
|
|
@ -203,12 +203,6 @@ EXAMPLES:
|
|||
#[command(subcommand, name = "graph")]
|
||||
GraphCmd(GraphCmd),
|
||||
|
||||
// ── Cursor (spatial memory) ──────────────────────────────────────
|
||||
|
||||
/// Navigate the memory graph with a persistent cursor
|
||||
#[command(subcommand)]
|
||||
Cursor(CursorCmd),
|
||||
|
||||
// ── Agents ────────────────────────────────────────────────────────
|
||||
|
||||
/// Agent and daemon operations
|
||||
|
|
@ -249,27 +243,6 @@ enum NodeCmd {
|
|||
Dump,
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
enum CursorCmd {
|
||||
/// Show current cursor position with context
|
||||
Show,
|
||||
/// Set cursor to a node key
|
||||
Set {
|
||||
/// Node key
|
||||
key: Vec<String>,
|
||||
},
|
||||
/// Move cursor forward in time
|
||||
Forward,
|
||||
/// Move cursor backward in time
|
||||
Back,
|
||||
/// Move up the digest hierarchy (journal→daily→weekly→monthly)
|
||||
Up,
|
||||
/// Move down the digest hierarchy (to first child)
|
||||
Down,
|
||||
/// Clear the cursor
|
||||
Clear,
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
enum JournalCmd {
|
||||
/// Write a journal entry to the store
|
||||
|
|
@ -291,16 +264,6 @@ enum JournalCmd {
|
|||
#[arg(long, default_value_t = 0)]
|
||||
level: u8,
|
||||
},
|
||||
/// Enrich journal entry with conversation links
|
||||
Enrich {
|
||||
/// Path to JSONL transcript
|
||||
jsonl_path: String,
|
||||
/// Journal entry text to enrich
|
||||
entry_text: String,
|
||||
/// Grep line number for source location
|
||||
#[arg(default_value_t = 0)]
|
||||
grep_line: usize,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
|
|
@ -346,13 +309,6 @@ enum GraphCmd {
|
|||
/// Target node key
|
||||
target: String,
|
||||
},
|
||||
/// Walk every link, send to Sonnet for quality review
|
||||
#[command(name = "link-audit")]
|
||||
LinkAudit {
|
||||
/// Apply changes (default: dry run)
|
||||
#[arg(long)]
|
||||
apply: bool,
|
||||
},
|
||||
/// Cap node degree by pruning weak auto edges
|
||||
#[command(name = "cap-degree")]
|
||||
CapDegree {
|
||||
|
|
@ -401,64 +357,6 @@ enum GraphCmd {
|
|||
|
||||
#[derive(Subcommand)]
|
||||
enum AgentCmd {
|
||||
/// Run knowledge agents to convergence
|
||||
#[command(name = "knowledge-loop")]
|
||||
KnowledgeLoop {
|
||||
/// Maximum cycles before stopping
|
||||
#[arg(long, default_value_t = 20)]
|
||||
max_cycles: usize,
|
||||
/// Items per agent per cycle
|
||||
#[arg(long, default_value_t = 5)]
|
||||
batch_size: usize,
|
||||
/// Cycles to check for convergence
|
||||
#[arg(long, default_value_t = 5)]
|
||||
window: usize,
|
||||
/// Maximum inference depth
|
||||
#[arg(long, default_value_t = 4)]
|
||||
max_depth: i32,
|
||||
},
|
||||
/// Run agent consolidation on priority nodes
|
||||
#[command(name = "consolidate-batch")]
|
||||
ConsolidateBatch {
|
||||
/// Number of nodes to consolidate
|
||||
#[arg(long, default_value_t = 5)]
|
||||
count: usize,
|
||||
/// Generate replay agent prompt automatically
|
||||
#[arg(long)]
|
||||
auto: bool,
|
||||
/// Generate prompt for a specific agent (replay, linker, separator, transfer, health)
|
||||
#[arg(long)]
|
||||
agent: Option<String>,
|
||||
},
|
||||
/// Analyze metrics, plan agent allocation
|
||||
#[command(name = "consolidate-session")]
|
||||
ConsolidateSession,
|
||||
/// Autonomous: plan → agents → apply → digests → links
|
||||
#[command(name = "consolidate-full")]
|
||||
ConsolidateFull,
|
||||
/// Import pending agent results into the graph
|
||||
#[command(name = "apply-agent")]
|
||||
ApplyAgent {
|
||||
/// Process all files without moving to done/
|
||||
#[arg(long)]
|
||||
all: bool,
|
||||
},
|
||||
/// Extract and apply actions from consolidation reports
|
||||
#[command(name = "apply-consolidation")]
|
||||
ApplyConsolidation {
|
||||
/// Apply actions (default: dry run)
|
||||
#[arg(long)]
|
||||
apply: bool,
|
||||
/// Read from specific report file
|
||||
#[arg(long)]
|
||||
report: Option<String>,
|
||||
},
|
||||
/// Generate episodic digests (daily, weekly, monthly, auto)
|
||||
Digest {
|
||||
/// Digest type: daily, weekly, monthly, auto
|
||||
#[command(subcommand)]
|
||||
level: DigestLevel,
|
||||
},
|
||||
/// Parse and apply links from digest nodes
|
||||
#[command(name = "digest-links")]
|
||||
DigestLinks {
|
||||
|
|
@ -566,27 +464,6 @@ enum AdminCmd {
|
|||
MigrateTranscriptProgress,
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
enum DigestLevel {
|
||||
/// Generate daily digest
|
||||
Daily {
|
||||
/// Date (default: today)
|
||||
date: Option<String>,
|
||||
},
|
||||
/// Generate weekly digest
|
||||
Weekly {
|
||||
/// Date or week label (default: current week)
|
||||
date: Option<String>,
|
||||
},
|
||||
/// Generate monthly digest
|
||||
Monthly {
|
||||
/// Month (YYYY-MM) or date (default: current month)
|
||||
date: Option<String>,
|
||||
},
|
||||
/// Generate all missing digests
|
||||
Auto,
|
||||
}
|
||||
|
||||
/// Print help with subcommands expanded to show nested commands.
|
||||
fn print_help() {
|
||||
use clap::CommandFactory;
|
||||
|
|
@ -653,7 +530,6 @@ impl Run for Command {
|
|||
Self::Node(sub) => sub.run(),
|
||||
Self::Journal(sub) => sub.run(),
|
||||
Self::GraphCmd(sub) => sub.run(),
|
||||
Self::Cursor(sub) => sub.run(),
|
||||
Self::Agent(sub) => sub.run(),
|
||||
Self::Admin(sub) => sub.run(),
|
||||
// mcp-schema moved to consciousness-mcp binary
|
||||
|
|
@ -678,8 +554,6 @@ impl Run for JournalCmd {
|
|||
match self {
|
||||
Self::Write { name, text } => cli::journal::cmd_journal_write(&name, &text),
|
||||
Self::Tail { n, full, level } => cli::journal::cmd_journal_tail(n, full, level),
|
||||
Self::Enrich { jsonl_path, entry_text, grep_line }
|
||||
=> cli::agent::cmd_journal_enrich(&jsonl_path, &entry_text, grep_line),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -694,7 +568,6 @@ impl Run for GraphCmd {
|
|||
Self::LinkSet { source, target, strength }
|
||||
=> cli::graph::cmd_link_set(&source, &target, strength),
|
||||
Self::LinkImpact { source, target } => cli::graph::cmd_link_impact(&source, &target),
|
||||
Self::LinkAudit { apply } => cli::graph::cmd_link_audit(apply),
|
||||
Self::CapDegree { max_degree } => cli::graph::cmd_cap_degree(max_degree),
|
||||
Self::NormalizeStrengths { apply } => cli::graph::cmd_normalize_strengths(apply),
|
||||
Self::Trace { key } => cli::graph::cmd_trace(&key),
|
||||
|
|
@ -706,46 +579,9 @@ impl Run for GraphCmd {
|
|||
}
|
||||
}
|
||||
|
||||
impl Run for CursorCmd {
|
||||
fn run(self) -> Result<(), String> {
|
||||
match self {
|
||||
Self::Show => {
|
||||
let store = store::Store::load()?;
|
||||
cursor::show(&store)
|
||||
}
|
||||
Self::Set { key } => {
|
||||
if key.is_empty() { return Err("cursor set requires a key".into()); }
|
||||
let key = key.join(" ");
|
||||
let store = store::Store::load()?;
|
||||
let bare = store::strip_md_suffix(&key);
|
||||
if !store.nodes.contains_key(&bare) {
|
||||
return Err(format!("Node not found: {}", bare));
|
||||
}
|
||||
cursor::set(&bare)?;
|
||||
cursor::show(&store)
|
||||
}
|
||||
Self::Forward => { let s = store::Store::load()?; cursor::move_temporal(&s, true) }
|
||||
Self::Back => { let s = store::Store::load()?; cursor::move_temporal(&s, false) }
|
||||
Self::Up => { let s = store::Store::load()?; cursor::move_up(&s) }
|
||||
Self::Down => { let s = store::Store::load()?; cursor::move_down(&s) }
|
||||
Self::Clear => cursor::clear(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Run for AgentCmd {
|
||||
fn run(self) -> Result<(), String> {
|
||||
match self {
|
||||
Self::KnowledgeLoop { max_cycles, batch_size, window, max_depth }
|
||||
=> cli::agent::cmd_knowledge_loop(max_cycles, batch_size, window, max_depth),
|
||||
Self::ConsolidateBatch { count, auto, agent }
|
||||
=> cli::agent::cmd_consolidate_batch(count, auto, agent),
|
||||
Self::ConsolidateSession => cli::agent::cmd_consolidate_session(),
|
||||
Self::ConsolidateFull => cli::agent::cmd_consolidate_full(),
|
||||
Self::ApplyAgent { all } => cmd_apply_agent(all),
|
||||
Self::ApplyConsolidation { apply, report }
|
||||
=> cli::agent::cmd_apply_consolidation(apply, report.as_deref()),
|
||||
Self::Digest { level } => cmd_digest(level),
|
||||
Self::DigestLinks { apply } => cli::agent::cmd_digest_links(apply),
|
||||
Self::Run { agent, count, target, query, dry_run, local, state_dir }
|
||||
=> cli::agent::cmd_run_agent(&agent, count, &target, query.as_deref(), dry_run, local, state_dir.as_deref()),
|
||||
|
|
@ -803,166 +639,3 @@ fn main() {
|
|||
}
|
||||
}
|
||||
|
||||
// ── Command implementations ─────────────────────────────────────────
|
||||
|
||||
/// Apply links from a single agent result JSON file.
|
||||
/// Returns (links_applied, errors).
|
||||
fn apply_agent_file(
|
||||
store: &mut store::Store,
|
||||
data: &serde_json::Value,
|
||||
) -> (usize, usize) {
|
||||
let agent_result = data.get("agent_result").or(Some(data));
|
||||
let links = match agent_result.and_then(|r| r.get("links")).and_then(|l| l.as_array()) {
|
||||
Some(l) => l,
|
||||
None => return (0, 0),
|
||||
};
|
||||
|
||||
let entry_text = data.get("entry_text")
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("");
|
||||
|
||||
if let (Some(start), Some(end)) = (
|
||||
agent_result.and_then(|r| r.get("source_start")).and_then(|v| v.as_u64()),
|
||||
agent_result.and_then(|r| r.get("source_end")).and_then(|v| v.as_u64()),
|
||||
) {
|
||||
println!(" Source: L{}-L{}", start, end);
|
||||
}
|
||||
|
||||
let mut applied = 0;
|
||||
let mut errors = 0;
|
||||
|
||||
for link in links {
|
||||
let target = match link.get("target").and_then(|v| v.as_str()) {
|
||||
Some(t) => t,
|
||||
None => continue,
|
||||
};
|
||||
let reason = link.get("reason").and_then(|v| v.as_str()).unwrap_or("");
|
||||
|
||||
if let Some(note) = target.strip_prefix("NOTE:") {
|
||||
println!(" NOTE: {} — {}", note, reason);
|
||||
continue;
|
||||
}
|
||||
|
||||
let resolved = match store.resolve_key(target) {
|
||||
Ok(r) => r,
|
||||
Err(_) => {
|
||||
println!(" SKIP {} (not found in graph)", target);
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let source_key = match store.find_journal_node(entry_text) {
|
||||
Some(k) => k,
|
||||
None => {
|
||||
println!(" SKIP {} (no matching journal node)", target);
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let source_uuid = match store.nodes.get(&source_key) {
|
||||
Some(n) => n.uuid,
|
||||
None => continue,
|
||||
};
|
||||
let target_uuid = match store.nodes.get(&resolved) {
|
||||
Some(n) => n.uuid,
|
||||
None => continue,
|
||||
};
|
||||
|
||||
let rel = store::new_relation(
|
||||
source_uuid, target_uuid,
|
||||
store::RelationType::Link,
|
||||
0.5,
|
||||
&source_key, &resolved,
|
||||
);
|
||||
if let Err(e) = store.add_relation(rel) {
|
||||
eprintln!(" Error adding relation: {}", e);
|
||||
errors += 1;
|
||||
} else {
|
||||
println!(" LINK {} → {} ({})", source_key, resolved, reason);
|
||||
applied += 1;
|
||||
}
|
||||
}
|
||||
|
||||
(applied, errors)
|
||||
}
|
||||
|
||||
fn cmd_apply_agent(process_all: bool) -> Result<(), String> {
|
||||
let results_dir = store::memory_dir().join("agent-results");
|
||||
|
||||
if !results_dir.exists() {
|
||||
println!("No agent results directory");
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let mut store = store::Store::load()?;
|
||||
let mut applied = 0;
|
||||
let mut errors = 0;
|
||||
|
||||
let mut files: Vec<_> = std::fs::read_dir(&results_dir)
|
||||
.map_err(|e| format!("read results dir: {}", e))?
|
||||
.filter_map(|e| e.ok())
|
||||
.filter(|e| e.path().extension().map(|x| x == "json").unwrap_or(false))
|
||||
.collect();
|
||||
files.sort_by_key(|e| e.path());
|
||||
|
||||
for entry in &files {
|
||||
let path = entry.path();
|
||||
let content = match std::fs::read_to_string(&path) {
|
||||
Ok(c) => c,
|
||||
Err(e) => {
|
||||
eprintln!(" Skip {}: {}", path.display(), e);
|
||||
errors += 1;
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let data: serde_json::Value = match serde_json::from_str(&content) {
|
||||
Ok(d) => d,
|
||||
Err(e) => {
|
||||
eprintln!(" Skip {}: parse error: {}", path.display(), e);
|
||||
errors += 1;
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
println!("Processing {}:", path.file_name().unwrap().to_string_lossy());
|
||||
let (a, e) = apply_agent_file(&mut store, &data);
|
||||
applied += a;
|
||||
errors += e;
|
||||
|
||||
if !process_all {
|
||||
let done_dir = crate::util::memory_subdir("agent-results/done")?;
|
||||
let dest = done_dir.join(path.file_name().unwrap());
|
||||
std::fs::rename(&path, &dest).ok();
|
||||
}
|
||||
}
|
||||
|
||||
if applied > 0 {
|
||||
store.save()?;
|
||||
}
|
||||
|
||||
println!("\nApplied {} links ({} errors, {} files processed)",
|
||||
applied, errors, files.len());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn cmd_digest(level: DigestLevel) -> Result<(), String> {
|
||||
let mut store = store::Store::load()?;
|
||||
|
||||
match level {
|
||||
DigestLevel::Auto => digest::digest_auto(&mut store),
|
||||
DigestLevel::Daily { date } => {
|
||||
let arg = date.unwrap_or_else(|| store::format_date(store::now_epoch()));
|
||||
digest::generate(&mut store, "daily", &arg)
|
||||
}
|
||||
DigestLevel::Weekly { date } => {
|
||||
let arg = date.unwrap_or_else(|| store::format_date(store::now_epoch()));
|
||||
digest::generate(&mut store, "weekly", &arg)
|
||||
}
|
||||
DigestLevel::Monthly { date } => {
|
||||
let arg = date.unwrap_or_else(|| store::format_date(store::now_epoch()));
|
||||
digest::generate(&mut store, "monthly", &arg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue