ive harnessed the harness
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor into crates

dawn 25ac1791 6062e8f7

+159 -68
+63 -19
Cargo.lock
··· 3 3 version = 4 4 4 5 5 [[package]] 6 - name = "KLBR" 7 - version = "0.0.0" 8 - dependencies = [ 9 - "anyhow", 10 - "crossterm", 11 - "dirs", 12 - "futures", 13 - "ratatui", 14 - "reqwest", 15 - "rusqlite", 16 - "serde", 17 - "serde_json", 18 - "tokio", 19 - "tracing", 20 - "tracing-subscriber", 21 - "tui-scrollview", 22 - ] 23 - 24 - [[package]] 25 6 name = "aho-corasick" 26 7 version = "1.1.4" 27 8 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1118 1099 ] 1119 1100 1120 1101 [[package]] 1102 + name = "klbr-core" 1103 + version = "0.1.0" 1104 + dependencies = [ 1105 + "anyhow", 1106 + "dirs", 1107 + "futures", 1108 + "klbr-ipc", 1109 + "reqwest", 1110 + "rusqlite", 1111 + "serde", 1112 + "serde_json", 1113 + "sqlite-vec", 1114 + "tokio", 1115 + "tracing", 1116 + "tracing-subscriber", 1117 + ] 1118 + 1119 + [[package]] 1120 + name = "klbr-daemon" 1121 + version = "0.1.0" 1122 + dependencies = [ 1123 + "anyhow", 1124 + "klbr-core", 1125 + "klbr-ipc", 1126 + "tokio", 1127 + "tracing", 1128 + "tracing-subscriber", 1129 + ] 1130 + 1131 + [[package]] 1132 + name = "klbr-ipc" 1133 + version = "0.1.0" 1134 + dependencies = [ 1135 + "dirs", 1136 + "serde", 1137 + "serde_json", 1138 + ] 1139 + 1140 + [[package]] 1141 + name = "klbr-tui" 1142 + version = "0.1.0" 1143 + dependencies = [ 1144 + "anyhow", 1145 + "crossterm", 1146 + "futures", 1147 + "klbr-ipc", 1148 + "ratatui", 1149 + "serde_json", 1150 + "tokio", 1151 + "tracing", 1152 + "tui-scrollview", 1153 + ] 1154 + 1155 + [[package]] 1121 1156 name = "lab" 1122 1157 version = "0.11.0" 1123 1158 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2183 2218 dependencies = [ 2184 2219 "libc", 2185 2220 "windows-sys 0.61.2", 2221 + ] 2222 + 2223 + [[package]] 2224 + name = "sqlite-vec" 2225 + version = "0.1.9" 2226 + source = "registry+https://github.com/rust-lang/crates.io-index" 2227 + checksum = "d0ba424237a9a5db2f6071f193319e2b6a32f7f3961debb2fbbfe67067abce3f" 2228 + dependencies = [ 2229 + "cc", 2186 2230 ] 2187 2231 2188 2232 [[package]]
+8 -19
Cargo.toml
··· 1 - [package] 2 - name = "KLBR" 3 - # version = "C0001" 4 - edition = "2021" 5 - 6 - [dependencies] 7 - tokio = { version = "1", features = ["full"] } 8 - rusqlite = { version = "0.39", features = ["bundled"] } 9 - reqwest = { version = "0.13", features = ["json", "stream", "rustls"] } 10 - serde = { version = "1", features = ["derive"] } 11 - serde_json = "1" 12 - anyhow = "1" 13 - ratatui = "0.30" 14 - crossterm = { version = "0.29", features = ["event-stream"] } 15 - futures = "0.3" 16 - dirs = "5" 17 - tracing = "0.1.44" 18 - tracing-subscriber = "0.3.23" 19 - tui-scrollview = "0.6.4" 1 + [workspace] 2 + members = [ 3 + "klbr-core", 4 + "klbr-daemon", 5 + "klbr-ipc", 6 + "klbr-tui", 7 + ] 8 + resolver = "2"
+22
klbr-core/Cargo.toml
··· 1 + [package] 2 + name = "klbr-core" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [lib] 7 + name = "klbr_core" 8 + path = "src/lib.rs" 9 + 10 + [dependencies] 11 + klbr-ipc = { path = "../klbr-ipc" } 12 + sqlite-vec = "0.1.0" 13 + tokio = { version = "1", features = ["full"] } 14 + rusqlite = { version = "0.39", features = ["bundled"] } 15 + reqwest = { version = "0.13", features = ["json", "stream", "rustls"] } 16 + serde = { version = "1", features = ["derive"] } 17 + serde_json = "1" 18 + anyhow = "1" 19 + futures = "0.3" 20 + dirs = "5" 21 + tracing = "0.1.44" 22 + tracing-subscriber = "0.3.23"
+12
klbr-daemon/Cargo.toml
··· 1 + [package] 2 + name = "klbr-daemon" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + klbr-core = { path = "../klbr-core" } 8 + klbr-ipc = { path = "../klbr-ipc" } 9 + tokio = { version = "1", features = ["full"] } 10 + anyhow = "1" 11 + tracing = "0.1.44" 12 + tracing-subscriber = "0.3.23"
+6
klbr-daemon/src/main.rs
··· 1 + use anyhow::Result; 2 + 3 + #[tokio::main] 4 + async fn main() -> Result<()> { 5 + klbr_core::run_daemon().await 6 + }
+9
klbr-ipc/Cargo.toml
··· 1 + [package] 2 + name = "klbr-ipc" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + serde = { version = "1", features = ["derive"] } 8 + serde_json = "1" 9 + dirs = "5"
+15
klbr-tui/Cargo.toml
··· 1 + [package] 2 + name = "klbr-tui" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + klbr-ipc = { path = "../klbr-ipc" } 8 + ratatui = "0.30" 9 + crossterm = { version = "0.29", features = ["event-stream"] } 10 + tokio = { version = "1", features = ["full"] } 11 + futures = "0.3" 12 + anyhow = "1" 13 + tui-scrollview = "0.6.4" 14 + serde_json = "1" 15 + tracing = "0.1.44"
+2 -2
src/agent.rs klbr-core/src/agent.rs
··· 2 2 use std::sync::Arc; 3 3 use tokio::sync::{broadcast, mpsc, RwLock}; 4 4 5 - pub type MetricsSnapshot = Arc<RwLock<Option<crate::ipc::ServerMsg>>>; 5 + pub type MetricsSnapshot = Arc<RwLock<Option<klbr_ipc::ServerMsg>>>; 6 6 7 7 use crate::{ 8 8 config::Config, 9 9 context::Context, 10 10 interrupt::Interrupt, 11 - ipc::ServerMsg, 12 11 llm::{LlmClient, Message}, 13 12 memory::MemoryStore, 14 13 }; 14 + use klbr_ipc::ServerMsg; 15 15 16 16 pub async fn run( 17 17 config: Config,
src/config.rs klbr-core/src/config.rs
src/context.rs klbr-core/src/context.rs
+6 -8
src/daemon.rs klbr-core/src/daemon.rs
··· 6 6 sync::{broadcast, mpsc, RwLock}, 7 7 }; 8 8 9 - use crate::{ 10 - interrupt::Interrupt, 11 - ipc::{sock_path, ClientMsg, ServerMsg}, 12 - memory::MemoryStore, 13 - }; 9 + use crate::{interrupt::Interrupt, memory::MemoryStore}; 10 + use klbr_ipc::{sock_path, ClientMsg, ServerMsg}; 14 11 15 12 /// last known metrics snapshot, updated by agent, read on new client connect 16 13 pub type MetricsSnapshot = Arc<RwLock<Option<ServerMsg>>>; ··· 71 68 send_msg(&mut sock_tx, &ServerMsg::History { turns }).await?; 72 69 73 70 // send last known metrics so status bar is populated immediately 74 - if let Some(metrics) = snapshot.read().await.clone() { 71 + let snap: Option<ServerMsg> = snapshot.read().await.clone(); 72 + if let Some(metrics) = snap { 75 73 send_msg(&mut sock_tx, &metrics).await?; 76 74 } 77 75 78 76 loop { 79 77 tokio::select! { 80 - line = sock_rx.next_line() => { 81 - let Some(line) = line? else { break }; 78 + res = sock_rx.next_line() => { 79 + let Some(line) = res? else { break }; 82 80 let msg: ClientMsg = serde_json::from_str(&line)?; 83 81 match msg { 84 82 ClientMsg::Message { source, content } => {
src/interrupt.rs klbr-core/src/interrupt.rs
src/ipc.rs klbr-ipc/src/lib.rs
src/llm.rs klbr-core/src/llm.rs
+10 -17
src/main.rs klbr-core/src/lib.rs
··· 3 3 mod context; 4 4 mod daemon; 5 5 mod interrupt; 6 - mod ipc; 7 6 mod llm; 8 7 mod memory; 9 - mod tui; 8 + use klbr_ipc::ServerMsg; 10 9 11 10 use anyhow::Result; 12 11 use std::sync::Arc; ··· 14 13 15 14 use config::Config; 16 15 17 - #[tokio::main] 18 - async fn main() -> Result<()> { 19 - match std::env::args().nth(1).as_deref() { 20 - Some("daemon") => run_daemon().await, 21 - Some(other) => { 22 - eprintln!("unknown subcommand: {other}\nusage: agent [daemon]"); 23 - std::process::exit(1); 24 - } 25 - None => tui::run().await, 26 - } 27 - } 28 - 29 - async fn run_daemon() -> Result<()> { 16 + pub async fn run_daemon() -> Result<()> { 30 17 tracing_subscriber::fmt().init(); 31 18 32 19 let config = Config::default(); ··· 35 22 let snapshot = Arc::new(RwLock::new(None)); 36 23 37 24 let (interrupt_tx, interrupt_rx) = mpsc::channel::<interrupt::Interrupt>(32); 38 - let (output_tx, _) = broadcast::channel::<ipc::ServerMsg>(256); 25 + let (output_tx, _) = broadcast::channel::<ServerMsg>(256); 39 26 40 27 // --- register extra interrupt sources here --- 41 28 // interrupt::spawn_source(interrupt_tx.clone(), |tx| async move { ··· 51 38 output_tx.clone(), 52 39 snapshot.clone(), 53 40 )); 54 - let sock = tokio::spawn(daemon::serve(interrupt_tx, output_tx, snapshot, memory, history_window)); 41 + let sock = tokio::spawn(daemon::serve( 42 + interrupt_tx, 43 + output_tx, 44 + snapshot, 45 + memory, 46 + history_window, 47 + )); 55 48 56 49 tokio::select! { 57 50 r = agent => { r??; }
+1 -2
src/memory.rs klbr-core/src/memory.rs
··· 28 28 ); 29 29 30 30 CREATE VIRTUAL TABLE IF NOT EXISTS vec_memories USING vec0( 31 - embedding float[1024], 32 - distance_metric=cosine 31 + embedding float[1024] distance_metric=cosine 33 32 ); 34 33 35 34 CREATE TABLE IF NOT EXISTS turns (
+5 -1
src/tui.rs klbr-tui/src/main.rs
··· 23 23 }; 24 24 use tui_scrollview::{ScrollView, ScrollViewState}; 25 25 26 - use crate::ipc::{sock_path, ClientMsg, ServerMsg}; 26 + use klbr_ipc::{sock_path, ClientMsg, ServerMsg}; 27 27 28 28 // ── message model ──────────────────────────────────────────────────────────── 29 29 ··· 657 657 } 658 658 Ok(()) 659 659 } 660 + #[tokio::main] 661 + async fn main() -> Result<()> { 662 + run().await 663 + }