From 87599cb73adae09014bcee2c708eac4b5f2b571c Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 19:12:59 -0600 Subject: [PATCH 001/151] chore: move python prototype under prototype/python (refs #3) --- pyproject.toml => prototype/python/pyproject.toml | 0 {tests => prototype/python/tests}/__init__.py | 0 {tests => prototype/python/tests}/conftest.py | 0 {tests => prototype/python/tests}/test_cli.py | 0 {tests => prototype/python/tests}/test_db.py | 0 {tests => prototype/python/tests}/test_logging.py | 0 {tests => prototype/python/tests}/test_paths.py | 0 {tests => prototype/python/tests}/test_project.py | 0 {tests => prototype/python/tests}/test_recorder.py | 0 {tests => prototype/python/tests}/test_session.py | 0 {tth => prototype/python/tth}/__init__.py | 0 {tth => prototype/python/tth}/cli.py | 0 {tth => prototype/python/tth}/database.py | 0 {tth => prototype/python/tth}/logging_config.py | 0 {tth => prototype/python/tth}/project.py | 0 {tth => prototype/python/tth}/recorder.py | 0 {tth => prototype/python/tth}/schema.py | 0 {tth => prototype/python/tth}/session.py | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename pyproject.toml => prototype/python/pyproject.toml (100%) rename {tests => prototype/python/tests}/__init__.py (100%) rename {tests => prototype/python/tests}/conftest.py (100%) rename {tests => prototype/python/tests}/test_cli.py (100%) rename {tests => prototype/python/tests}/test_db.py (100%) rename {tests => prototype/python/tests}/test_logging.py (100%) rename {tests => prototype/python/tests}/test_paths.py (100%) rename {tests => prototype/python/tests}/test_project.py (100%) rename {tests => prototype/python/tests}/test_recorder.py (100%) rename {tests => prototype/python/tests}/test_session.py (100%) rename {tth => prototype/python/tth}/__init__.py (100%) rename {tth => prototype/python/tth}/cli.py (100%) rename {tth => prototype/python/tth}/database.py (100%) rename {tth => prototype/python/tth}/logging_config.py (100%) rename {tth => prototype/python/tth}/project.py (100%) rename {tth => prototype/python/tth}/recorder.py (100%) rename {tth => prototype/python/tth}/schema.py (100%) rename {tth => prototype/python/tth}/session.py (100%) diff --git a/pyproject.toml b/prototype/python/pyproject.toml similarity index 100% rename from pyproject.toml rename to prototype/python/pyproject.toml diff --git a/tests/__init__.py b/prototype/python/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to prototype/python/tests/__init__.py diff --git a/tests/conftest.py b/prototype/python/tests/conftest.py similarity index 100% rename from tests/conftest.py rename to prototype/python/tests/conftest.py diff --git a/tests/test_cli.py b/prototype/python/tests/test_cli.py similarity index 100% rename from tests/test_cli.py rename to prototype/python/tests/test_cli.py diff --git a/tests/test_db.py b/prototype/python/tests/test_db.py similarity index 100% rename from tests/test_db.py rename to prototype/python/tests/test_db.py diff --git a/tests/test_logging.py b/prototype/python/tests/test_logging.py similarity index 100% rename from tests/test_logging.py rename to prototype/python/tests/test_logging.py diff --git a/tests/test_paths.py b/prototype/python/tests/test_paths.py similarity index 100% rename from tests/test_paths.py rename to prototype/python/tests/test_paths.py diff --git a/tests/test_project.py b/prototype/python/tests/test_project.py similarity index 100% rename from tests/test_project.py rename to prototype/python/tests/test_project.py diff --git a/tests/test_recorder.py b/prototype/python/tests/test_recorder.py similarity index 100% rename from tests/test_recorder.py rename to prototype/python/tests/test_recorder.py diff --git a/tests/test_session.py b/prototype/python/tests/test_session.py similarity index 100% rename from tests/test_session.py rename to prototype/python/tests/test_session.py diff --git a/tth/__init__.py b/prototype/python/tth/__init__.py similarity index 100% rename from tth/__init__.py rename to prototype/python/tth/__init__.py diff --git a/tth/cli.py b/prototype/python/tth/cli.py similarity index 100% rename from tth/cli.py rename to prototype/python/tth/cli.py diff --git a/tth/database.py b/prototype/python/tth/database.py similarity index 100% rename from tth/database.py rename to prototype/python/tth/database.py diff --git a/tth/logging_config.py b/prototype/python/tth/logging_config.py similarity index 100% rename from tth/logging_config.py rename to prototype/python/tth/logging_config.py diff --git a/tth/project.py b/prototype/python/tth/project.py similarity index 100% rename from tth/project.py rename to prototype/python/tth/project.py diff --git a/tth/recorder.py b/prototype/python/tth/recorder.py similarity index 100% rename from tth/recorder.py rename to prototype/python/tth/recorder.py diff --git a/tth/schema.py b/prototype/python/tth/schema.py similarity index 100% rename from tth/schema.py rename to prototype/python/tth/schema.py diff --git a/tth/session.py b/prototype/python/tth/session.py similarity index 100% rename from tth/session.py rename to prototype/python/tth/session.py From a3594b35070c5fe5794bee7d1bc03cb6a4b7c230 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:07:56 -0600 Subject: [PATCH 002/151] feat(capture-core): scaffold + error, schema, database, paths modules (#3) --- Cargo.toml | 21 +++++ src/cli.rs | 1 + src/database.rs | 228 ++++++++++++++++++++++++++++++++++++++++++++++++ src/error.rs | 25 ++++++ src/lib.rs | 9 ++ src/logging.rs | 1 + src/main.rs | 3 + src/paths.rs | 31 +++++++ src/project.rs | 1 + src/recorder.rs | 1 + src/schema.rs | 62 +++++++++++++ src/session.rs | 1 + 12 files changed, 384 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/cli.rs create mode 100644 src/database.rs create mode 100644 src/error.rs create mode 100644 src/lib.rs create mode 100644 src/logging.rs create mode 100644 src/main.rs create mode 100644 src/paths.rs create mode 100644 src/project.rs create mode 100644 src/recorder.rs create mode 100644 src/schema.rs create mode 100644 src/session.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..a04b40d --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "thoth" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "tth" +path = "src/main.rs" + +[dependencies] +rusqlite = { version = "0.32", features = ["bundled"] } +clap = { version = "4", features = ["derive"] } +thiserror = "2" +uuid = { version = "1", features = ["v4"] } +toml = "0.8" +serde_json = "1" + +[dev-dependencies] +tempfile = "3" +assert_cmd = "2" +predicates = "3" diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/cli.rs @@ -0,0 +1 @@ + diff --git a/src/database.rs b/src/database.rs new file mode 100644 index 0000000..add2ceb --- /dev/null +++ b/src/database.rs @@ -0,0 +1,228 @@ +use crate::error::ThothError; +use crate::schema::{SCHEMA_V1, SCHEMA_V2_FTS}; +use rusqlite::Connection; +use std::path::Path; +use std::time::{SystemTime, UNIX_EPOCH}; + +pub const BUSY_TIMEOUT_MS: u32 = 2000; + +pub const MIGRATIONS: &[(i64, &str)] = &[(1, SCHEMA_V1), (2, SCHEMA_V2_FTS)]; + +pub fn connect_memory() -> Result { + let conn = Connection::open_in_memory()?; + Ok(conn) +} + +pub fn get_connection(path: Option<&Path>) -> Result { + let db_path = if let Some(p) = path { + p.to_path_buf() + } else { + crate::paths::resolve_db_path() + }; + + if let Some(parent) = db_path.parent() { + std::fs::create_dir_all(parent)?; + } + + let mut conn = Connection::open(&db_path)?; + conn.execute_batch(&format!( + "PRAGMA journal_mode=WAL; PRAGMA busy_timeout={BUSY_TIMEOUT_MS}; PRAGMA synchronous=NORMAL;" + ))?; + apply_migrations(&mut conn)?; + Ok(conn) +} + +pub fn current_version(conn: &Connection) -> i64 { + conn.query_row( + "SELECT COALESCE(MAX(version), 0) FROM schema_version", + [], + |row| row.get(0), + ) + .unwrap_or(0) +} + +pub fn fts5_available(conn: &Connection) -> bool { + conn.execute_batch("CREATE VIRTUAL TABLE temp.__fts_probe USING fts5(x); DROP TABLE IF EXISTS temp.__fts_probe;") + .is_ok() +} + +pub fn apply_migrations(conn: &mut Connection) -> Result<(), ThothError> { + let ver = current_version(conn); + + for &(version, sql) in MIGRATIONS { + if version <= ver { + continue; + } + + if version == 2 && !fts5_available(conn) { + continue; + } + + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64; + + let tx = conn.transaction()?; + tx.execute_batch(sql)?; + tx.execute( + "INSERT OR IGNORE INTO schema_version(version, applied_at) VALUES(?1, ?2)", + rusqlite::params![version, now], + )?; + tx.commit()?; + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + fn mem_conn() -> Connection { + let mut c = connect_memory().unwrap(); + apply_migrations(&mut c).unwrap(); + c + } + + #[test] + fn migration_creates_schema() { + let conn = mem_conn(); + let tables: Vec = { + let mut stmt = conn + .prepare("SELECT name FROM sqlite_master WHERE type='table'") + .unwrap(); + stmt.query_map([], |row| row.get(0)) + .unwrap() + .filter_map(|r| r.ok()) + .collect() + }; + assert!(tables.iter().any(|t| t == "commands")); + assert!(tables.iter().any(|t| t == "sessions")); + assert!(tables.iter().any(|t| t == "projects")); + assert!(tables.iter().any(|t| t == "schema_version")); + let ver = current_version(&conn); + assert!(ver >= 1); + } + + #[test] + fn migration_idempotent() { + let mut conn = mem_conn(); + let ver_before = current_version(&conn); + apply_migrations(&mut conn).unwrap(); + let ver_after = current_version(&conn); + assert_eq!(ver_before, ver_after); + } + + #[test] + fn fts_trigger_sync_insert() { + let conn = mem_conn(); + if !fts5_available(&conn) { + return; + } + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp) VALUES('git status', '/tmp', 'app', 'sid1', 1700000000)", + [], + ).unwrap(); + let row: Option = conn + .query_row( + "SELECT rowid FROM commands_fts WHERE commands_fts MATCH 'git'", + [], + |r| r.get(0), + ) + .ok(); + assert!(row.is_some()); + } + + #[test] + fn fts_trigger_sync_delete() { + let conn = mem_conn(); + if !fts5_available(&conn) { + return; + } + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp) VALUES('unique-cmd-xyz', '/tmp', 'app', 'sid2', 1700000001)", + [], + ).unwrap(); + let id: i64 = conn + .query_row( + "SELECT id FROM commands WHERE command='unique-cmd-xyz'", + [], + |r| r.get(0), + ) + .unwrap(); + conn.execute("DELETE FROM commands WHERE id=?1", rusqlite::params![id]) + .unwrap(); + let row: Option = conn + .query_row( + "SELECT rowid FROM commands_fts WHERE commands_fts MATCH '\"unique-cmd-xyz\"'", + [], + |r| r.get(0), + ) + .ok(); + assert!(row.is_none()); + } + + #[test] + fn fts_skip_does_not_record_v2() { + let mut conn = connect_memory().unwrap(); + conn.execute_batch(SCHEMA_V1).unwrap(); + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64; + conn.execute( + "INSERT OR IGNORE INTO schema_version(version, applied_at) VALUES(1, ?1)", + rusqlite::params![now], + ) + .unwrap(); + let ver = current_version(&conn); + assert_eq!(ver, 1); + } + + #[test] + fn atomicity_rollback_on_bad_migration() { + let mut conn = connect_memory().unwrap(); + let ver_before = current_version(&conn); + let bad_sql = "THIS IS NOT VALID SQL;"; + let tx = conn.transaction().unwrap(); + let result = tx.execute_batch(bad_sql); + assert!(result.is_err()); + drop(tx); + let ver_after = current_version(&conn); + assert_eq!(ver_before, ver_after); + } + + #[test] + fn execute_batch_smoke() { + let mut conn = connect_memory().unwrap(); + apply_migrations(&mut conn).unwrap(); + + let sql = " +CREATE TABLE IF NOT EXISTS audit_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + label TEXT NOT NULL +); + +CREATE TRIGGER IF NOT EXISTS commands_audit AFTER INSERT ON commands BEGIN + INSERT INTO audit_log(label) + VALUES( + CASE + WHEN new.exit_code = 0 THEN 'ok; -- not a split' + ELSE 'fail' + END + ); +END; +"; + conn.execute_batch(sql).unwrap(); + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp) VALUES('ls', '/tmp', 'p', 'sid', 1700000000)", + [], + ).unwrap(); + let label: String = conn + .query_row("SELECT label FROM audit_log", [], |r| r.get(0)) + .unwrap(); + assert_eq!(label, "ok; -- not a split"); + } +} diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..15eebf8 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,25 @@ +#[derive(thiserror::Error, Debug)] +pub enum ThothError { + #[error("sqlite: {0}")] + Sqlite(#[from] rusqlite::Error), + #[error("io: {0}")] + Io(#[from] std::io::Error), +} + +#[cfg(test)] +mod tests { + use super::ThothError; + + #[test] + fn display_sqlite_variant() { + let err = ThothError::Sqlite(rusqlite::Error::QueryReturnedNoRows); + assert!(err.to_string().starts_with("sqlite:")); + } + + #[test] + fn display_io_variant() { + let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file missing"); + let err = ThothError::Io(io_err); + assert!(err.to_string().starts_with("io:")); + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..e27e84d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,9 @@ +pub mod cli; +pub mod database; +pub mod error; +pub mod logging; +pub mod paths; +pub mod project; +pub mod recorder; +pub mod schema; +pub mod session; diff --git a/src/logging.rs b/src/logging.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/logging.rs @@ -0,0 +1 @@ + diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..44490fa --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + std::process::exit(0); +} diff --git a/src/paths.rs b/src/paths.rs new file mode 100644 index 0000000..a5b64cf --- /dev/null +++ b/src/paths.rs @@ -0,0 +1,31 @@ +use std::path::PathBuf; + +pub fn resolve_db_path() -> PathBuf { + if let Ok(v) = std::env::var("THOTH_DB") { + return PathBuf::from(v); + } + if let Ok(xdg) = std::env::var("XDG_DATA_HOME") { + return PathBuf::from(xdg).join("thoth").join("history.db"); + } + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + PathBuf::from(home) + .join(".local") + .join("share") + .join("thoth") + .join("history.db") +} + +pub fn resolve_error_log() -> PathBuf { + if let Ok(v) = std::env::var("THOTH_ERROR_LOG") { + return PathBuf::from(v); + } + if let Ok(xdg) = std::env::var("XDG_DATA_HOME") { + return PathBuf::from(xdg).join("thoth").join("error.log"); + } + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + PathBuf::from(home) + .join(".local") + .join("share") + .join("thoth") + .join("error.log") +} diff --git a/src/project.rs b/src/project.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/project.rs @@ -0,0 +1 @@ + diff --git a/src/recorder.rs b/src/recorder.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/recorder.rs @@ -0,0 +1 @@ + diff --git a/src/schema.rs b/src/schema.rs new file mode 100644 index 0000000..225e86a --- /dev/null +++ b/src/schema.rs @@ -0,0 +1,62 @@ +pub const SCHEMA_V1: &str = " +CREATE TABLE IF NOT EXISTS schema_version ( + version INTEGER PRIMARY KEY, + applied_at INTEGER NOT NULL +); + +CREATE TABLE IF NOT EXISTS commands ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + command TEXT NOT NULL, + directory TEXT NOT NULL, + project TEXT NOT NULL, + session_id TEXT NOT NULL, + timestamp INTEGER NOT NULL, + exit_code INTEGER NOT NULL DEFAULT 0, + duration_ms INTEGER NOT NULL DEFAULT 0, + tags TEXT NOT NULL DEFAULT '[]' +); + +CREATE INDEX IF NOT EXISTS idx_commands_session ON commands(session_id); +CREATE INDEX IF NOT EXISTS idx_commands_timestamp ON commands(timestamp); + +CREATE TABLE IF NOT EXISTS sessions ( + session_id TEXT PRIMARY KEY, + project TEXT NOT NULL, + started_at INTEGER NOT NULL, + ended_at INTEGER NOT NULL, + command_count INTEGER NOT NULL DEFAULT 0 +); + +CREATE TABLE IF NOT EXISTS projects ( + path TEXT PRIMARY KEY, + name TEXT NOT NULL, + last_seen INTEGER NOT NULL, + command_count INTEGER NOT NULL DEFAULT 0 +); +"; + +pub const SCHEMA_V2_FTS: &str = " +CREATE VIRTUAL TABLE IF NOT EXISTS commands_fts + USING fts5(command, content='commands', content_rowid='id'); + +CREATE TRIGGER IF NOT EXISTS commands_ai AFTER INSERT ON commands BEGIN + INSERT INTO commands_fts(rowid, command) VALUES (new.id, new.command); +END; + +CREATE TRIGGER IF NOT EXISTS commands_ad AFTER DELETE ON commands BEGIN + INSERT INTO commands_fts(commands_fts, rowid, command) VALUES ('delete', old.id, old.command); +END; +"; + +#[cfg(test)] +mod tests { + #[test] + fn v1_contains_commands_table() { + assert!(super::SCHEMA_V1.contains("CREATE TABLE IF NOT EXISTS commands")); + } + + #[test] + fn v2_contains_fts() { + assert!(super::SCHEMA_V2_FTS.contains("commands_fts")); + } +} diff --git a/src/session.rs b/src/session.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/session.rs @@ -0,0 +1 @@ + From 10b02c413573fcd6143485986380ab685d80bc84 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:12:36 -0600 Subject: [PATCH 003/151] feat(capture-core): paths, project inference, session grouping (#3) --- src/paths.rs | 69 ++++++++++ src/project.rs | 335 +++++++++++++++++++++++++++++++++++++++++++++++++ src/session.rs | 92 ++++++++++++++ 3 files changed, 496 insertions(+) diff --git a/src/paths.rs b/src/paths.rs index a5b64cf..c6de32f 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -29,3 +29,72 @@ pub fn resolve_error_log() -> PathBuf { .join("thoth") .join("error.log") } + +#[cfg(test)] +mod tests { + use super::*; + use std::path::PathBuf; + + #[test] + fn thoth_db_env_wins() { + std::env::set_var("THOTH_DB_TEST_01", "/tmp/x_01.db"); + let path = { + if let Ok(v) = std::env::var("THOTH_DB_TEST_01") { + PathBuf::from(v) + } else { + panic!("var not set") + } + }; + assert_eq!(path, PathBuf::from("/tmp/x_01.db")); + std::env::remove_var("THOTH_DB_TEST_01"); + } + + #[test] + fn xdg_fallback() { + std::env::remove_var("THOTH_DB"); + std::env::set_var("THOTH_DB_XDG_TEST", "/tmp/xdg_02"); + let path = PathBuf::from(std::env::var("THOTH_DB_XDG_TEST").unwrap()) + .join("thoth") + .join("history.db"); + assert_eq!(path, PathBuf::from("/tmp/xdg_02/thoth/history.db")); + std::env::remove_var("THOTH_DB_XDG_TEST"); + } + + #[test] + fn home_fallback() { + let home = "/tmp/h_03"; + let path = PathBuf::from(home) + .join(".local") + .join("share") + .join("thoth") + .join("history.db"); + assert_eq!( + path, + PathBuf::from("/tmp/h_03/.local/share/thoth/history.db") + ); + } + + #[test] + fn error_log_env_wins() { + std::env::set_var("THOTH_ERROR_LOG_TEST_04", "/tmp/err_04.log"); + let path = PathBuf::from(std::env::var("THOTH_ERROR_LOG_TEST_04").unwrap()); + assert_eq!(path, PathBuf::from("/tmp/err_04.log")); + std::env::remove_var("THOTH_ERROR_LOG_TEST_04"); + } + + #[test] + fn resolve_db_path_uses_thoth_db() { + std::env::set_var("THOTH_DB", "/tmp/test_path_05.db"); + let result = resolve_db_path(); + std::env::remove_var("THOTH_DB"); + assert_eq!(result, PathBuf::from("/tmp/test_path_05.db")); + } + + #[test] + fn resolve_error_log_uses_thoth_error_log() { + std::env::set_var("THOTH_ERROR_LOG", "/tmp/test_error_06.log"); + let result = resolve_error_log(); + std::env::remove_var("THOTH_ERROR_LOG"); + assert_eq!(result, PathBuf::from("/tmp/test_error_06.log")); + } +} diff --git a/src/project.rs b/src/project.rs index 8b13789..ce93701 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1 +1,336 @@ +use crate::error::ThothError; +use rusqlite::Connection; +use std::path::{Path, PathBuf}; +use std::time::{SystemTime, UNIX_EPOCH}; +pub const MAX_WALK_DEPTH: usize = 20; +const CACHE_TTL_SECONDS: i64 = 86400; + +pub fn infer_project(directory: &str, conn: &Connection) -> Result { + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64; + let cutoff = now - CACHE_TTL_SECONDS; + + let cached: Option = conn + .query_row( + "SELECT name FROM projects WHERE path=?1 AND last_seen > ?2", + rusqlite::params![directory, cutoff], + |row| row.get(0), + ) + .ok(); + + if let Some(name) = cached { + return Ok(name); + } + + Ok(walk_markers(directory)) +} + +pub fn walk_markers(cwd: &str) -> String { + let mut current = PathBuf::from(cwd); + if let Ok(resolved) = current.canonicalize() { + current = resolved; + } + + for _ in 0..MAX_WALK_DEPTH { + if let Some(name) = check_markers(¤t) { + return name; + } + let parent = current.parent().map(|p| p.to_path_buf()); + match parent { + Some(p) if p != current => current = p, + _ => break, + } + } + String::from("ungrouped") +} + +type MarkerFn = fn(&Path) -> Option; + +fn check_markers(directory: &Path) -> Option { + let strategies: &[(&str, MarkerFn)] = &[ + (".git", extract_dirname), + ("package.json", extract_package_json), + ("pyproject.toml", extract_pyproject), + ("Cargo.toml", extract_cargo), + ("go.mod", extract_gomod), + ("docker-compose.yml", extract_dirname), + ("compose.yml", extract_dirname), + ]; + + for &(filename, extractor) in strategies { + let candidate = directory.join(filename); + let exists = if filename == ".git" { + candidate.is_dir() + } else { + candidate.exists() + }; + if exists { + if let Some(name) = extractor(&candidate) { + return Some(name); + } + } + } + None +} + +fn extract_dirname(p: &Path) -> Option { + p.parent()?.file_name()?.to_str().map(String::from) +} + +fn extract_package_json(p: &Path) -> Option { + let text = std::fs::read_to_string(p).ok()?; + let val: serde_json::Value = serde_json::from_str(&text).ok()?; + val.get("name")?.as_str().map(String::from) +} + +fn extract_pyproject(p: &Path) -> Option { + let text = std::fs::read_to_string(p).ok()?; + let table: toml::Table = text.parse().ok()?; + if let Some(name) = table + .get("project") + .and_then(|v| v.get("name")) + .and_then(|v| v.as_str()) + { + return Some(name.to_string()); + } + table + .get("tool") + .and_then(|v| v.get("poetry")) + .and_then(|v| v.get("name")) + .and_then(|v| v.as_str()) + .map(String::from) +} + +fn extract_cargo(p: &Path) -> Option { + let text = std::fs::read_to_string(p).ok()?; + let table: toml::Table = text.parse().ok()?; + table + .get("package") + .and_then(|v| v.get("name")) + .and_then(|v| v.as_str()) + .map(String::from) +} + +fn extract_gomod(p: &Path) -> Option { + let text = std::fs::read_to_string(p).ok()?; + for line in text.lines() { + let line = line.trim(); + if let Some(rest) = line.strip_prefix("module ") { + let module_path = rest.trim().trim_end_matches('/'); + return module_path + .split('/') + .next_back() + .filter(|s| !s.is_empty()) + .map(String::from); + } + } + None +} + +#[cfg(test)] +mod tests { + use super::*; + use rusqlite::Connection; + use tempfile::TempDir; + + fn mem_conn_with_schema() -> Connection { + let mut conn = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut conn).unwrap(); + conn + } + + #[test] + fn git_marker_returns_dirname() { + let dir = TempDir::new().unwrap(); + let app = dir.path().join("my-app"); + std::fs::create_dir_all(app.join(".git")).unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(app.to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "my-app"); + } + + #[test] + fn package_json_name() { + let dir = TempDir::new().unwrap(); + std::fs::write(dir.path().join("package.json"), r#"{"name":"frontend"}"#).unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(dir.path().to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "frontend"); + } + + #[test] + fn pyproject_project_name() { + let dir = TempDir::new().unwrap(); + std::fs::write( + dir.path().join("pyproject.toml"), + "[project]\nname = \"mylib\"\n", + ) + .unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(dir.path().to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "mylib"); + } + + #[test] + fn pyproject_poetry_name() { + let dir = TempDir::new().unwrap(); + std::fs::write( + dir.path().join("pyproject.toml"), + "[tool.poetry]\nname = \"poem\"\n", + ) + .unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(dir.path().to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "poem"); + } + + #[test] + fn cargo_toml_name() { + let dir = TempDir::new().unwrap(); + std::fs::write( + dir.path().join("Cargo.toml"), + "[package]\nname = \"crateX\"\nversion = \"0.1.0\"\nedition = \"2021\"\n", + ) + .unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(dir.path().to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "crateX"); + } + + #[test] + fn go_mod_last_segment() { + let dir = TempDir::new().unwrap(); + std::fs::write( + dir.path().join("go.mod"), + "module github.com/user/mymod\n\ngo 1.21\n", + ) + .unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(dir.path().to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "mymod"); + } + + #[test] + fn compose_yml_dirname() { + let dir = TempDir::new().unwrap(); + let app = dir.path().join("myservice"); + std::fs::create_dir_all(&app).unwrap(); + std::fs::write(app.join("compose.yml"), "version: '3'\n").unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(app.to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "myservice"); + } + + #[test] + fn fallback_ungrouped() { + let dir = TempDir::new().unwrap(); + let deep = dir.path().join("a").join("b").join("c"); + std::fs::create_dir_all(&deep).unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(deep.to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "ungrouped"); + } + + #[test] + fn depth_cap_20() { + let dir = TempDir::new().unwrap(); + let mut deep = dir.path().to_path_buf(); + for i in 0..25 { + deep = deep.join(format!("d{i}")); + } + std::fs::create_dir_all(&deep).unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(deep.to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "ungrouped"); + } + + #[test] + fn cache_hit_no_walk() { + let dir = TempDir::new().unwrap(); + let app = dir.path().join("cached-app"); + std::fs::create_dir_all(app.join(".git")).unwrap(); + let conn = mem_conn_with_schema(); + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() as i64; + conn.execute( + "INSERT INTO projects(path, name, last_seen, command_count) VALUES(?1, 'cached-name', ?2, 0)", + rusqlite::params![app.to_str().unwrap(), now - 3600], + ) + .unwrap(); + let name = infer_project(app.to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "cached-name"); + } + + #[test] + fn stale_cache_walks() { + let dir = TempDir::new().unwrap(); + let app = dir.path().join("stale-app"); + std::fs::create_dir_all(app.join(".git")).unwrap(); + let conn = mem_conn_with_schema(); + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() as i64; + conn.execute( + "INSERT INTO projects(path, name, last_seen, command_count) VALUES(?1, 'old-name', ?2, 0)", + rusqlite::params![app.to_str().unwrap(), now - 90000], + ) + .unwrap(); + let name = infer_project(app.to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "stale-app"); + } + + #[test] + fn cache_refresh_preserves_command_count() { + let dir = TempDir::new().unwrap(); + let app = dir.path().join("count-app"); + std::fs::create_dir_all(&app).unwrap(); + let conn = mem_conn_with_schema(); + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() as i64; + conn.execute( + "INSERT INTO projects(path, name, last_seen, command_count) VALUES(?1, 'old-name', ?2, 42)", + rusqlite::params![app.to_str().unwrap(), now - 90000], + ) + .unwrap(); + infer_project(app.to_str().unwrap(), &conn).unwrap(); + let count: i64 = conn + .query_row( + "SELECT command_count FROM projects WHERE path=?1", + rusqlite::params![app.to_str().unwrap()], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(count, 42); + } + + #[test] + fn malformed_toml_continues() { + let dir = TempDir::new().unwrap(); + std::fs::write(dir.path().join("pyproject.toml"), "NOT VALID TOML {{{{").unwrap(); + let conn = mem_conn_with_schema(); + let result = infer_project(dir.path().to_str().unwrap(), &conn); + assert!(result.is_ok()); + } + + #[test] + fn package_json_priority_over_pyproject() { + let dir = TempDir::new().unwrap(); + std::fs::write(dir.path().join("package.json"), r#"{"name":"frontend"}"#).unwrap(); + std::fs::write( + dir.path().join("pyproject.toml"), + "[project]\nname = \"backend\"\n", + ) + .unwrap(); + let conn = mem_conn_with_schema(); + let name = infer_project(dir.path().to_str().unwrap(), &conn).unwrap(); + assert_eq!(name, "frontend"); + } +} diff --git a/src/session.rs b/src/session.rs index 8b13789..669dac9 100644 --- a/src/session.rs +++ b/src/session.rs @@ -1 +1,93 @@ +use crate::error::ThothError; +use rusqlite::Connection; +pub const SESSION_GAP_MINUTES: i64 = 30; +const GAP_SECONDS: i64 = SESSION_GAP_MINUTES * 60; + +pub fn get_or_create( + project: &str, + timestamp: i64, + conn: &Connection, +) -> Result { + let row: Option<(String, String, i64)> = conn + .query_row( + "SELECT session_id, project, ended_at FROM sessions ORDER BY ended_at DESC LIMIT 1", + [], + |r| Ok((r.get(0)?, r.get(1)?, r.get(2)?)), + ) + .ok(); + + let create_new = match &row { + None => true, + Some((_, proj, ended_at)) => (timestamp - ended_at) > GAP_SECONDS || proj != project, + }; + + if create_new { + let sid = uuid::Uuid::new_v4().to_string(); + conn.execute( + "INSERT INTO sessions(session_id, project, started_at, ended_at, command_count) VALUES(?1, ?2, ?3, ?4, 0)", + rusqlite::params![sid, project, timestamp, timestamp], + )?; + Ok(sid) + } else { + let sid = row.unwrap().0; + conn.execute( + "UPDATE sessions SET ended_at=?1 WHERE session_id=?2", + rusqlite::params![timestamp, sid], + )?; + Ok(sid) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn mem_conn() -> Connection { + let mut c = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut c).unwrap(); + c + } + + #[test] + fn first_ever_creates_session() { + let conn = mem_conn(); + let t0 = 1700000000i64; + let sid = get_or_create("app", t0, &conn).unwrap(); + assert!(!sid.is_empty()); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM sessions", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 1); + } + + #[test] + fn reuse_within_gap() { + let conn = mem_conn(); + let t0 = 1700000000i64; + let sid1 = get_or_create("app", t0, &conn).unwrap(); + let t1 = t0 + 600; + let sid2 = get_or_create("app", t1, &conn).unwrap(); + assert_eq!(sid1, sid2); + } + + #[test] + fn new_session_on_gap() { + let conn = mem_conn(); + let t0 = 1700000000i64; + let sid1 = get_or_create("app", t0, &conn).unwrap(); + let t1 = t0 + 31 * 60; + let sid2 = get_or_create("app", t1, &conn).unwrap(); + assert_ne!(sid1, sid2); + } + + #[test] + fn new_session_on_project_change() { + let conn = mem_conn(); + let t0 = 1700000000i64; + let sid1 = get_or_create("app", t0, &conn).unwrap(); + let t1 = t0 + 300; + let sid2 = get_or_create("other-lib", t1, &conn).unwrap(); + assert_ne!(sid1, sid2); + } +} From edafd5306f2f41df934c0d63e35fded29ed5d8ff Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:15:18 -0600 Subject: [PATCH 004/151] feat(capture-core): recorder, cli, logging, integration tests (#3) --- src/cli.rs | 100 ++++++++++++++++++ src/logging.rs | 83 +++++++++++++++ src/main.rs | 1 + src/recorder.rs | 266 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/cli.rs | 117 +++++++++++++++++++++ 5 files changed, 567 insertions(+) create mode 100644 tests/cli.rs diff --git a/src/cli.rs b/src/cli.rs index 8b13789..83a63d4 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1 +1,101 @@ +use clap::{Parser, Subcommand}; +#[derive(Parser)] +#[command(name = "tth")] +pub struct Cli { + #[command(subcommand)] + pub cmd: Cmd, +} + +#[derive(Subcommand)] +pub enum Cmd { + Record(RecordArgs), +} + +#[derive(clap::Args, Debug, Clone)] +pub struct RecordArgs { + #[arg(long)] + pub cmd: String, + #[arg(long)] + pub dir: Option, + #[arg(long = "exit", default_value_t = 0)] + pub exit_code: i64, + #[arg(long, default_value_t = 0)] + pub duration: i64, + #[arg(long)] + pub timestamp: Option, + #[arg(long, default_value = "[]")] + pub tags: String, +} + +pub fn run() -> Result<(), crate::error::ThothError> { + use clap::Parser; + let cli = Cli::parse(); + let Cmd::Record(mut args) = cli.cmd; + + crate::logging::setup(crate::paths::resolve_error_log()); + + if args.dir.is_none() { + args.dir = std::env::current_dir() + .ok() + .map(|p| p.to_string_lossy().to_string()); + } + if args.timestamp.is_none() { + args.timestamp = Some( + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64, + ); + } + + match crate::database::get_connection(None) { + Ok(mut conn) => crate::recorder::record(&args, &mut conn), + Err(e) => crate::logging::log_error(&e.to_string()), + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn default_tags_is_empty_array() { + let args = RecordArgs { + cmd: String::from("ls"), + dir: None, + exit_code: 0, + duration: 0, + timestamp: None, + tags: String::from("[]"), + }; + assert_eq!(args.tags, "[]"); + } + + #[test] + fn default_dir_is_cwd() { + let cwd = std::env::current_dir() + .unwrap() + .to_string_lossy() + .to_string(); + let dir = std::env::current_dir() + .ok() + .map(|p| p.to_string_lossy().to_string()) + .unwrap_or_default(); + assert_eq!(dir, cwd); + } + + #[test] + fn default_timestamp_is_now() { + let now = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs() as i64; + let ts = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs() as i64; + assert!((ts - now).abs() < 2); + } +} diff --git a/src/logging.rs b/src/logging.rs index 8b13789..0151ffd 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -1 +1,84 @@ +use std::path::PathBuf; +use std::sync::Mutex; +pub const SIZE_CAP_BYTES: u64 = 1_048_576; + +static LOG_PATH: Mutex> = Mutex::new(None); + +pub fn setup(path: PathBuf) { + let mut guard = LOG_PATH.lock().unwrap_or_else(|e| e.into_inner()); + *guard = Some(path); +} + +pub fn log_error(msg: &str) { + let guard = LOG_PATH.lock().unwrap_or_else(|e| e.into_inner()); + let path = match &*guard { + Some(p) => p.clone(), + None => crate::paths::resolve_error_log(), + }; + drop(guard); + let _ = write_with_rotation(&path, msg); +} + +fn write_with_rotation(path: &PathBuf, msg: &str) -> std::io::Result<()> { + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent)?; + } + + if let Ok(meta) = std::fs::metadata(path) { + if meta.len() > SIZE_CAP_BYTES { + let backup = path.with_extension("log.1"); + let _ = std::fs::rename(path, &backup); + } + } + + use std::io::Write; + let mut file = std::fs::OpenOptions::new() + .create(true) + .append(true) + .open(path)?; + writeln!(file, "{msg}")?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + #[test] + fn writes_to_file_not_stderr() { + let dir = TempDir::new().unwrap(); + let log_path = dir.path().join("error.log"); + setup(log_path.clone()); + log_error("boom"); + let content = std::fs::read_to_string(&log_path).unwrap(); + assert!(content.contains("boom")); + } + + #[test] + fn rotation_on_size_cap() { + let dir = TempDir::new().unwrap(); + let log_path = dir.path().join("error.log"); + let big = vec![b'x'; SIZE_CAP_BYTES as usize + 1]; + std::fs::write(&log_path, &big).unwrap(); + write_with_rotation(&log_path, "after rotation").unwrap(); + let backup = log_path.with_extension("log.1"); + assert!(backup.exists(), "backup file should exist after rotation"); + let new_content = std::fs::read_to_string(&log_path).unwrap(); + assert!(new_content.len() < SIZE_CAP_BYTES as usize); + } + + #[test] + fn rotation_overwrites_old_backup() { + let dir = TempDir::new().unwrap(); + let log_path = dir.path().join("error.log"); + let backup = log_path.with_extension("log.1"); + std::fs::write(&backup, "old backup").unwrap(); + let big = vec![b'x'; SIZE_CAP_BYTES as usize + 1]; + std::fs::write(&log_path, &big).unwrap(); + write_with_rotation(&log_path, "trigger rotation").unwrap(); + let backup_content = std::fs::read_to_string(&backup).unwrap(); + assert_ne!(backup_content, "old backup", "backup should be overwritten"); + } +} diff --git a/src/main.rs b/src/main.rs index 44490fa..9276ec7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ fn main() { + let _ = thoth::cli::run(); std::process::exit(0); } diff --git a/src/recorder.rs b/src/recorder.rs index 8b13789..2ef7c79 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -1 +1,267 @@ +use crate::cli::RecordArgs; +use crate::error::ThothError; +use crate::logging::log_error; +use crate::project::infer_project; +use crate::session::get_or_create; +use rusqlite::Connection; +pub fn normalize_tags(raw: &str) -> String { + if raw.is_empty() { + return String::from("[]"); + } + match serde_json::from_str::(raw) { + Ok(serde_json::Value::Array(arr)) => { + if arr.iter().all(|v| v.is_string()) { + raw.to_string() + } else { + String::from("[]") + } + } + _ => String::from("[]"), + } +} + +pub fn record_inner(args: &RecordArgs, conn: &mut Connection) -> Result<(), ThothError> { + let tags = normalize_tags(&args.tags); + let directory = args.dir.clone().unwrap_or_else(|| { + std::env::current_dir() + .unwrap_or_default() + .to_string_lossy() + .to_string() + }); + let timestamp = args.timestamp.unwrap_or_else(|| { + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64 + }); + + let tx = conn.transaction()?; + + let project = infer_project(&directory, &tx)?; + let sid = get_or_create(&project, timestamp, &tx)?; + + tx.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ + VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)", + rusqlite::params![ + args.cmd, + directory, + project, + sid, + timestamp, + args.exit_code, + args.duration, + tags + ], + )?; + + tx.execute( + "INSERT INTO projects(path, name, last_seen, command_count) VALUES(?1, ?2, ?3, 1) \ + ON CONFLICT(path) DO UPDATE SET name=excluded.name, last_seen=excluded.last_seen, command_count=command_count+1", + rusqlite::params![directory, project, timestamp], + )?; + + tx.execute( + "UPDATE sessions SET ended_at=?1, command_count=command_count+1 WHERE session_id=?2", + rusqlite::params![timestamp, sid], + )?; + + tx.commit()?; + Ok(()) +} + +pub fn record(args: &RecordArgs, conn: &mut Connection) { + match record_inner(args, conn) { + Ok(()) => {} + Err(ThothError::Sqlite(ref e)) + if matches!( + e, + rusqlite::Error::SqliteFailure( + rusqlite::ffi::Error { + code: rusqlite::ErrorCode::DatabaseBusy, + .. + }, + _ + ) | rusqlite::Error::SqliteFailure( + rusqlite::ffi::Error { + code: rusqlite::ErrorCode::DatabaseLocked, + .. + }, + _ + ) + ) => + { + match record_inner(args, conn) { + Ok(()) => {} + Err(e) => log_error(&e.to_string()), + } + } + Err(e) => log_error(&e.to_string()), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::cli::RecordArgs; + use rusqlite::Connection; + use tempfile::TempDir; + + fn mem_conn() -> Connection { + let mut c = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut c).unwrap(); + c + } + + fn disk_conn(dir: &TempDir) -> Connection { + let path = dir.path().join("history.db"); + crate::database::get_connection(Some(&path)).unwrap() + } + + fn base_args() -> RecordArgs { + RecordArgs { + cmd: String::from("echo hi"), + dir: Some(String::from("/tmp")), + exit_code: 0, + duration: 5, + timestamp: Some(1700000000), + tags: String::from("[]"), + } + } + + #[test] + fn normalize_tags_valid() { + assert_eq!(normalize_tags(r#"["a","b"]"#), r#"["a","b"]"#); + } + + #[test] + fn normalize_tags_invalid() { + assert_eq!(normalize_tags("not json"), "[]"); + } + + #[test] + fn normalize_tags_not_array() { + assert_eq!(normalize_tags(r#"{"k":"v"}"#), "[]"); + } + + #[test] + fn normalize_tags_array_not_strings() { + assert_eq!(normalize_tags("[1,2]"), "[]"); + } + + #[test] + fn successful_record_inserts_row() { + let mut conn = mem_conn(); + let args = base_args(); + record_inner(&args, &mut conn).unwrap(); + let count: i64 = conn + .query_row( + "SELECT COUNT(*) FROM commands WHERE command='echo hi'", + [], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(count, 1); + } + + #[test] + fn command_count_increments() { + let mut conn = mem_conn(); + let dir = "/tmp/count-test"; + let now = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs() as i64; + conn.execute( + "INSERT INTO projects(path, name, last_seen, command_count) VALUES(?1, 'myapp', ?2, 5)", + rusqlite::params![dir, now], + ) + .unwrap(); + let args = RecordArgs { + cmd: String::from("ls"), + dir: Some(dir.to_string()), + exit_code: 0, + duration: 1, + timestamp: Some(1700000000), + tags: String::from("[]"), + }; + record_inner(&args, &mut conn).unwrap(); + let count: i64 = conn + .query_row( + "SELECT command_count FROM projects WHERE path=?1", + rusqlite::params![dir], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(count, 6); + } + + #[test] + fn session_updated_after_record() { + let mut conn = mem_conn(); + let args = base_args(); + record_inner(&args, &mut conn).unwrap(); + let (ended_at, count): (i64, i64) = conn + .query_row("SELECT ended_at, command_count FROM sessions", [], |r| { + Ok((r.get(0)?, r.get(1)?)) + }) + .unwrap(); + assert_eq!(ended_at, 1700000000); + assert!(count >= 1); + } + + #[test] + fn atomicity_no_orphan_session() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + let mut conn = crate::database::get_connection(Some(&db_path)).unwrap(); + + let conn2 = Connection::open(&db_path).unwrap(); + conn2.execute_batch("PRAGMA busy_timeout=0;").unwrap(); + conn2.execute("BEGIN IMMEDIATE", []).unwrap(); + + let args = base_args(); + let result = record_inner(&args, &mut conn); + + drop(conn2); + + assert!(result.is_err()); + + let commands: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + let sessions: i64 = conn + .query_row("SELECT COUNT(*) FROM sessions", [], |r| r.get(0)) + .unwrap(); + assert_eq!(commands, 0, "orphan command found"); + assert_eq!(sessions, 0, "orphan session found"); + } + + #[test] + fn locked_db_retry_succeeds() { + let dir = TempDir::new().unwrap(); + let mut conn = disk_conn(&dir); + let args = base_args(); + record(&args, &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 1); + } + + #[test] + fn record_never_propagates_error() { + let dir = TempDir::new().unwrap(); + let mut conn = disk_conn(&dir); + let bad_args = RecordArgs { + cmd: String::from("cmd"), + dir: Some(String::from("/tmp")), + exit_code: 0, + duration: 0, + timestamp: Some(1700000000), + tags: String::from("not valid json"), + }; + record(&bad_args, &mut conn); + } +} diff --git a/tests/cli.rs b/tests/cli.rs new file mode 100644 index 0000000..19fffe6 --- /dev/null +++ b/tests/cli.rs @@ -0,0 +1,117 @@ +use assert_cmd::Command; +use rusqlite::Connection; +use tempfile::TempDir; + +fn tth() -> Command { + Command::cargo_bin("tth").unwrap() +} + +#[test] +fn cli_exits_0_on_success() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args(["record", "--cmd", "ls"]) + .assert() + .code(0); +} + +#[test] +fn cli_exits_0_on_unwritable_db() { + let dir = TempDir::new().unwrap(); + let ro_dir = dir.path().join("readonly"); + std::fs::create_dir_all(&ro_dir).unwrap(); + let mut perms = std::fs::metadata(&ro_dir).unwrap().permissions(); + use std::os::unix::fs::PermissionsExt; + perms.set_mode(0o444); + std::fs::set_permissions(&ro_dir, perms).unwrap(); + tth() + .env("THOTH_DB", ro_dir.join("history.db").to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args(["record", "--cmd", "ls"]) + .assert() + .code(0); +} + +#[test] +fn cli_all_six_flags_persisted() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args([ + "record", + "--cmd", + "echo hi", + "--dir", + "/tmp", + "--exit", + "42", + "--duration", + "100", + "--timestamp", + "1700000000", + "--tags", + r#"["test"]"#, + ]) + .assert() + .code(0); + + let conn = Connection::open(&db_path).unwrap(); + let (cmd, dir_val, exit_code, duration, ts, tags): (String, String, i64, i64, i64, String) = + conn.query_row( + "SELECT command, directory, exit_code, duration_ms, timestamp, tags FROM commands", + [], + |r| { + Ok(( + r.get(0)?, + r.get(1)?, + r.get(2)?, + r.get(3)?, + r.get(4)?, + r.get(5)?, + )) + }, + ) + .unwrap(); + assert_eq!(cmd, "echo hi"); + assert_eq!(dir_val, "/tmp"); + assert_eq!(exit_code, 42); + assert_eq!(duration, 100); + assert_eq!(ts, 1700000000); + assert_eq!(tags, r#"["test"]"#); +} + +#[test] +fn cli_default_dir_is_cwd() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + let cwd = std::env::current_dir().unwrap(); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args(["record", "--cmd", "pwd"]) + .assert() + .code(0); + + let conn = Connection::open(&db_path).unwrap(); + let directory: String = conn + .query_row("SELECT directory FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(directory, cwd.to_string_lossy().as_ref()); +} From 9b051f5a655242af781d20e416797762d4c2ffdd Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:16:20 -0600 Subject: [PATCH 005/151] chore: add Cargo.lock and update .gitignore for Rust target dir (#3) --- .gitignore | 5 + Cargo.lock | 837 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 842 insertions(+) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index e384093..e1b3ab3 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,8 @@ logs/ # Hatch .hatch/ + + +# Added by cargo + +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..98c87a8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,837 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + +[[package]] +name = "assert_cmd" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aa3a22042e45de04255c7bf3626e239f450200fd0493c1e382263544b20aea6" +dependencies = [ + "anstyle", + "bstr", + "libc", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "predicates" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" +dependencies = [ + "anstyle", + "difflib", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" + +[[package]] +name = "predicates-tree" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "regex" +version = "1.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rusqlite" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +dependencies = [ + "bitflags", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thoth" +version = "0.1.0" +dependencies = [ + "assert_cmd", + "clap", + "predicates", + "rusqlite", + "serde_json", + "tempfile", + "thiserror", + "toml", + "uuid", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +dependencies = [ + "getrandom", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "zerocopy" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" From a10b6e627252fa0a3ca90f0993aef697c9a03279 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:25:15 -0600 Subject: [PATCH 006/151] fix(database): remove unused TempDir import and mut on conn in tests Resolves cargo clippy --tests -- -D warnings failures (C1). Refs #3 --- src/database.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/database.rs b/src/database.rs index add2ceb..beaa0b4 100644 --- a/src/database.rs +++ b/src/database.rs @@ -78,7 +78,6 @@ pub fn apply_migrations(conn: &mut Connection) -> Result<(), ThothError> { #[cfg(test)] mod tests { use super::*; - use tempfile::TempDir; fn mem_conn() -> Connection { let mut c = connect_memory().unwrap(); @@ -166,7 +165,7 @@ mod tests { #[test] fn fts_skip_does_not_record_v2() { - let mut conn = connect_memory().unwrap(); + let conn = connect_memory().unwrap(); conn.execute_batch(SCHEMA_V1).unwrap(); let now = SystemTime::now() .duration_since(UNIX_EPOCH) From 17ac65077432fc7d0b394229b73b1e408b398849 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:25:41 -0600 Subject: [PATCH 007/151] refactor(paths): extract pure resolver fns, replace tautological tests with real coverage Adds db_path_from() and error_log_from() pure helpers; public resolvers delegate to them. Tests now cover THOTH_DB override, XDG fallback, and HOME fallback through the pure fns deterministically without env mutation races. Two thin wiring tests confirm the public APIs read the correct env vars (C2). Refs #3 --- src/paths.rs | 133 ++++++++++++++++++++++++++++----------------------- 1 file changed, 74 insertions(+), 59 deletions(-) diff --git a/src/paths.rs b/src/paths.rs index c6de32f..33ccc86 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -1,33 +1,45 @@ -use std::path::PathBuf; +use std::path::{Path, PathBuf}; -pub fn resolve_db_path() -> PathBuf { - if let Ok(v) = std::env::var("THOTH_DB") { +fn db_path_from(thoth_db: Option<&str>, xdg: Option<&str>, home: &Path) -> PathBuf { + if let Some(v) = thoth_db { return PathBuf::from(v); } - if let Ok(xdg) = std::env::var("XDG_DATA_HOME") { - return PathBuf::from(xdg).join("thoth").join("history.db"); + if let Some(x) = xdg { + return PathBuf::from(x).join("thoth").join("history.db"); } - let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); - PathBuf::from(home) - .join(".local") - .join("share") - .join("thoth") - .join("history.db") + home.join(".local").join("share").join("thoth").join("history.db") } -pub fn resolve_error_log() -> PathBuf { - if let Ok(v) = std::env::var("THOTH_ERROR_LOG") { +fn error_log_from(thoth_log: Option<&str>, xdg: Option<&str>, home: &Path) -> PathBuf { + if let Some(v) = thoth_log { return PathBuf::from(v); } - if let Ok(xdg) = std::env::var("XDG_DATA_HOME") { - return PathBuf::from(xdg).join("thoth").join("error.log"); + if let Some(x) = xdg { + return PathBuf::from(x).join("thoth").join("error.log"); } + home.join(".local").join("share").join("thoth").join("error.log") +} + +pub fn resolve_db_path() -> PathBuf { + let thoth_db = std::env::var("THOTH_DB").ok(); + let xdg = std::env::var("XDG_DATA_HOME").ok(); let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); - PathBuf::from(home) - .join(".local") - .join("share") - .join("thoth") - .join("error.log") + db_path_from( + thoth_db.as_deref(), + xdg.as_deref(), + Path::new(&home), + ) +} + +pub fn resolve_error_log() -> PathBuf { + let thoth_log = std::env::var("THOTH_ERROR_LOG").ok(); + let xdg = std::env::var("XDG_DATA_HOME").ok(); + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + error_log_from( + thoth_log.as_deref(), + xdg.as_deref(), + Path::new(&home), + ) } #[cfg(test)] @@ -36,65 +48,68 @@ mod tests { use std::path::PathBuf; #[test] - fn thoth_db_env_wins() { - std::env::set_var("THOTH_DB_TEST_01", "/tmp/x_01.db"); - let path = { - if let Ok(v) = std::env::var("THOTH_DB_TEST_01") { - PathBuf::from(v) - } else { - panic!("var not set") - } - }; - assert_eq!(path, PathBuf::from("/tmp/x_01.db")); - std::env::remove_var("THOTH_DB_TEST_01"); + fn db_override_wins() { + let result = db_path_from( + Some("/custom/history.db"), + Some("/xdg"), + Path::new("/home/user"), + ); + assert_eq!(result, PathBuf::from("/custom/history.db")); } #[test] - fn xdg_fallback() { - std::env::remove_var("THOTH_DB"); - std::env::set_var("THOTH_DB_XDG_TEST", "/tmp/xdg_02"); - let path = PathBuf::from(std::env::var("THOTH_DB_XDG_TEST").unwrap()) - .join("thoth") - .join("history.db"); - assert_eq!(path, PathBuf::from("/tmp/xdg_02/thoth/history.db")); - std::env::remove_var("THOTH_DB_XDG_TEST"); + fn db_xdg_fallback() { + let result = db_path_from(None, Some("/xdg/data"), Path::new("/home/user")); + assert_eq!(result, PathBuf::from("/xdg/data/thoth/history.db")); } #[test] - fn home_fallback() { - let home = "/tmp/h_03"; - let path = PathBuf::from(home) - .join(".local") - .join("share") - .join("thoth") - .join("history.db"); + fn db_home_fallback() { + let result = db_path_from(None, None, Path::new("/home/user")); assert_eq!( - path, - PathBuf::from("/tmp/h_03/.local/share/thoth/history.db") + result, + PathBuf::from("/home/user/.local/share/thoth/history.db") + ); + } + + #[test] + fn error_log_override_wins() { + let result = error_log_from( + Some("/custom/error.log"), + Some("/xdg"), + Path::new("/home/user"), ); + assert_eq!(result, PathBuf::from("/custom/error.log")); } #[test] - fn error_log_env_wins() { - std::env::set_var("THOTH_ERROR_LOG_TEST_04", "/tmp/err_04.log"); - let path = PathBuf::from(std::env::var("THOTH_ERROR_LOG_TEST_04").unwrap()); - assert_eq!(path, PathBuf::from("/tmp/err_04.log")); - std::env::remove_var("THOTH_ERROR_LOG_TEST_04"); + fn error_log_xdg_fallback() { + let result = error_log_from(None, Some("/xdg/data"), Path::new("/home/user")); + assert_eq!(result, PathBuf::from("/xdg/data/thoth/error.log")); + } + + #[test] + fn error_log_home_fallback() { + let result = error_log_from(None, None, Path::new("/home/user")); + assert_eq!( + result, + PathBuf::from("/home/user/.local/share/thoth/error.log") + ); } #[test] - fn resolve_db_path_uses_thoth_db() { - std::env::set_var("THOTH_DB", "/tmp/test_path_05.db"); + fn resolve_db_path_wires_thoth_db() { + std::env::set_var("THOTH_DB", "/tmp/wiring_test.db"); let result = resolve_db_path(); std::env::remove_var("THOTH_DB"); - assert_eq!(result, PathBuf::from("/tmp/test_path_05.db")); + assert_eq!(result, PathBuf::from("/tmp/wiring_test.db")); } #[test] - fn resolve_error_log_uses_thoth_error_log() { - std::env::set_var("THOTH_ERROR_LOG", "/tmp/test_error_06.log"); + fn resolve_error_log_wires_thoth_error_log() { + std::env::set_var("THOTH_ERROR_LOG", "/tmp/wiring_test.log"); let result = resolve_error_log(); std::env::remove_var("THOTH_ERROR_LOG"); - assert_eq!(result, PathBuf::from("/tmp/test_error_06.log")); + assert_eq!(result, PathBuf::from("/tmp/wiring_test.log")); } } From 618f0bd7f92bd2d09be71e56d27e83514212831d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:26:51 -0600 Subject: [PATCH 008/151] test(recorder): inject real failures to prove never-fail and retry boundaries (C3, W1) record_never_propagates_error now drops the commands table so record() hits a real rusqlite error and must swallow it; asserts log was written and no panic. double_failure_no_row_no_panic holds BEGIN IMMEDIATE through both record() attempts, asserts 0 rows and no panic (log assertion omitted: global LOG_PATH is shared across parallel tests and makes it non-deterministic). Refs #3 --- src/recorder.rs | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/recorder.rs b/src/recorder.rs index 2ef7c79..e52bb6d 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -253,15 +253,37 @@ mod tests { #[test] fn record_never_propagates_error() { let dir = TempDir::new().unwrap(); + let log_path = dir.path().join("error.log"); + crate::logging::setup(log_path.clone()); + let mut conn = disk_conn(&dir); - let bad_args = RecordArgs { - cmd: String::from("cmd"), - dir: Some(String::from("/tmp")), - exit_code: 0, - duration: 0, - timestamp: Some(1700000000), - tags: String::from("not valid json"), - }; - record(&bad_args, &mut conn); + conn.execute_batch("DROP TABLE commands;").unwrap(); + + let args = base_args(); + record(&args, &mut conn); + + let log = std::fs::read_to_string(&log_path).unwrap_or_default(); + assert!(!log.is_empty(), "error was not logged"); + } + + #[test] + fn double_failure_no_row_no_panic() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("locked.db"); + let mut conn = crate::database::get_connection(Some(&db_path)).unwrap(); + + let blocker = Connection::open(&db_path).unwrap(); + blocker.execute_batch("PRAGMA busy_timeout=0;").unwrap(); + blocker.execute("BEGIN IMMEDIATE", []).unwrap(); + + let args = base_args(); + record(&args, &mut conn); + + drop(blocker); + + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 0, "no row should have been inserted on double failure"); } } From b7182dc1916a9d162a909b5b8fec59a1275fffd2 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:27:07 -0600 Subject: [PATCH 009/151] fix(session): remove production unwrap in get_or_create Restructured the reuse branch from row.unwrap().0 to if let Some((sid,..)) to avoid unwrap in production code (W2). Logically identical behavior; the unreachable else arm re-creates a session as safe fallback. Refs #3 --- src/session.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/session.rs b/src/session.rs index 669dac9..f17bcee 100644 --- a/src/session.rs +++ b/src/session.rs @@ -29,13 +29,19 @@ pub fn get_or_create( rusqlite::params![sid, project, timestamp, timestamp], )?; Ok(sid) - } else { - let sid = row.unwrap().0; + } else if let Some((sid, _, _)) = row { conn.execute( "UPDATE sessions SET ended_at=?1 WHERE session_id=?2", rusqlite::params![timestamp, sid], )?; Ok(sid) + } else { + let sid = uuid::Uuid::new_v4().to_string(); + conn.execute( + "INSERT INTO sessions(session_id, project, started_at, ended_at, command_count) VALUES(?1, ?2, ?3, ?4, 0)", + rusqlite::params![sid, project, timestamp, timestamp], + )?; + Ok(sid) } } From c177666bd03be2807dc9175a222c752fed38677d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 20:27:44 -0600 Subject: [PATCH 010/151] style: apply cargo fmt to paths and recorder Refs #3 --- src/paths.rs | 22 ++++++++++------------ src/recorder.rs | 5 ++++- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/paths.rs b/src/paths.rs index 33ccc86..8bf76d1 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -7,7 +7,10 @@ fn db_path_from(thoth_db: Option<&str>, xdg: Option<&str>, home: &Path) -> PathB if let Some(x) = xdg { return PathBuf::from(x).join("thoth").join("history.db"); } - home.join(".local").join("share").join("thoth").join("history.db") + home.join(".local") + .join("share") + .join("thoth") + .join("history.db") } fn error_log_from(thoth_log: Option<&str>, xdg: Option<&str>, home: &Path) -> PathBuf { @@ -17,29 +20,24 @@ fn error_log_from(thoth_log: Option<&str>, xdg: Option<&str>, home: &Path) -> Pa if let Some(x) = xdg { return PathBuf::from(x).join("thoth").join("error.log"); } - home.join(".local").join("share").join("thoth").join("error.log") + home.join(".local") + .join("share") + .join("thoth") + .join("error.log") } pub fn resolve_db_path() -> PathBuf { let thoth_db = std::env::var("THOTH_DB").ok(); let xdg = std::env::var("XDG_DATA_HOME").ok(); let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); - db_path_from( - thoth_db.as_deref(), - xdg.as_deref(), - Path::new(&home), - ) + db_path_from(thoth_db.as_deref(), xdg.as_deref(), Path::new(&home)) } pub fn resolve_error_log() -> PathBuf { let thoth_log = std::env::var("THOTH_ERROR_LOG").ok(); let xdg = std::env::var("XDG_DATA_HOME").ok(); let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); - error_log_from( - thoth_log.as_deref(), - xdg.as_deref(), - Path::new(&home), - ) + error_log_from(thoth_log.as_deref(), xdg.as_deref(), Path::new(&home)) } #[cfg(test)] diff --git a/src/recorder.rs b/src/recorder.rs index e52bb6d..38c374b 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -284,6 +284,9 @@ mod tests { let count: i64 = conn .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) .unwrap(); - assert_eq!(count, 0, "no row should have been inserted on double failure"); + assert_eq!( + count, 0, + "no row should have been inserted on double failure" + ); } } From 0b3086cb4d32543306d1b34c8d168240e57d2a91 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 22:38:11 -0600 Subject: [PATCH 011/151] feat(schema): add v3 migration for terminal_id column (#2) --- src/database.rs | 111 +++++++++++++++++++++++++++++++++++++++++++++++- src/schema.rs | 12 ++++++ 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/src/database.rs b/src/database.rs index beaa0b4..3ecd08e 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,12 +1,16 @@ use crate::error::ThothError; -use crate::schema::{SCHEMA_V1, SCHEMA_V2_FTS}; +use crate::schema::{SCHEMA_V1, SCHEMA_V2_FTS, SCHEMA_V3_TERMINAL_ID}; use rusqlite::Connection; use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; pub const BUSY_TIMEOUT_MS: u32 = 2000; -pub const MIGRATIONS: &[(i64, &str)] = &[(1, SCHEMA_V1), (2, SCHEMA_V2_FTS)]; +pub const MIGRATIONS: &[(i64, &str)] = &[ + (1, SCHEMA_V1), + (2, SCHEMA_V2_FTS), + (3, SCHEMA_V3_TERMINAL_ID), +]; pub fn connect_memory() -> Result { let conn = Connection::open_in_memory()?; @@ -85,6 +89,109 @@ mod tests { c } + #[test] + fn v3_terminal_id_column_exists() { + let conn = mem_conn(); + let cols: Vec = { + let mut stmt = conn.prepare("PRAGMA table_info(commands)").unwrap(); + stmt.query_map([], |row| row.get::<_, String>(1)) + .unwrap() + .filter_map(|r| r.ok()) + .collect() + }; + assert!( + cols.iter().any(|c| c == "terminal_id"), + "terminal_id column missing: {cols:?}" + ); + } + + #[test] + fn v3_pre_existing_rows_have_null_terminal_id() { + let mut conn = connect_memory().unwrap(); + conn.execute_batch(SCHEMA_V1).unwrap(); + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64; + conn.execute( + "INSERT OR IGNORE INTO schema_version(version, applied_at) VALUES(1, ?1)", + rusqlite::params![now], + ) + .unwrap(); + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp) VALUES('old-cmd', '/tmp', 'p', 's1', 1700000000)", + [], + ).unwrap(); + apply_migrations(&mut conn).unwrap(); + let terminal_id: Option = conn + .query_row( + "SELECT terminal_id FROM commands WHERE command='old-cmd'", + [], + |r| r.get(0), + ) + .unwrap(); + assert!( + terminal_id.is_none(), + "expected NULL terminal_id for pre-existing row" + ); + } + + #[test] + fn v3_migration_idempotent() { + let mut conn = mem_conn(); + let ver_before = current_version(&conn); + assert_eq!(ver_before, 3); + apply_migrations(&mut conn).unwrap(); + let ver_after = current_version(&conn); + assert_eq!(ver_after, 3); + } + + #[test] + fn v3_current_version_is_3() { + let conn = mem_conn(); + assert_eq!(current_version(&conn), 3); + } + + #[test] + fn v3_fts_triggers_still_work_after_migration() { + let conn = mem_conn(); + if !fts5_available(&conn) { + return; + } + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp) VALUES('v3-fts-test', '/tmp', 'p', 's1', 1700000000)", + [], + ).unwrap(); + let rowid: Option = conn + .query_row( + "SELECT rowid FROM commands_fts WHERE commands_fts MATCH '\"v3-fts-test\"'", + [], + |r| r.get(0), + ) + .ok(); + assert!(rowid.is_some(), "FTS trigger broken after v3 migration"); + let id: i64 = conn + .query_row( + "SELECT id FROM commands WHERE command='v3-fts-test'", + [], + |r| r.get(0), + ) + .unwrap(); + conn.execute("DELETE FROM commands WHERE id=?1", rusqlite::params![id]) + .unwrap(); + let after_delete: Option = conn + .query_row( + "SELECT rowid FROM commands_fts WHERE commands_fts MATCH '\"v3-fts-test\"'", + [], + |r| r.get(0), + ) + .ok(); + assert!( + after_delete.is_none(), + "FTS delete trigger broken after v3 migration" + ); + } + #[test] fn migration_creates_schema() { let conn = mem_conn(); diff --git a/src/schema.rs b/src/schema.rs index 225e86a..1f4575d 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -35,6 +35,8 @@ CREATE TABLE IF NOT EXISTS projects ( ); "; +pub const SCHEMA_V3_TERMINAL_ID: &str = "ALTER TABLE commands ADD COLUMN terminal_id TEXT;"; + pub const SCHEMA_V2_FTS: &str = " CREATE VIRTUAL TABLE IF NOT EXISTS commands_fts USING fts5(command, content='commands', content_rowid='id'); @@ -59,4 +61,14 @@ mod tests { fn v2_contains_fts() { assert!(super::SCHEMA_V2_FTS.contains("commands_fts")); } + + #[test] + fn v3_const_non_empty() { + assert!(!super::SCHEMA_V3_TERMINAL_ID.is_empty()); + } + + #[test] + fn v3_const_contains_terminal_id() { + assert!(super::SCHEMA_V3_TERMINAL_ID.contains("terminal_id")); + } } From 20f048105c3360f36b8bf056724711faf4a95898 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 22:38:48 -0600 Subject: [PATCH 012/151] feat(error): add ThothError::Hook variant for lifecycle errors (#2) --- src/error.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/error.rs b/src/error.rs index 15eebf8..8515a99 100644 --- a/src/error.rs +++ b/src/error.rs @@ -4,6 +4,8 @@ pub enum ThothError { Sqlite(#[from] rusqlite::Error), #[error("io: {0}")] Io(#[from] std::io::Error), + #[error("{0}")] + Hook(String), } #[cfg(test)] @@ -22,4 +24,10 @@ mod tests { let err = ThothError::Io(io_err); assert!(err.to_string().starts_with("io:")); } + + #[test] + fn hook_variant_formats_message() { + let err = ThothError::Hook("could not write rc file".into()); + assert_eq!(err.to_string(), "could not write rc file"); + } } From 37f66daffa16f7bd48e7e79681855f05d0af7c22 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 22:40:10 -0600 Subject: [PATCH 013/151] feat(recorder): add --terminal-id flag, persist to commands.terminal_id (#2) --- src/cli.rs | 3 +++ src/recorder.rs | 42 ++++++++++++++++++++++++++++++--- tests/cli.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 3 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 83a63d4..b04914d 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -26,6 +26,8 @@ pub struct RecordArgs { pub timestamp: Option, #[arg(long, default_value = "[]")] pub tags: String, + #[arg(long = "terminal-id")] + pub terminal_id: Option, } pub fn run() -> Result<(), crate::error::ThothError> { @@ -69,6 +71,7 @@ mod tests { duration: 0, timestamp: None, tags: String::from("[]"), + terminal_id: None, }; assert_eq!(args.tags, "[]"); } diff --git a/src/recorder.rs b/src/recorder.rs index 38c374b..7b574da 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -42,8 +42,8 @@ pub fn record_inner(args: &RecordArgs, conn: &mut Connection) -> Result<(), Thot let sid = get_or_create(&project, timestamp, &tx)?; tx.execute( - "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ - VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)", + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id) \ + VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)", rusqlite::params![ args.cmd, directory, @@ -52,7 +52,8 @@ pub fn record_inner(args: &RecordArgs, conn: &mut Connection) -> Result<(), Thot timestamp, args.exit_code, args.duration, - tags + tags, + args.terminal_id ], )?; @@ -127,9 +128,43 @@ mod tests { duration: 5, timestamp: Some(1700000000), tags: String::from("[]"), + terminal_id: None, } } + #[test] + fn terminal_id_persisted_when_provided() { + let mut conn = mem_conn(); + let args = RecordArgs { + terminal_id: Some(String::from("abc")), + ..base_args() + }; + record_inner(&args, &mut conn).unwrap(); + let val: Option = conn + .query_row( + "SELECT terminal_id FROM commands WHERE command='echo hi'", + [], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(val, Some(String::from("abc"))); + } + + #[test] + fn terminal_id_null_when_omitted() { + let mut conn = mem_conn(); + let args = base_args(); + record_inner(&args, &mut conn).unwrap(); + let val: Option = conn + .query_row( + "SELECT terminal_id FROM commands WHERE command='echo hi'", + [], + |r| r.get(0), + ) + .unwrap(); + assert!(val.is_none()); + } + #[test] fn normalize_tags_valid() { assert_eq!(normalize_tags(r#"["a","b"]"#), r#"["a","b"]"#); @@ -185,6 +220,7 @@ mod tests { duration: 1, timestamp: Some(1700000000), tags: String::from("[]"), + terminal_id: None, }; record_inner(&args, &mut conn).unwrap(); let count: i64 = conn diff --git a/tests/cli.rs b/tests/cli.rs index 19fffe6..1112536 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -94,6 +94,68 @@ fn cli_all_six_flags_persisted() { assert_eq!(tags, r#"["test"]"#); } +#[test] +fn cli_terminal_id_persisted() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args([ + "record", + "--cmd", + "test-cmd", + "--exit", + "0", + "--duration", + "1", + "--timestamp", + "1700000000", + "--terminal-id", + "term-abc", + ]) + .assert() + .code(0); + + let conn = Connection::open(&db_path).unwrap(); + let terminal_id: Option = conn + .query_row( + "SELECT terminal_id FROM commands WHERE command='test-cmd'", + [], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(terminal_id, Some(String::from("term-abc"))); +} + +#[test] +fn cli_terminal_id_null_when_omitted() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args(["record", "--cmd", "no-tid-cmd", "--exit", "0"]) + .assert() + .code(0); + + let conn = Connection::open(&db_path).unwrap(); + let terminal_id: Option = conn + .query_row( + "SELECT terminal_id FROM commands WHERE command='no-tid-cmd'", + [], + |r| r.get(0), + ) + .unwrap(); + assert!(terminal_id.is_none()); +} + #[test] fn cli_default_dir_is_cwd() { let dir = TempDir::new().unwrap(); From dfdcf85d4578d522b67e3b1641c9c1ddcf40a6cf Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Tue, 23 Jun 2026 23:00:38 -0600 Subject: [PATCH 014/151] docs: add basic README --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..8850658 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# Thoth + +Thoth (`tth`) is an intelligent shell history. Instead of a flat list of commands, it records each command together with the context it ran in: the working directory, the inferred project, how long it took, its exit code, and the tags of the active work session. + +Commands are automatically grouped into work sessions and can be searched by project, tag, date, result, and free text. + +The name comes from Thoth, the Egyptian god of writing and memory. The binary is `tth`. + +## Status + +Early development. The capture engine is written in Rust and ships as a single static binary (SQLite with full-text search is bundled in). Shell hooks for automatic capture (bash and zsh) and the query commands are in progress. + +A Python prototype that validated the original design lives under `prototype/python/`. From bdd38b11560218a3f9daa0eabaee3e2fa3484146 Mon Sep 17 00:00:00 2001 From: Jose Velazco Date: Tue, 23 Jun 2026 23:09:39 -0600 Subject: [PATCH 015/151] docs: add banner to README --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8850658..32d270e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ -# Thoth +

+ header +

-Thoth (`tth`) is an intelligent shell history. Instead of a flat list of commands, it records each command together with the context it ran in: the working directory, the inferred project, how long it took, its exit code, and the tags of the active work session. +## What is Thoth? +Thoth is an intelligent shell history. Instead of a flat list of commands, it records each command together with the context it ran in: the working directory, the inferred project, how long it took, its exit code, and the tags of the active work session. Commands are automatically grouped into work sessions and can be searched by project, tag, date, result, and free text. -The name comes from Thoth, the Egyptian god of writing and memory. The binary is `tth`. +The name comes from Thoth, the Egyptian god of writing and memory. The binary is tth. + ## Status From 2666ab6eb33659de8a803616abfc7e2600908316 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 00:31:05 -0600 Subject: [PATCH 016/151] feat(hooks): add zsh and bash hook scripts for tth record (#2) --- shells/thoth.bash | 46 ++++++++++++++++++++++++++++++++++++++++++++++ shells/thoth.zsh | 29 +++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 shells/thoth.bash create mode 100644 shells/thoth.zsh diff --git a/shells/thoth.bash b/shells/thoth.bash new file mode 100644 index 0000000..cb3a36b --- /dev/null +++ b/shells/thoth.bash @@ -0,0 +1,46 @@ +if (( BASH_VERSINFO[0] < 5 )); then return; fi +command -v tth >/dev/null 2>&1 || return + +: ${TTH_SESSION_ID:=$(tth new-session-id)} +export TTH_SESSION_ID + +_THOTH_IN_PROMPT=0 + +_thoth_preexec() { + [[ $_THOTH_IN_PROMPT -eq 1 ]] && return + [[ "$BASH_COMMAND" == "_thoth_precmd" ]] && return + _THOTH_CMD="$BASH_COMMAND" + _THOTH_START=$EPOCHREALTIME +} + +_thoth_precmd() { + local _exit=$? + _THOTH_IN_PROMPT=1 + [[ -n "${_THOTH_CMD:-}" ]] || { _THOTH_IN_PROMPT=0; return; } + local _dur=$(( (${EPOCHREALTIME/./} - ${_THOTH_START/./}) / 1000 )) + tth record \ + --cmd "$_THOTH_CMD" \ + --dir "$PWD" \ + --exit "$_exit" \ + --duration "$_dur" \ + --timestamp "$(date +%s)" \ + --tags "${TTH_ACTIVE_TAGS:-[]}" \ + --terminal-id "$TTH_SESSION_ID" & + _THOTH_CMD="" + _THOTH_IN_PROMPT=0 +} + +_thoth_chain_debug() { + local _existing + _existing="$(trap -p DEBUG)" + if [[ -n "$_existing" ]]; then + _existing="${_existing#trap -- \'}" + _existing="${_existing%\' DEBUG}" + trap "_thoth_preexec; $_existing" DEBUG + else + trap '_thoth_preexec' DEBUG + fi +} +_thoth_chain_debug + +PROMPT_COMMAND="_thoth_precmd${PROMPT_COMMAND:+;$PROMPT_COMMAND}" diff --git a/shells/thoth.zsh b/shells/thoth.zsh new file mode 100644 index 0000000..78ebfbf --- /dev/null +++ b/shells/thoth.zsh @@ -0,0 +1,29 @@ +command -v tth >/dev/null 2>&1 || return + +autoload -Uz add-zsh-hook + +: ${TTH_SESSION_ID:=$(tth new-session-id)} +export TTH_SESSION_ID + +_tth_preexec() { + _TTH_CMD="$1" + _TTH_START=$EPOCHREALTIME +} + +_tth_precmd() { + local _TTH_EXIT=$? + [[ -n $_TTH_CMD ]] || return + local _dur=$(( int((EPOCHREALTIME - _TTH_START) * 1000) )) + tth record \ + --cmd "$_TTH_CMD" \ + --dir "$PWD" \ + --exit "$_TTH_EXIT" \ + --duration "$_dur" \ + --timestamp "$EPOCHSECONDS" \ + --tags "${TTH_ACTIVE_TAGS:-[]}" \ + --terminal-id "$TTH_SESSION_ID" & + _TTH_CMD="" +} + +add-zsh-hook preexec _tth_preexec +add-zsh-hook precmd _tth_precmd From 687ea6b3caac7dd86c17c0995711a0551b0267d1 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 00:32:34 -0600 Subject: [PATCH 017/151] feat(hooks): add hooks.rs lifecycle module with install/uninstall/status (#2) --- src/hooks.rs | 420 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 421 insertions(+) create mode 100644 src/hooks.rs diff --git a/src/hooks.rs b/src/hooks.rs new file mode 100644 index 0000000..e305a74 --- /dev/null +++ b/src/hooks.rs @@ -0,0 +1,420 @@ +use crate::error::ThothError; +use std::path::{Path, PathBuf}; + +const SENTINEL_BEGIN: &str = "# === THOTH HOOKS BEGIN ==="; +const SENTINEL_END: &str = "# === THOTH HOOKS END ==="; + +const ZSH_HOOK: &str = include_str!("../shells/thoth.zsh"); +const BASH_HOOK: &str = include_str!("../shells/thoth.bash"); + +#[derive(Debug, Clone, PartialEq)] +pub enum Shell { + Bash, + Zsh, +} + +pub fn detect_shell( + shell_flag: Option<&str>, + shell_env: Option<&str>, +) -> Result { + if let Some(flag) = shell_flag { + return match flag { + "bash" => Ok(Shell::Bash), + "zsh" => Ok(Shell::Zsh), + other => Err(ThothError::Hook(format!( + "unknown shell '{other}'; use --shell bash or --shell zsh" + ))), + }; + } + let env = shell_env.unwrap_or(""); + let basename = Path::new(env) + .file_name() + .and_then(|s| s.to_str()) + .unwrap_or(""); + match basename { + "bash" => Ok(Shell::Bash), + "zsh" => Ok(Shell::Zsh), + other => Err(ThothError::Hook(format!( + "could not detect shell from '{other}'; pass --shell bash or --shell zsh" + ))), + } +} + +pub fn default_rc_path(shell: &Shell, home: &Path) -> PathBuf { + match shell { + Shell::Bash => home.join(".bashrc"), + Shell::Zsh => home.join(".zshrc"), + } +} + +fn hook_body(shell: &Shell) -> &'static str { + match shell { + Shell::Bash => BASH_HOOK, + Shell::Zsh => ZSH_HOOK, + } +} + +pub fn has_block(content: &str) -> bool { + content.contains(SENTINEL_BEGIN) +} + +pub fn insert_or_replace_block(rc_contents: &str, hook_body_str: &str) -> String { + let block = format!("{}\n{}\n{}", SENTINEL_BEGIN, hook_body_str, SENTINEL_END); + if has_block(rc_contents) { + remove_block(rc_contents) + "\n" + &block + } else if rc_contents.is_empty() { + block + } else { + format!("{}\n{}", rc_contents.trim_end_matches('\n'), block) + .trim_start_matches('\n') + .to_string() + } +} + +pub fn remove_block(rc_contents: &str) -> String { + if !has_block(rc_contents) { + return rc_contents.to_string(); + } + let mut result = String::new(); + let mut in_block = false; + for line in rc_contents.lines() { + if line == SENTINEL_BEGIN { + in_block = true; + continue; + } + if line == SENTINEL_END { + in_block = false; + continue; + } + if !in_block { + result.push_str(line); + result.push('\n'); + } + } + result +} + +pub struct InstallReport { + pub rc_path: PathBuf, + pub shell: Shell, + pub already_present: bool, + pub reload_cmd: String, +} + +pub struct UninstallReport { + pub rc_path: PathBuf, + pub block_was_present: bool, +} + +pub struct StatusReport { + pub hooks_installed: bool, + pub schema_version: i64, + pub total_commands: i64, + pub last_timestamp: Option, + pub session_id_set: bool, + pub tth_on_path: bool, +} + +pub fn install(shell: &Shell, rc_path: &Path) -> Result { + let existing = if rc_path.exists() { + std::fs::read_to_string(rc_path)? + } else { + String::new() + }; + let already_present = has_block(&existing); + let body = hook_body(shell); + let new_content = insert_or_replace_block(&existing, body); + std::fs::write(rc_path, &new_content)?; + let reload_cmd = match shell { + Shell::Bash => "source ~/.bashrc".to_string(), + Shell::Zsh => "exec zsh".to_string(), + }; + Ok(InstallReport { + rc_path: rc_path.to_path_buf(), + shell: shell.clone(), + already_present, + reload_cmd, + }) +} + +pub fn uninstall(rc_path: &Path) -> Result { + let existing = if rc_path.exists() { + std::fs::read_to_string(rc_path)? + } else { + String::new() + }; + let block_was_present = has_block(&existing); + if block_was_present { + let new_content = remove_block(&existing); + std::fs::write(rc_path, &new_content)?; + } + Ok(UninstallReport { + rc_path: rc_path.to_path_buf(), + block_was_present, + }) +} + +pub fn status( + conn: &rusqlite::Connection, + rc_path: &Path, + session_id_set: bool, + tth_on_path: bool, +) -> StatusReport { + let hooks_installed = if rc_path.exists() { + std::fs::read_to_string(rc_path) + .map(|s| has_block(&s)) + .unwrap_or(false) + } else { + false + }; + let schema_version = crate::database::current_version(conn); + let total_commands: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap_or(0); + let last_timestamp: Option = conn + .query_row("SELECT MAX(timestamp) FROM commands", [], |r| r.get(0)) + .unwrap_or(None); + StatusReport { + hooks_installed, + schema_version, + total_commands, + last_timestamp, + session_id_set, + tth_on_path, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + fn tmp_rc(dir: &TempDir, name: &str) -> PathBuf { + dir.path().join(name) + } + + fn mem_conn() -> rusqlite::Connection { + let mut c = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut c).unwrap(); + c + } + + #[test] + fn detect_shell_bash_flag() { + assert_eq!(detect_shell(Some("bash"), None).unwrap(), Shell::Bash); + } + + #[test] + fn detect_shell_zsh_flag() { + assert_eq!(detect_shell(Some("zsh"), None).unwrap(), Shell::Zsh); + } + + #[test] + fn detect_shell_from_env_bash() { + assert_eq!(detect_shell(None, Some("/bin/bash")).unwrap(), Shell::Bash); + } + + #[test] + fn detect_shell_from_env_zsh() { + assert_eq!( + detect_shell(None, Some("/usr/bin/zsh")).unwrap(), + Shell::Zsh + ); + } + + #[test] + fn detect_shell_unknown_flag_errors() { + let err = detect_shell(Some("fish"), None).unwrap_err(); + assert!(err.to_string().contains("unknown shell")); + } + + #[test] + fn detect_shell_unknown_env_errors() { + let err = detect_shell(None, Some("/bin/fish")).unwrap_err(); + assert!(err.to_string().contains("could not detect shell")); + } + + #[test] + fn detect_shell_flag_overrides_env() { + assert_eq!( + detect_shell(Some("zsh"), Some("/bin/bash")).unwrap(), + Shell::Zsh + ); + } + + #[test] + fn default_rc_path_bash() { + let home = Path::new("/home/testuser"); + assert_eq!( + default_rc_path(&Shell::Bash, home), + PathBuf::from("/home/testuser/.bashrc") + ); + } + + #[test] + fn default_rc_path_zsh() { + let home = Path::new("/home/testuser"); + assert_eq!( + default_rc_path(&Shell::Zsh, home), + PathBuf::from("/home/testuser/.zshrc") + ); + } + + #[test] + fn has_block_detects_sentinel() { + let content = format!("{}\nsome hook\n{}", SENTINEL_BEGIN, SENTINEL_END); + assert!(has_block(&content)); + } + + #[test] + fn has_block_false_when_absent() { + assert!(!has_block("just some rc content")); + } + + #[test] + fn insert_or_replace_appends_to_empty() { + let result = insert_or_replace_block("", "hook body"); + assert!(result.contains(SENTINEL_BEGIN)); + assert!(result.contains("hook body")); + assert!(result.contains(SENTINEL_END)); + } + + #[test] + fn insert_or_replace_appends_to_existing() { + let existing = "export PATH=$PATH:/usr/local/bin\n"; + let result = insert_or_replace_block(existing, "hook body"); + assert!(result.contains("export PATH")); + assert!(result.contains(SENTINEL_BEGIN)); + } + + #[test] + fn insert_or_replace_is_idempotent_no_duplicate() { + let first = insert_or_replace_block("", "hook body"); + let second = insert_or_replace_block(&first, "hook body"); + let count = second.matches(SENTINEL_BEGIN).count(); + assert_eq!(count, 1, "duplicate sentinel blocks found"); + } + + #[test] + fn insert_or_replace_replaces_existing_body() { + let first = insert_or_replace_block("", "old hook body"); + let second = insert_or_replace_block(&first, "new hook body"); + assert!(!second.contains("old hook body"), "old body still present"); + assert!(second.contains("new hook body")); + } + + #[test] + fn remove_block_strips_sentinel_and_body() { + let original = "before\n"; + let with_block = insert_or_replace_block(original, "hook body"); + let removed = remove_block(&with_block); + assert!(!removed.contains(SENTINEL_BEGIN)); + assert!(!removed.contains("hook body")); + assert!(removed.contains("before")); + } + + #[test] + fn remove_block_noop_when_absent() { + let content = "no hook here\n"; + assert_eq!(remove_block(content), content); + } + + #[test] + fn install_writes_block_to_rc() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".zshrc"); + let report = install(&Shell::Zsh, &rc).unwrap(); + assert!(!report.already_present); + let content = std::fs::read_to_string(&rc).unwrap(); + assert!(content.contains(SENTINEL_BEGIN)); + } + + #[test] + fn install_on_existing_rc_does_not_duplicate() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".bashrc"); + std::fs::write(&rc, "export EDITOR=vim\n").unwrap(); + install(&Shell::Bash, &rc).unwrap(); + install(&Shell::Bash, &rc).unwrap(); + let content = std::fs::read_to_string(&rc).unwrap(); + let count = content.matches(SENTINEL_BEGIN).count(); + assert_eq!(count, 1); + assert!(content.contains("export EDITOR=vim")); + } + + #[test] + fn install_already_present_flag() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".zshrc"); + let r1 = install(&Shell::Zsh, &rc).unwrap(); + assert!(!r1.already_present); + let r2 = install(&Shell::Zsh, &rc).unwrap(); + assert!(r2.already_present); + } + + #[test] + fn uninstall_removes_block() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".zshrc"); + install(&Shell::Zsh, &rc).unwrap(); + let report = uninstall(&rc).unwrap(); + assert!(report.block_was_present); + let content = std::fs::read_to_string(&rc).unwrap(); + assert!(!content.contains(SENTINEL_BEGIN)); + } + + #[test] + fn uninstall_preserves_surrounding_lines() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".bashrc"); + std::fs::write(&rc, "# my custom config\nexport X=1\n").unwrap(); + install(&Shell::Bash, &rc).unwrap(); + uninstall(&rc).unwrap(); + let content = std::fs::read_to_string(&rc).unwrap(); + assert!(content.contains("export X=1")); + assert!(!content.contains(SENTINEL_BEGIN)); + } + + #[test] + fn uninstall_noop_when_block_absent() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".bashrc"); + std::fs::write(&rc, "no block\n").unwrap(); + let report = uninstall(&rc).unwrap(); + assert!(!report.block_was_present); + assert_eq!(std::fs::read_to_string(&rc).unwrap(), "no block\n"); + } + + #[test] + fn status_hooks_installed_true_after_install() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".zshrc"); + install(&Shell::Zsh, &rc).unwrap(); + let conn = mem_conn(); + let s = status(&conn, &rc, false, false); + assert!(s.hooks_installed); + assert_eq!(s.schema_version, 3); + assert_eq!(s.total_commands, 0); + } + + #[test] + fn status_hooks_not_installed_before_install() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".zshrc"); + let conn = mem_conn(); + let s = status(&conn, &rc, true, true); + assert!(!s.hooks_installed); + assert!(s.session_id_set); + assert!(s.tth_on_path); + } + + #[test] + fn zsh_hook_is_non_empty() { + assert!(!ZSH_HOOK.is_empty()); + } + + #[test] + fn bash_hook_is_non_empty() { + assert!(!BASH_HOOK.is_empty()); + } +} diff --git a/src/lib.rs b/src/lib.rs index e27e84d..d4e3a63 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ pub mod cli; pub mod database; pub mod error; +pub mod hooks; pub mod logging; pub mod paths; pub mod project; From b5b1a29e42fda02f25bee90711260775941addbf Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 00:34:13 -0600 Subject: [PATCH 018/151] feat(cli): add install/uninstall/status/new-session-id subcommands, refactor dispatch to match (#2) --- src/cli.rs | 131 +++++++++++++++++++++++++++++++++++++++------- tests/cli.rs | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 254 insertions(+), 20 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index b04914d..c162188 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,4 +1,5 @@ use clap::{Parser, Subcommand}; +use std::path::PathBuf; #[derive(Parser)] #[command(name = "tth")] @@ -10,6 +11,11 @@ pub struct Cli { #[derive(Subcommand)] pub enum Cmd { Record(RecordArgs), + Install(InstallArgs), + Uninstall(UninstallArgs), + Status, + #[command(hide = true)] + NewSessionId, } #[derive(clap::Args, Debug, Clone)] @@ -30,34 +36,119 @@ pub struct RecordArgs { pub terminal_id: Option, } +#[derive(clap::Args, Debug, Clone)] +pub struct InstallArgs { + #[arg(long)] + pub shell: Option, + #[arg(long = "rc-file")] + pub rc_file: Option, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct UninstallArgs { + #[arg(long = "keep-data")] + pub keep_data: bool, + #[arg(long = "rc-file")] + pub rc_file: Option, +} + pub fn run() -> Result<(), crate::error::ThothError> { use clap::Parser; let cli = Cli::parse(); - let Cmd::Record(mut args) = cli.cmd; - crate::logging::setup(crate::paths::resolve_error_log()); - - if args.dir.is_none() { - args.dir = std::env::current_dir() - .ok() - .map(|p| p.to_string_lossy().to_string()); - } - if args.timestamp.is_none() { - args.timestamp = Some( - std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or_default() - .as_secs() as i64, - ); - } - - match crate::database::get_connection(None) { - Ok(mut conn) => crate::recorder::record(&args, &mut conn), - Err(e) => crate::logging::log_error(&e.to_string()), + match cli.cmd { + Cmd::Record(mut args) => { + crate::logging::setup(crate::paths::resolve_error_log()); + if args.dir.is_none() { + args.dir = std::env::current_dir() + .ok() + .map(|p| p.to_string_lossy().to_string()); + } + if args.timestamp.is_none() { + args.timestamp = Some( + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64, + ); + } + match crate::database::get_connection(None) { + Ok(mut conn) => crate::recorder::record(&args, &mut conn), + Err(e) => crate::logging::log_error(&e.to_string()), + } + } + Cmd::Install(args) => { + let shell_env = std::env::var("SHELL").ok(); + let shell = crate::hooks::detect_shell(args.shell.as_deref(), shell_env.as_deref())?; + let rc_path = if let Some(p) = args.rc_file { + p + } else { + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + crate::hooks::default_rc_path(&shell, std::path::Path::new(&home)) + }; + let report = crate::hooks::install(&shell, &rc_path)?; + if report.already_present { + println!("Installed (updated) hooks in {}", rc_path.display()); + } else { + println!("Installed hooks in {}", rc_path.display()); + } + println!("Reload shell: {}", report.reload_cmd); + } + Cmd::Uninstall(args) => { + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + let rc_path = if let Some(p) = args.rc_file { + p + } else { + let shell_env = std::env::var("SHELL").ok(); + let shell = crate::hooks::detect_shell(None, shell_env.as_deref())?; + crate::hooks::default_rc_path(&shell, std::path::Path::new(&home)) + }; + let report = crate::hooks::uninstall(&rc_path)?; + if report.block_was_present { + println!("Uninstalled hooks from {}", rc_path.display()); + if !args.keep_data { + println!("Data retained. Pass --keep-data to suppress this message or remove manually."); + } + } else { + println!("No hooks found in {}", rc_path.display()); + } + } + Cmd::Status => { + let conn = crate::database::get_connection(None)?; + let shell_env = std::env::var("SHELL").ok(); + let shell = crate::hooks::detect_shell(None, shell_env.as_deref()) + .unwrap_or(crate::hooks::Shell::Bash); + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + let rc_path = crate::hooks::default_rc_path(&shell, std::path::Path::new(&home)); + let session_id_set = std::env::var("TTH_SESSION_ID").is_ok(); + let tth_on_path = which_tth(); + let report = crate::hooks::status(&conn, &rc_path, session_id_set, tth_on_path); + println!("Hooks installed: {}", report.hooks_installed); + println!("Schema version: {}", report.schema_version); + println!("Total commands: {}", report.total_commands); + println!( + "Last command: {}", + report + .last_timestamp + .map(|t| t.to_string()) + .unwrap_or_else(|| "none".into()) + ); + println!("Session ID set: {}", report.session_id_set); + println!("tth on PATH: {}", report.tth_on_path); + } + Cmd::NewSessionId => { + println!("{}", uuid::Uuid::new_v4()); + } } Ok(()) } +fn which_tth() -> bool { + std::env::var_os("PATH") + .map(|paths| std::env::split_paths(&paths).any(|dir| dir.join("tth").exists())) + .unwrap_or(false) +} + #[cfg(test)] mod tests { use super::*; diff --git a/tests/cli.rs b/tests/cli.rs index 1112536..6fa6902 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -1,4 +1,5 @@ use assert_cmd::Command; +use predicates::prelude::*; use rusqlite::Connection; use tempfile::TempDir; @@ -177,3 +178,145 @@ fn cli_default_dir_is_cwd() { .unwrap(); assert_eq!(directory, cwd.to_string_lossy().as_ref()); } + +#[test] +fn new_session_id_prints_uuid() { + let output = tth().args(["new-session-id"]).output().unwrap(); + assert!(output.status.success()); + let stdout = String::from_utf8(output.stdout).unwrap(); + let trimmed = stdout.trim(); + assert_eq!(trimmed.len(), 36, "expected uuid v4 length"); + assert_eq!( + trimmed.chars().filter(|&c| c == '-').count(), + 4, + "expected 4 hyphens in uuid" + ); +} + +#[test] +fn new_session_id_differs_across_runs() { + let out1 = tth().args(["new-session-id"]).output().unwrap(); + let out2 = tth().args(["new-session-id"]).output().unwrap(); + let id1 = String::from_utf8(out1.stdout).unwrap(); + let id2 = String::from_utf8(out2.stdout).unwrap(); + assert_ne!( + id1.trim(), + id2.trim(), + "two runs must produce distinct uuids" + ); +} + +#[test] +fn install_writes_sentinel_to_rc_file() { + let dir = TempDir::new().unwrap(); + let rc = dir.path().join(".bashrc"); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args([ + "install", + "--shell", + "bash", + "--rc-file", + rc.to_str().unwrap(), + ]) + .assert() + .code(0) + .stdout(predicate::str::contains("Installed")); + let content = std::fs::read_to_string(&rc).unwrap(); + assert!(content.contains("# === THOTH HOOKS BEGIN ===")); +} + +#[test] +fn install_idempotent_no_duplicate_sentinel() { + let dir = TempDir::new().unwrap(); + let rc = dir.path().join(".zshrc"); + let db_path = dir.path().join("history.db"); + for _ in 0..2 { + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args([ + "install", + "--shell", + "zsh", + "--rc-file", + rc.to_str().unwrap(), + ]) + .assert() + .code(0); + } + let content = std::fs::read_to_string(&rc).unwrap(); + assert_eq!(content.matches("# === THOTH HOOKS BEGIN ===").count(), 1); +} + +#[test] +fn uninstall_removes_sentinel_from_rc_file() { + let dir = TempDir::new().unwrap(); + let rc = dir.path().join(".bashrc"); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args([ + "install", + "--shell", + "bash", + "--rc-file", + rc.to_str().unwrap(), + ]) + .assert() + .code(0); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args(["uninstall", "--rc-file", rc.to_str().unwrap()]) + .assert() + .code(0); + let content = std::fs::read_to_string(&rc).unwrap(); + assert!(!content.contains("# === THOTH HOOKS BEGIN ===")); +} + +#[test] +fn status_exits_0_and_prints_info() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args(["status"]) + .assert() + .code(0) + .stdout(predicate::str::contains("Schema version")); +} + +#[test] +fn record_still_exits_0_after_dispatch_refactor() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args(["record", "--cmd", "echo test"]) + .assert() + .code(0); +} From a0be0cd6126d75edd29a70dee37af70e85b9b5ba Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 00:35:58 -0600 Subject: [PATCH 019/151] test(hooks): add shell integration smoke test script (#2) --- scripts/test_hooks.sh | 193 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100755 scripts/test_hooks.sh diff --git a/scripts/test_hooks.sh b/scripts/test_hooks.sh new file mode 100755 index 0000000..b06b123 --- /dev/null +++ b/scripts/test_hooks.sh @@ -0,0 +1,193 @@ +#!/usr/bin/env bash +set -euo pipefail + +PASS=0 +FAIL=0 +SKIP=0 + +_pass() { echo "PASS: $1"; PASS=$(( PASS + 1 )); } +_fail() { echo "FAIL: $1"; FAIL=$(( FAIL + 1 )); } +_skip() { echo "SKIP: $1"; SKIP=$(( SKIP + 1 )); } + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +TTH_BIN="${REPO_ROOT}/target/debug/tth" + +if [[ ! -x "$TTH_BIN" ]]; then + _skip "tth binary not built; run: cargo build first" + echo "---"; echo "PASS=$PASS FAIL=$FAIL SKIP=$SKIP"; exit 0 +fi + +_run_bash_test() { + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + + local stub_log="$tmpdir/stub.log" + local stub_bin="$tmpdir/tth" + + cat > "$stub_bin" <<'STUB' +#!/usr/bin/env bash +echo "$@" >> "$STUB_LOG" +STUB + chmod +x "$stub_bin" + + STUB_LOG="$stub_log" \ + PATH="$tmpdir:$REPO_ROOT/target/debug:$PATH" \ + TTH_SESSION_ID="" \ + bash --norc --noprofile -c " + export STUB_LOG='$stub_log' + source '${REPO_ROOT}/shells/thoth.bash' 2>/dev/null || true + sleep 0 + " || true + + if [[ -f "$stub_log" ]]; then + if grep -q 'new-session-id' "$stub_log" 2>/dev/null; then + _pass "bash: hook sources and calls new-session-id" + else + _pass "bash: hook sourced (new-session-id may be skipped in non-interactive)" + fi + else + _pass "bash: hook sourced without error (record call requires interactive shell)" + fi +} + +_run_bash_record_test() { + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + + local stub_log="$tmpdir/stub.log" + local stub_bin="$tmpdir/tth" + + cat > "$stub_bin" <<'STUB' +#!/usr/bin/env bash +echo "$@" >> "$STUB_LOG" +STUB + chmod +x "$stub_bin" + + STUB_LOG="$stub_log" \ + PATH="$tmpdir:$REPO_ROOT/target/debug:$PATH" \ + TTH_SESSION_ID="test-sid" \ + bash --norc --noprofile -c " + export STUB_LOG='$stub_log' + source '${REPO_ROOT}/shells/thoth.bash' 2>/dev/null || true + true + " || true + + if grep -q 'record' "$stub_log" 2>/dev/null; then + if grep -q -- '--terminal-id' "$stub_log"; then + _pass "bash: record call includes --terminal-id" + else + _skip "bash: record called but --terminal-id not seen (non-interactive)" + fi + else + _pass "bash: hook sourced in non-interactive shell (record fires after real commands)" + fi +} + +_run_zsh_test() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available" + return + fi + + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + + local stub_log="$tmpdir/stub.log" + local stub_bin="$tmpdir/tth" + + cat > "$stub_bin" <<'STUB' +#!/usr/bin/env bash +echo "$@" >> "$STUB_LOG" +STUB + chmod +x "$stub_bin" + + STUB_LOG="$stub_log" \ + PATH="$tmpdir:$REPO_ROOT/target/debug:$PATH" \ + TTH_SESSION_ID="" \ + zsh --no-rcs -c " + export STUB_LOG='$stub_log' + source '${REPO_ROOT}/shells/thoth.zsh' 2>/dev/null || true + true + " || true + + if [[ -f "$stub_log" ]] && grep -q 'new-session-id' "$stub_log" 2>/dev/null; then + _pass "zsh: hook sources and calls new-session-id" + else + _pass "zsh: hook sourced without error" + fi +} + +_run_bash_version_check() { + if (( BASH_VERSINFO[0] < 5 )); then + _skip "bash < 5; hook returns early by design" + return + fi + _pass "bash >= 5 available" +} + +_run_bash_syntax_check() { + if bash -n "${REPO_ROOT}/shells/thoth.bash" 2>/dev/null; then + _pass "thoth.bash: syntax valid" + else + _fail "thoth.bash: syntax error" + fi +} + +_run_zsh_syntax_check() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for syntax check" + return + fi + if zsh -n "${REPO_ROOT}/shells/thoth.zsh" 2>/dev/null; then + _pass "thoth.zsh: syntax valid" + else + _fail "thoth.zsh: syntax error" + fi +} + +_check_flags_in_file() { + local label="$1" + local file="$2" + local content + content="$(cat "$file")" + for flag in --cmd --dir --exit --duration --timestamp --tags --terminal-id; do + if [[ "$content" == *"$flag"* ]]; then + _pass "$label: flag $flag present" + else + _fail "$label: flag $flag MISSING" + fi + done +} + +_run_flag_check() { + _check_flags_in_file "thoth.bash" "${REPO_ROOT}/shells/thoth.bash" +} + +_run_zsh_flag_check() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for flag check" + return + fi + _check_flags_in_file "thoth.zsh" "${REPO_ROOT}/shells/thoth.zsh" +} + +echo "=== Thoth shell hook smoke tests ===" +_run_bash_version_check +_run_bash_syntax_check +_run_zsh_syntax_check +_run_flag_check +_run_zsh_flag_check +_run_bash_test +_run_bash_record_test +_run_zsh_test + +echo "---" +echo "PASS=$PASS FAIL=$FAIL SKIP=$SKIP" + +if [[ $FAIL -gt 0 ]]; then + exit 1 +fi +exit 0 From a4b83f81cfd5d8d88871070d10fbf77d2adeca03 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 10:29:09 -0600 Subject: [PATCH 020/151] fix(cli): report lifecycle errors and exit non-zero (#2) --- src/main.rs | 9 +++++++-- tests/cli.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9276ec7..365d90b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,9 @@ fn main() { - let _ = thoth::cli::run(); - std::process::exit(0); + match thoth::cli::run() { + Ok(()) => std::process::exit(0), + Err(e) => { + eprintln!("tth: {e}"); + std::process::exit(1); + } + } } diff --git a/tests/cli.rs b/tests/cli.rs index 6fa6902..409823f 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -306,6 +306,49 @@ fn status_exits_0_and_prints_info() { .stdout(predicate::str::contains("Schema version")); } +#[test] +fn lifecycle_error_exits_nonzero_and_prints_stderr() { + let dir = TempDir::new().unwrap(); + let db_path = dir.path().join("history.db"); + let unwritable = dir.path().join("no").join("such").join("path.rc"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args([ + "install", + "--shell", + "bash", + "--rc-file", + unwritable.to_str().unwrap(), + ]) + .assert() + .failure() + .stderr(predicate::str::starts_with("tth: ")); +} + +#[test] +fn record_never_fail_contract_preserved() { + let dir = TempDir::new().unwrap(); + let ro_dir = dir.path().join("readonly"); + std::fs::create_dir_all(&ro_dir).unwrap(); + let mut perms = std::fs::metadata(&ro_dir).unwrap().permissions(); + use std::os::unix::fs::PermissionsExt; + perms.set_mode(0o444); + std::fs::set_permissions(&ro_dir, perms).unwrap(); + tth() + .env("THOTH_DB", ro_dir.join("history.db").to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args(["record", "--cmd", "whoami"]) + .assert() + .code(0); +} + #[test] fn record_still_exits_0_after_dispatch_refactor() { let dir = TempDir::new().unwrap(); From 730338abdf524609e095f021329c4818119a0ced Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 10:37:10 -0600 Subject: [PATCH 021/151] fix(hooks): make bash DEBUG trap chaining robust against embedded quotes (#2) --- scripts/test_hooks.sh | 34 ++++++++++++++++++++++++++++++++++ shells/thoth.bash | 22 +++++++++++++--------- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/scripts/test_hooks.sh b/scripts/test_hooks.sh index b06b123..3cd15d9 100755 --- a/scripts/test_hooks.sh +++ b/scripts/test_hooks.sh @@ -174,12 +174,46 @@ _run_zsh_flag_check() { _check_flags_in_file "thoth.zsh" "${REPO_ROOT}/shells/thoth.zsh" } +_run_bash_trap_chain_single_quote_test() { + if (( BASH_VERSINFO[0] < 5 )); then + _skip "bash < 5; trap chain test requires bash >= 5" + return + fi + + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + + local trap_log="$tmpdir/trap.log" + local err_log="$tmpdir/err.log" + + local after_err_log="$tmpdir/after_err.log" + + bash --norc --noprofile -c " + trap 'echo it'\\''s here >> \"$trap_log\"' DEBUG + source '${REPO_ROOT}/shells/thoth.bash' 2>/dev/null || true + echo trigger 2>'$after_err_log' + " 2>/dev/null || true + + local after_err="" + if [[ -f "$after_err_log" ]]; then + after_err="$(cat "$after_err_log")" + fi + + if [[ "$after_err" == *"EOF"* ]] || [[ "$after_err" == *"inesperado"* ]] || [[ "$after_err" == *"unexpected"* ]] || [[ "$after_err" == *"syntax error"* ]] || [[ "$after_err" == *"parse error"* ]] || [[ "$after_err" == *"debug trap"* ]]; then + _fail "bash: DEBUG trap chain breaks with single-quoted prior trap body" + else + _pass "bash: DEBUG trap chain survives prior trap body containing single quote" + fi +} + echo "=== Thoth shell hook smoke tests ===" _run_bash_version_check _run_bash_syntax_check _run_zsh_syntax_check _run_flag_check _run_zsh_flag_check +_run_bash_trap_chain_single_quote_test _run_bash_test _run_bash_record_test _run_zsh_test diff --git a/shells/thoth.bash b/shells/thoth.bash index cb3a36b..444b256 100644 --- a/shells/thoth.bash +++ b/shells/thoth.bash @@ -5,12 +5,16 @@ command -v tth >/dev/null 2>&1 || return export TTH_SESSION_ID _THOTH_IN_PROMPT=0 +_THOTH_PREV_DEBUG="" _thoth_preexec() { [[ $_THOTH_IN_PROMPT -eq 1 ]] && return [[ "$BASH_COMMAND" == "_thoth_precmd" ]] && return _THOTH_CMD="$BASH_COMMAND" _THOTH_START=$EPOCHREALTIME + if [[ -n "$_THOTH_PREV_DEBUG" ]]; then + eval "$_THOTH_PREV_DEBUG" + fi } _thoth_precmd() { @@ -23,7 +27,7 @@ _thoth_precmd() { --dir "$PWD" \ --exit "$_exit" \ --duration "$_dur" \ - --timestamp "$(date +%s)" \ + --timestamp "$EPOCHSECONDS" \ --tags "${TTH_ACTIVE_TAGS:-[]}" \ --terminal-id "$TTH_SESSION_ID" & _THOTH_CMD="" @@ -31,15 +35,15 @@ _thoth_precmd() { } _thoth_chain_debug() { - local _existing - _existing="$(trap -p DEBUG)" - if [[ -n "$_existing" ]]; then - _existing="${_existing#trap -- \'}" - _existing="${_existing%\' DEBUG}" - trap "_thoth_preexec; $_existing" DEBUG - else - trap '_thoth_preexec' DEBUG + local _raw _body_quoted + _raw="$(trap -p DEBUG 2>/dev/null)" + trap - DEBUG + if [[ -n "$_raw" ]]; then + _body_quoted="${_raw#trap -- }" + _body_quoted="${_body_quoted% DEBUG}" + eval "_THOTH_PREV_DEBUG=${_body_quoted}" fi + trap '_thoth_preexec' DEBUG } _thoth_chain_debug From bfe8be0935494bd7488dfefc0e501513da182768 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 10:37:31 -0600 Subject: [PATCH 022/151] fix(hooks): use $EPOCHSECONDS instead of date subshell for timestamp (#2) --- scripts/test_hooks.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/test_hooks.sh b/scripts/test_hooks.sh index 3cd15d9..19f5233 100755 --- a/scripts/test_hooks.sh +++ b/scripts/test_hooks.sh @@ -162,6 +162,16 @@ _check_flags_in_file() { done } +_run_epochseconds_check() { + local content + content="$(cat "${REPO_ROOT}/shells/thoth.bash")" + if [[ "$content" == *'$(date +%s)'* ]]; then + _fail "thoth.bash: uses \$(date +%s) subshell instead of \$EPOCHSECONDS" + else + _pass "thoth.bash: uses \$EPOCHSECONDS builtin (no date subshell)" + fi +} + _run_flag_check() { _check_flags_in_file "thoth.bash" "${REPO_ROOT}/shells/thoth.bash" } @@ -211,6 +221,7 @@ echo "=== Thoth shell hook smoke tests ===" _run_bash_version_check _run_bash_syntax_check _run_zsh_syntax_check +_run_epochseconds_check _run_flag_check _run_zsh_flag_check _run_bash_trap_chain_single_quote_test From d5953b9e7e745d5706411c4d470ced680f56e6ee Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 10:38:10 -0600 Subject: [PATCH 023/151] test(hooks): make bash record smoke test prove real precmd invocation with all 7 flags (#2) --- scripts/test_hooks.sh | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/scripts/test_hooks.sh b/scripts/test_hooks.sh index 19f5233..9f68cb3 100755 --- a/scripts/test_hooks.sh +++ b/scripts/test_hooks.sh @@ -71,17 +71,21 @@ STUB bash --norc --noprofile -c " export STUB_LOG='$stub_log' source '${REPO_ROOT}/shells/thoth.bash' 2>/dev/null || true - true + _THOTH_CMD='echo hello' + _THOTH_START=\$EPOCHREALTIME + _thoth_precmd + wait " || true - if grep -q 'record' "$stub_log" 2>/dev/null; then - if grep -q -- '--terminal-id' "$stub_log"; then - _pass "bash: record call includes --terminal-id" - else - _skip "bash: record called but --terminal-id not seen (non-interactive)" + local all_ok=1 + for flag in --cmd --dir --exit --duration --timestamp --tags --terminal-id; do + if ! grep -q -- "$flag" "$stub_log" 2>/dev/null; then + _fail "bash: record invocation missing flag $flag" + all_ok=0 fi - else - _pass "bash: hook sourced in non-interactive shell (record fires after real commands)" + done + if [[ $all_ok -eq 1 ]]; then + _pass "bash: _thoth_precmd passes all 7 flags to tth record" fi } From c63c4520e9d34ac8252c324ec0419ca7c06c8132 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 10:39:34 -0600 Subject: [PATCH 024/151] fix(hooks): drop double blank line on block replace, remove tautological unit test (#2) --- src/cli.rs | 13 ------------- src/hooks.rs | 23 ++++++++++++++++++++++- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index c162188..cbbed6e 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -167,19 +167,6 @@ mod tests { assert_eq!(args.tags, "[]"); } - #[test] - fn default_dir_is_cwd() { - let cwd = std::env::current_dir() - .unwrap() - .to_string_lossy() - .to_string(); - let dir = std::env::current_dir() - .ok() - .map(|p| p.to_string_lossy().to_string()) - .unwrap_or_default(); - assert_eq!(dir, cwd); - } - #[test] fn default_timestamp_is_now() { let now = std::time::SystemTime::now() diff --git a/src/hooks.rs b/src/hooks.rs index e305a74..79c6f0f 100644 --- a/src/hooks.rs +++ b/src/hooks.rs @@ -61,7 +61,13 @@ pub fn has_block(content: &str) -> bool { pub fn insert_or_replace_block(rc_contents: &str, hook_body_str: &str) -> String { let block = format!("{}\n{}\n{}", SENTINEL_BEGIN, hook_body_str, SENTINEL_END); if has_block(rc_contents) { - remove_block(rc_contents) + "\n" + &block + let stripped = remove_block(rc_contents); + let prefix = stripped.trim_end_matches('\n'); + if prefix.is_empty() { + block + } else { + format!("{}\n{}", prefix, block) + } } else if rc_contents.is_empty() { block } else { @@ -303,6 +309,21 @@ mod tests { assert!(second.contains("new hook body")); } + #[test] + fn insert_or_replace_no_double_blank_line_on_replace() { + let first = insert_or_replace_block("", "hook body"); + let second = insert_or_replace_block(&first, "hook body v2"); + assert!( + !second.contains("\n\n\n"), + "double blank line found after replace: {:?}", + second + ); + assert!( + !second.starts_with('\n'), + "result starts with blank line after replace" + ); + } + #[test] fn remove_block_strips_sentinel_and_body() { let original = "before\n"; From b509f5ab2ece55cd56bea0629e9ca54c25b9215d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 15:03:06 -0600 Subject: [PATCH 025/151] feat(error): add ThothError::Search variant for user-facing parse errors (#7) --- src/error.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/error.rs b/src/error.rs index 8515a99..a14955d 100644 --- a/src/error.rs +++ b/src/error.rs @@ -6,6 +6,8 @@ pub enum ThothError { Io(#[from] std::io::Error), #[error("{0}")] Hook(String), + #[error("{0}")] + Search(String), } #[cfg(test)] @@ -30,4 +32,10 @@ mod tests { let err = ThothError::Hook("could not write rc file".into()); assert_eq!(err.to_string(), "could not write rc file"); } + + #[test] + fn search_variant_delegates_to_inner_string() { + let err = ThothError::Search("bad input".into()); + assert_eq!(err.to_string(), "bad input"); + } } From b765c9c503c21e2ce7452ae7ae48c99ec2d40f95 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 15:15:02 -0600 Subject: [PATCH 026/151] feat(search): add parse_duration, parse_date, ExitFilter, CommandRow (T2-T4) (#7) --- Cargo.lock | 131 +++++++ Cargo.toml | 1 + src/lib.rs | 1 + src/search.rs | 919 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1052 insertions(+) create mode 100644 src/search.rs diff --git a/Cargo.lock b/Cargo.lock index 98c87a8..8735934 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,12 +179,55 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" +[[package]] +name = "comfy-table" +version = "7.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" +dependencies = [ + "crossterm", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags", + "crossterm_winapi", + "document-features", + "parking_lot", + "rustix", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + [[package]] name = "difflib" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -355,6 +398,21 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "memchr" version = "2.8.2" @@ -388,6 +446,29 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + [[package]] name = "pin-project-lite" version = "0.2.17" @@ -454,6 +535,15 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + [[package]] name = "regex" version = "1.12.4" @@ -516,6 +606,12 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "serde" version = "1.0.228" @@ -647,6 +743,7 @@ version = "0.1.0" dependencies = [ "assert_cmd", "clap", + "comfy-table", "predicates", "rusqlite", "serde_json", @@ -703,6 +800,18 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "utf8parse" version = "0.2.2" @@ -786,6 +895,28 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-link" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index a04b40d..7b75de1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ thiserror = "2" uuid = { version = "1", features = ["v4"] } toml = "0.8" serde_json = "1" +comfy-table = "7" [dev-dependencies] tempfile = "3" diff --git a/src/lib.rs b/src/lib.rs index d4e3a63..dfd96e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,4 +7,5 @@ pub mod paths; pub mod project; pub mod recorder; pub mod schema; +pub mod search; pub mod session; diff --git a/src/search.rs b/src/search.rs new file mode 100644 index 0000000..58c04ff --- /dev/null +++ b/src/search.rs @@ -0,0 +1,919 @@ +use std::cmp::Ordering; + +use comfy_table::{Cell, Color, ContentArrangement, Table}; +use rusqlite::{Connection, ToSql}; + +use crate::error::ThothError; + +pub use crate::cli::SearchArgs; + +const SECS_PER_DAY: i64 = 86_400; +const MS_PER_SEC: i64 = 1_000; + +const DAYS_FROM_EPOCH_TO_YEAR_ZERO: i64 = 719_468; + +#[derive(clap::ValueEnum, Clone, Debug, PartialEq)] +pub enum ExitFilter { + Ok, + Fail, + Any, +} + +pub struct CommandRow { + pub timestamp: i64, + pub project: String, + pub tags: String, + pub exit_code: i64, + pub duration_ms: i64, + pub directory: String, + pub command: String, + pub session_id: String, +} + +pub fn parse_duration(s: &str) -> Result<(Ordering, i64), ThothError> { + let (ord, rest) = if let Some(n) = s.strip_prefix('>') { + (Ordering::Greater, n) + } else if let Some(n) = s.strip_prefix('<') { + (Ordering::Less, n) + } else { + return Err(ThothError::Search(format!( + "duration must start with '>' or '<', got: {s}" + ))); + }; + let secs: i64 = rest + .parse() + .map_err(|_| ThothError::Search(format!("invalid duration seconds: {rest}")))?; + Ok((ord, secs * MS_PER_SEC)) +} + +pub fn parse_date(s: &str, now: i64) -> Result { + let today_midnight = now - now.rem_euclid(SECS_PER_DAY); + match s { + "today" => Ok(today_midnight), + "yesterday" => Ok(today_midnight - SECS_PER_DAY), + "last week" => Ok(today_midnight - 7 * SECS_PER_DAY), + other => parse_ymd(other), + } +} + +fn parse_ymd(s: &str) -> Result { + let parts: Vec<&str> = s.splitn(3, '-').collect(); + if parts.len() != 3 { + return Err(ThothError::Search(format!("invalid date: {s}"))); + } + let year: i64 = parts[0] + .parse() + .map_err(|_| ThothError::Search(format!("invalid date: {s}")))?; + let month: i64 = parts[1] + .parse() + .map_err(|_| ThothError::Search(format!("invalid date: {s}")))?; + let day: i64 = parts[2] + .parse() + .map_err(|_| ThothError::Search(format!("invalid date: {s}")))?; + + if !(1..=12).contains(&month) || !(1..=31).contains(&day) { + return Err(ThothError::Search(format!("invalid date: {s}"))); + } + + let days = days_since_epoch(year, month, day); + Ok(days * SECS_PER_DAY) +} + +fn days_since_epoch(year: i64, month: i64, day: i64) -> i64 { + let (y, m) = if month <= 2 { + (year - 1, month + 12) + } else { + (year, month) + }; + let era = y.div_euclid(400); + let yoe = y - era * 400; + let doy = (153 * (m - 3) + 2) / 5 + day - 1; + let doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; + era * 146_097 + doe - DAYS_FROM_EPOCH_TO_YEAR_ZERO +} + +pub fn build_query( + args: &SearchArgs, + now: i64, +) -> Result<(String, Vec>), ThothError> { + let cols = "c.timestamp, c.project, c.tags, c.exit_code, c.duration_ms, c.directory, c.command, c.session_id"; + + let tokens: Vec = match &args.query { + Some(q) => q + .split_whitespace() + .filter(|t| !t.is_empty()) + .map(|t| format!("\"{}\"", t.replace('"', "\"\""))) + .collect(), + None => vec![], + }; + + let use_fts = !tokens.is_empty(); + + let mut fragments: Vec = Vec::new(); + let mut params: Vec> = Vec::new(); + + if use_fts { + let match_str = tokens.join(" "); + fragments.push("f.commands_fts MATCH ?".to_string()); + params.push(Box::new(match_str)); + } + + if let Some(ref p) = args.project { + fragments.push("c.project = ?".to_string()); + params.push(Box::new(p.clone())); + } + + match &args.exit { + Some(ExitFilter::Ok) => { + fragments.push("c.exit_code = 0".to_string()); + } + Some(ExitFilter::Fail) => { + fragments.push("c.exit_code != 0".to_string()); + } + Some(ExitFilter::Any) | None => {} + } + + if let Some(ref dur_str) = args.duration { + let (ord, ms) = parse_duration(dur_str)?; + match ord { + Ordering::Greater => { + fragments.push("c.duration_ms > ?".to_string()); + params.push(Box::new(ms)); + } + Ordering::Less => { + fragments.push("c.duration_ms < ?".to_string()); + params.push(Box::new(ms)); + } + Ordering::Equal => {} + } + } + + if let Some(ref since_str) = args.since { + let ts = parse_date(since_str, now)?; + fragments.push("c.timestamp >= ?".to_string()); + params.push(Box::new(ts)); + } + + if let Some(ref until_str) = args.until { + let ts = parse_date(until_str, now)?; + fragments.push("c.timestamp <= ?".to_string()); + params.push(Box::new(ts)); + } + + if let Some(ref sid) = args.session { + fragments.push("c.session_id = ?".to_string()); + params.push(Box::new(sid.clone())); + } + + for tag in &args.tag { + fragments.push("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)".to_string()); + params.push(Box::new(tag.clone())); + } + + let limit = args.limit as i64; + params.push(Box::new(limit)); + + let sql = if use_fts { + let where_clause = fragments.join(" AND "); + format!( + "SELECT {cols} FROM commands c INNER JOIN commands_fts f ON f.rowid = c.id WHERE {where_clause} ORDER BY c.timestamp DESC LIMIT ?" + ) + } else if fragments.is_empty() { + format!("SELECT {cols} FROM commands c ORDER BY c.timestamp DESC LIMIT ?") + } else { + let where_clause = fragments.join(" AND "); + format!( + "SELECT {cols} FROM commands c WHERE {where_clause} ORDER BY c.timestamp DESC LIMIT ?" + ) + }; + + Ok((sql, params)) +} + +pub fn execute( + args: &SearchArgs, + conn: &Connection, + now: i64, +) -> Result, ThothError> { + let (sql, params) = build_query(args, now)?; + let mut stmt = conn.prepare(&sql)?; + let rows = stmt.query_map( + rusqlite::params_from_iter(params.iter().map(|p| p.as_ref())), + |row| { + Ok(CommandRow { + timestamp: row.get(0)?, + project: row.get(1)?, + tags: row.get(2)?, + exit_code: row.get(3)?, + duration_ms: row.get(4)?, + directory: row.get(5)?, + command: row.get(6)?, + session_id: row.get(7)?, + }) + }, + )?; + let mut result = Vec::new(); + for row in rows { + result.push(row?); + } + Ok(result) +} + +pub fn render(rows: &[CommandRow], show_session: bool) -> String { + if rows.is_empty() { + return String::from("0 result(s)\n"); + } + + if show_session { + render_by_session(rows) + } else { + render_table(rows) + } +} + +fn render_table(rows: &[CommandRow]) -> String { + let mut table = Table::new(); + table.set_content_arrangement(ContentArrangement::Dynamic); + table.set_header(vec![ + "timestamp", + "project", + "tags", + "exit", + "duration", + "directory", + "command", + ]); + for row in rows { + table.add_row(vec![ + Cell::new(fmt_timestamp(row.timestamp)), + Cell::new(&row.project), + Cell::new(&row.tags), + exit_cell(row.exit_code), + Cell::new(fmt_duration(row.duration_ms)), + Cell::new(&row.directory), + Cell::new(&row.command), + ]); + } + format!("{table}\n{} result(s)\n", rows.len()) +} + +fn render_by_session(rows: &[CommandRow]) -> String { + let mut output = String::new(); + let mut current_session: Option<&str> = None; + + let mut group_start = 0; + let mut i = 0; + while i <= rows.len() { + let session_changed = + i == rows.len() || current_session.is_none_or(|s| s != rows[i].session_id); + + if session_changed && i > 0 { + let group = &rows[group_start..i]; + let first = &group[0]; + let short_id = &first.session_id[..first.session_id.len().min(8)]; + let date = &fmt_timestamp(first.timestamp)[..10]; + let header = format!( + "--- session {} · {} · {} ---\n", + short_id, date, first.project + ); + output.push_str(&header); + + let mut sub = Table::new(); + sub.set_content_arrangement(ContentArrangement::Dynamic); + sub.set_header(vec!["timestamp", "exit", "duration", "command"]); + for r in group { + sub.add_row(vec![ + Cell::new(fmt_timestamp(r.timestamp)), + exit_cell(r.exit_code), + Cell::new(fmt_duration(r.duration_ms)), + Cell::new(&r.command), + ]); + } + output.push_str(&format!("{sub}\n")); + group_start = i; + } + + if i < rows.len() { + current_session = Some(&rows[i].session_id); + } + i += 1; + } + + output +} + +fn exit_cell(code: i64) -> Cell { + if code == 0 { + Cell::new("\u{2713}").fg(Color::Green) + } else { + Cell::new("\u{2717}").fg(Color::Red) + } +} + +fn fmt_timestamp(epoch: i64) -> String { + let secs = epoch; + let days = secs.div_euclid(SECS_PER_DAY); + let time_secs = secs.rem_euclid(SECS_PER_DAY); + let hh = time_secs / 3600; + let mm = (time_secs % 3600) / 60; + + let (y, mo, d) = civil_from_days(days); + format!("{y:04}-{mo:02}-{d:02} {hh:02}:{mm:02}") +} + +fn civil_from_days(z: i64) -> (i64, i64, i64) { + let z = z + DAYS_FROM_EPOCH_TO_YEAR_ZERO; + let era = z.div_euclid(146_097); + let doe = z - era * 146_097; + let yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; + let y = yoe + era * 400; + let doy = doe - (365 * yoe + yoe / 4 - yoe / 100); + let mp = (5 * doy + 2) / 153; + let d = doy - (153 * mp + 2) / 5 + 1; + let mo = if mp < 10 { mp + 3 } else { mp - 9 }; + let y = if mo <= 2 { y + 1 } else { y }; + (y, mo, d) +} + +fn fmt_duration(ms: i64) -> String { + if ms < 1000 { + format!("{ms}ms") + } else { + let s = ms as f64 / 1000.0; + let tenths = (s * 10.0).round() as i64; + if tenths % 10 == 0 { + format!("{}s", tenths / 10) + } else { + format!("{:.1}s", s) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::cli::SearchArgs; + + fn default_args() -> SearchArgs { + SearchArgs { + query: None, + project: None, + tag: vec![], + exit: None, + duration: None, + since: None, + until: None, + session: None, + limit: 50, + show_session: false, + } + } + + #[test] + fn parse_duration_greater() { + let (ord, ms) = parse_duration(">30").unwrap(); + assert_eq!(ord, Ordering::Greater); + assert_eq!(ms, 30_000); + } + + #[test] + fn parse_duration_less() { + let (ord, ms) = parse_duration("<5").unwrap(); + assert_eq!(ord, Ordering::Less); + assert_eq!(ms, 5_000); + } + + #[test] + fn parse_duration_zero() { + let (ord, ms) = parse_duration(">0").unwrap(); + assert_eq!(ord, Ordering::Greater); + assert_eq!(ms, 0); + } + + #[test] + fn parse_duration_no_prefix_is_err() { + assert!(parse_duration("30").is_err()); + } + + #[test] + fn parse_duration_non_numeric_is_err() { + assert!(parse_duration(">abc").is_err()); + } + + #[test] + fn parse_duration_empty_is_err() { + assert!(parse_duration("").is_err()); + } + + const FIXED_NOW: i64 = 1_700_000_000; + + #[test] + fn parse_date_today() { + let midnight = FIXED_NOW - FIXED_NOW.rem_euclid(SECS_PER_DAY); + assert_eq!(parse_date("today", FIXED_NOW).unwrap(), midnight); + } + + #[test] + fn parse_date_yesterday() { + let midnight = FIXED_NOW - FIXED_NOW.rem_euclid(SECS_PER_DAY); + assert_eq!( + parse_date("yesterday", FIXED_NOW).unwrap(), + midnight - SECS_PER_DAY + ); + } + + #[test] + fn parse_date_last_week() { + let midnight = FIXED_NOW - FIXED_NOW.rem_euclid(SECS_PER_DAY); + assert_eq!( + parse_date("last week", FIXED_NOW).unwrap(), + midnight - 7 * SECS_PER_DAY + ); + } + + #[test] + fn parse_date_ymd() { + let epoch = parse_date("2024-01-15", FIXED_NOW).unwrap(); + assert_eq!(epoch, 19_737 * SECS_PER_DAY); + } + + #[test] + fn parse_date_bad_string_is_err() { + assert!(parse_date("bad-date", FIXED_NOW).is_err()); + } + + #[test] + fn parse_date_invalid_month_is_err() { + assert!(parse_date("2024-13-01", FIXED_NOW).is_err()); + } + + #[test] + fn exit_filter_eq() { + assert_eq!(ExitFilter::Ok, ExitFilter::Ok); + } + + #[test] + fn build_query_no_filters() { + let args = default_args(); + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(!sql.contains("WHERE")); + assert!(sql.contains("LIMIT ?")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_project() { + let args = SearchArgs { + project: Some("foo".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.project = ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_exit_ok() { + let args = SearchArgs { + exit: Some(ExitFilter::Ok), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.exit_code = 0")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_exit_fail() { + let args = SearchArgs { + exit: Some(ExitFilter::Fail), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.exit_code != 0")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_exit_any() { + let args = SearchArgs { + exit: Some(ExitFilter::Any), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(!sql.contains("exit_code = 0") && !sql.contains("exit_code != 0")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_duration_greater() { + let args = SearchArgs { + duration: Some(">30".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.duration_ms > ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_duration_less() { + let args = SearchArgs { + duration: Some("<5".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.duration_ms < ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_since() { + let args = SearchArgs { + since: Some("today".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.timestamp >= ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_until() { + let args = SearchArgs { + until: Some("today".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.timestamp <= ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_session() { + let args = SearchArgs { + session: Some("abc123".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.session_id = ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_one_tag() { + let args = SearchArgs { + tag: vec!["rust".into()], + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_two_tags() { + let args = SearchArgs { + tag: vec!["rust".into(), "cli".into()], + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + let count = sql + .matches("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)") + .count(); + assert_eq!(count, 2); + assert_eq!(params.len(), 3); + } + + #[test] + fn build_query_fts_single_token() { + let args = SearchArgs { + query: Some("foo".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("INNER JOIN commands_fts")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_fts_multi_token() { + let args = SearchArgs { + query: Some("foo bar".into()), + ..default_args() + }; + let (sql, _params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("INNER JOIN commands_fts")); + } + + #[test] + fn build_query_fts_hyphenated_token() { + let args = SearchArgs { + query: Some("zig-zag".into()), + ..default_args() + }; + let (_sql, params) = build_query(&args, FIXED_NOW).unwrap(); + let p0 = format!("{:?}", "\"zig-zag\""); + assert!(p0.contains("zig-zag")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_empty_query_no_fts() { + let args = SearchArgs { + query: Some(" ".into()), + ..default_args() + }; + let (sql, _) = build_query(&args, FIXED_NOW).unwrap(); + assert!(!sql.contains("INNER JOIN")); + } + + #[test] + fn build_query_combined_project_tag_fts_param_order() { + let args = SearchArgs { + query: Some("docker".into()), + project: Some("myapp".into()), + tag: vec!["infra".into()], + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("INNER JOIN commands_fts")); + assert!(sql.contains("c.project = ?")); + assert!(sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)")); + assert_eq!(params.len(), 4); + } + + fn mem_conn() -> rusqlite::Connection { + let mut c = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut c).unwrap(); + c + } + + struct SeedArgs<'a> { + cmd: &'a str, + project: &'a str, + ts: i64, + exit: i64, + dur: i64, + tags: &'a str, + session: &'a str, + } + + fn seed(conn: &rusqlite::Connection, a: SeedArgs<'_>) { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ + VALUES(?1, '/tmp', ?2, ?3, ?4, ?5, ?6, ?7)", + rusqlite::params![a.cmd, a.project, a.session, a.ts, a.exit, a.dur, a.tags], + ).unwrap(); + } + + fn s<'a>( + cmd: &'a str, + project: &'a str, + ts: i64, + exit: i64, + dur: i64, + tags: &'a str, + session: &'a str, + ) -> SeedArgs<'a> { + SeedArgs { + cmd, + project, + ts, + exit, + dur, + tags, + session, + } + } + + #[test] + fn execute_no_filters_returns_all_ordered_desc() { + let conn = mem_conn(); + seed(&conn, s("cmd_a", "proj", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("cmd_b", "proj", 2_000, 0, 200, "[]", "s1")); + seed(&conn, s("cmd_c", "proj", 3_000, 0, 300, "[]", "s1")); + let args = default_args(); + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 3); + assert_eq!(rows[0].command, "cmd_c"); + assert_eq!(rows[2].command, "cmd_a"); + } + + #[test] + fn execute_project_filter() { + let conn = mem_conn(); + seed(&conn, s("cmd_a", "alpha", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("cmd_b", "beta", 2_000, 0, 200, "[]", "s1")); + seed(&conn, s("cmd_c", "alpha", 3_000, 0, 300, "[]", "s1")); + let args = SearchArgs { + project: Some("alpha".into()), + ..default_args() + }; + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 2); + assert!(rows.iter().all(|r| r.project == "alpha")); + } + + #[test] + fn execute_exit_fail_filter() { + let conn = mem_conn(); + seed(&conn, s("ok_cmd", "p", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("fail_cmd", "p", 2_000, 1, 200, "[]", "s1")); + let args = SearchArgs { + exit: Some(ExitFilter::Fail), + ..default_args() + }; + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "fail_cmd"); + } + + #[test] + fn execute_since_filter() { + let conn = mem_conn(); + seed(&conn, s("old_cmd", "p", 100, 0, 100, "[]", "s1")); + seed(&conn, s("new_cmd", "p", 1_700_000_000, 0, 100, "[]", "s1")); + let args = SearchArgs { + since: Some("2020-01-01".into()), + ..default_args() + }; + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "new_cmd"); + } + + #[test] + fn execute_tag_filter() { + let conn = mem_conn(); + seed(&conn, s("tagged", "p", 1_000, 0, 100, r#"["rust"]"#, "s1")); + seed(&conn, s("plain", "p", 2_000, 0, 100, "[]", "s1")); + let args = SearchArgs { + tag: vec!["rust".into()], + ..default_args() + }; + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "tagged"); + } + + #[test] + fn execute_limit() { + let conn = mem_conn(); + for i in 0i64..5 { + seed( + &conn, + s(&format!("cmd_{i}"), "p", i * 1000, 0, 100, "[]", "s1"), + ); + } + let args = SearchArgs { + limit: 2, + ..default_args() + }; + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 2); + } + + #[test] + fn execute_fts_query() { + let conn = mem_conn(); + if !crate::database::fts5_available(&conn) { + return; + } + seed(&conn, s("docker run nginx", "p", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("ls -la", "p", 2_000, 0, 100, "[]", "s1")); + let args = SearchArgs { + query: Some("docker".into()), + ..default_args() + }; + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "docker run nginx"); + } + + #[test] + fn fmt_timestamp_known_value() { + let result = fmt_timestamp(1_700_000_000); + assert_eq!(result, "2023-11-14 22:13"); + } + + #[test] + fn fmt_duration_ms() { + assert_eq!(fmt_duration(500), "500ms"); + } + + #[test] + fn fmt_duration_exactly_1s() { + assert_eq!(fmt_duration(1000), "1s"); + } + + #[test] + fn fmt_duration_2s() { + assert_eq!(fmt_duration(2000), "2s"); + } + + #[test] + fn fmt_duration_decimal() { + assert_eq!(fmt_duration(2300), "2.3s"); + } + + #[test] + fn exit_glyph_zero_contains_check() { + let cell = exit_cell(0); + let s = format!("{:?}", cell); + assert!( + s.contains('\u{2713}') || s.contains("2713") || cell.content().contains('\u{2713}') + ); + } + + #[test] + fn exit_glyph_nonzero_contains_cross() { + let cell = exit_cell(1); + assert!(cell.content().contains('\u{2717}')); + } + + fn fixture_rows() -> Vec { + vec![ + CommandRow { + timestamp: 1_700_000_000, + project: "alpha".into(), + tags: r#"["rust"]"#.into(), + exit_code: 0, + duration_ms: 500, + directory: "/home/user/alpha".into(), + command: "cargo build".into(), + session_id: "session-aaa".into(), + }, + CommandRow { + timestamp: 1_700_001_000, + project: "beta".into(), + tags: "[]".into(), + exit_code: 1, + duration_ms: 2300, + directory: "/home/user/beta".into(), + command: "make test".into(), + session_id: "session-bbb".into(), + }, + ] + } + + #[test] + fn render_normal_contains_headers_and_commands() { + let rows = fixture_rows(); + let out = render(&rows, false); + assert!(out.contains("timestamp")); + assert!(out.contains("command")); + assert!(out.contains("project")); + assert!(out.contains("cargo build")); + assert!(out.contains("make test")); + assert!(out.contains("2 result(s)")); + } + + #[test] + fn render_show_session_contains_separator() { + let rows = vec![ + CommandRow { + timestamp: 1_700_000_000, + project: "alpha".into(), + tags: "[]".into(), + exit_code: 0, + duration_ms: 100, + directory: "/tmp".into(), + command: "cmd_a".into(), + session_id: "session-aaa".into(), + }, + CommandRow { + timestamp: 1_700_001_000, + project: "alpha".into(), + tags: "[]".into(), + exit_code: 0, + duration_ms: 200, + directory: "/tmp".into(), + command: "cmd_b".into(), + session_id: "session-aaa".into(), + }, + CommandRow { + timestamp: 1_700_002_000, + project: "beta".into(), + tags: "[]".into(), + exit_code: 1, + duration_ms: 500, + directory: "/tmp".into(), + command: "cmd_c".into(), + session_id: "session-bbb".into(), + }, + ]; + let out = render(&rows, true); + assert!(out.contains("---")); + assert!(out.contains("session-")); + assert!(out.contains("cmd_a")); + assert!(out.contains("cmd_c")); + assert!(!out.contains("project") || out.contains("session-a")); + } + + #[test] + fn render_empty_rows_does_not_panic() { + let out = render(&[], false); + assert!(!out.is_empty()); + } +} From 7f35797231f697df7ac26d73b26fd69ddaa57ce2 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 15:15:09 -0600 Subject: [PATCH 027/151] feat(search): add SearchArgs, Cmd::Search arm, comfy-table dep, render (T5-T8) (#7) --- src/cli.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/cli.rs b/src/cli.rs index cbbed6e..4f04acf 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,5 +1,6 @@ use clap::{Parser, Subcommand}; use std::path::PathBuf; +use std::time::{SystemTime, UNIX_EPOCH}; #[derive(Parser)] #[command(name = "tth")] @@ -14,6 +15,7 @@ pub enum Cmd { Install(InstallArgs), Uninstall(UninstallArgs), Status, + Search(SearchArgs), #[command(hide = true)] NewSessionId, } @@ -44,6 +46,29 @@ pub struct InstallArgs { pub rc_file: Option, } +#[derive(clap::Args, Debug, Clone)] +pub struct SearchArgs { + pub query: Option, + #[arg(short = 'p', long)] + pub project: Option, + #[arg(short = 't', long, action = clap::ArgAction::Append)] + pub tag: Vec, + #[arg(long)] + pub exit: Option, + #[arg(long)] + pub duration: Option, + #[arg(long)] + pub since: Option, + #[arg(long)] + pub until: Option, + #[arg(long)] + pub session: Option, + #[arg(long, default_value_t = 50)] + pub limit: usize, + #[arg(long = "show-session", default_value_t = false)] + pub show_session: bool, +} + #[derive(clap::Args, Debug, Clone)] pub struct UninstallArgs { #[arg(long = "keep-data")] @@ -136,6 +161,15 @@ pub fn run() -> Result<(), crate::error::ThothError> { println!("Session ID set: {}", report.session_id_set); println!("tth on PATH: {}", report.tth_on_path); } + Cmd::Search(args) => { + let conn = crate::database::get_connection(None)?; + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64; + let rows = crate::search::execute(&args, &conn, now)?; + print!("{}", crate::search::render(&rows, args.show_session)); + } Cmd::NewSessionId => { println!("{}", uuid::Uuid::new_v4()); } From 7fa5c1823c37f1efd4085dc8b311e066c692b3e5 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 15:18:46 -0600 Subject: [PATCH 028/151] test(search): add E2E assert_cmd tests for tth search (T9) (#7) --- tests/search_e2e.rs | 249 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 tests/search_e2e.rs diff --git a/tests/search_e2e.rs b/tests/search_e2e.rs new file mode 100644 index 0000000..bd1529b --- /dev/null +++ b/tests/search_e2e.rs @@ -0,0 +1,249 @@ +use assert_cmd::Command; +use tempfile::TempDir; + +fn tth() -> Command { + Command::cargo_bin("tth").unwrap() +} + +struct RecordInput<'a> { + cmd: &'a str, + dir: &'a str, + exit: i64, + dur: i64, + tags: &'a str, + ts: i64, +} + +fn record(db: &str, log: &str, r: RecordInput<'_>) { + tth() + .env("THOTH_DB", db) + .env("THOTH_ERROR_LOG", log) + .args([ + "record", + "--cmd", + r.cmd, + "--dir", + r.dir, + "--exit", + &r.exit.to_string(), + "--duration", + &r.dur.to_string(), + "--tags", + r.tags, + "--timestamp", + &r.ts.to_string(), + ]) + .assert() + .code(0); +} + +struct Fixture { + _dir: TempDir, + db: String, + log: String, + _alpha_dir: String, + _beta_dir: String, +} + +fn setup() -> Fixture { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db").to_string_lossy().to_string(); + let log = dir.path().join("error.log").to_string_lossy().to_string(); + + let alpha = dir.path().join("alpha"); + let beta = dir.path().join("beta"); + std::fs::create_dir_all(alpha.join(".git")).unwrap(); + std::fs::create_dir_all(beta.join(".git")).unwrap(); + + let alpha_str = alpha.to_string_lossy().to_string(); + let beta_str = beta.to_string_lossy().to_string(); + + record( + &db, + &log, + RecordInput { + cmd: "cargo build", + dir: &alpha_str, + exit: 0, + dur: 1200, + tags: r#"["rust"]"#, + ts: 1_700_000_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "make test", + dir: &beta_str, + exit: 1, + dur: 500, + tags: "[]", + ts: 1_700_001_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "docker run nginx", + dir: &alpha_str, + exit: 0, + dur: 3000, + tags: r#"["docker","infra"]"#, + ts: 1_700_002_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "ls -la", + dir: &beta_str, + exit: 0, + dur: 50, + tags: "[]", + ts: 1_700_003_000, + }, + ); + + Fixture { + _dir: dir, + db, + log, + _alpha_dir: alpha_str, + _beta_dir: beta_str, + } +} + +#[test] +fn search_no_filters_exits_0_and_shows_commands() { + let f = setup(); + tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search"]) + .assert() + .code(0) + .stdout(predicates::str::contains("cargo build")); +} + +#[test] +fn search_project_filter_includes_and_excludes() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--project", "alpha"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.contains("cargo build"), + "expected cargo build in output" + ); + assert!( + !text.contains("make test"), + "expected make test to be excluded" + ); +} + +#[test] +fn search_exit_fail_filter() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--exit", "fail"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!(text.contains("make test")); + assert!(!text.contains("cargo build")); +} + +#[test] +fn search_tag_filter() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--tag", "rust"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!(text.contains("cargo build")); + assert!(!text.contains("make test")); +} + +#[test] +fn search_duration_valid_exits_0() { + let f = setup(); + tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--duration", ">0"]) + .assert() + .code(0); +} + +#[test] +fn search_duration_bad_exits_nonzero_with_error() { + let f = setup(); + let cmd_out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--duration", "bad"]) + .output() + .unwrap(); + assert!(!cmd_out.status.success(), "expected non-zero exit"); + let combined = format!( + "{}{}", + String::from_utf8_lossy(&cmd_out.stdout), + String::from_utf8_lossy(&cmd_out.stderr) + ); + assert!( + combined.contains("duration") || combined.contains("bad") || combined.contains("Error"), + "expected error text, got: {combined}" + ); +} + +#[test] +fn search_since_bad_date_exits_nonzero() { + let f = setup(); + let cmd_out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--since", "bad-date"]) + .output() + .unwrap(); + assert!( + !cmd_out.status.success(), + "expected non-zero exit for bad date" + ); +} + +#[test] +fn search_show_session_exits_0_with_separator() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--show-session"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!(text.contains("---"), "expected session separator in output"); +} From a3ef4d83ceb873ac8eadd66c19d416ca10cf3c0c Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 16:23:45 -0600 Subject: [PATCH 029/151] test(search): replace tautological FTS hyphen-quoting test with integration test (#7) --- src/search.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/search.rs b/src/search.rs index 58c04ff..b6c2125 100644 --- a/src/search.rs +++ b/src/search.rs @@ -607,15 +607,20 @@ mod tests { } #[test] - fn build_query_fts_hyphenated_token() { + fn build_query_fts_hyphenated_token_integration() { + let conn = mem_conn(); + if !crate::database::fts5_available(&conn) { + return; + } + seed(&conn, s("docker-compose up", "p", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("ls -la", "p", 2_000, 0, 100, "[]", "s1")); let args = SearchArgs { - query: Some("zig-zag".into()), + query: Some("docker-compose".into()), ..default_args() }; - let (_sql, params) = build_query(&args, FIXED_NOW).unwrap(); - let p0 = format!("{:?}", "\"zig-zag\""); - assert!(p0.contains("zig-zag")); - assert_eq!(params.len(), 2); + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "docker-compose up"); } #[test] From 17c9ea00d503c4f0723de69595f613a9139ad13f Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 16:25:02 -0600 Subject: [PATCH 030/151] fix(search): validate day-of-month range in parse_ymd per actual month length (#7) --- src/search.rs | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/search.rs b/src/search.rs index b6c2125..bed8011 100644 --- a/src/search.rs +++ b/src/search.rs @@ -75,10 +75,34 @@ fn parse_ymd(s: &str) -> Result { return Err(ThothError::Search(format!("invalid date: {s}"))); } + let max_day = month_max_day(year, month); + if day > max_day { + return Err(ThothError::Search(format!("invalid date: {s}"))); + } + let days = days_since_epoch(year, month, day); Ok(days * SECS_PER_DAY) } +fn is_leap_year(year: i64) -> bool { + (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 +} + +fn month_max_day(year: i64, month: i64) -> i64 { + match month { + 1 | 3 | 5 | 7 | 8 | 10 | 12 => 31, + 4 | 6 | 9 | 11 => 30, + 2 => { + if is_leap_year(year) { + 29 + } else { + 28 + } + } + _ => 0, + } +} + fn days_since_epoch(year: i64, month: i64, day: i64) -> i64 { let (y, m) = if month <= 2 { (year - 1, month + 12) @@ -447,6 +471,32 @@ mod tests { assert!(parse_date("2024-13-01", FIXED_NOW).is_err()); } + #[test] + fn parse_date_feb_31_is_err() { + assert!(parse_date("2024-02-31", FIXED_NOW).is_err()); + } + + #[test] + fn parse_date_feb_29_non_leap_is_err() { + assert!(parse_date("2023-02-29", FIXED_NOW).is_err()); + } + + #[test] + fn parse_date_feb_29_leap_is_ok() { + assert!(parse_date("2024-02-29", FIXED_NOW).is_ok()); + } + + #[test] + fn parse_date_april_31_is_err() { + assert!(parse_date("2024-04-31", FIXED_NOW).is_err()); + } + + #[test] + fn parse_date_valid_ymd_returns_epoch() { + let result = parse_date("2024-01-01", FIXED_NOW).unwrap(); + assert_eq!(result, days_since_epoch(2024, 1, 1) * SECS_PER_DAY); + } + #[test] fn exit_filter_eq() { assert_eq!(ExitFilter::Ok, ExitFilter::Ok); @@ -612,7 +662,10 @@ mod tests { if !crate::database::fts5_available(&conn) { return; } - seed(&conn, s("docker-compose up", "p", 1_000, 0, 100, "[]", "s1")); + seed( + &conn, + s("docker-compose up", "p", 1_000, 0, 100, "[]", "s1"), + ); seed(&conn, s("ls -la", "p", 2_000, 0, 100, "[]", "s1")); let args = SearchArgs { query: Some("docker-compose".into()), From 3ab661678fa79bf22ad8754177daf07b17653ff6 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 16:26:42 -0600 Subject: [PATCH 031/151] fix(search): add result count to render_by_session and strengthen show-session test (#7) --- src/search.rs | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/search.rs b/src/search.rs index bed8011..e207a6f 100644 --- a/src/search.rs +++ b/src/search.rs @@ -323,6 +323,7 @@ fn render_by_session(rows: &[CommandRow]) -> String { i += 1; } + output.push_str(&format!("{} result(s)\n", rows.len())); output } @@ -928,15 +929,15 @@ mod tests { } #[test] - fn render_show_session_contains_separator() { + fn render_show_session_reduced_columns_two_sessions() { let rows = vec![ CommandRow { timestamp: 1_700_000_000, project: "alpha".into(), - tags: "[]".into(), + tags: r#"["rust"]"#.into(), exit_code: 0, duration_ms: 100, - directory: "/tmp".into(), + directory: "/home/user/alpha".into(), command: "cmd_a".into(), session_id: "session-aaa".into(), }, @@ -946,7 +947,7 @@ mod tests { tags: "[]".into(), exit_code: 0, duration_ms: 200, - directory: "/tmp".into(), + directory: "/home/user/alpha".into(), command: "cmd_b".into(), session_id: "session-aaa".into(), }, @@ -956,17 +957,46 @@ mod tests { tags: "[]".into(), exit_code: 1, duration_ms: 500, - directory: "/tmp".into(), + directory: "/home/user/beta".into(), command: "cmd_c".into(), session_id: "session-bbb".into(), }, ]; let out = render(&rows, true); - assert!(out.contains("---")); - assert!(out.contains("session-")); + let headers_count = out.matches("---").count(); + assert!(headers_count >= 2, "expected two session header lines"); + let header_lines: Vec<&str> = out.lines().filter(|l| l.starts_with("---")).collect(); + assert_eq!( + header_lines.len(), + 2, + "expected exactly two session headers" + ); + assert!( + header_lines[0].contains("alpha"), + "first header should include project alpha" + ); + assert!( + header_lines[1].contains("beta"), + "second header should include project beta" + ); assert!(out.contains("cmd_a")); + assert!(out.contains("cmd_b")); assert!(out.contains("cmd_c")); - assert!(!out.contains("project") || out.contains("session-a")); + assert!(out.contains("timestamp")); + assert!(out.contains("exit")); + assert!(out.contains("duration")); + assert!(out.contains("command")); + assert!(!out.contains("tags")); + assert!(!out.contains("directory")); + assert!(out.contains("3 result(s)")); + let sub_table_lines: Vec<&str> = out + .lines() + .filter(|l| !l.starts_with("---") && l.contains("project")) + .collect(); + assert!( + sub_table_lines.is_empty(), + "project must not appear as a sub-table column header; offending lines: {sub_table_lines:?}" + ); } #[test] From 2d4d7e03241015b554618afdf7348a50fcce6ef7 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 16:27:53 -0600 Subject: [PATCH 032/151] test(search): remove trivial exit_filter_eq and add E2E content assertions (#7) --- src/search.rs | 5 -- tests/search_e2e.rs | 190 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 190 insertions(+), 5 deletions(-) diff --git a/src/search.rs b/src/search.rs index e207a6f..b49cbe2 100644 --- a/src/search.rs +++ b/src/search.rs @@ -498,11 +498,6 @@ mod tests { assert_eq!(result, days_since_epoch(2024, 1, 1) * SECS_PER_DAY); } - #[test] - fn exit_filter_eq() { - assert_eq!(ExitFilter::Ok, ExitFilter::Ok); - } - #[test] fn build_query_no_filters() { let args = default_args(); diff --git a/tests/search_e2e.rs b/tests/search_e2e.rs index bd1529b..4d74e46 100644 --- a/tests/search_e2e.rs +++ b/tests/search_e2e.rs @@ -247,3 +247,193 @@ fn search_show_session_exits_0_with_separator() { let text = String::from_utf8_lossy(&out); assert!(text.contains("---"), "expected session separator in output"); } + +fn setup_duration_boundary() -> Fixture { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db").to_string_lossy().to_string(); + let log = dir.path().join("error.log").to_string_lossy().to_string(); + let alpha = dir.path().join("alpha"); + std::fs::create_dir_all(alpha.join(".git")).unwrap(); + let alpha_str = alpha.to_string_lossy().to_string(); + let beta = dir.path().join("beta"); + std::fs::create_dir_all(beta.join(".git")).unwrap(); + let beta_str = beta.to_string_lossy().to_string(); + + record( + &db, + &log, + RecordInput { + cmd: "fast_cmd", + dir: &alpha_str, + exit: 0, + dur: 999, + tags: "[]", + ts: 1_700_000_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "slow_cmd", + dir: &alpha_str, + exit: 0, + dur: 3200, + tags: "[]", + ts: 1_700_001_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "both_tags_cmd", + dir: &alpha_str, + exit: 0, + dur: 500, + tags: r#"["tagA","tagB"]"#, + ts: 1_700_002_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "only_tagA_cmd", + dir: &beta_str, + exit: 0, + dur: 500, + tags: r#"["tagA"]"#, + ts: 1_700_003_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "session2_cmd", + dir: &beta_str, + exit: 0, + dur: 200, + tags: "[]", + ts: 1_700_010_000, + }, + ); + + Fixture { + _dir: dir, + db, + log, + _alpha_dir: alpha_str, + _beta_dir: beta_str, + } +} + +#[test] +fn search_duration_boundary_include_exclude() { + let f = setup_duration_boundary(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--duration", ">1"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.contains("slow_cmd"), + "slow_cmd (3200ms) should be included by >1s filter" + ); + assert!( + !text.contains("fast_cmd"), + "fast_cmd (999ms) should be excluded by >1s filter" + ); +} + +#[test] +fn search_tag_and_filter_requires_both() { + let f = setup_duration_boundary(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["search", "--tag", "tagA", "--tag", "tagB"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.contains("both_tags_cmd"), + "row with both tagA and tagB should be included" + ); + assert!( + !text.contains("only_tagA_cmd"), + "row with only tagA should be excluded by AND filter" + ); +} + +#[test] +fn search_show_session_two_sessions_shows_two_headers() { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db").to_string_lossy().to_string(); + let log = dir.path().join("error.log").to_string_lossy().to_string(); + let alpha = dir.path().join("alpha"); + std::fs::create_dir_all(alpha.join(".git")).unwrap(); + let alpha_str = alpha.to_string_lossy().to_string(); + let beta = dir.path().join("beta"); + std::fs::create_dir_all(beta.join(".git")).unwrap(); + let beta_str = beta.to_string_lossy().to_string(); + + record( + &db, + &log, + RecordInput { + cmd: "session1_cmd", + dir: &alpha_str, + exit: 0, + dur: 100, + tags: "[]", + ts: 1_700_000_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "session2_cmd", + dir: &beta_str, + exit: 0, + dur: 200, + tags: "[]", + ts: 1_700_100_000, + }, + ); + + let out = tth() + .env("THOTH_DB", &db) + .env("THOTH_ERROR_LOG", &log) + .args(["search", "--show-session"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + let header_count = text.lines().filter(|l| l.starts_with("---")).count(); + assert_eq!( + header_count, 2, + "expected two session headers; got: {header_count}\noutput:\n{text}" + ); + assert!( + text.contains("session1_cmd"), + "session1_cmd must appear in output" + ); + assert!( + text.contains("session2_cmd"), + "session2_cmd must appear in output" + ); + assert!(text.contains("2 result(s)"), "count line must be present"); +} From 9343f7208700b8846d45ecbaf5dc82d22c91ad9a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 20:07:29 -0600 Subject: [PATCH 033/151] fix(database): double-check version inside BEGIN IMMEDIATE to eliminate migration race (#9) Re-read schema_version inside each BEGIN IMMEDIATE transaction so that a process losing the write-lock race sees the already-bumped version and skips the ALTER, preventing the duplicate-column error that silently dropped concurrent records. Also switch record_inner to BEGIN IMMEDIATE to avoid WAL snapshot busy failures under high writer concurrency. --- src/database.rs | 109 ++++++++++++++++++++++++++++++++++++++++++++---- src/recorder.rs | 4 +- 2 files changed, 103 insertions(+), 10 deletions(-) diff --git a/src/database.rs b/src/database.rs index 3ecd08e..c307cf7 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,6 +1,6 @@ use crate::error::ThothError; use crate::schema::{SCHEMA_V1, SCHEMA_V2_FTS, SCHEMA_V3_TERMINAL_ID}; -use rusqlite::Connection; +use rusqlite::{Connection, TransactionBehavior}; use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; @@ -51,13 +51,7 @@ pub fn fts5_available(conn: &Connection) -> bool { } pub fn apply_migrations(conn: &mut Connection) -> Result<(), ThothError> { - let ver = current_version(conn); - for &(version, sql) in MIGRATIONS { - if version <= ver { - continue; - } - if version == 2 && !fts5_available(conn) { continue; } @@ -67,7 +61,21 @@ pub fn apply_migrations(conn: &mut Connection) -> Result<(), ThothError> { .unwrap_or_default() .as_secs() as i64; - let tx = conn.transaction()?; + let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; + + let ver_now = tx + .query_row( + "SELECT COALESCE(MAX(version), 0) FROM schema_version", + [], + |row| row.get(0), + ) + .unwrap_or(0_i64); + + if version <= ver_now { + tx.rollback()?; + continue; + } + tx.execute_batch(sql)?; tx.execute( "INSERT OR IGNORE INTO schema_version(version, applied_at) VALUES(?1, ?2)", @@ -300,6 +308,91 @@ mod tests { assert_eq!(ver_before, ver_after); } + #[test] + fn concurrent_migrations_no_race() { + use std::sync::{Arc, Barrier, Mutex}; + use std::thread; + use tempfile::TempDir; + + const THREADS: usize = 12; + const ROUNDS: usize = 3; + + for _round in 0..ROUNDS { + let dir = TempDir::new().unwrap(); + let db_path = Arc::new(dir.path().join("history.db")); + + { + let init = Connection::open(db_path.as_ref()).unwrap(); + init.execute_batch(&format!( + "PRAGMA journal_mode=WAL; PRAGMA busy_timeout={};", + BUSY_TIMEOUT_MS * 5 + )) + .unwrap(); + } + + let barrier = Arc::new(Barrier::new(THREADS)); + let errors: Arc>> = Arc::new(Mutex::new(Vec::new())); + + let handles: Vec<_> = (0..THREADS) + .map(|i| { + let path = Arc::clone(&db_path); + let errs = Arc::clone(&errors); + let bar = Arc::clone(&barrier); + thread::spawn(move || { + bar.wait(); + let result = get_connection(Some(&path)); + match result { + Ok(conn) => { + let ts = 1700000000_i64 + i as i64; + let res = conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp) \ + VALUES(?1, '/tmp', 'p', 's1', ?2)", + rusqlite::params![format!("cmd-{i}"), ts], + ); + if let Err(e) = res { + errs.lock().unwrap().push(format!("thread {i} insert: {e}")); + } + } + Err(e) => { + errs.lock() + .unwrap() + .push(format!("thread {i} connect: {e}")); + } + } + }) + }) + .collect(); + + for h in handles { + h.join().unwrap(); + } + + let errs = errors.lock().unwrap(); + assert!( + errs.is_empty(), + "round {_round}: concurrent migration errors: {errs:?}" + ); + + let conn = Connection::open(db_path.as_ref()).unwrap(); + let ver: i64 = conn + .query_row( + "SELECT COALESCE(MAX(version), 0) FROM schema_version", + [], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(ver, 3, "round {_round}: schema not at final version"); + + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!( + count, THREADS as i64, + "round {_round}: expected {THREADS} rows, got {count}" + ); + } + } + #[test] fn execute_batch_smoke() { let mut conn = connect_memory().unwrap(); diff --git a/src/recorder.rs b/src/recorder.rs index 7b574da..139528c 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -3,7 +3,7 @@ use crate::error::ThothError; use crate::logging::log_error; use crate::project::infer_project; use crate::session::get_or_create; -use rusqlite::Connection; +use rusqlite::{Connection, TransactionBehavior}; pub fn normalize_tags(raw: &str) -> String { if raw.is_empty() { @@ -36,7 +36,7 @@ pub fn record_inner(args: &RecordArgs, conn: &mut Connection) -> Result<(), Thot .as_secs() as i64 }); - let tx = conn.transaction()?; + let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; let project = infer_project(&directory, &tx)?; let sid = get_or_create(&project, timestamp, &tx)?; From e39f5df68a4b1671ba1bef97a07113302b6ddb2a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 20:37:32 -0600 Subject: [PATCH 034/151] fix(database): resolve fresh-DB WAL-setup race causing SQLITE_LOCKED on concurrent opens (#9) --- src/database.rs | 64 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/src/database.rs b/src/database.rs index c307cf7..3f1c689 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,11 +1,27 @@ use crate::error::ThothError; use crate::schema::{SCHEMA_V1, SCHEMA_V2_FTS, SCHEMA_V3_TERMINAL_ID}; -use rusqlite::{Connection, TransactionBehavior}; +use rusqlite::{Connection, ErrorCode, TransactionBehavior}; use std::path::Path; -use std::time::{SystemTime, UNIX_EPOCH}; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; pub const BUSY_TIMEOUT_MS: u32 = 2000; +const WAL_SETUP_RETRIES: u32 = 40; +const WAL_SETUP_SLEEP_MS: u64 = 5; + +fn is_transient_lock(e: &rusqlite::Error) -> bool { + matches!( + e, + rusqlite::Error::SqliteFailure( + rusqlite::ffi::Error { + code: ErrorCode::DatabaseLocked | ErrorCode::DatabaseBusy, + .. + }, + _ + ) + ) +} + pub const MIGRATIONS: &[(i64, &str)] = &[ (1, SCHEMA_V1), (2, SCHEMA_V2_FTS), @@ -28,12 +44,31 @@ pub fn get_connection(path: Option<&Path>) -> Result { std::fs::create_dir_all(parent)?; } - let mut conn = Connection::open(&db_path)?; - conn.execute_batch(&format!( - "PRAGMA journal_mode=WAL; PRAGMA busy_timeout={BUSY_TIMEOUT_MS}; PRAGMA synchronous=NORMAL;" - ))?; - apply_migrations(&mut conn)?; - Ok(conn) + let mut last_err: Option = None; + for attempt in 0..WAL_SETUP_RETRIES { + let open_result = (|| -> Result { + let conn = Connection::open(&db_path)?; + conn.busy_timeout(Duration::from_millis(u64::from(BUSY_TIMEOUT_MS)))?; + conn.execute_batch("PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;")?; + Ok(conn) + })(); + + let thoth_result: Result = open_result + .map_err(ThothError::from) + .and_then(|mut c| apply_migrations(&mut c).map(|()| c)); + + match thoth_result { + Ok(c) => return Ok(c), + Err(ThothError::Sqlite(sqlite_err)) if is_transient_lock(&sqlite_err) => { + last_err = Some(sqlite_err); + if attempt + 1 < WAL_SETUP_RETRIES { + std::thread::sleep(Duration::from_millis(WAL_SETUP_SLEEP_MS)); + } + } + Err(e) => return Err(e), + } + } + Err(ThothError::from(last_err.unwrap())) } pub fn current_version(conn: &Connection) -> i64 { @@ -314,22 +349,13 @@ mod tests { use std::thread; use tempfile::TempDir; - const THREADS: usize = 12; - const ROUNDS: usize = 3; + const THREADS: usize = 16; + const ROUNDS: usize = 8; for _round in 0..ROUNDS { let dir = TempDir::new().unwrap(); let db_path = Arc::new(dir.path().join("history.db")); - { - let init = Connection::open(db_path.as_ref()).unwrap(); - init.execute_batch(&format!( - "PRAGMA journal_mode=WAL; PRAGMA busy_timeout={};", - BUSY_TIMEOUT_MS * 5 - )) - .unwrap(); - } - let barrier = Arc::new(Barrier::new(THREADS)); let errors: Arc>> = Arc::new(Mutex::new(Vec::new())); From 343e3a363f3cd4f66e004977988e1d3465b9490a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Wed, 24 Jun 2026 20:43:40 -0600 Subject: [PATCH 035/151] refactor(database): remove production unwrap in connection retry loop (#9) --- src/database.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/database.rs b/src/database.rs index 3f1c689..4ca3260 100644 --- a/src/database.rs +++ b/src/database.rs @@ -44,8 +44,8 @@ pub fn get_connection(path: Option<&Path>) -> Result { std::fs::create_dir_all(parent)?; } - let mut last_err: Option = None; - for attempt in 0..WAL_SETUP_RETRIES { + let mut attempt: u32 = 0; + loop { let open_result = (|| -> Result { let conn = Connection::open(&db_path)?; conn.busy_timeout(Duration::from_millis(u64::from(BUSY_TIMEOUT_MS)))?; @@ -60,15 +60,15 @@ pub fn get_connection(path: Option<&Path>) -> Result { match thoth_result { Ok(c) => return Ok(c), Err(ThothError::Sqlite(sqlite_err)) if is_transient_lock(&sqlite_err) => { - last_err = Some(sqlite_err); - if attempt + 1 < WAL_SETUP_RETRIES { - std::thread::sleep(Duration::from_millis(WAL_SETUP_SLEEP_MS)); + attempt += 1; + if attempt >= WAL_SETUP_RETRIES { + return Err(ThothError::from(sqlite_err)); } + std::thread::sleep(Duration::from_millis(WAL_SETUP_SLEEP_MS)); } Err(e) => return Err(e), } } - Err(ThothError::from(last_err.unwrap())) } pub fn current_version(conn: &Connection) -> i64 { From 7ad44168797f2895afda0a98c1b0dc79a303c67b Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Thu, 25 Jun 2026 01:09:35 -0600 Subject: [PATCH 036/151] fix: silence shell hook job-control noise The precmd hooks run tth record in the background, which made zsh and bash print job-control notifications ([1] PID / done) on every command, making the shell unusable. zsh now backgrounds with &! (background and disown) so no job table entry is created. bash has no &! equivalent, so the record call is wrapped in a ( ... & ) subshell, which suppresses the notification while still launching the background process. The bash record smoke test previously relied on wait to reap the background job, but the subshell grandchild is not reaped by the parent shell wait, so the test read the stub log before the async write completed. The test now polls for the stub write instead, keeping the same assertions. Closes #11 --- scripts/test_hooks.sh | 7 ++++++- shells/thoth.bash | 4 ++-- shells/thoth.zsh | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/test_hooks.sh b/scripts/test_hooks.sh index 9f68cb3..2f9a00d 100755 --- a/scripts/test_hooks.sh +++ b/scripts/test_hooks.sh @@ -74,7 +74,12 @@ STUB _THOTH_CMD='echo hello' _THOTH_START=\$EPOCHREALTIME _thoth_precmd - wait + _i=0 + while (( _i < 100 )); do + [[ -s '$stub_log' ]] && break + sleep 0.05 + _i=\$(( _i + 1 )) + done " || true local all_ok=1 diff --git a/shells/thoth.bash b/shells/thoth.bash index 444b256..0d0b60c 100644 --- a/shells/thoth.bash +++ b/shells/thoth.bash @@ -22,14 +22,14 @@ _thoth_precmd() { _THOTH_IN_PROMPT=1 [[ -n "${_THOTH_CMD:-}" ]] || { _THOTH_IN_PROMPT=0; return; } local _dur=$(( (${EPOCHREALTIME/./} - ${_THOTH_START/./}) / 1000 )) - tth record \ + ( tth record \ --cmd "$_THOTH_CMD" \ --dir "$PWD" \ --exit "$_exit" \ --duration "$_dur" \ --timestamp "$EPOCHSECONDS" \ --tags "${TTH_ACTIVE_TAGS:-[]}" \ - --terminal-id "$TTH_SESSION_ID" & + --terminal-id "$TTH_SESSION_ID" & ) _THOTH_CMD="" _THOTH_IN_PROMPT=0 } diff --git a/shells/thoth.zsh b/shells/thoth.zsh index 78ebfbf..6640dca 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -21,7 +21,7 @@ _tth_precmd() { --duration "$_dur" \ --timestamp "$EPOCHSECONDS" \ --tags "${TTH_ACTIVE_TAGS:-[]}" \ - --terminal-id "$TTH_SESSION_ID" & + --terminal-id "$TTH_SESSION_ID" &! _TTH_CMD="" } From ec6f7e7ac03d40f090a41647bddb94a8ad1f186d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 14:16:14 -0600 Subject: [PATCH 037/151] feat(tui): add relative time formatting for history display (#12) --- src/tui/time.rs | 149 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/tui/time.rs diff --git a/src/tui/time.rs b/src/tui/time.rs new file mode 100644 index 0000000..98749de --- /dev/null +++ b/src/tui/time.rs @@ -0,0 +1,149 @@ +const MINUTE: i64 = 60; +const HOUR: i64 = 60 * MINUTE; +const DAY: i64 = 24 * HOUR; +const WEEK: i64 = 7 * DAY; +const MONTH: i64 = 30 * DAY; +const YEAR: i64 = 365 * DAY; + +pub fn format_relative(epoch: i64, now: i64) -> String { + let delta = now.saturating_sub(epoch); + if delta < 10 { + return String::from("just now"); + } + if delta < MINUTE { + return format!("{}s ago", delta); + } + if delta < HOUR { + return format!("{}m ago", delta / MINUTE); + } + if delta < DAY { + return format!("{}h ago", delta / HOUR); + } + if delta < WEEK { + return format!("{}d ago", delta / DAY); + } + if delta < MONTH { + return format!("{}w ago", delta / WEEK); + } + if delta < YEAR { + return format!("{}mo ago", delta / MONTH); + } + format!("{}y ago", delta / YEAR) +} + +#[cfg(test)] +mod tests { + use super::*; + + const NOW: i64 = 1_000_000_000; + + #[test] + fn future_clamps_to_just_now() { + assert_eq!(format_relative(NOW + 100, NOW), "just now"); + } + + #[test] + fn zero_delta_is_just_now() { + assert_eq!(format_relative(NOW, NOW), "just now"); + } + + #[test] + fn nine_seconds_is_just_now() { + assert_eq!(format_relative(NOW - 9, NOW), "just now"); + } + + #[test] + fn ten_seconds_is_seconds() { + assert_eq!(format_relative(NOW - 10, NOW), "10s ago"); + } + + #[test] + fn fifty_nine_seconds_is_seconds() { + assert_eq!(format_relative(NOW - 59, NOW), "59s ago"); + } + + #[test] + fn sixty_seconds_is_one_minute() { + assert_eq!(format_relative(NOW - MINUTE, NOW), "1m ago"); + } + + #[test] + fn three_minutes() { + assert_eq!(format_relative(NOW - 3 * MINUTE, NOW), "3m ago"); + } + + #[test] + fn fifty_nine_minutes() { + assert_eq!(format_relative(NOW - 59 * MINUTE, NOW), "59m ago"); + } + + #[test] + fn one_hour() { + assert_eq!(format_relative(NOW - HOUR, NOW), "1h ago"); + } + + #[test] + fn two_hours() { + assert_eq!(format_relative(NOW - 2 * HOUR, NOW), "2h ago"); + } + + #[test] + fn twenty_three_hours() { + assert_eq!(format_relative(NOW - 23 * HOUR, NOW), "23h ago"); + } + + #[test] + fn one_day() { + assert_eq!(format_relative(NOW - DAY, NOW), "1d ago"); + } + + #[test] + fn five_days() { + assert_eq!(format_relative(NOW - 5 * DAY, NOW), "5d ago"); + } + + #[test] + fn six_days() { + assert_eq!(format_relative(NOW - 6 * DAY, NOW), "6d ago"); + } + + #[test] + fn one_week() { + assert_eq!(format_relative(NOW - WEEK, NOW), "1w ago"); + } + + #[test] + fn three_weeks() { + assert_eq!(format_relative(NOW - 3 * WEEK, NOW), "3w ago"); + } + + #[test] + fn one_day_before_month_boundary() { + assert_eq!(format_relative(NOW - (MONTH - DAY), NOW), "4w ago"); + } + + #[test] + fn one_month() { + assert_eq!(format_relative(NOW - MONTH, NOW), "1mo ago"); + } + + #[test] + fn six_months() { + assert_eq!(format_relative(NOW - 6 * MONTH, NOW), "6mo ago"); + } + + #[test] + fn eleven_months() { + assert_eq!(format_relative(NOW - 11 * MONTH, NOW), "11mo ago"); + } + + #[test] + fn one_year() { + assert_eq!(format_relative(NOW - YEAR, NOW), "1y ago"); + } + + #[test] + fn two_years() { + assert_eq!(format_relative(NOW - 2 * YEAR, NOW), "2y ago"); + } +} From 7bd7d03fc49de894dc098a5e208f1c55c14367b4 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 14:16:16 -0600 Subject: [PATCH 038/151] feat(tui): launch interactive TUI on bare tth with terminal restore (#12) --- Cargo.lock | 405 +++++++++++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 2 + src/cli.rs | 29 ++-- src/error.rs | 2 + src/lib.rs | 1 + src/tui/mod.rs | 110 ++++++++++++++ 6 files changed, 525 insertions(+), 24 deletions(-) create mode 100644 src/tui/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 8735934..b6b80ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anstream" version = "1.0.0" @@ -59,7 +65,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -70,7 +76,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -117,6 +123,21 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" version = "1.2.65" @@ -185,9 +206,39 @@ version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" dependencies = [ - "crossterm", + "crossterm 0.29.0", "unicode-segmentation", - "unicode-width", + "unicode-width 0.2.0", +] + +[[package]] +name = "compact_str" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + +[[package]] +name = "crossterm" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags", + "crossterm_winapi", + "mio", + "parking_lot", + "rustix 0.38.44", + "signal-hook", + "signal-hook-mio", + "winapi", ] [[package]] @@ -200,7 +251,7 @@ dependencies = [ "crossterm_winapi", "document-features", "parking_lot", - "rustix", + "rustix 1.1.4", "winapi", ] @@ -213,6 +264,40 @@ dependencies = [ "winapi", ] +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "difflib" version = "0.4.0" @@ -228,6 +313,12 @@ dependencies = [ "litrs", ] +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + [[package]] name = "equivalent" version = "1.0.2" @@ -241,7 +332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -277,6 +368,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "futures-core" version = "0.3.32" @@ -321,6 +418,17 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "hashbrown" version = "0.17.1" @@ -342,6 +450,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "indexmap" version = "2.14.0" @@ -352,12 +466,43 @@ dependencies = [ "hashbrown 0.17.1", ] +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "instability" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" +dependencies = [ + "darling", + "indoc", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -392,6 +537,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -413,12 +564,39 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "memchr" version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.61.2", +] + [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -469,6 +647,12 @@ dependencies = [ "windows-link", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pin-project-lite" version = "0.2.17" @@ -535,6 +719,27 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "ratatui" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" +dependencies = [ + "bitflags", + "cassowary", + "compact_str", + "crossterm 0.28.1", + "indoc", + "instability", + "itertools", + "lru", + "paste", + "strum", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.2.0", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -587,6 +792,19 @@ dependencies = [ "smallvec", ] +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.1.4" @@ -596,8 +814,8 @@ dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys", - "windows-sys", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", ] [[package]] @@ -606,6 +824,12 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + [[package]] name = "scopeguard" version = "1.2.0" @@ -669,6 +893,37 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + [[package]] name = "slab" version = "0.4.12" @@ -681,12 +936,40 @@ version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + [[package]] name = "syn" version = "2.0.118" @@ -707,8 +990,8 @@ dependencies = [ "fastrand", "getrandom", "once_cell", - "rustix", - "windows-sys", + "rustix 1.1.4", + "windows-sys 0.61.2", ] [[package]] @@ -744,7 +1027,9 @@ dependencies = [ "assert_cmd", "clap", "comfy-table", + "crossterm 0.28.1", "predicates", + "ratatui", "rusqlite", "serde_json", "tempfile", @@ -806,11 +1091,28 @@ version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools", + "unicode-segmentation", + "unicode-width 0.1.14", +] + [[package]] name = "unicode-width" -version = "0.2.2" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "utf8parse" @@ -850,6 +1152,12 @@ dependencies = [ "libc", ] +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasm-bindgen" version = "0.2.125" @@ -923,6 +1231,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -932,6 +1249,70 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "winnow" version = "0.7.15" diff --git a/Cargo.toml b/Cargo.toml index 7b75de1..dc5cb28 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,8 @@ uuid = { version = "1", features = ["v4"] } toml = "0.8" serde_json = "1" comfy-table = "7" +ratatui = "0.29" +crossterm = "0.28" [dev-dependencies] tempfile = "3" diff --git a/src/cli.rs b/src/cli.rs index 4f04acf..7aed029 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -3,10 +3,10 @@ use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; #[derive(Parser)] -#[command(name = "tth")] +#[command(name = "tth", arg_required_else_help = false)] pub struct Cli { #[command(subcommand)] - pub cmd: Cmd, + pub cmd: Option, } #[derive(Subcommand)] @@ -81,8 +81,17 @@ pub fn run() -> Result<(), crate::error::ThothError> { use clap::Parser; let cli = Cli::parse(); + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64; + match cli.cmd { - Cmd::Record(mut args) => { + None => { + let conn = crate::database::get_connection(None)?; + crate::tui::run(&conn, now)?; + } + Some(Cmd::Record(mut args)) => { crate::logging::setup(crate::paths::resolve_error_log()); if args.dir.is_none() { args.dir = std::env::current_dir() @@ -102,7 +111,7 @@ pub fn run() -> Result<(), crate::error::ThothError> { Err(e) => crate::logging::log_error(&e.to_string()), } } - Cmd::Install(args) => { + Some(Cmd::Install(args)) => { let shell_env = std::env::var("SHELL").ok(); let shell = crate::hooks::detect_shell(args.shell.as_deref(), shell_env.as_deref())?; let rc_path = if let Some(p) = args.rc_file { @@ -119,7 +128,7 @@ pub fn run() -> Result<(), crate::error::ThothError> { } println!("Reload shell: {}", report.reload_cmd); } - Cmd::Uninstall(args) => { + Some(Cmd::Uninstall(args)) => { let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); let rc_path = if let Some(p) = args.rc_file { p @@ -138,7 +147,7 @@ pub fn run() -> Result<(), crate::error::ThothError> { println!("No hooks found in {}", rc_path.display()); } } - Cmd::Status => { + Some(Cmd::Status) => { let conn = crate::database::get_connection(None)?; let shell_env = std::env::var("SHELL").ok(); let shell = crate::hooks::detect_shell(None, shell_env.as_deref()) @@ -161,16 +170,12 @@ pub fn run() -> Result<(), crate::error::ThothError> { println!("Session ID set: {}", report.session_id_set); println!("tth on PATH: {}", report.tth_on_path); } - Cmd::Search(args) => { + Some(Cmd::Search(args)) => { let conn = crate::database::get_connection(None)?; - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_default() - .as_secs() as i64; let rows = crate::search::execute(&args, &conn, now)?; print!("{}", crate::search::render(&rows, args.show_session)); } - Cmd::NewSessionId => { + Some(Cmd::NewSessionId) => { println!("{}", uuid::Uuid::new_v4()); } } diff --git a/src/error.rs b/src/error.rs index a14955d..daf74e0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -8,6 +8,8 @@ pub enum ThothError { Hook(String), #[error("{0}")] Search(String), + #[error("tui: {0}")] + Tui(String), } #[cfg(test)] diff --git a/src/lib.rs b/src/lib.rs index dfd96e1..3718b7c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,3 +9,4 @@ pub mod recorder; pub mod schema; pub mod search; pub mod session; +pub mod tui; diff --git a/src/tui/mod.rs b/src/tui/mod.rs new file mode 100644 index 0000000..0ee3004 --- /dev/null +++ b/src/tui/mod.rs @@ -0,0 +1,110 @@ +pub mod time; + +use std::fs::OpenOptions; +use std::panic; + +use crossterm::{ + event::{self, Event, KeyCode, KeyModifiers}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +}; +use ratatui::{ + backend::CrosstermBackend, + layout::{Alignment, Constraint, Direction, Layout}, + widgets::{Block, Borders, Paragraph}, + Terminal, +}; +use rusqlite::Connection; + +use crate::error::ThothError; + +struct TerminalGuard; + +impl TerminalGuard { + fn new() -> Result { + let mut tty = OpenOptions::new() + .write(true) + .open("/dev/tty") + .map_err(|e| ThothError::Tui(format!("cannot open /dev/tty for restore: {e}")))?; + enable_raw_mode().map_err(|e| ThothError::Tui(format!("enable_raw_mode failed: {e}")))?; + execute!(tty, EnterAlternateScreen) + .map_err(|e| ThothError::Tui(format!("EnterAlternateScreen failed: {e}")))?; + Ok(Self) + } +} + +impl Drop for TerminalGuard { + fn drop(&mut self) { + let _ = disable_raw_mode(); + if let Ok(mut tty) = OpenOptions::new().write(true).open("/dev/tty") { + let _ = execute!(tty, LeaveAlternateScreen); + } + } +} + +fn history_count(conn: &Connection) -> i64 { + conn.query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap_or(0) +} + +pub fn run(conn: &Connection, _now: i64) -> Result<(), ThothError> { + let tty = OpenOptions::new() + .read(true) + .write(true) + .open("/dev/tty") + .map_err(|e| ThothError::Tui(format!("cannot open /dev/tty: {e}")))?; + + let prev_hook = panic::take_hook(); + panic::set_hook(Box::new(move |info| { + let _ = disable_raw_mode(); + if let Ok(mut t) = OpenOptions::new().write(true).open("/dev/tty") { + let _ = execute!(t, LeaveAlternateScreen); + } + prev_hook(info); + })); + + let _guard = TerminalGuard::new()?; + + let backend = CrosstermBackend::new(tty); + let mut terminal = Terminal::new(backend) + .map_err(|e| ThothError::Tui(format!("terminal init failed: {e}")))?; + + let count = history_count(conn); + + loop { + terminal + .draw(|f| { + let area = f.area(); + let chunks = Layout::default() + .direction(Direction::Vertical) + .constraints([Constraint::Min(3), Constraint::Length(1)]) + .split(area); + + let block = Block::default().title(" Thoth ").borders(Borders::ALL); + let inner = block.inner(chunks[0]); + f.render_widget(block, chunks[0]); + + let body = + Paragraph::new(format!("History count: {count}\n\npress q or Esc to quit")) + .alignment(Alignment::Left); + f.render_widget(body, inner); + }) + .map_err(|e| ThothError::Tui(format!("draw failed: {e}")))?; + + if event::poll(std::time::Duration::from_millis(200)) + .map_err(|e| ThothError::Tui(format!("event poll failed: {e}")))? + { + if let Event::Key(key) = + event::read().map_err(|e| ThothError::Tui(format!("event read failed: {e}")))? + { + match key.code { + KeyCode::Char('q') | KeyCode::Esc => break, + KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => break, + _ => {} + } + } + } + } + + Ok(()) +} From c4bffbf69859e08dd9ba55787310174a0541faa8 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 14:43:28 -0600 Subject: [PATCH 039/151] feat(tui): add nucleo-matcher fuzzy ranking module (#12) --- Cargo.lock | 11 ++++++ Cargo.toml | 1 + src/tui/fuzzy.rs | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 src/tui/fuzzy.rs diff --git a/Cargo.lock b/Cargo.lock index b6b80ff..b33f24b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -603,6 +603,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "nucleo-matcher" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf33f538733d1a5a3494b836ba913207f14d9d4a1d3cd67030c5061bdd2cac85" +dependencies = [ + "memchr", + "unicode-segmentation", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1028,6 +1038,7 @@ dependencies = [ "clap", "comfy-table", "crossterm 0.28.1", + "nucleo-matcher", "predicates", "ratatui", "rusqlite", diff --git a/Cargo.toml b/Cargo.toml index dc5cb28..25cff28 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ serde_json = "1" comfy-table = "7" ratatui = "0.29" crossterm = "0.28" +nucleo-matcher = "0.3" [dev-dependencies] tempfile = "3" diff --git a/src/tui/fuzzy.rs b/src/tui/fuzzy.rs new file mode 100644 index 0000000..2cc0bf2 --- /dev/null +++ b/src/tui/fuzzy.rs @@ -0,0 +1,97 @@ +use nucleo_matcher::{ + pattern::{CaseMatching, Normalization, Pattern}, + Config, Matcher, Utf32Str, +}; + +use crate::search::CommandRow; + +pub fn rank(query: &str, items: &[CommandRow]) -> Vec { + if query.trim().is_empty() { + return (0..items.len()).collect(); + } + + let mut matcher = Matcher::new(Config::DEFAULT); + let pattern = Pattern::parse(query, CaseMatching::Ignore, Normalization::Smart); + + let mut scored: Vec<(usize, u32)> = items + .iter() + .enumerate() + .filter_map(|(i, row)| { + let mut haystack_buf = Vec::new(); + let haystack = Utf32Str::new(&row.command, &mut haystack_buf); + pattern.score(haystack, &mut matcher).map(|s| (i, s)) + }) + .collect(); + + scored.sort_by(|a, b| b.1.cmp(&a.1)); + scored.into_iter().map(|(i, _)| i).collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + fn row(command: &str) -> CommandRow { + CommandRow { + timestamp: 0, + project: String::new(), + tags: String::from("[]"), + exit_code: 0, + duration_ms: 0, + directory: String::new(), + command: command.to_string(), + session_id: String::new(), + } + } + + #[test] + fn empty_query_returns_all_in_original_order() { + let items = vec![row("git status"), row("ls -la"), row("cargo build")]; + let result = rank("", &items); + assert_eq!(result, vec![0, 1, 2]); + } + + #[test] + fn whitespace_only_query_returns_all() { + let items = vec![row("git status"), row("ls -la")]; + let result = rank(" ", &items); + assert_eq!(result, vec![0, 1]); + } + + #[test] + fn exact_match_ranks_high() { + let items = vec![row("git status"), row("git pull"), row("cargo build")]; + let result = rank("git status", &items); + assert!(!result.is_empty()); + assert_eq!(result[0], 0); + } + + #[test] + fn fuzzy_dkr_matches_docker() { + let items = vec![row("docker run nginx"), row("ls -la"), row("cargo test")]; + let result = rank("dkr", &items); + assert!(!result.is_empty()); + assert_eq!(result[0], 0); + } + + #[test] + fn no_match_returns_empty() { + let items = vec![row("git status"), row("ls -la"), row("cargo build")]; + let result = rank("zzzzzzzzzzz", &items); + assert!(result.is_empty()); + } + + #[test] + fn ordering_better_match_comes_first() { + let items = vec![row("cargo test"), row("cargo build --tests")]; + let result = rank("cargo test", &items); + assert!(!result.is_empty()); + assert_eq!(result[0], 0); + } + + #[test] + fn empty_items_returns_empty() { + let result = rank("anything", &[]); + assert!(result.is_empty()); + } +} From 9530348c331c54ab40ba7aead90f25251b765ef4 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 14:43:33 -0600 Subject: [PATCH 040/151] feat(tui): add App state, FilterState, and to_search_args wiring (#12) --- src/tui/app.rs | 268 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 src/tui/app.rs diff --git a/src/tui/app.rs b/src/tui/app.rs new file mode 100644 index 0000000..fb29c1a --- /dev/null +++ b/src/tui/app.rs @@ -0,0 +1,268 @@ +use rusqlite::Connection; + +use crate::cli::SearchArgs; +use crate::error::ThothError; +use crate::search::{CommandRow, ExitFilter}; +use crate::tui::fuzzy; + +const TUI_LIMIT: usize = 5000; + +pub struct FilterState { + pub project: Option, + pub tag: Vec, + pub exit: Option, + pub since: Option, + pub until: Option, +} + +impl Default for FilterState { + fn default() -> Self { + Self::new() + } +} + +impl FilterState { + pub fn new() -> Self { + Self { + project: None, + tag: vec![], + exit: None, + since: None, + until: None, + } + } + + pub fn to_search_args(&self) -> SearchArgs { + SearchArgs { + query: None, + project: self.project.clone(), + tag: self.tag.clone(), + exit: self.exit.clone(), + duration: None, + since: self.since.clone(), + until: self.until.clone(), + session: None, + limit: TUI_LIMIT, + show_session: false, + } + } +} + +pub enum Action { + Run(String), + Edit(String), +} + +pub struct App { + pub query: String, + pub all_rows: Vec, + pub filtered: Vec, + pub selected: usize, + pub scroll: usize, + pub filters: FilterState, + pub action: Option, +} + +impl Default for App { + fn default() -> Self { + Self::new() + } +} + +impl App { + pub fn new() -> Self { + Self { + query: String::new(), + all_rows: vec![], + filtered: vec![], + selected: 0, + scroll: 0, + filters: FilterState::new(), + action: None, + } + } + + pub fn reload(&mut self, conn: &Connection, now: i64) -> Result<(), ThothError> { + let args = self.filters.to_search_args(); + self.all_rows = crate::search::execute(&args, conn, now)?; + self.recompute(); + Ok(()) + } + + pub fn recompute(&mut self) { + self.filtered = fuzzy::rank(&self.query, &self.all_rows); + let max = self.filtered.len().saturating_sub(1); + if self.selected > max { + self.selected = max; + } + if self.scroll > self.selected { + self.scroll = self.selected; + } + } + + pub fn selected_command(&self) -> Option<&str> { + let idx = self.filtered.get(self.selected)?; + self.all_rows.get(*idx).map(|r| r.command.as_str()) + } + + pub fn move_up(&mut self) { + if self.selected > 0 { + self.selected -= 1; + } + if self.scroll > self.selected { + self.scroll = self.selected; + } + } + + pub fn move_down(&mut self) { + let max = self.filtered.len().saturating_sub(1); + if self.selected < max { + self.selected += 1; + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn make_conn() -> Connection { + let mut conn = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut conn).unwrap(); + conn + } + + fn seed(conn: &Connection, cmd: &str, ts: i64) { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ + VALUES(?1, '/tmp', 'p', 's1', ?2, 0, 100, '[]')", + rusqlite::params![cmd, ts], + ) + .unwrap(); + } + + #[test] + fn to_search_args_empty_filters() { + let fs = FilterState::new(); + let args = fs.to_search_args(); + assert!(args.query.is_none()); + assert!(args.project.is_none()); + assert!(args.tag.is_empty()); + assert!(args.exit.is_none()); + assert!(args.since.is_none()); + assert!(args.until.is_none()); + assert_eq!(args.limit, TUI_LIMIT); + } + + #[test] + fn to_search_args_project_mapped() { + let mut fs = FilterState::new(); + fs.project = Some("myapp".into()); + let args = fs.to_search_args(); + assert_eq!(args.project, Some("myapp".into())); + assert!(args.query.is_none()); + } + + #[test] + fn to_search_args_exit_filter_mapped() { + let mut fs = FilterState::new(); + fs.exit = Some(ExitFilter::Fail); + let args = fs.to_search_args(); + assert_eq!(args.exit, Some(ExitFilter::Fail)); + } + + #[test] + fn to_search_args_tags_mapped() { + let mut fs = FilterState::new(); + fs.tag = vec!["rust".into(), "cli".into()]; + let args = fs.to_search_args(); + assert_eq!(args.tag, vec!["rust".to_string(), "cli".to_string()]); + } + + #[test] + fn to_search_args_since_until_mapped() { + let mut fs = FilterState::new(); + fs.since = Some("2024-01-01".into()); + fs.until = Some("2024-12-31".into()); + let args = fs.to_search_args(); + assert_eq!(args.since, Some("2024-01-01".into())); + assert_eq!(args.until, Some("2024-12-31".into())); + } + + #[test] + fn reload_populates_all_rows() { + let conn = make_conn(); + seed(&conn, "git status", 1000); + seed(&conn, "ls -la", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + assert_eq!(app.all_rows.len(), 2); + } + + #[test] + fn reload_empty_query_returns_all_in_original_order() { + let conn = make_conn(); + seed(&conn, "cmd_old", 1000); + seed(&conn, "cmd_new", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + assert_eq!(app.filtered.len(), 2); + assert_eq!(app.all_rows[app.filtered[0]].command, "cmd_new"); + } + + #[test] + fn recompute_filters_on_query() { + let conn = make_conn(); + seed(&conn, "docker run nginx", 1000); + seed(&conn, "ls -la", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.query = "docker".into(); + app.recompute(); + assert_eq!(app.filtered.len(), 1); + assert_eq!(app.all_rows[app.filtered[0]].command, "docker run nginx"); + } + + #[test] + fn selected_command_returns_correct_entry() { + let conn = make_conn(); + seed(&conn, "git status", 2000); + seed(&conn, "ls -la", 1000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.selected = 0; + let cmd = app.selected_command().unwrap(); + assert_eq!(cmd, "git status"); + } + + #[test] + fn move_down_clamps_at_last() { + let conn = make_conn(); + seed(&conn, "a", 1000); + seed(&conn, "b", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.move_down(); + app.move_down(); + app.move_down(); + assert_eq!(app.selected, 1); + } + + #[test] + fn move_up_clamps_at_zero() { + let conn = make_conn(); + seed(&conn, "a", 1000); + seed(&conn, "b", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.move_up(); + app.move_up(); + assert_eq!(app.selected, 0); + } + + #[test] + fn selected_command_none_when_empty() { + let app = App::new(); + assert!(app.selected_command().is_none()); + } +} From 2e3f66a9b6e5ef3caee84e1a4863a4122032d5ff Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 14:43:40 -0600 Subject: [PATCH 041/151] feat(tui): add pure handle_key event handler with full key coverage (#12) --- src/tui/event.rs | 233 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 src/tui/event.rs diff --git a/src/tui/event.rs b/src/tui/event.rs new file mode 100644 index 0000000..718bf68 --- /dev/null +++ b/src/tui/event.rs @@ -0,0 +1,233 @@ +use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + +use crate::tui::app::{Action, App}; + +pub enum Outcome { + Continue, + Exit, +} + +pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { + match key.code { + KeyCode::Esc => { + app.action = None; + Outcome::Exit + } + KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { + app.action = None; + Outcome::Exit + } + KeyCode::Enter => { + if let Some(cmd) = app.selected_command() { + app.action = Some(Action::Run(cmd.to_string())); + } + Outcome::Exit + } + KeyCode::Tab => { + if let Some(cmd) = app.selected_command() { + app.action = Some(Action::Edit(cmd.to_string())); + } + Outcome::Exit + } + KeyCode::Up => { + app.move_up(); + Outcome::Continue + } + KeyCode::Char('p') if key.modifiers.contains(KeyModifiers::CONTROL) => { + app.move_up(); + Outcome::Continue + } + KeyCode::Down => { + app.move_down(); + Outcome::Continue + } + KeyCode::Char('n') if key.modifiers.contains(KeyModifiers::CONTROL) => { + app.move_down(); + Outcome::Continue + } + KeyCode::Backspace => { + app.query.pop(); + app.recompute(); + Outcome::Continue + } + KeyCode::Char(c) if !key.modifiers.contains(KeyModifiers::CONTROL) => { + app.query.push(c); + app.recompute(); + Outcome::Continue + } + _ => Outcome::Continue, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + fn key(code: KeyCode) -> KeyEvent { + KeyEvent { + code, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + } + } + + fn ctrl(code: KeyCode) -> KeyEvent { + KeyEvent { + code, + modifiers: KeyModifiers::CONTROL, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + } + } + + fn app_with_rows() -> App { + let mut app = App::new(); + app.all_rows = vec![ + crate::search::CommandRow { + timestamp: 2000, + project: String::from("p"), + tags: String::from("[]"), + exit_code: 0, + duration_ms: 100, + directory: String::from("/tmp"), + command: String::from("git status"), + session_id: String::from("s1"), + }, + crate::search::CommandRow { + timestamp: 1000, + project: String::from("p"), + tags: String::from("[]"), + exit_code: 0, + duration_ms: 100, + directory: String::from("/tmp"), + command: String::from("ls -la"), + session_id: String::from("s1"), + }, + ]; + app.recompute(); + app + } + + #[test] + fn esc_sets_no_action_and_exits() { + let mut app = app_with_rows(); + let outcome = handle_key(key(KeyCode::Esc), &mut app); + assert!(app.action.is_none()); + assert!(matches!(outcome, Outcome::Exit)); + } + + #[test] + fn ctrl_c_sets_no_action_and_exits() { + let mut app = app_with_rows(); + let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app); + assert!(app.action.is_none()); + assert!(matches!(outcome, Outcome::Exit)); + } + + #[test] + fn enter_sets_run_action_and_exits() { + let mut app = app_with_rows(); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + assert!(matches!(&app.action, Some(Action::Run(cmd)) if cmd == "git status")); + } + + #[test] + fn tab_sets_edit_action_and_exits() { + let mut app = app_with_rows(); + let outcome = handle_key(key(KeyCode::Tab), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + assert!(matches!(&app.action, Some(Action::Edit(cmd)) if cmd == "git status")); + } + + #[test] + fn up_arrow_moves_selection_up() { + let mut app = app_with_rows(); + app.selected = 1; + handle_key(key(KeyCode::Up), &mut app); + assert_eq!(app.selected, 0); + } + + #[test] + fn down_arrow_moves_selection_down() { + let mut app = app_with_rows(); + app.selected = 0; + handle_key(key(KeyCode::Down), &mut app); + assert_eq!(app.selected, 1); + } + + #[test] + fn ctrl_p_moves_selection_up() { + let mut app = app_with_rows(); + app.selected = 1; + handle_key(ctrl(KeyCode::Char('p')), &mut app); + assert_eq!(app.selected, 0); + } + + #[test] + fn ctrl_n_moves_selection_down() { + let mut app = app_with_rows(); + app.selected = 0; + handle_key(ctrl(KeyCode::Char('n')), &mut app); + assert_eq!(app.selected, 1); + } + + #[test] + fn printable_char_appends_to_query_and_recomputes() { + let mut app = app_with_rows(); + handle_key(key(KeyCode::Char('g')), &mut app); + assert_eq!(app.query, "g"); + } + + #[test] + fn backspace_removes_last_char() { + let mut app = app_with_rows(); + app.query = String::from("git"); + app.recompute(); + handle_key(key(KeyCode::Backspace), &mut app); + assert_eq!(app.query, "gi"); + } + + #[test] + fn backspace_on_empty_query_is_noop() { + let mut app = app_with_rows(); + handle_key(key(KeyCode::Backspace), &mut app); + assert_eq!(app.query, ""); + } + + #[test] + fn typing_filters_results() { + let mut app = app_with_rows(); + handle_key(key(KeyCode::Char('g')), &mut app); + handle_key(key(KeyCode::Char('i')), &mut app); + handle_key(key(KeyCode::Char('t')), &mut app); + assert!(!app.filtered.is_empty()); + assert_eq!(app.all_rows[app.filtered[0]].command, "git status"); + } + + #[test] + fn enter_on_empty_list_exits_without_action() { + let mut app = App::new(); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + assert!(app.action.is_none()); + } + + #[test] + fn up_at_top_is_noop() { + let mut app = app_with_rows(); + app.selected = 0; + handle_key(key(KeyCode::Up), &mut app); + assert_eq!(app.selected, 0); + } + + #[test] + fn down_at_bottom_is_noop() { + let mut app = app_with_rows(); + app.selected = 1; + handle_key(key(KeyCode::Down), &mut app); + assert_eq!(app.selected, 1); + } +} From 82eac73a786519ac97f4e0699576f75ef49edc5a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 14:43:44 -0600 Subject: [PATCH 042/151] feat(tui): wire App and handle_key into run loop; declare new tui submodules (#12) --- src/tui/mod.rs | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 0ee3004..c6a432f 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -1,10 +1,13 @@ +pub mod app; +pub mod event; +pub mod fuzzy; pub mod time; use std::fs::OpenOptions; use std::panic; use crossterm::{ - event::{self, Event, KeyCode, KeyModifiers}, + event::{self as ct_event, Event}, execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, }; @@ -17,6 +20,8 @@ use ratatui::{ use rusqlite::Connection; use crate::error::ThothError; +use crate::tui::app::App; +use crate::tui::event::{handle_key, Outcome}; struct TerminalGuard; @@ -47,7 +52,7 @@ fn history_count(conn: &Connection) -> i64 { .unwrap_or(0) } -pub fn run(conn: &Connection, _now: i64) -> Result<(), ThothError> { +pub fn run(conn: &Connection, now: i64) -> Result<(), ThothError> { let tty = OpenOptions::new() .read(true) .write(true) @@ -69,9 +74,14 @@ pub fn run(conn: &Connection, _now: i64) -> Result<(), ThothError> { let mut terminal = Terminal::new(backend) .map_err(|e| ThothError::Tui(format!("terminal init failed: {e}")))?; + let mut app = App::new(); + app.reload(conn, now)?; + let count = history_count(conn); loop { + let query = app.query.clone(); + let result_count = app.filtered.len(); terminal .draw(|f| { let area = f.area(); @@ -84,27 +94,34 @@ pub fn run(conn: &Connection, _now: i64) -> Result<(), ThothError> { let inner = block.inner(chunks[0]); f.render_widget(block, chunks[0]); - let body = - Paragraph::new(format!("History count: {count}\n\npress q or Esc to quit")) - .alignment(Alignment::Left); + let body = Paragraph::new(format!( + "History: {count} Matching: {result_count}\n\nQuery: {query}\n\nenter=run tab=edit esc=quit" + )) + .alignment(Alignment::Left); f.render_widget(body, inner); }) .map_err(|e| ThothError::Tui(format!("draw failed: {e}")))?; - if event::poll(std::time::Duration::from_millis(200)) + if ct_event::poll(std::time::Duration::from_millis(200)) .map_err(|e| ThothError::Tui(format!("event poll failed: {e}")))? { if let Event::Key(key) = - event::read().map_err(|e| ThothError::Tui(format!("event read failed: {e}")))? + ct_event::read().map_err(|e| ThothError::Tui(format!("event read failed: {e}")))? { - match key.code { - KeyCode::Char('q') | KeyCode::Esc => break, - KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => break, - _ => {} + match handle_key(key, &mut app) { + Outcome::Exit => break, + Outcome::Continue => {} } } } } + if let Some(action) = app.action { + match action { + app::Action::Run(cmd) => println!("RUN:{cmd}"), + app::Action::Edit(cmd) => println!("EDIT:{cmd}"), + } + } + Ok(()) } From 21cc60cb44222faef825794b274f37a078092473 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 14:54:33 -0600 Subject: [PATCH 043/151] feat(tui): add render module with ratatui layout, TestBackend snapshot tests, and selection_line protocol (#12) --- src/tui/mod.rs | 45 +----- src/tui/render.rs | 366 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 374 insertions(+), 37 deletions(-) create mode 100644 src/tui/render.rs diff --git a/src/tui/mod.rs b/src/tui/mod.rs index c6a432f..b0ee572 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -1,6 +1,7 @@ pub mod app; pub mod event; pub mod fuzzy; +pub mod render; pub mod time; use std::fs::OpenOptions; @@ -11,17 +12,13 @@ use crossterm::{ execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, }; -use ratatui::{ - backend::CrosstermBackend, - layout::{Alignment, Constraint, Direction, Layout}, - widgets::{Block, Borders, Paragraph}, - Terminal, -}; +use ratatui::{backend::CrosstermBackend, Terminal}; use rusqlite::Connection; use crate::error::ThothError; use crate::tui::app::App; use crate::tui::event::{handle_key, Outcome}; +use crate::tui::render::format_action_line; struct TerminalGuard; @@ -47,11 +44,6 @@ impl Drop for TerminalGuard { } } -fn history_count(conn: &Connection) -> i64 { - conn.query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) - .unwrap_or(0) -} - pub fn run(conn: &Connection, now: i64) -> Result<(), ThothError> { let tty = OpenOptions::new() .read(true) @@ -77,29 +69,9 @@ pub fn run(conn: &Connection, now: i64) -> Result<(), ThothError> { let mut app = App::new(); app.reload(conn, now)?; - let count = history_count(conn); - loop { - let query = app.query.clone(); - let result_count = app.filtered.len(); terminal - .draw(|f| { - let area = f.area(); - let chunks = Layout::default() - .direction(Direction::Vertical) - .constraints([Constraint::Min(3), Constraint::Length(1)]) - .split(area); - - let block = Block::default().title(" Thoth ").borders(Borders::ALL); - let inner = block.inner(chunks[0]); - f.render_widget(block, chunks[0]); - - let body = Paragraph::new(format!( - "History: {count} Matching: {result_count}\n\nQuery: {query}\n\nenter=run tab=edit esc=quit" - )) - .alignment(Alignment::Left); - f.render_widget(body, inner); - }) + .draw(|f| render::draw(f, &app, now)) .map_err(|e| ThothError::Tui(format!("draw failed: {e}")))?; if ct_event::poll(std::time::Duration::from_millis(200)) @@ -116,11 +88,10 @@ pub fn run(conn: &Connection, now: i64) -> Result<(), ThothError> { } } - if let Some(action) = app.action { - match action { - app::Action::Run(cmd) => println!("RUN:{cmd}"), - app::Action::Edit(cmd) => println!("EDIT:{cmd}"), - } + drop(_guard); + + if let Some(line) = format_action_line(app.action.as_ref()) { + println!("{line}"); } Ok(()) diff --git a/src/tui/render.rs b/src/tui/render.rs new file mode 100644 index 0000000..8db1ba9 --- /dev/null +++ b/src/tui/render.rs @@ -0,0 +1,366 @@ +use ratatui::{ + layout::{Alignment, Constraint, Layout}, + style::{Color, Modifier, Style}, + text::{Line, Span}, + widgets::{Block, List, ListItem, ListState, Paragraph, StatefulWidget}, + Frame, +}; + +use crate::search::CommandRow; +use crate::tui::app::App; +use crate::tui::time::format_relative; + +const EXIT_OK_GLYPH: &str = "✓"; +const EXIT_FAIL_GLYPH: &str = "✗"; + +fn exit_span(exit_code: i64) -> Span<'static> { + if exit_code == 0 { + Span::styled(EXIT_OK_GLYPH, Style::default().fg(Color::Green)) + } else { + Span::styled(EXIT_FAIL_GLYPH, Style::default().fg(Color::Red)) + } +} + +fn row_line<'a>(row: &'a CommandRow, now: i64, width: usize) -> Line<'a> { + let rel_time = format_relative(row.timestamp, now); + let glyph = exit_span(row.exit_code); + + let time_span = Span::raw(format!("{:>8} ", rel_time)); + let project_span = Span::raw(format!("{} ", row.project)); + + let overhead = rel_time.len() + 1 + 1 + 1 + row.project.len() + 1; + let cmd_width = if width > overhead { + width - overhead + } else { + 1 + }; + let command = if row.command.len() > cmd_width { + format!("{}…", &row.command[..cmd_width.saturating_sub(1)]) + } else { + row.command.clone() + }; + + Line::from(vec![ + time_span, + glyph, + Span::raw(" "), + project_span, + Span::raw(command), + ]) +} + +fn filter_chips(app: &App) -> String { + let mut parts = Vec::new(); + if let Some(ref p) = app.filters.project { + parts.push(format!("[project:{p}]")); + } + for tag in &app.filters.tag { + parts.push(format!("[tag:{tag}]")); + } + if let Some(ref e) = app.filters.exit { + parts.push(format!("[exit:{e:?}]")); + } + if let Some(ref s) = app.filters.since { + parts.push(format!("[since:{s}]")); + } + if let Some(ref u) = app.filters.until { + parts.push(format!("[until:{u}]")); + } + parts.join(" ") +} + +pub fn draw(frame: &mut Frame, app: &App, now: i64) { + let area = frame.area(); + + let chunks = Layout::vertical([ + Constraint::Length(1), + Constraint::Min(1), + Constraint::Length(1), + Constraint::Length(1), + ]) + .split(area); + + let header_area = chunks[0]; + let list_area = chunks[1]; + let query_area = chunks[2]; + let status_area = chunks[3]; + + let version = env!("CARGO_PKG_VERSION"); + let header_left = format!(" tth v{version}"); + let history_right = format!("History count: {} ", app.all_rows.len()); + let pad = (header_area.width as usize).saturating_sub(header_left.len() + history_right.len()); + let header_text = format!("{header_left}{:pad$}{history_right}", "", pad = pad); + let header = + Paragraph::new(header_text).style(Style::default().add_modifier(Modifier::REVERSED)); + frame.render_widget(header, header_area); + + let width = list_area.width as usize; + let height = list_area.height as usize; + + let visible: Vec = if app.filtered.is_empty() { + vec![] + } else { + let total = app.filtered.len(); + let scroll = app.scroll.min(total.saturating_sub(1)); + let end = (scroll + height).min(total); + (scroll..end).collect() + }; + + let selected_in_visible = if visible.is_empty() { + None + } else { + let scroll = app.scroll.min(app.filtered.len().saturating_sub(1)); + if app.selected >= scroll && app.selected < scroll + visible.len() { + Some(app.selected - scroll) + } else { + None + } + }; + + let items: Vec = visible + .iter() + .enumerate() + .map(|(vi, &fi)| { + let row = &app.all_rows[app.filtered[fi]]; + let line = row_line(row, now, width); + let style = if Some(vi) == selected_in_visible { + Style::default() + .add_modifier(Modifier::REVERSED) + .add_modifier(Modifier::BOLD) + } else { + Style::default() + }; + ListItem::new(line).style(style) + }) + .collect(); + + let mut list_state = ListState::default(); + list_state.select(selected_in_visible); + + let list = List::new(items).block(Block::default()); + StatefulWidget::render(list, list_area, frame.buffer_mut(), &mut list_state); + + let query_text = format!("> {}", app.query); + let query_widget = Paragraph::new(query_text); + frame.render_widget(query_widget, query_area); + + let chips = filter_chips(app); + let result_count = app.filtered.len(); + let status_text = if chips.is_empty() { + format!("{result_count} results") + } else { + format!("{chips} {result_count} results") + }; + let status_widget = Paragraph::new(status_text).alignment(Alignment::Left); + frame.render_widget(status_widget, status_area); +} + +pub fn format_action_line(action: Option<&crate::tui::app::Action>) -> Option { + use crate::tui::app::Action; + match action { + Some(Action::Run(cmd)) => Some(format!("RUN:{cmd}")), + Some(Action::Edit(cmd)) => Some(format!("EDIT:{cmd}")), + None => None, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::search::CommandRow; + use crate::tui::app::{Action, App}; + use ratatui::backend::TestBackend; + use ratatui::Terminal; + + const TEST_NOW: i64 = 1_000_000_000; + const TEST_WIDTH: u16 = 80; + const TEST_HEIGHT: u16 = 24; + + fn make_row(cmd: &str, ts: i64, exit: i64, project: &str) -> CommandRow { + CommandRow { + command: cmd.to_string(), + timestamp: ts, + exit_code: exit, + project: project.to_string(), + directory: "/tmp".to_string(), + tags: "[]".to_string(), + session_id: "s1".to_string(), + duration_ms: 100, + } + } + + fn render_app(app: &App) -> String { + let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + terminal.draw(|f| draw(f, app, TEST_NOW)).unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..TEST_HEIGHT { + let mut line = String::new(); + for col in 0..TEST_WIDTH { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line.trim_end().to_string()); + } + lines.join("\n") + } + + fn app_with_rows() -> App { + let mut app = App::new(); + app.all_rows = vec![ + make_row("git status", TEST_NOW - 60, 0, "proj-alpha"), + make_row("docker run nginx", TEST_NOW - 3600, 1, "proj-beta"), + make_row("cargo build", TEST_NOW - 86400, 0, "proj-alpha"), + ]; + app.recompute(); + app + } + + #[test] + fn header_contains_version_and_history_count() { + let app = app_with_rows(); + let text = render_app(&app); + assert!(text.contains("tth v"), "header must contain version string"); + assert!( + text.contains("History count: 3"), + "header must contain history count: got {text}" + ); + } + + #[test] + fn results_list_contains_command_text() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + text.contains("git status"), + "list must contain 'git status'" + ); + assert!( + text.contains("docker run nginx"), + "list must contain 'docker run'" + ); + assert!( + text.contains("cargo build"), + "list must contain 'cargo build'" + ); + } + + #[test] + fn results_list_contains_relative_times() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + text.contains("ago"), + "rows must show relative times containing 'ago'" + ); + } + + #[test] + fn results_list_contains_project_names() { + let app = app_with_rows(); + let text = render_app(&app); + assert!(text.contains("proj-alpha"), "rows must show project name"); + } + + #[test] + fn query_line_shows_prompt() { + let mut app = App::new(); + app.all_rows = vec![make_row("ls", TEST_NOW - 10, 0, "p")]; + app.query = "my search".to_string(); + app.recompute(); + let text = render_app(&app); + assert!( + text.contains("> my search"), + "query line must show '> my search'; got:\n{text}" + ); + } + + #[test] + fn query_line_shows_empty_prompt_when_no_query() { + let app = app_with_rows(); + let text = render_app(&app); + assert!(text.contains('>'), "query line must contain '>'"); + } + + #[test] + fn selected_row_is_styled_reversed() { + let mut app = App::new(); + app.all_rows = vec![ + make_row("first-cmd", TEST_NOW - 10, 0, "p"), + make_row("second-cmd", TEST_NOW - 20, 0, "p"), + ]; + app.recompute(); + app.selected = 0; + + let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); + let buf = terminal.backend().buffer().clone(); + + let row1_y = 1u16; + let any_reversed = (0..TEST_WIDTH).any(|x| { + buf[(x, row1_y)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }); + assert!(any_reversed, "selected row must have REVERSED modifier"); + } + + #[test] + fn status_bar_shows_result_count() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + text.contains("3 results"), + "status bar must show '3 results'; got:\n{text}" + ); + } + + #[test] + fn status_bar_shows_filter_chips_when_active() { + let mut app = App::new(); + app.all_rows = vec![make_row("ls", TEST_NOW - 10, 0, "myproject")]; + app.filters.project = Some("myproject".to_string()); + app.recompute(); + let text = render_app(&app); + assert!( + text.contains("[project:myproject]"), + "status bar must show project filter chip; got:\n{text}" + ); + } + + #[test] + fn format_action_line_run_produces_correct_prefix() { + let action = Action::Run("git pull".to_string()); + let result = format_action_line(Some(&action)); + assert_eq!(result, Some("RUN:git pull".to_string())); + } + + #[test] + fn format_action_line_edit_produces_correct_prefix() { + let action = Action::Edit("vim main.rs".to_string()); + let result = format_action_line(Some(&action)); + assert_eq!(result, Some("EDIT:vim main.rs".to_string())); + } + + #[test] + fn format_action_line_none_produces_no_output() { + let result = format_action_line(None); + assert!(result.is_none(), "None action must produce no stdout line"); + } + + #[test] + fn format_action_line_run_no_newline_in_result() { + let action = Action::Run("echo hello".to_string()); + let line = format_action_line(Some(&action)).unwrap(); + assert!(!line.contains('\n'), "action line must not contain newline"); + } + + #[test] + fn format_action_line_edit_no_newline_in_result() { + let action = Action::Edit("nano config".to_string()); + let line = format_action_line(Some(&action)).unwrap(); + assert!(!line.contains('\n'), "action line must not contain newline"); + } +} From 1af4a5296bbcaaf80a66265c432723167bc16b1d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 15:22:06 -0600 Subject: [PATCH 044/151] feat(tui): aligned table columns, ok/fail exit text, controls hint, display_command helper (#12) --- src/tui/render.rs | 252 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 208 insertions(+), 44 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index 8db1ba9..7cd3a0a 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -2,51 +2,67 @@ use ratatui::{ layout::{Alignment, Constraint, Layout}, style::{Color, Modifier, Style}, text::{Line, Span}, - widgets::{Block, List, ListItem, ListState, Paragraph, StatefulWidget}, + widgets::{Block, Cell, Paragraph, Row, Table}, Frame, }; -use crate::search::CommandRow; use crate::tui::app::App; use crate::tui::time::format_relative; -const EXIT_OK_GLYPH: &str = "✓"; -const EXIT_FAIL_GLYPH: &str = "✗"; +pub fn display_command(raw: &str) -> String { + let collapsed: String = raw + .chars() + .map(|c| { + if c == '\n' || c == '\r' || c == '\t' { + ' ' + } else { + c + } + }) + .collect(); + let mut result = String::with_capacity(collapsed.len()); + let mut prev_space = false; + for c in collapsed.chars() { + if c == ' ' { + if !prev_space { + result.push(c); + } + prev_space = true; + } else { + result.push(c); + prev_space = false; + } + } + result.trim().to_string() +} -fn exit_span(exit_code: i64) -> Span<'static> { - if exit_code == 0 { - Span::styled(EXIT_OK_GLYPH, Style::default().fg(Color::Green)) +fn format_duration(ms: i64) -> String { + if ms < 1000 { + format!("{ms}ms") } else { - Span::styled(EXIT_FAIL_GLYPH, Style::default().fg(Color::Red)) + format!("{}s", ms / 1000) } } -fn row_line<'a>(row: &'a CommandRow, now: i64, width: usize) -> Line<'a> { - let rel_time = format_relative(row.timestamp, now); - let glyph = exit_span(row.exit_code); - - let time_span = Span::raw(format!("{:>8} ", rel_time)); - let project_span = Span::raw(format!("{} ", row.project)); - - let overhead = rel_time.len() + 1 + 1 + 1 + row.project.len() + 1; - let cmd_width = if width > overhead { - width - overhead - } else { - 1 - }; - let command = if row.command.len() > cmd_width { - format!("{}…", &row.command[..cmd_width.saturating_sub(1)]) +fn exit_text(exit_code: i64) -> (&'static str, Color) { + if exit_code == 0 { + ("ok", Color::Green) } else { - row.command.clone() - }; + ("fail", Color::Red) + } +} - Line::from(vec![ - time_span, - glyph, - Span::raw(" "), - project_span, - Span::raw(command), - ]) +fn truncate(s: &str, max: usize) -> String { + if s.chars().count() <= max { + s.to_string() + } else { + let end = s + .char_indices() + .nth(max.saturating_sub(1)) + .map(|(i, _)| i) + .unwrap_or(s.len()); + format!("{}...", &s[..end]) + } } fn filter_chips(app: &App) -> String { @@ -73,6 +89,7 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let area = frame.area(); let chunks = Layout::vertical([ + Constraint::Length(1), Constraint::Length(1), Constraint::Min(1), Constraint::Length(1), @@ -81,9 +98,10 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { .split(area); let header_area = chunks[0]; - let list_area = chunks[1]; - let query_area = chunks[2]; - let status_area = chunks[3]; + let controls_area = chunks[1]; + let list_area = chunks[2]; + let query_area = chunks[3]; + let status_area = chunks[4]; let version = env!("CARGO_PKG_VERSION"); let header_left = format!(" tth v{version}"); @@ -94,7 +112,20 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { Paragraph::new(header_text).style(Style::default().add_modifier(Modifier::REVERSED)); frame.render_widget(header, header_area); + let controls = Paragraph::new(" up/down navigate enter run tab edit esc exit") + .style(Style::default().fg(Color::DarkGray)); + frame.render_widget(controls, controls_area); + let width = list_area.width as usize; + + let time_w: u16 = 9; + let dur_w: u16 = 7; + let exit_w: u16 = 4; + let proj_w: u16 = 14; + let gaps: u16 = 4; + let fixed: u16 = time_w + dur_w + exit_w + proj_w + gaps; + let cmd_w: u16 = (list_area.width).saturating_sub(fixed); + let height = list_area.height as usize; let visible: Vec = if app.filtered.is_empty() { @@ -117,28 +148,55 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { } }; - let items: Vec = visible + let dim = Style::default().fg(Color::DarkGray); + let cyan = Style::default().fg(Color::Cyan); + let blue = Style::default().fg(Color::Blue); + + let rows: Vec = visible .iter() .enumerate() .map(|(vi, &fi)| { let row = &app.all_rows[app.filtered[fi]]; - let line = row_line(row, now, width); - let style = if Some(vi) == selected_in_visible { + let rel = format_relative(row.timestamp, now); + let dur = format_duration(row.duration_ms); + let (exit_label, exit_color) = exit_text(row.exit_code); + let proj = truncate(&row.project, proj_w as usize); + let cmd = display_command(&row.command); + let cmd = truncate(&cmd, cmd_w as usize); + + let row_style = if Some(vi) == selected_in_visible { Style::default() .add_modifier(Modifier::REVERSED) .add_modifier(Modifier::BOLD) } else { Style::default() }; - ListItem::new(line).style(style) + + let time_cell = Cell::from(Line::from(vec![Span::styled(rel, dim)])); + let dur_cell = Cell::from(Line::from(vec![Span::styled(dur, cyan)])); + let exit_cell = Cell::from(Line::from(vec![Span::styled( + exit_label, + Style::default().fg(exit_color), + )])); + let proj_cell = Cell::from(Line::from(vec![Span::styled(proj, blue)])); + let cmd_cell = Cell::from(Line::from(vec![Span::raw(cmd)])); + + Row::new([time_cell, dur_cell, exit_cell, proj_cell, cmd_cell]).style(row_style) }) .collect(); - let mut list_state = ListState::default(); - list_state.select(selected_in_visible); + let widths = [ + Constraint::Length(time_w), + Constraint::Length(dur_w), + Constraint::Length(exit_w), + Constraint::Length(proj_w), + Constraint::Min(1), + ]; + + let _ = width; - let list = List::new(items).block(Block::default()); - StatefulWidget::render(list, list_area, frame.buffer_mut(), &mut list_state); + let table = Table::new(rows, widths).block(Block::default()); + frame.render_widget(table, list_area); let query_text = format!("> {}", app.query); let query_widget = Paragraph::new(query_text); @@ -297,7 +355,7 @@ mod tests { terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); let buf = terminal.backend().buffer().clone(); - let row1_y = 1u16; + let row1_y = 2u16; let any_reversed = (0..TEST_WIDTH).any(|x| { buf[(x, row1_y)] .style() @@ -330,6 +388,69 @@ mod tests { ); } + #[test] + fn exit_ok_renders_as_text_not_glyph() { + let mut app = App::new(); + app.all_rows = vec![make_row("ls", TEST_NOW - 10, 0, "p")]; + app.recompute(); + let text = render_app(&app); + assert!( + text.contains("ok"), + "exit 0 must render as 'ok'; got:\n{text}" + ); + assert!(!text.contains('✓'), "exit 0 must NOT render as glyph ✓"); + } + + #[test] + fn exit_fail_renders_as_text_not_glyph() { + let mut app = App::new(); + app.all_rows = vec![make_row("bad-cmd", TEST_NOW - 10, 1, "p")]; + app.recompute(); + let text = render_app(&app); + assert!( + text.contains("fail"), + "exit nonzero must render as 'fail'; got:\n{text}" + ); + assert!( + !text.contains('✗'), + "exit nonzero must NOT render as glyph ✗" + ); + } + + #[test] + fn controls_hint_is_visible() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + text.contains("navigate"), + "controls hint must contain 'navigate'; got:\n{text}" + ); + assert!( + text.contains("enter"), + "controls hint must contain 'enter'; got:\n{text}" + ); + assert!( + text.contains("esc"), + "controls hint must contain 'esc'; got:\n{text}" + ); + } + + #[test] + fn multiline_command_is_collapsed_in_render() { + let mut app = App::new(); + app.all_rows = vec![make_row("git\nstatus\n --short", TEST_NOW - 10, 0, "p")]; + app.recompute(); + let text = render_app(&app); + assert!( + !text.contains('\n') || !text.lines().any(|l| l.trim().starts_with("status")), + "multi-line command must be collapsed to one line" + ); + assert!( + text.contains("git status --short"), + "collapsed command must appear as single line; got:\n{text}" + ); + } + #[test] fn format_action_line_run_produces_correct_prefix() { let action = Action::Run("git pull".to_string()); @@ -363,4 +484,47 @@ mod tests { let line = format_action_line(Some(&action)).unwrap(); assert!(!line.contains('\n'), "action line must not contain newline"); } + + #[test] + fn display_command_collapses_newlines() { + assert_eq!(display_command("git\nstatus"), "git status"); + } + + #[test] + fn display_command_collapses_carriage_returns() { + assert_eq!(display_command("git\r\nstatus"), "git status"); + } + + #[test] + fn display_command_collapses_tabs() { + assert_eq!(display_command("git\tstatus"), "git status"); + } + + #[test] + fn display_command_collapses_multiple_spaces() { + assert_eq!(display_command("git status"), "git status"); + } + + #[test] + fn display_command_trims_leading_trailing() { + assert_eq!(display_command(" git status "), "git status"); + } + + #[test] + fn display_command_multiline_with_indentation() { + assert_eq!( + display_command("git\nstatus\n --short"), + "git status --short" + ); + } + + #[test] + fn display_command_empty_string() { + assert_eq!(display_command(""), ""); + } + + #[test] + fn display_command_plain_command_unchanged() { + assert_eq!(display_command("ls -la"), "ls -la"); + } } From 882e7848f1a80a726e5819aefb3ccad9281abd0e Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 15:42:28 -0600 Subject: [PATCH 045/151] feat(tui): rename header to Thoth and move controls bar to bottom (#12) Replace 'tth v0.1.0' header label with bold 'Thoth' and dim version span. Move the controls hint line from below the header to the bottom of the screen, following lazyjust layout conventions. Adjust layout constraints and update TestBackend assertions (header text, selected-row y-offset). --- src/tui/render.rs | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index 7cd3a0a..c241564 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -89,31 +89,38 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let area = frame.area(); let chunks = Layout::vertical([ - Constraint::Length(1), Constraint::Length(1), Constraint::Min(1), Constraint::Length(1), Constraint::Length(1), + Constraint::Length(1), ]) .split(area); let header_area = chunks[0]; - let controls_area = chunks[1]; - let list_area = chunks[2]; - let query_area = chunks[3]; - let status_area = chunks[4]; + let list_area = chunks[1]; + let query_area = chunks[2]; + let status_area = chunks[3]; + let controls_area = chunks[4]; let version = env!("CARGO_PKG_VERSION"); - let header_left = format!(" tth v{version}"); + let name_span = Span::styled(" Thoth", Style::default().add_modifier(Modifier::BOLD)); + let version_span = Span::styled( + format!(" v{version}"), + Style::default().add_modifier(Modifier::DIM), + ); let history_right = format!("History count: {} ", app.all_rows.len()); - let pad = (header_area.width as usize).saturating_sub(header_left.len() + history_right.len()); - let header_text = format!("{header_left}{:pad$}{history_right}", "", pad = pad); + let left_len = " Thoth".len() + format!(" v{version}").len(); + let pad = (header_area.width as usize).saturating_sub(left_len + history_right.len()); + let padding_span = Span::raw(format!("{:pad$}", "", pad = pad)); + let history_span = Span::raw(history_right); + let header_line = Line::from(vec![name_span, version_span, padding_span, history_span]); let header = - Paragraph::new(header_text).style(Style::default().add_modifier(Modifier::REVERSED)); + Paragraph::new(header_line).style(Style::default().add_modifier(Modifier::REVERSED)); frame.render_widget(header, header_area); let controls = Paragraph::new(" up/down navigate enter run tab edit esc exit") - .style(Style::default().fg(Color::DarkGray)); + .style(Style::default().add_modifier(Modifier::DIM)); frame.render_widget(controls, controls_area); let width = list_area.width as usize; @@ -278,7 +285,10 @@ mod tests { fn header_contains_version_and_history_count() { let app = app_with_rows(); let text = render_app(&app); - assert!(text.contains("tth v"), "header must contain version string"); + assert!( + text.contains("Thoth"), + "header must contain product name 'Thoth'" + ); assert!( text.contains("History count: 3"), "header must contain history count: got {text}" @@ -355,7 +365,7 @@ mod tests { terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); let buf = terminal.backend().buffer().clone(); - let row1_y = 2u16; + let row1_y = 1u16; let any_reversed = (0..TEST_WIDTH).any(|x| { buf[(x, row1_y)] .style() From daec1ebfd66ff3d691f1c48b9e5fe0ad60dfa53e Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 15:55:25 -0600 Subject: [PATCH 046/151] feat(tui): restyle header, list border, and controls bar (#12) --- src/tui/render.rs | 157 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 129 insertions(+), 28 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index c241564..0dafde2 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -2,7 +2,7 @@ use ratatui::{ layout::{Alignment, Constraint, Layout}, style::{Color, Modifier, Style}, text::{Line, Span}, - widgets::{Block, Cell, Paragraph, Row, Table}, + widgets::{Block, BorderType, Borders, Cell, Paragraph, Row, Table}, Frame, }; @@ -85,6 +85,10 @@ fn filter_chips(app: &App) -> String { parts.join(" ") } +const ACCENT: Color = Color::Cyan; +const DIM_COLOR: Color = Color::DarkGray; +const BORDER_COLOR: Color = Color::DarkGray; + pub fn draw(frame: &mut Frame, app: &App, now: i64) { let area = frame.area(); @@ -104,26 +108,61 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let controls_area = chunks[4]; let version = env!("CARGO_PKG_VERSION"); - let name_span = Span::styled(" Thoth", Style::default().add_modifier(Modifier::BOLD)); - let version_span = Span::styled( - format!(" v{version}"), - Style::default().add_modifier(Modifier::DIM), - ); - let history_right = format!("History count: {} ", app.all_rows.len()); - let left_len = " Thoth".len() + format!(" v{version}").len(); - let pad = (header_area.width as usize).saturating_sub(left_len + history_right.len()); + let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); + let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); + + let accent_bar = Span::styled("▌ ", accent_style); + let name_span = Span::styled("Thoth", accent_style); + let sep_span = Span::styled(" · ", dim_style); + let version_span = Span::styled(format!("v{version}"), dim_style); + let count_sep = Span::styled(" ", dim_style); + let count_span = Span::styled(format!("{} commands", app.all_rows.len()), dim_style); + let history_right = format!("History count: {}", app.all_rows.len()); + let right_len = history_right.len(); + let left_len = + 2 + 5 + 3 + 1 + version.len() + 2 + format!("{} commands", app.all_rows.len()).len(); + let pad = (header_area.width as usize).saturating_sub(left_len + right_len); let padding_span = Span::raw(format!("{:pad$}", "", pad = pad)); - let history_span = Span::raw(history_right); - let header_line = Line::from(vec![name_span, version_span, padding_span, history_span]); - let header = - Paragraph::new(header_line).style(Style::default().add_modifier(Modifier::REVERSED)); + let history_span = Span::styled(history_right, dim_style); + + let header_line = Line::from(vec![ + accent_bar, + name_span, + sep_span, + version_span, + count_sep, + count_span, + padding_span, + history_span, + ]); + let header = Paragraph::new(header_line); frame.render_widget(header, header_area); - let controls = Paragraph::new(" up/down navigate enter run tab edit esc exit") - .style(Style::default().add_modifier(Modifier::DIM)); + let controls_line = Line::from(vec![ + Span::styled(" ↑↓", accent_style), + Span::styled(" navigate", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↵", accent_style), + Span::styled(" run", dim_style), + Span::styled(" · ", dim_style), + Span::styled("⇥", accent_style), + Span::styled(" edit", dim_style), + Span::styled(" · ", dim_style), + Span::styled("esc", accent_style), + Span::styled(" quit", dim_style), + ]); + let controls = Paragraph::new(controls_line); frame.render_widget(controls, controls_area); - let width = list_area.width as usize; + let border_style = Style::default().fg(BORDER_COLOR); + let list_block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(border_style) + .title(Span::styled(" history ", dim_style)); + + let inner_list_area = list_block.inner(list_area); + frame.render_widget(list_block, list_area); let time_w: u16 = 9; let dur_w: u16 = 7; @@ -131,9 +170,9 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let proj_w: u16 = 14; let gaps: u16 = 4; let fixed: u16 = time_w + dur_w + exit_w + proj_w + gaps; - let cmd_w: u16 = (list_area.width).saturating_sub(fixed); + let cmd_w: u16 = inner_list_area.width.saturating_sub(fixed); - let height = list_area.height as usize; + let height = inner_list_area.height as usize; let visible: Vec = if app.filtered.is_empty() { vec![] @@ -155,8 +194,8 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { } }; - let dim = Style::default().fg(Color::DarkGray); - let cyan = Style::default().fg(Color::Cyan); + let dim = Style::default().fg(DIM_COLOR); + let cyan = Style::default().fg(ACCENT); let blue = Style::default().fg(Color::Blue); let rows: Vec = visible @@ -200,10 +239,8 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { Constraint::Min(1), ]; - let _ = width; - let table = Table::new(rows, widths).block(Block::default()); - frame.render_widget(table, list_area); + frame.render_widget(table, inner_list_area); let query_text = format!("> {}", app.query); let query_widget = Paragraph::new(query_text); @@ -365,7 +402,7 @@ mod tests { terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); let buf = terminal.backend().buffer().clone(); - let row1_y = 1u16; + let row1_y = 2u16; let any_reversed = (0..TEST_WIDTH).any(|x| { buf[(x, row1_y)] .style() @@ -436,12 +473,76 @@ mod tests { "controls hint must contain 'navigate'; got:\n{text}" ); assert!( - text.contains("enter"), - "controls hint must contain 'enter'; got:\n{text}" + text.contains("run"), + "controls hint must contain 'run'; got:\n{text}" + ); + assert!( + text.contains("edit"), + "controls hint must contain 'edit'; got:\n{text}" + ); + assert!( + text.contains("quit"), + "controls hint must contain 'quit'; got:\n{text}" + ); + } + + #[test] + fn header_has_no_full_width_reversed_bar() { + let app = app_with_rows(); + let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); + let buf = terminal.backend().buffer().clone(); + + let reversed_count = (0..TEST_WIDTH) + .filter(|&x| { + buf[(x, 0)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }) + .count(); + assert_eq!( + reversed_count, 0, + "header row must have zero REVERSED cells; found {reversed_count}" + ); + } + + #[test] + fn border_title_history_appears() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + text.contains("history"), + "list border must show title 'history'; got:\n{text}" ); + } + + #[test] + fn selected_row_is_inside_border() { + let mut app = App::new(); + app.all_rows = vec![ + make_row("first-cmd", TEST_NOW - 10, 0, "p"), + make_row("second-cmd", TEST_NOW - 20, 0, "p"), + ]; + app.recompute(); + app.selected = 0; + + let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); + let buf = terminal.backend().buffer().clone(); + + let row_inside_border_y = 2u16; + let any_reversed = (0..TEST_WIDTH).any(|x| { + buf[(x, row_inside_border_y)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }); assert!( - text.contains("esc"), - "controls hint must contain 'esc'; got:\n{text}" + any_reversed, + "selected row inside border must have REVERSED modifier at y={row_inside_border_y}" ); } From fa08e887a1c6f39ac12bea1bbb4fd96cc5dc0d1a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:11:22 -0600 Subject: [PATCH 047/151] feat(tui): add zsh/bash Ctrl-R widget and capture exclusion (#12) --- scripts/test_hooks.sh | 212 ++++++++++++++++++++++++++++++++++++++++++ shells/thoth.bash | 23 ++++- shells/thoth.zsh | 27 +++++- 3 files changed, 260 insertions(+), 2 deletions(-) diff --git a/scripts/test_hooks.sh b/scripts/test_hooks.sh index 2f9a00d..5835b3c 100755 --- a/scripts/test_hooks.sh +++ b/scripts/test_hooks.sh @@ -226,6 +226,210 @@ _run_bash_trap_chain_single_quote_test() { fi } +_run_zsh_widget_defined() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for widget definition check" + return + fi + local content + content="$(cat "${REPO_ROOT}/shells/thoth.zsh")" + if [[ "$content" == *"_tth_widget"* ]]; then + _pass "thoth.zsh: _tth_widget function defined" + else + _fail "thoth.zsh: _tth_widget function NOT found" + fi + if [[ "$content" == *"bindkey '^R'"* ]]; then + _pass "thoth.zsh: bindkey '^R' present" + else + _fail "thoth.zsh: bindkey '^R' NOT found" + fi + if [[ "$content" == *"zle -N _tth_widget"* ]]; then + _pass "thoth.zsh: zle -N _tth_widget registration present" + else + _fail "thoth.zsh: zle -N _tth_widget NOT found" + fi +} + +_run_bash_widget_defined() { + local content + content="$(cat "${REPO_ROOT}/shells/thoth.bash")" + if [[ "$content" == *"_tth_widget"* ]]; then + _pass "thoth.bash: _tth_widget function defined" + else + _fail "thoth.bash: _tth_widget function NOT found" + fi + if [[ "$content" == *'bind -x'*'\C-r'* ]] || [[ "$content" == *"bind -x"*"\C-r"* ]]; then + _pass "thoth.bash: bind -x Ctrl-R present" + else + _fail "thoth.bash: bind -x Ctrl-R NOT found" + fi +} + +_run_zsh_capture_exclusion() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for capture exclusion check" + return + fi + + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + + local stub_log="$tmpdir/stub.log" + local stub_bin="$tmpdir/tth" + + cat > "$stub_bin" <<'STUB' +#!/usr/bin/env bash +echo "$@" >> "$STUB_LOG" +STUB + chmod +x "$stub_bin" + + STUB_LOG="$stub_log" \ + PATH="$tmpdir:$REPO_ROOT/target/debug:$PATH" \ + TTH_SESSION_ID="test-sid" \ + zsh --no-rcs -c " + export STUB_LOG='$stub_log' + source '${REPO_ROOT}/shells/thoth.zsh' 2>/dev/null || true + _tth_preexec 'tth search foo' + _tth_preexec 'tth' + _TTH_START=\$EPOCHREALTIME + _tth_preexec 'echo hello' + _tth_precmd + sleep 0.1 + " 2>/dev/null || true + + if [[ -f "$stub_log" ]]; then + if grep -q 'record' "$stub_log" 2>/dev/null; then + if grep 'record' "$stub_log" | grep -q 'tth'; then + _fail "zsh: tth command was recorded (exclusion not working)" + else + _pass "zsh: capture exclusion prevents tth commands from being recorded" + fi + else + _pass "zsh: capture exclusion prevents tth commands from being recorded" + fi + else + _pass "zsh: capture exclusion works (no spurious record call)" + fi +} + +_run_bash_capture_exclusion() { + if (( BASH_VERSINFO[0] < 5 )); then + _skip "bash < 5; capture exclusion test requires bash >= 5" + return + fi + + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + + local stub_log="$tmpdir/stub.log" + local stub_bin="$tmpdir/tth" + + cat > "$stub_bin" <<'STUB' +#!/usr/bin/env bash +echo "$@" >> "$STUB_LOG" +STUB + chmod +x "$stub_bin" + + STUB_LOG="$stub_log" \ + PATH="$tmpdir:$REPO_ROOT/target/debug:$PATH" \ + TTH_SESSION_ID="test-sid" \ + bash --norc --noprofile -c " + export STUB_LOG='$stub_log' + source '${REPO_ROOT}/shells/thoth.bash' 2>/dev/null || true + BASH_COMMAND='tth search foo' + _thoth_preexec + BASH_COMMAND='tth' + _thoth_preexec + BASH_COMMAND='echo hello' + _thoth_preexec + _THOTH_START=\$EPOCHREALTIME + _THOTH_CMD='echo hello' + _thoth_precmd + _i=0 + while (( _i < 100 )); do + [[ -s '$stub_log' ]] && break + sleep 0.05 + _i=\$(( _i + 1 )) + done + " 2>/dev/null || true + + if [[ -f "$stub_log" ]]; then + if grep -q 'record' "$stub_log" 2>/dev/null; then + if grep 'record' "$stub_log" | grep -qE -- '(^| )tth( |$)'; then + _fail "bash: tth command was recorded (exclusion not working)" + else + _pass "bash: capture exclusion prevents tth commands from being recorded" + fi + else + _pass "bash: capture exclusion works (no record call seen)" + fi + else + _pass "bash: capture exclusion works (no spurious record call)" + fi +} + +_run_zsh_parse_run_prefix() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for RUN: prefix parse check" + return + fi + local result + result="$(zsh --no-rcs -c ' + out="RUN:git status" + echo "${out#RUN:}" + ' 2>/dev/null)" + if [[ "$result" == "git status" ]]; then + _pass "zsh: RUN: prefix stripped correctly" + else + _fail "zsh: RUN: prefix strip failed; got: $result" + fi +} + +_run_zsh_parse_edit_prefix() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for EDIT: prefix parse check" + return + fi + local result + result="$(zsh --no-rcs -c ' + out="EDIT:vim main.rs" + echo "${out#EDIT:}" + ' 2>/dev/null)" + if [[ "$result" == "vim main.rs" ]]; then + _pass "zsh: EDIT: prefix stripped correctly" + else + _fail "zsh: EDIT: prefix strip failed; got: $result" + fi +} + +_run_bash_parse_run_prefix() { + local result + result="$(bash --norc --noprofile -c ' + out="RUN:git status" + echo "${out#RUN:}" + ' 2>/dev/null)" + if [[ "$result" == "git status" ]]; then + _pass "bash: RUN: prefix stripped correctly" + else + _fail "bash: RUN: prefix strip failed; got: $result" + fi +} + +_run_bash_parse_edit_prefix() { + local result + result="$(bash --norc --noprofile -c ' + out="EDIT:vim main.rs" + echo "${out#EDIT:}" + ' 2>/dev/null)" + if [[ "$result" == "vim main.rs" ]]; then + _pass "bash: EDIT: prefix stripped correctly" + else + _fail "bash: EDIT: prefix strip failed; got: $result" + fi +} + echo "=== Thoth shell hook smoke tests ===" _run_bash_version_check _run_bash_syntax_check @@ -237,6 +441,14 @@ _run_bash_trap_chain_single_quote_test _run_bash_test _run_bash_record_test _run_zsh_test +_run_zsh_widget_defined +_run_bash_widget_defined +_run_zsh_capture_exclusion +_run_bash_capture_exclusion +_run_zsh_parse_run_prefix +_run_zsh_parse_edit_prefix +_run_bash_parse_run_prefix +_run_bash_parse_edit_prefix echo "---" echo "PASS=$PASS FAIL=$FAIL SKIP=$SKIP" diff --git a/shells/thoth.bash b/shells/thoth.bash index 0d0b60c..6f76d49 100644 --- a/shells/thoth.bash +++ b/shells/thoth.bash @@ -10,7 +10,11 @@ _THOTH_PREV_DEBUG="" _thoth_preexec() { [[ $_THOTH_IN_PROMPT -eq 1 ]] && return [[ "$BASH_COMMAND" == "_thoth_precmd" ]] && return - _THOTH_CMD="$BASH_COMMAND" + local _cmd="$BASH_COMMAND" + case "$_cmd" in + tth|tth\ *) return ;; + esac + _THOTH_CMD="$_cmd" _THOTH_START=$EPOCHREALTIME if [[ -n "$_THOTH_PREV_DEBUG" ]]; then eval "$_THOTH_PREV_DEBUG" @@ -48,3 +52,20 @@ _thoth_chain_debug() { _thoth_chain_debug PROMPT_COMMAND="_thoth_precmd${PROMPT_COMMAND:+;$PROMPT_COMMAND}" + +_tth_widget() { + command -v tth >/dev/null 2>&1 || return + local out + out="$(tth /dev/null)" + if [[ "$out" == RUN:* ]]; then + READLINE_LINE="${out#RUN:}" + READLINE_POINT=${#READLINE_LINE} + READLINE_MARK=-1 + ( eval "$READLINE_LINE" ) + elif [[ "$out" == EDIT:* ]]; then + READLINE_LINE="${out#EDIT:}" + READLINE_POINT=${#READLINE_LINE} + fi +} + +bind -x '"\C-r": _tth_widget' diff --git a/shells/thoth.zsh b/shells/thoth.zsh index 6640dca..d88baf0 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -6,7 +6,11 @@ autoload -Uz add-zsh-hook export TTH_SESSION_ID _tth_preexec() { - _TTH_CMD="$1" + local _cmd="$1" + case "$_cmd" in + tth|tth\ *) return ;; + esac + _TTH_CMD="$_cmd" _TTH_START=$EPOCHREALTIME } @@ -27,3 +31,24 @@ _tth_precmd() { add-zsh-hook preexec _tth_preexec add-zsh-hook precmd _tth_precmd + +_tth_widget() { + command -v tth >/dev/null 2>&1 || return + local out + out="$(tth /dev/null)" + local rc=$? + if [[ "$out" == RUN:* ]]; then + BUFFER="${out#RUN:}" + zle reset-prompt + zle accept-line + elif [[ "$out" == EDIT:* ]]; then + BUFFER="${out#EDIT:}" + CURSOR=${#BUFFER} + zle reset-prompt + else + zle reset-prompt + fi +} + +zle -N _tth_widget +bindkey '^R' _tth_widget From dc1bac28b265177340d411a1fa094483d6f46890 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:36:49 -0600 Subject: [PATCH 048/151] test(database): remove false-confidence tests and rewrite atomicity test (#18) --- src/database.rs | 103 +++++++++++++++++++++++------------------------- src/schema.rs | 23 ----------- 2 files changed, 49 insertions(+), 77 deletions(-) diff --git a/src/database.rs b/src/database.rs index 4ca3260..46f7f48 100644 --- a/src/database.rs +++ b/src/database.rs @@ -313,34 +313,60 @@ mod tests { assert!(row.is_none()); } - #[test] - fn fts_skip_does_not_record_v2() { - let conn = connect_memory().unwrap(); - conn.execute_batch(SCHEMA_V1).unwrap(); - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_default() - .as_secs() as i64; - conn.execute( - "INSERT OR IGNORE INTO schema_version(version, applied_at) VALUES(1, ?1)", - rusqlite::params![now], - ) - .unwrap(); - let ver = current_version(&conn); - assert_eq!(ver, 1); - } - #[test] fn atomicity_rollback_on_bad_migration() { + const BAD_VERSION: i64 = 99; + const BAD_SQL: &str = "THIS IS NOT VALID SQL;"; + let mut conn = connect_memory().unwrap(); + apply_migrations(&mut conn).unwrap(); let ver_before = current_version(&conn); - let bad_sql = "THIS IS NOT VALID SQL;"; - let tx = conn.transaction().unwrap(); - let result = tx.execute_batch(bad_sql); - assert!(result.is_err()); - drop(tx); + + let result = (|| -> Result<(), ThothError> { + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64; + let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; + let ver_now: i64 = tx + .query_row( + "SELECT COALESCE(MAX(version), 0) FROM schema_version", + [], + |row| row.get(0), + ) + .unwrap_or(0); + if BAD_VERSION <= ver_now { + tx.rollback()?; + return Ok(()); + } + tx.execute_batch(BAD_SQL)?; + tx.execute( + "INSERT OR IGNORE INTO schema_version(version, applied_at) VALUES(?1, ?2)", + rusqlite::params![BAD_VERSION, now], + )?; + tx.commit()?; + Ok(()) + })(); + + assert!(result.is_err(), "bad migration SQL must return an error"); let ver_after = current_version(&conn); - assert_eq!(ver_before, ver_after); + assert_eq!( + ver_before, ver_after, + "schema_version must not advance when migration SQL is invalid" + ); + let tables: Vec = { + let mut stmt = conn + .prepare("SELECT name FROM sqlite_master WHERE type='table'") + .unwrap(); + stmt.query_map([], |row| row.get(0)) + .unwrap() + .filter_map(|r| r.ok()) + .collect() + }; + assert!( + !tables.iter().any(|t| t == "should_not_exist"), + "no phantom tables must survive the rolled-back transaction" + ); } #[test] @@ -419,35 +445,4 @@ mod tests { } } - #[test] - fn execute_batch_smoke() { - let mut conn = connect_memory().unwrap(); - apply_migrations(&mut conn).unwrap(); - - let sql = " -CREATE TABLE IF NOT EXISTS audit_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - label TEXT NOT NULL -); - -CREATE TRIGGER IF NOT EXISTS commands_audit AFTER INSERT ON commands BEGIN - INSERT INTO audit_log(label) - VALUES( - CASE - WHEN new.exit_code = 0 THEN 'ok; -- not a split' - ELSE 'fail' - END - ); -END; -"; - conn.execute_batch(sql).unwrap(); - conn.execute( - "INSERT INTO commands(command, directory, project, session_id, timestamp) VALUES('ls', '/tmp', 'p', 'sid', 1700000000)", - [], - ).unwrap(); - let label: String = conn - .query_row("SELECT label FROM audit_log", [], |r| r.get(0)) - .unwrap(); - assert_eq!(label, "ok; -- not a split"); - } } diff --git a/src/schema.rs b/src/schema.rs index 1f4575d..c00fbd6 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -49,26 +49,3 @@ CREATE TRIGGER IF NOT EXISTS commands_ad AFTER DELETE ON commands BEGIN INSERT INTO commands_fts(commands_fts, rowid, command) VALUES ('delete', old.id, old.command); END; "; - -#[cfg(test)] -mod tests { - #[test] - fn v1_contains_commands_table() { - assert!(super::SCHEMA_V1.contains("CREATE TABLE IF NOT EXISTS commands")); - } - - #[test] - fn v2_contains_fts() { - assert!(super::SCHEMA_V2_FTS.contains("commands_fts")); - } - - #[test] - fn v3_const_non_empty() { - assert!(!super::SCHEMA_V3_TERMINAL_ID.is_empty()); - } - - #[test] - fn v3_const_contains_terminal_id() { - assert!(super::SCHEMA_V3_TERMINAL_ID.contains("terminal_id")); - } -} From b06bdd834c934bb3c52192a20e5a208e68b44a88 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:37:53 -0600 Subject: [PATCH 049/151] test(cli): remove tautological and duplicate tests (#18) --- src/cli.rs | 31 ------------------------------- src/recorder.rs | 12 ------------ src/tui/render.rs | 42 ------------------------------------------ 3 files changed, 85 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 7aed029..bc166e4 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -188,34 +188,3 @@ fn which_tth() -> bool { .unwrap_or(false) } -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn default_tags_is_empty_array() { - let args = RecordArgs { - cmd: String::from("ls"), - dir: None, - exit_code: 0, - duration: 0, - timestamp: None, - tags: String::from("[]"), - terminal_id: None, - }; - assert_eq!(args.tags, "[]"); - } - - #[test] - fn default_timestamp_is_now() { - let now = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_secs() as i64; - let ts = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_secs() as i64; - assert!((ts - now).abs() < 2); - } -} diff --git a/src/recorder.rs b/src/recorder.rs index 139528c..0689c1e 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -274,18 +274,6 @@ mod tests { assert_eq!(sessions, 0, "orphan session found"); } - #[test] - fn locked_db_retry_succeeds() { - let dir = TempDir::new().unwrap(); - let mut conn = disk_conn(&dir); - let args = base_args(); - record(&args, &mut conn); - let count: i64 = conn - .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) - .unwrap(); - assert_eq!(count, 1); - } - #[test] fn record_never_propagates_error() { let dir = TempDir::new().unwrap(); diff --git a/src/tui/render.rs b/src/tui/render.rs index 0dafde2..a8acf8d 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -518,34 +518,6 @@ mod tests { ); } - #[test] - fn selected_row_is_inside_border() { - let mut app = App::new(); - app.all_rows = vec![ - make_row("first-cmd", TEST_NOW - 10, 0, "p"), - make_row("second-cmd", TEST_NOW - 20, 0, "p"), - ]; - app.recompute(); - app.selected = 0; - - let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); - let mut terminal = Terminal::new(backend).unwrap(); - terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); - let buf = terminal.backend().buffer().clone(); - - let row_inside_border_y = 2u16; - let any_reversed = (0..TEST_WIDTH).any(|x| { - buf[(x, row_inside_border_y)] - .style() - .add_modifier - .contains(Modifier::REVERSED) - }); - assert!( - any_reversed, - "selected row inside border must have REVERSED modifier at y={row_inside_border_y}" - ); - } - #[test] fn multiline_command_is_collapsed_in_render() { let mut app = App::new(); @@ -582,20 +554,6 @@ mod tests { assert!(result.is_none(), "None action must produce no stdout line"); } - #[test] - fn format_action_line_run_no_newline_in_result() { - let action = Action::Run("echo hello".to_string()); - let line = format_action_line(Some(&action)).unwrap(); - assert!(!line.contains('\n'), "action line must not contain newline"); - } - - #[test] - fn format_action_line_edit_no_newline_in_result() { - let action = Action::Edit("nano config".to_string()); - let line = format_action_line(Some(&action)).unwrap(); - assert!(!line.contains('\n'), "action line must not contain newline"); - } - #[test] fn display_command_collapses_newlines() { assert_eq!(display_command("git\nstatus"), "git status"); From fe8cef4612762461c52958c77db1c8b9f2f268f8 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:38:06 -0600 Subject: [PATCH 050/151] test(project): rename misnamed tests to match actual assertions (#18) --- src/project.rs | 2 +- src/tui/event.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/project.rs b/src/project.rs index ce93701..8514ddf 100644 --- a/src/project.rs +++ b/src/project.rs @@ -286,7 +286,7 @@ mod tests { } #[test] - fn cache_refresh_preserves_command_count() { + fn infer_project_is_read_only() { let dir = TempDir::new().unwrap(); let app = dir.path().join("count-app"); std::fs::create_dir_all(&app).unwrap(); diff --git a/src/tui/event.rs b/src/tui/event.rs index 718bf68..dc01617 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -175,7 +175,7 @@ mod tests { } #[test] - fn printable_char_appends_to_query_and_recomputes() { + fn printable_char_appends_to_query() { let mut app = app_with_rows(); handle_key(key(KeyCode::Char('g')), &mut app); assert_eq!(app.query, "g"); From 805dbe1d298408b2fec6863a2dac1958fe6a8c56 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:38:46 -0600 Subject: [PATCH 051/151] test(search): strengthen weak assertions (#18) - exit_glyph_zero_contains_check: assert cell content directly instead of a loose OR on debug format - render_empty_rows_does_not_panic: assert output contains '0 result(s)' instead of just non-empty - build_query_fts_multi_token: rewrite as integration test that exercises execute() and asserts all-token AND semantics --- src/search.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/search.rs b/src/search.rs index b49cbe2..4465be3 100644 --- a/src/search.rs +++ b/src/search.rs @@ -644,12 +644,25 @@ mod tests { #[test] fn build_query_fts_multi_token() { + let conn = mem_conn(); + if !crate::database::fts5_available(&conn) { + return; + } + seed(&conn, s("foo bar baz", "p", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("foo only", "p", 2_000, 0, 100, "[]", "s1")); + seed(&conn, s("bar only", "p", 3_000, 0, 100, "[]", "s1")); let args = SearchArgs { query: Some("foo bar".into()), ..default_args() }; - let (sql, _params) = build_query(&args, FIXED_NOW).unwrap(); - assert!(sql.contains("INNER JOIN commands_fts")); + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + assert_eq!( + rows.len(), + 1, + "multi-token FTS must require all tokens present; got {} rows", + rows.len() + ); + assert_eq!(rows[0].command, "foo bar baz"); } #[test] @@ -874,9 +887,9 @@ mod tests { #[test] fn exit_glyph_zero_contains_check() { let cell = exit_cell(0); - let s = format!("{:?}", cell); assert!( - s.contains('\u{2713}') || s.contains("2713") || cell.content().contains('\u{2713}') + cell.content().contains('\u{2713}'), + "exit 0 cell must contain the check glyph ✓" ); } @@ -997,6 +1010,9 @@ mod tests { #[test] fn render_empty_rows_does_not_panic() { let out = render(&[], false); - assert!(!out.is_empty()); + assert!( + out.contains("0 result(s)"), + "empty render must show '0 result(s)'; got: {out}" + ); } } From aeb3455ceaa35270dfe2d666a627d7e096ebe8d8 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:39:27 -0600 Subject: [PATCH 052/151] test(search): remove redundant execute and parse_duration tests (#18) - Delete execute_project_filter, execute_exit_fail_filter, execute_tag_filter (each is a subset of search_e2e coverage and of execute_no_filters_returns_all_ordered_desc + build_query_* tests) - Delete execute_fts_query (superseded by build_query_fts_hyphenated_token_integration and the strengthened build_query_fts_multi_token) - Delete parse_duration_empty_is_err (covered by parse_duration_no_prefix_is_err which also rejects prefix-less input) - Delete parse_duration_zero (low value; boundary already proved by parse_duration_greater/>30) - Delete parse_date_valid_ymd_returns_epoch (near-tautological; parse_date_ymd already asserts the same epoch value for 2024-01-15) --- src/search.rs | 78 --------------------------------------------------- 1 file changed, 78 deletions(-) diff --git a/src/search.rs b/src/search.rs index 4465be3..67c359b 100644 --- a/src/search.rs +++ b/src/search.rs @@ -408,13 +408,6 @@ mod tests { assert_eq!(ms, 5_000); } - #[test] - fn parse_duration_zero() { - let (ord, ms) = parse_duration(">0").unwrap(); - assert_eq!(ord, Ordering::Greater); - assert_eq!(ms, 0); - } - #[test] fn parse_duration_no_prefix_is_err() { assert!(parse_duration("30").is_err()); @@ -425,11 +418,6 @@ mod tests { assert!(parse_duration(">abc").is_err()); } - #[test] - fn parse_duration_empty_is_err() { - assert!(parse_duration("").is_err()); - } - const FIXED_NOW: i64 = 1_700_000_000; #[test] @@ -492,12 +480,6 @@ mod tests { assert!(parse_date("2024-04-31", FIXED_NOW).is_err()); } - #[test] - fn parse_date_valid_ymd_returns_epoch() { - let result = parse_date("2024-01-01", FIXED_NOW).unwrap(); - assert_eq!(result, days_since_epoch(2024, 1, 1) * SECS_PER_DAY); - } - #[test] fn build_query_no_filters() { let args = default_args(); @@ -767,35 +749,6 @@ mod tests { assert_eq!(rows[2].command, "cmd_a"); } - #[test] - fn execute_project_filter() { - let conn = mem_conn(); - seed(&conn, s("cmd_a", "alpha", 1_000, 0, 100, "[]", "s1")); - seed(&conn, s("cmd_b", "beta", 2_000, 0, 200, "[]", "s1")); - seed(&conn, s("cmd_c", "alpha", 3_000, 0, 300, "[]", "s1")); - let args = SearchArgs { - project: Some("alpha".into()), - ..default_args() - }; - let rows = execute(&args, &conn, FIXED_NOW).unwrap(); - assert_eq!(rows.len(), 2); - assert!(rows.iter().all(|r| r.project == "alpha")); - } - - #[test] - fn execute_exit_fail_filter() { - let conn = mem_conn(); - seed(&conn, s("ok_cmd", "p", 1_000, 0, 100, "[]", "s1")); - seed(&conn, s("fail_cmd", "p", 2_000, 1, 200, "[]", "s1")); - let args = SearchArgs { - exit: Some(ExitFilter::Fail), - ..default_args() - }; - let rows = execute(&args, &conn, FIXED_NOW).unwrap(); - assert_eq!(rows.len(), 1); - assert_eq!(rows[0].command, "fail_cmd"); - } - #[test] fn execute_since_filter() { let conn = mem_conn(); @@ -810,20 +763,6 @@ mod tests { assert_eq!(rows[0].command, "new_cmd"); } - #[test] - fn execute_tag_filter() { - let conn = mem_conn(); - seed(&conn, s("tagged", "p", 1_000, 0, 100, r#"["rust"]"#, "s1")); - seed(&conn, s("plain", "p", 2_000, 0, 100, "[]", "s1")); - let args = SearchArgs { - tag: vec!["rust".into()], - ..default_args() - }; - let rows = execute(&args, &conn, FIXED_NOW).unwrap(); - assert_eq!(rows.len(), 1); - assert_eq!(rows[0].command, "tagged"); - } - #[test] fn execute_limit() { let conn = mem_conn(); @@ -841,23 +780,6 @@ mod tests { assert_eq!(rows.len(), 2); } - #[test] - fn execute_fts_query() { - let conn = mem_conn(); - if !crate::database::fts5_available(&conn) { - return; - } - seed(&conn, s("docker run nginx", "p", 1_000, 0, 100, "[]", "s1")); - seed(&conn, s("ls -la", "p", 2_000, 0, 100, "[]", "s1")); - let args = SearchArgs { - query: Some("docker".into()), - ..default_args() - }; - let rows = execute(&args, &conn, FIXED_NOW).unwrap(); - assert_eq!(rows.len(), 1); - assert_eq!(rows[0].command, "docker run nginx"); - } - #[test] fn fmt_timestamp_known_value() { let result = fmt_timestamp(1_700_000_000); From 0cc95ac946e5af2a66f8569f0e80cde7edd02714 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:40:31 -0600 Subject: [PATCH 053/151] test(cli): remove redundant integration tests (#18) - Delete cli_exits_0_on_unwritable_db (duplicate of record_never_fail_contract_preserved which tests the same behavior with a clearer name) - Delete record_still_exits_0_after_dispatch_refactor (duplicate of cli_exits_0_on_success; name references a stale refactor context) - Delete search_duration_valid_exits_0 (superseded by search_duration_boundary_include_exclude which asserts actual include/exclude behavior) - Delete search_show_session_exits_0_with_separator (superseded by search_show_session_two_sessions_shows_two_headers which asserts both exit code and separator count) --- tests/cli.rs | 34 ---------------------------------- tests/search_e2e.rs | 27 --------------------------- 2 files changed, 61 deletions(-) diff --git a/tests/cli.rs b/tests/cli.rs index 409823f..0dbaada 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -22,26 +22,6 @@ fn cli_exits_0_on_success() { .code(0); } -#[test] -fn cli_exits_0_on_unwritable_db() { - let dir = TempDir::new().unwrap(); - let ro_dir = dir.path().join("readonly"); - std::fs::create_dir_all(&ro_dir).unwrap(); - let mut perms = std::fs::metadata(&ro_dir).unwrap().permissions(); - use std::os::unix::fs::PermissionsExt; - perms.set_mode(0o444); - std::fs::set_permissions(&ro_dir, perms).unwrap(); - tth() - .env("THOTH_DB", ro_dir.join("history.db").to_str().unwrap()) - .env( - "THOTH_ERROR_LOG", - dir.path().join("error.log").to_str().unwrap(), - ) - .args(["record", "--cmd", "ls"]) - .assert() - .code(0); -} - #[test] fn cli_all_six_flags_persisted() { let dir = TempDir::new().unwrap(); @@ -349,17 +329,3 @@ fn record_never_fail_contract_preserved() { .code(0); } -#[test] -fn record_still_exits_0_after_dispatch_refactor() { - let dir = TempDir::new().unwrap(); - let db_path = dir.path().join("history.db"); - tth() - .env("THOTH_DB", db_path.to_str().unwrap()) - .env( - "THOTH_ERROR_LOG", - dir.path().join("error.log").to_str().unwrap(), - ) - .args(["record", "--cmd", "echo test"]) - .assert() - .code(0); -} diff --git a/tests/search_e2e.rs b/tests/search_e2e.rs index 4d74e46..50771f8 100644 --- a/tests/search_e2e.rs +++ b/tests/search_e2e.rs @@ -185,17 +185,6 @@ fn search_tag_filter() { assert!(!text.contains("make test")); } -#[test] -fn search_duration_valid_exits_0() { - let f = setup(); - tth() - .env("THOTH_DB", &f.db) - .env("THOTH_ERROR_LOG", &f.log) - .args(["search", "--duration", ">0"]) - .assert() - .code(0); -} - #[test] fn search_duration_bad_exits_nonzero_with_error() { let f = setup(); @@ -232,22 +221,6 @@ fn search_since_bad_date_exits_nonzero() { ); } -#[test] -fn search_show_session_exits_0_with_separator() { - let f = setup(); - let out = tth() - .env("THOTH_DB", &f.db) - .env("THOTH_ERROR_LOG", &f.log) - .args(["search", "--show-session"]) - .assert() - .code(0) - .get_output() - .stdout - .clone(); - let text = String::from_utf8_lossy(&out); - assert!(text.contains("---"), "expected session separator in output"); -} - fn setup_duration_boundary() -> Fixture { let dir = TempDir::new().unwrap(); let db = dir.path().join("history.db").to_string_lossy().to_string(); From 332facd69a1807fde7158bb2cce87a308b486caf Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:40:57 -0600 Subject: [PATCH 054/151] test(search): merge four filter-mapped tests into one and remove redundant reload test (#18) - Merge to_search_args_project_mapped, _exit_filter_mapped, _tags_mapped, _since_until_mapped into to_search_args_all_filter_fields_map_through; keep to_search_args_empty_filters separate - Delete reload_empty_query_returns_all_in_original_order (covered by reload_populates_all_rows + recompute_filters_on_query which together prove all-rows ordering) --- src/tui/app.rs | 40 ++++++---------------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index fb29c1a..20e1d1c 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -155,38 +155,21 @@ mod tests { } #[test] - fn to_search_args_project_mapped() { + fn to_search_args_all_filter_fields_map_through() { let mut fs = FilterState::new(); fs.project = Some("myapp".into()); - let args = fs.to_search_args(); - assert_eq!(args.project, Some("myapp".into())); - assert!(args.query.is_none()); - } - - #[test] - fn to_search_args_exit_filter_mapped() { - let mut fs = FilterState::new(); fs.exit = Some(ExitFilter::Fail); - let args = fs.to_search_args(); - assert_eq!(args.exit, Some(ExitFilter::Fail)); - } - - #[test] - fn to_search_args_tags_mapped() { - let mut fs = FilterState::new(); fs.tag = vec!["rust".into(), "cli".into()]; - let args = fs.to_search_args(); - assert_eq!(args.tag, vec!["rust".to_string(), "cli".to_string()]); - } - - #[test] - fn to_search_args_since_until_mapped() { - let mut fs = FilterState::new(); fs.since = Some("2024-01-01".into()); fs.until = Some("2024-12-31".into()); let args = fs.to_search_args(); + assert!(args.query.is_none()); + assert_eq!(args.project, Some("myapp".into())); + assert_eq!(args.exit, Some(ExitFilter::Fail)); + assert_eq!(args.tag, vec!["rust".to_string(), "cli".to_string()]); assert_eq!(args.since, Some("2024-01-01".into())); assert_eq!(args.until, Some("2024-12-31".into())); + assert_eq!(args.limit, TUI_LIMIT); } #[test] @@ -199,17 +182,6 @@ mod tests { assert_eq!(app.all_rows.len(), 2); } - #[test] - fn reload_empty_query_returns_all_in_original_order() { - let conn = make_conn(); - seed(&conn, "cmd_old", 1000); - seed(&conn, "cmd_new", 2000); - let mut app = App::new(); - app.reload(&conn, 9999).unwrap(); - assert_eq!(app.filtered.len(), 2); - assert_eq!(app.all_rows[app.filtered[0]].command, "cmd_new"); - } - #[test] fn recompute_filters_on_query() { let conn = make_conn(); From f3973f68c0ba1129bd47a3d9e7eac9ab606bbf0d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:41:13 -0600 Subject: [PATCH 055/151] test(search): remove redundant fuzzy ranking tests (#18) - Delete exact_match_ranks_high (absorbed into ordering_better_match_comes_first which already asserts the highest-ranked item is index 0 for an exact query) - Delete empty_items_returns_empty (low value; no_match_returns_empty already exercises the empty-result path) --- src/tui/fuzzy.rs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/tui/fuzzy.rs b/src/tui/fuzzy.rs index 2cc0bf2..f771f98 100644 --- a/src/tui/fuzzy.rs +++ b/src/tui/fuzzy.rs @@ -58,14 +58,6 @@ mod tests { assert_eq!(result, vec![0, 1]); } - #[test] - fn exact_match_ranks_high() { - let items = vec![row("git status"), row("git pull"), row("cargo build")]; - let result = rank("git status", &items); - assert!(!result.is_empty()); - assert_eq!(result[0], 0); - } - #[test] fn fuzzy_dkr_matches_docker() { let items = vec![row("docker run nginx"), row("ls -la"), row("cargo test")]; @@ -89,9 +81,4 @@ mod tests { assert_eq!(result[0], 0); } - #[test] - fn empty_items_returns_empty() { - let result = rank("anything", &[]); - assert!(result.is_empty()); - } } From 67e3e9248591b7e9d904db87629e5604e8e3b3d4 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:41:46 -0600 Subject: [PATCH 056/151] test(search): remove interior-point duplicate time tests (#18) Keep only boundary and transition tests: future-clamp, zero, nine_seconds, ten_seconds, sixty_seconds, one_hour, one_day, one_week, one_day_before_month_boundary, one_month, one_year. Delete: fifty_nine_seconds, three_minutes, fifty_nine_minutes, two_hours, twenty_three_hours, five_days, six_days, three_weeks, six_months, eleven_months, two_years (all interior-point duplicates with no additional branch coverage) --- src/tui/time.rs | 54 ------------------------------------------------- 1 file changed, 54 deletions(-) diff --git a/src/tui/time.rs b/src/tui/time.rs index 98749de..a04df55 100644 --- a/src/tui/time.rs +++ b/src/tui/time.rs @@ -57,66 +57,26 @@ mod tests { assert_eq!(format_relative(NOW - 10, NOW), "10s ago"); } - #[test] - fn fifty_nine_seconds_is_seconds() { - assert_eq!(format_relative(NOW - 59, NOW), "59s ago"); - } - #[test] fn sixty_seconds_is_one_minute() { assert_eq!(format_relative(NOW - MINUTE, NOW), "1m ago"); } - #[test] - fn three_minutes() { - assert_eq!(format_relative(NOW - 3 * MINUTE, NOW), "3m ago"); - } - - #[test] - fn fifty_nine_minutes() { - assert_eq!(format_relative(NOW - 59 * MINUTE, NOW), "59m ago"); - } - #[test] fn one_hour() { assert_eq!(format_relative(NOW - HOUR, NOW), "1h ago"); } - #[test] - fn two_hours() { - assert_eq!(format_relative(NOW - 2 * HOUR, NOW), "2h ago"); - } - - #[test] - fn twenty_three_hours() { - assert_eq!(format_relative(NOW - 23 * HOUR, NOW), "23h ago"); - } - #[test] fn one_day() { assert_eq!(format_relative(NOW - DAY, NOW), "1d ago"); } - #[test] - fn five_days() { - assert_eq!(format_relative(NOW - 5 * DAY, NOW), "5d ago"); - } - - #[test] - fn six_days() { - assert_eq!(format_relative(NOW - 6 * DAY, NOW), "6d ago"); - } - #[test] fn one_week() { assert_eq!(format_relative(NOW - WEEK, NOW), "1w ago"); } - #[test] - fn three_weeks() { - assert_eq!(format_relative(NOW - 3 * WEEK, NOW), "3w ago"); - } - #[test] fn one_day_before_month_boundary() { assert_eq!(format_relative(NOW - (MONTH - DAY), NOW), "4w ago"); @@ -127,23 +87,9 @@ mod tests { assert_eq!(format_relative(NOW - MONTH, NOW), "1mo ago"); } - #[test] - fn six_months() { - assert_eq!(format_relative(NOW - 6 * MONTH, NOW), "6mo ago"); - } - - #[test] - fn eleven_months() { - assert_eq!(format_relative(NOW - 11 * MONTH, NOW), "11mo ago"); - } - #[test] fn one_year() { assert_eq!(format_relative(NOW - YEAR, NOW), "1y ago"); } - #[test] - fn two_years() { - assert_eq!(format_relative(NOW - 2 * YEAR, NOW), "2y ago"); - } } From cbf9d1e05e4395e7458962ab3160e1e18474f67a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:42:12 -0600 Subject: [PATCH 057/151] test(search): merge string-variant error tests and add Tui coverage (#18) - Merge hook_variant_formats_message and search_variant_delegates_to_inner_string into string_variants_delegate_to_inner_string (identical format assertion pattern) - Add Tui variant assertion to close the display coverage gap for ThothError::Tui --- src/error.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/error.rs b/src/error.rs index daf74e0..0b58832 100644 --- a/src/error.rs +++ b/src/error.rs @@ -30,14 +30,18 @@ mod tests { } #[test] - fn hook_variant_formats_message() { - let err = ThothError::Hook("could not write rc file".into()); - assert_eq!(err.to_string(), "could not write rc file"); - } - - #[test] - fn search_variant_delegates_to_inner_string() { - let err = ThothError::Search("bad input".into()); - assert_eq!(err.to_string(), "bad input"); + fn string_variants_delegate_to_inner_string() { + assert_eq!( + ThothError::Hook("could not write rc file".into()).to_string(), + "could not write rc file" + ); + assert_eq!( + ThothError::Search("bad input".into()).to_string(), + "bad input" + ); + assert_eq!( + ThothError::Tui("render failed".into()).to_string(), + "tui: render failed" + ); } } From f526c9fae2a2e6040ec154025feddd0df9f8687e Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:42:26 -0600 Subject: [PATCH 058/151] test(cli): remove duplicate env-wiring test in paths.rs (#18) Delete resolve_error_log_wires_thoth_error_log: the wiring pattern is identical to resolve_db_path_wires_thoth_db and both functions share the same env-override logic via their internal helpers; one smoke test is sufficient --- src/paths.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/paths.rs b/src/paths.rs index 8bf76d1..6a4d48d 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -103,11 +103,4 @@ mod tests { assert_eq!(result, PathBuf::from("/tmp/wiring_test.db")); } - #[test] - fn resolve_error_log_wires_thoth_error_log() { - std::env::set_var("THOTH_ERROR_LOG", "/tmp/wiring_test.log"); - let result = resolve_error_log(); - std::env::remove_var("THOTH_ERROR_LOG"); - assert_eq!(result, PathBuf::from("/tmp/wiring_test.log")); - } } From b6236bed9933925f4c876f1382fb4af0e914c914 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:43:17 -0600 Subject: [PATCH 059/151] style: fix trailing newlines after test removal (#18) --- src/cli.rs | 1 - src/database.rs | 1 - src/paths.rs | 1 - src/tui/fuzzy.rs | 1 - src/tui/time.rs | 1 - tests/cli.rs | 1 - 6 files changed, 6 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index bc166e4..31ca8f3 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -187,4 +187,3 @@ fn which_tth() -> bool { .map(|paths| std::env::split_paths(&paths).any(|dir| dir.join("tth").exists())) .unwrap_or(false) } - diff --git a/src/database.rs b/src/database.rs index 46f7f48..eede7b4 100644 --- a/src/database.rs +++ b/src/database.rs @@ -444,5 +444,4 @@ mod tests { ); } } - } diff --git a/src/paths.rs b/src/paths.rs index 6a4d48d..d896175 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -102,5 +102,4 @@ mod tests { std::env::remove_var("THOTH_DB"); assert_eq!(result, PathBuf::from("/tmp/wiring_test.db")); } - } diff --git a/src/tui/fuzzy.rs b/src/tui/fuzzy.rs index f771f98..f0b195a 100644 --- a/src/tui/fuzzy.rs +++ b/src/tui/fuzzy.rs @@ -80,5 +80,4 @@ mod tests { assert!(!result.is_empty()); assert_eq!(result[0], 0); } - } diff --git a/src/tui/time.rs b/src/tui/time.rs index a04df55..04529d7 100644 --- a/src/tui/time.rs +++ b/src/tui/time.rs @@ -91,5 +91,4 @@ mod tests { fn one_year() { assert_eq!(format_relative(NOW - YEAR, NOW), "1y ago"); } - } diff --git a/tests/cli.rs b/tests/cli.rs index 0dbaada..e5852a7 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -328,4 +328,3 @@ fn record_never_fail_contract_preserved() { .assert() .code(0); } - From 2ef56af45607b4f27e01173f6d84a23ef3f49ded Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 16:49:08 -0600 Subject: [PATCH 060/151] test(database): exercise real apply_migrations path in atomicity test (#18) --- src/database.rs | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/database.rs b/src/database.rs index eede7b4..1864e19 100644 --- a/src/database.rs +++ b/src/database.rs @@ -86,7 +86,14 @@ pub fn fts5_available(conn: &Connection) -> bool { } pub fn apply_migrations(conn: &mut Connection) -> Result<(), ThothError> { - for &(version, sql) in MIGRATIONS { + apply_migration_list(conn, MIGRATIONS) +} + +fn apply_migration_list( + conn: &mut Connection, + migrations: &[(i64, &str)], +) -> Result<(), ThothError> { + for &(version, sql) in migrations { if version == 2 && !fts5_available(conn) { continue; } @@ -315,38 +322,16 @@ mod tests { #[test] fn atomicity_rollback_on_bad_migration() { - const BAD_VERSION: i64 = 99; - const BAD_SQL: &str = "THIS IS NOT VALID SQL;"; + const BAD_MIGRATION: &[(i64, &str)] = &[( + 99, + "CREATE TABLE should_not_exist(x);\nTHIS IS NOT VALID SQL;", + )]; let mut conn = connect_memory().unwrap(); apply_migrations(&mut conn).unwrap(); let ver_before = current_version(&conn); - let result = (|| -> Result<(), ThothError> { - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_default() - .as_secs() as i64; - let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; - let ver_now: i64 = tx - .query_row( - "SELECT COALESCE(MAX(version), 0) FROM schema_version", - [], - |row| row.get(0), - ) - .unwrap_or(0); - if BAD_VERSION <= ver_now { - tx.rollback()?; - return Ok(()); - } - tx.execute_batch(BAD_SQL)?; - tx.execute( - "INSERT OR IGNORE INTO schema_version(version, applied_at) VALUES(?1, ?2)", - rusqlite::params![BAD_VERSION, now], - )?; - tx.commit()?; - Ok(()) - })(); + let result = apply_migration_list(&mut conn, BAD_MIGRATION); assert!(result.is_err(), "bad migration SQL must return an error"); let ver_after = current_version(&conn); From 13ff512c572e05ac09cf26088c8fca2bd59fd984 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 17:20:15 -0600 Subject: [PATCH 061/151] feat(forget): implement tth forget command (#20) Add `tth forget --last N [--dry-run] [--terminal-id ID]` to delete the N most recent commands from the history database. - src/forget.rs: Scope enum, resolve_scope (pure/testable), ForgetRow, select_targets (global + terminal-scoped with id DESC tie-break), delete_targets (dynamic placeholders, FTS trigger fires automatically), render_preview - src/cli.rs: ForgetArgs struct + dispatch arm; --last 0 returns ThothError - src/error.rs: ThothError::Forget variant - src/search.rs: expose fmt_timestamp_pub for reuse in render_preview - tests/forget_e2e.rs: e2e coverage (dry-run, real delete, empty DB, terminal scoping, --last 0 error) --- src/cli.rs | 36 ++++++ src/error.rs | 2 + src/forget.rs | 274 ++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/search.rs | 4 + tests/forget_e2e.rs | 148 ++++++++++++++++++++++++ 6 files changed, 465 insertions(+) create mode 100644 src/forget.rs create mode 100644 tests/forget_e2e.rs diff --git a/src/cli.rs b/src/cli.rs index 31ca8f3..d0fecc6 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -16,10 +16,21 @@ pub enum Cmd { Uninstall(UninstallArgs), Status, Search(SearchArgs), + Forget(ForgetArgs), #[command(hide = true)] NewSessionId, } +#[derive(clap::Args, Debug, Clone)] +pub struct ForgetArgs { + #[arg(long, default_value_t = 1)] + pub last: usize, + #[arg(long)] + pub dry_run: bool, + #[arg(long = "terminal-id")] + pub terminal_id: Option, +} + #[derive(clap::Args, Debug, Clone)] pub struct RecordArgs { #[arg(long)] @@ -175,6 +186,31 @@ pub fn run() -> Result<(), crate::error::ThothError> { let rows = crate::search::execute(&args, &conn, now)?; print!("{}", crate::search::render(&rows, args.show_session)); } + Some(Cmd::Forget(args)) => { + if args.last == 0 { + return Err(crate::error::ThothError::Forget( + "nothing to forget: --last must be >= 1".into(), + )); + } + let conn = crate::database::get_connection(None)?; + let scope = crate::forget::resolve_scope( + args.terminal_id, + std::env::var("TTH_SESSION_ID").ok(), + ); + let rows = crate::forget::select_targets(&conn, &scope, args.last)?; + if rows.is_empty() { + println!("No commands to forget."); + return Ok(()); + } + let ids: Vec = rows.iter().map(|r| r.id).collect(); + if args.dry_run { + print!("{}", crate::forget::render_preview(&rows)); + println!("Would forget {} command(s).", ids.len()); + } else { + crate::forget::delete_targets(&conn, &ids)?; + println!("Forgot {} command(s).", ids.len()); + } + } Some(Cmd::NewSessionId) => { println!("{}", uuid::Uuid::new_v4()); } diff --git a/src/error.rs b/src/error.rs index 0b58832..b40fff1 100644 --- a/src/error.rs +++ b/src/error.rs @@ -8,6 +8,8 @@ pub enum ThothError { Hook(String), #[error("{0}")] Search(String), + #[error("{0}")] + Forget(String), #[error("tui: {0}")] Tui(String), } diff --git a/src/forget.rs b/src/forget.rs new file mode 100644 index 0000000..2a2cf86 --- /dev/null +++ b/src/forget.rs @@ -0,0 +1,274 @@ +use rusqlite::Connection; + +use crate::error::ThothError; + +pub enum Scope { + Global, + Terminal(String), +} + +pub fn resolve_scope(terminal_id_flag: Option, env_session_id: Option) -> Scope { + if let Some(tid) = terminal_id_flag { + return Scope::Terminal(tid); + } + if let Some(sid) = env_session_id { + return Scope::Terminal(sid); + } + Scope::Global +} + +pub struct ForgetRow { + pub id: i64, + pub timestamp: i64, + pub project: String, + pub exit_code: i64, + pub command: String, +} + +const SELECT_COLS: &str = "SELECT id, timestamp, project, exit_code, command FROM commands"; + +pub fn select_targets( + conn: &Connection, + scope: &Scope, + n: usize, +) -> Result, ThothError> { + let rows = match scope { + Scope::Terminal(tid) => { + let sql = format!( + "{SELECT_COLS} WHERE terminal_id = ?1 ORDER BY timestamp DESC, id DESC LIMIT ?2" + ); + let mut stmt = conn.prepare(&sql)?; + let mapped = stmt.query_map(rusqlite::params![tid, n as i64], map_row)?; + collect_rows(mapped)? + } + Scope::Global => { + let sql = format!("{SELECT_COLS} ORDER BY timestamp DESC, id DESC LIMIT ?1"); + let mut stmt = conn.prepare(&sql)?; + let mapped = stmt.query_map(rusqlite::params![n as i64], map_row)?; + collect_rows(mapped)? + } + }; + Ok(rows) +} + +fn map_row(row: &rusqlite::Row<'_>) -> rusqlite::Result { + Ok(ForgetRow { + id: row.get(0)?, + timestamp: row.get(1)?, + project: row.get(2)?, + exit_code: row.get(3)?, + command: row.get(4)?, + }) +} + +fn collect_rows( + mapped: rusqlite::MappedRows<'_, impl FnMut(&rusqlite::Row<'_>) -> rusqlite::Result>, +) -> Result, ThothError> { + let mut out = Vec::new(); + for r in mapped { + out.push(r?); + } + Ok(out) +} + +pub fn delete_targets(conn: &Connection, ids: &[i64]) -> Result { + if ids.is_empty() { + return Ok(0); + } + let placeholders: String = ids + .iter() + .enumerate() + .map(|(i, _)| format!("?{}", i + 1)) + .collect::>() + .join(", "); + let sql = format!("DELETE FROM commands WHERE id IN ({placeholders})"); + let params: Vec<&dyn rusqlite::ToSql> = + ids.iter().map(|id| id as &dyn rusqlite::ToSql).collect(); + let deleted = conn.execute(&sql, params.as_slice())?; + Ok(deleted) +} + +pub fn render_preview(rows: &[ForgetRow]) -> String { + use crate::search::fmt_timestamp_pub; + let mut out = String::new(); + for row in rows { + let ts = fmt_timestamp_pub(row.timestamp); + let exit_glyph = if row.exit_code == 0 { + "\u{2713}" + } else { + "\u{2717}" + }; + out.push_str(&format!( + " {} | {} | {} | {}\n", + ts, row.project, exit_glyph, row.command + )); + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::database::{apply_migrations, connect_memory}; + + fn mem_conn() -> Connection { + let mut c = connect_memory().unwrap(); + apply_migrations(&mut c).unwrap(); + c + } + + fn insert_cmd( + conn: &Connection, + cmd: &str, + project: &str, + ts: i64, + terminal_id: Option<&str>, + ) -> i64 { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, terminal_id) \ + VALUES(?1, '/tmp', ?2, 's1', ?3, ?4)", + rusqlite::params![cmd, project, ts, terminal_id], + ) + .unwrap(); + conn.last_insert_rowid() + } + + fn count_all(conn: &Connection) -> i64 { + conn.query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap() + } + + fn fts_match(conn: &Connection, term: &str) -> bool { + let sql = format!( + "SELECT rowid FROM commands_fts WHERE commands_fts MATCH '\"{}\"'", + term + ); + conn.query_row(&sql, [], |r| r.get::<_, i64>(0)).is_ok() + } + + #[test] + fn resolve_scope_flag_wins() { + let scope = resolve_scope(Some("flag-tid".into()), Some("env-sid".into())); + match scope { + Scope::Terminal(tid) => assert_eq!(tid, "flag-tid"), + Scope::Global => panic!("expected Terminal"), + } + } + + #[test] + fn resolve_scope_env_used_when_no_flag() { + let scope = resolve_scope(None, Some("env-sid".into())); + match scope { + Scope::Terminal(tid) => assert_eq!(tid, "env-sid"), + Scope::Global => panic!("expected Terminal"), + } + } + + #[test] + fn resolve_scope_global_when_neither() { + let scope = resolve_scope(None, None); + assert!(matches!(scope, Scope::Global)); + } + + #[test] + fn select_targets_global_returns_n_newest() { + let conn = mem_conn(); + insert_cmd(&conn, "cmd_a", "p", 1000, None); + insert_cmd(&conn, "cmd_b", "p", 2000, None); + insert_cmd(&conn, "cmd_c", "p", 3000, None); + insert_cmd(&conn, "cmd_d", "p", 4000, None); + + let rows = select_targets(&conn, &Scope::Global, 2).unwrap(); + assert_eq!(rows.len(), 2); + assert_eq!(rows[0].command, "cmd_d"); + assert_eq!(rows[1].command, "cmd_c"); + } + + #[test] + fn select_targets_terminal_filters_by_terminal_id() { + let conn = mem_conn(); + insert_cmd(&conn, "term_a_1", "p", 1000, Some("tid-a")); + insert_cmd(&conn, "term_b_1", "p", 2000, Some("tid-b")); + insert_cmd(&conn, "term_a_2", "p", 3000, Some("tid-a")); + insert_cmd(&conn, "global_1", "p", 4000, None); + + let rows = select_targets(&conn, &Scope::Terminal("tid-a".into()), 10).unwrap(); + assert_eq!(rows.len(), 2); + let cmds: Vec<&str> = rows.iter().map(|r| r.command.as_str()).collect(); + assert!(cmds.contains(&"term_a_2")); + assert!(cmds.contains(&"term_a_1")); + assert!(!cmds.contains(&"term_b_1")); + assert!(!cmds.contains(&"global_1")); + } + + #[test] + fn select_targets_same_timestamp_tiebreak_by_id_desc() { + let conn = mem_conn(); + let id1 = insert_cmd(&conn, "first_inserted", "p", 5000, None); + let id2 = insert_cmd(&conn, "second_inserted", "p", 5000, None); + + let rows = select_targets(&conn, &Scope::Global, 2).unwrap(); + assert_eq!(rows.len(), 2); + assert_eq!( + rows[0].id, id2, + "higher id should come first when timestamps equal" + ); + assert_eq!(rows[1].id, id1); + } + + #[test] + fn select_targets_n_larger_than_available_returns_all() { + let conn = mem_conn(); + insert_cmd(&conn, "only_cmd", "p", 1000, None); + + let rows = select_targets(&conn, &Scope::Global, 100).unwrap(); + assert_eq!(rows.len(), 1); + } + + #[test] + fn delete_targets_removes_rows_and_updates_fts() { + let conn = mem_conn(); + if !crate::database::fts5_available(&conn) { + return; + } + let id1 = insert_cmd(&conn, "unique_forget_cmd_xyz", "p", 1000, None); + let id2 = insert_cmd(&conn, "unique_forget_cmd_abc", "p", 2000, None); + insert_cmd(&conn, "keep_me", "p", 3000, None); + + assert!(fts_match(&conn, "unique_forget_cmd_xyz")); + assert!(fts_match(&conn, "unique_forget_cmd_abc")); + + let deleted = delete_targets(&conn, &[id1, id2]).unwrap(); + assert_eq!(deleted, 2); + + assert_eq!(count_all(&conn), 1); + assert!(!fts_match(&conn, "unique_forget_cmd_xyz")); + assert!(!fts_match(&conn, "unique_forget_cmd_abc")); + assert!(fts_match(&conn, "keep_me")); + } + + #[test] + fn delete_targets_empty_ids_is_noop() { + let conn = mem_conn(); + insert_cmd(&conn, "some_cmd", "p", 1000, None); + + let deleted = delete_targets(&conn, &[]).unwrap(); + assert_eq!(deleted, 0); + assert_eq!(count_all(&conn), 1); + } + + #[test] + fn render_preview_contains_timestamp_project_command() { + let rows = vec![ForgetRow { + id: 1, + timestamp: 1_700_000_000, + project: "myproject".into(), + exit_code: 0, + command: "cargo build".into(), + }]; + let out = render_preview(&rows); + assert!(out.contains("myproject")); + assert!(out.contains("cargo build")); + assert!(out.contains("2023-11-14")); + } +} diff --git a/src/lib.rs b/src/lib.rs index 3718b7c..7716c20 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ pub mod cli; pub mod database; pub mod error; +pub mod forget; pub mod hooks; pub mod logging; pub mod paths; diff --git a/src/search.rs b/src/search.rs index 67c359b..8474b6a 100644 --- a/src/search.rs +++ b/src/search.rs @@ -335,6 +335,10 @@ fn exit_cell(code: i64) -> Cell { } } +pub fn fmt_timestamp_pub(epoch: i64) -> String { + fmt_timestamp(epoch) +} + fn fmt_timestamp(epoch: i64) -> String { let secs = epoch; let days = secs.div_euclid(SECS_PER_DAY); diff --git a/tests/forget_e2e.rs b/tests/forget_e2e.rs new file mode 100644 index 0000000..f6089c2 --- /dev/null +++ b/tests/forget_e2e.rs @@ -0,0 +1,148 @@ +use assert_cmd::Command; +use tempfile::TempDir; + +fn tth(db_dir: &TempDir) -> Command { + let mut cmd = Command::cargo_bin("tth").unwrap(); + cmd.env("THOTH_DB", db_dir.path().join("history.db")); + cmd +} + +fn record(db_dir: &TempDir, command: &str) { + tth(db_dir) + .args([ + "record", + "--cmd", + command, + "--dir", + "/tmp", + "--exit", + "0", + "--duration", + "0", + "--timestamp", + "1700000000", + "--terminal-id", + "default-tid", + ]) + .assert() + .success(); +} + +fn record_with_terminal(db_dir: &TempDir, command: &str, terminal_id: &str) { + tth(db_dir) + .args([ + "record", + "--cmd", + command, + "--dir", + "/tmp", + "--exit", + "0", + "--duration", + "0", + "--timestamp", + "1700000000", + "--terminal-id", + terminal_id, + ]) + .assert() + .success(); +} + +#[test] +fn dry_run_shows_preview_and_does_not_delete() { + let dir = TempDir::new().unwrap(); + record(&dir, "echo alpha"); + record(&dir, "echo beta"); + record(&dir, "echo gamma"); + + tth(&dir) + .args(["forget", "--last", "2", "--dry-run"]) + .assert() + .success() + .stdout(predicates::str::contains("Would forget 2 command(s).")); + + let out = tth(&dir) + .args(["search", "--limit", "100"]) + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!( + stdout.contains("3 result(s)"), + "dry-run must not delete; still expect 3 rows, got: {stdout}" + ); +} + +#[test] +fn forget_last_2_leaves_1() { + let dir = TempDir::new().unwrap(); + record(&dir, "echo one"); + record(&dir, "echo two"); + record(&dir, "echo three"); + + tth(&dir) + .args(["forget", "--last", "2"]) + .assert() + .success() + .stdout(predicates::str::contains("Forgot 2 command(s).")); + + let out = tth(&dir) + .args(["search", "--limit", "100"]) + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!( + stdout.contains("1 result(s)"), + "expected 1 row after forgetting 2, got: {stdout}" + ); +} + +#[test] +fn forget_on_empty_db_prints_no_commands() { + let dir = TempDir::new().unwrap(); + + tth(&dir) + .arg("forget") + .assert() + .success() + .stdout(predicates::str::contains("No commands to forget.")); +} + +#[test] +fn terminal_scoping_only_removes_target_terminal() { + let dir = TempDir::new().unwrap(); + record_with_terminal(&dir, "cmd_x_1", "tid-x"); + record_with_terminal(&dir, "cmd_x_2", "tid-x"); + record_with_terminal(&dir, "cmd_y_1", "tid-y"); + + tth(&dir) + .args(["forget", "--last", "2", "--terminal-id", "tid-x"]) + .assert() + .success() + .stdout(predicates::str::contains("Forgot 2 command(s).")); + + let out = tth(&dir) + .args(["search", "--limit", "100"]) + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!( + stdout.contains("1 result(s)"), + "expected 1 row (tid-y command) remaining, got: {stdout}" + ); + assert!( + stdout.contains("cmd_y_1"), + "tid-y command must survive, got: {stdout}" + ); +} + +#[test] +fn last_zero_returns_error() { + let dir = TempDir::new().unwrap(); + + tth(&dir) + .args(["forget", "--last", "0"]) + .assert() + .failure() + .stderr(predicates::str::contains("nothing to forget")); +} From 6bf4bcdf74e4a450ded99273fd46a306357e5f70 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 17:24:42 -0600 Subject: [PATCH 062/151] refactor(search): use ok/fail text consistently and drop fmt_timestamp wrapper (#20) --- src/forget.rs | 12 ++++-------- src/search.rs | 21 +++++++-------------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/forget.rs b/src/forget.rs index 2a2cf86..36d036c 100644 --- a/src/forget.rs +++ b/src/forget.rs @@ -89,18 +89,14 @@ pub fn delete_targets(conn: &Connection, ids: &[i64]) -> Result String { - use crate::search::fmt_timestamp_pub; + use crate::search::fmt_timestamp; let mut out = String::new(); for row in rows { - let ts = fmt_timestamp_pub(row.timestamp); - let exit_glyph = if row.exit_code == 0 { - "\u{2713}" - } else { - "\u{2717}" - }; + let ts = fmt_timestamp(row.timestamp); + let exit_label = if row.exit_code == 0 { "ok" } else { "fail" }; out.push_str(&format!( " {} | {} | {} | {}\n", - ts, row.project, exit_glyph, row.command + ts, row.project, exit_label, row.command )); } out diff --git a/src/search.rs b/src/search.rs index 8474b6a..ada6d3b 100644 --- a/src/search.rs +++ b/src/search.rs @@ -329,17 +329,13 @@ fn render_by_session(rows: &[CommandRow]) -> String { fn exit_cell(code: i64) -> Cell { if code == 0 { - Cell::new("\u{2713}").fg(Color::Green) + Cell::new("ok").fg(Color::Green) } else { - Cell::new("\u{2717}").fg(Color::Red) + Cell::new("fail").fg(Color::Red) } } -pub fn fmt_timestamp_pub(epoch: i64) -> String { - fmt_timestamp(epoch) -} - -fn fmt_timestamp(epoch: i64) -> String { +pub(crate) fn fmt_timestamp(epoch: i64) -> String { let secs = epoch; let days = secs.div_euclid(SECS_PER_DAY); let time_secs = secs.rem_euclid(SECS_PER_DAY); @@ -811,18 +807,15 @@ mod tests { } #[test] - fn exit_glyph_zero_contains_check() { + fn exit_zero_cell_is_ok() { let cell = exit_cell(0); - assert!( - cell.content().contains('\u{2713}'), - "exit 0 cell must contain the check glyph ✓" - ); + assert_eq!(cell.content(), "ok"); } #[test] - fn exit_glyph_nonzero_contains_cross() { + fn exit_nonzero_cell_is_fail() { let cell = exit_cell(1); - assert!(cell.content().contains('\u{2717}')); + assert_eq!(cell.content(), "fail"); } fn fixture_rows() -> Vec { From 6912abf33098e63d735cf7ac0f49f2aea3b90710 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 17:32:10 -0600 Subject: [PATCH 063/151] feat(sessions): add tth sessions command (#22) - New src/sessions.rs: SessionRow, build_query, list_sessions, render - SessionsArgs in cli.rs with --project, --since, --until, --limit - Sessions dispatch arm in cli::run() - Unit tests for build_query, list_sessions, render - E2E tests in tests/sessions_e2e.rs --- src/cli.rs | 24 +++ src/lib.rs | 1 + src/sessions.rs | 394 ++++++++++++++++++++++++++++++++++++++++++ tests/sessions_e2e.rs | 222 ++++++++++++++++++++++++ 4 files changed, 641 insertions(+) create mode 100644 src/sessions.rs create mode 100644 tests/sessions_e2e.rs diff --git a/src/cli.rs b/src/cli.rs index d0fecc6..3e00466 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -16,6 +16,7 @@ pub enum Cmd { Uninstall(UninstallArgs), Status, Search(SearchArgs), + Sessions(SessionsArgs), Forget(ForgetArgs), #[command(hide = true)] NewSessionId, @@ -80,6 +81,18 @@ pub struct SearchArgs { pub show_session: bool, } +#[derive(clap::Args, Debug, Clone)] +pub struct SessionsArgs { + #[arg(long)] + pub project: Option, + #[arg(long)] + pub since: Option, + #[arg(long)] + pub until: Option, + #[arg(long, default_value_t = 20)] + pub limit: usize, +} + #[derive(clap::Args, Debug, Clone)] pub struct UninstallArgs { #[arg(long = "keep-data")] @@ -186,6 +199,17 @@ pub fn run() -> Result<(), crate::error::ThothError> { let rows = crate::search::execute(&args, &conn, now)?; print!("{}", crate::search::render(&rows, args.show_session)); } + Some(Cmd::Sessions(args)) => { + let conn = crate::database::get_connection(None)?; + let sargs = crate::sessions::SessionsArgs { + project: args.project, + since: args.since, + until: args.until, + limit: args.limit, + }; + let rows = crate::sessions::list_sessions(&conn, &sargs, now)?; + print!("{}", crate::sessions::render(&rows)); + } Some(Cmd::Forget(args)) => { if args.last == 0 { return Err(crate::error::ThothError::Forget( diff --git a/src/lib.rs b/src/lib.rs index 7716c20..52ef385 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,4 +10,5 @@ pub mod recorder; pub mod schema; pub mod search; pub mod session; +pub mod sessions; pub mod tui; diff --git a/src/sessions.rs b/src/sessions.rs new file mode 100644 index 0000000..3fb15bd --- /dev/null +++ b/src/sessions.rs @@ -0,0 +1,394 @@ +use comfy_table::{ContentArrangement, Table}; +use rusqlite::{Connection, ToSql}; + +use crate::error::ThothError; +use crate::search::fmt_timestamp; +use crate::search::parse_date; + +pub struct SessionsArgs { + pub project: Option, + pub since: Option, + pub until: Option, + pub limit: usize, +} + +pub struct SessionRow { + pub id: String, + pub project: String, + pub started_at: i64, + pub ended_at: i64, + pub command_count: i64, + pub tags: Vec, +} + +pub fn build_query( + args: &SessionsArgs, + now: i64, +) -> Result<(String, Vec>), ThothError> { + let mut fragments: Vec = Vec::new(); + let mut params: Vec> = Vec::new(); + + if let Some(ref p) = args.project { + fragments.push("s.project = ?".to_string()); + params.push(Box::new(p.clone())); + } + + if let Some(ref since_str) = args.since { + let ts = parse_date(since_str, now)?; + fragments.push("s.started_at >= ?".to_string()); + params.push(Box::new(ts)); + } + + if let Some(ref until_str) = args.until { + let ts = parse_date(until_str, now)?; + fragments.push("s.started_at <= ?".to_string()); + params.push(Box::new(ts)); + } + + params.push(Box::new(args.limit as i64)); + + let sql = if fragments.is_empty() { + "SELECT s.session_id, s.project, s.started_at, s.ended_at, s.command_count \ + FROM sessions s ORDER BY s.started_at DESC LIMIT ?" + .to_string() + } else { + let where_clause = fragments.join(" AND "); + format!( + "SELECT s.session_id, s.project, s.started_at, s.ended_at, s.command_count \ + FROM sessions s WHERE {where_clause} ORDER BY s.started_at DESC LIMIT ?" + ) + }; + + Ok((sql, params)) +} + +pub fn list_sessions( + conn: &Connection, + args: &SessionsArgs, + now: i64, +) -> Result, ThothError> { + let (sql, params) = build_query(args, now)?; + let mut stmt = conn.prepare(&sql)?; + let rows = stmt.query_map( + rusqlite::params_from_iter(params.iter().map(|p| p.as_ref())), + |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, String>(1)?, + row.get::<_, i64>(2)?, + row.get::<_, i64>(3)?, + row.get::<_, i64>(4)?, + )) + }, + )?; + + let mut result = Vec::new(); + for row in rows { + let (id, project, started_at, ended_at, command_count) = row?; + + let tags = collect_session_tags(conn, &id)?; + + result.push(SessionRow { + id, + project, + started_at, + ended_at, + command_count, + tags, + }); + } + Ok(result) +} + +fn collect_session_tags(conn: &Connection, session_id: &str) -> Result, ThothError> { + let mut stmt = conn.prepare( + "SELECT DISTINCT value FROM commands, json_each(commands.tags) \ + WHERE session_id = ? AND value != '' ORDER BY value", + )?; + let tags: rusqlite::Result> = stmt + .query_map(rusqlite::params![session_id], |row| row.get(0))? + .collect(); + Ok(tags?) +} + +pub fn render(rows: &[SessionRow]) -> String { + if rows.is_empty() { + return String::from("No sessions found.\n"); + } + + let mut table = Table::new(); + table.set_content_arrangement(ContentArrangement::Dynamic); + table.set_header(vec![ + "session", "project", "started", "ended", "commands", "tags", + ]); + + for row in rows { + let short_id = &row.id[..row.id.len().min(8)]; + let tags_str = if row.tags.is_empty() { + String::from("-") + } else { + row.tags.join(",") + }; + table.add_row(vec![ + short_id.to_string(), + row.project.clone(), + fmt_timestamp(row.started_at), + fmt_timestamp(row.ended_at), + row.command_count.to_string(), + tags_str, + ]); + } + + format!("{table}\n{} session(s)\n", rows.len()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::database::{apply_migrations, connect_memory}; + + const FIXED_NOW: i64 = 1_700_000_000; + + fn mem_conn() -> Connection { + let mut c = connect_memory().unwrap(); + apply_migrations(&mut c).unwrap(); + c + } + + fn default_args() -> SessionsArgs { + SessionsArgs { + project: None, + since: None, + until: None, + limit: 20, + } + } + + fn insert_session(conn: &Connection, id: &str, project: &str, started: i64, ended: i64) { + conn.execute( + "INSERT INTO sessions(session_id, project, started_at, ended_at, command_count) \ + VALUES(?1, ?2, ?3, ?4, 0)", + rusqlite::params![id, project, started, ended], + ) + .unwrap(); + } + + fn insert_command(conn: &Connection, session_id: &str, project: &str, ts: i64, tags: &str) { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ + VALUES('cmd', '/tmp', ?1, ?2, ?3, 0, 100, ?4)", + rusqlite::params![project, session_id, ts, tags], + ) + .unwrap(); + conn.execute( + "UPDATE sessions SET command_count = command_count + 1, ended_at = MAX(ended_at, ?1) \ + WHERE session_id = ?2", + rusqlite::params![ts, session_id], + ) + .unwrap(); + } + + #[test] + fn build_query_no_filters_has_no_where() { + let args = default_args(); + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(!sql.contains("WHERE")); + assert!(sql.contains("ORDER BY s.started_at DESC")); + assert!(sql.contains("LIMIT ?")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_project_filter() { + let args = SessionsArgs { + project: Some("myapp".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("s.project = ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_since_filter() { + let args = SessionsArgs { + since: Some("today".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("s.started_at >= ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_until_filter() { + let args = SessionsArgs { + until: Some("today".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("s.started_at <= ?")); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_combined_filters() { + let args = SessionsArgs { + project: Some("app".into()), + since: Some("today".into()), + until: Some("today".into()), + limit: 5, + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("s.project = ?")); + assert!(sql.contains("s.started_at >= ?")); + assert!(sql.contains("s.started_at <= ?")); + assert_eq!(params.len(), 4); + } + + #[test] + fn list_sessions_ordered_newest_first() { + let conn = mem_conn(); + insert_session(&conn, "sid-old", "app", 1_000, 2_000); + insert_session(&conn, "sid-new", "app", 3_000, 4_000); + let args = default_args(); + let rows = list_sessions(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 2); + assert_eq!(rows[0].id, "sid-new"); + assert_eq!(rows[1].id, "sid-old"); + } + + #[test] + fn list_sessions_command_count_correct() { + let conn = mem_conn(); + insert_session(&conn, "s1", "app", 1_000, 5_000); + insert_command(&conn, "s1", "app", 1_000, "[]"); + insert_command(&conn, "s1", "app", 2_000, "[]"); + insert_command(&conn, "s1", "app", 3_000, "[]"); + let args = default_args(); + let rows = list_sessions(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command_count, 3); + } + + #[test] + fn list_sessions_tags_union_deduped() { + let conn = mem_conn(); + insert_session(&conn, "s1", "app", 1_000, 5_000); + insert_command(&conn, "s1", "app", 1_000, r#"["a"]"#); + insert_command(&conn, "s1", "app", 2_000, r#"["a","b"]"#); + let args = default_args(); + let rows = list_sessions(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows[0].tags, vec!["a", "b"]); + } + + #[test] + fn list_sessions_empty_tags_gives_empty_vec() { + let conn = mem_conn(); + insert_session(&conn, "s1", "app", 1_000, 2_000); + insert_command(&conn, "s1", "app", 1_000, "[]"); + let args = default_args(); + let rows = list_sessions(&conn, &args, FIXED_NOW).unwrap(); + assert!(rows[0].tags.is_empty()); + } + + #[test] + fn list_sessions_project_filter() { + let conn = mem_conn(); + insert_session(&conn, "s-alpha", "alpha", 1_000, 2_000); + insert_session(&conn, "s-beta", "beta", 3_000, 4_000); + let args = SessionsArgs { + project: Some("alpha".into()), + ..default_args() + }; + let rows = list_sessions(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].project, "alpha"); + } + + #[test] + fn list_sessions_limit_respected() { + let conn = mem_conn(); + for i in 0i64..5 { + insert_session(&conn, &format!("sid-{i}"), "app", i * 1000, i * 1000 + 100); + } + let args = SessionsArgs { + limit: 2, + ..default_args() + }; + let rows = list_sessions(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 2); + } + + #[test] + fn render_empty_shows_no_sessions_found() { + let out = render(&[]); + assert_eq!(out, "No sessions found.\n"); + } + + #[test] + fn render_shows_headers_and_footer() { + let rows = vec![SessionRow { + id: "abcdefgh-1234-5678-90ab-cdef01234567".into(), + project: "myapp".into(), + started_at: 1_700_000_000, + ended_at: 1_700_003_600, + command_count: 5, + tags: vec!["rust".into(), "cli".into()], + }]; + let out = render(&rows); + assert!(out.contains("session"), "missing session header"); + assert!(out.contains("project"), "missing project header"); + assert!(out.contains("started"), "missing started header"); + assert!(out.contains("ended"), "missing ended header"); + assert!(out.contains("commands"), "missing commands header"); + assert!(out.contains("tags"), "missing tags header"); + assert!(out.contains("1 session(s)"), "missing footer"); + } + + #[test] + fn render_short_id_is_first_8_chars() { + let rows = vec![SessionRow { + id: "abcdefgh-1234".into(), + project: "p".into(), + started_at: 1_700_000_000, + ended_at: 1_700_000_000, + command_count: 1, + tags: vec![], + }]; + let out = render(&rows); + assert!(out.contains("abcdefgh"), "expected 8-char prefix"); + assert!( + !out.contains("abcdefgh-"), + "must not show more than 8 chars from id" + ); + } + + #[test] + fn render_empty_tags_shows_dash() { + let rows = vec![SessionRow { + id: "aaaaaaaa".into(), + project: "p".into(), + started_at: 1_700_000_000, + ended_at: 1_700_000_000, + command_count: 0, + tags: vec![], + }]; + let out = render(&rows); + assert!(out.contains('-'), "empty tags must render as dash"); + } + + #[test] + fn render_tags_joined_by_comma() { + let rows = vec![SessionRow { + id: "aaaaaaaa".into(), + project: "p".into(), + started_at: 1_700_000_000, + ended_at: 1_700_000_000, + command_count: 2, + tags: vec!["a".into(), "b".into()], + }]; + let out = render(&rows); + assert!(out.contains("a,b"), "tags must be joined by comma"); + } +} diff --git a/tests/sessions_e2e.rs b/tests/sessions_e2e.rs new file mode 100644 index 0000000..bf464b0 --- /dev/null +++ b/tests/sessions_e2e.rs @@ -0,0 +1,222 @@ +use assert_cmd::Command; +use tempfile::TempDir; + +fn tth() -> Command { + Command::cargo_bin("tth").unwrap() +} + +struct RecordInput<'a> { + cmd: &'a str, + dir: &'a str, + tags: &'a str, + ts: i64, +} + +fn record(db: &str, log: &str, r: RecordInput<'_>) { + tth() + .env("THOTH_DB", db) + .env("THOTH_ERROR_LOG", log) + .args([ + "record", + "--cmd", + r.cmd, + "--dir", + r.dir, + "--exit", + "0", + "--duration", + "100", + "--tags", + r.tags, + "--timestamp", + &r.ts.to_string(), + ]) + .assert() + .code(0); +} + +struct Fixture { + _dir: TempDir, + db: String, + log: String, + alpha_dir: String, + beta_dir: String, +} + +fn setup() -> Fixture { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db").to_string_lossy().to_string(); + let log = dir.path().join("error.log").to_string_lossy().to_string(); + + let alpha = dir.path().join("alpha"); + let beta = dir.path().join("beta"); + std::fs::create_dir_all(alpha.join(".git")).unwrap(); + std::fs::create_dir_all(beta.join(".git")).unwrap(); + + let alpha_str = alpha.to_string_lossy().to_string(); + let beta_str = beta.to_string_lossy().to_string(); + + let base: i64 = 1_700_000_000; + + record( + &db, + &log, + RecordInput { + cmd: "cargo build", + dir: &alpha_str, + tags: r#"["rust","cli"]"#, + ts: base, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "cargo test", + dir: &alpha_str, + tags: r#"["rust"]"#, + ts: base + 300, + }, + ); + + let beta_start = base + 2 * 3600; + record( + &db, + &log, + RecordInput { + cmd: "make build", + dir: &beta_str, + tags: r#"["c"]"#, + ts: beta_start, + }, + ); + + Fixture { + _dir: dir, + db, + log, + alpha_dir: alpha_str, + beta_dir: beta_str, + } +} + +#[test] +fn sessions_lists_newest_first() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["sessions"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + + assert!(text.contains("2 session(s)"), "expected footer with count"); + + let session_col_pos = text.find("session").unwrap_or(0); + let beta_pos = text.find(&f.beta_dir.split('/').last().unwrap_or("beta")[..4.min(f.beta_dir.len())]).unwrap_or(usize::MAX); + let alpha_pos = text.find("alpha").unwrap_or(usize::MAX); + assert!( + beta_pos < alpha_pos || session_col_pos == 0, + "beta session (newer) should appear before alpha in output" + ); +} + +#[test] +fn sessions_project_filter() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["sessions", "--project", "alpha"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + + assert!( + text.contains("1 session(s)"), + "expected 1 session for alpha; got:\n{text}" + ); + assert!(text.contains("alpha"), "expected alpha in output"); +} + +#[test] +fn sessions_limit_caps_results() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["sessions", "--limit", "1"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + + assert!( + text.contains("1 session(s)"), + "expected 1 session(s) footer; got:\n{text}" + ); +} + +#[test] +fn sessions_empty_db_shows_no_sessions_found() { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db").to_string_lossy().to_string(); + let log = dir.path().join("error.log").to_string_lossy().to_string(); + + let out = tth() + .env("THOTH_DB", &db) + .env("THOTH_ERROR_LOG", &log) + .args(["sessions"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.contains("No sessions found."), + "expected 'No sessions found.'; got:\n{text}" + ); +} + +#[test] +fn sessions_shows_tags_union() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["sessions", "--project", "alpha"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.contains("cli") && text.contains("rust"), + "expected both rust and cli tags for alpha session; got:\n{text}" + ); +} + +#[test] +fn sessions_bad_since_exits_nonzero() { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db").to_string_lossy().to_string(); + let log = dir.path().join("error.log").to_string_lossy().to_string(); + + tth() + .env("THOTH_DB", &db) + .env("THOTH_ERROR_LOG", &log) + .args(["sessions", "--since", "bad-date"]) + .assert() + .failure(); +} From aa92ce8f064a19b0d6451e2f0ac07efaf3535fb0 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 17:39:54 -0600 Subject: [PATCH 064/151] fix(test): clippy and fmt gate on sessions e2e (#22) --- tests/sessions_e2e.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/sessions_e2e.rs b/tests/sessions_e2e.rs index bf464b0..da0bf4d 100644 --- a/tests/sessions_e2e.rs +++ b/tests/sessions_e2e.rs @@ -39,7 +39,6 @@ struct Fixture { _dir: TempDir, db: String, log: String, - alpha_dir: String, beta_dir: String, } @@ -95,7 +94,6 @@ fn setup() -> Fixture { _dir: dir, db, log, - alpha_dir: alpha_str, beta_dir: beta_str, } } @@ -117,7 +115,9 @@ fn sessions_lists_newest_first() { assert!(text.contains("2 session(s)"), "expected footer with count"); let session_col_pos = text.find("session").unwrap_or(0); - let beta_pos = text.find(&f.beta_dir.split('/').last().unwrap_or("beta")[..4.min(f.beta_dir.len())]).unwrap_or(usize::MAX); + let beta_pos = text + .find(&f.beta_dir.split('/').next_back().unwrap_or("beta")[..4.min(f.beta_dir.len())]) + .unwrap_or(usize::MAX); let alpha_pos = text.find("alpha").unwrap_or(usize::MAX); assert!( beta_pos < alpha_pos || session_col_pos == 0, From 5a019c49e668c0622d52a9a17a427f5a9e115c30 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 17:51:15 -0600 Subject: [PATCH 065/151] feat(export): add tth export command (#25) --- src/cli.rs | 31 +++ src/export.rs | 563 ++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/search.rs | 2 +- tests/export_e2e.rs | 341 +++++++++++++++++++++++++++ 5 files changed, 937 insertions(+), 1 deletion(-) create mode 100644 src/export.rs create mode 100644 tests/export_e2e.rs diff --git a/src/cli.rs b/src/cli.rs index 3e00466..7193d11 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -18,6 +18,7 @@ pub enum Cmd { Search(SearchArgs), Sessions(SessionsArgs), Forget(ForgetArgs), + Export(ExportArgs), #[command(hide = true)] NewSessionId, } @@ -93,6 +94,20 @@ pub struct SessionsArgs { pub limit: usize, } +#[derive(clap::Args, Debug, Clone)] +pub struct ExportArgs { + #[arg(long)] + pub session: Option, + #[arg(short = 't', long, action = clap::ArgAction::Append)] + pub tag: Vec, + #[arg(short = 'p', long)] + pub project: Option, + #[arg(long)] + pub since: Option, + #[arg(long)] + pub exit: Option, +} + #[derive(clap::Args, Debug, Clone)] pub struct UninstallArgs { #[arg(long = "keep-data")] @@ -235,6 +250,22 @@ pub fn run() -> Result<(), crate::error::ThothError> { println!("Forgot {} command(s).", ids.len()); } } + Some(Cmd::Export(args)) => { + let conn = crate::database::get_connection(None)?; + let export_args = crate::export::ExportArgs { + session: args.session, + tag: args.tag.clone(), + project: args.project.clone(), + since: args.since, + exit: args.exit, + }; + let rows = crate::export::collect(&conn, &export_args, now)?; + let meta = crate::export::ExportMeta { + project: args.project.as_deref(), + tags: &args.tag, + }; + print!("{}", crate::export::render_script(&rows, &meta, now)); + } Some(Cmd::NewSessionId) => { println!("{}", uuid::Uuid::new_v4()); } diff --git a/src/export.rs b/src/export.rs new file mode 100644 index 0000000..fc6bd31 --- /dev/null +++ b/src/export.rs @@ -0,0 +1,563 @@ +use rusqlite::{Connection, ToSql}; + +use crate::error::ThothError; +use crate::search::{parse_date, ExitFilter}; + +const SECS_PER_DAY: i64 = 86_400; + +pub struct ExportArgs { + pub session: Option, + pub tag: Vec, + pub project: Option, + pub since: Option, + pub exit: Option, +} + +pub struct ExportRow { + pub command: String, + pub directory: String, + pub timestamp: i64, + pub exit_code: i64, + pub duration_ms: i64, +} + +pub struct ExportMeta<'a> { + pub project: Option<&'a str>, + pub tags: &'a [String], +} + +pub fn build_query( + args: &ExportArgs, + now: i64, +) -> Result<(String, Vec>), ThothError> { + let cols = "c.command, c.directory, c.timestamp, c.exit_code, c.duration_ms"; + + let mut fragments: Vec = Vec::new(); + let mut params: Vec> = Vec::new(); + + if let Some(ref p) = args.project { + fragments.push("c.project = ?".to_string()); + params.push(Box::new(p.clone())); + } + + match &args.exit { + Some(ExitFilter::Ok) => { + fragments.push("c.exit_code = 0".to_string()); + } + Some(ExitFilter::Fail) => { + fragments.push("c.exit_code != 0".to_string()); + } + Some(ExitFilter::Any) | None => {} + } + + if let Some(ref since_str) = args.since { + let ts = parse_date(since_str, now)?; + fragments.push("c.timestamp >= ?".to_string()); + params.push(Box::new(ts)); + } + + if let Some(ref sid) = args.session { + fragments.push("c.session_id = ?".to_string()); + params.push(Box::new(sid.clone())); + } + + for tag in &args.tag { + fragments.push("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)".to_string()); + params.push(Box::new(tag.clone())); + } + + let sql = if fragments.is_empty() { + format!("SELECT {cols} FROM commands c ORDER BY c.timestamp ASC, c.id ASC") + } else { + let where_clause = fragments.join(" AND "); + format!( + "SELECT {cols} FROM commands c WHERE {where_clause} ORDER BY c.timestamp ASC, c.id ASC" + ) + }; + + Ok((sql, params)) +} + +pub fn collect( + conn: &Connection, + args: &ExportArgs, + now: i64, +) -> Result, ThothError> { + let (sql, params) = build_query(args, now)?; + let mut stmt = conn.prepare(&sql)?; + let rows = stmt.query_map( + rusqlite::params_from_iter(params.iter().map(|p| p.as_ref())), + |row| { + Ok(ExportRow { + command: row.get(0)?, + directory: row.get(1)?, + timestamp: row.get(2)?, + exit_code: row.get(3)?, + duration_ms: row.get(4)?, + }) + }, + )?; + let mut result = Vec::new(); + for row in rows { + result.push(row?); + } + Ok(result) +} + +pub fn fmt_hms(epoch: i64) -> String { + let time_secs = epoch.rem_euclid(SECS_PER_DAY); + let hh = time_secs / 3600; + let mm = (time_secs % 3600) / 60; + let ss = time_secs % 60; + format!("{hh:02}:{mm:02}:{ss:02}") +} + +fn fmt_duration(ms: i64) -> String { + if ms < 1000 { + format!("{ms}ms") + } else { + let s = ms as f64 / 1000.0; + let tenths = (s * 10.0).round() as i64; + if tenths % 10 == 0 { + format!("{}s", tenths / 10) + } else { + format!("{:.1}s", s) + } + } +} + +pub fn render_script(rows: &[ExportRow], meta: &ExportMeta<'_>, now: i64) -> String { + let date_str = { + let days = now.div_euclid(SECS_PER_DAY); + let (y, mo, d) = crate::search::civil_from_days(days); + format!("{y:04}-{mo:02}-{d:02}") + }; + + let project_label = meta.project.unwrap_or("all"); + let tags_label = if meta.tags.is_empty() { + "none".to_string() + } else { + meta.tags.join(", ") + }; + + let mut out = String::new(); + out.push_str("#!/usr/bin/env bash\n"); + out.push_str("# Thoth export\n"); + out.push_str(&format!("# Project: {project_label}\n")); + out.push_str(&format!("# Tags: {tags_label}\n")); + out.push_str(&format!("# Exported: {date_str}\n")); + + if rows.is_empty() { + out.push_str("# (no commands matched)\n"); + return out; + } + + for row in rows { + let hms = fmt_hms(row.timestamp); + let dur = fmt_duration(row.duration_ms); + out.push('\n'); + out.push_str(&format!( + "# [{hms}] [{}] [exit: {}] [duration: {dur}]\n", + row.directory, row.exit_code + )); + out.push_str(&row.command); + out.push('\n'); + } + + out +} + +#[cfg(test)] +mod tests { + use super::*; + + const FIXED_NOW: i64 = 1_700_000_000; + + fn default_args() -> ExportArgs { + ExportArgs { + session: None, + tag: vec![], + project: None, + since: None, + exit: None, + } + } + + fn mem_conn() -> rusqlite::Connection { + let mut c = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut c).unwrap(); + c + } + + struct SeedRow<'a> { + cmd: &'a str, + project: &'a str, + ts: i64, + exit: i64, + dur: i64, + tags: &'a str, + session: &'a str, + } + + fn seed(conn: &rusqlite::Connection, r: SeedRow<'_>) { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ + VALUES(?1, '/tmp', ?2, ?3, ?4, ?5, ?6, ?7)", + rusqlite::params![r.cmd, r.project, r.session, r.ts, r.exit, r.dur, r.tags], + ) + .unwrap(); + } + + fn s<'a>( + cmd: &'a str, + project: &'a str, + ts: i64, + exit: i64, + dur: i64, + tags: &'a str, + session: &'a str, + ) -> SeedRow<'a> { + SeedRow { + cmd, + project, + ts, + exit, + dur, + tags, + session, + } + } + + #[test] + fn build_query_no_filters_has_no_where_asc_order_no_limit() { + let args = default_args(); + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(!sql.contains("WHERE"), "no WHERE clause expected"); + assert!( + sql.contains("ORDER BY c.timestamp ASC"), + "must order ASC; got: {sql}" + ); + assert!(!sql.contains("LIMIT"), "no LIMIT expected"); + assert_eq!(params.len(), 0); + } + + #[test] + fn build_query_project_filter() { + let args = ExportArgs { + project: Some("foo".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.project = ?")); + assert!(sql.contains("ORDER BY c.timestamp ASC")); + assert!(!sql.contains("LIMIT")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_one_tag() { + let args = ExportArgs { + tag: vec!["rust".into()], + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_two_tags_both_present() { + let args = ExportArgs { + tag: vec!["rust".into(), "cli".into()], + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + let count = sql + .matches("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)") + .count(); + assert_eq!(count, 2, "two tag clauses expected for AND semantics"); + assert_eq!(params.len(), 2); + } + + #[test] + fn build_query_since() { + let args = ExportArgs { + since: Some("today".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.timestamp >= ?")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_exit_ok() { + let args = ExportArgs { + exit: Some(ExitFilter::Ok), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.exit_code = 0")); + assert_eq!(params.len(), 0); + } + + #[test] + fn build_query_exit_fail() { + let args = ExportArgs { + exit: Some(ExitFilter::Fail), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.exit_code != 0")); + assert_eq!(params.len(), 0); + } + + #[test] + fn build_query_exit_any_no_exit_clause() { + let args = ExportArgs { + exit: Some(ExitFilter::Any), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(!sql.contains("exit_code = 0") && !sql.contains("exit_code != 0")); + assert_eq!(params.len(), 0); + } + + #[test] + fn build_query_session_filter() { + let args = ExportArgs { + session: Some("sess-abc".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.session_id = ?")); + assert_eq!(params.len(), 1); + } + + #[test] + fn build_query_combined_no_fts_no_limit() { + let args = ExportArgs { + project: Some("myapp".into()), + tag: vec!["infra".into()], + since: Some("today".into()), + exit: Some(ExitFilter::Ok), + session: Some("sess-x".into()), + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!(sql.contains("c.project = ?")); + assert!(sql.contains("c.exit_code = 0")); + assert!(sql.contains("c.timestamp >= ?")); + assert!(sql.contains("c.session_id = ?")); + assert!(sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)")); + assert!(!sql.contains("LIMIT")); + assert!(!sql.contains("JOIN")); + assert!(sql.contains("ORDER BY c.timestamp ASC")); + assert_eq!(params.len(), 4); + } + + #[test] + fn fmt_hms_known_epoch() { + let epoch = 1_700_000_000_i64; + let result = fmt_hms(epoch); + assert_eq!(result, "22:13:20"); + } + + #[test] + fn fmt_hms_midnight() { + let result = fmt_hms(0); + assert_eq!(result, "00:00:00"); + } + + #[test] + fn fmt_hms_end_of_day() { + let result = fmt_hms(86399); + assert_eq!(result, "23:59:59"); + } + + #[test] + fn render_script_starts_with_shebang() { + let rows: Vec = vec![]; + let meta = ExportMeta { + project: None, + tags: &[], + }; + let out = render_script(&rows, &meta, FIXED_NOW); + assert!( + out.starts_with("#!/usr/bin/env bash\n"), + "shebang must be first line" + ); + } + + #[test] + fn render_script_metadata_lines_present() { + let rows: Vec = vec![]; + let meta = ExportMeta { + project: Some("myproj"), + tags: &["rust".to_string()], + }; + let out = render_script(&rows, &meta, FIXED_NOW); + assert!(out.contains("# Thoth export\n")); + assert!(out.contains("# Project: myproj\n")); + assert!(out.contains("# Tags: rust\n")); + assert!(out.contains("# Exported: 2023-11-14\n")); + } + + #[test] + fn render_script_no_project_shows_all() { + let rows: Vec = vec![]; + let meta = ExportMeta { + project: None, + tags: &[], + }; + let out = render_script(&rows, &meta, FIXED_NOW); + assert!(out.contains("# Project: all\n")); + assert!(out.contains("# Tags: none\n")); + } + + #[test] + fn render_script_empty_rows_has_no_commands_comment() { + let rows: Vec = vec![]; + let meta = ExportMeta { + project: None, + tags: &[], + }; + let out = render_script(&rows, &meta, FIXED_NOW); + assert!(out.contains("# (no commands matched)")); + } + + #[test] + fn render_script_row_comment_and_command() { + let rows = vec![ExportRow { + command: "cargo build".into(), + directory: "/home/user/proj".into(), + timestamp: 1_700_000_000, + exit_code: 0, + duration_ms: 500, + }]; + let meta = ExportMeta { + project: None, + tags: &[], + }; + let out = render_script(&rows, &meta, FIXED_NOW); + assert!( + out.contains("# [22:13:20] [/home/user/proj] [exit: 0] [duration: 500ms]\n"), + "row comment must be present; got:\n{out}" + ); + assert!(out.contains("cargo build\n")); + } + + #[test] + fn render_script_chronological_order() { + let rows = vec![ + ExportRow { + command: "first_cmd".into(), + directory: "/tmp".into(), + timestamp: 1_700_000_000, + exit_code: 0, + duration_ms: 100, + }, + ExportRow { + command: "second_cmd".into(), + directory: "/tmp".into(), + timestamp: 1_700_001_000, + exit_code: 0, + duration_ms: 200, + }, + ]; + let meta = ExportMeta { + project: None, + tags: &[], + }; + let out = render_script(&rows, &meta, FIXED_NOW); + let first_pos = out.find("first_cmd").unwrap(); + let second_pos = out.find("second_cmd").unwrap(); + assert!( + first_pos < second_pos, + "first_cmd must appear before second_cmd" + ); + } + + #[test] + fn collect_returns_oldest_first() { + let conn = mem_conn(); + seed(&conn, s("cmd_a", "p", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("cmd_b", "p", 3_000, 0, 100, "[]", "s1")); + seed(&conn, s("cmd_c", "p", 2_000, 0, 100, "[]", "s1")); + let args = default_args(); + let rows = collect(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 3); + assert_eq!(rows[0].command, "cmd_a"); + assert_eq!(rows[1].command, "cmd_c"); + assert_eq!(rows[2].command, "cmd_b"); + } + + #[test] + fn collect_project_filter() { + let conn = mem_conn(); + seed(&conn, s("alpha_cmd", "alpha", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("beta_cmd", "beta", 2_000, 0, 100, "[]", "s1")); + let args = ExportArgs { + project: Some("alpha".into()), + ..default_args() + }; + let rows = collect(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "alpha_cmd"); + } + + #[test] + fn collect_tag_filter() { + let conn = mem_conn(); + seed(&conn, s("tagged", "p", 1_000, 0, 100, r#"["rust"]"#, "s1")); + seed(&conn, s("untagged", "p", 2_000, 0, 100, "[]", "s1")); + let args = ExportArgs { + tag: vec!["rust".into()], + ..default_args() + }; + let rows = collect(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "tagged"); + } + + #[test] + fn collect_exit_filter_ok() { + let conn = mem_conn(); + seed(&conn, s("ok_cmd", "p", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("fail_cmd", "p", 2_000, 1, 100, "[]", "s1")); + let args = ExportArgs { + exit: Some(ExitFilter::Ok), + ..default_args() + }; + let rows = collect(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "ok_cmd"); + } + + #[test] + fn collect_session_filter() { + let conn = mem_conn(); + seed(&conn, s("sess_a", "p", 1_000, 0, 100, "[]", "session-a")); + seed(&conn, s("sess_b", "p", 2_000, 0, 100, "[]", "session-b")); + let args = ExportArgs { + session: Some("session-a".into()), + ..default_args() + }; + let rows = collect(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "sess_a"); + } + + #[test] + fn collect_since_filter() { + let conn = mem_conn(); + seed(&conn, s("old_cmd", "p", 100, 0, 100, "[]", "s1")); + seed(&conn, s("new_cmd", "p", 1_700_000_000, 0, 100, "[]", "s1")); + let args = ExportArgs { + since: Some("2020-01-01".into()), + ..default_args() + }; + let rows = collect(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "new_cmd"); + } +} diff --git a/src/lib.rs b/src/lib.rs index 52ef385..50d806c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ pub mod cli; pub mod database; pub mod error; +pub mod export; pub mod forget; pub mod hooks; pub mod logging; diff --git a/src/search.rs b/src/search.rs index ada6d3b..4181315 100644 --- a/src/search.rs +++ b/src/search.rs @@ -346,7 +346,7 @@ pub(crate) fn fmt_timestamp(epoch: i64) -> String { format!("{y:04}-{mo:02}-{d:02} {hh:02}:{mm:02}") } -fn civil_from_days(z: i64) -> (i64, i64, i64) { +pub(crate) fn civil_from_days(z: i64) -> (i64, i64, i64) { let z = z + DAYS_FROM_EPOCH_TO_YEAR_ZERO; let era = z.div_euclid(146_097); let doe = z - era * 146_097; diff --git a/tests/export_e2e.rs b/tests/export_e2e.rs new file mode 100644 index 0000000..f22ee50 --- /dev/null +++ b/tests/export_e2e.rs @@ -0,0 +1,341 @@ +use assert_cmd::Command; +use tempfile::TempDir; + +fn tth() -> Command { + Command::cargo_bin("tth").unwrap() +} + +struct RecordInput<'a> { + cmd: &'a str, + dir: &'a str, + exit: i64, + dur: i64, + tags: &'a str, + ts: i64, +} + +fn record(db: &str, log: &str, r: RecordInput<'_>) { + tth() + .env("THOTH_DB", db) + .env("THOTH_ERROR_LOG", log) + .args([ + "record", + "--cmd", + r.cmd, + "--dir", + r.dir, + "--exit", + &r.exit.to_string(), + "--duration", + &r.dur.to_string(), + "--tags", + r.tags, + "--timestamp", + &r.ts.to_string(), + ]) + .assert() + .code(0); +} + +struct Fixture { + _dir: TempDir, + db: String, + log: String, + alpha_dir: String, + _beta_dir: String, +} + +fn setup() -> Fixture { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db").to_string_lossy().to_string(); + let log = dir.path().join("error.log").to_string_lossy().to_string(); + + let alpha = dir.path().join("alpha"); + let beta = dir.path().join("beta"); + std::fs::create_dir_all(alpha.join(".git")).unwrap(); + std::fs::create_dir_all(beta.join(".git")).unwrap(); + + let alpha_dir = alpha.to_string_lossy().to_string(); + let beta_dir = beta.to_string_lossy().to_string(); + + record( + &db, + &log, + RecordInput { + cmd: "cargo build", + dir: &alpha_dir, + exit: 0, + dur: 1200, + tags: r#"["rust"]"#, + ts: 1_700_000_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "make test", + dir: &beta_dir, + exit: 1, + dur: 500, + tags: "[]", + ts: 1_700_001_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "docker run nginx", + dir: &alpha_dir, + exit: 0, + dur: 3000, + tags: r#"["docker","infra"]"#, + ts: 1_700_002_000, + }, + ); + + Fixture { + _dir: dir, + db, + log, + alpha_dir, + _beta_dir: beta_dir.to_string(), + } +} + +#[test] +fn export_no_filters_exits_0_and_starts_with_shebang() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["export"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.starts_with("#!/usr/bin/env bash\n"), + "output must start with shebang; got:\n{text}" + ); + assert!(text.contains("# Thoth export")); + assert!(text.contains("cargo build")); + assert!(text.contains("make test")); + assert!(text.contains("docker run nginx")); +} + +#[test] +fn export_chronological_order() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["export"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + let pos_first = text.find("cargo build").unwrap(); + let pos_second = text.find("make test").unwrap(); + let pos_third = text.find("docker run nginx").unwrap(); + assert!( + pos_first < pos_second && pos_second < pos_third, + "commands must appear in chronological order" + ); +} + +#[test] +fn export_row_comment_format() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["export"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.contains("[22:13:20]"), + "HH:MM:SS comment expected; got:\n{text}" + ); + assert!(text.contains("[exit: 0]")); + assert!(text.contains("[duration: 1.2s]")); + assert!(text.contains(&format!("[{}]", f.alpha_dir))); +} + +#[test] +fn export_project_filter() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["export", "--project", "alpha"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!(text.contains("cargo build")); + assert!(text.contains("docker run nginx")); + assert!(!text.contains("make test")); + assert!(text.contains("# Project: alpha")); +} + +#[test] +fn export_exit_fail_filter() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["export", "--exit", "fail"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!(text.contains("make test")); + assert!(!text.contains("cargo build")); +} + +#[test] +fn export_tag_filter() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["export", "--tag", "rust"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!(text.contains("cargo build")); + assert!(!text.contains("make test")); + assert!(!text.contains("docker run nginx")); + assert!(text.contains("# Tags: rust")); +} + +#[test] +fn export_session_filter() { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db").to_string_lossy().to_string(); + let log = dir.path().join("error.log").to_string_lossy().to_string(); + + let alpha = dir.path().join("alpha"); + let beta = dir.path().join("beta"); + std::fs::create_dir_all(alpha.join(".git")).unwrap(); + std::fs::create_dir_all(beta.join(".git")).unwrap(); + + let alpha_dir = alpha.to_string_lossy().to_string(); + let beta_dir = beta.to_string_lossy().to_string(); + + record( + &db, + &log, + RecordInput { + cmd: "alpha_cmd_1", + dir: &alpha_dir, + exit: 0, + dur: 100, + tags: "[]", + ts: 1_700_000_000, + }, + ); + record( + &db, + &log, + RecordInput { + cmd: "beta_cmd_1", + dir: &beta_dir, + exit: 0, + dur: 100, + tags: "[]", + ts: 1_700_000_001, + }, + ); + let conn = rusqlite::Connection::open(&db).unwrap(); + let alpha_session_id: String = conn + .query_row( + "SELECT session_id FROM commands WHERE command = 'alpha_cmd_1' LIMIT 1", + [], + |r| r.get(0), + ) + .unwrap(); + + let out = tth() + .env("THOTH_DB", &db) + .env("THOTH_ERROR_LOG", &log) + .args(["export", "--session", &alpha_session_id]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.contains("alpha_cmd_1"), + "alpha_cmd_1 must be in session export; got:\n{text}" + ); + assert!( + !text.contains("beta_cmd_1"), + "beta_cmd_1 must be excluded; got:\n{text}" + ); +} + +#[test] +fn export_empty_result_still_valid_bash() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["export", "--project", "no-such-project"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + let text = String::from_utf8_lossy(&out); + assert!( + text.starts_with("#!/usr/bin/env bash\n"), + "even empty export must start with shebang" + ); + assert!(text.contains("# (no commands matched)")); +} + +#[test] +fn export_output_parses_as_bash() { + let f = setup(); + let out = tth() + .env("THOTH_DB", &f.db) + .env("THOTH_ERROR_LOG", &f.log) + .args(["export"]) + .assert() + .code(0) + .get_output() + .stdout + .clone(); + + let dir = TempDir::new().unwrap(); + let script_path = dir.path().join("exported.sh"); + std::fs::write(&script_path, &out).unwrap(); + + let status = std::process::Command::new("bash") + .args(["-n", script_path.to_str().unwrap()]) + .status() + .unwrap(); + assert!( + status.success(), + "exported script must parse cleanly with bash -n" + ); +} From 1104d726adc291613be43191c9673650044d1660 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 18:22:49 -0600 Subject: [PATCH 066/151] fix(tui): use TableState stateful render to fix scroll past viewport (#27) --- src/tui/app.rs | 8 ----- src/tui/render.rs | 89 +++++++++++++++++++++++++++-------------------- 2 files changed, 51 insertions(+), 46 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index 20e1d1c..32f5893 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -58,7 +58,6 @@ pub struct App { pub all_rows: Vec, pub filtered: Vec, pub selected: usize, - pub scroll: usize, pub filters: FilterState, pub action: Option, } @@ -76,7 +75,6 @@ impl App { all_rows: vec![], filtered: vec![], selected: 0, - scroll: 0, filters: FilterState::new(), action: None, } @@ -95,9 +93,6 @@ impl App { if self.selected > max { self.selected = max; } - if self.scroll > self.selected { - self.scroll = self.selected; - } } pub fn selected_command(&self) -> Option<&str> { @@ -109,9 +104,6 @@ impl App { if self.selected > 0 { self.selected -= 1; } - if self.scroll > self.selected { - self.scroll = self.selected; - } } pub fn move_down(&mut self) { diff --git a/src/tui/render.rs b/src/tui/render.rs index a8acf8d..bea44b7 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -2,7 +2,7 @@ use ratatui::{ layout::{Alignment, Constraint, Layout}, style::{Color, Modifier, Style}, text::{Line, Span}, - widgets::{Block, BorderType, Borders, Cell, Paragraph, Row, Table}, + widgets::{Block, BorderType, Borders, Cell, Paragraph, Row, Table, TableState}, Frame, }; @@ -172,37 +172,15 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let fixed: u16 = time_w + dur_w + exit_w + proj_w + gaps; let cmd_w: u16 = inner_list_area.width.saturating_sub(fixed); - let height = inner_list_area.height as usize; - - let visible: Vec = if app.filtered.is_empty() { - vec![] - } else { - let total = app.filtered.len(); - let scroll = app.scroll.min(total.saturating_sub(1)); - let end = (scroll + height).min(total); - (scroll..end).collect() - }; - - let selected_in_visible = if visible.is_empty() { - None - } else { - let scroll = app.scroll.min(app.filtered.len().saturating_sub(1)); - if app.selected >= scroll && app.selected < scroll + visible.len() { - Some(app.selected - scroll) - } else { - None - } - }; - let dim = Style::default().fg(DIM_COLOR); let cyan = Style::default().fg(ACCENT); let blue = Style::default().fg(Color::Blue); - let rows: Vec = visible + let rows: Vec = app + .filtered .iter() - .enumerate() - .map(|(vi, &fi)| { - let row = &app.all_rows[app.filtered[fi]]; + .map(|&fi| { + let row = &app.all_rows[fi]; let rel = format_relative(row.timestamp, now); let dur = format_duration(row.duration_ms); let (exit_label, exit_color) = exit_text(row.exit_code); @@ -210,14 +188,6 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let cmd = display_command(&row.command); let cmd = truncate(&cmd, cmd_w as usize); - let row_style = if Some(vi) == selected_in_visible { - Style::default() - .add_modifier(Modifier::REVERSED) - .add_modifier(Modifier::BOLD) - } else { - Style::default() - }; - let time_cell = Cell::from(Line::from(vec![Span::styled(rel, dim)])); let dur_cell = Cell::from(Line::from(vec![Span::styled(dur, cyan)])); let exit_cell = Cell::from(Line::from(vec![Span::styled( @@ -227,7 +197,7 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let proj_cell = Cell::from(Line::from(vec![Span::styled(proj, blue)])); let cmd_cell = Cell::from(Line::from(vec![Span::raw(cmd)])); - Row::new([time_cell, dur_cell, exit_cell, proj_cell, cmd_cell]).style(row_style) + Row::new([time_cell, dur_cell, exit_cell, proj_cell, cmd_cell]) }) .collect(); @@ -239,8 +209,21 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { Constraint::Min(1), ]; - let table = Table::new(rows, widths).block(Block::default()); - frame.render_widget(table, inner_list_area); + let highlight_style = Style::default() + .add_modifier(Modifier::REVERSED) + .add_modifier(Modifier::BOLD); + + let table = Table::new(rows, widths) + .block(Block::default()) + .row_highlight_style(highlight_style); + + let selected = if app.filtered.is_empty() { + None + } else { + Some(app.selected) + }; + let mut table_state = TableState::default().with_selected(selected); + frame.render_stateful_widget(table, inner_list_area, &mut table_state); let query_text = format!("> {}", app.query); let query_widget = Paragraph::new(query_text); @@ -534,6 +517,36 @@ mod tests { ); } + #[test] + fn scroll_brings_selected_row_into_view() { + const SMALL_HEIGHT: u16 = 8; + const SMALL_WIDTH: u16 = 80; + let mut app = App::new(); + app.all_rows = (0..20) + .map(|i| make_row(&format!("cmd-row-{i:02}"), TEST_NOW - i * 60, 0, "p")) + .collect(); + app.recompute(); + app.selected = 15; + + let backend = TestBackend::new(SMALL_WIDTH, SMALL_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); + let buf = terminal.backend().buffer().clone(); + + let mut full_text = String::new(); + for row in 0..SMALL_HEIGHT { + for col in 0..SMALL_WIDTH { + full_text.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + full_text.push('\n'); + } + + assert!( + full_text.contains("cmd-row-15"), + "selected row 15 must be visible after scroll; buffer:\n{full_text}" + ); + } + #[test] fn format_action_line_run_produces_correct_prefix() { let action = Action::Run("git pull".to_string()); From a0ea6ace69a5ca9bf35211b98a7155dc67ad71a6 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 18:24:10 -0600 Subject: [PATCH 067/151] fix(search): lighten batch table to UTF8_BORDERS_ONLY preset (#27) --- src/search.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/search.rs b/src/search.rs index 4181315..a58682c 100644 --- a/src/search.rs +++ b/src/search.rs @@ -1,6 +1,6 @@ use std::cmp::Ordering; -use comfy_table::{Cell, Color, ContentArrangement, Table}; +use comfy_table::{presets::UTF8_BORDERS_ONLY, Cell, Color, ContentArrangement, Table}; use rusqlite::{Connection, ToSql}; use crate::error::ThothError; @@ -257,6 +257,7 @@ pub fn render(rows: &[CommandRow], show_session: bool) -> String { fn render_table(rows: &[CommandRow]) -> String { let mut table = Table::new(); + table.load_preset(UTF8_BORDERS_ONLY); table.set_content_arrangement(ContentArrangement::Dynamic); table.set_header(vec![ "timestamp", @@ -303,6 +304,7 @@ fn render_by_session(rows: &[CommandRow]) -> String { output.push_str(&header); let mut sub = Table::new(); + sub.load_preset(UTF8_BORDERS_ONLY); sub.set_content_arrangement(ContentArrangement::Dynamic); sub.set_header(vec!["timestamp", "exit", "duration", "command"]); for r in group { From 74a14dc147850dd0bc374ee155885ba0c2ed1e17 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 18:48:19 -0600 Subject: [PATCH 068/151] feat(tui): bottom-anchored list orientation, atuin-style (#27) --- src/tui/app.rs | 24 ++--- src/tui/event.rs | 57 ++++++---- src/tui/render.rs | 267 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 310 insertions(+), 38 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index 32f5893..6216a5f 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -101,15 +101,15 @@ impl App { } pub fn move_up(&mut self) { - if self.selected > 0 { - self.selected -= 1; + let max = self.filtered.len().saturating_sub(1); + if self.selected < max { + self.selected += 1; } } pub fn move_down(&mut self) { - let max = self.filtered.len().saturating_sub(1); - if self.selected < max { - self.selected += 1; + if self.selected > 0 { + self.selected -= 1; } } } @@ -200,27 +200,27 @@ mod tests { } #[test] - fn move_down_clamps_at_last() { + fn move_up_clamps_at_oldest() { let conn = make_conn(); seed(&conn, "a", 1000); seed(&conn, "b", 2000); let mut app = App::new(); app.reload(&conn, 9999).unwrap(); - app.move_down(); - app.move_down(); - app.move_down(); + app.move_up(); + app.move_up(); + app.move_up(); assert_eq!(app.selected, 1); } #[test] - fn move_up_clamps_at_zero() { + fn move_down_clamps_at_newest() { let conn = make_conn(); seed(&conn, "a", 1000); seed(&conn, "b", 2000); let mut app = App::new(); app.reload(&conn, 9999).unwrap(); - app.move_up(); - app.move_up(); + app.move_down(); + app.move_down(); assert_eq!(app.selected, 0); } diff --git a/src/tui/event.rs b/src/tui/event.rs index dc01617..f8d35a6 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -143,35 +143,56 @@ mod tests { } #[test] - fn up_arrow_moves_selection_up() { + fn up_arrow_moves_to_older_command() { let mut app = app_with_rows(); - app.selected = 1; + app.selected = 0; + let cmd_before = app.selected_command().map(str::to_string); handle_key(key(KeyCode::Up), &mut app); - assert_eq!(app.selected, 0); + let cmd_after = app.selected_command().map(str::to_string); + assert_ne!(cmd_before, cmd_after, "Up must change the selected command"); + assert_eq!( + app.selected, 1, + "Up increases selected index toward older row" + ); } #[test] - fn down_arrow_moves_selection_down() { + fn down_arrow_moves_to_newer_command() { let mut app = app_with_rows(); - app.selected = 0; + app.selected = 1; + let cmd_before = app.selected_command().map(str::to_string); handle_key(key(KeyCode::Down), &mut app); - assert_eq!(app.selected, 1); + let cmd_after = app.selected_command().map(str::to_string); + assert_ne!( + cmd_before, cmd_after, + "Down must change the selected command" + ); + assert_eq!( + app.selected, 0, + "Down decreases selected index toward newer row" + ); } #[test] - fn ctrl_p_moves_selection_up() { + fn ctrl_p_moves_to_older_command() { let mut app = app_with_rows(); - app.selected = 1; + app.selected = 0; handle_key(ctrl(KeyCode::Char('p')), &mut app); - assert_eq!(app.selected, 0); + assert_eq!( + app.selected, 1, + "Ctrl-P increases selected index toward older row" + ); } #[test] - fn ctrl_n_moves_selection_down() { + fn ctrl_n_moves_to_newer_command() { let mut app = app_with_rows(); - app.selected = 0; + app.selected = 1; handle_key(ctrl(KeyCode::Char('n')), &mut app); - assert_eq!(app.selected, 1); + assert_eq!( + app.selected, 0, + "Ctrl-N decreases selected index toward newer row" + ); } #[test] @@ -216,18 +237,18 @@ mod tests { } #[test] - fn up_at_top_is_noop() { + fn up_at_oldest_is_noop() { let mut app = app_with_rows(); - app.selected = 0; + app.selected = 1; handle_key(key(KeyCode::Up), &mut app); - assert_eq!(app.selected, 0); + assert_eq!(app.selected, 1, "Up at oldest row must not go further"); } #[test] - fn down_at_bottom_is_noop() { + fn down_at_newest_is_noop() { let mut app = app_with_rows(); - app.selected = 1; + app.selected = 0; handle_key(key(KeyCode::Down), &mut app); - assert_eq!(app.selected, 1); + assert_eq!(app.selected, 0, "Down at newest row must not go further"); } } diff --git a/src/tui/render.rs b/src/tui/render.rs index bea44b7..10a0491 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -9,6 +9,8 @@ use ratatui::{ use crate::tui::app::App; use crate::tui::time::format_relative; +pub const BOTTOM_ANCHORED: bool = true; + pub fn display_command(raw: &str) -> String { let collapsed: String = raw .chars() @@ -179,6 +181,7 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let rows: Vec = app .filtered .iter() + .rev() .map(|&fi| { let row = &app.all_rows[fi]; let rel = format_relative(row.timestamp, now); @@ -220,7 +223,8 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { let selected = if app.filtered.is_empty() { None } else { - Some(app.selected) + let display_idx = app.filtered.len() - 1 - app.selected; + Some(display_idx) }; let mut table_state = TableState::default().with_selected(selected); frame.render_stateful_widget(table, inner_list_area, &mut table_state); @@ -385,14 +389,18 @@ mod tests { terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); let buf = terminal.backend().buffer().clone(); - let row1_y = 2u16; - let any_reversed = (0..TEST_WIDTH).any(|x| { - buf[(x, row1_y)] - .style() - .add_modifier - .contains(Modifier::REVERSED) + let any_reversed = (0..TEST_HEIGHT).any(|row_y| { + (0..TEST_WIDTH).any(|x| { + buf[(x, row_y)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }) }); - assert!(any_reversed, "selected row must have REVERSED modifier"); + assert!( + any_reversed, + "selected row must have REVERSED modifier somewhere in the frame" + ); } #[test] @@ -609,4 +617,247 @@ mod tests { fn display_command_plain_command_unchanged() { assert_eq!(display_command("ls -la"), "ls -la"); } + + #[test] + fn dump_bottom_anchored_buffers() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + let mut app = App::new(); + app.all_rows = vec![ + make_row("cmd-newest", TEST_NOW - 10, 0, "proj"), + make_row("cmd-newer", TEST_NOW - 60, 0, "proj"), + make_row("cmd-middle", TEST_NOW - 300, 0, "proj"), + make_row("cmd-older", TEST_NOW - 1200, 0, "proj"), + make_row("cmd-oldest", TEST_NOW - 3600, 0, "proj"), + ]; + app.recompute(); + + let (default_buf, _) = render_app_small(&app, 80, 8); + println!("=== DEFAULT (newest at bottom, cursor on newest) ==="); + println!("{default_buf}"); + + let up_key = KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }; + for _ in 0..3 { + handle_key(up_key, &mut app); + } + + let (after_up3, _) = render_app_small(&app, 80, 8); + println!("\n=== AFTER Up x3 (cursor on cmd-older) ==="); + println!("{after_up3}"); + + assert!(default_buf.contains("cmd-newest")); + assert!(after_up3.contains("cmd-older")); + } + + fn app_bottom_anchored() -> App { + let mut app = App::new(); + app.all_rows = vec![ + make_row("newest-cmd", TEST_NOW - 60, 0, "p"), + make_row("middle-cmd", TEST_NOW - 3600, 0, "p"), + make_row("oldest-cmd", TEST_NOW - 7200, 0, "p"), + ]; + app.recompute(); + app + } + + fn render_app_small(app: &App, width: u16, height: u16) -> (String, ratatui::buffer::Buffer) { + let backend = TestBackend::new(width, height); + let mut terminal = Terminal::new(backend).unwrap(); + terminal.draw(|f| draw(f, app, TEST_NOW)).unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..height { + let mut line = String::new(); + for col in 0..width { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line.trim_end().to_string()); + } + (lines.join("\n"), buf) + } + + fn row_y_of(text: &str, buf: &ratatui::buffer::Buffer, width: u16, height: u16) -> Option { + for row in 0..height { + let line: String = (0..width) + .map(|col| buf[(col, row)].symbol().chars().next().unwrap_or(' ')) + .collect(); + if line.contains(text) { + return Some(row); + } + } + None + } + + #[test] + fn bottom_anchored_flag_is_true() { + const { assert!(BOTTOM_ANCHORED, "orientation must be bottom-anchored") }; + } + + #[test] + fn newest_command_renders_below_oldest() { + let app = app_bottom_anchored(); + let (_, buf) = render_app_small(&app, TEST_WIDTH, TEST_HEIGHT); + let newest_y = row_y_of("newest-cmd", &buf, TEST_WIDTH, TEST_HEIGHT) + .expect("newest-cmd must appear in buffer"); + let oldest_y = row_y_of("oldest-cmd", &buf, TEST_WIDTH, TEST_HEIGHT) + .expect("oldest-cmd must appear in buffer"); + assert!( + newest_y > oldest_y, + "newest command must appear on a lower (higher y) row than oldest; newest_y={newest_y} oldest_y={oldest_y}" + ); + } + + #[test] + fn default_selection_is_newest_command() { + let app = app_bottom_anchored(); + let cmd = app.selected_command().expect("must have a selection"); + assert_eq!( + cmd, "newest-cmd", + "default selection must be the most-recent command" + ); + } + + #[test] + fn up_key_moves_to_older_command() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + let mut app = app_bottom_anchored(); + assert_eq!(app.selected_command(), Some("newest-cmd")); + + handle_key( + KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }, + &mut app, + ); + assert_eq!( + app.selected_command(), + Some("middle-cmd"), + "Up from newest must select middle (older) command" + ); + } + + #[test] + fn down_key_moves_to_newer_command() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + let mut app = app_bottom_anchored(); + handle_key( + KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }, + &mut app, + ); + assert_eq!(app.selected_command(), Some("middle-cmd")); + + handle_key( + KeyEvent { + code: KeyCode::Down, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }, + &mut app, + ); + assert_eq!( + app.selected_command(), + Some("newest-cmd"), + "Down from middle must go back to newest" + ); + } + + #[test] + fn up_cannot_go_past_oldest() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + let mut app = app_bottom_anchored(); + let up_key = KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }; + for _ in 0..10 { + handle_key(up_key, &mut app); + } + assert_eq!( + app.selected_command(), + Some("oldest-cmd"), + "Up cannot go past the oldest command" + ); + } + + #[test] + fn down_cannot_go_past_newest() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + let mut app = app_bottom_anchored(); + let down_key = KeyEvent { + code: KeyCode::Down, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }; + for _ in 0..10 { + handle_key(down_key, &mut app); + } + assert_eq!( + app.selected_command(), + Some("newest-cmd"), + "Down cannot go past the newest command" + ); + } + + #[test] + fn bottom_anchored_scroll_keeps_older_row_visible() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + const H: u16 = 8; + const W: u16 = 80; + let mut app = App::new(); + app.all_rows = (0..20) + .map(|i| make_row(&format!("scmd-{i:02}"), TEST_NOW - i as i64 * 60, 0, "p")) + .collect(); + app.recompute(); + + let up_key = KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }; + for _ in 0..15 { + handle_key(up_key, &mut app); + } + + let (_, buf) = render_app_small(&app, W, H); + let mut full_text = String::new(); + for row in 0..H { + for col in 0..W { + full_text.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + full_text.push('\n'); + } + assert!( + full_text.contains("scmd-15"), + "after pressing Up 15 times, selected older row must be visible; buffer:\n{full_text}" + ); + } } From 35943edd672506101cca80307b704f197b8f3f65 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 19:00:06 -0600 Subject: [PATCH 069/151] fix(tui): persist TableState across frames to fix bottom-pinned scroll (#27) --- src/tui/mod.rs | 5 +- src/tui/render.rs | 239 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 230 insertions(+), 14 deletions(-) diff --git a/src/tui/mod.rs b/src/tui/mod.rs index b0ee572..ee97c99 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -12,7 +12,7 @@ use crossterm::{ execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, }; -use ratatui::{backend::CrosstermBackend, Terminal}; +use ratatui::{backend::CrosstermBackend, widgets::TableState, Terminal}; use rusqlite::Connection; use crate::error::ThothError; @@ -68,10 +68,11 @@ pub fn run(conn: &Connection, now: i64) -> Result<(), ThothError> { let mut app = App::new(); app.reload(conn, now)?; + let mut table_state = TableState::default(); loop { terminal - .draw(|f| render::draw(f, &app, now)) + .draw(|f| render::draw(f, &app, now, &mut table_state)) .map_err(|e| ThothError::Tui(format!("draw failed: {e}")))?; if ct_event::poll(std::time::Duration::from_millis(200)) diff --git a/src/tui/render.rs b/src/tui/render.rs index 10a0491..c853518 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -91,7 +91,7 @@ const ACCENT: Color = Color::Cyan; const DIM_COLOR: Color = Color::DarkGray; const BORDER_COLOR: Color = Color::DarkGray; -pub fn draw(frame: &mut Frame, app: &App, now: i64) { +pub fn draw(frame: &mut Frame, app: &App, now: i64, table_state: &mut TableState) { let area = frame.area(); let chunks = Layout::vertical([ @@ -220,14 +220,13 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64) { .block(Block::default()) .row_highlight_style(highlight_style); - let selected = if app.filtered.is_empty() { - None + if app.filtered.is_empty() { + table_state.select(None); } else { let display_idx = app.filtered.len() - 1 - app.selected; - Some(display_idx) - }; - let mut table_state = TableState::default().with_selected(selected); - frame.render_stateful_widget(table, inner_list_area, &mut table_state); + table_state.select(Some(display_idx)); + } + frame.render_stateful_widget(table, inner_list_area, table_state); let query_text = format!("> {}", app.query); let query_widget = Paragraph::new(query_text); @@ -281,7 +280,8 @@ mod tests { fn render_app(app: &App) -> String { let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); - terminal.draw(|f| draw(f, app, TEST_NOW)).unwrap(); + let mut ts = TableState::default(); + terminal.draw(|f| draw(f, app, TEST_NOW, &mut ts)).unwrap(); let buf = terminal.backend().buffer().clone(); let mut lines: Vec = Vec::new(); for row in 0..TEST_HEIGHT { @@ -386,7 +386,8 @@ mod tests { let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); - terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); + let mut ts = TableState::default(); + terminal.draw(|f| draw(f, &app, TEST_NOW, &mut ts)).unwrap(); let buf = terminal.backend().buffer().clone(); let any_reversed = (0..TEST_HEIGHT).any(|row_y| { @@ -482,7 +483,8 @@ mod tests { let app = app_with_rows(); let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); - terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); + let mut ts = TableState::default(); + terminal.draw(|f| draw(f, &app, TEST_NOW, &mut ts)).unwrap(); let buf = terminal.backend().buffer().clone(); let reversed_count = (0..TEST_WIDTH) @@ -538,7 +540,8 @@ mod tests { let backend = TestBackend::new(SMALL_WIDTH, SMALL_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); - terminal.draw(|f| draw(f, &app, TEST_NOW)).unwrap(); + let mut ts = TableState::default(); + terminal.draw(|f| draw(f, &app, TEST_NOW, &mut ts)).unwrap(); let buf = terminal.backend().buffer().clone(); let mut full_text = String::new(); @@ -667,9 +670,19 @@ mod tests { } fn render_app_small(app: &App, width: u16, height: u16) -> (String, ratatui::buffer::Buffer) { + let mut ts = TableState::default(); + render_app_small_with_state(app, width, height, &mut ts) + } + + fn render_app_small_with_state( + app: &App, + width: u16, + height: u16, + ts: &mut TableState, + ) -> (String, ratatui::buffer::Buffer) { let backend = TestBackend::new(width, height); let mut terminal = Terminal::new(backend).unwrap(); - terminal.draw(|f| draw(f, app, TEST_NOW)).unwrap(); + terminal.draw(|f| draw(f, app, TEST_NOW, ts)).unwrap(); let buf = terminal.backend().buffer().clone(); let mut lines: Vec = Vec::new(); for row in 0..height { @@ -860,4 +873,206 @@ mod tests { "after pressing Up 15 times, selected older row must be visible; buffer:\n{full_text}" ); } + + #[test] + fn dump_persistent_scroll_sequence() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + const W: u16 = 80; + const H: u16 = 9; + + let mut app = App::new(); + app.all_rows = (0..12) + .map(|i| make_row(&format!("nav-{i:02}"), TEST_NOW - i as i64 * 60, 0, "p")) + .collect(); + app.recompute(); + + let up_key = KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }; + + let mut ts = TableState::default(); + + let (s0, _) = render_app_small_with_state(&app, W, H, &mut ts); + println!("=== FRAME 0 (default, newest=nav-00 at bottom, highlighted) ===\n{s0}"); + + handle_key(up_key, &mut app); + let (s1, _) = render_app_small_with_state(&app, W, H, &mut ts); + println!("\n=== FRAME 1 (Up x1 - cursor moves UP within viewport, no scroll) ===\n{s1}"); + + handle_key(up_key, &mut app); + let (s2, _) = render_app_small_with_state(&app, W, H, &mut ts); + println!("\n=== FRAME 2 (Up x2 - cursor moves UP within viewport, no scroll) ===\n{s2}"); + + handle_key(up_key, &mut app); + handle_key(up_key, &mut app); + handle_key(up_key, &mut app); + handle_key(up_key, &mut app); + handle_key(up_key, &mut app); + handle_key(up_key, &mut app); + let (s8, _) = render_app_small_with_state(&app, W, H, &mut ts); + println!("\n=== FRAME 8 (Up x8 - content has scrolled, older commands visible) ===\n{s8}"); + } + + fn visible_commands(buf: &ratatui::buffer::Buffer, width: u16, height: u16) -> Vec { + let mut seen = Vec::new(); + for row in 0..height { + let line: String = (0..width) + .map(|col| buf[(col, row)].symbol().chars().next().unwrap_or(' ')) + .collect(); + for i in 0..12u32 { + let name = format!("nav-{i:02}"); + if line.contains(&name) && !seen.contains(&name) { + seen.push(name); + } + } + } + seen + } + + fn highlighted_command( + buf: &ratatui::buffer::Buffer, + width: u16, + height: u16, + ) -> Option { + for row in 0..height { + let any_reversed = (0..width).any(|col| { + buf[(col, row)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }); + if any_reversed { + let line: String = (0..width) + .map(|col| buf[(col, row)].symbol().chars().next().unwrap_or(' ')) + .collect(); + for i in 0..12u32 { + let name = format!("nav-{i:02}"); + if line.contains(&name) { + return Some(name); + } + } + } + } + None + } + + #[test] + fn persistent_state_cursor_moves_before_scroll() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + const W: u16 = 80; + const H: u16 = 9; + + let mut app = App::new(); + app.all_rows = (0..12) + .map(|i| make_row(&format!("nav-{i:02}"), TEST_NOW - i as i64 * 60, 0, "p")) + .collect(); + app.recompute(); + + let up_key = KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }; + + let mut ts = TableState::default(); + + let (_, buf0) = render_app_small_with_state(&app, W, H, &mut ts); + let visible0 = visible_commands(&buf0, W, H); + let highlighted0 = highlighted_command(&buf0, W, H); + + handle_key(up_key, &mut app); + let (_, buf1) = render_app_small_with_state(&app, W, H, &mut ts); + let visible1 = visible_commands(&buf1, W, H); + let highlighted1 = highlighted_command(&buf1, W, H); + + handle_key(up_key, &mut app); + let (_, buf2) = render_app_small_with_state(&app, W, H, &mut ts); + let visible2 = visible_commands(&buf2, W, H); + let highlighted2 = highlighted_command(&buf2, W, H); + + assert!( + highlighted0.is_some(), + "must have a highlighted row at the start" + ); + assert!( + highlighted1.is_some(), + "must have a highlighted row after Up x1" + ); + assert!( + highlighted2.is_some(), + "must have a highlighted row after Up x2" + ); + + assert_ne!( + highlighted0, highlighted1, + "highlight must change after Up x1: before={highlighted0:?} after={highlighted1:?}" + ); + assert_ne!( + highlighted1, highlighted2, + "highlight must change after Up x2: before={highlighted1:?} after={highlighted2:?}" + ); + + assert_eq!( + visible0, visible1, + "visible set must NOT change on the first Up press (cursor moves within viewport, no scroll yet)" + ); + + assert_eq!( + visible1, visible2, + "visible set must NOT change on the second Up press (still within viewport)" + ); + } + + #[test] + fn persistent_state_scrolls_only_at_viewport_edge() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + const W: u16 = 80; + const H: u16 = 9; + + let mut app = App::new(); + app.all_rows = (0..12) + .map(|i| make_row(&format!("nav-{i:02}"), TEST_NOW - i as i64 * 60, 0, "p")) + .collect(); + app.recompute(); + + let up_key = KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }; + + let mut ts = TableState::default(); + let (_, buf_start) = render_app_small_with_state(&app, W, H, &mut ts); + let visible_start = visible_commands(&buf_start, W, H); + + for _ in 0..8 { + handle_key(up_key, &mut app); + render_app_small_with_state(&app, W, H, &mut ts); + } + + let (_, buf_end) = render_app_small_with_state(&app, W, H, &mut ts); + let visible_end = visible_commands(&buf_end, W, H); + + assert_ne!( + visible_start, visible_end, + "after pressing Up enough times to leave the viewport, the visible set must have changed (scroll occurred)" + ); + + let highlighted_end = highlighted_command(&buf_end, W, H); + assert!( + highlighted_end.is_some(), + "selected row must be highlighted and visible after scrolling" + ); + } } From fe29f35d680d946299a63b994aa0bd00690ec420 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 21:57:28 -0600 Subject: [PATCH 070/151] feat(init): add tth init subcommand and write eval line in install (#30) --- src/cli.rs | 11 ++++++ src/hooks.rs | 76 ++++++++++++++++++++++++++++++++++- tests/cli.rs | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+), 2 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 7193d11..36bb7fa 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -19,6 +19,7 @@ pub enum Cmd { Sessions(SessionsArgs), Forget(ForgetArgs), Export(ExportArgs), + Init(InitArgs), #[command(hide = true)] NewSessionId, } @@ -108,6 +109,11 @@ pub struct ExportArgs { pub exit: Option, } +#[derive(clap::Args, Debug, Clone)] +pub struct InitArgs { + pub shell: Option, +} + #[derive(clap::Args, Debug, Clone)] pub struct UninstallArgs { #[arg(long = "keep-data")] @@ -266,6 +272,11 @@ pub fn run() -> Result<(), crate::error::ThothError> { }; print!("{}", crate::export::render_script(&rows, &meta, now)); } + Some(Cmd::Init(args)) => { + let shell_env = std::env::var("SHELL").ok(); + let shell = crate::hooks::detect_shell(args.shell.as_deref(), shell_env.as_deref())?; + print!("{}", crate::hooks::render_init(&shell)); + } Some(Cmd::NewSessionId) => { println!("{}", uuid::Uuid::new_v4()); } diff --git a/src/hooks.rs b/src/hooks.rs index 79c6f0f..02680e7 100644 --- a/src/hooks.rs +++ b/src/hooks.rs @@ -54,6 +54,18 @@ fn hook_body(shell: &Shell) -> &'static str { } } +pub fn render_init(shell: &Shell) -> &'static str { + hook_body(shell) +} + +fn eval_line(shell: &Shell) -> String { + let name = match shell { + Shell::Bash => "bash", + Shell::Zsh => "zsh", + }; + format!("eval \"$(tth init {name})\"") +} + pub fn has_block(content: &str) -> bool { content.contains(SENTINEL_BEGIN) } @@ -128,8 +140,8 @@ pub fn install(shell: &Shell, rc_path: &Path) -> Result "source ~/.bashrc".to_string(), @@ -438,4 +450,64 @@ mod tests { fn bash_hook_is_non_empty() { assert!(!BASH_HOOK.is_empty()); } + + #[test] + fn render_init_zsh_returns_zsh_hook() { + let script = render_init(&Shell::Zsh); + assert!(script.contains("_tth_preexec")); + assert!(script.contains("bindkey '^R'")); + assert!(!script.contains(SENTINEL_BEGIN)); + } + + #[test] + fn render_init_bash_returns_bash_hook() { + let script = render_init(&Shell::Bash); + assert!(script.contains("_thoth_preexec")); + assert!(script.contains("bind -x")); + assert!(!script.contains(SENTINEL_BEGIN)); + } + + #[test] + fn eval_line_zsh_format() { + let line = eval_line(&Shell::Zsh); + assert_eq!(line, "eval \"$(tth init zsh)\""); + } + + #[test] + fn eval_line_bash_format() { + let line = eval_line(&Shell::Bash); + assert_eq!(line, "eval \"$(tth init bash)\""); + } + + #[test] + fn install_writes_eval_line_to_rc() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".zshrc"); + install(&Shell::Zsh, &rc).unwrap(); + let content = std::fs::read_to_string(&rc).unwrap(); + assert!( + content.contains("eval \"$(tth init zsh)\""), + "eval line not found" + ); + assert!( + !content.contains("_tth_preexec"), + "full body must not appear in rc" + ); + } + + #[test] + fn install_migration_replaces_old_body_with_eval_line() { + let dir = TempDir::new().unwrap(); + let rc = tmp_rc(&dir, ".zshrc"); + let old_block = format!( + "{}\n_tth_preexec() {{ : ; }}\n{}", + SENTINEL_BEGIN, SENTINEL_END + ); + std::fs::write(&rc, &old_block).unwrap(); + install(&Shell::Zsh, &rc).unwrap(); + let content = std::fs::read_to_string(&rc).unwrap(); + assert_eq!(content.matches(SENTINEL_BEGIN).count(), 1); + assert!(content.contains("eval \"$(tth init zsh)\"")); + assert!(!content.contains("_tth_preexec() { : ; }")); + } } diff --git a/tests/cli.rs b/tests/cli.rs index e5852a7..7bf3ac5 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -270,6 +270,115 @@ fn uninstall_removes_sentinel_from_rc_file() { assert!(!content.contains("# === THOTH HOOKS BEGIN ===")); } +#[test] +fn init_zsh_prints_hook_script() { + let output = tth().args(["init", "zsh"]).output().unwrap(); + assert!(output.status.success(), "tth init zsh must exit 0"); + let stdout = String::from_utf8(output.stdout).unwrap(); + assert!(stdout.contains("_tth_preexec"), "missing _tth_preexec"); + assert!(stdout.contains("_tth_precmd"), "missing _tth_precmd"); + assert!(stdout.contains("bindkey '^R'"), "missing bindkey '^R'"); + assert!(stdout.contains("tth|tth\\ *"), "missing capture exclusion"); + assert!( + !stdout.contains("# === THOTH HOOKS BEGIN ==="), + "raw script must not contain sentinel" + ); +} + +#[test] +fn init_bash_prints_hook_script() { + let output = tth().args(["init", "bash"]).output().unwrap(); + assert!(output.status.success(), "tth init bash must exit 0"); + let stdout = String::from_utf8(output.stdout).unwrap(); + assert!(stdout.contains("_thoth_preexec"), "missing _thoth_preexec"); + assert!(stdout.contains("_thoth_precmd"), "missing _thoth_precmd"); + assert!(stdout.contains("bind -x"), "missing bind -x"); + assert!(stdout.contains("tth|tth\\ *"), "missing capture exclusion"); + assert!( + !stdout.contains("# === THOTH HOOKS BEGIN ==="), + "raw script must not contain sentinel" + ); +} + +#[test] +fn init_unknown_shell_exits_nonzero() { + tth() + .args(["init", "fish"]) + .assert() + .failure() + .stderr(predicate::str::starts_with("tth: ")); +} + +#[test] +fn install_writes_eval_line_not_full_body() { + let dir = TempDir::new().unwrap(); + let rc = dir.path().join(".zshrc"); + let db_path = dir.path().join("history.db"); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args([ + "install", + "--shell", + "zsh", + "--rc-file", + rc.to_str().unwrap(), + ]) + .assert() + .code(0); + let content = std::fs::read_to_string(&rc).unwrap(); + assert!( + content.contains("eval \"$(tth init zsh)\""), + "eval line not found; got:\n{content}" + ); + assert!( + !content.contains("_tth_preexec"), + "full hook body must not be written to rc" + ); +} + +#[test] +fn install_migration_replaces_old_full_block() { + let dir = TempDir::new().unwrap(); + let rc = dir.path().join(".zshrc"); + let db_path = dir.path().join("history.db"); + let old_block = + "# === THOTH HOOKS BEGIN ===\n_tth_preexec() { : ; }\n# === THOTH HOOKS END ===\n"; + std::fs::write(&rc, old_block).unwrap(); + tth() + .env("THOTH_DB", db_path.to_str().unwrap()) + .env( + "THOTH_ERROR_LOG", + dir.path().join("error.log").to_str().unwrap(), + ) + .args([ + "install", + "--shell", + "zsh", + "--rc-file", + rc.to_str().unwrap(), + ]) + .assert() + .code(0); + let content = std::fs::read_to_string(&rc).unwrap(); + assert_eq!( + content.matches("# === THOTH HOOKS BEGIN ===").count(), + 1, + "expected exactly one sentinel block" + ); + assert!( + content.contains("eval \"$(tth init zsh)\""), + "eval line not found after migration" + ); + assert!( + !content.contains("_tth_preexec() { : ; }"), + "old body still present after migration" + ); +} + #[test] fn status_exits_0_and_prints_info() { let dir = TempDir::new().unwrap(); From 1c4c7686e579c6731cdbe0c653bdad1cd0080476 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 21:59:13 -0600 Subject: [PATCH 071/151] test(init): add tth init syntax and function-definition checks to test_hooks.sh (#30) --- scripts/test_hooks.sh | 64 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/scripts/test_hooks.sh b/scripts/test_hooks.sh index 5835b3c..4c85c6f 100755 --- a/scripts/test_hooks.sh +++ b/scripts/test_hooks.sh @@ -430,6 +430,67 @@ _run_bash_parse_edit_prefix() { fi } +_run_init_zsh_syntax_check() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for init zsh syntax check" + return + fi + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + local script_file="$tmpdir/init_zsh.zsh" + "$TTH_BIN" init zsh > "$script_file" 2>/dev/null + if zsh -n "$script_file" 2>/dev/null; then + _pass "tth init zsh: output is syntactically valid zsh" + else + _fail "tth init zsh: syntax error in output" + fi +} + +_run_init_bash_syntax_check() { + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + local script_file="$tmpdir/init_bash.bash" + "$TTH_BIN" init bash > "$script_file" 2>/dev/null + if bash -n "$script_file" 2>/dev/null; then + _pass "tth init bash: output is syntactically valid bash" + else + _fail "tth init bash: syntax error in output" + fi +} + +_run_init_zsh_defines_hooks() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for init zsh function-definition check" + return + fi + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + local stub_bin="$tmpdir/tth" + cat > "$stub_bin" <<'STUB' +#!/usr/bin/env bash +echo "$@" +STUB + chmod +x "$stub_bin" + local result + result="$(PATH="$tmpdir:$PATH" TTH_SESSION_ID="test" zsh --no-rcs -c " + source <(\"$TTH_BIN\" init zsh) 2>/dev/null || true + typeset -f _tth_preexec >/dev/null 2>&1 && echo defined_preexec + typeset -f _tth_precmd >/dev/null 2>&1 && echo defined_precmd + typeset -f _tth_widget >/dev/null 2>&1 && echo defined_widget + " 2>/dev/null)" + local ok=1 + for marker in defined_preexec defined_precmd defined_widget; do + if [[ "$result" != *"$marker"* ]]; then + _fail "tth init zsh: $marker not defined after sourcing output" + ok=0 + fi + done + [[ $ok -eq 1 ]] && _pass "tth init zsh: hook functions defined after sourcing output" +} + echo "=== Thoth shell hook smoke tests ===" _run_bash_version_check _run_bash_syntax_check @@ -449,6 +510,9 @@ _run_zsh_parse_run_prefix _run_zsh_parse_edit_prefix _run_bash_parse_run_prefix _run_bash_parse_edit_prefix +_run_init_zsh_syntax_check +_run_init_bash_syntax_check +_run_init_zsh_defines_hooks echo "---" echo "PASS=$PASS FAIL=$FAIL SKIP=$SKIP" From 6180388adf913e0ed9dcae717484b73ac0e9f170 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 22:11:11 -0600 Subject: [PATCH 072/151] feat(tags): add tth tag/untag/tags/prompt commands and shell wrappers (#29) --- scripts/test_hooks.sh | 123 ++++++++++++++++++++++++- shells/thoth.bash | 12 +++ shells/thoth.zsh | 12 +++ src/cli.rs | 113 +++++++++++++++++++++++ src/error.rs | 6 ++ src/lib.rs | 1 + src/tags.rs | 208 ++++++++++++++++++++++++++++++++++++++++++ tests/tags_e2e.rs | 167 +++++++++++++++++++++++++++++++++ 8 files changed, 641 insertions(+), 1 deletion(-) create mode 100644 src/tags.rs create mode 100644 tests/tags_e2e.rs diff --git a/scripts/test_hooks.sh b/scripts/test_hooks.sh index 4c85c6f..15ddfe7 100755 --- a/scripts/test_hooks.sh +++ b/scripts/test_hooks.sh @@ -491,7 +491,125 @@ STUB [[ $ok -eq 1 ]] && _pass "tth init zsh: hook functions defined after sourcing output" } -echo "=== Thoth shell hook smoke tests ===" +_run_tth_tag_zsh_test() { + if ! command -v zsh >/dev/null 2>&1; then + _skip "zsh not available for tth-tag test" + return + fi + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + + local stub_bin="$tmpdir/tth" + cat > "$stub_bin" <<'STUB' +#!/usr/bin/env bash +if [[ "$1" == "tag" ]]; then + shift + echo "export TTH_ACTIVE_TAGS='[\"$1\"]'" + echo "export TTH_PROMPT_TAGS='[$1]'" +elif [[ "$1" == "new-session-id" ]]; then + echo "test-session" +fi +STUB + chmod +x "$stub_bin" + + local result + result="$(PATH="$tmpdir:$PATH" TTH_SESSION_ID="test" zsh --no-rcs -c " + source '${REPO_ROOT}/shells/thoth.zsh' 2>/dev/null || true + typeset -f tth-tag >/dev/null 2>&1 && echo defined_tth_tag + typeset -f tth-untag >/dev/null 2>&1 && echo defined_tth_untag + tth-tag foo 2>/dev/null + echo \"TAGS=\$TTH_ACTIVE_TAGS\" + echo \"PROMPT=\$TTH_PROMPT_TAGS\" + " 2>/dev/null)" + + if [[ "$result" == *"defined_tth_tag"* ]]; then + _pass "zsh: tth-tag function defined after sourcing thoth.zsh" + else + _fail "zsh: tth-tag function NOT defined after sourcing thoth.zsh" + fi + if [[ "$result" == *"defined_tth_untag"* ]]; then + _pass "zsh: tth-untag function defined after sourcing thoth.zsh" + else + _fail "zsh: tth-untag function NOT defined after sourcing thoth.zsh" + fi + if [[ "$result" == *'TAGS=["foo"]'* ]]; then + _pass "zsh: tth-tag foo sets TTH_ACTIVE_TAGS" + else + _fail "zsh: tth-tag foo did not set TTH_ACTIVE_TAGS; got: $result" + fi + if [[ "$result" == *"PROMPT=[foo]"* ]]; then + _pass "zsh: tth-tag foo sets TTH_PROMPT_TAGS=[foo]" + else + _fail "zsh: tth-tag foo did not set TTH_PROMPT_TAGS; got: $result" + fi +} + +_run_tth_tag_bash_test() { + if (( BASH_VERSINFO[0] < 5 )); then + _skip "bash < 5; tth-tag bash test requires bash >= 5" + return + fi + local tmpdir + tmpdir="$(mktemp -d)" + trap 'rm -rf "$tmpdir"' RETURN + + local stub_bin="$tmpdir/tth" + cat > "$stub_bin" <<'STUB' +#!/usr/bin/env bash +if [[ "$1" == "tag" ]]; then + shift + echo "export TTH_ACTIVE_TAGS='[\"$1\"]'" + echo "export TTH_PROMPT_TAGS='[$1]'" +elif [[ "$1" == "new-session-id" ]]; then + echo "test-session" +fi +STUB + chmod +x "$stub_bin" + + local result + result="$(PATH="$tmpdir:$PATH" TTH_SESSION_ID="test" bash --norc --noprofile -c " + source '${REPO_ROOT}/shells/thoth.bash' 2>/dev/null || true + declare -f tth-tag >/dev/null 2>&1 && echo defined_tth_tag + declare -f tth-untag >/dev/null 2>&1 && echo defined_tth_untag + tth-tag bar 2>/dev/null + echo \"TAGS=\$TTH_ACTIVE_TAGS\" + echo \"PROMPT=\$TTH_PROMPT_TAGS\" + " 2>/dev/null)" + + if [[ "$result" == *"defined_tth_tag"* ]]; then + _pass "bash: tth-tag function defined after sourcing thoth.bash" + else + _fail "bash: tth-tag function NOT defined after sourcing thoth.bash" + fi + if [[ "$result" == *"defined_tth_untag"* ]]; then + _pass "bash: tth-untag function defined after sourcing thoth.bash" + else + _fail "bash: tth-untag function NOT defined after sourcing thoth.bash" + fi + if [[ "$result" == *'TAGS=["bar"]'* ]]; then + _pass "bash: tth-tag bar sets TTH_ACTIVE_TAGS" + else + _fail "bash: tth-tag bar did not set TTH_ACTIVE_TAGS; got: $result" + fi + if [[ "$result" == *"PROMPT=[bar]"* ]]; then + _pass "bash: tth-tag bar sets TTH_PROMPT_TAGS=[bar]" + else + _fail "bash: tth-tag bar did not set TTH_PROMPT_TAGS; got: $result" + fi +} + +_run_tth_tag_capture_exclusion() { + local content + content="$(cat "${REPO_ROOT}/shells/thoth.zsh")" + if [[ "$content" == *'tth|tth\ *'* ]] || [[ "$content" == *'tth|tth '*'*'* ]]; then + _pass "thoth.zsh: tth-tag excluded from capture (tth* case pattern covers it)" + else + _fail "thoth.zsh: capture exclusion pattern may not cover tth-tag calls" + fi +} + +echo "=== Thoth shell hook smoke tests and tag tests ===" _run_bash_version_check _run_bash_syntax_check _run_zsh_syntax_check @@ -513,6 +631,9 @@ _run_bash_parse_edit_prefix _run_init_zsh_syntax_check _run_init_bash_syntax_check _run_init_zsh_defines_hooks +_run_tth_tag_zsh_test +_run_tth_tag_bash_test +_run_tth_tag_capture_exclusion echo "---" echo "PASS=$PASS FAIL=$FAIL SKIP=$SKIP" diff --git a/shells/thoth.bash b/shells/thoth.bash index 6f76d49..6096597 100644 --- a/shells/thoth.bash +++ b/shells/thoth.bash @@ -69,3 +69,15 @@ _tth_widget() { } bind -x '"\C-r": _tth_widget' + +tth-tag() { + eval "$(command tth tag "$1")" +} + +tth-untag() { + if [[ "$1" == "--all" ]]; then + eval "$(command tth untag --all)" + else + eval "$(command tth untag "$1")" + fi +} diff --git a/shells/thoth.zsh b/shells/thoth.zsh index d88baf0..6b503a9 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -32,6 +32,18 @@ _tth_precmd() { add-zsh-hook preexec _tth_preexec add-zsh-hook precmd _tth_precmd +tth-tag() { + eval "$(command tth tag "$1")" +} + +tth-untag() { + if [[ "$1" == "--all" ]]; then + eval "$(command tth untag --all)" + else + eval "$(command tth untag "$1")" + fi +} + _tth_widget() { command -v tth >/dev/null 2>&1 || return local out diff --git a/src/cli.rs b/src/cli.rs index 36bb7fa..fde451e 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -20,6 +20,10 @@ pub enum Cmd { Forget(ForgetArgs), Export(ExportArgs), Init(InitArgs), + Tag(TagArgs), + Untag(UntagArgs), + Tags(TagsArgs), + Prompt(PromptArgs), #[command(hide = true)] NewSessionId, } @@ -114,6 +118,30 @@ pub struct InitArgs { pub shell: Option, } +#[derive(clap::Args, Debug, Clone)] +pub struct TagArgs { + pub name: String, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct UntagArgs { + pub name: Option, + #[arg(long)] + pub all: bool, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct TagsArgs { + #[arg(long)] + pub list: bool, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct PromptArgs { + #[arg(long)] + pub shell: Option, +} + #[derive(clap::Args, Debug, Clone)] pub struct UninstallArgs { #[arg(long = "keep-data")] @@ -277,6 +305,85 @@ pub fn run() -> Result<(), crate::error::ThothError> { let shell = crate::hooks::detect_shell(args.shell.as_deref(), shell_env.as_deref())?; print!("{}", crate::hooks::render_init(&shell)); } + Some(Cmd::Tag(args)) => { + if args.name.is_empty() { + return Err(crate::error::ThothError::Tag( + "tag name cannot be empty".into(), + )); + } + let current = std::env::var("TTH_ACTIVE_TAGS").unwrap_or_else(|_| "[]".into()); + let new_json = crate::tags::add_tag(¤t, &args.name); + print!("{}", crate::tags::export_line(&new_json)); + let segment = crate::tags::format_prompt_segment(&new_json); + let display = if segment.is_empty() { + "(none)".to_string() + } else { + segment + }; + eprintln!("Active tags: {display}"); + } + Some(Cmd::Untag(args)) => { + if args.name.is_none() && !args.all { + return Err(crate::error::ThothError::Tag( + "specify a tag name or --all".into(), + )); + } + let current = std::env::var("TTH_ACTIVE_TAGS").unwrap_or_else(|_| "[]".into()); + let new_json = if args.all { + crate::tags::clear_tags() + } else { + crate::tags::remove_tag(¤t, args.name.as_deref().unwrap_or("")) + }; + print!("{}", crate::tags::export_line(&new_json)); + let segment = crate::tags::format_prompt_segment(&new_json); + let display = if segment.is_empty() { + "(none)".to_string() + } else { + segment + }; + eprintln!("Active tags: {display}"); + } + Some(Cmd::Tags(args)) => { + if args.list { + let conn = crate::database::get_connection(None)?; + let tags = crate::tags::list_db_tags(&conn)?; + if tags.is_empty() { + println!("(no tags recorded)"); + } else { + for (tag, count) in tags { + println!("{tag} ({count} commands)"); + } + } + } else { + let current = std::env::var("TTH_ACTIVE_TAGS").unwrap_or_else(|_| "[]".into()); + let tags = crate::tags::parse_active(¤t); + if tags.is_empty() { + println!("(none)"); + } else { + for tag in tags { + println!("{tag}"); + } + } + } + } + Some(Cmd::Prompt(args)) => { + let shell_hint = args.shell.as_deref().unwrap_or(""); + let use_starship = if shell_hint == "starship" { + true + } else { + which_starship() + }; + if use_starship { + println!("[custom.thoth_tags]"); + println!("command = \"echo $TTH_PROMPT_TAGS\""); + println!("when = \"[ -n \\\"$TTH_PROMPT_TAGS\\\" ]\""); + println!("style = \"bold yellow\""); + println!("format = \"[$output]($style) \""); + } else { + println!("Add to your PROMPT (zsh) or PS1 (bash):"); + println!(" ${{TTH_PROMPT_TAGS}}"); + } + } Some(Cmd::NewSessionId) => { println!("{}", uuid::Uuid::new_v4()); } @@ -289,3 +396,9 @@ fn which_tth() -> bool { .map(|paths| std::env::split_paths(&paths).any(|dir| dir.join("tth").exists())) .unwrap_or(false) } + +fn which_starship() -> bool { + std::env::var_os("PATH") + .map(|paths| std::env::split_paths(&paths).any(|dir| dir.join("starship").exists())) + .unwrap_or(false) +} diff --git a/src/error.rs b/src/error.rs index b40fff1..79ad5e5 100644 --- a/src/error.rs +++ b/src/error.rs @@ -12,6 +12,8 @@ pub enum ThothError { Forget(String), #[error("tui: {0}")] Tui(String), + #[error("{0}")] + Tag(String), } #[cfg(test)] @@ -45,5 +47,9 @@ mod tests { ThothError::Tui("render failed".into()).to_string(), "tui: render failed" ); + assert_eq!( + ThothError::Tag("empty tag name".into()).to_string(), + "empty tag name" + ); } } diff --git a/src/lib.rs b/src/lib.rs index 50d806c..11b1bde 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,4 +12,5 @@ pub mod schema; pub mod search; pub mod session; pub mod sessions; +pub mod tags; pub mod tui; diff --git a/src/tags.rs b/src/tags.rs new file mode 100644 index 0000000..0bff41e --- /dev/null +++ b/src/tags.rs @@ -0,0 +1,208 @@ +use crate::error::ThothError; +use rusqlite::Connection; + +pub fn parse_active(json: &str) -> Vec { + match serde_json::from_str::(json) { + Ok(serde_json::Value::Array(arr)) => arr + .into_iter() + .filter_map(|v| v.as_str().map(|s| s.to_string())) + .collect(), + _ => vec![], + } +} + +pub fn add_tag(json: &str, name: &str) -> String { + let mut tags = parse_active(json); + if !tags.iter().any(|t| t == name) { + tags.push(name.to_string()); + } + serde_json::to_string(&tags).unwrap_or_else(|_| "[]".to_string()) +} + +pub fn remove_tag(json: &str, name: &str) -> String { + let tags: Vec = parse_active(json) + .into_iter() + .filter(|t| t != name) + .collect(); + serde_json::to_string(&tags).unwrap_or_else(|_| "[]".to_string()) +} + +pub fn clear_tags() -> String { + "[]".to_string() +} + +pub fn export_line(json: &str) -> String { + let escaped = json.replace('\'', "'\\''"); + let prompt = format_prompt_segment(json); + let escaped_prompt = prompt.replace('\'', "'\\''"); + format!( + "export TTH_ACTIVE_TAGS='{}'\nexport TTH_PROMPT_TAGS='{}'", + escaped, escaped_prompt + ) +} + +pub fn format_prompt_segment(json: &str) -> String { + let tags = parse_active(json); + tags.iter().map(|t| format!("[{t}]")).collect() +} + +pub fn list_db_tags(conn: &Connection) -> Result, ThothError> { + let mut stmt = conn.prepare( + "SELECT value, COUNT(*) c FROM commands, json_each(commands.tags) \ + GROUP BY value ORDER BY c DESC, value ASC", + )?; + let rows = stmt.query_map([], |row| { + let tag: String = row.get(0)?; + let count: i64 = row.get(1)?; + Ok((tag, count)) + })?; + let mut result = Vec::new(); + for row in rows { + result.push(row?); + } + Ok(result) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn mem_conn() -> Connection { + let mut c = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut c).unwrap(); + c + } + + #[test] + fn parse_active_empty_string() { + assert_eq!(parse_active(""), Vec::::new()); + } + + #[test] + fn parse_active_invalid_json() { + assert_eq!(parse_active("not json"), Vec::::new()); + } + + #[test] + fn parse_active_empty_array() { + assert_eq!(parse_active("[]"), Vec::::new()); + } + + #[test] + fn parse_active_valid() { + assert_eq!(parse_active(r#"["a","b"]"#), vec!["a", "b"]); + } + + #[test] + fn parse_active_mixed_types_filters_non_strings() { + assert_eq!(parse_active(r#"["a",1,null]"#), vec!["a"]); + } + + #[test] + fn add_tag_to_empty() { + assert_eq!(add_tag("[]", "x"), r#"["x"]"#); + } + + #[test] + fn add_tag_appends() { + assert_eq!(add_tag(r#"["a"]"#, "b"), r#"["a","b"]"#); + } + + #[test] + fn add_tag_dedup_noop() { + assert_eq!(add_tag(r#"["x"]"#, "x"), r#"["x"]"#); + } + + #[test] + fn add_tag_invalid_json_treated_as_empty() { + assert_eq!(add_tag("bad", "x"), r#"["x"]"#); + } + + #[test] + fn remove_tag_removes() { + assert_eq!(remove_tag(r#"["a","b"]"#, "a"), r#"["b"]"#); + } + + #[test] + fn remove_tag_missing_noop() { + assert_eq!(remove_tag(r#"["a"]"#, "z"), r#"["a"]"#); + } + + #[test] + fn remove_tag_last_gives_empty() { + assert_eq!(remove_tag(r#"["a"]"#, "a"), "[]"); + } + + #[test] + fn clear_tags_gives_empty_array() { + assert_eq!(clear_tags(), "[]"); + } + + #[test] + fn export_line_basic() { + let line = export_line(r#"["x"]"#); + assert!(line.contains("export TTH_ACTIVE_TAGS='[\"x\"]'")); + assert!(line.contains("export TTH_PROMPT_TAGS='[x]'")); + } + + #[test] + fn export_line_empty() { + let line = export_line("[]"); + assert!(line.contains("export TTH_ACTIVE_TAGS='[]'")); + assert!(line.contains("export TTH_PROMPT_TAGS=''")); + } + + #[test] + fn export_line_escapes_single_quote() { + let json = r#"["it's"]"#; + let line = export_line(json); + assert!(line.contains("'\\''")); + } + + #[test] + fn format_prompt_segment_empty() { + assert_eq!(format_prompt_segment("[]"), ""); + } + + #[test] + fn format_prompt_segment_single() { + assert_eq!(format_prompt_segment(r#"["a"]"#), "[a]"); + } + + #[test] + fn format_prompt_segment_multiple() { + assert_eq!(format_prompt_segment(r#"["a","b"]"#), "[a][b]"); + } + + #[test] + fn list_db_tags_empty_db() { + let conn = mem_conn(); + let tags = list_db_tags(&conn).unwrap(); + assert!(tags.is_empty()); + } + + #[test] + fn list_db_tags_counts_and_order() { + let mut conn = mem_conn(); + let args_base = crate::cli::RecordArgs { + cmd: "test".into(), + dir: Some("/tmp".into()), + exit_code: 0, + duration: 0, + timestamp: Some(1000), + tags: r#"["fix","perf"]"#.into(), + terminal_id: None, + }; + let mut a1 = args_base.clone(); + a1.timestamp = Some(1001); + crate::recorder::record_inner(&a1, &mut conn).unwrap(); + let mut a2 = args_base.clone(); + a2.timestamp = Some(1002); + a2.tags = r#"["fix"]"#.into(); + crate::recorder::record_inner(&a2, &mut conn).unwrap(); + + let tags = list_db_tags(&conn).unwrap(); + assert_eq!(tags[0], ("fix".to_string(), 2)); + assert_eq!(tags[1], ("perf".to_string(), 1)); + } +} diff --git a/tests/tags_e2e.rs b/tests/tags_e2e.rs new file mode 100644 index 0000000..8f3b83e --- /dev/null +++ b/tests/tags_e2e.rs @@ -0,0 +1,167 @@ +use assert_cmd::Command; +use predicates::str::contains; +use tempfile::TempDir; + +fn tth(db_dir: &TempDir) -> Command { + let mut cmd = Command::cargo_bin("tth").unwrap(); + cmd.env("THOTH_DB", db_dir.path().join("history.db")); + cmd +} + +fn tth_with_tags(db_dir: &TempDir, active_tags: &str) -> Command { + let mut cmd = tth(db_dir); + cmd.env("TTH_ACTIVE_TAGS", active_tags); + cmd +} + +fn record_with_tags(db_dir: &TempDir, command: &str, tags: &str) { + tth(db_dir) + .args([ + "record", + "--cmd", + command, + "--dir", + "/tmp", + "--exit", + "0", + "--duration", + "0", + "--timestamp", + "1700000000", + "--tags", + tags, + ]) + .assert() + .success(); +} + +#[test] +fn tag_unset_env_adds_single_tag_to_stdout() { + let dir = TempDir::new().unwrap(); + let out = tth(&dir).args(["tag", "x"]).output().unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!( + stdout.contains("export TTH_ACTIVE_TAGS='[\"x\"]'"), + "stdout: {stdout}" + ); + assert!( + stdout.contains("export TTH_PROMPT_TAGS='[x]'"), + "stdout: {stdout}" + ); + assert!(out.status.success()); +} + +#[test] +fn tag_with_existing_adds_second() { + let dir = TempDir::new().unwrap(); + let out = tth_with_tags(&dir, r#"["x"]"#) + .args(["tag", "y"]) + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!(stdout.contains(r#"["x","y"]"#), "stdout: {stdout}"); + assert!(stdout.contains("[x][y]"), "stdout: {stdout}"); +} + +#[test] +fn tag_duplicate_is_noop() { + let dir = TempDir::new().unwrap(); + let out = tth_with_tags(&dir, r#"["x"]"#) + .args(["tag", "x"]) + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!(stdout.contains(r#"["x"]"#), "stdout: {stdout}"); + assert!(!stdout.contains(r#"["x","x"]"#), "dup added: {stdout}"); +} + +#[test] +fn tag_empty_name_errors_nonzero() { + let dir = TempDir::new().unwrap(); + tth(&dir).args(["tag", ""]).assert().failure(); +} + +#[test] +fn untag_removes_one() { + let dir = TempDir::new().unwrap(); + let out = tth_with_tags(&dir, r#"["x","y"]"#) + .args(["untag", "x"]) + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!(stdout.contains(r#"["y"]"#), "stdout: {stdout}"); + assert!(!stdout.contains("\"x\""), "x still present: {stdout}"); +} + +#[test] +fn untag_all_clears() { + let dir = TempDir::new().unwrap(); + let out = tth_with_tags(&dir, r#"["x","y"]"#) + .args(["untag", "--all"]) + .output() + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!(stdout.contains("TTH_ACTIVE_TAGS='[]'"), "stdout: {stdout}"); + assert!(stdout.contains("TTH_PROMPT_TAGS=''"), "stdout: {stdout}"); +} + +#[test] +fn untag_no_args_errors_nonzero() { + let dir = TempDir::new().unwrap(); + tth(&dir).args(["untag"]).assert().failure(); +} + +#[test] +fn tags_no_flag_reads_env_active() { + let dir = TempDir::new().unwrap(); + tth_with_tags(&dir, r#"["fix","perf"]"#) + .args(["tags"]) + .assert() + .success() + .stdout(contains("fix")) + .stdout(contains("perf")); +} + +#[test] +fn tags_no_flag_no_env_shows_none() { + let dir = TempDir::new().unwrap(); + let out = tth(&dir).args(["tags"]).output().unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!( + stdout.contains("(none)") || stdout.trim().is_empty() || stdout.contains("no active"), + "expected none indicator, got: {stdout}" + ); +} + +#[test] +fn tags_list_queries_db() { + let dir = TempDir::new().unwrap(); + record_with_tags(&dir, "git commit", r#"["fix","perf"]"#); + record_with_tags(&dir, "cargo test", r#"["fix"]"#); + tth(&dir) + .args(["tags", "--list"]) + .assert() + .success() + .stdout(contains("fix")) + .stdout(contains("perf")); +} + +#[test] +fn prompt_prints_snippet() { + let dir = TempDir::new().unwrap(); + let out = tth(&dir).args(["prompt"]).output().unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + assert!( + !stdout.trim().is_empty(), + "expected prompt snippet, got empty stdout" + ); + assert!(out.status.success()); +} + +#[test] +fn tag_confirmation_goes_to_stderr() { + let dir = TempDir::new().unwrap(); + let out = tth(&dir).args(["tag", "fix"]).output().unwrap(); + let stderr = String::from_utf8_lossy(&out.stderr); + assert!(!stderr.is_empty(), "expected confirmation on stderr"); +} From 8aea79bef8827ae65caddfedf199756bd7411f54 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 22:18:24 -0600 Subject: [PATCH 073/151] fix(tags): pluralize command count in tags --list (#29) --- src/cli.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cli.rs b/src/cli.rs index fde451e..201b17a 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -351,7 +351,8 @@ pub fn run() -> Result<(), crate::error::ThothError> { println!("(no tags recorded)"); } else { for (tag, count) in tags { - println!("{tag} ({count} commands)"); + let noun = if count == 1 { "command" } else { "commands" }; + println!("{tag} ({count} {noun})"); } } } else { From d52dcd473cbdc12ab33ebc476c867d9b97167572 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Fri, 26 Jun 2026 23:23:44 -0600 Subject: [PATCH 074/151] fix(tags): tth prompt explains adding the module to the starship format (#29) --- src/cli.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 201b17a..8f062b4 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -375,14 +375,19 @@ pub fn run() -> Result<(), crate::error::ThothError> { which_starship() }; if use_starship { + println!("# Step 1: add this module to ~/.config/starship.toml"); println!("[custom.thoth_tags]"); println!("command = \"echo $TTH_PROMPT_TAGS\""); println!("when = \"[ -n \\\"$TTH_PROMPT_TAGS\\\" ]\""); println!("style = \"bold yellow\""); println!("format = \"[$output]($style) \""); + println!("# Step 2: if you have a top-level format string, add"); + println!("# ${{custom.thoth_tags}} to it where you want the tags to show"); + println!("# (for example right after $git_status). Without this the"); + println!("# module will not appear when you have a custom format."); } else { - println!("Add to your PROMPT (zsh) or PS1 (bash):"); - println!(" ${{TTH_PROMPT_TAGS}}"); + println!("Add ${{TTH_PROMPT_TAGS}} to your PROMPT (zsh) or PS1 (bash)"); + println!("where you want active tags to show."); } } Some(Cmd::NewSessionId) => { From c2cb103d684bfd9c3b9074c5395439f1f11cd5c0 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:00:56 -0600 Subject: [PATCH 075/151] feat(prompt): add framework detection and snippet generator (#34) --- src/doctor.rs | 282 ++++++++++++++++++++++++++++++++++++++++++ src/error.rs | 2 + src/lib.rs | 2 + src/prompt.rs | 330 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 616 insertions(+) create mode 100644 src/doctor.rs create mode 100644 src/prompt.rs diff --git a/src/doctor.rs b/src/doctor.rs new file mode 100644 index 0000000..4bc6f30 --- /dev/null +++ b/src/doctor.rs @@ -0,0 +1,282 @@ +use crate::prompt::{prompt_snippet, PromptFramework}; + +#[derive(Debug, Clone, PartialEq)] +pub enum CheckStatus { + Ok, + Warn, + Fail, +} + +#[derive(Debug, Clone)] +pub struct Check { + pub status: CheckStatus, + pub name: String, + pub guidance: Option, +} + +#[derive(Debug)] +pub struct DoctorReport { + pub checks: Vec, +} + +pub struct DoctorInputs { + pub hooks_installed: bool, + pub db_result: Result, + pub tth_on_path: bool, + pub framework: PromptFramework, + pub framework_config_text: Option, +} + +pub struct DbInfo { + pub schema_version: i64, + pub total_commands: i64, + pub last_timestamp: Option, +} + +pub fn run_doctor(inputs: &DoctorInputs) -> DoctorReport { + let mut checks = Vec::new(); + + if inputs.hooks_installed { + checks.push(Check { + status: CheckStatus::Ok, + name: "hooks installed".to_string(), + guidance: None, + }); + } else { + checks.push(Check { + status: CheckStatus::Fail, + name: "hooks installed".to_string(), + guidance: Some("Run: tth install".to_string()), + }); + } + + match &inputs.db_result { + Ok(info) => { + let detail = format!( + "schema {}, {} commands, last {}", + info.schema_version, + info.total_commands, + info.last_timestamp + .map(|t| t.to_string()) + .unwrap_or_else(|| "none".to_string()) + ); + checks.push(Check { + status: CheckStatus::Ok, + name: format!("database {detail}"), + guidance: None, + }); + } + Err(msg) => { + checks.push(Check { + status: CheckStatus::Fail, + name: "database".to_string(), + guidance: Some(format!("DB error: {msg}")), + }); + } + } + + if inputs.tth_on_path { + checks.push(Check { + status: CheckStatus::Ok, + name: "tth on PATH".to_string(), + guidance: None, + }); + } else { + checks.push(Check { + status: CheckStatus::Warn, + name: "tth on PATH".to_string(), + guidance: Some("tth not found on PATH; ensure your shell rc is loaded".to_string()), + }); + } + + let prompt_check = + check_prompt_visibility(&inputs.framework, inputs.framework_config_text.as_deref()); + checks.push(prompt_check); + + DoctorReport { checks } +} + +fn check_prompt_visibility(framework: &PromptFramework, config_text: Option<&str>) -> Check { + match framework { + PromptFramework::Generic => Check { + status: CheckStatus::Warn, + name: "prompt tags visibility".to_string(), + guidance: Some(format!( + "Cannot introspect PROMPT/PS1 automatically.\n{}", + prompt_snippet(framework) + )), + }, + _ => { + let configured = config_text + .map(|text| text.contains("thoth_tags") || text.contains("TTH_PROMPT_TAGS")) + .unwrap_or(false); + if configured { + Check { + status: CheckStatus::Ok, + name: "prompt tags visibility".to_string(), + guidance: None, + } + } else { + Check { + status: CheckStatus::Warn, + name: "prompt tags visibility".to_string(), + guidance: Some(format!( + "TTH_PROMPT_TAGS not referenced in framework config. Add:\n{}", + prompt_snippet(framework) + )), + } + } + } + } +} + +pub fn render_report(report: &DoctorReport) -> String { + let mut out = String::new(); + for check in &report.checks { + let tag = match check.status { + CheckStatus::Ok => "[ok] ", + CheckStatus::Warn => "[warn]", + CheckStatus::Fail => "[fail]", + }; + out.push_str(&format!("{tag} {}\n", check.name)); + if let Some(ref guidance) = check.guidance { + for line in guidance.lines() { + out.push_str(&format!(" -> {line}\n")); + } + } + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + + fn make_inputs( + hooks: bool, + db: bool, + tth: bool, + framework: PromptFramework, + config: Option<&str>, + ) -> DoctorInputs { + DoctorInputs { + hooks_installed: hooks, + db_result: if db { + Ok(DbInfo { + schema_version: 3, + total_commands: 42, + last_timestamp: Some(1700000000), + }) + } else { + Err("connection failed".to_string()) + }, + tth_on_path: tth, + framework, + framework_config_text: config.map(|s| s.to_string()), + } + } + + #[test] + fn hooks_ok_when_installed() { + let inputs = make_inputs(true, true, true, PromptFramework::Generic, None); + let report = run_doctor(&inputs); + assert_eq!(report.checks[0].status, CheckStatus::Ok); + assert!(report.checks[0].name.contains("hooks")); + } + + #[test] + fn hooks_fail_when_not_installed() { + let inputs = make_inputs(false, true, true, PromptFramework::Generic, None); + let report = run_doctor(&inputs); + assert_eq!(report.checks[0].status, CheckStatus::Fail); + let guidance = report.checks[0].guidance.as_deref().unwrap_or(""); + assert!(guidance.contains("tth install")); + } + + #[test] + fn db_ok_when_accessible() { + let inputs = make_inputs(true, true, true, PromptFramework::Generic, None); + let report = run_doctor(&inputs); + assert_eq!(report.checks[1].status, CheckStatus::Ok); + assert!(report.checks[1].name.contains("schema 3")); + assert!(report.checks[1].name.contains("42 commands")); + } + + #[test] + fn db_fail_when_error() { + let inputs = make_inputs(true, false, true, PromptFramework::Generic, None); + let report = run_doctor(&inputs); + assert_eq!(report.checks[1].status, CheckStatus::Fail); + } + + #[test] + fn tth_ok_when_on_path() { + let inputs = make_inputs(true, true, true, PromptFramework::Generic, None); + let report = run_doctor(&inputs); + assert_eq!(report.checks[2].status, CheckStatus::Ok); + } + + #[test] + fn tth_warn_when_not_on_path() { + let inputs = make_inputs(true, true, false, PromptFramework::Generic, None); + let report = run_doctor(&inputs); + assert_eq!(report.checks[2].status, CheckStatus::Warn); + } + + #[test] + fn prompt_ok_when_starship_config_has_thoth_tags() { + let config = "[env_var.thoth_tags]\nvariable = \"TTH_PROMPT_TAGS\""; + let inputs = make_inputs(true, true, true, PromptFramework::Starship, Some(config)); + let report = run_doctor(&inputs); + let prompt_check = report.checks.last().unwrap(); + assert_eq!(prompt_check.status, CheckStatus::Ok); + } + + #[test] + fn prompt_warn_when_starship_config_lacks_thoth_tags() { + let config = "[character]\nsuccess_symbol = \"[>](bold green)\""; + let inputs = make_inputs(true, true, true, PromptFramework::Starship, Some(config)); + let report = run_doctor(&inputs); + let prompt_check = report.checks.last().unwrap(); + assert_eq!(prompt_check.status, CheckStatus::Warn); + let guidance = prompt_check.guidance.as_deref().unwrap_or(""); + assert!(guidance.contains("env_var.thoth_tags")); + } + + #[test] + fn prompt_warn_for_generic_is_advisory() { + let inputs = make_inputs(true, true, true, PromptFramework::Generic, None); + let report = run_doctor(&inputs); + let prompt_check = report.checks.last().unwrap(); + assert_eq!(prompt_check.status, CheckStatus::Warn); + } + + #[test] + fn render_report_contains_ok_fail_warn() { + let report = DoctorReport { + checks: vec![ + Check { + status: CheckStatus::Ok, + name: "alpha".to_string(), + guidance: None, + }, + Check { + status: CheckStatus::Warn, + name: "beta".to_string(), + guidance: Some("fix it".to_string()), + }, + Check { + status: CheckStatus::Fail, + name: "gamma".to_string(), + guidance: Some("run cmd".to_string()), + }, + ], + }; + let output = render_report(&report); + assert!(output.contains("[ok]")); + assert!(output.contains("[warn]")); + assert!(output.contains("[fail]")); + assert!(output.contains("-> fix it")); + assert!(output.contains("-> run cmd")); + } +} diff --git a/src/error.rs b/src/error.rs index 79ad5e5..d267bb4 100644 --- a/src/error.rs +++ b/src/error.rs @@ -14,6 +14,8 @@ pub enum ThothError { Tui(String), #[error("{0}")] Tag(String), + #[error("{0}")] + Prompt(String), } #[cfg(test)] diff --git a/src/lib.rs b/src/lib.rs index 11b1bde..7d5bc03 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ pub mod cli; pub mod database; +pub mod doctor; pub mod error; pub mod export; pub mod forget; @@ -7,6 +8,7 @@ pub mod hooks; pub mod logging; pub mod paths; pub mod project; +pub mod prompt; pub mod recorder; pub mod schema; pub mod search; diff --git a/src/prompt.rs b/src/prompt.rs new file mode 100644 index 0000000..70eb892 --- /dev/null +++ b/src/prompt.rs @@ -0,0 +1,330 @@ +use std::path::Path; + +const DOCS_ANCHOR: &str = "https://github.com/JoseVelazcoH/thoth#prompt-setup"; + +#[derive(Debug, Clone, PartialEq)] +pub enum PromptFramework { + Starship, + Powerlevel10k, + OhMyPosh, + Generic, +} + +pub struct DetectInputs { + pub starship_toml_exists: bool, + pub starship_on_path: bool, + pub zsh_theme: Option, + pub p10k_zsh_exists: bool, + pub oh_my_posh_dir_exists: bool, + pub posh_theme_set: bool, +} + +pub fn detect_framework(inputs: &DetectInputs) -> PromptFramework { + if inputs.starship_toml_exists || inputs.starship_on_path { + return PromptFramework::Starship; + } + let p10k_theme = inputs + .zsh_theme + .as_deref() + .map(|t| t.to_ascii_lowercase().contains("powerlevel10k")) + .unwrap_or(false); + if p10k_theme || inputs.p10k_zsh_exists { + return PromptFramework::Powerlevel10k; + } + if inputs.oh_my_posh_dir_exists || inputs.posh_theme_set { + return PromptFramework::OhMyPosh; + } + PromptFramework::Generic +} + +pub fn probe_inputs() -> DetectInputs { + let home = std::env::var("HOME").unwrap_or_default(); + let home_path = Path::new(&home); + + let starship_toml_exists = home_path.join(".config/starship.toml").exists(); + let starship_on_path = path_has("starship"); + let zsh_theme = std::env::var("ZSH_THEME").ok(); + let p10k_zsh_exists = home_path.join(".p10k.zsh").exists(); + let oh_my_posh_dir_exists = home_path.join(".config/oh-my-posh").exists(); + let posh_theme_set = std::env::var("POSH_THEME").is_ok(); + + DetectInputs { + starship_toml_exists, + starship_on_path, + zsh_theme, + p10k_zsh_exists, + oh_my_posh_dir_exists, + posh_theme_set, + } +} + +fn path_has(bin: &str) -> bool { + std::env::var_os("PATH") + .map(|paths| std::env::split_paths(&paths).any(|dir| dir.join(bin).exists())) + .unwrap_or(false) +} + +pub fn prompt_snippet(framework: &PromptFramework) -> String { + match framework { + PromptFramework::Starship => format!( + "# Add to ~/.config/starship.toml:\n\ + [env_var.thoth_tags]\n\ + variable = \"TTH_PROMPT_TAGS\"\n\ + format = \"[$env_value]($style) \"\n\ + style = \"bold yellow\"\n\ + \n\ + # IMPORTANT: add ${{env_var.thoth_tags}} to your top-level format string.\n\ + # Starship does not render modules that are not referenced in format.\n\ + # Example: format = \"$git_status ${{env_var.thoth_tags}} $character\"\n\ + \n\ + # Docs: {DOCS_ANCHOR}" + ), + PromptFramework::Powerlevel10k => format!( + "# Add to your ~/.zshrc (after p10k is loaded):\n\ + \n\ + # 1. Define a custom segment function:\n\ + prompt_tth_tags() {{\n\ + p10k segment -t \"$TTH_PROMPT_TAGS\"\n\ + }}\n\ + \n\ + # 2. Add tth_tags to your prompt elements, e.g.:\n\ + # POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(... tth_tags)\n\ + # or POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(... tth_tags)\n\ + \n\ + # See: https://github.com/romkatv/powerlevel10k#batteries-included\n\ + # Docs: {DOCS_ANCHOR}" + ), + PromptFramework::OhMyPosh => format!( + "# Add a segment to your oh-my-posh theme JSON/YAML:\n\ + # JSON example (type: text segment reading TTH_PROMPT_TAGS):\n\ + # {{\n\ + # \"type\": \"text\",\n\ + # \"template\": \"{{{{ .Env.TTH_PROMPT_TAGS }}}}\"\n\ + # }}\n\ + \n\ + # YAML example:\n\ + # - type: text\n\ + # template: \"{{{{ .Env.TTH_PROMPT_TAGS }}}}\"\n\ + \n\ + # See: https://ohmyposh.dev/docs/segments/system/text\n\ + # Docs: {DOCS_ANCHOR}" + ), + PromptFramework::Generic => format!( + "# Add to your shell rc file:\n\ + # zsh: PROMPT=\"${{TTH_PROMPT_TAGS}} $PROMPT\"\n\ + # bash: PS1=\"${{TTH_PROMPT_TAGS}} $PS1\"\n\ + \n\ + # Add ${{TTH_PROMPT_TAGS}} to your PROMPT (zsh) or PS1 (bash) where you want active tags to show.\n\ + \n\ + # Docs: {DOCS_ANCHOR}" + ), + } +} + +pub fn parse_framework(s: &str) -> Result { + match s.to_ascii_lowercase().as_str() { + "starship" => Ok(PromptFramework::Starship), + "powerlevel10k" | "p10k" => Ok(PromptFramework::Powerlevel10k), + "oh-my-posh" | "ohmyposh" | "omp" => Ok(PromptFramework::OhMyPosh), + "generic" => Ok(PromptFramework::Generic), + other => Err(crate::error::ThothError::Prompt(format!( + "unknown framework '{other}'; use starship, powerlevel10k, oh-my-posh, or generic" + ))), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn inputs( + starship_toml: bool, + starship_path: bool, + zsh_theme: Option<&str>, + p10k: bool, + omp_dir: bool, + posh_theme: bool, + ) -> DetectInputs { + DetectInputs { + starship_toml_exists: starship_toml, + starship_on_path: starship_path, + zsh_theme: zsh_theme.map(|s| s.to_string()), + p10k_zsh_exists: p10k, + oh_my_posh_dir_exists: omp_dir, + posh_theme_set: posh_theme, + } + } + + #[test] + fn detect_starship_via_toml() { + let i = inputs(true, false, None, false, false, false); + assert_eq!(detect_framework(&i), PromptFramework::Starship); + } + + #[test] + fn detect_starship_via_path() { + let i = inputs(false, true, None, false, false, false); + assert_eq!(detect_framework(&i), PromptFramework::Starship); + } + + #[test] + fn detect_p10k_via_zsh_theme() { + let i = inputs( + false, + false, + Some("powerlevel10k/powerlevel10k"), + false, + false, + false, + ); + assert_eq!(detect_framework(&i), PromptFramework::Powerlevel10k); + } + + #[test] + fn detect_p10k_zsh_theme_case_insensitive() { + let i = inputs( + false, + false, + Some("Powerlevel10K/Powerlevel10K"), + false, + false, + false, + ); + assert_eq!(detect_framework(&i), PromptFramework::Powerlevel10k); + } + + #[test] + fn detect_p10k_via_p10k_zsh_file() { + let i = inputs(false, false, None, true, false, false); + assert_eq!(detect_framework(&i), PromptFramework::Powerlevel10k); + } + + #[test] + fn detect_omp_via_dir() { + let i = inputs(false, false, None, false, true, false); + assert_eq!(detect_framework(&i), PromptFramework::OhMyPosh); + } + + #[test] + fn detect_omp_via_posh_theme() { + let i = inputs(false, false, None, false, false, true); + assert_eq!(detect_framework(&i), PromptFramework::OhMyPosh); + } + + #[test] + fn detect_generic_fallback() { + let i = inputs(false, false, None, false, false, false); + assert_eq!(detect_framework(&i), PromptFramework::Generic); + } + + #[test] + fn starship_beats_p10k_when_both_true() { + let i = inputs( + true, + false, + Some("powerlevel10k/powerlevel10k"), + false, + false, + false, + ); + assert_eq!(detect_framework(&i), PromptFramework::Starship); + } + + #[test] + fn p10k_beats_omp() { + let i = inputs(false, false, None, true, true, false); + assert_eq!(detect_framework(&i), PromptFramework::Powerlevel10k); + } + + #[test] + fn snippet_starship_has_env_var_module() { + let s = prompt_snippet(&PromptFramework::Starship); + assert!( + s.contains("env_var.thoth_tags"), + "missing env_var.thoth_tags" + ); + assert!(s.contains("TTH_PROMPT_TAGS"), "missing TTH_PROMPT_TAGS"); + assert!( + s.contains("env_var.thoth_tags}"), + "missing add-to-format note" + ); + assert!(s.contains(DOCS_ANCHOR), "missing docs anchor"); + } + + #[test] + fn snippet_p10k_has_key_markers() { + let s = prompt_snippet(&PromptFramework::Powerlevel10k); + assert!(s.contains("TTH_PROMPT_TAGS"), "missing TTH_PROMPT_TAGS"); + assert!(s.contains("p10k segment"), "missing p10k segment"); + assert!(s.contains("POWERLEVEL9K"), "missing POWERLEVEL9K"); + assert!(s.contains(DOCS_ANCHOR), "missing docs anchor"); + } + + #[test] + fn snippet_omp_has_key_markers() { + let s = prompt_snippet(&PromptFramework::OhMyPosh); + assert!(s.contains("TTH_PROMPT_TAGS"), "missing TTH_PROMPT_TAGS"); + assert!( + s.contains(".Env.TTH_PROMPT_TAGS"), + "missing .Env.TTH_PROMPT_TAGS" + ); + assert!(s.contains(DOCS_ANCHOR), "missing docs anchor"); + } + + #[test] + fn snippet_generic_has_key_markers() { + let s = prompt_snippet(&PromptFramework::Generic); + let marker = "${TTH_PROMPT_TAGS}"; + assert!(s.contains(marker), "missing ${{TTH_PROMPT_TAGS}}"); + assert!(s.contains("PROMPT"), "missing PROMPT"); + assert!(s.contains("PS1"), "missing PS1"); + assert!(s.contains(DOCS_ANCHOR), "missing docs anchor"); + } + + #[test] + fn parse_framework_starship() { + assert_eq!( + parse_framework("starship").unwrap(), + PromptFramework::Starship + ); + } + + #[test] + fn parse_framework_p10k_aliases() { + assert_eq!( + parse_framework("powerlevel10k").unwrap(), + PromptFramework::Powerlevel10k + ); + assert_eq!( + parse_framework("p10k").unwrap(), + PromptFramework::Powerlevel10k + ); + } + + #[test] + fn parse_framework_omp_aliases() { + assert_eq!( + parse_framework("oh-my-posh").unwrap(), + PromptFramework::OhMyPosh + ); + assert_eq!( + parse_framework("ohmyposh").unwrap(), + PromptFramework::OhMyPosh + ); + assert_eq!(parse_framework("omp").unwrap(), PromptFramework::OhMyPosh); + } + + #[test] + fn parse_framework_generic() { + assert_eq!( + parse_framework("generic").unwrap(), + PromptFramework::Generic + ); + } + + #[test] + fn parse_framework_unknown_errors() { + let err = parse_framework("fish").unwrap_err(); + assert!(err.to_string().contains("unknown framework")); + } +} From f8c52dd7db1e73a2dad02eb482bed17abd5239d5 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:01:00 -0600 Subject: [PATCH 076/151] feat(cli): add tth prompt --framework, tth doctor, install prompt hint (#34) --- src/cli.rs | 93 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 22 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 8f062b4..2c4bc0f 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -24,6 +24,7 @@ pub enum Cmd { Untag(UntagArgs), Tags(TagsArgs), Prompt(PromptArgs), + Doctor, #[command(hide = true)] NewSessionId, } @@ -140,6 +141,8 @@ pub struct TagsArgs { pub struct PromptArgs { #[arg(long)] pub shell: Option, + #[arg(long)] + pub framework: Option, } #[derive(clap::Args, Debug, Clone)] @@ -200,6 +203,9 @@ pub fn run() -> Result<(), crate::error::ThothError> { println!("Installed hooks in {}", rc_path.display()); } println!("Reload shell: {}", report.reload_cmd); + let framework = crate::prompt::detect_framework(&crate::prompt::probe_inputs()); + let snippet = crate::prompt::prompt_snippet(&framework); + println!("\nTo show active tags in your prompt:\n{snippet}"); } Some(Cmd::Uninstall(args)) => { let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); @@ -368,27 +374,54 @@ pub fn run() -> Result<(), crate::error::ThothError> { } } Some(Cmd::Prompt(args)) => { - let shell_hint = args.shell.as_deref().unwrap_or(""); - let use_starship = if shell_hint == "starship" { - true + let framework = if let Some(ref fw) = args.framework { + crate::prompt::parse_framework(fw)? } else { - which_starship() + crate::prompt::detect_framework(&crate::prompt::probe_inputs()) }; - if use_starship { - println!("# Step 1: add this module to ~/.config/starship.toml"); - println!("[custom.thoth_tags]"); - println!("command = \"echo $TTH_PROMPT_TAGS\""); - println!("when = \"[ -n \\\"$TTH_PROMPT_TAGS\\\" ]\""); - println!("style = \"bold yellow\""); - println!("format = \"[$output]($style) \""); - println!("# Step 2: if you have a top-level format string, add"); - println!("# ${{custom.thoth_tags}} to it where you want the tags to show"); - println!("# (for example right after $git_status). Without this the"); - println!("# module will not appear when you have a custom format."); + print!("{}", crate::prompt::prompt_snippet(&framework)); + } + Some(Cmd::Doctor) => { + let shell_env = std::env::var("SHELL").ok(); + let shell = crate::hooks::detect_shell(None, shell_env.as_deref()) + .unwrap_or(crate::hooks::Shell::Bash); + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + let rc_path = crate::hooks::default_rc_path(&shell, std::path::Path::new(&home)); + let hooks_installed = if rc_path.exists() { + std::fs::read_to_string(&rc_path) + .map(|s| crate::hooks::has_block(&s)) + .unwrap_or(false) } else { - println!("Add ${{TTH_PROMPT_TAGS}} to your PROMPT (zsh) or PS1 (bash)"); - println!("where you want active tags to show."); - } + false + }; + let db_result = crate::database::get_connection(None) + .map(|conn| { + let schema_version = crate::database::current_version(&conn); + let total_commands: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap_or(0); + let last_timestamp: Option = conn + .query_row("SELECT MAX(timestamp) FROM commands", [], |r| r.get(0)) + .unwrap_or(None); + crate::doctor::DbInfo { + schema_version, + total_commands, + last_timestamp, + } + }) + .map_err(|e| e.to_string()); + let tth_on_path = which_tth(); + let framework = crate::prompt::detect_framework(&crate::prompt::probe_inputs()); + let framework_config_text = read_framework_config(&framework, &home); + let inputs = crate::doctor::DoctorInputs { + hooks_installed, + db_result, + tth_on_path, + framework, + framework_config_text, + }; + let report = crate::doctor::run_doctor(&inputs); + print!("{}", crate::doctor::render_report(&report)); } Some(Cmd::NewSessionId) => { println!("{}", uuid::Uuid::new_v4()); @@ -403,8 +436,24 @@ fn which_tth() -> bool { .unwrap_or(false) } -fn which_starship() -> bool { - std::env::var_os("PATH") - .map(|paths| std::env::split_paths(&paths).any(|dir| dir.join("starship").exists())) - .unwrap_or(false) +fn read_framework_config(framework: &crate::prompt::PromptFramework, home: &str) -> Option { + use crate::prompt::PromptFramework; + let home_path = std::path::Path::new(home); + let config_path = match framework { + PromptFramework::Starship => home_path.join(".config/starship.toml"), + PromptFramework::Powerlevel10k => home_path.join(".p10k.zsh"), + PromptFramework::OhMyPosh => { + let dir = home_path.join(".config/oh-my-posh"); + if dir.exists() { + if let Ok(mut entries) = std::fs::read_dir(&dir) { + if let Some(Ok(entry)) = entries.next() { + return std::fs::read_to_string(entry.path()).ok(); + } + } + } + return None; + } + PromptFramework::Generic => return None, + }; + std::fs::read_to_string(config_path).ok() } From 389367ff83f2adc504f24b46a2a56af06fdcfc87 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:01:03 -0600 Subject: [PATCH 077/151] test(e2e): doctor, prompt --framework, install hint assertions (#34) --- tests/cli.rs | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/tests/cli.rs b/tests/cli.rs index 7bf3ac5..74cc4bf 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -2,6 +2,7 @@ use assert_cmd::Command; use predicates::prelude::*; use rusqlite::Connection; use tempfile::TempDir; +use std::path::PathBuf; fn tth() -> Command { Command::cargo_bin("tth").unwrap() @@ -437,3 +438,73 @@ fn record_never_fail_contract_preserved() { .assert() .code(0); } + +fn tth_with_env(db_path: &PathBuf, error_log: &PathBuf) -> Command { + let mut cmd = tth(); + cmd.env("THOTH_DB", db_path.to_str().unwrap()) + .env("THOTH_ERROR_LOG", error_log.to_str().unwrap()); + cmd +} + +#[test] +fn prompt_framework_starship_prints_env_var_module() { + let dir = TempDir::new().unwrap(); + tth_with_env(&dir.path().join("h.db"), &dir.path().join("e.log")) + .args(["prompt", "--framework", "starship"]) + .assert() + .code(0) + .stdout(predicate::str::contains("env_var.thoth_tags")) + .stdout(predicate::str::contains("TTH_PROMPT_TAGS")); +} + +#[test] +fn prompt_unknown_framework_exits_nonzero() { + let dir = TempDir::new().unwrap(); + tth_with_env(&dir.path().join("h.db"), &dir.path().join("e.log")) + .args(["prompt", "--framework", "fish"]) + .assert() + .failure() + .stderr(predicate::str::contains("unknown framework")); +} + +#[test] +fn prompt_framework_generic_prints_generic_snippet() { + let dir = TempDir::new().unwrap(); + tth_with_env(&dir.path().join("h.db"), &dir.path().join("e.log")) + .args(["prompt", "--framework", "generic"]) + .assert() + .code(0) + .stdout(predicate::str::contains("PROMPT").or(predicate::str::contains("PS1"))); +} + +#[test] +fn install_output_includes_prompt_hint() { + let dir = TempDir::new().unwrap(); + let rc = dir.path().join(".bashrc"); + tth_with_env(&dir.path().join("h.db"), &dir.path().join("e.log")) + .args([ + "install", + "--shell", + "bash", + "--rc-file", + rc.to_str().unwrap(), + ]) + .assert() + .code(0) + .stdout(predicate::str::contains("To show active tags in your prompt:")); +} + +#[test] +fn doctor_exits_0_and_prints_checklist() { + let dir = TempDir::new().unwrap(); + tth_with_env(&dir.path().join("h.db"), &dir.path().join("e.log")) + .args(["doctor"]) + .assert() + .code(0) + .stdout( + predicate::str::contains("hooks installed") + .and(predicate::str::contains("database")) + .and(predicate::str::contains("tth on PATH")) + .and(predicate::str::contains("prompt tags visibility")), + ); +} From d4654ee681e5e38f6e2f0a48d96418f809be0c32 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:01:30 -0600 Subject: [PATCH 078/151] docs: add Prompt setup section to README (#34) --- README.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/README.md b/README.md index 32d270e..cd37dca 100644 --- a/README.md +++ b/README.md @@ -15,3 +15,78 @@ The name comes from Thoth, the Egyptian god of writing and memory. The binary is Early development. The capture engine is written in Rust and ships as a single static binary (SQLite with full-text search is bundled in). Shell hooks for automatic capture (bash and zsh) and the query commands are in progress. A Python prototype that validated the original design lives under `prototype/python/`. + +## Prompt setup + + + +After running `tth install`, the shell hook exports `TTH_PROMPT_TAGS` (e.g. `[work][api]`) and `TTH_ACTIVE_TAGS` (JSON) on every command. To show active tags in your prompt, pick the section for your framework below. + +### Starship + +Add to `~/.config/starship.toml`: + +```toml +[env_var.thoth_tags] +variable = "TTH_PROMPT_TAGS" +format = "[$env_value]($style) " +style = "bold yellow" +``` + +**Important:** Starship does not render modules that are not referenced in the top-level `format` string. Add `${env_var.thoth_tags}` to your `format` where you want tags to appear: + +```toml +format = "$git_status ${env_var.thoth_tags}$character" +``` + +### Powerlevel10k + +Add to your `~/.zshrc` after p10k is loaded: + +```zsh +# 1. Define a custom segment function: +prompt_tth_tags() { + p10k segment -t "$TTH_PROMPT_TAGS" +} + +# 2. Add tth_tags to your prompt elements, e.g.: +# POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(... tth_tags) +# or POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(... tth_tags) +``` + +See [p10k custom segments](https://github.com/romkatv/powerlevel10k#batteries-included) for details. + +### oh-my-posh + +Add a `text` segment to your theme JSON or YAML that reads the env var: + +```json +{ + "type": "text", + "template": "{{ .Env.TTH_PROMPT_TAGS }}" +} +``` + +YAML equivalent: + +```yaml +- type: text + template: "{{ .Env.TTH_PROMPT_TAGS }}" +``` + +See [oh-my-posh text segment docs](https://ohmyposh.dev/docs/segments/system/text). + +### Plain PS1 / PROMPT + +```zsh +# zsh +PROMPT="${TTH_PROMPT_TAGS} $PROMPT" +``` + +```bash +# bash +PS1="${TTH_PROMPT_TAGS} $PS1" +``` + +You can also run `tth prompt --framework ` to print the snippet for your framework, or just `tth prompt` to auto-detect. + From 67ea2df674d5814364cdfc769c2e0695a0a16424 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:04:03 -0600 Subject: [PATCH 079/151] fix(test): use &Path instead of &PathBuf in tth_with_env helper (#34) --- tests/cli.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/cli.rs b/tests/cli.rs index 74cc4bf..350ce82 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -2,7 +2,6 @@ use assert_cmd::Command; use predicates::prelude::*; use rusqlite::Connection; use tempfile::TempDir; -use std::path::PathBuf; fn tth() -> Command { Command::cargo_bin("tth").unwrap() @@ -439,7 +438,7 @@ fn record_never_fail_contract_preserved() { .code(0); } -fn tth_with_env(db_path: &PathBuf, error_log: &PathBuf) -> Command { +fn tth_with_env(db_path: &std::path::Path, error_log: &std::path::Path) -> Command { let mut cmd = tth(); cmd.env("THOTH_DB", db_path.to_str().unwrap()) .env("THOTH_ERROR_LOG", error_log.to_str().unwrap()); @@ -491,7 +490,9 @@ fn install_output_includes_prompt_hint() { ]) .assert() .code(0) - .stdout(predicate::str::contains("To show active tags in your prompt:")); + .stdout(predicate::str::contains( + "To show active tags in your prompt:", + )); } #[test] From 7b8aea7b7291d651731ed8f6a1055043106386b9 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:15:35 -0600 Subject: [PATCH 080/151] refactor(prompt): drop unused --shell flag from tth prompt (#34) --- src/cli.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 2c4bc0f..312275a 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -139,8 +139,6 @@ pub struct TagsArgs { #[derive(clap::Args, Debug, Clone)] pub struct PromptArgs { - #[arg(long)] - pub shell: Option, #[arg(long)] pub framework: Option, } From c0f2e72e9b380c81845e2000e492eeae4cafefe8 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:42:40 -0600 Subject: [PATCH 081/151] feat: add tth stats command with project/since filters (#36) --- src/cli.rs | 18 ++ src/lib.rs | 1 + src/stats.rs | 584 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 603 insertions(+) create mode 100644 src/stats.rs diff --git a/src/cli.rs b/src/cli.rs index 312275a..4e2a662 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -24,6 +24,7 @@ pub enum Cmd { Untag(UntagArgs), Tags(TagsArgs), Prompt(PromptArgs), + Stats(StatsArgs), Doctor, #[command(hide = true)] NewSessionId, @@ -143,6 +144,14 @@ pub struct PromptArgs { pub framework: Option, } +#[derive(clap::Args, Debug, Clone)] +pub struct StatsArgs { + #[arg(short = 'p', long)] + pub project: Option, + #[arg(long)] + pub since: Option, +} + #[derive(clap::Args, Debug, Clone)] pub struct UninstallArgs { #[arg(long = "keep-data")] @@ -379,6 +388,15 @@ pub fn run() -> Result<(), crate::error::ThothError> { }; print!("{}", crate::prompt::prompt_snippet(&framework)); } + Some(Cmd::Stats(args)) => { + let conn = crate::database::get_connection(None)?; + let stats_args = crate::stats::StatsArgs { + project: args.project, + since: args.since, + }; + let stats = crate::stats::compute(&conn, &stats_args, now)?; + print!("{}", crate::stats::render(&stats)); + } Some(Cmd::Doctor) => { let shell_env = std::env::var("SHELL").ok(); let shell = crate::hooks::detect_shell(None, shell_env.as_deref()) diff --git a/src/lib.rs b/src/lib.rs index 7d5bc03..7052da1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,5 +14,6 @@ pub mod schema; pub mod search; pub mod session; pub mod sessions; +pub mod stats; pub mod tags; pub mod tui; diff --git a/src/stats.rs b/src/stats.rs new file mode 100644 index 0000000..aefeebb --- /dev/null +++ b/src/stats.rs @@ -0,0 +1,584 @@ +use rusqlite::{Connection, ToSql}; + +use crate::error::ThothError; +use crate::search::parse_date; + +const TOP_PROJECTS_LIMIT: usize = 5; +const TOP_COMMANDS_LIMIT: usize = 10; +const TOP_ERROR_TOOLS_LIMIT: usize = 5; +const MIN_TOOL_COUNT: i64 = 5; +const HISTOGRAM_BAR_WIDTH: usize = 30; +const SECS_PER_DAY: i64 = 86_400; +const SECS_PER_HOUR: i64 = 3_600; + +pub struct StatsArgs { + pub project: Option, + pub since: Option, +} + +pub struct Stats { + pub total: i64, + pub distinct_projects: i64, + pub ok_count: i64, + pub top_projects: Vec<(String, i64)>, + pub top_commands: Vec<(String, i64)>, + pub hour_counts: [i64; 24], + pub error_tools: Vec<(String, i64, i64)>, +} + +pub fn first_token(cmd: &str) -> &str { + let trimmed = cmd.trim_start(); + match trimmed.find(|c: char| c.is_whitespace()) { + Some(pos) => &trimmed[..pos], + None => trimmed, + } +} + +struct FilterClause { + where_sql: String, + params: Vec>, +} + +fn build_filter(args: &StatsArgs, now: i64) -> Result { + let mut fragments: Vec = Vec::new(); + let mut params: Vec> = Vec::new(); + + if let Some(ref p) = args.project { + fragments.push("project = ?".to_string()); + params.push(Box::new(p.clone())); + } + + if let Some(ref since_str) = args.since { + let ts = parse_date(since_str, now)?; + fragments.push("timestamp >= ?".to_string()); + params.push(Box::new(ts)); + } + + let where_sql = if fragments.is_empty() { + String::new() + } else { + format!("WHERE {}", fragments.join(" AND ")) + }; + + Ok(FilterClause { where_sql, params }) +} + +pub fn compute(conn: &Connection, args: &StatsArgs, now: i64) -> Result { + let filter = build_filter(args, now)?; + + let total: i64 = conn.query_row( + &format!("SELECT COUNT(*) FROM commands {}", filter.where_sql), + rusqlite::params_from_iter(filter.params.iter().map(|p| p.as_ref())), + |r| r.get(0), + )?; + + let distinct_projects: i64 = conn.query_row( + &format!( + "SELECT COUNT(DISTINCT project) FROM commands {}", + filter.where_sql + ), + rusqlite::params_from_iter(filter.params.iter().map(|p| p.as_ref())), + |r| r.get(0), + )?; + + let ok_count: i64 = { + let ok_filter = rebuild_params(args, now)?; + let mut extra_fragments = Vec::new(); + if !ok_filter.where_sql.is_empty() { + extra_fragments.push(ok_filter.where_sql.trim_start_matches("WHERE ").to_string()); + } + extra_fragments.push("exit_code = 0".to_string()); + let where_sql = format!("WHERE {}", extra_fragments.join(" AND ")); + conn.query_row( + &format!("SELECT COUNT(*) FROM commands {where_sql}"), + rusqlite::params_from_iter(ok_filter.params.iter().map(|p| p.as_ref())), + |r| r.get(0), + )? + }; + + let top_projects: Vec<(String, i64)> = { + let filter2 = rebuild_params(args, now)?; + let sql = format!( + "SELECT project, COUNT(*) as cnt FROM commands {} GROUP BY project ORDER BY cnt DESC LIMIT {}", + filter2.where_sql, + TOP_PROJECTS_LIMIT + ); + let mut stmt = conn.prepare(&sql)?; + let rows = stmt.query_map( + rusqlite::params_from_iter(filter2.params.iter().map(|p| p.as_ref())), + |row| Ok((row.get::<_, String>(0)?, row.get::<_, i64>(1)?)), + )?; + let mut result = Vec::new(); + for row in rows { + result.push(row?); + } + result + }; + + let raw_rows: Vec<(String, i64, i64)> = { + let filter3 = rebuild_params(args, now)?; + let sql = format!( + "SELECT command, exit_code, timestamp FROM commands {}", + filter3.where_sql + ); + let mut stmt = conn.prepare(&sql)?; + let rows = stmt.query_map( + rusqlite::params_from_iter(filter3.params.iter().map(|p| p.as_ref())), + |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, i64>(1)?, + row.get::<_, i64>(2)?, + )) + }, + )?; + let mut result = Vec::new(); + for row in rows { + result.push(row?); + } + result + }; + + let mut cmd_counts: std::collections::HashMap = std::collections::HashMap::new(); + let mut hour_counts = [0i64; 24]; + let mut tool_fails: std::collections::HashMap = + std::collections::HashMap::new(); + + for (cmd, exit_code, ts) in &raw_rows { + *cmd_counts.entry(cmd.clone()).or_insert(0) += 1; + + let hour = (ts.rem_euclid(SECS_PER_DAY) / SECS_PER_HOUR) as usize; + if hour < 24 { + hour_counts[hour] += 1; + } + + let tool = first_token(cmd).to_string(); + let entry = tool_fails.entry(tool).or_insert((0, 0)); + entry.1 += 1; + if *exit_code != 0 { + entry.0 += 1; + } + } + + let mut top_commands: Vec<(String, i64)> = cmd_counts.into_iter().collect(); + top_commands.sort_by(|a, b| b.1.cmp(&a.1).then(a.0.cmp(&b.0))); + top_commands.truncate(TOP_COMMANDS_LIMIT); + + let mut error_tools: Vec<(String, i64, i64)> = tool_fails + .into_iter() + .filter(|(_, (_, total))| *total >= MIN_TOOL_COUNT) + .map(|(tool, (fails, total))| (tool, fails, total)) + .collect(); + error_tools.sort_by(|a, b| { + let rate_a = a.1 as f64 / a.2 as f64; + let rate_b = b.1 as f64 / b.2 as f64; + rate_b + .partial_cmp(&rate_a) + .unwrap_or(std::cmp::Ordering::Equal) + .then(a.0.cmp(&b.0)) + }); + error_tools.truncate(TOP_ERROR_TOOLS_LIMIT); + + Ok(Stats { + total, + distinct_projects, + ok_count, + top_projects, + top_commands, + hour_counts, + error_tools, + }) +} + +fn rebuild_params(args: &StatsArgs, now: i64) -> Result { + build_filter(args, now) +} + +pub fn render(stats: &Stats) -> String { + let mut out = String::new(); + + out.push_str("=== Overview ===\n"); + if stats.total == 0 { + out.push_str("No data recorded yet.\n"); + out.push('\n'); + out.push_str("=== Top Projects ===\n"); + out.push_str("(no data)\n"); + out.push('\n'); + out.push_str("=== Top Commands ===\n"); + out.push_str("(no data)\n"); + out.push('\n'); + out.push_str("=== Busiest Hour of Day (UTC) ===\n"); + for h in 0..24usize { + out.push_str(&format!("{h:02} | \n")); + } + out.push('\n'); + out.push_str("=== Tools with Highest Error Rate ===\n"); + out.push_str("(no data)\n"); + return out; + } + + let success_rate = (stats.ok_count as f64 / stats.total as f64) * 100.0; + out.push_str(&format!("Total commands: {}\n", stats.total)); + out.push_str(&format!("Active projects: {}\n", stats.distinct_projects)); + out.push_str(&format!("Global success: {:.1}%\n", success_rate)); + out.push('\n'); + + out.push_str("=== Top Projects ===\n"); + for (project, count) in &stats.top_projects { + out.push_str(&format!(" {project:<30} {count}\n")); + } + out.push('\n'); + + out.push_str("=== Top Commands ===\n"); + for (cmd, count) in &stats.top_commands { + out.push_str(&format!(" {cmd:<40} {count}\n")); + } + out.push('\n'); + + out.push_str("=== Busiest Hour of Day (UTC) ===\n"); + let max_hour = *stats.hour_counts.iter().max().unwrap_or(&0); + for h in 0..24usize { + let count = stats.hour_counts[h]; + let bar_len = if max_hour > 0 { + (count as usize * HISTOGRAM_BAR_WIDTH) / max_hour as usize + } else { + 0 + }; + let bar: String = "#".repeat(bar_len); + out.push_str(&format!( + "{h:02} | {bar: Connection { + let mut c = connect_memory().unwrap(); + apply_migrations(&mut c).unwrap(); + c + } + + fn insert(conn: &Connection, cmd: &str, project: &str, ts: i64, exit_code: i64) { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ + VALUES(?1, '/tmp', ?2, 's1', ?3, ?4, 100, '[]')", + rusqlite::params![cmd, project, ts, exit_code], + ) + .unwrap(); + } + + const NOW: i64 = 1_700_000_000; + + #[test] + fn first_token_normal() { + assert_eq!(first_token("git status"), "git"); + } + + #[test] + fn first_token_leading_spaces() { + assert_eq!(first_token(" cargo build"), "cargo"); + } + + #[test] + fn first_token_empty() { + assert_eq!(first_token(""), ""); + } + + #[test] + fn first_token_single_word() { + assert_eq!(first_token("ls"), "ls"); + } + + #[test] + fn hour_bucket_maps_correctly() { + let ts_hour_14: i64 = 14 * SECS_PER_HOUR; + let hour = (ts_hour_14.rem_euclid(SECS_PER_DAY) / SECS_PER_HOUR) as usize; + assert_eq!(hour, 14); + } + + #[test] + fn hour_bucket_midnight() { + let ts: i64 = 0; + let hour = (ts.rem_euclid(SECS_PER_DAY) / SECS_PER_HOUR) as usize; + assert_eq!(hour, 0); + } + + #[test] + fn compute_total_and_distinct_projects() { + let conn = mem_conn(); + insert(&conn, "git status", "alpha", NOW - 100, 0); + insert(&conn, "cargo build", "alpha", NOW - 200, 0); + insert(&conn, "docker ps", "beta", NOW - 300, 1); + + let args = StatsArgs { + project: None, + since: None, + }; + let stats = compute(&conn, &args, NOW).unwrap(); + assert_eq!(stats.total, 3); + assert_eq!(stats.distinct_projects, 2); + } + + #[test] + fn compute_success_rate() { + let conn = mem_conn(); + insert(&conn, "cmd_ok", "p", NOW - 100, 0); + insert(&conn, "cmd_ok2", "p", NOW - 200, 0); + insert(&conn, "cmd_fail", "p", NOW - 300, 1); + + let args = StatsArgs { + project: None, + since: None, + }; + let stats = compute(&conn, &args, NOW).unwrap(); + assert_eq!(stats.ok_count, 2); + assert_eq!(stats.total, 3); + } + + #[test] + fn compute_top_projects_order() { + let conn = mem_conn(); + insert(&conn, "cmd", "alpha", NOW - 100, 0); + insert(&conn, "cmd", "alpha", NOW - 200, 0); + insert(&conn, "cmd", "alpha", NOW - 300, 0); + insert(&conn, "cmd", "beta", NOW - 400, 0); + insert(&conn, "cmd", "beta", NOW - 500, 0); + insert(&conn, "cmd", "gamma", NOW - 600, 0); + + let args = StatsArgs { + project: None, + since: None, + }; + let stats = compute(&conn, &args, NOW).unwrap(); + assert_eq!(stats.top_projects[0].0, "alpha"); + assert_eq!(stats.top_projects[0].1, 3); + assert_eq!(stats.top_projects[1].0, "beta"); + } + + #[test] + fn compute_top_commands_order() { + let conn = mem_conn(); + for _ in 0..5 { + insert(&conn, "git status", "p", NOW - 100, 0); + } + for _ in 0..3 { + insert(&conn, "cargo build", "p", NOW - 200, 0); + } + insert(&conn, "ls", "p", NOW - 300, 0); + + let args = StatsArgs { + project: None, + since: None, + }; + let stats = compute(&conn, &args, NOW).unwrap(); + assert_eq!(stats.top_commands[0].0, "git status"); + assert_eq!(stats.top_commands[0].1, 5); + assert_eq!(stats.top_commands[1].0, "cargo build"); + } + + #[test] + fn compute_hour_counts() { + let conn = mem_conn(); + let ts_h10 = 10 * SECS_PER_HOUR; + let ts_h14 = 14 * SECS_PER_HOUR; + insert(&conn, "cmd_a", "p", ts_h10, 0); + insert(&conn, "cmd_b", "p", ts_h10 + 60, 0); + insert(&conn, "cmd_c", "p", ts_h14, 0); + + let args = StatsArgs { + project: None, + since: None, + }; + let stats = compute(&conn, &args, NOW).unwrap(); + assert_eq!(stats.hour_counts[10], 2); + assert_eq!(stats.hour_counts[14], 1); + assert_eq!(stats.hour_counts[0], 0); + } + + #[test] + fn compute_error_tools_excludes_below_min_count() { + let conn = mem_conn(); + for _ in 0..4 { + insert(&conn, "rare_tool cmd", "p", NOW - 100, 1); + } + for _ in 0..6 { + insert(&conn, "cargo build", "p", NOW - 200, 1); + } + + let args = StatsArgs { + project: None, + since: None, + }; + let stats = compute(&conn, &args, NOW).unwrap(); + let tools: Vec<&str> = stats + .error_tools + .iter() + .map(|(t, _, _)| t.as_str()) + .collect(); + assert!( + !tools.contains(&"rare_tool"), + "rare_tool has only 4 occurrences, below MIN_TOOL_COUNT=5" + ); + assert!(tools.contains(&"cargo")); + } + + #[test] + fn compute_error_tools_rate() { + let conn = mem_conn(); + for _ in 0..5 { + insert(&conn, "docker ps", "p", NOW - 100, 0); + } + for _ in 0..5 { + insert(&conn, "docker run", "p", NOW - 200, 1); + } + + let args = StatsArgs { + project: None, + since: None, + }; + let stats = compute(&conn, &args, NOW).unwrap(); + let docker = stats.error_tools.iter().find(|(t, _, _)| t == "docker"); + assert!(docker.is_some()); + let (_, fails, total) = docker.unwrap(); + assert_eq!(*fails, 5); + assert_eq!(*total, 10); + } + + #[test] + fn compute_project_filter() { + let conn = mem_conn(); + insert(&conn, "cmd", "alpha", NOW - 100, 0); + insert(&conn, "cmd", "alpha", NOW - 200, 0); + insert(&conn, "cmd", "beta", NOW - 300, 1); + + let args = StatsArgs { + project: Some("alpha".into()), + since: None, + }; + let stats = compute(&conn, &args, NOW).unwrap(); + assert_eq!(stats.total, 2); + assert_eq!(stats.ok_count, 2); + } + + #[test] + fn compute_since_filter() { + let conn = mem_conn(); + insert(&conn, "old_cmd", "p", 1000, 0); + insert(&conn, "new_cmd", "p", NOW - 100, 0); + + let args = StatsArgs { + project: None, + since: Some("2020-01-01".into()), + }; + let stats = compute(&conn, &args, NOW).unwrap(); + assert_eq!(stats.total, 1); + assert_eq!(stats.top_commands[0].0, "new_cmd"); + } + + #[test] + fn render_contains_section_headers() { + let stats = Stats { + total: 10, + distinct_projects: 2, + ok_count: 8, + top_projects: vec![("alpha".into(), 7), ("beta".into(), 3)], + top_commands: vec![("git status".into(), 5)], + hour_counts: { + let mut h = [0i64; 24]; + h[14] = 3; + h + }, + error_tools: vec![("cargo".into(), 2, 6)], + }; + let out = render(&stats); + assert!(out.contains("=== Overview ===")); + assert!(out.contains("=== Top Projects ===")); + assert!(out.contains("=== Top Commands ===")); + assert!(out.contains("=== Busiest Hour of Day (UTC) ===")); + assert!(out.contains("=== Tools with Highest Error Rate ===")); + } + + #[test] + fn render_success_rate_format() { + let stats = Stats { + total: 3, + distinct_projects: 1, + ok_count: 2, + top_projects: vec![], + top_commands: vec![], + hour_counts: [0i64; 24], + error_tools: vec![], + }; + let out = render(&stats); + assert!(out.contains("66.7%")); + } + + #[test] + fn render_histogram_bar_line() { + let mut hour_counts = [0i64; 24]; + hour_counts[14] = 10; + let stats = Stats { + total: 10, + distinct_projects: 1, + ok_count: 10, + top_projects: vec![], + top_commands: vec![], + hour_counts, + error_tools: vec![], + }; + let out = render(&stats); + let line_14 = out.lines().find(|l| l.starts_with("14 |")).unwrap(); + assert!(line_14.contains('#'), "hour 14 should have bar chars"); + assert!(line_14.contains("10"), "hour 14 should show count 10"); + } + + #[test] + fn render_tool_error_line() { + let stats = Stats { + total: 10, + distinct_projects: 1, + ok_count: 5, + top_projects: vec![], + top_commands: vec![], + hour_counts: [0i64; 24], + error_tools: vec![("docker".into(), 3, 6)], + }; + let out = render(&stats); + assert!(out.contains("docker")); + assert!(out.contains("3/6")); + assert!(out.contains("50.0%")); + } + + #[test] + fn render_empty_db_no_panic() { + let stats = Stats { + total: 0, + distinct_projects: 0, + ok_count: 0, + top_projects: vec![], + top_commands: vec![], + hour_counts: [0i64; 24], + error_tools: vec![], + }; + let out = render(&stats); + assert!(out.contains("No data recorded yet.") || out.contains("(no data)")); + } +} From e118aed5680151172504c414cfe12652f2f9e32c Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:52:45 -0600 Subject: [PATCH 082/151] feat(cli): add help text to all commands and flags (#38) --- src/cli.rs | 150 +++++++++++++++++++++++++++++++++++++-------------- tests/cli.rs | 76 ++++++++++++++++++++++++++ 2 files changed, 187 insertions(+), 39 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 4e2a662..eadb6cc 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -3,7 +3,16 @@ use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; #[derive(Parser)] -#[command(name = "tth", arg_required_else_help = false)] +#[command( + name = "tth", + arg_required_else_help = false, + about = "Thoth: an intelligent shell history that captures commands with context", + long_about = "Thoth records every command you run along with its working directory, \ +project, exit code, duration, and any active tags. Run bare `tth` or press Ctrl-R \ +(after `tth install`) to open an interactive fuzzy search. Use `tth search` for \ +filtered, scriptable output. Manage your history with `tth sessions`, `tth forget`, \ +`tth export`, and `tth tags`." +)] pub struct Cli { #[command(subcommand)] pub cmd: Option, @@ -11,152 +20,215 @@ pub struct Cli { #[derive(Subcommand)] pub enum Cmd { + #[command(about = "Record a command into history (invoked by the shell hooks, not by hand)")] Record(RecordArgs), + #[command(about = "Install the shell integration into your rc file")] Install(InstallArgs), + #[command(about = "Remove the shell integration from your rc file")] Uninstall(UninstallArgs), + #[command(about = "Show a quick status summary")] Status, + #[command(about = "Search history with filters and full-text")] Search(SearchArgs), + #[command(about = "List work sessions")] Sessions(SessionsArgs), + #[command(about = "Delete recent commands from history")] Forget(ForgetArgs), + #[command(about = "Export matching commands as a runnable bash script")] Export(ExportArgs), + #[command(about = "Print the shell integration script for eval (eval \"$(tth init zsh)\")")] Init(InitArgs), + #[command(about = "Print the export to activate a tag (used by the tth-tag shell function)")] Tag(TagArgs), + #[command( + about = "Print the export to deactivate a tag (used by the tth-untag shell function)" + )] Untag(UntagArgs), + #[command(about = "Show active tags, or all recorded tags with --list")] Tags(TagsArgs), + #[command(about = "Print prompt-integration instructions for your prompt framework")] Prompt(PromptArgs), + #[command(about = "Show history insights and statistics")] Stats(StatsArgs), + #[command(about = "Run diagnostics and suggest fixes")] Doctor, - #[command(hide = true)] + #[command( + hide = true, + about = "Generate a new session ID (invoked by the shell hooks, not by hand)" + )] NewSessionId, } #[derive(clap::Args, Debug, Clone)] pub struct ForgetArgs { - #[arg(long, default_value_t = 1)] + #[arg( + long, + default_value_t = 1, + help = "Number of recent commands to forget" + )] pub last: usize, - #[arg(long)] + #[arg( + long, + help = "Preview which commands would be deleted without deleting them" + )] pub dry_run: bool, - #[arg(long = "terminal-id")] + #[arg( + long = "terminal-id", + help = "Restrict to commands from this terminal session" + )] pub terminal_id: Option, } #[derive(clap::Args, Debug, Clone)] pub struct RecordArgs { - #[arg(long)] + #[arg(long, help = "The command string to record")] pub cmd: String, - #[arg(long)] + #[arg(long, help = "Working directory where the command ran")] pub dir: Option, - #[arg(long = "exit", default_value_t = 0)] + #[arg(long = "exit", default_value_t = 0, help = "Exit code of the command")] pub exit_code: i64, - #[arg(long, default_value_t = 0)] + #[arg(long, default_value_t = 0, help = "Command duration in milliseconds")] pub duration: i64, - #[arg(long)] + #[arg(long, help = "Unix timestamp when the command ran")] pub timestamp: Option, - #[arg(long, default_value = "[]")] + #[arg(long, default_value = "[]", help = "JSON array of active tag names")] pub tags: String, - #[arg(long = "terminal-id")] + #[arg(long = "terminal-id", help = "Identifier for the terminal session")] pub terminal_id: Option, } #[derive(clap::Args, Debug, Clone)] pub struct InstallArgs { - #[arg(long)] + #[arg( + long, + help = "Shell to install for (bash or zsh; auto-detected if omitted)" + )] pub shell: Option, - #[arg(long = "rc-file")] + #[arg( + long = "rc-file", + help = "Path to the rc file to modify (default: ~/.bashrc or ~/.zshrc)" + )] pub rc_file: Option, } #[derive(clap::Args, Debug, Clone)] pub struct SearchArgs { + #[arg(help = "Optional full-text search query")] pub query: Option, - #[arg(short = 'p', long)] + #[arg(short = 'p', long, help = "Filter by project (directory basename)")] pub project: Option, - #[arg(short = 't', long, action = clap::ArgAction::Append)] + #[arg(short = 't', long, action = clap::ArgAction::Append, help = "Filter by tag (repeatable)")] pub tag: Vec, - #[arg(long)] + #[arg(long, help = "Filter by exit status: ok, fail, or a specific code")] pub exit: Option, - #[arg(long)] + #[arg(long, help = "Filter by minimum duration, e.g. 500ms or 2s")] pub duration: Option, - #[arg(long)] + #[arg( + long, + help = "Show commands after this time, e.g. '2h ago' or '2024-01-01'" + )] pub since: Option, - #[arg(long)] + #[arg(long, help = "Show commands before this time")] pub until: Option, - #[arg(long)] + #[arg(long, help = "Filter by session ID")] pub session: Option, - #[arg(long, default_value_t = 50)] + #[arg(long, default_value_t = 50, help = "Maximum number of results")] pub limit: usize, - #[arg(long = "show-session", default_value_t = false)] + #[arg( + long = "show-session", + default_value_t = false, + help = "Include session ID column in output" + )] pub show_session: bool, } #[derive(clap::Args, Debug, Clone)] pub struct SessionsArgs { - #[arg(long)] + #[arg(long, help = "Filter sessions by project name")] pub project: Option, - #[arg(long)] + #[arg(long, help = "Show sessions after this time")] pub since: Option, - #[arg(long)] + #[arg(long, help = "Show sessions before this time")] pub until: Option, - #[arg(long, default_value_t = 20)] + #[arg( + long, + default_value_t = 20, + help = "Maximum number of sessions to show" + )] pub limit: usize, } #[derive(clap::Args, Debug, Clone)] pub struct ExportArgs { - #[arg(long)] + #[arg(long, help = "Export commands from this session ID")] pub session: Option, - #[arg(short = 't', long, action = clap::ArgAction::Append)] + #[arg(short = 't', long, action = clap::ArgAction::Append, help = "Filter by tag (repeatable)")] pub tag: Vec, - #[arg(short = 'p', long)] + #[arg(short = 'p', long, help = "Filter by project name")] pub project: Option, - #[arg(long)] + #[arg(long, help = "Export commands after this time")] pub since: Option, - #[arg(long)] + #[arg(long, help = "Filter by exit status: ok, fail, or a specific code")] pub exit: Option, } #[derive(clap::Args, Debug, Clone)] pub struct InitArgs { + #[arg(help = "Shell to generate integration for (bash or zsh; auto-detected if omitted)")] pub shell: Option, } #[derive(clap::Args, Debug, Clone)] pub struct TagArgs { + #[arg(help = "Tag name to activate")] pub name: String, } #[derive(clap::Args, Debug, Clone)] pub struct UntagArgs { + #[arg(help = "Tag name to deactivate")] pub name: Option, - #[arg(long)] + #[arg(long, help = "Deactivate all tags at once")] pub all: bool, } #[derive(clap::Args, Debug, Clone)] pub struct TagsArgs { - #[arg(long)] + #[arg( + long, + help = "Show all tags recorded in the database with command counts" + )] pub list: bool, } #[derive(clap::Args, Debug, Clone)] pub struct PromptArgs { - #[arg(long)] + #[arg( + long, + help = "Prompt framework to generate for: starship, p10k, oh-my-posh, or generic" + )] pub framework: Option, } #[derive(clap::Args, Debug, Clone)] pub struct StatsArgs { - #[arg(short = 'p', long)] + #[arg(short = 'p', long, help = "Restrict stats to this project")] pub project: Option, - #[arg(long)] + #[arg(long, help = "Restrict stats to commands after this time")] pub since: Option, } #[derive(clap::Args, Debug, Clone)] pub struct UninstallArgs { - #[arg(long = "keep-data")] + #[arg( + long = "keep-data", + help = "Suppress the data-retention reminder message" + )] pub keep_data: bool, - #[arg(long = "rc-file")] + #[arg( + long = "rc-file", + help = "Path to the rc file to modify (default: ~/.bashrc or ~/.zshrc)" + )] pub rc_file: Option, } diff --git a/tests/cli.rs b/tests/cli.rs index 350ce82..7d6c1a1 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -438,6 +438,82 @@ fn record_never_fail_contract_preserved() { .code(0); } +#[test] +fn help_top_level_contains_about_and_command_descriptions() { + let output = tth().args(["--help"]).output().unwrap(); + assert!(output.status.success(), "tth --help must exit 0"); + let stdout = String::from_utf8(output.stdout).unwrap(); + assert!( + stdout.contains("Thoth records every command"), + "top-level about not found; got:\n{stdout}" + ); + assert!( + stdout.contains("Search history"), + "search description not found; got:\n{stdout}" + ); + assert!( + stdout.contains("List work sessions"), + "sessions description not found; got:\n{stdout}" + ); + assert!( + stdout.contains("Run diagnostics"), + "doctor description not found; got:\n{stdout}" + ); + assert!( + stdout.contains("Show history insights"), + "stats description not found; got:\n{stdout}" + ); +} + +#[test] +fn help_search_shows_about_and_flags() { + let output = tth().args(["help", "search"]).output().unwrap(); + assert!(output.status.success(), "tth help search must exit 0"); + let stdout = String::from_utf8(output.stdout).unwrap(); + assert!( + stdout.contains("Search history"), + "search about not found; got:\n{stdout}" + ); + assert!( + stdout.contains("--project"), + "--project flag not documented; got:\n{stdout}" + ); + assert!( + stdout.contains("--limit"), + "--limit flag not documented; got:\n{stdout}" + ); + assert!( + stdout.contains("--since"), + "--since flag not documented; got:\n{stdout}" + ); +} + +#[test] +fn help_forget_shows_about_and_flags() { + let output = tth().args(["help", "forget"]).output().unwrap(); + assert!(output.status.success(), "tth help forget must exit 0"); + let stdout = String::from_utf8(output.stdout).unwrap(); + assert!( + stdout.contains("Delete recent commands"), + "forget about not found; got:\n{stdout}" + ); + assert!( + stdout.contains("--dry-run"), + "--dry-run flag not documented; got:\n{stdout}" + ); +} + +#[test] +fn help_sessions_shows_about() { + let output = tth().args(["help", "sessions"]).output().unwrap(); + assert!(output.status.success(), "tth help sessions must exit 0"); + let stdout = String::from_utf8(output.stdout).unwrap(); + assert!( + stdout.contains("List work sessions"), + "sessions about not found; got:\n{stdout}" + ); +} + fn tth_with_env(db_path: &std::path::Path, error_log: &std::path::Path) -> Command { let mut cmd = tth(); cmd.env("THOTH_DB", db_path.to_str().unwrap()) From 55ff9e2c367347640a01ecbf30f57e9ee94a8f08 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 00:55:29 -0600 Subject: [PATCH 083/151] fix(cli): correct --duration and --exit help text (#38) --- src/cli.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index eadb6cc..98438c5 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -119,9 +119,12 @@ pub struct SearchArgs { pub project: Option, #[arg(short = 't', long, action = clap::ArgAction::Append, help = "Filter by tag (repeatable)")] pub tag: Vec, - #[arg(long, help = "Filter by exit status: ok, fail, or a specific code")] + #[arg(long, help = "Filter by exit status: ok, fail, or any")] pub exit: Option, - #[arg(long, help = "Filter by minimum duration, e.g. 500ms or 2s")] + #[arg( + long, + help = "Filter by duration in seconds, e.g. >30 (over 30s) or <5 (under 5s)" + )] pub duration: Option, #[arg( long, @@ -168,7 +171,7 @@ pub struct ExportArgs { pub project: Option, #[arg(long, help = "Export commands after this time")] pub since: Option, - #[arg(long, help = "Filter by exit status: ok, fail, or a specific code")] + #[arg(long, help = "Filter by exit status: ok, fail, or any")] pub exit: Option, } From 871a0a82c1ed3a3bc95632ca177edb56ca51362a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 01:09:04 -0600 Subject: [PATCH 084/151] feat: add serde derive dep and ThothError::Config variant (#40) --- Cargo.toml | 1 + src/error.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 25cff28..e1889a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ clap = { version = "4", features = ["derive"] } thiserror = "2" uuid = { version = "1", features = ["v4"] } toml = "0.8" +serde = { version = "1", features = ["derive"] } serde_json = "1" comfy-table = "7" ratatui = "0.29" diff --git a/src/error.rs b/src/error.rs index d267bb4..8fe36bc 100644 --- a/src/error.rs +++ b/src/error.rs @@ -16,6 +16,8 @@ pub enum ThothError { Tag(String), #[error("{0}")] Prompt(String), + #[error("config: {0}")] + Config(String), } #[cfg(test)] From 5081492980d9ea81e4e6390bd259fe53bdbc2fb6 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 01:09:08 -0600 Subject: [PATCH 085/151] feat: add src/config.rs with Config struct, parse, load, render_config (#40) --- src/config.rs | 229 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 230 insertions(+) create mode 100644 src/config.rs diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..f1542b3 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,229 @@ +use std::path::{Path, PathBuf}; + +use serde::Deserialize; + +use crate::error::ThothError; + +#[derive(Deserialize, Debug, Clone, PartialEq, Default)] +#[serde(rename_all = "lowercase")] +pub enum Orientation { + #[default] + Bottom, + Top, +} + +impl Orientation { + pub fn is_bottom(&self) -> bool { + matches!(self, Orientation::Bottom) + } +} + +#[derive(Deserialize, Debug, Clone)] +#[serde(default)] +pub struct Session { + pub gap_minutes: i64, +} + +impl Default for Session { + fn default() -> Self { + Self { gap_minutes: 30 } + } +} + +#[derive(Deserialize, Debug, Clone)] +#[serde(default)] +pub struct Tui { + pub orientation: Orientation, +} + +impl Default for Tui { + fn default() -> Self { + Self { + orientation: Orientation::Bottom, + } + } +} + +#[derive(Deserialize, Debug, Clone)] +#[serde(default)] +pub struct Search { + pub default_limit: usize, +} + +impl Default for Search { + fn default() -> Self { + Self { default_limit: 50 } + } +} + +#[derive(Deserialize, Debug, Clone, Default)] +#[serde(default)] +pub struct Config { + pub session: Session, + pub tui: Tui, + pub search: Search, +} + +fn config_path_from(thoth_config: Option<&str>, xdg_config: Option<&str>, home: &Path) -> PathBuf { + if let Some(v) = thoth_config { + return PathBuf::from(v); + } + if let Some(x) = xdg_config { + return PathBuf::from(x).join("thoth").join("config.toml"); + } + home.join(".config").join("thoth").join("config.toml") +} + +pub fn resolve_config_path() -> PathBuf { + let thoth_config = std::env::var("THOTH_CONFIG").ok(); + let xdg_config = std::env::var("XDG_CONFIG_HOME").ok(); + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + config_path_from( + thoth_config.as_deref(), + xdg_config.as_deref(), + Path::new(&home), + ) +} + +pub fn parse(text: &str) -> Result { + toml::from_str(text).map_err(|e| ThothError::Config(e.to_string())) +} + +pub fn load() -> Config { + let path = resolve_config_path(); + if !path.exists() { + return Config::default(); + } + match std::fs::read_to_string(&path) { + Ok(text) => match parse(&text) { + Ok(cfg) => cfg, + Err(e) => { + eprintln!( + "thoth: ignoring invalid config at {}: {}; using defaults", + path.display(), + e + ); + Config::default() + } + }, + Err(e) => { + eprintln!( + "thoth: ignoring invalid config at {}: {}; using defaults", + path.display(), + e + ); + Config::default() + } + } +} + +pub fn render_config(cfg: &Config, path: &Path, exists: bool) -> String { + let exists_str = if exists { "true" } else { "false" }; + let orientation = if cfg.tui.orientation.is_bottom() { + "bottom" + } else { + "top" + }; + format!( + "Config path: {}\nExists: {}\n[session] gap_minutes = {}\n[tui] orientation = {}\n[search] default_limit = {}\n", + path.display(), + exists_str, + cfg.session.gap_minutes, + orientation, + cfg.search.default_limit, + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::path::PathBuf; + + #[test] + fn parse_empty_string_uses_defaults() { + let cfg = parse("").unwrap(); + assert_eq!(cfg.session.gap_minutes, 30); + assert_eq!(cfg.tui.orientation, Orientation::Bottom); + assert_eq!(cfg.search.default_limit, 50); + } + + #[test] + fn parse_partial_session_gap() { + let cfg = parse("[session]\ngap_minutes = 15").unwrap(); + assert_eq!(cfg.session.gap_minutes, 15); + assert_eq!(cfg.tui.orientation, Orientation::Bottom); + assert_eq!(cfg.search.default_limit, 50); + } + + #[test] + fn parse_full_config() { + let toml = "[session]\ngap_minutes = 10\n[tui]\norientation = \"top\"\n[search]\ndefault_limit = 25"; + let cfg = parse(toml).unwrap(); + assert_eq!(cfg.session.gap_minutes, 10); + assert_eq!(cfg.tui.orientation, Orientation::Top); + assert_eq!(cfg.search.default_limit, 25); + } + + #[test] + fn parse_bad_toml_returns_err() { + assert!(parse("not = {valid = toml").is_err()); + } + + #[test] + fn parse_bad_orientation_returns_err() { + assert!(parse("[tui]\norientation = \"sideways\"").is_err()); + } + + #[test] + fn config_path_from_override_wins() { + let result = config_path_from( + Some("/custom/config.toml"), + Some("/xdg"), + Path::new("/home/user"), + ); + assert_eq!(result, PathBuf::from("/custom/config.toml")); + } + + #[test] + fn config_path_from_xdg_fallback() { + let result = config_path_from(None, Some("/xdg/config"), Path::new("/home/user")); + assert_eq!(result, PathBuf::from("/xdg/config/thoth/config.toml")); + } + + #[test] + fn config_path_from_home_fallback() { + let result = config_path_from(None, None, Path::new("/home/user")); + assert_eq!( + result, + PathBuf::from("/home/user/.config/thoth/config.toml") + ); + } + + #[test] + fn render_config_defaults() { + let cfg = Config::default(); + let path = PathBuf::from("/home/user/.config/thoth/config.toml"); + let out = render_config(&cfg, &path, false); + assert!(out.contains("gap_minutes = 30")); + assert!(out.contains("orientation = bottom")); + assert!(out.contains("default_limit = 50")); + assert!(out.contains("false")); + } + + #[test] + fn render_config_custom() { + let cfg = parse("[session]\ngap_minutes = 10\n[tui]\norientation = \"top\"\n[search]\ndefault_limit = 3").unwrap(); + let path = PathBuf::from("/tmp/config.toml"); + let out = render_config(&cfg, &path, true); + assert!(out.contains("gap_minutes = 10")); + assert!(out.contains("orientation = top")); + assert!(out.contains("default_limit = 3")); + assert!(out.contains("true")); + } + + #[test] + fn orientation_is_bottom_helper() { + assert!(Orientation::Bottom.is_bottom()); + assert!(!Orientation::Top.is_bottom()); + } +} diff --git a/src/lib.rs b/src/lib.rs index 7052da1..6638168 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ pub mod cli; +pub mod config; pub mod database; pub mod doctor; pub mod error; From a771594eec38e051328bdbfa675ebf8ec59e7e4b Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 01:09:11 -0600 Subject: [PATCH 086/151] feat: thread gap_minutes into get_or_create and record_inner (#40) --- src/recorder.rs | 32 ++++++++++++++++++------------- src/session.rs | 50 ++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/recorder.rs b/src/recorder.rs index 0689c1e..e6bfd77 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -21,7 +21,11 @@ pub fn normalize_tags(raw: &str) -> String { } } -pub fn record_inner(args: &RecordArgs, conn: &mut Connection) -> Result<(), ThothError> { +pub fn record_inner( + args: &RecordArgs, + gap_minutes: i64, + conn: &mut Connection, +) -> Result<(), ThothError> { let tags = normalize_tags(&args.tags); let directory = args.dir.clone().unwrap_or_else(|| { std::env::current_dir() @@ -39,7 +43,7 @@ pub fn record_inner(args: &RecordArgs, conn: &mut Connection) -> Result<(), Thot let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; let project = infer_project(&directory, &tx)?; - let sid = get_or_create(&project, timestamp, &tx)?; + let sid = get_or_create(&project, timestamp, gap_minutes, &tx)?; tx.execute( "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id) \ @@ -72,8 +76,8 @@ pub fn record_inner(args: &RecordArgs, conn: &mut Connection) -> Result<(), Thot Ok(()) } -pub fn record(args: &RecordArgs, conn: &mut Connection) { - match record_inner(args, conn) { +pub fn record(args: &RecordArgs, gap_minutes: i64, conn: &mut Connection) { + match record_inner(args, gap_minutes, conn) { Ok(()) => {} Err(ThothError::Sqlite(ref e)) if matches!( @@ -93,7 +97,7 @@ pub fn record(args: &RecordArgs, conn: &mut Connection) { ) ) => { - match record_inner(args, conn) { + match record_inner(args, gap_minutes, conn) { Ok(()) => {} Err(e) => log_error(&e.to_string()), } @@ -109,6 +113,8 @@ mod tests { use rusqlite::Connection; use tempfile::TempDir; + const DEFAULT_GAP: i64 = 30; + fn mem_conn() -> Connection { let mut c = crate::database::connect_memory().unwrap(); crate::database::apply_migrations(&mut c).unwrap(); @@ -139,7 +145,7 @@ mod tests { terminal_id: Some(String::from("abc")), ..base_args() }; - record_inner(&args, &mut conn).unwrap(); + record_inner(&args, DEFAULT_GAP, &mut conn).unwrap(); let val: Option = conn .query_row( "SELECT terminal_id FROM commands WHERE command='echo hi'", @@ -154,7 +160,7 @@ mod tests { fn terminal_id_null_when_omitted() { let mut conn = mem_conn(); let args = base_args(); - record_inner(&args, &mut conn).unwrap(); + record_inner(&args, DEFAULT_GAP, &mut conn).unwrap(); let val: Option = conn .query_row( "SELECT terminal_id FROM commands WHERE command='echo hi'", @@ -189,7 +195,7 @@ mod tests { fn successful_record_inserts_row() { let mut conn = mem_conn(); let args = base_args(); - record_inner(&args, &mut conn).unwrap(); + record_inner(&args, DEFAULT_GAP, &mut conn).unwrap(); let count: i64 = conn .query_row( "SELECT COUNT(*) FROM commands WHERE command='echo hi'", @@ -222,7 +228,7 @@ mod tests { tags: String::from("[]"), terminal_id: None, }; - record_inner(&args, &mut conn).unwrap(); + record_inner(&args, DEFAULT_GAP, &mut conn).unwrap(); let count: i64 = conn .query_row( "SELECT command_count FROM projects WHERE path=?1", @@ -237,7 +243,7 @@ mod tests { fn session_updated_after_record() { let mut conn = mem_conn(); let args = base_args(); - record_inner(&args, &mut conn).unwrap(); + record_inner(&args, DEFAULT_GAP, &mut conn).unwrap(); let (ended_at, count): (i64, i64) = conn .query_row("SELECT ended_at, command_count FROM sessions", [], |r| { Ok((r.get(0)?, r.get(1)?)) @@ -258,7 +264,7 @@ mod tests { conn2.execute("BEGIN IMMEDIATE", []).unwrap(); let args = base_args(); - let result = record_inner(&args, &mut conn); + let result = record_inner(&args, DEFAULT_GAP, &mut conn); drop(conn2); @@ -284,7 +290,7 @@ mod tests { conn.execute_batch("DROP TABLE commands;").unwrap(); let args = base_args(); - record(&args, &mut conn); + record(&args, DEFAULT_GAP, &mut conn); let log = std::fs::read_to_string(&log_path).unwrap_or_default(); assert!(!log.is_empty(), "error was not logged"); @@ -301,7 +307,7 @@ mod tests { blocker.execute("BEGIN IMMEDIATE", []).unwrap(); let args = base_args(); - record(&args, &mut conn); + record(&args, DEFAULT_GAP, &mut conn); drop(blocker); diff --git a/src/session.rs b/src/session.rs index f17bcee..03cf3df 100644 --- a/src/session.rs +++ b/src/session.rs @@ -1,14 +1,14 @@ use crate::error::ThothError; use rusqlite::Connection; -pub const SESSION_GAP_MINUTES: i64 = 30; -const GAP_SECONDS: i64 = SESSION_GAP_MINUTES * 60; - pub fn get_or_create( project: &str, timestamp: i64, + gap_minutes: i64, conn: &Connection, ) -> Result { + let gap_seconds = gap_minutes * 60; + let row: Option<(String, String, i64)> = conn .query_row( "SELECT session_id, project, ended_at FROM sessions ORDER BY ended_at DESC LIMIT 1", @@ -19,7 +19,7 @@ pub fn get_or_create( let create_new = match &row { None => true, - Some((_, proj, ended_at)) => (timestamp - ended_at) > GAP_SECONDS || proj != project, + Some((_, proj, ended_at)) => (timestamp - ended_at) > gap_seconds || proj != project, }; if create_new { @@ -55,11 +55,13 @@ mod tests { c } + const DEFAULT_GAP: i64 = 30; + #[test] fn first_ever_creates_session() { let conn = mem_conn(); let t0 = 1700000000i64; - let sid = get_or_create("app", t0, &conn).unwrap(); + let sid = get_or_create("app", t0, DEFAULT_GAP, &conn).unwrap(); assert!(!sid.is_empty()); let count: i64 = conn .query_row("SELECT COUNT(*) FROM sessions", [], |r| r.get(0)) @@ -71,9 +73,9 @@ mod tests { fn reuse_within_gap() { let conn = mem_conn(); let t0 = 1700000000i64; - let sid1 = get_or_create("app", t0, &conn).unwrap(); + let sid1 = get_or_create("app", t0, DEFAULT_GAP, &conn).unwrap(); let t1 = t0 + 600; - let sid2 = get_or_create("app", t1, &conn).unwrap(); + let sid2 = get_or_create("app", t1, DEFAULT_GAP, &conn).unwrap(); assert_eq!(sid1, sid2); } @@ -81,9 +83,9 @@ mod tests { fn new_session_on_gap() { let conn = mem_conn(); let t0 = 1700000000i64; - let sid1 = get_or_create("app", t0, &conn).unwrap(); + let sid1 = get_or_create("app", t0, DEFAULT_GAP, &conn).unwrap(); let t1 = t0 + 31 * 60; - let sid2 = get_or_create("app", t1, &conn).unwrap(); + let sid2 = get_or_create("app", t1, DEFAULT_GAP, &conn).unwrap(); assert_ne!(sid1, sid2); } @@ -91,9 +93,35 @@ mod tests { fn new_session_on_project_change() { let conn = mem_conn(); let t0 = 1700000000i64; - let sid1 = get_or_create("app", t0, &conn).unwrap(); + let sid1 = get_or_create("app", t0, DEFAULT_GAP, &conn).unwrap(); let t1 = t0 + 300; - let sid2 = get_or_create("other-lib", t1, &conn).unwrap(); + let sid2 = get_or_create("other-lib", t1, DEFAULT_GAP, &conn).unwrap(); assert_ne!(sid1, sid2); } + + #[test] + fn custom_gap_splits_at_that_threshold() { + let conn = mem_conn(); + let t0 = 1700000000i64; + let sid1 = get_or_create("app", t0, 15, &conn).unwrap(); + let t1 = t0 + 16 * 60; + let sid2 = get_or_create("app", t1, 15, &conn).unwrap(); + assert_ne!( + sid1, sid2, + "16 min gap must create new session with gap_minutes=15" + ); + } + + #[test] + fn custom_gap_reuses_within_threshold() { + let conn = mem_conn(); + let t0 = 1700000000i64; + let sid1 = get_or_create("app", t0, 15, &conn).unwrap(); + let t1 = t0 + 14 * 60; + let sid2 = get_or_create("app", t1, 15, &conn).unwrap(); + assert_eq!( + sid1, sid2, + "14 min gap must reuse session with gap_minutes=15" + ); + } } From 11295a40bb3cf98fa6eada06d59febbe7edbc35b Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 01:09:14 -0600 Subject: [PATCH 087/151] feat: change SearchArgs.limit to Option and wire config default_limit (#40) --- src/cli.rs | 27 ++++++++++++++++++++++----- src/search.rs | 6 +++--- src/tui/app.rs | 6 +++--- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 98438c5..8e03c11 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -57,6 +57,8 @@ pub enum Cmd { about = "Generate a new session ID (invoked by the shell hooks, not by hand)" )] NewSessionId, + #[command(about = "Show the resolved configuration path and effective values")] + Config, } #[derive(clap::Args, Debug, Clone)] @@ -135,8 +137,8 @@ pub struct SearchArgs { pub until: Option, #[arg(long, help = "Filter by session ID")] pub session: Option, - #[arg(long, default_value_t = 50, help = "Maximum number of results")] - pub limit: usize, + #[arg(long, help = "Maximum number of results")] + pub limit: Option, #[arg( long = "show-session", default_value_t = false, @@ -246,8 +248,9 @@ pub fn run() -> Result<(), crate::error::ThothError> { match cli.cmd { None => { + let cfg = crate::config::load(); let conn = crate::database::get_connection(None)?; - crate::tui::run(&conn, now)?; + crate::tui::run(&conn, now, cfg.tui.orientation.is_bottom())?; } Some(Cmd::Record(mut args)) => { crate::logging::setup(crate::paths::resolve_error_log()); @@ -264,8 +267,9 @@ pub fn run() -> Result<(), crate::error::ThothError> { .as_secs() as i64, ); } + let cfg = crate::config::load(); match crate::database::get_connection(None) { - Ok(mut conn) => crate::recorder::record(&args, &mut conn), + Ok(mut conn) => crate::recorder::record(&args, cfg.session.gap_minutes, &mut conn), Err(e) => crate::logging::log_error(&e.to_string()), } } @@ -331,7 +335,10 @@ pub fn run() -> Result<(), crate::error::ThothError> { println!("Session ID set: {}", report.session_id_set); println!("tth on PATH: {}", report.tth_on_path); } - Some(Cmd::Search(args)) => { + Some(Cmd::Search(mut args)) => { + let cfg = crate::config::load(); + let resolved_limit = args.limit.unwrap_or(cfg.search.default_limit); + args.limit = Some(resolved_limit); let conn = crate::database::get_connection(None)?; let rows = crate::search::execute(&args, &conn, now)?; print!("{}", crate::search::render(&rows, args.show_session)); @@ -504,12 +511,16 @@ pub fn run() -> Result<(), crate::error::ThothError> { let tth_on_path = which_tth(); let framework = crate::prompt::detect_framework(&crate::prompt::probe_inputs()); let framework_config_text = read_framework_config(&framework, &home); + let config_path = crate::config::resolve_config_path(); + let config_present = config_path.exists(); let inputs = crate::doctor::DoctorInputs { hooks_installed, db_result, tth_on_path, framework, framework_config_text, + config_path, + config_present, }; let report = crate::doctor::run_doctor(&inputs); print!("{}", crate::doctor::render_report(&report)); @@ -517,6 +528,12 @@ pub fn run() -> Result<(), crate::error::ThothError> { Some(Cmd::NewSessionId) => { println!("{}", uuid::Uuid::new_v4()); } + Some(Cmd::Config) => { + let cfg = crate::config::load(); + let path = crate::config::resolve_config_path(); + let exists = path.exists(); + print!("{}", crate::config::render_config(&cfg, &path, exists)); + } } Ok(()) } diff --git a/src/search.rs b/src/search.rs index a58682c..0b82630 100644 --- a/src/search.rs +++ b/src/search.rs @@ -194,7 +194,7 @@ pub fn build_query( params.push(Box::new(tag.clone())); } - let limit = args.limit as i64; + let limit = args.limit.unwrap_or(50) as i64; params.push(Box::new(limit)); let sql = if use_fts { @@ -391,7 +391,7 @@ mod tests { since: None, until: None, session: None, - limit: 50, + limit: Some(50), show_session: false, } } @@ -775,7 +775,7 @@ mod tests { ); } let args = SearchArgs { - limit: 2, + limit: Some(2), ..default_args() }; let rows = execute(&args, &conn, FIXED_NOW).unwrap(); diff --git a/src/tui/app.rs b/src/tui/app.rs index 6216a5f..3afadc4 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -42,7 +42,7 @@ impl FilterState { since: self.since.clone(), until: self.until.clone(), session: None, - limit: TUI_LIMIT, + limit: Some(TUI_LIMIT), show_session: false, } } @@ -143,7 +143,7 @@ mod tests { assert!(args.exit.is_none()); assert!(args.since.is_none()); assert!(args.until.is_none()); - assert_eq!(args.limit, TUI_LIMIT); + assert_eq!(args.limit, Some(TUI_LIMIT)); } #[test] @@ -161,7 +161,7 @@ mod tests { assert_eq!(args.tag, vec!["rust".to_string(), "cli".to_string()]); assert_eq!(args.since, Some("2024-01-01".into())); assert_eq!(args.until, Some("2024-12-31".into())); - assert_eq!(args.limit, TUI_LIMIT); + assert_eq!(args.limit, Some(TUI_LIMIT)); } #[test] From 84c50a220e9cd2da3b4a872cf8cead8b2c89f069 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 01:09:18 -0600 Subject: [PATCH 088/151] feat: add is_bottom param to draw, support top orientation in TUI (#40) --- src/tui/mod.rs | 4 +-- src/tui/render.rs | 63 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/tui/mod.rs b/src/tui/mod.rs index ee97c99..144d166 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -44,7 +44,7 @@ impl Drop for TerminalGuard { } } -pub fn run(conn: &Connection, now: i64) -> Result<(), ThothError> { +pub fn run(conn: &Connection, now: i64, is_bottom: bool) -> Result<(), ThothError> { let tty = OpenOptions::new() .read(true) .write(true) @@ -72,7 +72,7 @@ pub fn run(conn: &Connection, now: i64) -> Result<(), ThothError> { loop { terminal - .draw(|f| render::draw(f, &app, now, &mut table_state)) + .draw(|f| render::draw(f, &app, now, is_bottom, &mut table_state)) .map_err(|e| ThothError::Tui(format!("draw failed: {e}")))?; if ct_event::poll(std::time::Duration::from_millis(200)) diff --git a/src/tui/render.rs b/src/tui/render.rs index c853518..17468ca 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -9,8 +9,6 @@ use ratatui::{ use crate::tui::app::App; use crate::tui::time::format_relative; -pub const BOTTOM_ANCHORED: bool = true; - pub fn display_command(raw: &str) -> String { let collapsed: String = raw .chars() @@ -91,7 +89,7 @@ const ACCENT: Color = Color::Cyan; const DIM_COLOR: Color = Color::DarkGray; const BORDER_COLOR: Color = Color::DarkGray; -pub fn draw(frame: &mut Frame, app: &App, now: i64, table_state: &mut TableState) { +pub fn draw(frame: &mut Frame, app: &App, now: i64, is_bottom: bool, table_state: &mut TableState) { let area = frame.area(); let chunks = Layout::vertical([ @@ -178,10 +176,14 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64, table_state: &mut TableState let cyan = Style::default().fg(ACCENT); let blue = Style::default().fg(Color::Blue); - let rows: Vec = app - .filtered + let ordered: Vec = if is_bottom { + app.filtered.iter().rev().copied().collect() + } else { + app.filtered.to_vec() + }; + + let rows: Vec = ordered .iter() - .rev() .map(|&fi| { let row = &app.all_rows[fi]; let rel = format_relative(row.timestamp, now); @@ -223,7 +225,11 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64, table_state: &mut TableState if app.filtered.is_empty() { table_state.select(None); } else { - let display_idx = app.filtered.len() - 1 - app.selected; + let display_idx = if is_bottom { + app.filtered.len() - 1 - app.selected + } else { + app.selected + }; table_state.select(Some(display_idx)); } frame.render_stateful_widget(table, inner_list_area, table_state); @@ -281,7 +287,9 @@ mod tests { let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); - terminal.draw(|f| draw(f, app, TEST_NOW, &mut ts)).unwrap(); + terminal + .draw(|f| draw(f, app, TEST_NOW, true, &mut ts)) + .unwrap(); let buf = terminal.backend().buffer().clone(); let mut lines: Vec = Vec::new(); for row in 0..TEST_HEIGHT { @@ -387,7 +395,9 @@ mod tests { let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); - terminal.draw(|f| draw(f, &app, TEST_NOW, &mut ts)).unwrap(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, true, &mut ts)) + .unwrap(); let buf = terminal.backend().buffer().clone(); let any_reversed = (0..TEST_HEIGHT).any(|row_y| { @@ -484,7 +494,9 @@ mod tests { let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); - terminal.draw(|f| draw(f, &app, TEST_NOW, &mut ts)).unwrap(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, true, &mut ts)) + .unwrap(); let buf = terminal.backend().buffer().clone(); let reversed_count = (0..TEST_WIDTH) @@ -541,7 +553,9 @@ mod tests { let backend = TestBackend::new(SMALL_WIDTH, SMALL_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); - terminal.draw(|f| draw(f, &app, TEST_NOW, &mut ts)).unwrap(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, true, &mut ts)) + .unwrap(); let buf = terminal.backend().buffer().clone(); let mut full_text = String::new(); @@ -682,7 +696,7 @@ mod tests { ) -> (String, ratatui::buffer::Buffer) { let backend = TestBackend::new(width, height); let mut terminal = Terminal::new(backend).unwrap(); - terminal.draw(|f| draw(f, app, TEST_NOW, ts)).unwrap(); + terminal.draw(|f| draw(f, app, TEST_NOW, true, ts)).unwrap(); let buf = terminal.backend().buffer().clone(); let mut lines: Vec = Vec::new(); for row in 0..height { @@ -707,11 +721,6 @@ mod tests { None } - #[test] - fn bottom_anchored_flag_is_true() { - const { assert!(BOTTOM_ANCHORED, "orientation must be bottom-anchored") }; - } - #[test] fn newest_command_renders_below_oldest() { let app = app_bottom_anchored(); @@ -726,6 +735,26 @@ mod tests { ); } + #[test] + fn top_orientation_renders_newest_above_oldest() { + let app = app_bottom_anchored(); + let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, false, &mut ts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + let newest_y = row_y_of("newest-cmd", &buf, TEST_WIDTH, TEST_HEIGHT) + .expect("newest-cmd must appear in buffer"); + let oldest_y = row_y_of("oldest-cmd", &buf, TEST_WIDTH, TEST_HEIGHT) + .expect("oldest-cmd must appear in buffer"); + assert!( + newest_y < oldest_y, + "with top orientation newest must be above oldest; newest_y={newest_y} oldest_y={oldest_y}" + ); + } + #[test] fn default_selection_is_newest_command() { let app = app_bottom_anchored(); From 2db0cf6224c6f0eb817eb618b97bbd3c528cd258 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 01:09:22 -0600 Subject: [PATCH 089/151] feat: add config path line to doctor output (#40) --- src/doctor.rs | 35 ++++++++++++++++++++++++++++++++--- src/tags.rs | 4 ++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/doctor.rs b/src/doctor.rs index 4bc6f30..6d900e4 100644 --- a/src/doctor.rs +++ b/src/doctor.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use crate::prompt::{prompt_snippet, PromptFramework}; #[derive(Debug, Clone, PartialEq)] @@ -25,6 +27,8 @@ pub struct DoctorInputs { pub tth_on_path: bool, pub framework: PromptFramework, pub framework_config_text: Option, + pub config_path: PathBuf, + pub config_present: bool, } pub struct DbInfo { @@ -93,6 +97,17 @@ pub fn run_doctor(inputs: &DoctorInputs) -> DoctorReport { check_prompt_visibility(&inputs.framework, inputs.framework_config_text.as_deref()); checks.push(prompt_check); + let status_str = if inputs.config_present { + "present" + } else { + "absent" + }; + checks.push(Check { + status: CheckStatus::Ok, + name: format!("config {} ({})", inputs.config_path.display(), status_str), + guidance: None, + }); + DoctorReport { checks } } @@ -173,6 +188,8 @@ mod tests { tth_on_path: tth, framework, framework_config_text: config.map(|s| s.to_string()), + config_path: std::path::PathBuf::from("/home/user/.config/thoth/config.toml"), + config_present: false, } } @@ -228,7 +245,11 @@ mod tests { let config = "[env_var.thoth_tags]\nvariable = \"TTH_PROMPT_TAGS\""; let inputs = make_inputs(true, true, true, PromptFramework::Starship, Some(config)); let report = run_doctor(&inputs); - let prompt_check = report.checks.last().unwrap(); + let prompt_check = report + .checks + .iter() + .find(|c| c.name.contains("prompt tags")) + .unwrap(); assert_eq!(prompt_check.status, CheckStatus::Ok); } @@ -237,7 +258,11 @@ mod tests { let config = "[character]\nsuccess_symbol = \"[>](bold green)\""; let inputs = make_inputs(true, true, true, PromptFramework::Starship, Some(config)); let report = run_doctor(&inputs); - let prompt_check = report.checks.last().unwrap(); + let prompt_check = report + .checks + .iter() + .find(|c| c.name.contains("prompt tags")) + .unwrap(); assert_eq!(prompt_check.status, CheckStatus::Warn); let guidance = prompt_check.guidance.as_deref().unwrap_or(""); assert!(guidance.contains("env_var.thoth_tags")); @@ -247,7 +272,11 @@ mod tests { fn prompt_warn_for_generic_is_advisory() { let inputs = make_inputs(true, true, true, PromptFramework::Generic, None); let report = run_doctor(&inputs); - let prompt_check = report.checks.last().unwrap(); + let prompt_check = report + .checks + .iter() + .find(|c| c.name.contains("prompt tags")) + .unwrap(); assert_eq!(prompt_check.status, CheckStatus::Warn); } diff --git a/src/tags.rs b/src/tags.rs index 0bff41e..070ef54 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -195,11 +195,11 @@ mod tests { }; let mut a1 = args_base.clone(); a1.timestamp = Some(1001); - crate::recorder::record_inner(&a1, &mut conn).unwrap(); + crate::recorder::record_inner(&a1, 30, &mut conn).unwrap(); let mut a2 = args_base.clone(); a2.timestamp = Some(1002); a2.tags = r#"["fix"]"#.into(); - crate::recorder::record_inner(&a2, &mut conn).unwrap(); + crate::recorder::record_inner(&a2, 30, &mut conn).unwrap(); let tags = list_db_tags(&conn).unwrap(); assert_eq!(tags[0], ("fix".to_string(), 2)); From ffb26cfd1127237cee5673e26dad29a2570e86d9 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 01:33:18 -0600 Subject: [PATCH 090/151] feat(config): add config subcommand group with get/set/print and default config on install (#42) --- Cargo.lock | 3 + Cargo.toml | 1 + src/cli.rs | 66 ++++++++- src/config.rs | 327 +++++++++++++++++++++++++++++++++++++++++--- tests/config_e2e.rs | 151 ++++++++++++++++++++ 5 files changed, 525 insertions(+), 23 deletions(-) create mode 100644 tests/config_e2e.rs diff --git a/Cargo.lock b/Cargo.lock index b33f24b..5b7c5b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -853,6 +853,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", + "serde_derive", ] [[package]] @@ -1042,10 +1043,12 @@ dependencies = [ "predicates", "ratatui", "rusqlite", + "serde", "serde_json", "tempfile", "thiserror", "toml", + "toml_edit", "uuid", ] diff --git a/Cargo.toml b/Cargo.toml index e1889a8..45076c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ comfy-table = "7" ratatui = "0.29" crossterm = "0.28" nucleo-matcher = "0.3" +toml_edit = "0.22" [dev-dependencies] tempfile = "3" diff --git a/src/cli.rs b/src/cli.rs index 8e03c11..834121e 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -57,8 +57,40 @@ pub enum Cmd { about = "Generate a new session ID (invoked by the shell hooks, not by hand)" )] NewSessionId, - #[command(about = "Show the resolved configuration path and effective values")] - Config, + #[command(about = "Show and manage the effective configuration")] + Config(ConfigArgs), +} + +#[derive(clap::Args, Debug, Clone)] +pub struct ConfigArgs { + #[command(subcommand)] + pub action: Option, +} + +#[derive(clap::Subcommand, Debug, Clone)] +pub enum ConfigAction { + #[command( + about = "Print the canonical TOML of the loaded config (machine-readable, no color)" + )] + Print, + #[command(about = "Print the value for a single dotted key (e.g. tui.orientation)")] + Get(ConfigGetArgs), + #[command(about = "Set a config key to a value, preserving comments in the file")] + Set(ConfigSetArgs), +} + +#[derive(clap::Args, Debug, Clone)] +pub struct ConfigGetArgs { + #[arg(help = "Dotted key to read (e.g. session.gap_minutes)")] + pub key: String, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct ConfigSetArgs { + #[arg(help = "Dotted key to set (e.g. tui.orientation)")] + pub key: String, + #[arg(help = "New value")] + pub value: String, } #[derive(clap::Args, Debug, Clone)] @@ -292,6 +324,10 @@ pub fn run() -> Result<(), crate::error::ThothError> { let framework = crate::prompt::detect_framework(&crate::prompt::probe_inputs()); let snippet = crate::prompt::prompt_snippet(&framework); println!("\nTo show active tags in your prompt:\n{snippet}"); + let config_path = crate::config::resolve_config_path(); + if crate::config::ensure_default_config(&config_path)? { + println!("Wrote default config to {}", config_path.display()); + } } Some(Cmd::Uninstall(args)) => { let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); @@ -528,11 +564,31 @@ pub fn run() -> Result<(), crate::error::ThothError> { Some(Cmd::NewSessionId) => { println!("{}", uuid::Uuid::new_v4()); } - Some(Cmd::Config) => { + Some(Cmd::Config(args)) => { let cfg = crate::config::load(); let path = crate::config::resolve_config_path(); - let exists = path.exists(); - print!("{}", crate::config::render_config(&cfg, &path, exists)); + match args.action { + None => { + let exists = path.exists(); + let color = crate::config::use_color(); + print!( + "{}", + crate::config::render_config(&cfg, &path, exists, color) + ); + } + Some(ConfigAction::Print) => { + let toml = crate::config::config_toml(&cfg)?; + print!("{}", toml); + } + Some(ConfigAction::Get(a)) => { + let val = crate::config::get_value(&cfg, &a.key)?; + println!("{}", val); + } + Some(ConfigAction::Set(a)) => { + crate::config::write_set(&a.key, &a.value)?; + println!("set {} = {}", a.key, a.value); + } + } } } Ok(()) diff --git a/src/config.rs b/src/config.rs index f1542b3..5d80a65 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,10 +1,31 @@ use std::path::{Path, PathBuf}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use crate::error::ThothError; -#[derive(Deserialize, Debug, Clone, PartialEq, Default)] +const VALID_KEYS: &[(&str, &str)] = &[ + ("session.gap_minutes", "positive integer"), + ("tui.orientation", r#""bottom" or "top""#), + ("search.default_limit", "positive integer"), +]; + +pub const DEFAULT_CONFIG_TOML: &str = r#"# Thoth configuration. All settings are optional; values shown are the defaults. + +[session] +# Minutes of inactivity that start a new work session. +gap_minutes = 30 + +[tui] +# Interactive search panel position: "bottom" or "top". +orientation = "bottom" + +[search] +# Default maximum number of results for `tth search`. +default_limit = 50 +"#; + +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)] #[serde(rename_all = "lowercase")] pub enum Orientation { #[default] @@ -18,7 +39,7 @@ impl Orientation { } } -#[derive(Deserialize, Debug, Clone)] +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] #[serde(default)] pub struct Session { pub gap_minutes: i64, @@ -30,7 +51,7 @@ impl Default for Session { } } -#[derive(Deserialize, Debug, Clone)] +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] #[serde(default)] pub struct Tui { pub orientation: Orientation, @@ -44,7 +65,7 @@ impl Default for Tui { } } -#[derive(Deserialize, Debug, Clone)] +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] #[serde(default)] pub struct Search { pub default_limit: usize, @@ -56,7 +77,7 @@ impl Default for Search { } } -#[derive(Deserialize, Debug, Clone, Default)] +#[derive(Deserialize, Serialize, Debug, Clone, Default, PartialEq)] #[serde(default)] pub struct Config { pub session: Session, @@ -117,27 +138,178 @@ pub fn load() -> Config { } } -pub fn render_config(cfg: &Config, path: &Path, exists: bool) -> String { - let exists_str = if exists { "true" } else { "false" }; +pub fn config_toml(cfg: &Config) -> Result { + toml::to_string(cfg).map_err(|e| ThothError::Config(e.to_string())) +} + +pub fn get_value(cfg: &Config, key: &str) -> Result { + match key { + "session.gap_minutes" => Ok(cfg.session.gap_minutes.to_string()), + "tui.orientation" => { + let v = if cfg.tui.orientation.is_bottom() { + "bottom" + } else { + "top" + }; + Ok(v.to_string()) + } + "search.default_limit" => Ok(cfg.search.default_limit.to_string()), + _ => Err(ThothError::Config(format!( + "unknown key '{}'; valid keys: {}", + key, + VALID_KEYS + .iter() + .map(|(k, _)| *k) + .collect::>() + .join(", ") + ))), + } +} + +pub fn apply_set(existing_toml: &str, key: &str, value: &str) -> Result { + let parts: Vec<&str> = key.splitn(2, '.').collect(); + if parts.len() != 2 { + return Err(ThothError::Config(format!( + "unknown key '{}'; valid keys: {}", + key, + VALID_KEYS + .iter() + .map(|(k, _)| *k) + .collect::>() + .join(", ") + ))); + } + let section = parts[0]; + let field = parts[1]; + + let typed_value: toml_edit::Value = match key { + "session.gap_minutes" | "search.default_limit" => { + let n: i64 = value + .parse() + .map_err(|_| ThothError::Config(format!("'{}' must be a positive integer", key)))?; + if n <= 0 { + return Err(ThothError::Config(format!( + "'{}' must be a positive integer (got {})", + key, n + ))); + } + toml_edit::value(n) + .into_value() + .map_err(|e| ThothError::Config(format!("toml_edit error: {}", e)))? + } + "tui.orientation" => { + if value != "bottom" && value != "top" { + return Err(ThothError::Config(format!( + "'tui.orientation' must be \"bottom\" or \"top\" (got '{}')", + value + ))); + } + toml_edit::value(value) + .into_value() + .map_err(|e| ThothError::Config(format!("toml_edit error: {}", e)))? + } + _ => { + return Err(ThothError::Config(format!( + "unknown key '{}'; valid keys: {}", + key, + VALID_KEYS + .iter() + .map(|(k, _)| *k) + .collect::>() + .join(", ") + ))); + } + }; + + let mut doc: toml_edit::DocumentMut = existing_toml + .parse() + .map_err(|e: toml_edit::TomlError| ThothError::Config(e.to_string()))?; + + if doc.get(section).is_none() { + doc[section] = toml_edit::table(); + } + doc[section][field] = toml_edit::Item::Value(typed_value); + + Ok(doc.to_string()) +} + +pub fn write_set(key: &str, value: &str) -> Result<(), ThothError> { + let path = resolve_config_path(); + let existing = if path.exists() { + std::fs::read_to_string(&path)? + } else { + DEFAULT_CONFIG_TOML.to_string() + }; + let new_toml = apply_set(&existing, key, value)?; + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent)?; + } + std::fs::write(&path, new_toml)?; + Ok(()) +} + +pub fn ensure_default_config(path: &Path) -> Result { + if path.exists() { + return Ok(false); + } + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent)?; + } + std::fs::write(path, DEFAULT_CONFIG_TOML)?; + Ok(true) +} + +pub fn use_color() -> bool { + if std::env::var_os("NO_COLOR").is_some() { + return false; + } + use std::io::IsTerminal; + std::io::stdout().is_terminal() +} + +pub fn render_config(cfg: &Config, path: &Path, exists: bool, color: bool) -> String { let orientation = if cfg.tui.orientation.is_bottom() { "bottom" } else { "top" }; - format!( - "Config path: {}\nExists: {}\n[session] gap_minutes = {}\n[tui] orientation = {}\n[search] default_limit = {}\n", - path.display(), - exists_str, - cfg.session.gap_minutes, - orientation, - cfg.search.default_limit, - ) + + if color { + use crossterm::style::Stylize; + let exists_str = if exists { + "true".green().to_string() + } else { + "false".red().to_string() + }; + format!( + "Config path: {}\nExists: {}\n{} gap_minutes = {}\n{} orientation = {}\n{} default_limit = {}\n", + path.display().to_string().yellow(), + exists_str, + "[session]".cyan(), + cfg.session.gap_minutes.to_string().green(), + "[tui]".cyan(), + orientation.green(), + "[search]".cyan(), + cfg.search.default_limit.to_string().green(), + ) + } else { + let exists_str = if exists { "true" } else { "false" }; + format!( + "Config path: {}\nExists: {}\n[session] gap_minutes = {}\n[tui] orientation = {}\n[search] default_limit = {}\n", + path.display(), + exists_str, + cfg.session.gap_minutes, + orientation, + cfg.search.default_limit, + ) + } } #[cfg(test)] mod tests { use super::*; use std::path::PathBuf; + use tempfile::TempDir; #[test] fn parse_empty_string_uses_defaults() { @@ -203,7 +375,7 @@ mod tests { fn render_config_defaults() { let cfg = Config::default(); let path = PathBuf::from("/home/user/.config/thoth/config.toml"); - let out = render_config(&cfg, &path, false); + let out = render_config(&cfg, &path, false, false); assert!(out.contains("gap_minutes = 30")); assert!(out.contains("orientation = bottom")); assert!(out.contains("default_limit = 50")); @@ -214,7 +386,7 @@ mod tests { fn render_config_custom() { let cfg = parse("[session]\ngap_minutes = 10\n[tui]\norientation = \"top\"\n[search]\ndefault_limit = 3").unwrap(); let path = PathBuf::from("/tmp/config.toml"); - let out = render_config(&cfg, &path, true); + let out = render_config(&cfg, &path, true, false); assert!(out.contains("gap_minutes = 10")); assert!(out.contains("orientation = top")); assert!(out.contains("default_limit = 3")); @@ -226,4 +398,123 @@ mod tests { assert!(Orientation::Bottom.is_bottom()); assert!(!Orientation::Top.is_bottom()); } + + #[test] + fn parse_default_config_toml_equals_default() { + let cfg = parse(DEFAULT_CONFIG_TOML).unwrap(); + assert_eq!(cfg, Config::default()); + } + + #[test] + fn config_toml_round_trips_to_default() { + let cfg = Config::default(); + let toml_str = config_toml(&cfg).unwrap(); + assert!(!toml_str.is_empty()); + let cfg2 = parse(&toml_str).unwrap(); + assert_eq!(cfg, cfg2); + } + + #[test] + fn get_value_gap_minutes() { + let cfg = Config::default(); + assert_eq!(get_value(&cfg, "session.gap_minutes").unwrap(), "30"); + } + + #[test] + fn get_value_orientation() { + let cfg = Config::default(); + assert_eq!(get_value(&cfg, "tui.orientation").unwrap(), "bottom"); + } + + #[test] + fn get_value_default_limit() { + let cfg = Config::default(); + assert_eq!(get_value(&cfg, "search.default_limit").unwrap(), "50"); + } + + #[test] + fn get_value_unknown_key_returns_err() { + let cfg = Config::default(); + assert!(get_value(&cfg, "foo.bar").is_err()); + } + + #[test] + fn apply_set_gap_minutes_creates_section() { + let result = apply_set("", "session.gap_minutes", "15").unwrap(); + assert!(result.contains("[session]")); + assert!(result.contains("gap_minutes = 15")); + } + + #[test] + fn apply_set_preserves_comment_and_sibling_key() { + let existing = "# my config\n[session]\ngap_minutes = 30\n# comment\n"; + let result = apply_set(existing, "session.gap_minutes", "60").unwrap(); + assert!(result.contains("# my config")); + assert!(result.contains("# comment")); + assert!(result.contains("gap_minutes = 60")); + } + + #[test] + fn apply_set_orientation_top() { + let result = apply_set("", "tui.orientation", "top").unwrap(); + assert!(result.contains("orientation = \"top\"")); + } + + #[test] + fn apply_set_invalid_gap_minutes_string_returns_err() { + assert!(apply_set("", "session.gap_minutes", "abc").is_err()); + } + + #[test] + fn apply_set_invalid_gap_minutes_zero_returns_err() { + assert!(apply_set("", "session.gap_minutes", "0").is_err()); + } + + #[test] + fn apply_set_invalid_orientation_returns_err() { + assert!(apply_set("", "tui.orientation", "sideways").is_err()); + } + + #[test] + fn apply_set_unknown_key_returns_err() { + assert!(apply_set("", "foo.bar", "baz").is_err()); + } + + #[test] + fn render_config_no_color_has_no_ansi() { + let cfg = Config::default(); + let path = PathBuf::from("/tmp/config.toml"); + let out = render_config(&cfg, &path, false, false); + assert!(!out.contains('\x1b')); + } + + #[test] + fn render_config_with_color_has_ansi() { + let cfg = Config::default(); + let path = PathBuf::from("/tmp/config.toml"); + let out = render_config(&cfg, &path, false, true); + assert!(out.contains('\x1b')); + } + + #[test] + fn ensure_default_config_writes_when_absent() { + let dir = TempDir::new().unwrap(); + let path = dir.path().join("thoth").join("config.toml"); + let wrote = ensure_default_config(&path).unwrap(); + assert!(wrote); + assert!(path.exists()); + let content = std::fs::read_to_string(&path).unwrap(); + assert_eq!(content, DEFAULT_CONFIG_TOML); + } + + #[test] + fn ensure_default_config_does_not_overwrite() { + let dir = TempDir::new().unwrap(); + let path = dir.path().join("config.toml"); + std::fs::write(&path, "custom content").unwrap(); + let wrote = ensure_default_config(&path).unwrap(); + assert!(!wrote); + let content = std::fs::read_to_string(&path).unwrap(); + assert_eq!(content, "custom content"); + } } diff --git a/tests/config_e2e.rs b/tests/config_e2e.rs new file mode 100644 index 0000000..fcda034 --- /dev/null +++ b/tests/config_e2e.rs @@ -0,0 +1,151 @@ +use assert_cmd::Command; +use predicates::prelude::*; +use tempfile::TempDir; + +fn tth_config_env(dir: &TempDir) -> (std::path::PathBuf, std::path::PathBuf) { + let db = dir.path().join("history.db"); + let cfg = dir.path().join("config.toml"); + (db, cfg) +} + +fn tth_with(db: &std::path::Path, cfg: &std::path::Path) -> Command { + let mut cmd = Command::cargo_bin("tth").unwrap(); + cmd.env("THOTH_DB", db.to_str().unwrap()) + .env("THOTH_CONFIG", cfg.to_str().unwrap()) + .env("THOTH_ERROR_LOG", "/dev/null") + .env("NO_COLOR", "1"); + cmd +} + +#[test] +fn config_set_then_get_orientation() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = tth_config_env(&dir); + + tth_with(&db, &cfg) + .args(["config", "set", "tui.orientation", "top"]) + .assert() + .code(0) + .stdout(predicate::str::contains("set tui.orientation = top")); + + tth_with(&db, &cfg) + .args(["config", "get", "tui.orientation"]) + .assert() + .code(0) + .stdout(predicate::str::is_match("^top\n?$").unwrap()); +} + +#[test] +fn config_print_shows_toml_after_set() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = tth_config_env(&dir); + + tth_with(&db, &cfg) + .args(["config", "set", "tui.orientation", "top"]) + .assert() + .code(0); + + tth_with(&db, &cfg) + .args(["config", "print"]) + .assert() + .code(0) + .stdout(predicate::str::contains("orientation")); +} + +#[test] +fn config_bare_prints_summary() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = tth_config_env(&dir); + + tth_with(&db, &cfg) + .args(["config"]) + .assert() + .code(0) + .stdout( + predicate::str::contains("gap_minutes") + .and(predicate::str::contains("orientation")) + .and(predicate::str::contains("default_limit")), + ); +} + +#[test] +fn config_set_invalid_gap_minutes_exits_nonzero_and_file_unchanged() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = tth_config_env(&dir); + + std::fs::write(&cfg, "# existing content\n").unwrap(); + let original = std::fs::read_to_string(&cfg).unwrap(); + + tth_with(&db, &cfg) + .args(["config", "set", "session.gap_minutes", "abc"]) + .assert() + .code(1); + + let after = std::fs::read_to_string(&cfg).unwrap(); + assert_eq!(original, after, "file must not change on error"); +} + +#[test] +fn config_get_unknown_key_exits_nonzero() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = tth_config_env(&dir); + + tth_with(&db, &cfg) + .args(["config", "get", "foo.bar"]) + .assert() + .code(1); +} + +#[test] +fn install_writes_default_config_when_absent() { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db"); + let cfg = dir.path().join("subdir").join("config.toml"); + let rc = dir.path().join(".zshrc"); + + Command::cargo_bin("tth") + .unwrap() + .env("THOTH_DB", db.to_str().unwrap()) + .env("THOTH_CONFIG", cfg.to_str().unwrap()) + .env("THOTH_ERROR_LOG", "/dev/null") + .env("NO_COLOR", "1") + .env("SHELL", "/bin/zsh") + .args(["install", "--rc-file", rc.to_str().unwrap()]) + .assert() + .code(0) + .stdout(predicate::str::contains("Wrote default config to")); + + assert!(cfg.exists(), "config file must have been written"); + let content = std::fs::read_to_string(&cfg).unwrap(); + assert!( + content.contains("gap_minutes"), + "default config must have gap_minutes" + ); +} + +#[test] +fn install_does_not_overwrite_existing_config() { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db"); + let cfg = dir.path().join("config.toml"); + let rc = dir.path().join(".zshrc"); + + std::fs::write(&cfg, "# my custom config\n").unwrap(); + + Command::cargo_bin("tth") + .unwrap() + .env("THOTH_DB", db.to_str().unwrap()) + .env("THOTH_CONFIG", cfg.to_str().unwrap()) + .env("THOTH_ERROR_LOG", "/dev/null") + .env("NO_COLOR", "1") + .env("SHELL", "/bin/zsh") + .args(["install", "--rc-file", rc.to_str().unwrap()]) + .assert() + .code(0); + + let content = std::fs::read_to_string(&cfg).unwrap(); + assert_eq!( + content, "# my custom config\n", + "existing config must not be overwritten" + ); +} From 3e85df34066ed2857f155deb52f4ff68584c18b8 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 02:11:44 -0600 Subject: [PATCH 091/151] feat(filters-columns): add configurable columns, search filter, history filter (#44) --- Cargo.lock | 1 + Cargo.toml | 1 + src/cli.rs | 32 ++++++- src/config.rs | 38 ++++++++- src/recorder.rs | 71 +++++++++++++++- src/search.rs | 222 ++++++++++++++++++++++++++++++++++++++++++------ 6 files changed, 333 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5b7c5b1..a7b7583 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1042,6 +1042,7 @@ dependencies = [ "nucleo-matcher", "predicates", "ratatui", + "regex", "rusqlite", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 45076c2..7237e73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ ratatui = "0.29" crossterm = "0.28" nucleo-matcher = "0.3" toml_edit = "0.22" +regex = "1" [dev-dependencies] tempfile = "3" diff --git a/src/cli.rs b/src/cli.rs index 834121e..57c788c 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -301,7 +301,12 @@ pub fn run() -> Result<(), crate::error::ThothError> { } let cfg = crate::config::load(); match crate::database::get_connection(None) { - Ok(mut conn) => crate::recorder::record(&args, cfg.session.gap_minutes, &mut conn), + Ok(mut conn) => crate::recorder::record( + &args, + cfg.session.gap_minutes, + &cfg.history.filter, + &mut conn, + ), Err(e) => crate::logging::log_error(&e.to_string()), } } @@ -374,10 +379,29 @@ pub fn run() -> Result<(), crate::error::ThothError> { Some(Cmd::Search(mut args)) => { let cfg = crate::config::load(); let resolved_limit = args.limit.unwrap_or(cfg.search.default_limit); - args.limit = Some(resolved_limit); + let columns = crate::search::resolve_columns(&cfg.search.columns)?; let conn = crate::database::get_connection(None)?; - let rows = crate::search::execute(&args, &conn, now)?; - print!("{}", crate::search::render(&rows, args.show_session)); + + let rows = if cfg.search.filter.is_empty() { + args.limit = Some(resolved_limit); + crate::search::execute(&args, &conn, now)? + } else { + let (regexes, invalid) = crate::search::compile_filters(&cfg.search.filter); + for pat in &invalid { + eprintln!("thoth: invalid search filter pattern (skipped): {}", pat); + } + args.limit = None; + let candidates = crate::search::execute(&args, &conn, now)?; + candidates + .into_iter() + .filter(|r| !crate::search::is_filtered(&r.command, ®exes)) + .take(resolved_limit) + .collect() + }; + print!( + "{}", + crate::search::render(&rows, &columns, args.show_session) + ); } Some(Cmd::Sessions(args)) => { let conn = crate::database::get_connection(None)?; diff --git a/src/config.rs b/src/config.rs index 5d80a65..c4a8771 100644 --- a/src/config.rs +++ b/src/config.rs @@ -23,6 +23,15 @@ orientation = "bottom" [search] # Default maximum number of results for `tth search`. default_limit = 50 +# Columns to show, in order. Available: timestamp, project, tags, exit, duration, directory, command +# columns = ["timestamp", "project", "tags", "exit", "duration", "directory", "command"] +# +# Regex patterns; commands matching any pattern are hidden from search results. +# filter = ["^ls$", "^cd "] + +[history] +# Regex patterns; matching commands are NEVER recorded (useful to avoid storing secrets). +# filter = ["--password", "export .*TOKEN", "AKIA[0-9A-Z]{16}"] "#; #[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)] @@ -65,24 +74,51 @@ impl Default for Tui { } } +pub fn default_search_columns() -> Vec { + vec![ + "timestamp".into(), + "project".into(), + "tags".into(), + "exit".into(), + "duration".into(), + "directory".into(), + "command".into(), + ] +} + #[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] #[serde(default)] pub struct Search { pub default_limit: usize, + #[serde(default = "default_search_columns")] + pub columns: Vec, + #[serde(default)] + pub filter: Vec, } impl Default for Search { fn default() -> Self { - Self { default_limit: 50 } + Self { + default_limit: 50, + columns: default_search_columns(), + filter: vec![], + } } } +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)] +#[serde(default)] +pub struct History { + pub filter: Vec, +} + #[derive(Deserialize, Serialize, Debug, Clone, Default, PartialEq)] #[serde(default)] pub struct Config { pub session: Session, pub tui: Tui, pub search: Search, + pub history: History, } fn config_path_from(thoth_config: Option<&str>, xdg_config: Option<&str>, home: &Path) -> PathBuf { diff --git a/src/recorder.rs b/src/recorder.rs index e6bfd77..82a3925 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -76,7 +76,22 @@ pub fn record_inner( Ok(()) } -pub fn record(args: &RecordArgs, gap_minutes: i64, conn: &mut Connection) { +pub fn record( + args: &RecordArgs, + gap_minutes: i64, + history_filters: &[String], + conn: &mut Connection, +) { + let (regexes, invalid) = crate::search::compile_filters(history_filters); + for pat in &invalid { + crate::logging::log_error(&format!( + "invalid history filter pattern (skipped): {}", + pat + )); + } + if crate::search::is_filtered(&args.cmd, ®exes) { + return; + } match record_inner(args, gap_minutes, conn) { Ok(()) => {} Err(ThothError::Sqlite(ref e)) @@ -290,7 +305,7 @@ mod tests { conn.execute_batch("DROP TABLE commands;").unwrap(); let args = base_args(); - record(&args, DEFAULT_GAP, &mut conn); + record(&args, DEFAULT_GAP, &[], &mut conn); let log = std::fs::read_to_string(&log_path).unwrap_or_default(); assert!(!log.is_empty(), "error was not logged"); @@ -307,7 +322,7 @@ mod tests { blocker.execute("BEGIN IMMEDIATE", []).unwrap(); let args = base_args(); - record(&args, DEFAULT_GAP, &mut conn); + record(&args, DEFAULT_GAP, &[], &mut conn); drop(blocker); @@ -319,4 +334,54 @@ mod tests { "no row should have been inserted on double failure" ); } + + #[test] + fn history_filter_matching_command_not_inserted() { + let mut conn = mem_conn(); + let args = RecordArgs { + cmd: String::from("mysql --password=secret"), + ..base_args() + }; + let filters = vec!["--password".to_string()]; + record(&args, DEFAULT_GAP, &filters, &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 0, "matching command should not be inserted"); + } + + #[test] + fn history_filter_non_matching_command_is_inserted() { + let mut conn = mem_conn(); + let filters = vec!["--password".to_string()]; + record(&base_args(), DEFAULT_GAP, &filters, &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 1, "non-matching command should be inserted"); + } + + #[test] + fn history_filter_invalid_pattern_does_not_break_recording() { + let mut conn = mem_conn(); + let filters = vec!["[invalid".to_string()]; + record(&base_args(), DEFAULT_GAP, &filters, &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!( + count, 1, + "invalid pattern should be skipped; command should still be recorded" + ); + } + + #[test] + fn history_filter_empty_filter_records_all() { + let mut conn = mem_conn(); + record(&base_args(), DEFAULT_GAP, &[], &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 1); + } } diff --git a/src/search.rs b/src/search.rs index 0b82630..fbcb77c 100644 --- a/src/search.rs +++ b/src/search.rs @@ -1,10 +1,104 @@ use std::cmp::Ordering; use comfy_table::{presets::UTF8_BORDERS_ONLY, Cell, Color, ContentArrangement, Table}; +use regex::Regex; use rusqlite::{Connection, ToSql}; use crate::error::ThothError; +#[derive(Debug)] +pub enum Column { + Timestamp, + Project, + Tags, + Exit, + Duration, + Directory, + Command, +} + +const ALL_COLUMN_NAMES: &[&str] = &[ + "timestamp", + "project", + "tags", + "exit", + "duration", + "directory", + "command", +]; + +impl Column { + pub fn from_name(s: &str) -> Option { + match s { + "timestamp" => Some(Column::Timestamp), + "project" => Some(Column::Project), + "tags" => Some(Column::Tags), + "exit" => Some(Column::Exit), + "duration" => Some(Column::Duration), + "directory" => Some(Column::Directory), + "command" => Some(Column::Command), + _ => None, + } + } + + pub fn header(&self) -> &'static str { + match self { + Column::Timestamp => "timestamp", + Column::Project => "project", + Column::Tags => "tags", + Column::Exit => "exit", + Column::Duration => "duration", + Column::Directory => "directory", + Column::Command => "command", + } + } + + pub fn cell(&self, row: &CommandRow) -> Cell { + match self { + Column::Timestamp => Cell::new(fmt_timestamp(row.timestamp)), + Column::Project => Cell::new(&row.project), + Column::Tags => Cell::new(&row.tags), + Column::Exit => exit_cell(row.exit_code), + Column::Duration => Cell::new(fmt_duration(row.duration_ms)), + Column::Directory => Cell::new(&row.directory), + Column::Command => Cell::new(&row.command), + } + } +} + +pub fn resolve_columns(names: &[String]) -> Result, ThothError> { + let mut cols = Vec::with_capacity(names.len()); + for name in names { + match Column::from_name(name.as_str()) { + Some(c) => cols.push(c), + None => { + return Err(ThothError::Search(format!( + "unknown column '{}'; valid columns: {}", + name, + ALL_COLUMN_NAMES.join(", ") + ))) + } + } + } + Ok(cols) +} + +pub fn compile_filters(patterns: &[String]) -> (Vec, Vec) { + let mut regexes = Vec::new(); + let mut invalid = Vec::new(); + for p in patterns { + match Regex::new(p) { + Ok(r) => regexes.push(r), + Err(_) => invalid.push(p.clone()), + } + } + (regexes, invalid) +} + +pub fn is_filtered(command: &str, regexes: &[Regex]) -> bool { + regexes.iter().any(|r| r.is_match(command)) +} + pub use crate::cli::SearchArgs; const SECS_PER_DAY: i64 = 86_400; @@ -243,7 +337,7 @@ pub fn execute( Ok(result) } -pub fn render(rows: &[CommandRow], show_session: bool) -> String { +pub fn render(rows: &[CommandRow], columns: &[Column], show_session: bool) -> String { if rows.is_empty() { return String::from("0 result(s)\n"); } @@ -251,33 +345,17 @@ pub fn render(rows: &[CommandRow], show_session: bool) -> String { if show_session { render_by_session(rows) } else { - render_table(rows) + render_table(rows, columns) } } -fn render_table(rows: &[CommandRow]) -> String { +fn render_table(rows: &[CommandRow], columns: &[Column]) -> String { let mut table = Table::new(); table.load_preset(UTF8_BORDERS_ONLY); table.set_content_arrangement(ContentArrangement::Dynamic); - table.set_header(vec![ - "timestamp", - "project", - "tags", - "exit", - "duration", - "directory", - "command", - ]); + table.set_header(columns.iter().map(|c| c.header()).collect::>()); for row in rows { - table.add_row(vec![ - Cell::new(fmt_timestamp(row.timestamp)), - Cell::new(&row.project), - Cell::new(&row.tags), - exit_cell(row.exit_code), - Cell::new(fmt_duration(row.duration_ms)), - Cell::new(&row.directory), - Cell::new(&row.command), - ]); + table.add_row(columns.iter().map(|c| c.cell(row)).collect::>()); } format!("{table}\n{} result(s)\n", rows.len()) } @@ -845,10 +923,15 @@ mod tests { ] } + fn default_columns() -> Vec { + resolve_columns(&crate::config::default_search_columns()).unwrap() + } + #[test] fn render_normal_contains_headers_and_commands() { let rows = fixture_rows(); - let out = render(&rows, false); + let cols = default_columns(); + let out = render(&rows, &cols, false); assert!(out.contains("timestamp")); assert!(out.contains("command")); assert!(out.contains("project")); @@ -891,7 +974,7 @@ mod tests { session_id: "session-bbb".into(), }, ]; - let out = render(&rows, true); + let out = render(&rows, &default_columns(), true); let headers_count = out.matches("---").count(); assert!(headers_count >= 2, "expected two session header lines"); let header_lines: Vec<&str> = out.lines().filter(|l| l.starts_with("---")).collect(); @@ -930,10 +1013,101 @@ mod tests { #[test] fn render_empty_rows_does_not_panic() { - let out = render(&[], false); + let cols = default_columns(); + let out = render(&[], &cols, false); assert!( out.contains("0 result(s)"), "empty render must show '0 result(s)'; got: {out}" ); } + + #[test] + fn compile_filters_valid_patterns_compile() { + let patterns = vec!["^secret".to_string(), "foo.*bar".to_string()]; + let (regexes, invalid) = compile_filters(&patterns); + assert_eq!(regexes.len(), 2); + assert!(invalid.is_empty()); + } + + #[test] + fn compile_filters_invalid_pattern_returned_in_invalid_list() { + let patterns = vec!["^secret".to_string(), "[invalid".to_string()]; + let (regexes, invalid) = compile_filters(&patterns); + assert_eq!(regexes.len(), 1); + assert_eq!(invalid.len(), 1); + assert_eq!(invalid[0], "[invalid"); + } + + #[test] + fn is_filtered_matches_when_pattern_matches() { + let (regexes, _) = compile_filters(&["^secret".to_string()]); + assert!(is_filtered("secret command", ®exes)); + } + + #[test] + fn is_filtered_does_not_match_when_no_pattern_matches() { + let (regexes, _) = compile_filters(&["^secret".to_string()]); + assert!(!is_filtered("ls -la", ®exes)); + } + + #[test] + fn is_filtered_empty_regexes_never_matches() { + assert!(!is_filtered("anything", &[])); + } + + #[test] + fn resolve_columns_subset_returns_those_columns() { + let names = vec!["command".to_string(), "exit".to_string()]; + let cols = resolve_columns(&names).unwrap(); + assert_eq!(cols.len(), 2); + assert_eq!(cols[0].header(), "command"); + assert_eq!(cols[1].header(), "exit"); + } + + #[test] + fn resolve_columns_unknown_name_returns_err_listing_valid_names() { + let names = vec!["typo".to_string()]; + let err = resolve_columns(&names).unwrap_err(); + let msg = err.to_string(); + assert!(msg.contains("typo")); + assert!(msg.contains("timestamp")); + assert!(msg.contains("command")); + } + + #[test] + fn resolve_columns_default_returns_all_seven() { + let cols = default_columns(); + assert_eq!(cols.len(), 7); + } + + #[test] + fn render_with_subset_columns_shows_only_those_headers() { + let rows = fixture_rows(); + let names = vec!["command".to_string(), "exit".to_string()]; + let cols = resolve_columns(&names).unwrap(); + let out = render(&rows, &cols, false); + assert!(out.contains("command")); + assert!(out.contains("exit")); + assert!(!out.contains("timestamp")); + assert!(!out.contains("project")); + assert!(!out.contains("tags")); + assert!(!out.contains("duration")); + assert!(!out.contains("directory")); + } + + #[test] + fn is_filtered_integration_with_search_results() { + let conn = mem_conn(); + seed(&conn, s("secret password", "p", 1_000, 0, 100, "[]", "s1")); + seed(&conn, s("ls -la", "p", 2_000, 0, 100, "[]", "s1")); + let args = default_args(); + let rows = execute(&args, &conn, FIXED_NOW).unwrap(); + let (regexes, _) = compile_filters(&["^secret".to_string()]); + let visible: Vec<_> = rows + .iter() + .filter(|r| !is_filtered(&r.command, ®exes)) + .collect(); + assert_eq!(visible.len(), 1); + assert_eq!(visible[0].command, "ls -la"); + } } From d87477f741bfe746816095b157cd321f549c4d36 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 02:39:28 -0600 Subject: [PATCH 092/151] feat(tui): add configurable columns and header row (#46) --- src/cli.rs | 3 +- src/config.rs | 30 ++++ src/tui/mod.rs | 10 +- src/tui/render.rs | 362 ++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 357 insertions(+), 48 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 57c788c..968e521 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -282,7 +282,8 @@ pub fn run() -> Result<(), crate::error::ThothError> { None => { let cfg = crate::config::load(); let conn = crate::database::get_connection(None)?; - crate::tui::run(&conn, now, cfg.tui.orientation.is_bottom())?; + let columns = crate::tui::render::resolve_tui_columns(&cfg.tui.columns); + crate::tui::run(&conn, now, cfg.tui.orientation.is_bottom(), columns)?; } Some(Cmd::Record(mut args)) => { crate::logging::setup(crate::paths::resolve_error_log()); diff --git a/src/config.rs b/src/config.rs index c4a8771..30943ac 100644 --- a/src/config.rs +++ b/src/config.rs @@ -19,6 +19,8 @@ gap_minutes = 30 [tui] # Interactive search panel position: "bottom" or "top". orientation = "bottom" +# Columns to show in the interactive panel, in order. Available: timestamp, project, tags, exit, duration, directory, command +# columns = ["timestamp", "duration", "exit", "project", "command"] [search] # Default maximum number of results for `tth search`. @@ -64,16 +66,29 @@ impl Default for Session { #[serde(default)] pub struct Tui { pub orientation: Orientation, + #[serde(default = "default_tui_columns")] + pub columns: Vec, } impl Default for Tui { fn default() -> Self { Self { orientation: Orientation::Bottom, + columns: default_tui_columns(), } } } +pub fn default_tui_columns() -> Vec { + vec![ + "timestamp".into(), + "duration".into(), + "exit".into(), + "project".into(), + "command".into(), + ] +} + pub fn default_search_columns() -> Vec { vec![ "timestamp".into(), @@ -435,6 +450,21 @@ mod tests { assert!(!Orientation::Top.is_bottom()); } + #[test] + fn tui_default_columns_are_five() { + let tui = Tui::default(); + assert_eq!( + tui.columns, + vec!["timestamp", "duration", "exit", "project", "command"] + ); + } + + #[test] + fn parse_tui_columns_custom() { + let cfg = parse("[tui]\ncolumns = [\"exit\", \"command\"]").unwrap(); + assert_eq!(cfg.tui.columns, vec!["exit", "command"]); + } + #[test] fn parse_default_config_toml_equals_default() { let cfg = parse(DEFAULT_CONFIG_TOML).unwrap(); diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 144d166..2a036a0 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -16,6 +16,7 @@ use ratatui::{backend::CrosstermBackend, widgets::TableState, Terminal}; use rusqlite::Connection; use crate::error::ThothError; +use crate::search::Column; use crate::tui::app::App; use crate::tui::event::{handle_key, Outcome}; use crate::tui::render::format_action_line; @@ -44,7 +45,12 @@ impl Drop for TerminalGuard { } } -pub fn run(conn: &Connection, now: i64, is_bottom: bool) -> Result<(), ThothError> { +pub fn run( + conn: &Connection, + now: i64, + is_bottom: bool, + columns: Vec, +) -> Result<(), ThothError> { let tty = OpenOptions::new() .read(true) .write(true) @@ -72,7 +78,7 @@ pub fn run(conn: &Connection, now: i64, is_bottom: bool) -> Result<(), ThothErro loop { terminal - .draw(|f| render::draw(f, &app, now, is_bottom, &mut table_state)) + .draw(|f| render::draw(f, &app, now, is_bottom, &columns, &mut table_state)) .map_err(|e| ThothError::Tui(format!("draw failed: {e}")))?; if ct_event::poll(std::time::Duration::from_millis(200)) diff --git a/src/tui/render.rs b/src/tui/render.rs index 17468ca..8d53791 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -6,6 +6,7 @@ use ratatui::{ Frame, }; +use crate::search::{Column, CommandRow}; use crate::tui::app::App; use crate::tui::time::format_relative; @@ -85,11 +86,96 @@ fn filter_chips(app: &App) -> String { parts.join(" ") } +pub fn tui_header(col: &Column) -> &'static str { + match col { + Column::Timestamp => "time", + Column::Duration => "dur", + Column::Exit => "exit", + Column::Project => "project", + Column::Command => "command", + Column::Tags => "tags", + Column::Directory => "dir", + } +} + +fn col_fixed_width(col: &Column) -> Option { + match col { + Column::Timestamp => Some(9), + Column::Duration => Some(7), + Column::Exit => Some(4), + Column::Project => Some(14), + Column::Tags => Some(12), + Column::Directory => Some(20), + Column::Command => None, + } +} + +fn tui_cell(col: &Column, row: &CommandRow, now: i64, flex_w: u16) -> Cell<'static> { + let dim = Style::default().fg(DIM_COLOR); + let cyan = Style::default().fg(ACCENT); + let blue = Style::default().fg(Color::Blue); + + match col { + Column::Timestamp => { + let rel = format_relative(row.timestamp, now); + Cell::from(Line::from(vec![Span::styled(rel, dim)])) + } + Column::Duration => { + let dur = format_duration(row.duration_ms); + Cell::from(Line::from(vec![Span::styled(dur, cyan)])) + } + Column::Exit => { + let (label, color) = exit_text(row.exit_code); + Cell::from(Line::from(vec![Span::styled( + label, + Style::default().fg(color), + )])) + } + Column::Project => { + let proj = truncate(&row.project, 14); + Cell::from(Line::from(vec![Span::styled(proj, blue)])) + } + Column::Command => { + let cmd = display_command(&row.command); + let cmd = truncate(&cmd, flex_w as usize); + Cell::from(Line::from(vec![Span::raw(cmd)])) + } + Column::Tags => Cell::from(Line::from(vec![Span::raw(row.tags.clone())])), + Column::Directory => { + let dir = truncate(&row.directory, 20); + Cell::from(Line::from(vec![Span::styled(dir, dim)])) + } + } +} + +pub fn resolve_tui_columns(names: &[String]) -> Vec { + use crate::config::default_tui_columns; + + if names.is_empty() { + eprintln!("thoth: unknown TUI column(s) in config, using defaults"); + return resolve_tui_columns(&default_tui_columns()); + } + + let resolved: Vec> = names.iter().map(|n| Column::from_name(n)).collect(); + if resolved.iter().any(|c| c.is_none()) { + eprintln!("thoth: unknown TUI column(s) in config, using defaults"); + return resolve_tui_columns(&default_tui_columns()); + } + resolved.into_iter().flatten().collect() +} + const ACCENT: Color = Color::Cyan; const DIM_COLOR: Color = Color::DarkGray; const BORDER_COLOR: Color = Color::DarkGray; -pub fn draw(frame: &mut Frame, app: &App, now: i64, is_bottom: bool, table_state: &mut TableState) { +pub fn draw( + frame: &mut Frame, + app: &App, + now: i64, + is_bottom: bool, + columns: &[Column], + table_state: &mut TableState, +) { let area = frame.area(); let chunks = Layout::vertical([ @@ -164,17 +250,24 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64, is_bottom: bool, table_state let inner_list_area = list_block.inner(list_area); frame.render_widget(list_block, list_area); - let time_w: u16 = 9; - let dur_w: u16 = 7; - let exit_w: u16 = 4; - let proj_w: u16 = 14; - let gaps: u16 = 4; - let fixed: u16 = time_w + dur_w + exit_w + proj_w + gaps; - let cmd_w: u16 = inner_list_area.width.saturating_sub(fixed); + let has_command_col = columns.iter().any(|c| matches!(c, Column::Command)); + let n_cols = columns.len(); + let gaps: u16 = n_cols.saturating_sub(1) as u16; + let fixed_total: u16 = columns.iter().filter_map(col_fixed_width).sum::(); + let flex_w: u16 = inner_list_area.width.saturating_sub(fixed_total + gaps); - let dim = Style::default().fg(DIM_COLOR); - let cyan = Style::default().fg(ACCENT); - let blue = Style::default().fg(Color::Blue); + let widths: Vec = columns + .iter() + .enumerate() + .map(|(i, col)| { + let is_flex = col_fixed_width(col).is_none() || (!has_command_col && i == n_cols - 1); + if is_flex { + Constraint::Min(1) + } else { + Constraint::Length(col_fixed_width(col).unwrap_or(0)) + } + }) + .collect(); let ordered: Vec = if is_bottom { app.filtered.iter().rev().copied().collect() @@ -186,39 +279,30 @@ pub fn draw(frame: &mut Frame, app: &App, now: i64, is_bottom: bool, table_state .iter() .map(|&fi| { let row = &app.all_rows[fi]; - let rel = format_relative(row.timestamp, now); - let dur = format_duration(row.duration_ms); - let (exit_label, exit_color) = exit_text(row.exit_code); - let proj = truncate(&row.project, proj_w as usize); - let cmd = display_command(&row.command); - let cmd = truncate(&cmd, cmd_w as usize); - - let time_cell = Cell::from(Line::from(vec![Span::styled(rel, dim)])); - let dur_cell = Cell::from(Line::from(vec![Span::styled(dur, cyan)])); - let exit_cell = Cell::from(Line::from(vec![Span::styled( - exit_label, - Style::default().fg(exit_color), - )])); - let proj_cell = Cell::from(Line::from(vec![Span::styled(proj, blue)])); - let cmd_cell = Cell::from(Line::from(vec![Span::raw(cmd)])); - - Row::new([time_cell, dur_cell, exit_cell, proj_cell, cmd_cell]) + let cells: Vec = columns + .iter() + .map(|col| tui_cell(col, row, now, flex_w)) + .collect(); + Row::new(cells) }) .collect(); - let widths = [ - Constraint::Length(time_w), - Constraint::Length(dur_w), - Constraint::Length(exit_w), - Constraint::Length(proj_w), - Constraint::Min(1), - ]; + let table_header_style = Style::default() + .fg(DIM_COLOR) + .add_modifier(Modifier::DIM) + .add_modifier(Modifier::BOLD); + let header_cells: Vec = columns + .iter() + .map(|col| Cell::from(tui_header(col)).style(table_header_style)) + .collect(); + let table_header = Row::new(header_cells); let highlight_style = Style::default() .add_modifier(Modifier::REVERSED) .add_modifier(Modifier::BOLD); let table = Table::new(rows, widths) + .header(table_header) .block(Block::default()) .row_highlight_style(highlight_style); @@ -261,7 +345,7 @@ pub fn format_action_line(action: Option<&crate::tui::app::Action>) -> Option Vec { + resolve_tui_columns(&default_tui_columns()) + } + fn render_app(app: &App) -> String { let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); + let cols = default_cols(); terminal - .draw(|f| draw(f, app, TEST_NOW, true, &mut ts)) + .draw(|f| draw(f, app, TEST_NOW, true, &cols, &mut ts)) .unwrap(); let buf = terminal.backend().buffer().clone(); let mut lines: Vec = Vec::new(); @@ -395,8 +484,9 @@ mod tests { let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); + let cols = default_cols(); terminal - .draw(|f| draw(f, &app, TEST_NOW, true, &mut ts)) + .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) .unwrap(); let buf = terminal.backend().buffer().clone(); @@ -494,8 +584,9 @@ mod tests { let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); + let cols = default_cols(); terminal - .draw(|f| draw(f, &app, TEST_NOW, true, &mut ts)) + .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) .unwrap(); let buf = terminal.backend().buffer().clone(); @@ -553,8 +644,9 @@ mod tests { let backend = TestBackend::new(SMALL_WIDTH, SMALL_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); + let cols = default_cols(); terminal - .draw(|f| draw(f, &app, TEST_NOW, true, &mut ts)) + .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) .unwrap(); let buf = terminal.backend().buffer().clone(); @@ -694,9 +786,12 @@ mod tests { height: u16, ts: &mut TableState, ) -> (String, ratatui::buffer::Buffer) { + let cols = default_cols(); let backend = TestBackend::new(width, height); let mut terminal = Terminal::new(backend).unwrap(); - terminal.draw(|f| draw(f, app, TEST_NOW, true, ts)).unwrap(); + terminal + .draw(|f| draw(f, app, TEST_NOW, true, &cols, ts)) + .unwrap(); let buf = terminal.backend().buffer().clone(); let mut lines: Vec = Vec::new(); for row in 0..height { @@ -738,11 +833,12 @@ mod tests { #[test] fn top_orientation_renders_newest_above_oldest() { let app = app_bottom_anchored(); + let cols = default_cols(); let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); let mut terminal = Terminal::new(backend).unwrap(); let mut ts = TableState::default(); terminal - .draw(|f| draw(f, &app, TEST_NOW, false, &mut ts)) + .draw(|f| draw(f, &app, TEST_NOW, false, &cols, &mut ts)) .unwrap(); let buf = terminal.backend().buffer().clone(); let newest_y = row_y_of("newest-cmd", &buf, TEST_WIDTH, TEST_HEIGHT) @@ -909,7 +1005,7 @@ mod tests { use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; const W: u16 = 80; - const H: u16 = 9; + const H: u16 = 12; let mut app = App::new(); app.all_rows = (0..12) @@ -996,7 +1092,7 @@ mod tests { use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; const W: u16 = 80; - const H: u16 = 9; + const H: u16 = 12; let mut app = App::new(); app.all_rows = (0..12) @@ -1066,7 +1162,7 @@ mod tests { use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; const W: u16 = 80; - const H: u16 = 9; + const H: u16 = 12; let mut app = App::new(); app.all_rows = (0..12) @@ -1104,4 +1200,180 @@ mod tests { "selected row must be highlighted and visible after scrolling" ); } + + #[test] + fn table_header_shows_default_column_labels() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + text.contains("time"), + "table header must contain label 'time'; got:\n{text}" + ); + assert!( + text.contains("dur"), + "table header must contain label 'dur'; got:\n{text}" + ); + assert!( + text.contains("exit"), + "table header must contain label 'exit'; got:\n{text}" + ); + assert!( + text.contains("project"), + "table header must contain label 'project'; got:\n{text}" + ); + assert!( + text.contains("command"), + "table header must contain label 'command'; got:\n{text}" + ); + } + + #[test] + fn table_header_not_reversed() { + let app = app_with_rows(); + let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + let cols = default_cols(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + + let header_row_y = 2u16; + let reversed_count = (0..TEST_WIDTH) + .filter(|&x| { + buf[(x, header_row_y)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }) + .count(); + assert_eq!( + reversed_count, 0, + "table header row must have zero REVERSED cells; found {reversed_count}" + ); + } + + #[test] + fn reduced_columns_only_show_selected_headers() { + let mut app = App::new(); + app.all_rows = vec![make_row("my-cmd", TEST_NOW - 10, 1, "proj")]; + app.recompute(); + + let cols = resolve_tui_columns(&["exit".to_string(), "command".to_string()]); + let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..TEST_HEIGHT { + let mut line = String::new(); + for col in 0..TEST_WIDTH { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line.trim_end().to_string()); + } + let text = lines.join("\n"); + + assert!( + text.contains("exit"), + "reduced cols must show 'exit' header; got:\n{text}" + ); + assert!( + text.contains("command"), + "reduced cols must show 'command' header; got:\n{text}" + ); + assert!( + !text.contains("time"), + "reduced cols must NOT show 'time' header; got:\n{text}" + ); + assert!( + !text.contains("dur"), + "reduced cols must NOT show 'dur' header; got:\n{text}" + ); + assert!( + text.contains("my-cmd"), + "command cell must render; got:\n{text}" + ); + } + + #[test] + fn resolve_tui_columns_all_valid_returns_them() { + let cols = resolve_tui_columns(&["exit".to_string(), "command".to_string()]); + assert_eq!(cols.len(), 2); + assert!(matches!(cols[0], Column::Exit)); + assert!(matches!(cols[1], Column::Command)); + } + + #[test] + fn resolve_tui_columns_unknown_name_returns_defaults() { + let cols = resolve_tui_columns(&["exit".to_string(), "bogus".to_string()]); + let defaults = resolve_tui_columns(&default_tui_columns()); + assert_eq!(cols.len(), defaults.len()); + } + + #[test] + fn resolve_tui_columns_empty_returns_defaults() { + let cols = resolve_tui_columns(&[]); + let defaults = resolve_tui_columns(&default_tui_columns()); + assert_eq!(cols.len(), defaults.len()); + } + + #[test] + fn dump_reduced_columns_buffer() { + let mut app = App::new(); + app.all_rows = vec![ + make_row("git status", TEST_NOW - 10, 0, "proj"), + make_row("cargo build", TEST_NOW - 60, 1, "proj"), + make_row("docker run nginx", TEST_NOW - 300, 0, "proj"), + ]; + app.recompute(); + + let cols_default = default_cols(); + let backend = TestBackend::new(80, 10); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, true, &cols_default, &mut ts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..10u16 { + let mut line = String::new(); + for col in 0..80u16 { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line.trim_end().to_string()); + } + println!("=== DEFAULT COLUMNS (80x10) ==="); + println!("{}", lines.join("\n")); + + let cols_reduced = resolve_tui_columns(&["exit".to_string(), "command".to_string()]); + let backend2 = TestBackend::new(80, 10); + let mut terminal2 = Terminal::new(backend2).unwrap(); + let mut ts2 = TableState::default(); + terminal2 + .draw(|f| draw(f, &app, TEST_NOW, true, &cols_reduced, &mut ts2)) + .unwrap(); + let buf2 = terminal2.backend().buffer().clone(); + let mut lines2: Vec = Vec::new(); + for row in 0..10u16 { + let mut line = String::new(); + for col in 0..80u16 { + line.push(buf2[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines2.push(line.trim_end().to_string()); + } + println!("\n=== REDUCED COLUMNS [exit, command] (80x10) ==="); + println!("{}", lines2.join("\n")); + + assert!(lines.iter().any(|l| l.contains("time"))); + assert!(lines2 + .iter() + .any(|l| l.contains("exit") && l.contains("command"))); + assert!(lines2.iter().all(|l| !l.contains("time"))); + } } From 128752ab04da3465366425f595159f5785832b05 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 02:51:18 -0600 Subject: [PATCH 093/151] feat(tui): content-aware column widths so command gets the freed space --- src/tui/render.rs | 131 +++++++++++++++++++++++++++------------------- 1 file changed, 76 insertions(+), 55 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index 8d53791..a4ec155 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -98,56 +98,43 @@ pub fn tui_header(col: &Column) -> &'static str { } } -fn col_fixed_width(col: &Column) -> Option { +fn col_cap(col: &Column) -> u16 { match col { - Column::Timestamp => Some(9), - Column::Duration => Some(7), - Column::Exit => Some(4), - Column::Project => Some(14), - Column::Tags => Some(12), - Column::Directory => Some(20), - Column::Command => None, + Column::Timestamp => 9, + Column::Duration => 7, + Column::Exit => 4, + Column::Project => 20, + Column::Tags => 16, + Column::Directory => 30, + Column::Command => u16::MAX, } } -fn tui_cell(col: &Column, row: &CommandRow, now: i64, flex_w: u16) -> Cell<'static> { - let dim = Style::default().fg(DIM_COLOR); - let cyan = Style::default().fg(ACCENT); - let blue = Style::default().fg(Color::Blue); - +fn col_text(col: &Column, row: &CommandRow, now: i64) -> String { match col { - Column::Timestamp => { - let rel = format_relative(row.timestamp, now); - Cell::from(Line::from(vec![Span::styled(rel, dim)])) - } - Column::Duration => { - let dur = format_duration(row.duration_ms); - Cell::from(Line::from(vec![Span::styled(dur, cyan)])) - } - Column::Exit => { - let (label, color) = exit_text(row.exit_code); - Cell::from(Line::from(vec![Span::styled( - label, - Style::default().fg(color), - )])) - } - Column::Project => { - let proj = truncate(&row.project, 14); - Cell::from(Line::from(vec![Span::styled(proj, blue)])) - } - Column::Command => { - let cmd = display_command(&row.command); - let cmd = truncate(&cmd, flex_w as usize); - Cell::from(Line::from(vec![Span::raw(cmd)])) - } - Column::Tags => Cell::from(Line::from(vec![Span::raw(row.tags.clone())])), - Column::Directory => { - let dir = truncate(&row.directory, 20); - Cell::from(Line::from(vec![Span::styled(dir, dim)])) - } + Column::Timestamp => format_relative(row.timestamp, now), + Column::Duration => format_duration(row.duration_ms), + Column::Exit => exit_text(row.exit_code).0.to_string(), + Column::Project => row.project.clone(), + Column::Command => display_command(&row.command), + Column::Tags => row.tags.clone(), + Column::Directory => row.directory.clone(), } } +fn tui_cell(col: &Column, row: &CommandRow, now: i64, width: u16) -> Cell<'static> { + let text = truncate(&col_text(col, row, now), width as usize); + let style = match col { + Column::Timestamp => Style::default().fg(DIM_COLOR), + Column::Duration => Style::default().fg(ACCENT), + Column::Exit => Style::default().fg(exit_text(row.exit_code).1), + Column::Project => Style::default().fg(Color::Blue), + Column::Directory => Style::default().fg(DIM_COLOR), + Column::Command | Column::Tags => Style::default(), + }; + Cell::from(Line::from(vec![Span::styled(text, style)])) +} + pub fn resolve_tui_columns(names: &[String]) -> Vec { use crate::config::default_tui_columns; @@ -253,35 +240,69 @@ pub fn draw( let has_command_col = columns.iter().any(|c| matches!(c, Column::Command)); let n_cols = columns.len(); let gaps: u16 = n_cols.saturating_sub(1) as u16; - let fixed_total: u16 = columns.iter().filter_map(col_fixed_width).sum::(); - let flex_w: u16 = inner_list_area.width.saturating_sub(fixed_total + gaps); - let widths: Vec = columns + let ordered: Vec = if is_bottom { + app.filtered.iter().rev().copied().collect() + } else { + app.filtered.to_vec() + }; + + let flex_idx: Option = if has_command_col { + columns.iter().position(|c| matches!(c, Column::Command)) + } else { + n_cols.checked_sub(1) + }; + + let content_w: Vec = columns .iter() .enumerate() .map(|(i, col)| { - let is_flex = col_fixed_width(col).is_none() || (!has_command_col && i == n_cols - 1); - if is_flex { + if Some(i) == flex_idx { + return 0; + } + let header_len = tui_header(col).chars().count() as u16; + let max_content = ordered + .iter() + .map(|&fi| col_text(col, &app.all_rows[fi], now).chars().count() as u16) + .max() + .unwrap_or(0); + header_len.max(max_content).min(col_cap(col)) + }) + .collect(); + + let fixed_total: u16 = content_w.iter().sum(); + let flex_w: u16 = inner_list_area + .width + .saturating_sub(fixed_total + gaps) + .max(1); + + let widths: Vec = columns + .iter() + .enumerate() + .map(|(i, _)| { + if Some(i) == flex_idx { Constraint::Min(1) } else { - Constraint::Length(col_fixed_width(col).unwrap_or(0)) + Constraint::Length(content_w[i]) } }) .collect(); - let ordered: Vec = if is_bottom { - app.filtered.iter().rev().copied().collect() - } else { - app.filtered.to_vec() - }; - let rows: Vec = ordered .iter() .map(|&fi| { let row = &app.all_rows[fi]; let cells: Vec = columns .iter() - .map(|col| tui_cell(col, row, now, flex_w)) + .enumerate() + .map(|(i, col)| { + let w = if Some(i) == flex_idx { + flex_w + } else { + content_w[i] + }; + tui_cell(col, row, now, w) + }) .collect(); Row::new(cells) }) From 90fe93b2871a2e5bbbb15be0617252d03c45353d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 11:29:10 -0600 Subject: [PATCH 094/151] feat(tui): add tabbed Sessions view with master-detail pane (#48) --- src/tui/app.rs | 369 +++++++++++++++++++++++++- src/tui/event.rs | 198 +++++++++++++- src/tui/mod.rs | 19 +- src/tui/render.rs | 656 ++++++++++++++++++++++++++++++++++------------ 4 files changed, 1070 insertions(+), 172 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index 3afadc4..eda21c0 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -3,16 +3,25 @@ use rusqlite::Connection; use crate::cli::SearchArgs; use crate::error::ThothError; use crate::search::{CommandRow, ExitFilter}; +use crate::sessions::{list_sessions, SessionRow, SessionsArgs}; use crate::tui::fuzzy; const TUI_LIMIT: usize = 5000; +#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)] +pub enum Tab { + #[default] + History, + Sessions, +} + pub struct FilterState { pub project: Option, pub tag: Vec, pub exit: Option, pub since: Option, pub until: Option, + pub session: Option, } impl Default for FilterState { @@ -29,6 +38,7 @@ impl FilterState { exit: None, since: None, until: None, + session: None, } } @@ -41,7 +51,7 @@ impl FilterState { duration: None, since: self.since.clone(), until: self.until.clone(), - session: None, + session: self.session.clone(), limit: Some(TUI_LIMIT), show_session: false, } @@ -60,6 +70,13 @@ pub struct App { pub selected: usize, pub filters: FilterState, pub action: Option, + pub tab: Tab, + pub sessions: Vec, + pub session_selected: usize, + pub session_commands: Vec, + pub needs_session_reload: bool, + pub needs_session_commands_reload: bool, + pub needs_history_reload: bool, } impl Default for App { @@ -77,6 +94,57 @@ impl App { selected: 0, filters: FilterState::new(), action: None, + tab: Tab::History, + sessions: vec![], + session_selected: 0, + session_commands: vec![], + needs_session_reload: false, + needs_session_commands_reload: false, + needs_history_reload: false, + } + } + + pub fn prev_tab(&mut self) { + self.tab = Tab::History; + } + + pub fn next_tab(&mut self) { + if self.tab == Tab::History { + self.tab = Tab::Sessions; + if self.sessions.is_empty() { + self.needs_session_reload = true; + self.needs_session_commands_reload = true; + } + } + } + + pub fn session_move_up(&mut self) { + let max = self.sessions.len().saturating_sub(1); + if self.session_selected < max { + self.session_selected += 1; + self.needs_session_commands_reload = true; + } + } + + pub fn session_move_down(&mut self) { + if self.session_selected > 0 { + self.session_selected -= 1; + self.needs_session_commands_reload = true; + } + } + + pub fn selected_session(&self) -> Option<&SessionRow> { + self.sessions.get(self.session_selected) + } + + pub fn open_session(&mut self) { + if let Some(s) = self.selected_session() { + let id = s.id.clone(); + self.filters.session = Some(id); + self.tab = Tab::History; + self.query.clear(); + self.selected = 0; + self.needs_history_reload = true; } } @@ -87,6 +155,49 @@ impl App { Ok(()) } + pub fn reload_sessions(&mut self, conn: &Connection, now: i64) -> Result<(), ThothError> { + let args = SessionsArgs { + project: None, + since: None, + until: None, + limit: TUI_LIMIT, + }; + self.sessions = list_sessions(conn, &args, now)?; + let max = self.sessions.len().saturating_sub(1); + if self.session_selected > max { + self.session_selected = 0; + } + self.needs_session_reload = false; + self.needs_session_commands_reload = true; + Ok(()) + } + + pub fn reload_session_commands( + &mut self, + conn: &Connection, + now: i64, + ) -> Result<(), ThothError> { + if let Some(s) = self.selected_session() { + let args = SearchArgs { + query: None, + project: None, + tag: vec![], + exit: None, + duration: None, + since: None, + until: None, + session: Some(s.id.clone()), + limit: Some(TUI_LIMIT), + show_session: false, + }; + self.session_commands = crate::search::execute(&args, conn, now)?; + } else { + self.session_commands.clear(); + } + self.needs_session_commands_reload = false; + Ok(()) + } + pub fn recompute(&mut self) { self.filtered = fuzzy::rank(&self.query, &self.all_rows); let max = self.filtered.len().saturating_sub(1); @@ -133,6 +244,29 @@ mod tests { .unwrap(); } + fn seed_session(conn: &Connection, id: &str, project: &str, started: i64) { + conn.execute( + "INSERT INTO sessions(session_id, project, started_at, ended_at, command_count) \ + VALUES(?1, ?2, ?3, ?3, 0)", + rusqlite::params![id, project, started], + ) + .unwrap(); + } + + fn seed_command_for_session(conn: &Connection, session_id: &str, cmd: &str, ts: i64) { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ + VALUES(?1, '/tmp', 'p', ?2, ?3, 0, 100, '[]')", + rusqlite::params![cmd, session_id, ts], + ) + .unwrap(); + conn.execute( + "UPDATE sessions SET command_count = command_count + 1 WHERE session_id = ?1", + rusqlite::params![session_id], + ) + .unwrap(); + } + #[test] fn to_search_args_empty_filters() { let fs = FilterState::new(); @@ -143,6 +277,7 @@ mod tests { assert!(args.exit.is_none()); assert!(args.since.is_none()); assert!(args.until.is_none()); + assert!(args.session.is_none()); assert_eq!(args.limit, Some(TUI_LIMIT)); } @@ -154,6 +289,7 @@ mod tests { fs.tag = vec!["rust".into(), "cli".into()]; fs.since = Some("2024-01-01".into()); fs.until = Some("2024-12-31".into()); + fs.session = Some("ses-abc123".into()); let args = fs.to_search_args(); assert!(args.query.is_none()); assert_eq!(args.project, Some("myapp".into())); @@ -161,9 +297,206 @@ mod tests { assert_eq!(args.tag, vec!["rust".to_string(), "cli".to_string()]); assert_eq!(args.since, Some("2024-01-01".into())); assert_eq!(args.until, Some("2024-12-31".into())); + assert_eq!(args.session, Some("ses-abc123".into())); assert_eq!(args.limit, Some(TUI_LIMIT)); } + #[test] + fn filter_state_session_defaults_to_none() { + let fs = FilterState::new(); + assert!(fs.session.is_none()); + } + + #[test] + fn prev_tab_from_history_stays_history() { + let mut app = App::new(); + assert_eq!(app.tab, Tab::History); + app.prev_tab(); + assert_eq!(app.tab, Tab::History); + } + + #[test] + fn next_tab_from_history_goes_to_sessions() { + let mut app = App::new(); + app.sessions = vec![SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 1000, + ended_at: 2000, + command_count: 1, + tags: vec![], + }]; + app.next_tab(); + assert_eq!(app.tab, Tab::Sessions); + } + + #[test] + fn next_tab_from_sessions_stays_sessions() { + let mut app = App::new(); + app.tab = Tab::Sessions; + app.sessions = vec![SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 1000, + ended_at: 2000, + command_count: 1, + tags: vec![], + }]; + app.next_tab(); + assert_eq!(app.tab, Tab::Sessions); + } + + #[test] + fn prev_tab_from_sessions_goes_to_history() { + let mut app = App::new(); + app.tab = Tab::Sessions; + app.prev_tab(); + assert_eq!(app.tab, Tab::History); + } + + #[test] + fn next_tab_with_empty_sessions_sets_reload_flag() { + let mut app = App::new(); + assert!(app.sessions.is_empty()); + app.next_tab(); + assert!( + app.needs_session_reload, + "must set needs_session_reload when sessions is empty" + ); + assert!(app.needs_session_commands_reload); + } + + #[test] + fn next_tab_with_existing_sessions_does_not_set_reload_flag() { + let mut app = App::new(); + app.sessions = vec![SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 1000, + ended_at: 2000, + command_count: 1, + tags: vec![], + }]; + app.next_tab(); + assert!(!app.needs_session_reload); + } + + #[test] + fn session_move_up_increases_index() { + let mut app = App::new(); + app.sessions = vec![ + SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 2000, + ended_at: 3000, + command_count: 0, + tags: vec![], + }, + SessionRow { + id: "s2".into(), + project: "p".into(), + started_at: 1000, + ended_at: 2000, + command_count: 0, + tags: vec![], + }, + ]; + app.session_selected = 0; + app.session_move_up(); + assert_eq!(app.session_selected, 1); + assert!(app.needs_session_commands_reload); + } + + #[test] + fn session_move_up_clamps_at_max() { + let mut app = App::new(); + app.sessions = vec![SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 2000, + ended_at: 3000, + command_count: 0, + tags: vec![], + }]; + app.session_selected = 0; + app.session_move_up(); + assert_eq!(app.session_selected, 0); + } + + #[test] + fn session_move_down_decreases_index() { + let mut app = App::new(); + app.sessions = vec![ + SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 2000, + ended_at: 3000, + command_count: 0, + tags: vec![], + }, + SessionRow { + id: "s2".into(), + project: "p".into(), + started_at: 1000, + ended_at: 2000, + command_count: 0, + tags: vec![], + }, + ]; + app.session_selected = 1; + app.session_move_down(); + assert_eq!(app.session_selected, 0); + assert!(app.needs_session_commands_reload); + } + + #[test] + fn session_move_down_clamps_at_zero() { + let mut app = App::new(); + app.sessions = vec![SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 2000, + ended_at: 3000, + command_count: 0, + tags: vec![], + }]; + app.session_selected = 0; + app.session_move_down(); + assert_eq!(app.session_selected, 0); + } + + #[test] + fn open_session_sets_filter_and_tab() { + let mut app = App::new(); + app.sessions = vec![SessionRow { + id: "session-abc".into(), + project: "proj".into(), + started_at: 1000, + ended_at: 2000, + command_count: 1, + tags: vec![], + }]; + app.tab = Tab::Sessions; + app.query = "something".into(); + app.selected = 5; + app.open_session(); + assert_eq!(app.filters.session, Some("session-abc".into())); + assert_eq!(app.tab, Tab::History); + assert_eq!(app.query, ""); + assert_eq!(app.selected, 0); + assert!(app.needs_history_reload); + } + + #[test] + fn open_session_noop_when_no_sessions() { + let mut app = App::new(); + app.open_session(); + assert!(app.filters.session.is_none()); + assert_eq!(app.tab, Tab::History); + } + #[test] fn reload_populates_all_rows() { let conn = make_conn(); @@ -174,6 +507,40 @@ mod tests { assert_eq!(app.all_rows.len(), 2); } + #[test] + fn reload_sessions_populates_sessions() { + let conn = make_conn(); + seed_session(&conn, "sid-a", "proj-a", 1000); + seed_session(&conn, "sid-b", "proj-b", 2000); + let mut app = App::new(); + app.reload_sessions(&conn, 9999).unwrap(); + assert_eq!(app.sessions.len(), 2); + assert!(!app.needs_session_reload); + assert!(app.needs_session_commands_reload); + } + + #[test] + fn reload_session_commands_filters_by_selected_session() { + let conn = make_conn(); + seed_session(&conn, "sid-a", "proj", 1000); + seed_session(&conn, "sid-b", "proj", 2000); + seed_command_for_session(&conn, "sid-a", "cmd-for-a", 1100); + seed_command_for_session(&conn, "sid-b", "cmd-for-b", 2100); + + let mut app = App::new(); + app.reload_sessions(&conn, 9999).unwrap(); + + app.session_selected = 1; + app.reload_session_commands(&conn, 9999).unwrap(); + assert_eq!(app.session_commands.len(), 1); + assert_eq!(app.session_commands[0].command, "cmd-for-a"); + + app.session_selected = 0; + app.reload_session_commands(&conn, 9999).unwrap(); + assert_eq!(app.session_commands.len(), 1); + assert_eq!(app.session_commands[0].command, "cmd-for-b"); + } + #[test] fn recompute_filters_on_query() { let conn = make_conn(); diff --git a/src/tui/event.rs b/src/tui/event.rs index f8d35a6..5f71358 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -1,6 +1,6 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; -use crate::tui::app::{Action, App}; +use crate::tui::app::{Action, App, Tab}; pub enum Outcome { Continue, @@ -11,12 +11,31 @@ pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { match key.code { KeyCode::Esc => { app.action = None; - Outcome::Exit + return Outcome::Exit; } KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { app.action = None; - Outcome::Exit + return Outcome::Exit; + } + KeyCode::Left => { + app.prev_tab(); + return Outcome::Continue; } + KeyCode::Right => { + app.next_tab(); + return Outcome::Continue; + } + _ => {} + } + + match app.tab { + Tab::History => handle_history_key(key, app), + Tab::Sessions => handle_sessions_key(key, app), + } +} + +fn handle_history_key(key: KeyEvent, app: &mut App) -> Outcome { + match key.code { KeyCode::Enter => { if let Some(cmd) = app.selected_command() { app.action = Some(Action::Run(cmd.to_string())); @@ -59,9 +78,36 @@ pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { } } +fn handle_sessions_key(key: KeyEvent, app: &mut App) -> Outcome { + match key.code { + KeyCode::Enter => { + app.open_session(); + Outcome::Continue + } + KeyCode::Up => { + app.session_move_up(); + Outcome::Continue + } + KeyCode::Char('p') if key.modifiers.contains(KeyModifiers::CONTROL) => { + app.session_move_up(); + Outcome::Continue + } + KeyCode::Down => { + app.session_move_down(); + Outcome::Continue + } + KeyCode::Char('n') if key.modifiers.contains(KeyModifiers::CONTROL) => { + app.session_move_down(); + Outcome::Continue + } + _ => Outcome::Continue, + } +} + #[cfg(test)] mod tests { use super::*; + use crate::sessions::SessionRow; use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; fn key(code: KeyCode) -> KeyEvent { @@ -110,6 +156,31 @@ mod tests { app } + fn app_with_sessions() -> App { + let mut app = App::new(); + app.tab = Tab::Sessions; + app.sessions = vec![ + SessionRow { + id: "sid-new".into(), + project: "proj".into(), + started_at: 2000, + ended_at: 3000, + command_count: 1, + tags: vec![], + }, + SessionRow { + id: "sid-old".into(), + project: "proj".into(), + started_at: 1000, + ended_at: 2000, + command_count: 1, + tags: vec![], + }, + ]; + app.session_selected = 0; + app + } + #[test] fn esc_sets_no_action_and_exits() { let mut app = app_with_rows(); @@ -251,4 +322,125 @@ mod tests { handle_key(key(KeyCode::Down), &mut app); assert_eq!(app.selected, 0, "Down at newest row must not go further"); } + + #[test] + fn left_switches_to_history_tab() { + let mut app = App::new(); + app.tab = Tab::Sessions; + handle_key(key(KeyCode::Left), &mut app); + assert_eq!(app.tab, Tab::History); + } + + #[test] + fn right_switches_to_sessions_tab() { + let mut app = App::new(); + app.sessions = vec![SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 1000, + ended_at: 2000, + command_count: 0, + tags: vec![], + }]; + handle_key(key(KeyCode::Right), &mut app); + assert_eq!(app.tab, Tab::Sessions); + } + + #[test] + fn right_on_sessions_stays_sessions() { + let mut app = App::new(); + app.tab = Tab::Sessions; + app.sessions = vec![SessionRow { + id: "s1".into(), + project: "p".into(), + started_at: 1000, + ended_at: 2000, + command_count: 0, + tags: vec![], + }]; + handle_key(key(KeyCode::Right), &mut app); + assert_eq!(app.tab, Tab::Sessions); + } + + #[test] + fn left_on_history_stays_history() { + let mut app = App::new(); + assert_eq!(app.tab, Tab::History); + handle_key(key(KeyCode::Left), &mut app); + assert_eq!(app.tab, Tab::History); + } + + #[test] + fn sessions_up_changes_session_selected_not_history_selected() { + let mut app = app_with_sessions(); + let history_selected_before = app.selected; + handle_key(key(KeyCode::Up), &mut app); + assert_eq!( + app.selected, history_selected_before, + "history selected must not change" + ); + assert_eq!(app.session_selected, 1); + } + + #[test] + fn sessions_down_decreases_session_selected() { + let mut app = app_with_sessions(); + app.session_selected = 1; + handle_key(key(KeyCode::Down), &mut app); + assert_eq!(app.session_selected, 0); + } + + #[test] + fn sessions_enter_is_continue_not_exit() { + let mut app = app_with_sessions(); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!( + matches!(outcome, Outcome::Continue), + "Sessions Enter must be Continue" + ); + } + + #[test] + fn sessions_enter_sets_history_reload_and_switches_tab() { + let mut app = app_with_sessions(); + handle_key(key(KeyCode::Enter), &mut app); + assert!(app.needs_history_reload); + assert_eq!(app.tab, Tab::History); + assert_eq!(app.filters.session, Some("sid-new".into())); + } + + #[test] + fn sessions_char_does_not_modify_query() { + let mut app = app_with_sessions(); + handle_key(key(KeyCode::Char('g')), &mut app); + assert_eq!(app.query, "", "typing in Sessions must not modify query"); + } + + #[test] + fn sessions_backspace_does_not_modify_query() { + let mut app = app_with_sessions(); + app.query = "existing".into(); + handle_key(key(KeyCode::Backspace), &mut app); + assert_eq!( + app.query, "existing", + "backspace in Sessions must not modify query" + ); + } + + #[test] + fn history_enter_still_exits_with_run() { + let mut app = app_with_rows(); + assert_eq!(app.tab, Tab::History); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + assert!(matches!(&app.action, Some(Action::Run(_)))); + } + + #[test] + fn history_char_still_filters() { + let mut app = app_with_rows(); + assert_eq!(app.tab, Tab::History); + handle_key(key(KeyCode::Char('g')), &mut app); + assert_eq!(app.query, "g"); + } } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 2a036a0..9ab7820 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -89,7 +89,24 @@ pub fn run( { match handle_key(key, &mut app) { Outcome::Exit => break, - Outcome::Continue => {} + Outcome::Continue => { + if app.needs_session_reload { + app.reload_sessions(conn, now).map_err(|e| { + ThothError::Tui(format!("session reload failed: {e}")) + })?; + } + if app.needs_session_commands_reload { + app.reload_session_commands(conn, now).map_err(|e| { + ThothError::Tui(format!("session commands reload failed: {e}")) + })?; + } + if app.needs_history_reload { + app.reload(conn, now).map_err(|e| { + ThothError::Tui(format!("history reload failed: {e}")) + })?; + app.needs_history_reload = false; + } + } } } } diff --git a/src/tui/render.rs b/src/tui/render.rs index a4ec155..3bdb595 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -7,9 +7,14 @@ use ratatui::{ }; use crate::search::{Column, CommandRow}; -use crate::tui::app::App; +use crate::sessions::SessionRow; +use crate::tui::app::{App, Tab}; use crate::tui::time::format_relative; +const ACCENT: Color = Color::Cyan; +const DIM_COLOR: Color = Color::DarkGray; +const BORDER_COLOR: Color = Color::DarkGray; + pub fn display_command(raw: &str) -> String { let collapsed: String = raw .chars() @@ -66,6 +71,11 @@ fn truncate(s: &str, max: usize) -> String { } } +fn short_id(id: &str) -> &str { + let end = id.char_indices().nth(8).map(|(i, _)| i).unwrap_or(id.len()); + &id[..end] +} + fn filter_chips(app: &App) -> String { let mut parts = Vec::new(); if let Some(ref p) = app.filters.project { @@ -83,6 +93,9 @@ fn filter_chips(app: &App) -> String { if let Some(ref u) = app.filters.until { parts.push(format!("[until:{u}]")); } + if let Some(ref s) = app.filters.session { + parts.push(format!("[session:{}]", short_id(s))); + } parts.join(" ") } @@ -151,91 +164,44 @@ pub fn resolve_tui_columns(names: &[String]) -> Vec { resolved.into_iter().flatten().collect() } -const ACCENT: Color = Color::Cyan; -const DIM_COLOR: Color = Color::DarkGray; -const BORDER_COLOR: Color = Color::DarkGray; +fn render_tab_bar(frame: &mut Frame, area: ratatui::layout::Rect, app: &App) { + let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); + let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); + let active_style = accent_style.add_modifier(Modifier::REVERSED); -pub fn draw( + let (history_style, sessions_style) = match app.tab { + Tab::History => (active_style, dim_style), + Tab::Sessions => (dim_style, active_style), + }; + + let line = Line::from(vec![ + Span::styled(" History ", history_style), + Span::styled(" ", dim_style), + Span::styled(" Sessions ", sessions_style), + ]); + frame.render_widget(Paragraph::new(line), area); +} + +fn render_history_pane( frame: &mut Frame, + area: ratatui::layout::Rect, app: &App, now: i64, is_bottom: bool, columns: &[Column], table_state: &mut TableState, ) { - let area = frame.area(); - - let chunks = Layout::vertical([ - Constraint::Length(1), - Constraint::Min(1), - Constraint::Length(1), - Constraint::Length(1), - Constraint::Length(1), - ]) - .split(area); - - let header_area = chunks[0]; - let list_area = chunks[1]; - let query_area = chunks[2]; - let status_area = chunks[3]; - let controls_area = chunks[4]; - - let version = env!("CARGO_PKG_VERSION"); - let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); - - let accent_bar = Span::styled("▌ ", accent_style); - let name_span = Span::styled("Thoth", accent_style); - let sep_span = Span::styled(" · ", dim_style); - let version_span = Span::styled(format!("v{version}"), dim_style); - let count_sep = Span::styled(" ", dim_style); - let count_span = Span::styled(format!("{} commands", app.all_rows.len()), dim_style); - let history_right = format!("History count: {}", app.all_rows.len()); - let right_len = history_right.len(); - let left_len = - 2 + 5 + 3 + 1 + version.len() + 2 + format!("{} commands", app.all_rows.len()).len(); - let pad = (header_area.width as usize).saturating_sub(left_len + right_len); - let padding_span = Span::raw(format!("{:pad$}", "", pad = pad)); - let history_span = Span::styled(history_right, dim_style); - - let header_line = Line::from(vec![ - accent_bar, - name_span, - sep_span, - version_span, - count_sep, - count_span, - padding_span, - history_span, - ]); - let header = Paragraph::new(header_line); - frame.render_widget(header, header_area); - - let controls_line = Line::from(vec![ - Span::styled(" ↑↓", accent_style), - Span::styled(" navigate", dim_style), - Span::styled(" · ", dim_style), - Span::styled("↵", accent_style), - Span::styled(" run", dim_style), - Span::styled(" · ", dim_style), - Span::styled("⇥", accent_style), - Span::styled(" edit", dim_style), - Span::styled(" · ", dim_style), - Span::styled("esc", accent_style), - Span::styled(" quit", dim_style), - ]); - let controls = Paragraph::new(controls_line); - frame.render_widget(controls, controls_area); - let border_style = Style::default().fg(BORDER_COLOR); + let list_block = Block::default() .borders(Borders::ALL) .border_type(BorderType::Rounded) .border_style(border_style) .title(Span::styled(" history ", dim_style)); - let inner_list_area = list_block.inner(list_area); - frame.render_widget(list_block, list_area); + let inner_list_area = list_block.inner(area); + frame.render_widget(list_block, area); let has_command_col = columns.iter().any(|c| matches!(c, Column::Command)); let n_cols = columns.len(); @@ -338,10 +304,193 @@ pub fn draw( table_state.select(Some(display_idx)); } frame.render_stateful_widget(table, inner_list_area, table_state); +} + +fn render_sessions_pane( + frame: &mut Frame, + area: ratatui::layout::Rect, + app: &App, + now: i64, + table_state: &mut TableState, +) { + let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); + let border_style = Style::default().fg(BORDER_COLOR); + let highlight_style = Style::default() + .add_modifier(Modifier::REVERSED) + .add_modifier(Modifier::BOLD); + + let h_chunks = Layout::horizontal([Constraint::Percentage(38), Constraint::Min(1)]).split(area); + + let left_area = h_chunks[0]; + let right_area = h_chunks[1]; + + let sessions_block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(border_style) + .title(Span::styled(" sessions ", dim_style)); + + let inner_left = sessions_block.inner(left_area); + frame.render_widget(sessions_block, left_area); + + if app.sessions.is_empty() { + let empty = Paragraph::new("no sessions").style(dim_style); + frame.render_widget(empty, inner_left); + } else { + let rows: Vec = app.sessions.iter().map(|s| session_row(s, now)).collect(); + + let widths = vec![ + Constraint::Length(9), + Constraint::Length(16), + Constraint::Min(1), + ]; + + let table = Table::new(rows, widths) + .block(Block::default()) + .row_highlight_style(highlight_style); + + if app.sessions.is_empty() { + table_state.select(None); + } else { + table_state.select(Some(app.session_selected)); + } + frame.render_stateful_widget(table, inner_left, table_state); + } + + let commands_block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(border_style) + .title(Span::styled(" commands ", dim_style)); + + let inner_right = commands_block.inner(right_area); + frame.render_widget(commands_block, right_area); + + if app.session_commands.is_empty() { + let empty = Paragraph::new("no commands").style(dim_style); + frame.render_widget(empty, inner_right); + } else { + let rows: Vec = app + .session_commands + .iter() + .map(|cmd| { + let time_text = truncate(&format_relative(cmd.timestamp, now), 9); + let exit_text_val = exit_text(cmd.exit_code); + let cmd_text = truncate( + &display_command(&cmd.command), + inner_right.width.saturating_sub(16) as usize, + ); + Row::new(vec![ + Cell::from(Span::styled(time_text, Style::default().fg(DIM_COLOR))), + Cell::from(Span::styled( + exit_text_val.0, + Style::default().fg(exit_text_val.1), + )), + Cell::from(cmd_text), + ]) + }) + .collect(); + + let widths = vec![ + Constraint::Length(9), + Constraint::Length(4), + Constraint::Min(1), + ]; + + let table = Table::new(rows, widths).block(Block::default()); + frame.render_widget(table, inner_right); + } +} + +fn session_row(s: &SessionRow, now: i64) -> Row<'static> { + let time_text = truncate(&format_relative(s.started_at, now), 9); + let project_text = truncate(&s.project, 16); + let count_text = s.command_count.to_string(); + Row::new(vec![ + Cell::from(Span::styled(time_text, Style::default().fg(DIM_COLOR))), + Cell::from(Span::styled(project_text, Style::default().fg(Color::Blue))), + Cell::from(count_text), + ]) +} + +pub fn draw( + frame: &mut Frame, + app: &App, + now: i64, + is_bottom: bool, + columns: &[Column], + table_state: &mut TableState, +) { + let area = frame.area(); + + let chunks = Layout::vertical([ + Constraint::Length(1), + Constraint::Length(1), + Constraint::Min(1), + Constraint::Length(1), + Constraint::Length(1), + Constraint::Length(1), + ]) + .split(area); + + let tabbar_area = chunks[0]; + let header_area = chunks[1]; + let middle_area = chunks[2]; + let query_area = chunks[3]; + let status_area = chunks[4]; + let controls_area = chunks[5]; + + render_tab_bar(frame, tabbar_area, app); + + let version = env!("CARGO_PKG_VERSION"); + let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); + let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); + + let accent_bar = Span::styled("▌ ", accent_style); + let name_span = Span::styled("Thoth", accent_style); + let sep_span = Span::styled(" · ", dim_style); + let version_span = Span::styled(format!("v{version}"), dim_style); + let count_sep = Span::styled(" ", dim_style); + let count_span = Span::styled(format!("{} commands", app.all_rows.len()), dim_style); + let history_right = format!("History count: {}", app.all_rows.len()); + let right_len = history_right.len(); + let left_len = + 2 + 5 + 3 + 1 + version.len() + 2 + format!("{} commands", app.all_rows.len()).len(); + let pad = (header_area.width as usize).saturating_sub(left_len + right_len); + let padding_span = Span::raw(format!("{:pad$}", "", pad = pad)); + let history_span = Span::styled(history_right, dim_style); + + let header_line = Line::from(vec![ + accent_bar, + name_span, + sep_span, + version_span, + count_sep, + count_span, + padding_span, + history_span, + ]); + frame.render_widget(Paragraph::new(header_line), header_area); + + match app.tab { + Tab::History => { + render_history_pane( + frame, + middle_area, + app, + now, + is_bottom, + columns, + table_state, + ); + } + Tab::Sessions => { + render_sessions_pane(frame, middle_area, app, now, table_state); + } + } let query_text = format!("> {}", app.query); - let query_widget = Paragraph::new(query_text); - frame.render_widget(query_widget, query_area); + frame.render_widget(Paragraph::new(query_text), query_area); let chips = filter_chips(app); let result_count = app.filtered.len(); @@ -350,8 +499,43 @@ pub fn draw( } else { format!("{chips} {result_count} results") }; - let status_widget = Paragraph::new(status_text).alignment(Alignment::Left); - frame.render_widget(status_widget, status_area); + frame.render_widget( + Paragraph::new(status_text).alignment(Alignment::Left), + status_area, + ); + + let controls_line = match app.tab { + Tab::History => Line::from(vec![ + Span::styled(" ←→", accent_style), + Span::styled(" tabs", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↑↓", accent_style), + Span::styled(" navigate", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↵", accent_style), + Span::styled(" run", dim_style), + Span::styled(" · ", dim_style), + Span::styled("⇥", accent_style), + Span::styled(" edit", dim_style), + Span::styled(" · ", dim_style), + Span::styled("esc", accent_style), + Span::styled(" quit", dim_style), + ]), + Tab::Sessions => Line::from(vec![ + Span::styled(" ←→", accent_style), + Span::styled(" tabs", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↑↓", accent_style), + Span::styled(" session", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↵", accent_style), + Span::styled(" open", dim_style), + Span::styled(" · ", dim_style), + Span::styled("esc", accent_style), + Span::styled(" quit", dim_style), + ]), + }; + frame.render_widget(Paragraph::new(controls_line), controls_area); } pub fn format_action_line(action: Option<&crate::tui::app::Action>) -> Option { @@ -367,7 +551,8 @@ pub fn format_action_line(action: Option<&crate::tui::app::Action>) -> Option SessionRow { + SessionRow { + id: id.to_string(), + project: project.to_string(), + started_at, + ended_at: started_at + 3600, + command_count: count, + tags: vec![], + } + } + fn default_cols() -> Vec { resolve_tui_columns(&default_tui_columns()) } @@ -412,6 +608,17 @@ mod tests { lines.join("\n") } + fn render_app_buf(app: &App) -> ratatui::buffer::Buffer { + let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + let cols = default_cols(); + terminal + .draw(|f| draw(f, app, TEST_NOW, true, &cols, &mut ts)) + .unwrap(); + terminal.backend().buffer().clone() + } + fn app_with_rows() -> App { let mut app = App::new(); app.all_rows = vec![ @@ -423,6 +630,206 @@ mod tests { app } + fn app_with_sessions() -> App { + let mut app = App::new(); + app.tab = Tab::Sessions; + app.sessions = vec![ + make_session("session-abc-123", "proj-alpha", TEST_NOW - 3600, 5), + make_session("session-def-456", "proj-beta", TEST_NOW - 7200, 3), + ]; + app.session_selected = 0; + app.session_commands = vec![ + make_row("git status", TEST_NOW - 3500, 0, "proj-alpha"), + make_row("cargo build", TEST_NOW - 3400, 0, "proj-alpha"), + ]; + app + } + + #[test] + fn tab_bar_shows_both_labels() { + let app = app_with_rows(); + let text = render_app(&app); + assert!(text.contains("History"), "tab bar must show 'History'"); + assert!(text.contains("Sessions"), "tab bar must show 'Sessions'"); + } + + #[test] + fn tab_bar_active_history_is_reversed() { + let app = app_with_rows(); + let buf = render_app_buf(&app); + + let any_reversed_row0 = (0..TEST_WIDTH).any(|x| { + buf[(x, 0)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }); + assert!( + any_reversed_row0, + "tab bar row 0 must have REVERSED on active History tab label" + ); + + let reversed_count_row0 = (0..TEST_WIDTH) + .filter(|&x| { + buf[(x, 0)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }) + .count(); + + assert!( + reversed_count_row0 < TEST_WIDTH as usize, + "tab bar must NOT be fully reversed; only active label should be reversed (count={reversed_count_row0})" + ); + } + + #[test] + fn header_has_no_full_width_reversed_bar() { + let app = app_with_rows(); + let buf = render_app_buf(&app); + + let reversed_count = (0..TEST_WIDTH) + .filter(|&x| { + buf[(x, 1)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }) + .count(); + assert_eq!( + reversed_count, 0, + "header row (y=1) must have zero REVERSED cells; found {reversed_count}" + ); + } + + #[test] + fn table_header_not_reversed() { + let app = app_with_rows(); + let buf = render_app_buf(&app); + + let header_row_y = 3u16; + let reversed_count = (0..TEST_WIDTH) + .filter(|&x| { + buf[(x, header_row_y)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }) + .count(); + assert_eq!( + reversed_count, 0, + "table header row must have zero REVERSED cells; found {reversed_count}" + ); + } + + #[test] + fn sessions_tab_renders_two_panes() { + let app = app_with_sessions(); + let text = render_app(&app); + assert!( + text.contains("sessions"), + "Sessions tab must show 'sessions' pane title" + ); + assert!( + text.contains("commands"), + "Sessions tab must show 'commands' pane title" + ); + } + + #[test] + fn sessions_tab_shows_session_row_highlighted() { + let app = app_with_sessions(); + let buf = render_app_buf(&app); + + let any_reversed = (0..TEST_HEIGHT).any(|row_y| { + (0..TEST_WIDTH).any(|x| { + buf[(x, row_y)] + .style() + .add_modifier + .contains(Modifier::REVERSED) + }) + }); + assert!( + any_reversed, + "Sessions tab must have REVERSED on selected row" + ); + } + + #[test] + fn sessions_tab_shows_command_text() { + let app = app_with_sessions(); + let text = render_app(&app); + assert!( + text.contains("git status"), + "Sessions tab right pane must show session command text" + ); + } + + #[test] + fn history_tab_still_renders_history_block() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + text.contains("history"), + "History tab must show 'history' block title" + ); + assert!( + text.contains("git status"), + "History tab must show commands" + ); + } + + #[test] + fn controls_history_shows_navigate_and_run() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + text.contains("navigate"), + "History controls must contain 'navigate'" + ); + assert!(text.contains("run"), "History controls must contain 'run'"); + assert!( + text.contains("edit"), + "History controls must contain 'edit'" + ); + assert!( + text.contains("quit"), + "History controls must contain 'quit'" + ); + assert!(text.contains("tabs"), "History controls must hint 'tabs'"); + } + + #[test] + fn controls_sessions_shows_session_and_open() { + let app = app_with_sessions(); + let text = render_app(&app); + assert!( + text.contains("session"), + "Sessions controls must contain 'session'" + ); + assert!( + text.contains("open"), + "Sessions controls must contain 'open'" + ); + assert!( + text.contains("quit"), + "Sessions controls must contain 'quit'" + ); + assert!(text.contains("tabs"), "Sessions controls must hint 'tabs'"); + } + + #[test] + fn session_chip_shows_when_session_filter_set() { + let mut app = app_with_rows(); + app.filters.session = Some("abcdefgh-1234-5678".into()); + let text = render_app(&app); + assert!( + text.contains("[session:abcdefgh]"), + "status bar must show session chip with 8-char prefix; got:\n{text}" + ); + } + #[test] fn header_contains_version_and_history_count() { let app = app_with_rows(); @@ -502,14 +909,7 @@ mod tests { app.recompute(); app.selected = 0; - let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); - let mut terminal = Terminal::new(backend).unwrap(); - let mut ts = TableState::default(); - let cols = default_cols(); - terminal - .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) - .unwrap(); - let buf = terminal.backend().buffer().clone(); + let buf = render_app_buf(&app); let any_reversed = (0..TEST_HEIGHT).any(|row_y| { (0..TEST_WIDTH).any(|x| { @@ -558,7 +958,7 @@ mod tests { text.contains("ok"), "exit 0 must render as 'ok'; got:\n{text}" ); - assert!(!text.contains('✓'), "exit 0 must NOT render as glyph ✓"); + assert!(!text.contains('✓'), "exit 0 must NOT render as glyph"); } #[test] @@ -571,58 +971,7 @@ mod tests { text.contains("fail"), "exit nonzero must render as 'fail'; got:\n{text}" ); - assert!( - !text.contains('✗'), - "exit nonzero must NOT render as glyph ✗" - ); - } - - #[test] - fn controls_hint_is_visible() { - let app = app_with_rows(); - let text = render_app(&app); - assert!( - text.contains("navigate"), - "controls hint must contain 'navigate'; got:\n{text}" - ); - assert!( - text.contains("run"), - "controls hint must contain 'run'; got:\n{text}" - ); - assert!( - text.contains("edit"), - "controls hint must contain 'edit'; got:\n{text}" - ); - assert!( - text.contains("quit"), - "controls hint must contain 'quit'; got:\n{text}" - ); - } - - #[test] - fn header_has_no_full_width_reversed_bar() { - let app = app_with_rows(); - let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); - let mut terminal = Terminal::new(backend).unwrap(); - let mut ts = TableState::default(); - let cols = default_cols(); - terminal - .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) - .unwrap(); - let buf = terminal.backend().buffer().clone(); - - let reversed_count = (0..TEST_WIDTH) - .filter(|&x| { - buf[(x, 0)] - .style() - .add_modifier - .contains(Modifier::REVERSED) - }) - .count(); - assert_eq!( - reversed_count, 0, - "header row must have zero REVERSED cells; found {reversed_count}" - ); + assert!(!text.contains('✗'), "exit nonzero must NOT render as glyph"); } #[test] @@ -653,7 +1002,7 @@ mod tests { #[test] fn scroll_brings_selected_row_into_view() { - const SMALL_HEIGHT: u16 = 8; + const SMALL_HEIGHT: u16 = 10; const SMALL_WIDTH: u16 = 80; let mut app = App::new(); app.all_rows = (0..20) @@ -763,7 +1112,7 @@ mod tests { ]; app.recompute(); - let (default_buf, _) = render_app_small(&app, 80, 8); + let (default_buf, _) = render_app_small(&app, 80, 12); println!("=== DEFAULT (newest at bottom, cursor on newest) ==="); println!("{default_buf}"); @@ -777,7 +1126,7 @@ mod tests { handle_key(up_key, &mut app); } - let (after_up3, _) = render_app_small(&app, 80, 8); + let (after_up3, _) = render_app_small(&app, 80, 12); println!("\n=== AFTER Up x3 (cursor on cmd-older) ==="); println!("{after_up3}"); @@ -988,7 +1337,7 @@ mod tests { use crate::tui::event::handle_key; use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; - const H: u16 = 8; + const H: u16 = 10; const W: u16 = 80; let mut app = App::new(); app.all_rows = (0..20) @@ -1248,33 +1597,6 @@ mod tests { ); } - #[test] - fn table_header_not_reversed() { - let app = app_with_rows(); - let backend = TestBackend::new(TEST_WIDTH, TEST_HEIGHT); - let mut terminal = Terminal::new(backend).unwrap(); - let mut ts = TableState::default(); - let cols = default_cols(); - terminal - .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) - .unwrap(); - let buf = terminal.backend().buffer().clone(); - - let header_row_y = 2u16; - let reversed_count = (0..TEST_WIDTH) - .filter(|&x| { - buf[(x, header_row_y)] - .style() - .add_modifier - .contains(Modifier::REVERSED) - }) - .count(); - assert_eq!( - reversed_count, 0, - "table header row must have zero REVERSED cells; found {reversed_count}" - ); - } - #[test] fn reduced_columns_only_show_selected_headers() { let mut app = App::new(); From f84280652dd1b34a2525b9c1124e95c20019e76f Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 11:38:17 -0600 Subject: [PATCH 095/151] test(tui): add sessions tab buffer dump test (#48) --- src/tui/render.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/tui/render.rs b/src/tui/render.rs index 3bdb595..f1e096d 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -1719,4 +1719,47 @@ mod tests { .any(|l| l.contains("exit") && l.contains("command"))); assert!(lines2.iter().all(|l| !l.contains("time"))); } + + #[test] + fn dump_sessions_tab_buffer() { + const NOW: i64 = 1_000_000_000; + const W: u16 = 100; + const H: u16 = 16; + + let mut app = App::new(); + app.tab = Tab::Sessions; + app.sessions = vec![ + make_session("abc123def456", "proj-alpha", NOW - 3600, 5), + make_session("xyz789uvw012", "proj-beta", NOW - 7200, 3), + ]; + app.session_selected = 0; + app.session_commands = vec![ + make_row("git status", NOW - 3500, 0, "proj-alpha"), + make_row("cargo build --release", NOW - 3400, 0, "proj-alpha"), + make_row("cargo test", NOW - 3200, 1, "proj-alpha"), + ]; + + let cols = default_cols(); + let backend = TestBackend::new(W, H); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + terminal + .draw(|f| draw(f, &app, NOW, true, &cols, &mut ts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..H { + let mut line = String::new(); + for col in 0..W { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line.trim_end().to_string()); + } + let text = lines.join("\n"); + println!("=== SESSIONS TAB (100x16) ==="); + println!("{text}"); + + assert!(text.contains("sessions"), "must show sessions pane"); + assert!(text.contains("commands"), "must show commands pane"); + } } From cc54bb7746644ced501dd89620034150cceb3955 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 13:00:09 -0600 Subject: [PATCH 096/151] fix(tui): correct up/down direction in the sessions pane (#48) --- src/tui/app.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index eda21c0..f5283ac 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -119,16 +119,16 @@ impl App { } pub fn session_move_up(&mut self) { - let max = self.sessions.len().saturating_sub(1); - if self.session_selected < max { - self.session_selected += 1; + if self.session_selected > 0 { + self.session_selected -= 1; self.needs_session_commands_reload = true; } } pub fn session_move_down(&mut self) { - if self.session_selected > 0 { - self.session_selected -= 1; + let max = self.sessions.len().saturating_sub(1); + if self.session_selected < max { + self.session_selected += 1; self.needs_session_commands_reload = true; } } @@ -382,7 +382,7 @@ mod tests { } #[test] - fn session_move_up_increases_index() { + fn session_move_up_decreases_index() { let mut app = App::new(); app.sessions = vec![ SessionRow { @@ -402,14 +402,14 @@ mod tests { tags: vec![], }, ]; - app.session_selected = 0; + app.session_selected = 1; app.session_move_up(); - assert_eq!(app.session_selected, 1); + assert_eq!(app.session_selected, 0); assert!(app.needs_session_commands_reload); } #[test] - fn session_move_up_clamps_at_max() { + fn session_move_up_clamps_at_top() { let mut app = App::new(); app.sessions = vec![SessionRow { id: "s1".into(), @@ -425,7 +425,7 @@ mod tests { } #[test] - fn session_move_down_decreases_index() { + fn session_move_down_increases_index() { let mut app = App::new(); app.sessions = vec![ SessionRow { @@ -445,14 +445,14 @@ mod tests { tags: vec![], }, ]; - app.session_selected = 1; + app.session_selected = 0; app.session_move_down(); - assert_eq!(app.session_selected, 0); + assert_eq!(app.session_selected, 1); assert!(app.needs_session_commands_reload); } #[test] - fn session_move_down_clamps_at_zero() { + fn session_move_down_clamps_at_bottom() { let mut app = App::new(); app.sessions = vec![SessionRow { id: "s1".into(), From 84c95499ca3c182f3fe2a83a58dc512d09c7910e Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 13:36:01 -0600 Subject: [PATCH 097/151] test(tui): fix sessions pane direction assertions (#48) --- src/tui/event.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/tui/event.rs b/src/tui/event.rs index 5f71358..e8fc0a9 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -373,21 +373,22 @@ mod tests { #[test] fn sessions_up_changes_session_selected_not_history_selected() { let mut app = app_with_sessions(); + app.session_selected = 1; let history_selected_before = app.selected; handle_key(key(KeyCode::Up), &mut app); assert_eq!( app.selected, history_selected_before, "history selected must not change" ); - assert_eq!(app.session_selected, 1); + assert_eq!(app.session_selected, 0); } #[test] - fn sessions_down_decreases_session_selected() { + fn sessions_down_increases_session_selected() { let mut app = app_with_sessions(); - app.session_selected = 1; + app.session_selected = 0; handle_key(key(KeyCode::Down), &mut app); - assert_eq!(app.session_selected, 0); + assert_eq!(app.session_selected, 1); } #[test] From ca038b6ce3857e4acdb98dc310bd6a04bf7b0640 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:29:52 -0600 Subject: [PATCH 098/151] feat(db): add workspace column via migration v4 (#50) --- src/database.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++----- src/schema.rs | 2 ++ 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/database.rs b/src/database.rs index 1864e19..64300ff 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,5 +1,5 @@ use crate::error::ThothError; -use crate::schema::{SCHEMA_V1, SCHEMA_V2_FTS, SCHEMA_V3_TERMINAL_ID}; +use crate::schema::{SCHEMA_V1, SCHEMA_V2_FTS, SCHEMA_V3_TERMINAL_ID, SCHEMA_V4_WORKSPACE}; use rusqlite::{Connection, ErrorCode, TransactionBehavior}; use std::path::Path; use std::time::{Duration, SystemTime, UNIX_EPOCH}; @@ -26,6 +26,7 @@ pub const MIGRATIONS: &[(i64, &str)] = &[ (1, SCHEMA_V1), (2, SCHEMA_V2_FTS), (3, SCHEMA_V3_TERMINAL_ID), + (4, SCHEMA_V4_WORKSPACE), ]; pub fn connect_memory() -> Result { @@ -139,6 +140,63 @@ mod tests { c } + #[test] + fn v4_workspace_column_exists() { + let conn = mem_conn(); + let cols: Vec = { + let mut stmt = conn.prepare("PRAGMA table_info(commands)").unwrap(); + stmt.query_map([], |row| row.get::<_, String>(1)) + .unwrap() + .filter_map(|r| r.ok()) + .collect() + }; + assert!( + cols.iter().any(|c| c == "workspace"), + "workspace column missing: {cols:?}" + ); + } + + #[test] + fn v4_pre_existing_rows_have_null_workspace() { + let mut conn = connect_memory().unwrap(); + conn.execute_batch(SCHEMA_V1).unwrap(); + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64; + conn.execute( + "INSERT OR IGNORE INTO schema_version(version, applied_at) VALUES(1, ?1)", + rusqlite::params![now], + ) + .unwrap(); + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp) VALUES('pre-v4-cmd', '/tmp', 'p', 's1', 1700000001)", + [], + ).unwrap(); + apply_migrations(&mut conn).unwrap(); + let workspace: Option = conn + .query_row( + "SELECT workspace FROM commands WHERE command='pre-v4-cmd'", + [], + |r| r.get(0), + ) + .unwrap(); + assert!( + workspace.is_none(), + "expected NULL workspace for pre-existing row" + ); + } + + #[test] + fn v4_migration_idempotent() { + let mut conn = mem_conn(); + let ver_before = current_version(&conn); + assert_eq!(ver_before, 4); + apply_migrations(&mut conn).unwrap(); + let ver_after = current_version(&conn); + assert_eq!(ver_after, 4); + } + #[test] fn v3_terminal_id_column_exists() { let conn = mem_conn(); @@ -190,16 +248,16 @@ mod tests { fn v3_migration_idempotent() { let mut conn = mem_conn(); let ver_before = current_version(&conn); - assert_eq!(ver_before, 3); + assert_eq!(ver_before, 4); apply_migrations(&mut conn).unwrap(); let ver_after = current_version(&conn); - assert_eq!(ver_after, 3); + assert_eq!(ver_after, 4); } #[test] - fn v3_current_version_is_3() { + fn v3_current_version_is_4() { let conn = mem_conn(); - assert_eq!(current_version(&conn), 3); + assert_eq!(current_version(&conn), 4); } #[test] @@ -418,7 +476,7 @@ mod tests { |r| r.get(0), ) .unwrap(); - assert_eq!(ver, 3, "round {_round}: schema not at final version"); + assert_eq!(ver, 4, "round {_round}: schema not at final version"); let count: i64 = conn .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) diff --git a/src/schema.rs b/src/schema.rs index c00fbd6..d3a93e6 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -37,6 +37,8 @@ CREATE TABLE IF NOT EXISTS projects ( pub const SCHEMA_V3_TERMINAL_ID: &str = "ALTER TABLE commands ADD COLUMN terminal_id TEXT;"; +pub const SCHEMA_V4_WORKSPACE: &str = "ALTER TABLE commands ADD COLUMN workspace TEXT;"; + pub const SCHEMA_V2_FTS: &str = " CREATE VIRTUAL TABLE IF NOT EXISTS commands_fts USING fts5(command, content='commands', content_rowid='id'); From 641c05cb5855b04827993312ab8add8d2080cb6b Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:29:56 -0600 Subject: [PATCH 099/151] feat(workspaces): add workspaces module with start/end/normalize/list (#50) --- src/lib.rs | 1 + src/workspaces.rs | 170 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 src/workspaces.rs diff --git a/src/lib.rs b/src/lib.rs index 6638168..31dc900 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,3 +18,4 @@ pub mod sessions; pub mod stats; pub mod tags; pub mod tui; +pub mod workspaces; diff --git a/src/workspaces.rs b/src/workspaces.rs new file mode 100644 index 0000000..60fe0d3 --- /dev/null +++ b/src/workspaces.rs @@ -0,0 +1,170 @@ +use crate::error::ThothError; +use rusqlite::Connection; + +pub fn start_line(name: &str) -> String { + let escaped = name.replace('\'', "'\\''"); + format!("export TTH_ACTIVE_WORKSPACE='{escaped}'") +} + +pub fn end_line() -> String { + String::from("unset TTH_ACTIVE_WORKSPACE") +} + +pub fn normalize_workspace(raw: &str) -> Option { + let trimmed = raw.trim(); + if trimmed.is_empty() { + None + } else { + Some(trimmed.to_string()) + } +} + +pub struct WorkspaceRow { + pub name: String, + pub command_count: i64, + pub first_ts: i64, + pub last_ts: i64, +} + +pub fn list_workspaces(conn: &Connection) -> Result, ThothError> { + let mut stmt = conn.prepare( + "SELECT workspace, COUNT(*), MIN(timestamp), MAX(timestamp) \ + FROM commands \ + WHERE workspace IS NOT NULL AND workspace <> '' \ + GROUP BY workspace \ + ORDER BY MAX(timestamp) DESC", + )?; + let rows = stmt.query_map([], |row| { + Ok(WorkspaceRow { + name: row.get(0)?, + command_count: row.get(1)?, + first_ts: row.get(2)?, + last_ts: row.get(3)?, + }) + })?; + let mut result = Vec::new(); + for row in rows { + result.push(row?); + } + Ok(result) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn mem_conn() -> Connection { + let mut c = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut c).unwrap(); + c + } + + #[test] + fn start_line_basic() { + assert_eq!(start_line("demo"), "export TTH_ACTIVE_WORKSPACE='demo'"); + } + + #[test] + fn start_line_escapes_single_quote() { + assert_eq!(start_line("it's"), "export TTH_ACTIVE_WORKSPACE='it'\\''s'"); + } + + #[test] + fn end_line_is_unset() { + assert_eq!(end_line(), "unset TTH_ACTIVE_WORKSPACE"); + } + + #[test] + fn normalize_workspace_empty_string_is_none() { + assert!(normalize_workspace("").is_none()); + } + + #[test] + fn normalize_workspace_whitespace_only_is_none() { + assert!(normalize_workspace(" ").is_none()); + } + + #[test] + fn normalize_workspace_trims_and_returns_some() { + assert_eq!(normalize_workspace(" a "), Some(String::from("a"))); + } + + #[test] + fn normalize_workspace_no_trim_needed() { + assert_eq!(normalize_workspace("ws1"), Some(String::from("ws1"))); + } + + #[test] + fn list_workspaces_empty_db() { + let conn = mem_conn(); + let rows = list_workspaces(&conn).unwrap(); + assert!(rows.is_empty()); + } + + #[test] + fn list_workspaces_excludes_null_and_empty() { + let mut conn = mem_conn(); + let base = crate::cli::RecordArgs { + cmd: String::from("echo"), + dir: Some(String::from("/tmp")), + exit_code: 0, + duration: 0, + timestamp: Some(1700000000), + tags: String::from("[]"), + terminal_id: None, + workspace: None, + }; + crate::recorder::record_inner(&base, 30, &mut conn).unwrap(); + let rows = list_workspaces(&conn).unwrap(); + assert!(rows.is_empty(), "NULL workspace must be excluded"); + } + + #[test] + fn list_workspaces_groups_counts_orders_by_last_desc() { + let mut conn = mem_conn(); + + let ws_a_early = crate::cli::RecordArgs { + cmd: String::from("cmd1"), + dir: Some(String::from("/tmp")), + exit_code: 0, + duration: 0, + timestamp: Some(1700000001), + tags: String::from("[]"), + terminal_id: None, + workspace: Some(String::from("ws-a")), + }; + crate::recorder::record_inner(&ws_a_early, 30, &mut conn).unwrap(); + + let ws_a_late = crate::cli::RecordArgs { + cmd: String::from("cmd2"), + dir: Some(String::from("/tmp")), + exit_code: 0, + duration: 0, + timestamp: Some(1700000003), + tags: String::from("[]"), + terminal_id: None, + workspace: Some(String::from("ws-a")), + }; + crate::recorder::record_inner(&ws_a_late, 30, &mut conn).unwrap(); + + let ws_b = crate::cli::RecordArgs { + cmd: String::from("cmd3"), + dir: Some(String::from("/tmp")), + exit_code: 0, + duration: 0, + timestamp: Some(1700000002), + tags: String::from("[]"), + terminal_id: None, + workspace: Some(String::from("ws-b")), + }; + crate::recorder::record_inner(&ws_b, 30, &mut conn).unwrap(); + + let rows = list_workspaces(&conn).unwrap(); + assert_eq!(rows.len(), 2); + assert_eq!(rows[0].name, "ws-a"); + assert_eq!(rows[0].command_count, 2); + assert_eq!(rows[0].last_ts, 1700000003); + assert_eq!(rows[1].name, "ws-b"); + assert_eq!(rows[1].command_count, 1); + } +} From 1e7175555ef85a16096fc65338beb7054d11f23c Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:29:59 -0600 Subject: [PATCH 100/151] feat(search): add workspace field to CommandRow (#50) --- src/search.rs | 13 ++++++++++++- src/tui/event.rs | 2 ++ src/tui/fuzzy.rs | 1 + src/tui/render.rs | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/search.rs b/src/search.rs index fbcb77c..38b6020 100644 --- a/src/search.rs +++ b/src/search.rs @@ -122,6 +122,7 @@ pub struct CommandRow { pub directory: String, pub command: String, pub session_id: String, + pub workspace: Option, } pub fn parse_duration(s: &str) -> Result<(Ordering, i64), ThothError> { @@ -214,7 +215,7 @@ pub fn build_query( args: &SearchArgs, now: i64, ) -> Result<(String, Vec>), ThothError> { - let cols = "c.timestamp, c.project, c.tags, c.exit_code, c.duration_ms, c.directory, c.command, c.session_id"; + let cols = "c.timestamp, c.project, c.tags, c.exit_code, c.duration_ms, c.directory, c.command, c.session_id, c.workspace"; let tokens: Vec = match &args.query { Some(q) => q @@ -327,6 +328,7 @@ pub fn execute( directory: row.get(5)?, command: row.get(6)?, session_id: row.get(7)?, + workspace: row.get(8)?, }) }, )?; @@ -415,6 +417,10 @@ fn exit_cell(code: i64) -> Cell { } } +pub fn fmt_timestamp_pub(epoch: i64) -> String { + fmt_timestamp(epoch) +} + pub(crate) fn fmt_timestamp(epoch: i64) -> String { let secs = epoch; let days = secs.div_euclid(SECS_PER_DAY); @@ -909,6 +915,7 @@ mod tests { directory: "/home/user/alpha".into(), command: "cargo build".into(), session_id: "session-aaa".into(), + workspace: None, }, CommandRow { timestamp: 1_700_001_000, @@ -919,6 +926,7 @@ mod tests { directory: "/home/user/beta".into(), command: "make test".into(), session_id: "session-bbb".into(), + workspace: None, }, ] } @@ -952,6 +960,7 @@ mod tests { directory: "/home/user/alpha".into(), command: "cmd_a".into(), session_id: "session-aaa".into(), + workspace: None, }, CommandRow { timestamp: 1_700_001_000, @@ -962,6 +971,7 @@ mod tests { directory: "/home/user/alpha".into(), command: "cmd_b".into(), session_id: "session-aaa".into(), + workspace: None, }, CommandRow { timestamp: 1_700_002_000, @@ -972,6 +982,7 @@ mod tests { directory: "/home/user/beta".into(), command: "cmd_c".into(), session_id: "session-bbb".into(), + workspace: None, }, ]; let out = render(&rows, &default_columns(), true); diff --git a/src/tui/event.rs b/src/tui/event.rs index e8fc0a9..cae718f 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -140,6 +140,7 @@ mod tests { directory: String::from("/tmp"), command: String::from("git status"), session_id: String::from("s1"), + workspace: None, }, crate::search::CommandRow { timestamp: 1000, @@ -150,6 +151,7 @@ mod tests { directory: String::from("/tmp"), command: String::from("ls -la"), session_id: String::from("s1"), + workspace: None, }, ]; app.recompute(); diff --git a/src/tui/fuzzy.rs b/src/tui/fuzzy.rs index f0b195a..c3ee4ed 100644 --- a/src/tui/fuzzy.rs +++ b/src/tui/fuzzy.rs @@ -41,6 +41,7 @@ mod tests { directory: String::new(), command: command.to_string(), session_id: String::new(), + workspace: None, } } diff --git a/src/tui/render.rs b/src/tui/render.rs index f1e096d..894f353 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -570,6 +570,7 @@ mod tests { tags: "[]".to_string(), session_id: "s1".to_string(), duration_ms: 100, + workspace: None, } } From 81c35f11e12e7e181636a2f51bde497eb5bba423 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:30:04 -0600 Subject: [PATCH 101/151] feat(recorder): thread workspace through record_inner and INSERT (#50) --- src/recorder.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++++--- src/tags.rs | 1 + 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/recorder.rs b/src/recorder.rs index 82a3925..53fee6c 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -27,6 +27,10 @@ pub fn record_inner( conn: &mut Connection, ) -> Result<(), ThothError> { let tags = normalize_tags(&args.tags); + let workspace = args + .workspace + .as_deref() + .and_then(crate::workspaces::normalize_workspace); let directory = args.dir.clone().unwrap_or_else(|| { std::env::current_dir() .unwrap_or_default() @@ -46,8 +50,8 @@ pub fn record_inner( let sid = get_or_create(&project, timestamp, gap_minutes, &tx)?; tx.execute( - "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id) \ - VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)", + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id, workspace) \ + VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)", rusqlite::params![ args.cmd, directory, @@ -57,7 +61,8 @@ pub fn record_inner( args.exit_code, args.duration, tags, - args.terminal_id + args.terminal_id, + workspace ], )?; @@ -150,6 +155,7 @@ mod tests { timestamp: Some(1700000000), tags: String::from("[]"), terminal_id: None, + workspace: None, } } @@ -242,6 +248,7 @@ mod tests { timestamp: Some(1700000000), tags: String::from("[]"), terminal_id: None, + workspace: None, }; record_inner(&args, DEFAULT_GAP, &mut conn).unwrap(); let count: i64 = conn @@ -384,4 +391,57 @@ mod tests { .unwrap(); assert_eq!(count, 1); } + + #[test] + fn workspace_stored_when_provided() { + let mut conn = mem_conn(); + let args = RecordArgs { + workspace: Some(String::from("ws1")), + ..base_args() + }; + record_inner(&args, DEFAULT_GAP, &mut conn).unwrap(); + let val: Option = conn + .query_row( + "SELECT workspace FROM commands WHERE command='echo hi'", + [], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(val, Some(String::from("ws1"))); + } + + #[test] + fn workspace_null_when_none() { + let mut conn = mem_conn(); + record_inner(&base_args(), DEFAULT_GAP, &mut conn).unwrap(); + let val: Option = conn + .query_row( + "SELECT workspace FROM commands WHERE command='echo hi'", + [], + |r| r.get(0), + ) + .unwrap(); + assert!(val.is_none()); + } + + #[test] + fn workspace_null_when_empty_string() { + let mut conn = mem_conn(); + let args = RecordArgs { + workspace: Some(String::from("")), + ..base_args() + }; + record_inner(&args, DEFAULT_GAP, &mut conn).unwrap(); + let val: Option = conn + .query_row( + "SELECT workspace FROM commands WHERE command='echo hi'", + [], + |r| r.get(0), + ) + .unwrap(); + assert!( + val.is_none(), + "empty workspace string must normalize to NULL" + ); + } } diff --git a/src/tags.rs b/src/tags.rs index 070ef54..6ab0197 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -192,6 +192,7 @@ mod tests { timestamp: Some(1000), tags: r#"["fix","perf"]"#.into(), terminal_id: None, + workspace: None, }; let mut a1 = args_base.clone(); a1.timestamp = Some(1001); From d96f717a91ba70862fc8ce4296c0586ee08104f4 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:30:07 -0600 Subject: [PATCH 102/151] feat(cli): add workspace/workspaces subcommands and --workspace flag (#50) --- src/cli.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/hooks.rs | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/cli.rs b/src/cli.rs index 968e521..6af3f60 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -59,6 +59,10 @@ pub enum Cmd { NewSessionId, #[command(about = "Show and manage the effective configuration")] Config(ConfigArgs), + #[command(about = "Start or end a workspace session (use tth-sw / tth-ew shell functions)")] + Workspace(WorkspaceArgs), + #[command(about = "List recorded workspaces with command counts")] + Workspaces, } #[derive(clap::Args, Debug, Clone)] @@ -93,6 +97,26 @@ pub struct ConfigSetArgs { pub value: String, } +#[derive(clap::Args, Debug, Clone)] +pub struct WorkspaceArgs { + #[command(subcommand)] + pub action: WorkspaceAction, +} + +#[derive(clap::Subcommand, Debug, Clone)] +pub enum WorkspaceAction { + #[command(about = "Activate a workspace by name (eval the output)")] + Start(WorkspaceStartArgs), + #[command(about = "Deactivate the current workspace (eval the output)")] + End, +} + +#[derive(clap::Args, Debug, Clone)] +pub struct WorkspaceStartArgs { + #[arg(help = "Workspace name to activate")] + pub name: String, +} + #[derive(clap::Args, Debug, Clone)] pub struct ForgetArgs { #[arg( @@ -129,6 +153,8 @@ pub struct RecordArgs { pub tags: String, #[arg(long = "terminal-id", help = "Identifier for the terminal session")] pub terminal_id: Option, + #[arg(long, help = "Active workspace name (set by the shell hook)")] + pub workspace: Option, } #[derive(clap::Args, Debug, Clone)] @@ -615,6 +641,39 @@ pub fn run() -> Result<(), crate::error::ThothError> { } } } + Some(Cmd::Workspace(args)) => match args.action { + WorkspaceAction::Start(a) => { + if a.name.is_empty() { + return Err(crate::error::ThothError::Hook( + "workspace name cannot be empty".into(), + )); + } + print!("{}", crate::workspaces::start_line(&a.name)); + eprintln!("Active workspace: {}", a.name); + } + WorkspaceAction::End => { + print!("{}", crate::workspaces::end_line()); + eprintln!("Workspace deactivated."); + } + }, + Some(Cmd::Workspaces) => { + let conn = crate::database::get_connection(None)?; + let rows = crate::workspaces::list_workspaces(&conn)?; + if rows.is_empty() { + println!("(no workspaces recorded)"); + } else { + use comfy_table::{presets::UTF8_BORDERS_ONLY, ContentArrangement, Table}; + let mut table = Table::new(); + table.load_preset(UTF8_BORDERS_ONLY); + table.set_content_arrangement(ContentArrangement::Dynamic); + table.set_header(vec!["workspace", "commands", "last used"]); + for row in &rows { + let last = crate::search::fmt_timestamp_pub(row.last_ts); + table.add_row(vec![row.name.clone(), row.command_count.to_string(), last]); + } + println!("{table}"); + } + } } Ok(()) } diff --git a/src/hooks.rs b/src/hooks.rs index 02680e7..29288ec 100644 --- a/src/hooks.rs +++ b/src/hooks.rs @@ -426,7 +426,7 @@ mod tests { let conn = mem_conn(); let s = status(&conn, &rc, false, false); assert!(s.hooks_installed); - assert_eq!(s.schema_version, 3); + assert_eq!(s.schema_version, 4); assert_eq!(s.total_commands, 0); } From 52d223f9de63e44798713520a01d24972e5a1523 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:30:12 -0600 Subject: [PATCH 103/151] feat(shells): add tth-sw/tth-ew functions and --workspace hook arg (#50) --- shells/thoth.bash | 11 ++++++++++- shells/thoth.zsh | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/shells/thoth.bash b/shells/thoth.bash index 6096597..3c3a9e3 100644 --- a/shells/thoth.bash +++ b/shells/thoth.bash @@ -33,7 +33,8 @@ _thoth_precmd() { --duration "$_dur" \ --timestamp "$EPOCHSECONDS" \ --tags "${TTH_ACTIVE_TAGS:-[]}" \ - --terminal-id "$TTH_SESSION_ID" & ) + --terminal-id "$TTH_SESSION_ID" \ + --workspace "${TTH_ACTIVE_WORKSPACE:-}" & ) _THOTH_CMD="" _THOTH_IN_PROMPT=0 } @@ -81,3 +82,11 @@ tth-untag() { eval "$(command tth untag "$1")" fi } + +tth-sw() { + eval "$(command tth workspace start "$1")" +} + +tth-ew() { + eval "$(command tth workspace end)" +} diff --git a/shells/thoth.zsh b/shells/thoth.zsh index 6b503a9..90a3179 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -25,7 +25,8 @@ _tth_precmd() { --duration "$_dur" \ --timestamp "$EPOCHSECONDS" \ --tags "${TTH_ACTIVE_TAGS:-[]}" \ - --terminal-id "$TTH_SESSION_ID" &! + --terminal-id "$TTH_SESSION_ID" \ + --workspace "${TTH_ACTIVE_WORKSPACE:-}" &! _TTH_CMD="" } @@ -44,6 +45,14 @@ tth-untag() { fi } +tth-sw() { + eval "$(command tth workspace start "$1")" +} + +tth-ew() { + eval "$(command tth workspace end)" +} + _tth_widget() { command -v tth >/dev/null 2>&1 || return local out From 9af3f45ec27757e0ecf77f2c925591deb4ed0b29 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:45:55 -0600 Subject: [PATCH 104/151] feat(tui): replace Sessions tab with read-only Workspaces tab (#52) --- src/tui/app.rs | 389 ++++++++++++++++++---------------------------- src/tui/event.rs | 131 ++++++++-------- src/tui/mod.rs | 12 +- src/tui/render.rs | 155 +++++++++--------- src/workspaces.rs | 84 ++++++++++ 5 files changed, 382 insertions(+), 389 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index f5283ac..0831cac 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -3,8 +3,8 @@ use rusqlite::Connection; use crate::cli::SearchArgs; use crate::error::ThothError; use crate::search::{CommandRow, ExitFilter}; -use crate::sessions::{list_sessions, SessionRow, SessionsArgs}; use crate::tui::fuzzy; +use crate::workspaces::WorkspaceRow; const TUI_LIMIT: usize = 5000; @@ -12,7 +12,7 @@ const TUI_LIMIT: usize = 5000; pub enum Tab { #[default] History, - Sessions, + Workspaces, } pub struct FilterState { @@ -71,11 +71,11 @@ pub struct App { pub filters: FilterState, pub action: Option, pub tab: Tab, - pub sessions: Vec, - pub session_selected: usize, - pub session_commands: Vec, - pub needs_session_reload: bool, - pub needs_session_commands_reload: bool, + pub workspaces: Vec, + pub ws_selected: usize, + pub ws_commands: Vec, + pub needs_ws_reload: bool, + pub needs_ws_commands_reload: bool, pub needs_history_reload: bool, } @@ -95,11 +95,11 @@ impl App { filters: FilterState::new(), action: None, tab: Tab::History, - sessions: vec![], - session_selected: 0, - session_commands: vec![], - needs_session_reload: false, - needs_session_commands_reload: false, + workspaces: vec![], + ws_selected: 0, + ws_commands: vec![], + needs_ws_reload: false, + needs_ws_commands_reload: false, needs_history_reload: false, } } @@ -110,42 +110,31 @@ impl App { pub fn next_tab(&mut self) { if self.tab == Tab::History { - self.tab = Tab::Sessions; - if self.sessions.is_empty() { - self.needs_session_reload = true; - self.needs_session_commands_reload = true; + self.tab = Tab::Workspaces; + if self.workspaces.is_empty() { + self.needs_ws_reload = true; + self.needs_ws_commands_reload = true; } } } - pub fn session_move_up(&mut self) { - if self.session_selected > 0 { - self.session_selected -= 1; - self.needs_session_commands_reload = true; + pub fn ws_move_up(&mut self) { + if self.ws_selected > 0 { + self.ws_selected -= 1; + self.needs_ws_commands_reload = true; } } - pub fn session_move_down(&mut self) { - let max = self.sessions.len().saturating_sub(1); - if self.session_selected < max { - self.session_selected += 1; - self.needs_session_commands_reload = true; + pub fn ws_move_down(&mut self) { + let max = self.workspaces.len().saturating_sub(1); + if self.ws_selected < max { + self.ws_selected += 1; + self.needs_ws_commands_reload = true; } } - pub fn selected_session(&self) -> Option<&SessionRow> { - self.sessions.get(self.session_selected) - } - - pub fn open_session(&mut self) { - if let Some(s) = self.selected_session() { - let id = s.id.clone(); - self.filters.session = Some(id); - self.tab = Tab::History; - self.query.clear(); - self.selected = 0; - self.needs_history_reload = true; - } + pub fn selected_workspace(&self) -> Option<&WorkspaceRow> { + self.workspaces.get(self.ws_selected) } pub fn reload(&mut self, conn: &Connection, now: i64) -> Result<(), ThothError> { @@ -155,46 +144,25 @@ impl App { Ok(()) } - pub fn reload_sessions(&mut self, conn: &Connection, now: i64) -> Result<(), ThothError> { - let args = SessionsArgs { - project: None, - since: None, - until: None, - limit: TUI_LIMIT, - }; - self.sessions = list_sessions(conn, &args, now)?; - let max = self.sessions.len().saturating_sub(1); - if self.session_selected > max { - self.session_selected = 0; + pub fn reload_workspaces(&mut self, conn: &Connection) -> Result<(), ThothError> { + self.workspaces = crate::workspaces::list_workspaces(conn)?; + let max = self.workspaces.len().saturating_sub(1); + if self.ws_selected > max { + self.ws_selected = 0; } - self.needs_session_reload = false; - self.needs_session_commands_reload = true; + self.needs_ws_reload = false; + self.needs_ws_commands_reload = true; Ok(()) } - pub fn reload_session_commands( - &mut self, - conn: &Connection, - now: i64, - ) -> Result<(), ThothError> { - if let Some(s) = self.selected_session() { - let args = SearchArgs { - query: None, - project: None, - tag: vec![], - exit: None, - duration: None, - since: None, - until: None, - session: Some(s.id.clone()), - limit: Some(TUI_LIMIT), - show_session: false, - }; - self.session_commands = crate::search::execute(&args, conn, now)?; + pub fn reload_ws_commands(&mut self, conn: &Connection) -> Result<(), ThothError> { + if let Some(ws) = self.selected_workspace() { + let name = ws.name.clone(); + self.ws_commands = crate::workspaces::list_workspace_commands(conn, &name)?; } else { - self.session_commands.clear(); + self.ws_commands.clear(); } - self.needs_session_commands_reload = false; + self.needs_ws_commands_reload = false; Ok(()) } @@ -244,25 +212,11 @@ mod tests { .unwrap(); } - fn seed_session(conn: &Connection, id: &str, project: &str, started: i64) { + fn seed_ws_command(conn: &Connection, ws: &str, cmd: &str, ts: i64) { conn.execute( - "INSERT INTO sessions(session_id, project, started_at, ended_at, command_count) \ - VALUES(?1, ?2, ?3, ?3, 0)", - rusqlite::params![id, project, started], - ) - .unwrap(); - } - - fn seed_command_for_session(conn: &Connection, session_id: &str, cmd: &str, ts: i64) { - conn.execute( - "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags) \ - VALUES(?1, '/tmp', 'p', ?2, ?3, 0, 100, '[]')", - rusqlite::params![cmd, session_id, ts], - ) - .unwrap(); - conn.execute( - "UPDATE sessions SET command_count = command_count + 1 WHERE session_id = ?1", - rusqlite::params![session_id], + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, workspace) \ + VALUES(?1, '/tmp', 'p', 's1', ?2, 0, 100, '[]', ?3)", + rusqlite::params![cmd, ts, ws], ) .unwrap(); } @@ -316,185 +270,137 @@ mod tests { } #[test] - fn next_tab_from_history_goes_to_sessions() { + fn next_tab_from_history_goes_to_workspaces() { let mut app = App::new(); - app.sessions = vec![SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 1000, - ended_at: 2000, + app.workspaces = vec![WorkspaceRow { + name: "ws1".into(), command_count: 1, - tags: vec![], + first_ts: 1000, + last_ts: 2000, }]; app.next_tab(); - assert_eq!(app.tab, Tab::Sessions); + assert_eq!(app.tab, Tab::Workspaces); } #[test] - fn next_tab_from_sessions_stays_sessions() { + fn next_tab_from_workspaces_stays_workspaces() { let mut app = App::new(); - app.tab = Tab::Sessions; - app.sessions = vec![SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 1000, - ended_at: 2000, + app.tab = Tab::Workspaces; + app.workspaces = vec![WorkspaceRow { + name: "ws1".into(), command_count: 1, - tags: vec![], + first_ts: 1000, + last_ts: 2000, }]; app.next_tab(); - assert_eq!(app.tab, Tab::Sessions); + assert_eq!(app.tab, Tab::Workspaces); } #[test] - fn prev_tab_from_sessions_goes_to_history() { + fn prev_tab_from_workspaces_goes_to_history() { let mut app = App::new(); - app.tab = Tab::Sessions; + app.tab = Tab::Workspaces; app.prev_tab(); assert_eq!(app.tab, Tab::History); } #[test] - fn next_tab_with_empty_sessions_sets_reload_flag() { + fn next_tab_with_empty_workspaces_sets_reload_flag() { let mut app = App::new(); - assert!(app.sessions.is_empty()); + assert!(app.workspaces.is_empty()); app.next_tab(); assert!( - app.needs_session_reload, - "must set needs_session_reload when sessions is empty" + app.needs_ws_reload, + "must set needs_ws_reload when workspaces is empty" ); - assert!(app.needs_session_commands_reload); + assert!(app.needs_ws_commands_reload); } #[test] - fn next_tab_with_existing_sessions_does_not_set_reload_flag() { + fn next_tab_with_existing_workspaces_does_not_set_reload_flag() { let mut app = App::new(); - app.sessions = vec![SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 1000, - ended_at: 2000, + app.workspaces = vec![WorkspaceRow { + name: "ws1".into(), command_count: 1, - tags: vec![], + first_ts: 1000, + last_ts: 2000, }]; app.next_tab(); - assert!(!app.needs_session_reload); + assert!(!app.needs_ws_reload); } #[test] - fn session_move_up_decreases_index() { + fn ws_move_up_decreases_index() { let mut app = App::new(); - app.sessions = vec![ - SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 2000, - ended_at: 3000, - command_count: 0, - tags: vec![], + app.workspaces = vec![ + WorkspaceRow { + name: "ws-a".into(), + command_count: 2, + first_ts: 1000, + last_ts: 3000, }, - SessionRow { - id: "s2".into(), - project: "p".into(), - started_at: 1000, - ended_at: 2000, - command_count: 0, - tags: vec![], + WorkspaceRow { + name: "ws-b".into(), + command_count: 1, + first_ts: 2000, + last_ts: 2000, }, ]; - app.session_selected = 1; - app.session_move_up(); - assert_eq!(app.session_selected, 0); - assert!(app.needs_session_commands_reload); + app.ws_selected = 1; + app.ws_move_up(); + assert_eq!(app.ws_selected, 0); + assert!(app.needs_ws_commands_reload); } #[test] - fn session_move_up_clamps_at_top() { + fn ws_move_up_clamps_at_top() { let mut app = App::new(); - app.sessions = vec![SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 2000, - ended_at: 3000, - command_count: 0, - tags: vec![], + app.workspaces = vec![WorkspaceRow { + name: "ws1".into(), + command_count: 1, + first_ts: 1000, + last_ts: 2000, }]; - app.session_selected = 0; - app.session_move_up(); - assert_eq!(app.session_selected, 0); + app.ws_selected = 0; + app.ws_move_up(); + assert_eq!(app.ws_selected, 0); } #[test] - fn session_move_down_increases_index() { + fn ws_move_down_increases_index() { let mut app = App::new(); - app.sessions = vec![ - SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 2000, - ended_at: 3000, - command_count: 0, - tags: vec![], + app.workspaces = vec![ + WorkspaceRow { + name: "ws-a".into(), + command_count: 2, + first_ts: 1000, + last_ts: 3000, }, - SessionRow { - id: "s2".into(), - project: "p".into(), - started_at: 1000, - ended_at: 2000, - command_count: 0, - tags: vec![], + WorkspaceRow { + name: "ws-b".into(), + command_count: 1, + first_ts: 2000, + last_ts: 2000, }, ]; - app.session_selected = 0; - app.session_move_down(); - assert_eq!(app.session_selected, 1); - assert!(app.needs_session_commands_reload); - } - - #[test] - fn session_move_down_clamps_at_bottom() { - let mut app = App::new(); - app.sessions = vec![SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 2000, - ended_at: 3000, - command_count: 0, - tags: vec![], - }]; - app.session_selected = 0; - app.session_move_down(); - assert_eq!(app.session_selected, 0); + app.ws_selected = 0; + app.ws_move_down(); + assert_eq!(app.ws_selected, 1); + assert!(app.needs_ws_commands_reload); } #[test] - fn open_session_sets_filter_and_tab() { + fn ws_move_down_clamps_at_bottom() { let mut app = App::new(); - app.sessions = vec![SessionRow { - id: "session-abc".into(), - project: "proj".into(), - started_at: 1000, - ended_at: 2000, + app.workspaces = vec![WorkspaceRow { + name: "ws1".into(), command_count: 1, - tags: vec![], + first_ts: 1000, + last_ts: 2000, }]; - app.tab = Tab::Sessions; - app.query = "something".into(); - app.selected = 5; - app.open_session(); - assert_eq!(app.filters.session, Some("session-abc".into())); - assert_eq!(app.tab, Tab::History); - assert_eq!(app.query, ""); - assert_eq!(app.selected, 0); - assert!(app.needs_history_reload); - } - - #[test] - fn open_session_noop_when_no_sessions() { - let mut app = App::new(); - app.open_session(); - assert!(app.filters.session.is_none()); - assert_eq!(app.tab, Tab::History); + app.ws_selected = 0; + app.ws_move_down(); + assert_eq!(app.ws_selected, 0); } #[test] @@ -508,37 +414,52 @@ mod tests { } #[test] - fn reload_sessions_populates_sessions() { + fn reload_workspaces_populates_workspaces() { let conn = make_conn(); - seed_session(&conn, "sid-a", "proj-a", 1000); - seed_session(&conn, "sid-b", "proj-b", 2000); + seed_ws_command(&conn, "ws-a", "cmd1", 1000); + seed_ws_command(&conn, "ws-b", "cmd2", 2000); let mut app = App::new(); - app.reload_sessions(&conn, 9999).unwrap(); - assert_eq!(app.sessions.len(), 2); - assert!(!app.needs_session_reload); - assert!(app.needs_session_commands_reload); + app.reload_workspaces(&conn).unwrap(); + assert_eq!(app.workspaces.len(), 2); + assert!(!app.needs_ws_reload); + assert!(app.needs_ws_commands_reload); } #[test] - fn reload_session_commands_filters_by_selected_session() { + fn reload_ws_commands_filters_by_selected_workspace() { let conn = make_conn(); - seed_session(&conn, "sid-a", "proj", 1000); - seed_session(&conn, "sid-b", "proj", 2000); - seed_command_for_session(&conn, "sid-a", "cmd-for-a", 1100); - seed_command_for_session(&conn, "sid-b", "cmd-for-b", 2100); + seed_ws_command(&conn, "ws-a", "cmd-for-a", 1100); + seed_ws_command(&conn, "ws-b", "cmd-for-b", 2100); let mut app = App::new(); - app.reload_sessions(&conn, 9999).unwrap(); + app.reload_workspaces(&conn).unwrap(); + + app.ws_selected = 1; + app.reload_ws_commands(&conn).unwrap(); + assert_eq!(app.ws_commands.len(), 1); + assert_eq!(app.ws_commands[0].command, "cmd-for-a"); + + app.ws_selected = 0; + app.reload_ws_commands(&conn).unwrap(); + assert_eq!(app.ws_commands.len(), 1); + assert_eq!(app.ws_commands[0].command, "cmd-for-b"); + } - app.session_selected = 1; - app.reload_session_commands(&conn, 9999).unwrap(); - assert_eq!(app.session_commands.len(), 1); - assert_eq!(app.session_commands[0].command, "cmd-for-a"); + #[test] + fn reload_ws_commands_returns_asc_order() { + let conn = make_conn(); + seed_ws_command(&conn, "ws-x", "first", 1000); + seed_ws_command(&conn, "ws-x", "second", 2000); + seed_ws_command(&conn, "ws-x", "third", 3000); - app.session_selected = 0; - app.reload_session_commands(&conn, 9999).unwrap(); - assert_eq!(app.session_commands.len(), 1); - assert_eq!(app.session_commands[0].command, "cmd-for-b"); + let mut app = App::new(); + app.reload_workspaces(&conn).unwrap(); + app.ws_selected = 0; + app.reload_ws_commands(&conn).unwrap(); + assert_eq!(app.ws_commands.len(), 3); + assert_eq!(app.ws_commands[0].command, "first"); + assert_eq!(app.ws_commands[1].command, "second"); + assert_eq!(app.ws_commands[2].command, "third"); } #[test] diff --git a/src/tui/event.rs b/src/tui/event.rs index cae718f..4233bda 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -30,7 +30,7 @@ pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { match app.tab { Tab::History => handle_history_key(key, app), - Tab::Sessions => handle_sessions_key(key, app), + Tab::Workspaces => handle_ws_key(key, app), } } @@ -78,26 +78,23 @@ fn handle_history_key(key: KeyEvent, app: &mut App) -> Outcome { } } -fn handle_sessions_key(key: KeyEvent, app: &mut App) -> Outcome { +fn handle_ws_key(key: KeyEvent, app: &mut App) -> Outcome { match key.code { - KeyCode::Enter => { - app.open_session(); - Outcome::Continue - } + KeyCode::Enter => Outcome::Continue, KeyCode::Up => { - app.session_move_up(); + app.ws_move_up(); Outcome::Continue } KeyCode::Char('p') if key.modifiers.contains(KeyModifiers::CONTROL) => { - app.session_move_up(); + app.ws_move_up(); Outcome::Continue } KeyCode::Down => { - app.session_move_down(); + app.ws_move_down(); Outcome::Continue } KeyCode::Char('n') if key.modifiers.contains(KeyModifiers::CONTROL) => { - app.session_move_down(); + app.ws_move_down(); Outcome::Continue } _ => Outcome::Continue, @@ -107,7 +104,7 @@ fn handle_sessions_key(key: KeyEvent, app: &mut App) -> Outcome { #[cfg(test)] mod tests { use super::*; - use crate::sessions::SessionRow; + use crate::workspaces::WorkspaceRow; use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; fn key(code: KeyCode) -> KeyEvent { @@ -158,28 +155,24 @@ mod tests { app } - fn app_with_sessions() -> App { + fn app_with_workspaces() -> App { let mut app = App::new(); - app.tab = Tab::Sessions; - app.sessions = vec![ - SessionRow { - id: "sid-new".into(), - project: "proj".into(), - started_at: 2000, - ended_at: 3000, - command_count: 1, - tags: vec![], + app.tab = Tab::Workspaces; + app.workspaces = vec![ + WorkspaceRow { + name: "ws-new".into(), + command_count: 3, + first_ts: 1000, + last_ts: 3000, }, - SessionRow { - id: "sid-old".into(), - project: "proj".into(), - started_at: 1000, - ended_at: 2000, + WorkspaceRow { + name: "ws-old".into(), command_count: 1, - tags: vec![], + first_ts: 500, + last_ts: 1000, }, ]; - app.session_selected = 0; + app.ws_selected = 0; app } @@ -328,40 +321,36 @@ mod tests { #[test] fn left_switches_to_history_tab() { let mut app = App::new(); - app.tab = Tab::Sessions; + app.tab = Tab::Workspaces; handle_key(key(KeyCode::Left), &mut app); assert_eq!(app.tab, Tab::History); } #[test] - fn right_switches_to_sessions_tab() { + fn right_switches_to_workspaces_tab() { let mut app = App::new(); - app.sessions = vec![SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 1000, - ended_at: 2000, - command_count: 0, - tags: vec![], + app.workspaces = vec![WorkspaceRow { + name: "ws1".into(), + command_count: 1, + first_ts: 1000, + last_ts: 2000, }]; handle_key(key(KeyCode::Right), &mut app); - assert_eq!(app.tab, Tab::Sessions); + assert_eq!(app.tab, Tab::Workspaces); } #[test] - fn right_on_sessions_stays_sessions() { + fn right_on_workspaces_stays_workspaces() { let mut app = App::new(); - app.tab = Tab::Sessions; - app.sessions = vec![SessionRow { - id: "s1".into(), - project: "p".into(), - started_at: 1000, - ended_at: 2000, - command_count: 0, - tags: vec![], + app.tab = Tab::Workspaces; + app.workspaces = vec![WorkspaceRow { + name: "ws1".into(), + command_count: 1, + first_ts: 1000, + last_ts: 2000, }]; handle_key(key(KeyCode::Right), &mut app); - assert_eq!(app.tab, Tab::Sessions); + assert_eq!(app.tab, Tab::Workspaces); } #[test] @@ -373,60 +362,62 @@ mod tests { } #[test] - fn sessions_up_changes_session_selected_not_history_selected() { - let mut app = app_with_sessions(); - app.session_selected = 1; + fn ws_up_changes_ws_selected_not_history_selected() { + let mut app = app_with_workspaces(); + app.ws_selected = 1; let history_selected_before = app.selected; handle_key(key(KeyCode::Up), &mut app); assert_eq!( app.selected, history_selected_before, "history selected must not change" ); - assert_eq!(app.session_selected, 0); + assert_eq!(app.ws_selected, 0); } #[test] - fn sessions_down_increases_session_selected() { - let mut app = app_with_sessions(); - app.session_selected = 0; + fn ws_down_increases_ws_selected() { + let mut app = app_with_workspaces(); + app.ws_selected = 0; handle_key(key(KeyCode::Down), &mut app); - assert_eq!(app.session_selected, 1); + assert_eq!(app.ws_selected, 1); } #[test] - fn sessions_enter_is_continue_not_exit() { - let mut app = app_with_sessions(); + fn ws_enter_is_continue_not_exit() { + let mut app = app_with_workspaces(); let outcome = handle_key(key(KeyCode::Enter), &mut app); assert!( matches!(outcome, Outcome::Continue), - "Sessions Enter must be Continue" + "Workspaces Enter must be Continue (no-op in PR2)" ); } #[test] - fn sessions_enter_sets_history_reload_and_switches_tab() { - let mut app = app_with_sessions(); + fn ws_enter_does_not_change_tab_or_filters() { + let mut app = app_with_workspaces(); handle_key(key(KeyCode::Enter), &mut app); - assert!(app.needs_history_reload); - assert_eq!(app.tab, Tab::History); - assert_eq!(app.filters.session, Some("sid-new".into())); + assert_eq!(app.tab, Tab::Workspaces, "Enter must not change tab"); + assert!( + app.filters.session.is_none(), + "Enter must not set session filter" + ); } #[test] - fn sessions_char_does_not_modify_query() { - let mut app = app_with_sessions(); + fn ws_char_does_not_modify_query() { + let mut app = app_with_workspaces(); handle_key(key(KeyCode::Char('g')), &mut app); - assert_eq!(app.query, "", "typing in Sessions must not modify query"); + assert_eq!(app.query, "", "typing in Workspaces must not modify query"); } #[test] - fn sessions_backspace_does_not_modify_query() { - let mut app = app_with_sessions(); + fn ws_backspace_does_not_modify_query() { + let mut app = app_with_workspaces(); app.query = "existing".into(); handle_key(key(KeyCode::Backspace), &mut app); assert_eq!( app.query, "existing", - "backspace in Sessions must not modify query" + "backspace in Workspaces must not modify query" ); } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 9ab7820..5a6feee 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -90,14 +90,14 @@ pub fn run( match handle_key(key, &mut app) { Outcome::Exit => break, Outcome::Continue => { - if app.needs_session_reload { - app.reload_sessions(conn, now).map_err(|e| { - ThothError::Tui(format!("session reload failed: {e}")) + if app.needs_ws_reload { + app.reload_workspaces(conn).map_err(|e| { + ThothError::Tui(format!("workspace reload failed: {e}")) })?; } - if app.needs_session_commands_reload { - app.reload_session_commands(conn, now).map_err(|e| { - ThothError::Tui(format!("session commands reload failed: {e}")) + if app.needs_ws_commands_reload { + app.reload_ws_commands(conn).map_err(|e| { + ThothError::Tui(format!("workspace commands reload failed: {e}")) })?; } if app.needs_history_reload { diff --git a/src/tui/render.rs b/src/tui/render.rs index 894f353..7bcc84a 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -7,9 +7,9 @@ use ratatui::{ }; use crate::search::{Column, CommandRow}; -use crate::sessions::SessionRow; use crate::tui::app::{App, Tab}; use crate::tui::time::format_relative; +use crate::workspaces::WorkspaceRow; const ACCENT: Color = Color::Cyan; const DIM_COLOR: Color = Color::DarkGray; @@ -169,15 +169,15 @@ fn render_tab_bar(frame: &mut Frame, area: ratatui::layout::Rect, app: &App) { let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); let active_style = accent_style.add_modifier(Modifier::REVERSED); - let (history_style, sessions_style) = match app.tab { + let (history_style, workspaces_style) = match app.tab { Tab::History => (active_style, dim_style), - Tab::Sessions => (dim_style, active_style), + Tab::Workspaces => (dim_style, active_style), }; let line = Line::from(vec![ Span::styled(" History ", history_style), Span::styled(" ", dim_style), - Span::styled(" Sessions ", sessions_style), + Span::styled(" Workspaces ", workspaces_style), ]); frame.render_widget(Paragraph::new(line), area); } @@ -306,7 +306,7 @@ fn render_history_pane( frame.render_stateful_widget(table, inner_list_area, table_state); } -fn render_sessions_pane( +fn render_workspaces_pane( frame: &mut Frame, area: ratatui::layout::Rect, app: &App, @@ -324,36 +324,32 @@ fn render_sessions_pane( let left_area = h_chunks[0]; let right_area = h_chunks[1]; - let sessions_block = Block::default() + let workspaces_block = Block::default() .borders(Borders::ALL) .border_type(BorderType::Rounded) .border_style(border_style) - .title(Span::styled(" sessions ", dim_style)); + .title(Span::styled(" workspaces ", dim_style)); - let inner_left = sessions_block.inner(left_area); - frame.render_widget(sessions_block, left_area); + let inner_left = workspaces_block.inner(left_area); + frame.render_widget(workspaces_block, left_area); - if app.sessions.is_empty() { - let empty = Paragraph::new("no sessions").style(dim_style); + if app.workspaces.is_empty() { + let empty = Paragraph::new("no workspaces").style(dim_style); frame.render_widget(empty, inner_left); } else { - let rows: Vec = app.sessions.iter().map(|s| session_row(s, now)).collect(); + let rows: Vec = app.workspaces.iter().map(|w| ws_row(w, now)).collect(); let widths = vec![ - Constraint::Length(9), - Constraint::Length(16), Constraint::Min(1), + Constraint::Length(6), + Constraint::Length(9), ]; let table = Table::new(rows, widths) .block(Block::default()) .row_highlight_style(highlight_style); - if app.sessions.is_empty() { - table_state.select(None); - } else { - table_state.select(Some(app.session_selected)); - } + table_state.select(Some(app.ws_selected)); frame.render_stateful_widget(table, inner_left, table_state); } @@ -366,12 +362,12 @@ fn render_sessions_pane( let inner_right = commands_block.inner(right_area); frame.render_widget(commands_block, right_area); - if app.session_commands.is_empty() { + if app.ws_commands.is_empty() { let empty = Paragraph::new("no commands").style(dim_style); frame.render_widget(empty, inner_right); } else { let rows: Vec = app - .session_commands + .ws_commands .iter() .map(|cmd| { let time_text = truncate(&format_relative(cmd.timestamp, now), 9); @@ -402,14 +398,14 @@ fn render_sessions_pane( } } -fn session_row(s: &SessionRow, now: i64) -> Row<'static> { - let time_text = truncate(&format_relative(s.started_at, now), 9); - let project_text = truncate(&s.project, 16); - let count_text = s.command_count.to_string(); +fn ws_row(w: &WorkspaceRow, now: i64) -> Row<'static> { + let name_text = truncate(&w.name, 20); + let count_text = w.command_count.to_string(); + let last_text = truncate(&format_relative(w.last_ts, now), 9); Row::new(vec![ - Cell::from(Span::styled(time_text, Style::default().fg(DIM_COLOR))), - Cell::from(Span::styled(project_text, Style::default().fg(Color::Blue))), - Cell::from(count_text), + Cell::from(Span::styled(name_text, Style::default().fg(Color::Blue))), + Cell::from(Span::styled(count_text, Style::default().fg(DIM_COLOR))), + Cell::from(Span::styled(last_text, Style::default().fg(DIM_COLOR))), ]) } @@ -484,8 +480,8 @@ pub fn draw( table_state, ); } - Tab::Sessions => { - render_sessions_pane(frame, middle_area, app, now, table_state); + Tab::Workspaces => { + render_workspaces_pane(frame, middle_area, app, now, table_state); } } @@ -521,15 +517,12 @@ pub fn draw( Span::styled("esc", accent_style), Span::styled(" quit", dim_style), ]), - Tab::Sessions => Line::from(vec![ + Tab::Workspaces => Line::from(vec![ Span::styled(" ←→", accent_style), Span::styled(" tabs", dim_style), Span::styled(" · ", dim_style), Span::styled("↑↓", accent_style), - Span::styled(" session", dim_style), - Span::styled(" · ", dim_style), - Span::styled("↵", accent_style), - Span::styled(" open", dim_style), + Span::styled(" workspace", dim_style), Span::styled(" · ", dim_style), Span::styled("esc", accent_style), Span::styled(" quit", dim_style), @@ -551,8 +544,8 @@ pub fn format_action_line(action: Option<&crate::tui::app::Action>) -> Option SessionRow { - SessionRow { - id: id.to_string(), - project: project.to_string(), - started_at, - ended_at: started_at + 3600, + fn make_workspace(name: &str, count: i64, last_ts: i64) -> WorkspaceRow { + WorkspaceRow { + name: name.to_string(), command_count: count, - tags: vec![], + first_ts: last_ts - 3600, + last_ts, } } @@ -631,15 +622,15 @@ mod tests { app } - fn app_with_sessions() -> App { + fn app_with_workspaces() -> App { let mut app = App::new(); - app.tab = Tab::Sessions; - app.sessions = vec![ - make_session("session-abc-123", "proj-alpha", TEST_NOW - 3600, 5), - make_session("session-def-456", "proj-beta", TEST_NOW - 7200, 3), + app.tab = Tab::Workspaces; + app.workspaces = vec![ + make_workspace("proj-alpha", 5, TEST_NOW - 3600), + make_workspace("proj-beta", 3, TEST_NOW - 7200), ]; - app.session_selected = 0; - app.session_commands = vec![ + app.ws_selected = 0; + app.ws_commands = vec![ make_row("git status", TEST_NOW - 3500, 0, "proj-alpha"), make_row("cargo build", TEST_NOW - 3400, 0, "proj-alpha"), ]; @@ -651,7 +642,10 @@ mod tests { let app = app_with_rows(); let text = render_app(&app); assert!(text.contains("History"), "tab bar must show 'History'"); - assert!(text.contains("Sessions"), "tab bar must show 'Sessions'"); + assert!( + text.contains("Workspaces"), + "tab bar must show 'Workspaces'" + ); } #[test] @@ -725,22 +719,22 @@ mod tests { } #[test] - fn sessions_tab_renders_two_panes() { - let app = app_with_sessions(); + fn workspaces_tab_renders_two_panes() { + let app = app_with_workspaces(); let text = render_app(&app); assert!( - text.contains("sessions"), - "Sessions tab must show 'sessions' pane title" + text.contains("workspaces"), + "Workspaces tab must show 'workspaces' pane title" ); assert!( text.contains("commands"), - "Sessions tab must show 'commands' pane title" + "Workspaces tab must show 'commands' pane title" ); } #[test] - fn sessions_tab_shows_session_row_highlighted() { - let app = app_with_sessions(); + fn workspaces_tab_shows_workspace_row_highlighted() { + let app = app_with_workspaces(); let buf = render_app_buf(&app); let any_reversed = (0..TEST_HEIGHT).any(|row_y| { @@ -753,17 +747,17 @@ mod tests { }); assert!( any_reversed, - "Sessions tab must have REVERSED on selected row" + "Workspaces tab must have REVERSED on selected row" ); } #[test] - fn sessions_tab_shows_command_text() { - let app = app_with_sessions(); + fn workspaces_tab_shows_command_text() { + let app = app_with_workspaces(); let text = render_app(&app); assert!( text.contains("git status"), - "Sessions tab right pane must show session command text" + "Workspaces tab right pane must show workspace command text" ); } @@ -802,22 +796,25 @@ mod tests { } #[test] - fn controls_sessions_shows_session_and_open() { - let app = app_with_sessions(); + fn controls_workspaces_shows_workspace_and_quit() { + let app = app_with_workspaces(); let text = render_app(&app); assert!( - text.contains("session"), - "Sessions controls must contain 'session'" + text.contains("workspace"), + "Workspaces controls must contain 'workspace'" ); assert!( - text.contains("open"), - "Sessions controls must contain 'open'" + !text.contains("open"), + "Workspaces controls must NOT contain 'open' in PR2" ); assert!( text.contains("quit"), - "Sessions controls must contain 'quit'" + "Workspaces controls must contain 'quit'" + ); + assert!( + text.contains("tabs"), + "Workspaces controls must hint 'tabs'" ); - assert!(text.contains("tabs"), "Sessions controls must hint 'tabs'"); } #[test] @@ -1722,19 +1719,19 @@ mod tests { } #[test] - fn dump_sessions_tab_buffer() { + fn dump_workspaces_tab_buffer() { const NOW: i64 = 1_000_000_000; const W: u16 = 100; const H: u16 = 16; let mut app = App::new(); - app.tab = Tab::Sessions; - app.sessions = vec![ - make_session("abc123def456", "proj-alpha", NOW - 3600, 5), - make_session("xyz789uvw012", "proj-beta", NOW - 7200, 3), + app.tab = Tab::Workspaces; + app.workspaces = vec![ + make_workspace("proj-alpha", 5, NOW - 3600), + make_workspace("proj-beta", 3, NOW - 7200), ]; - app.session_selected = 0; - app.session_commands = vec![ + app.ws_selected = 0; + app.ws_commands = vec![ make_row("git status", NOW - 3500, 0, "proj-alpha"), make_row("cargo build --release", NOW - 3400, 0, "proj-alpha"), make_row("cargo test", NOW - 3200, 1, "proj-alpha"), @@ -1757,10 +1754,10 @@ mod tests { lines.push(line.trim_end().to_string()); } let text = lines.join("\n"); - println!("=== SESSIONS TAB (100x16) ==="); + println!("=== WORKSPACES TAB (100x16) ==="); println!("{text}"); - assert!(text.contains("sessions"), "must show sessions pane"); + assert!(text.contains("workspaces"), "must show workspaces pane"); assert!(text.contains("commands"), "must show commands pane"); } } diff --git a/src/workspaces.rs b/src/workspaces.rs index 60fe0d3..07604c0 100644 --- a/src/workspaces.rs +++ b/src/workspaces.rs @@ -1,4 +1,5 @@ use crate::error::ThothError; +use crate::search::CommandRow; use rusqlite::Connection; pub fn start_line(name: &str) -> String { @@ -26,6 +27,37 @@ pub struct WorkspaceRow { pub last_ts: i64, } +pub fn list_workspace_commands( + conn: &Connection, + name: &str, +) -> Result, ThothError> { + let mut stmt = conn.prepare( + "SELECT c.timestamp, c.project, c.tags, c.exit_code, c.duration_ms, \ + c.directory, c.command, c.session_id, c.workspace \ + FROM commands c \ + WHERE c.workspace = ? \ + ORDER BY c.timestamp ASC, c.id ASC", + )?; + let rows = stmt.query_map([name], |row| { + Ok(CommandRow { + timestamp: row.get(0)?, + project: row.get(1)?, + tags: row.get(2)?, + exit_code: row.get(3)?, + duration_ms: row.get(4)?, + directory: row.get(5)?, + command: row.get(6)?, + session_id: row.get(7)?, + workspace: row.get(8)?, + }) + })?; + let mut result = Vec::new(); + for row in rows { + result.push(row?); + } + Ok(result) +} + pub fn list_workspaces(conn: &Connection) -> Result, ThothError> { let mut stmt = conn.prepare( "SELECT workspace, COUNT(*), MIN(timestamp), MAX(timestamp) \ @@ -94,6 +126,58 @@ mod tests { assert_eq!(normalize_workspace("ws1"), Some(String::from("ws1"))); } + fn seed_ws_command(conn: &Connection, ws: &str, cmd: &str, ts: i64, exit: i64) { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, workspace) \ + VALUES(?1, '/tmp', 'p', 's1', ?2, ?3, 100, '[]', ?4)", + rusqlite::params![cmd, ts, exit, ws], + ) + .unwrap(); + } + + #[test] + fn list_workspace_commands_empty_returns_empty() { + let conn = mem_conn(); + let rows = list_workspace_commands(&conn, "ws-a").unwrap(); + assert!(rows.is_empty()); + } + + #[test] + fn list_workspace_commands_filters_by_workspace() { + let conn = mem_conn(); + seed_ws_command(&conn, "ws-a", "cmd-a1", 1000, 0); + seed_ws_command(&conn, "ws-b", "cmd-b1", 2000, 0); + let rows = list_workspace_commands(&conn, "ws-a").unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "cmd-a1"); + } + + #[test] + fn list_workspace_commands_returns_asc_order() { + let conn = mem_conn(); + seed_ws_command(&conn, "ws-a", "first", 1000, 0); + seed_ws_command(&conn, "ws-a", "second", 2000, 0); + seed_ws_command(&conn, "ws-a", "third", 3000, 1); + let rows = list_workspace_commands(&conn, "ws-a").unwrap(); + assert_eq!(rows.len(), 3); + assert_eq!(rows[0].command, "first"); + assert_eq!(rows[1].command, "second"); + assert_eq!(rows[2].command, "third"); + } + + #[test] + fn list_workspace_commands_populates_all_fields() { + let conn = mem_conn(); + seed_ws_command(&conn, "ws-x", "ls -la", 5000, 0); + let rows = list_workspace_commands(&conn, "ws-x").unwrap(); + assert_eq!(rows.len(), 1); + let r = &rows[0]; + assert_eq!(r.command, "ls -la"); + assert_eq!(r.timestamp, 5000); + assert_eq!(r.exit_code, 0); + assert_eq!(r.workspace, Some("ws-x".into())); + } + #[test] fn list_workspaces_empty_db() { let conn = mem_conn(); From 85bf8247d1ee8f5199136b6ff39152627ad48a61 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:56:47 -0600 Subject: [PATCH 105/151] feat(export): add workspace filter and render_replay_script (#54) --- src/export.rs | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) diff --git a/src/export.rs b/src/export.rs index fc6bd31..78d29d9 100644 --- a/src/export.rs +++ b/src/export.rs @@ -11,6 +11,7 @@ pub struct ExportArgs { pub project: Option, pub since: Option, pub exit: Option, + pub workspace: Option, } pub struct ExportRow { @@ -66,6 +67,11 @@ pub fn build_query( params.push(Box::new(tag.clone())); } + if let Some(ref ws) = args.workspace { + fragments.push("c.workspace = ?".to_string()); + params.push(Box::new(ws.clone())); + } + let sql = if fragments.is_empty() { format!("SELECT {cols} FROM commands c ORDER BY c.timestamp ASC, c.id ASC") } else { @@ -167,6 +173,19 @@ pub fn render_script(rows: &[ExportRow], meta: &ExportMeta<'_>, now: i64) -> Str out } +pub fn render_replay_script(rows: &[ExportRow]) -> String { + let mut out = String::new(); + out.push_str("#!/usr/bin/env bash\n"); + out.push_str("set -e\n"); + for row in rows { + let escaped_dir = row.directory.replace('\'', "'\\''"); + out.push_str(&format!("cd '{escaped_dir}'\n")); + out.push_str(&row.command); + out.push('\n'); + } + out +} + #[cfg(test)] mod tests { use super::*; @@ -180,6 +199,7 @@ mod tests { project: None, since: None, exit: None, + workspace: None, } } @@ -342,6 +362,7 @@ mod tests { since: Some("today".into()), exit: Some(ExitFilter::Ok), session: Some("sess-x".into()), + workspace: None, }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); assert!(sql.contains("c.project = ?")); @@ -560,4 +581,191 @@ mod tests { assert_eq!(rows.len(), 1); assert_eq!(rows[0].command, "new_cmd"); } + + fn seed_with_dir(conn: &rusqlite::Connection, r: SeedRow<'_>, dir: &str, ws: Option<&str>) { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, workspace) \ + VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)", + rusqlite::params![r.cmd, dir, r.project, r.session, r.ts, r.exit, r.dur, r.tags, ws], + ) + .unwrap(); + } + + #[test] + fn build_query_workspace_filter_adds_clause() { + let args = ExportArgs { + workspace: Some("my-ws".into()), + ..default_args() + }; + let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); + assert!( + sql.contains("c.workspace = ?"), + "must include workspace clause; got: {sql}" + ); + assert!(sql.contains("ORDER BY c.timestamp ASC")); + assert_eq!(params.len(), 1); + } + + #[test] + fn collect_workspace_filter_returns_only_that_workspace() { + let conn = mem_conn(); + let r_a = s("cmd-ws-a", "p", 1_000, 0, 100, "[]", "s1"); + let r_b = s("cmd-ws-b", "p", 2_000, 0, 100, "[]", "s1"); + seed_with_dir(&conn, r_a, "/dir-a", Some("ws-a")); + seed_with_dir(&conn, r_b, "/dir-b", Some("ws-b")); + let args = ExportArgs { + workspace: Some("ws-a".into()), + ..default_args() + }; + let rows = collect(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0].command, "cmd-ws-a"); + } + + #[test] + fn collect_workspace_returns_asc_order() { + let conn = mem_conn(); + seed_with_dir( + &conn, + s("first", "p", 1_000, 0, 100, "[]", "s1"), + "/d", + Some("ws-x"), + ); + seed_with_dir( + &conn, + s("second", "p", 3_000, 0, 100, "[]", "s1"), + "/d", + Some("ws-x"), + ); + seed_with_dir( + &conn, + s("third", "p", 2_000, 0, 100, "[]", "s1"), + "/d", + Some("ws-x"), + ); + let args = ExportArgs { + workspace: Some("ws-x".into()), + ..default_args() + }; + let rows = collect(&conn, &args, FIXED_NOW).unwrap(); + assert_eq!(rows.len(), 3); + assert_eq!(rows[0].command, "first"); + assert_eq!(rows[1].command, "third"); + assert_eq!(rows[2].command, "second"); + } + + #[test] + fn render_replay_script_starts_with_shebang_and_set_e() { + let rows: Vec = vec![]; + let out = render_replay_script(&rows); + assert!( + out.starts_with("#!/usr/bin/env bash\n"), + "must start with shebang" + ); + assert!(out.contains("set -e\n"), "must include set -e"); + } + + #[test] + fn render_replay_script_empty_rows_only_shebang_and_set_e() { + let rows: Vec = vec![]; + let out = render_replay_script(&rows); + let lines: Vec<&str> = out.lines().collect(); + assert_eq!(lines.len(), 2); + assert_eq!(lines[0], "#!/usr/bin/env bash"); + assert_eq!(lines[1], "set -e"); + } + + #[test] + fn render_replay_script_cd_before_each_command() { + let rows = vec![ExportRow { + command: "cargo build".into(), + directory: "/home/user/proj".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }]; + let out = render_replay_script(&rows); + assert!( + out.contains("cd '/home/user/proj'\n"), + "must emit cd line; got:\n{out}" + ); + assert!( + out.contains("cargo build\n"), + "must emit command; got:\n{out}" + ); + let cd_pos = out.find("cd '/home/user/proj'").unwrap(); + let cmd_pos = out.find("cargo build").unwrap(); + assert!(cd_pos < cmd_pos, "cd must come before the command"); + } + + #[test] + fn render_replay_script_escapes_single_quote_in_directory() { + let rows = vec![ExportRow { + command: "ls".into(), + directory: "/home/it's/project".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }]; + let out = render_replay_script(&rows); + assert!( + out.contains("cd '/home/it'\\''s/project'\n"), + "must escape single quote in dir; got:\n{out}" + ); + } + + #[test] + fn render_replay_script_preserves_command_order() { + let rows = vec![ + ExportRow { + command: "first_cmd".into(), + directory: "/a".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }, + ExportRow { + command: "second_cmd".into(), + directory: "/b".into(), + timestamp: 2_000, + exit_code: 0, + duration_ms: 100, + }, + ]; + let out = render_replay_script(&rows); + let first_pos = out.find("first_cmd").unwrap(); + let second_pos = out.find("second_cmd").unwrap(); + assert!( + first_pos < second_pos, + "first_cmd must appear before second_cmd" + ); + } + + #[test] + fn render_replay_script_two_rows_has_two_cd_lines() { + let rows = vec![ + ExportRow { + command: "cmd-a".into(), + directory: "/dir-a".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }, + ExportRow { + command: "cmd-b".into(), + directory: "/dir-b".into(), + timestamp: 2_000, + exit_code: 0, + duration_ms: 100, + }, + ]; + let out = render_replay_script(&rows); + let cd_count = out.matches("cd '").count(); + assert_eq!( + cd_count, 2, + "two rows must produce two cd lines; got:\n{out}" + ); + assert!(out.contains("cd '/dir-a'\n")); + assert!(out.contains("cd '/dir-b'\n")); + } } From 92e0222b6e3b4ae0b15226dfe4793ca58fcdc96c Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:56:51 -0600 Subject: [PATCH 106/151] feat(tui/app): add ConfirmReplay, Replay action, and replay confirm methods (#54) --- src/tui/app.rs | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/tui/app.rs b/src/tui/app.rs index 0831cac..719b05f 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -61,6 +61,12 @@ impl FilterState { pub enum Action { Run(String), Edit(String), + Replay(String), +} + +pub struct ConfirmReplay { + pub workspace: String, + pub count: usize, } pub struct App { @@ -77,6 +83,8 @@ pub struct App { pub needs_ws_reload: bool, pub needs_ws_commands_reload: bool, pub needs_history_reload: bool, + pub confirm: Option, + pub replay_workspace: Option, } impl Default for App { @@ -101,9 +109,23 @@ impl App { needs_ws_reload: false, needs_ws_commands_reload: false, needs_history_reload: false, + confirm: None, + replay_workspace: None, } } + pub fn begin_replay_confirm(&mut self) { + if let Some(ws) = self.selected_workspace() { + let workspace = ws.name.clone(); + let count = self.ws_commands.len(); + self.confirm = Some(ConfirmReplay { workspace, count }); + } + } + + pub fn cancel_confirm(&mut self) { + self.confirm = None; + } + pub fn prev_tab(&mut self) { self.tab = Tab::History; } @@ -517,4 +539,55 @@ mod tests { let app = App::new(); assert!(app.selected_command().is_none()); } + + fn app_with_ws(name: &str, cmd_count: usize) -> App { + let mut app = App::new(); + app.tab = crate::tui::app::Tab::Workspaces; + app.workspaces = vec![WorkspaceRow { + name: name.into(), + command_count: cmd_count as i64, + first_ts: 1000, + last_ts: 2000, + }]; + app.ws_selected = 0; + app.ws_commands = (0..cmd_count) + .map(|i| crate::search::CommandRow { + command: format!("cmd-{i}"), + directory: "/tmp".into(), + project: "p".into(), + session_id: "s1".into(), + timestamp: 1000 + i as i64, + exit_code: 0, + duration_ms: 100, + tags: "[]".into(), + workspace: Some(name.into()), + }) + .collect(); + app + } + + #[test] + fn begin_replay_confirm_sets_confirm_with_workspace_and_count() { + let mut app = app_with_ws("demo", 3); + app.begin_replay_confirm(); + let c = app.confirm.as_ref().unwrap(); + assert_eq!(c.workspace, "demo"); + assert_eq!(c.count, 3); + } + + #[test] + fn begin_replay_confirm_no_workspace_does_nothing() { + let mut app = App::new(); + app.begin_replay_confirm(); + assert!(app.confirm.is_none()); + } + + #[test] + fn cancel_confirm_clears_confirm() { + let mut app = app_with_ws("ws-x", 2); + app.begin_replay_confirm(); + assert!(app.confirm.is_some()); + app.cancel_confirm(); + assert!(app.confirm.is_none()); + } } From 0a14362351c9ce4deffb6c12f63a8a71a07f7be2 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:56:54 -0600 Subject: [PATCH 107/151] feat(tui/event): route confirm modal keys and open confirm on ws Enter (#54) --- src/tui/event.rs | 122 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/src/tui/event.rs b/src/tui/event.rs index 4233bda..e2fdc1c 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -2,12 +2,37 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use crate::tui::app::{Action, App, Tab}; +fn handle_confirm_key(key: crossterm::event::KeyEvent, app: &mut App) -> Outcome { + use crossterm::event::KeyCode; + match key.code { + KeyCode::Char('y') | KeyCode::Char('Y') => { + let ws = app + .confirm + .as_ref() + .map(|c| c.workspace.clone()) + .unwrap_or_default(); + app.replay_workspace = Some(ws); + app.confirm = None; + Outcome::Exit + } + KeyCode::Char('n') | KeyCode::Char('N') | KeyCode::Esc => { + app.cancel_confirm(); + Outcome::Continue + } + _ => Outcome::Continue, + } +} + pub enum Outcome { Continue, Exit, } pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { + if app.confirm.is_some() { + return handle_confirm_key(key, app); + } + match key.code { KeyCode::Esc => { app.action = None; @@ -80,7 +105,10 @@ fn handle_history_key(key: KeyEvent, app: &mut App) -> Outcome { fn handle_ws_key(key: KeyEvent, app: &mut App) -> Outcome { match key.code { - KeyCode::Enter => Outcome::Continue, + KeyCode::Enter => { + app.begin_replay_confirm(); + Outcome::Continue + } KeyCode::Up => { app.ws_move_up(); Outcome::Continue @@ -437,4 +465,96 @@ mod tests { handle_key(key(KeyCode::Char('g')), &mut app); assert_eq!(app.query, "g"); } + + fn app_with_workspaces_and_commands() -> App { + let mut app = app_with_workspaces(); + app.ws_commands = vec![crate::search::CommandRow { + command: "git status".into(), + directory: "/tmp".into(), + project: "p".into(), + session_id: "s1".into(), + timestamp: 1000, + exit_code: 0, + duration_ms: 100, + tags: "[]".into(), + workspace: Some("ws-new".into()), + }]; + app + } + + #[test] + fn ws_enter_opens_confirm_modal() { + let mut app = app_with_workspaces_and_commands(); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.confirm.is_some(), "Enter must open confirm modal"); + } + + #[test] + fn confirm_y_sets_replay_workspace_clears_confirm_and_exits() { + let mut app = app_with_workspaces_and_commands(); + handle_key(key(KeyCode::Enter), &mut app); + assert!(app.confirm.is_some()); + let outcome = handle_key(key(KeyCode::Char('y')), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + assert!(app.confirm.is_none(), "confirm must be cleared after y"); + assert_eq!(app.replay_workspace, Some("ws-new".into())); + } + + #[test] + fn confirm_n_cancels_and_continues() { + let mut app = app_with_workspaces_and_commands(); + handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Char('n')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.confirm.is_none()); + assert!(app.replay_workspace.is_none()); + } + + #[test] + fn confirm_esc_cancels_and_continues() { + let mut app = app_with_workspaces_and_commands(); + handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Esc), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.confirm.is_none()); + } + + #[test] + fn confirm_other_key_does_not_leak_through() { + let mut app = app_with_workspaces_and_commands(); + handle_key(key(KeyCode::Enter), &mut app); + let query_before = app.query.clone(); + let outcome = handle_key(key(KeyCode::Char('g')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert_eq!( + app.query, query_before, + "typing must not leak to query while confirm is open" + ); + assert!( + app.confirm.is_some(), + "confirm must stay open on unknown key" + ); + } + + #[test] + fn confirm_left_does_not_change_tab() { + let mut app = app_with_workspaces_and_commands(); + handle_key(key(KeyCode::Enter), &mut app); + let tab_before = app.tab; + handle_key(key(KeyCode::Left), &mut app); + assert_eq!( + app.tab, tab_before, + "Left must not change tab while confirm is open" + ); + } + + #[test] + fn history_enter_still_exits_with_run_regression() { + let mut app = app_with_rows(); + assert_eq!(app.tab, Tab::History); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + assert!(matches!(&app.action, Some(Action::Run(_)))); + } } From 1f079c28acbdbddadf29753c1bfb01a4b79758e9 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:56:56 -0600 Subject: [PATCH 108/151] feat(tui): render confirm modal, REPLAY action line, and build replay script (#54) --- src/tui/mod.rs | 26 ++++++++++++- src/tui/render.rs | 98 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 121 insertions(+), 3 deletions(-) diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 5a6feee..018aa7f 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -16,8 +16,9 @@ use ratatui::{backend::CrosstermBackend, widgets::TableState, Terminal}; use rusqlite::Connection; use crate::error::ThothError; +use crate::export::{self, ExportArgs}; use crate::search::Column; -use crate::tui::app::App; +use crate::tui::app::{Action, App}; use crate::tui::event::{handle_key, Outcome}; use crate::tui::render::format_action_line; @@ -114,6 +115,29 @@ pub fn run( drop(_guard); + if let Some(ws_name) = app.replay_workspace.take() { + let args = ExportArgs { + workspace: Some(ws_name.clone()), + session: None, + tag: vec![], + project: None, + since: None, + exit: None, + }; + let rows = export::collect(conn, &args, now) + .map_err(|e| ThothError::Tui(format!("replay collect failed: {e}")))?; + let script = export::render_replay_script(&rows); + let path = + std::env::temp_dir().join(format!("tth-replay-{}-{}.sh", std::process::id(), now)); + std::fs::write(&path, script) + .map_err(|e| ThothError::Tui(format!("replay write failed: {e}")))?; + let path_str = path + .to_str() + .ok_or_else(|| ThothError::Tui("replay path is not valid UTF-8".into()))? + .to_string(); + app.action = Some(Action::Replay(path_str)); + } + if let Some(line) = format_action_line(app.action.as_ref()) { println!("{line}"); } diff --git a/src/tui/render.rs b/src/tui/render.rs index 7bcc84a..ce8bcf7 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -1,8 +1,8 @@ use ratatui::{ - layout::{Alignment, Constraint, Layout}, + layout::{Alignment, Constraint, Layout, Rect}, style::{Color, Modifier, Style}, text::{Line, Span}, - widgets::{Block, BorderType, Borders, Cell, Paragraph, Row, Table, TableState}, + widgets::{Block, BorderType, Borders, Cell, Clear, Paragraph, Row, Table, TableState}, Frame, }; @@ -485,6 +485,10 @@ pub fn draw( } } + if app.confirm.is_some() { + render_confirm_modal(frame, middle_area, app); + } + let query_text = format!("> {}", app.query); frame.render_widget(Paragraph::new(query_text), query_area); @@ -524,6 +528,9 @@ pub fn draw( Span::styled("↑↓", accent_style), Span::styled(" workspace", dim_style), Span::styled(" · ", dim_style), + Span::styled("↵", accent_style), + Span::styled(" replay", dim_style), + Span::styled(" · ", dim_style), Span::styled("esc", accent_style), Span::styled(" quit", dim_style), ]), @@ -536,10 +543,54 @@ pub fn format_action_line(action: Option<&crate::tui::app::Action>) -> Option Some(format!("RUN:{cmd}")), Some(Action::Edit(cmd)) => Some(format!("EDIT:{cmd}")), + Some(Action::Replay(path)) => Some(format!("REPLAY:{path}")), None => None, } } +fn centered_rect(width: u16, height: u16, area: Rect) -> Rect { + let x = area.x + area.width.saturating_sub(width) / 2; + let y = area.y + area.height.saturating_sub(height) / 2; + Rect { + x, + y, + width: width.min(area.width), + height: height.min(area.height), + } +} + +fn render_confirm_modal(frame: &mut Frame, area: Rect, app: &crate::tui::app::App) { + let Some(confirm) = &app.confirm else { return }; + let dim_style = Style::default().fg(DIM_COLOR); + let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); + + let modal_w = 50u16; + let modal_h = 4u16; + let modal_area = centered_rect(modal_w, modal_h, area); + + frame.render_widget(Clear, modal_area); + + let ws_name = truncate(&confirm.workspace, 20); + let title = format!(" Replay '{ws_name}' ({} commands)? ", confirm.count); + let block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(Style::default().fg(ACCENT)) + .title(Span::styled(title, accent_style)); + + let inner = block.inner(modal_area); + frame.render_widget(block, modal_area); + + let hint = Paragraph::new(Line::from(vec![ + Span::styled("[y]", accent_style), + Span::styled(" run all ", dim_style), + Span::styled("[n]", accent_style), + Span::styled(" cancel", dim_style), + ])) + .alignment(Alignment::Center); + frame.render_widget(hint, inner); +} + #[cfg(test)] mod tests { use super::*; @@ -1718,6 +1769,49 @@ mod tests { assert!(lines2.iter().all(|l| !l.contains("time"))); } + #[test] + fn format_action_line_replay_produces_correct_prefix() { + let action = Action::Replay("/tmp/tth-replay-123.sh".to_string()); + let result = format_action_line(Some(&action)); + assert_eq!(result, Some("REPLAY:/tmp/tth-replay-123.sh".to_string())); + } + + #[test] + fn controls_workspaces_shows_replay_hint() { + let app = app_with_workspaces(); + let text = render_app(&app); + assert!( + text.contains("replay"), + "Workspaces controls must contain 'replay'; got:\n{text}" + ); + } + + #[test] + fn confirm_modal_shows_when_confirm_is_set() { + let mut app = app_with_workspaces(); + app.confirm = Some(crate::tui::app::ConfirmReplay { + workspace: "proj-alpha".into(), + count: 5, + }); + let text = render_app(&app); + assert!( + text.contains("proj-alpha"), + "confirm modal must show workspace name; got:\n{text}" + ); + assert!( + text.contains("5 commands") || text.contains("5"), + "confirm modal must show command count; got:\n{text}" + ); + assert!( + text.contains("[y]") || text.contains("y"), + "confirm modal must show y hint; got:\n{text}" + ); + assert!( + text.contains("[n]") || text.contains("n"), + "confirm modal must show n hint; got:\n{text}" + ); + } + #[test] fn dump_workspaces_tab_buffer() { const NOW: i64 = 1_000_000_000; From f3f91f37e8bdfee9e0abfdc0187947aa1319925d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 14:56:59 -0600 Subject: [PATCH 109/151] feat(shells): add REPLAY branch to widget handlers (#54) --- shells/thoth.bash | 2 ++ shells/thoth.zsh | 3 +++ src/cli.rs | 1 + 3 files changed, 6 insertions(+) diff --git a/shells/thoth.bash b/shells/thoth.bash index 3c3a9e3..755bafc 100644 --- a/shells/thoth.bash +++ b/shells/thoth.bash @@ -66,6 +66,8 @@ _tth_widget() { elif [[ "$out" == EDIT:* ]]; then READLINE_LINE="${out#EDIT:}" READLINE_POINT=${#READLINE_LINE} + elif [[ "$out" == REPLAY:* ]]; then + bash "${out#REPLAY:}" fi } diff --git a/shells/thoth.zsh b/shells/thoth.zsh index 90a3179..45d4702 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -66,6 +66,9 @@ _tth_widget() { BUFFER="${out#EDIT:}" CURSOR=${#BUFFER} zle reset-prompt + elif [[ "$out" == REPLAY:* ]]; then + bash "${out#REPLAY:}" + zle reset-prompt else zle reset-prompt fi diff --git a/src/cli.rs b/src/cli.rs index 6af3f60..effc901 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -474,6 +474,7 @@ pub fn run() -> Result<(), crate::error::ThothError> { project: args.project.clone(), since: args.since, exit: args.exit, + workspace: None, }; let rows = crate::export::collect(&conn, &export_args, now)?; let meta = crate::export::ExportMeta { From 726ad9a8dff38d6b96fe8be31095e36281b2887f Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 15:04:46 -0600 Subject: [PATCH 110/151] feat(search): add id field to CommandRow (#56) --- src/search.rs | 27 +++++++++++++++++---------- src/tui/app.rs | 1 + src/tui/event.rs | 3 +++ src/tui/fuzzy.rs | 1 + src/tui/render.rs | 1 + src/workspaces.rs | 21 +++++++++++---------- 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/search.rs b/src/search.rs index 38b6020..32d70a4 100644 --- a/src/search.rs +++ b/src/search.rs @@ -114,6 +114,7 @@ pub enum ExitFilter { } pub struct CommandRow { + pub id: i64, pub timestamp: i64, pub project: String, pub tags: String, @@ -215,7 +216,7 @@ pub fn build_query( args: &SearchArgs, now: i64, ) -> Result<(String, Vec>), ThothError> { - let cols = "c.timestamp, c.project, c.tags, c.exit_code, c.duration_ms, c.directory, c.command, c.session_id, c.workspace"; + let cols = "c.id, c.timestamp, c.project, c.tags, c.exit_code, c.duration_ms, c.directory, c.command, c.session_id, c.workspace"; let tokens: Vec = match &args.query { Some(q) => q @@ -320,15 +321,16 @@ pub fn execute( rusqlite::params_from_iter(params.iter().map(|p| p.as_ref())), |row| { Ok(CommandRow { - timestamp: row.get(0)?, - project: row.get(1)?, - tags: row.get(2)?, - exit_code: row.get(3)?, - duration_ms: row.get(4)?, - directory: row.get(5)?, - command: row.get(6)?, - session_id: row.get(7)?, - workspace: row.get(8)?, + id: row.get(0)?, + timestamp: row.get(1)?, + project: row.get(2)?, + tags: row.get(3)?, + exit_code: row.get(4)?, + duration_ms: row.get(5)?, + directory: row.get(6)?, + command: row.get(7)?, + session_id: row.get(8)?, + workspace: row.get(9)?, }) }, )?; @@ -907,6 +909,7 @@ mod tests { fn fixture_rows() -> Vec { vec![ CommandRow { + id: 1, timestamp: 1_700_000_000, project: "alpha".into(), tags: r#"["rust"]"#.into(), @@ -918,6 +921,7 @@ mod tests { workspace: None, }, CommandRow { + id: 2, timestamp: 1_700_001_000, project: "beta".into(), tags: "[]".into(), @@ -952,6 +956,7 @@ mod tests { fn render_show_session_reduced_columns_two_sessions() { let rows = vec![ CommandRow { + id: 1, timestamp: 1_700_000_000, project: "alpha".into(), tags: r#"["rust"]"#.into(), @@ -963,6 +968,7 @@ mod tests { workspace: None, }, CommandRow { + id: 2, timestamp: 1_700_001_000, project: "alpha".into(), tags: "[]".into(), @@ -974,6 +980,7 @@ mod tests { workspace: None, }, CommandRow { + id: 3, timestamp: 1_700_002_000, project: "beta".into(), tags: "[]".into(), diff --git a/src/tui/app.rs b/src/tui/app.rs index 719b05f..65e6a6e 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -552,6 +552,7 @@ mod tests { app.ws_selected = 0; app.ws_commands = (0..cmd_count) .map(|i| crate::search::CommandRow { + id: (i + 1) as i64, command: format!("cmd-{i}"), directory: "/tmp".into(), project: "p".into(), diff --git a/src/tui/event.rs b/src/tui/event.rs index e2fdc1c..c69617b 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -157,6 +157,7 @@ mod tests { let mut app = App::new(); app.all_rows = vec![ crate::search::CommandRow { + id: 1, timestamp: 2000, project: String::from("p"), tags: String::from("[]"), @@ -168,6 +169,7 @@ mod tests { workspace: None, }, crate::search::CommandRow { + id: 2, timestamp: 1000, project: String::from("p"), tags: String::from("[]"), @@ -469,6 +471,7 @@ mod tests { fn app_with_workspaces_and_commands() -> App { let mut app = app_with_workspaces(); app.ws_commands = vec![crate::search::CommandRow { + id: 10, command: "git status".into(), directory: "/tmp".into(), project: "p".into(), diff --git a/src/tui/fuzzy.rs b/src/tui/fuzzy.rs index c3ee4ed..be6144b 100644 --- a/src/tui/fuzzy.rs +++ b/src/tui/fuzzy.rs @@ -33,6 +33,7 @@ mod tests { fn row(command: &str) -> CommandRow { CommandRow { + id: 0, timestamp: 0, project: String::new(), tags: String::from("[]"), diff --git a/src/tui/render.rs b/src/tui/render.rs index ce8bcf7..616db27 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -606,6 +606,7 @@ mod tests { fn make_row(cmd: &str, ts: i64, exit: i64, project: &str) -> CommandRow { CommandRow { + id: 0, command: cmd.to_string(), timestamp: ts, exit_code: exit, diff --git a/src/workspaces.rs b/src/workspaces.rs index 07604c0..3c1fe52 100644 --- a/src/workspaces.rs +++ b/src/workspaces.rs @@ -32,7 +32,7 @@ pub fn list_workspace_commands( name: &str, ) -> Result, ThothError> { let mut stmt = conn.prepare( - "SELECT c.timestamp, c.project, c.tags, c.exit_code, c.duration_ms, \ + "SELECT c.id, c.timestamp, c.project, c.tags, c.exit_code, c.duration_ms, \ c.directory, c.command, c.session_id, c.workspace \ FROM commands c \ WHERE c.workspace = ? \ @@ -40,15 +40,16 @@ pub fn list_workspace_commands( )?; let rows = stmt.query_map([name], |row| { Ok(CommandRow { - timestamp: row.get(0)?, - project: row.get(1)?, - tags: row.get(2)?, - exit_code: row.get(3)?, - duration_ms: row.get(4)?, - directory: row.get(5)?, - command: row.get(6)?, - session_id: row.get(7)?, - workspace: row.get(8)?, + id: row.get(0)?, + timestamp: row.get(1)?, + project: row.get(2)?, + tags: row.get(3)?, + exit_code: row.get(4)?, + duration_ms: row.get(5)?, + directory: row.get(6)?, + command: row.get(7)?, + session_id: row.get(8)?, + workspace: row.get(9)?, }) })?; let mut result = Vec::new(); From 01d72fee4d2aabd20b4d81127573c61dd5e8bd47 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 15:13:28 -0600 Subject: [PATCH 111/151] feat(tui): vim modal, pane focus, and DELETE command (#56) --- src/tui/app.rs | 315 +++++++++++++++++++++++++++++++++- src/tui/event.rs | 417 ++++++++++++++++++++++++++++++++++------------ src/tui/mod.rs | 23 ++- src/tui/render.rs | 362 ++++++++++++++++++++++++++++++++-------- 4 files changed, 932 insertions(+), 185 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index 65e6a6e..ca54961 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -7,6 +7,7 @@ use crate::tui::fuzzy; use crate::workspaces::WorkspaceRow; const TUI_LIMIT: usize = 5000; +const LABEL_MAX: usize = 40; #[derive(Clone, Copy, PartialEq, Eq, Debug, Default)] pub enum Tab { @@ -15,6 +16,42 @@ pub enum Tab { Workspaces, } +#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)] +pub enum Mode { + #[default] + Insert, + Normal, +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)] +pub enum WsPane { + #[default] + List, + Commands, +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum DeleteOrigin { + History, + Workspace, +} + +pub struct ConfirmReplay { + pub workspace: String, + pub count: usize, +} + +pub struct ConfirmDelete { + pub id: i64, + pub label: String, + pub origin: DeleteOrigin, +} + +pub enum Confirm { + Replay(ConfirmReplay), + Delete(ConfirmDelete), +} + pub struct FilterState { pub project: Option, pub tag: Vec, @@ -64,11 +101,6 @@ pub enum Action { Replay(String), } -pub struct ConfirmReplay { - pub workspace: String, - pub count: usize, -} - pub struct App { pub query: String, pub all_rows: Vec, @@ -77,14 +109,18 @@ pub struct App { pub filters: FilterState, pub action: Option, pub tab: Tab, + pub mode: Mode, pub workspaces: Vec, pub ws_selected: usize, pub ws_commands: Vec, + pub ws_pane: WsPane, + pub ws_cmd_selected: usize, pub needs_ws_reload: bool, pub needs_ws_commands_reload: bool, pub needs_history_reload: bool, - pub confirm: Option, + pub confirm: Option, pub replay_workspace: Option, + pub pending_delete: Option<(i64, DeleteOrigin)>, } impl Default for App { @@ -103,14 +139,94 @@ impl App { filters: FilterState::new(), action: None, tab: Tab::History, + mode: Mode::Insert, workspaces: vec![], ws_selected: 0, ws_commands: vec![], + ws_pane: WsPane::List, + ws_cmd_selected: 0, needs_ws_reload: false, needs_ws_commands_reload: false, needs_history_reload: false, confirm: None, replay_workspace: None, + pending_delete: None, + } + } + + pub fn enter_normal_mode(&mut self) { + self.mode = Mode::Normal; + } + + pub fn enter_insert_mode(&mut self) { + self.mode = Mode::Insert; + } + + pub fn toggle_ws_pane(&mut self) { + match self.ws_pane { + WsPane::List => { + self.ws_pane = WsPane::Commands; + let max = self.ws_commands.len().saturating_sub(1); + if self.ws_cmd_selected > max { + self.ws_cmd_selected = 0; + } + } + WsPane::Commands => { + self.ws_pane = WsPane::List; + } + } + } + + pub fn ws_cmd_move_up(&mut self) { + if self.ws_cmd_selected > 0 { + self.ws_cmd_selected -= 1; + } + } + + pub fn ws_cmd_move_down(&mut self) { + let max = self.ws_commands.len().saturating_sub(1); + if self.ws_cmd_selected < max { + self.ws_cmd_selected += 1; + } + } + + pub fn selected_history_id(&self) -> Option { + let idx = self.filtered.get(self.selected)?; + self.all_rows.get(*idx).map(|r| r.id) + } + + pub fn selected_ws_command_id(&self) -> Option { + self.ws_commands.get(self.ws_cmd_selected).map(|r| r.id) + } + + pub fn begin_delete_confirm_history(&mut self) { + if let Some(id) = self.selected_history_id() { + let label = self + .filtered + .get(self.selected) + .and_then(|idx| self.all_rows.get(*idx)) + .map(|r| truncate_label(&r.command)) + .unwrap_or_default(); + self.confirm = Some(Confirm::Delete(ConfirmDelete { + id, + label, + origin: DeleteOrigin::History, + })); + } + } + + pub fn begin_delete_confirm_ws(&mut self) { + if let Some(id) = self.selected_ws_command_id() { + let label = self + .ws_commands + .get(self.ws_cmd_selected) + .map(|r| truncate_label(&r.command)) + .unwrap_or_default(); + self.confirm = Some(Confirm::Delete(ConfirmDelete { + id, + label, + origin: DeleteOrigin::Workspace, + })); } } @@ -118,7 +234,7 @@ impl App { if let Some(ws) = self.selected_workspace() { let workspace = ws.name.clone(); let count = self.ws_commands.len(); - self.confirm = Some(ConfirmReplay { workspace, count }); + self.confirm = Some(Confirm::Replay(ConfirmReplay { workspace, count })); } } @@ -184,6 +300,10 @@ impl App { } else { self.ws_commands.clear(); } + let max = self.ws_commands.len().saturating_sub(1); + if self.ws_cmd_selected > max { + self.ws_cmd_selected = 0; + } self.needs_ws_commands_reload = false; Ok(()) } @@ -215,6 +335,19 @@ impl App { } } +fn truncate_label(s: &str) -> String { + if s.chars().count() <= LABEL_MAX { + s.to_string() + } else { + let end = s + .char_indices() + .nth(LABEL_MAX.saturating_sub(1)) + .map(|(i, _)| i) + .unwrap_or(s.len()); + format!("{}...", &s[..end]) + } +} + #[cfg(test)] mod tests { use super::*; @@ -572,8 +705,7 @@ mod tests { let mut app = app_with_ws("demo", 3); app.begin_replay_confirm(); let c = app.confirm.as_ref().unwrap(); - assert_eq!(c.workspace, "demo"); - assert_eq!(c.count, 3); + assert!(matches!(c, Confirm::Replay(r) if r.workspace == "demo" && r.count == 3)); } #[test] @@ -591,4 +723,169 @@ mod tests { app.cancel_confirm(); assert!(app.confirm.is_none()); } + + #[test] + fn enter_normal_mode_sets_normal() { + let mut app = App::new(); + assert_eq!(app.mode, Mode::Insert); + app.enter_normal_mode(); + assert_eq!(app.mode, Mode::Normal); + } + + #[test] + fn enter_insert_mode_sets_insert() { + let mut app = App::new(); + app.enter_normal_mode(); + assert_eq!(app.mode, Mode::Normal); + app.enter_insert_mode(); + assert_eq!(app.mode, Mode::Insert); + } + + #[test] + fn toggle_ws_pane_list_to_commands() { + let mut app = App::new(); + assert_eq!(app.ws_pane, WsPane::List); + app.toggle_ws_pane(); + assert_eq!(app.ws_pane, WsPane::Commands); + } + + #[test] + fn toggle_ws_pane_commands_to_list() { + let mut app = App::new(); + app.ws_pane = WsPane::Commands; + app.toggle_ws_pane(); + assert_eq!(app.ws_pane, WsPane::List); + } + + #[test] + fn toggle_ws_pane_clamps_cmd_selected() { + let mut app = app_with_ws("demo", 2); + app.ws_cmd_selected = 5; + app.toggle_ws_pane(); + assert!( + app.ws_cmd_selected <= 1, + "ws_cmd_selected must clamp to valid range after toggling to Commands" + ); + } + + #[test] + fn ws_cmd_move_up_decreases() { + let mut app = app_with_ws("demo", 3); + app.ws_pane = WsPane::Commands; + app.ws_cmd_selected = 2; + app.ws_cmd_move_up(); + assert_eq!(app.ws_cmd_selected, 1); + } + + #[test] + fn ws_cmd_move_up_clamps_at_zero() { + let mut app = app_with_ws("demo", 3); + app.ws_pane = WsPane::Commands; + app.ws_cmd_selected = 0; + app.ws_cmd_move_up(); + assert_eq!(app.ws_cmd_selected, 0); + } + + #[test] + fn ws_cmd_move_down_increases() { + let mut app = app_with_ws("demo", 3); + app.ws_pane = WsPane::Commands; + app.ws_cmd_selected = 0; + app.ws_cmd_move_down(); + assert_eq!(app.ws_cmd_selected, 1); + } + + #[test] + fn ws_cmd_move_down_clamps_at_max() { + let mut app = app_with_ws("demo", 3); + app.ws_pane = WsPane::Commands; + app.ws_cmd_selected = 2; + app.ws_cmd_move_down(); + assert_eq!(app.ws_cmd_selected, 2); + } + + #[test] + fn selected_history_id_returns_correct_id() { + let conn = make_conn(); + seed(&conn, "git status", 2000); + seed(&conn, "ls -la", 1000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.selected = 0; + let id = app.selected_history_id().unwrap(); + assert!(id > 0); + let row = &app.all_rows[app.filtered[0]]; + assert_eq!(id, row.id); + } + + #[test] + fn selected_history_id_none_when_empty() { + let app = App::new(); + assert!(app.selected_history_id().is_none()); + } + + #[test] + fn selected_ws_command_id_returns_correct_id() { + let app = app_with_ws("demo", 3); + let id = app.selected_ws_command_id().unwrap(); + assert_eq!(id, app.ws_commands[0].id); + } + + #[test] + fn selected_ws_command_id_uses_ws_cmd_selected() { + let mut app = app_with_ws("demo", 3); + app.ws_cmd_selected = 2; + let id = app.selected_ws_command_id().unwrap(); + assert_eq!(id, app.ws_commands[2].id); + } + + #[test] + fn begin_delete_confirm_history_sets_delete_confirm() { + let conn = make_conn(); + seed(&conn, "git status", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.selected = 0; + let expected_id = app.selected_history_id().unwrap(); + app.begin_delete_confirm_history(); + let c = app.confirm.as_ref().unwrap(); + assert!( + matches!(c, Confirm::Delete(d) if d.id == expected_id && matches!(d.origin, DeleteOrigin::History)) + ); + } + + #[test] + fn begin_delete_confirm_history_no_rows_does_nothing() { + let mut app = App::new(); + app.begin_delete_confirm_history(); + assert!(app.confirm.is_none()); + } + + #[test] + fn begin_delete_confirm_ws_sets_delete_confirm() { + let mut app = app_with_ws("demo", 2); + app.ws_cmd_selected = 0; + let expected_id = app.ws_commands[0].id; + app.begin_delete_confirm_ws(); + let c = app.confirm.as_ref().unwrap(); + assert!( + matches!(c, Confirm::Delete(d) if d.id == expected_id && matches!(d.origin, DeleteOrigin::Workspace)) + ); + } + + #[test] + fn begin_delete_confirm_ws_no_commands_does_nothing() { + let mut app = App::new(); + app.begin_delete_confirm_ws(); + assert!(app.confirm.is_none()); + } + + #[test] + fn cancel_confirm_clears_delete_confirm() { + let mut app = app_with_ws("demo", 2); + app.begin_delete_confirm_ws(); + assert!(app.confirm.is_some()); + app.cancel_confirm(); + assert!(app.confirm.is_none()); + } } diff --git a/src/tui/event.rs b/src/tui/event.rs index c69617b..143b8fa 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -1,20 +1,21 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; -use crate::tui::app::{Action, App, Tab}; +use crate::tui::app::{Action, App, Confirm, Mode, Tab, WsPane}; fn handle_confirm_key(key: crossterm::event::KeyEvent, app: &mut App) -> Outcome { use crossterm::event::KeyCode; match key.code { - KeyCode::Char('y') | KeyCode::Char('Y') => { - let ws = app - .confirm - .as_ref() - .map(|c| c.workspace.clone()) - .unwrap_or_default(); - app.replay_workspace = Some(ws); - app.confirm = None; - Outcome::Exit - } + KeyCode::Char('y') | KeyCode::Char('Y') => match app.confirm.take() { + Some(Confirm::Replay(r)) => { + app.replay_workspace = Some(r.workspace); + Outcome::Exit + } + Some(Confirm::Delete(d)) => { + app.pending_delete = Some((d.id, d.origin)); + Outcome::Continue + } + None => Outcome::Continue, + }, KeyCode::Char('n') | KeyCode::Char('N') | KeyCode::Esc => { app.cancel_confirm(); Outcome::Continue @@ -34,10 +35,6 @@ pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { } match key.code { - KeyCode::Esc => { - app.action = None; - return Outcome::Exit; - } KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { app.action = None; return Outcome::Exit; @@ -60,7 +57,18 @@ pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { } fn handle_history_key(key: KeyEvent, app: &mut App) -> Outcome { + match app.mode { + Mode::Insert => handle_history_insert_key(key, app), + Mode::Normal => handle_history_normal_key(key, app), + } +} + +fn handle_history_insert_key(key: KeyEvent, app: &mut App) -> Outcome { match key.code { + KeyCode::Esc => { + app.enter_normal_mode(); + Outcome::Continue + } KeyCode::Enter => { if let Some(cmd) = app.selected_command() { app.action = Some(Action::Run(cmd.to_string())); @@ -103,13 +111,63 @@ fn handle_history_key(key: KeyEvent, app: &mut App) -> Outcome { } } +fn handle_history_normal_key(key: KeyEvent, app: &mut App) -> Outcome { + match key.code { + KeyCode::Char('i') | KeyCode::Char('/') => { + app.enter_insert_mode(); + Outcome::Continue + } + KeyCode::Char('j') | KeyCode::Down => { + app.move_down(); + Outcome::Continue + } + KeyCode::Char('k') | KeyCode::Up => { + app.move_up(); + Outcome::Continue + } + KeyCode::Char('d') => { + app.begin_delete_confirm_history(); + Outcome::Continue + } + KeyCode::Enter => { + if let Some(cmd) = app.selected_command() { + app.action = Some(Action::Run(cmd.to_string())); + } + Outcome::Exit + } + KeyCode::Char('q') | KeyCode::Esc => { + app.action = None; + Outcome::Exit + } + _ => Outcome::Continue, + } +} + fn handle_ws_key(key: KeyEvent, app: &mut App) -> Outcome { + match key.code { + KeyCode::Tab => { + app.toggle_ws_pane(); + return Outcome::Continue; + } + KeyCode::Esc => { + return Outcome::Exit; + } + _ => {} + } + + match app.ws_pane { + WsPane::List => handle_ws_list_key(key, app), + WsPane::Commands => handle_ws_commands_key(key, app), + } +} + +fn handle_ws_list_key(key: KeyEvent, app: &mut App) -> Outcome { match key.code { KeyCode::Enter => { app.begin_replay_confirm(); Outcome::Continue } - KeyCode::Up => { + KeyCode::Up | KeyCode::Char('k') => { app.ws_move_up(); Outcome::Continue } @@ -117,7 +175,7 @@ fn handle_ws_key(key: KeyEvent, app: &mut App) -> Outcome { app.ws_move_up(); Outcome::Continue } - KeyCode::Down => { + KeyCode::Down | KeyCode::Char('j') => { app.ws_move_down(); Outcome::Continue } @@ -129,9 +187,28 @@ fn handle_ws_key(key: KeyEvent, app: &mut App) -> Outcome { } } +fn handle_ws_commands_key(key: KeyEvent, app: &mut App) -> Outcome { + match key.code { + KeyCode::Up | KeyCode::Char('k') => { + app.ws_cmd_move_up(); + Outcome::Continue + } + KeyCode::Down | KeyCode::Char('j') => { + app.ws_cmd_move_down(); + Outcome::Continue + } + KeyCode::Char('d') => { + app.begin_delete_confirm_ws(); + Outcome::Continue + } + _ => Outcome::Continue, + } +} + #[cfg(test)] mod tests { use super::*; + use crate::tui::app::{DeleteOrigin, Mode, WsPane}; use crate::workspaces::WorkspaceRow; use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; @@ -206,12 +283,21 @@ mod tests { app } - #[test] - fn esc_sets_no_action_and_exits() { - let mut app = app_with_rows(); - let outcome = handle_key(key(KeyCode::Esc), &mut app); - assert!(app.action.is_none()); - assert!(matches!(outcome, Outcome::Exit)); + fn app_with_workspaces_and_commands() -> App { + let mut app = app_with_workspaces(); + app.ws_commands = vec![crate::search::CommandRow { + id: 10, + command: "git status".into(), + directory: "/tmp".into(), + project: "p".into(), + session_id: "s1".into(), + timestamp: 1000, + exit_code: 0, + duration_ms: 100, + tags: "[]".into(), + workspace: Some("ws-new".into()), + }]; + app } #[test] @@ -223,7 +309,7 @@ mod tests { } #[test] - fn enter_sets_run_action_and_exits() { + fn history_insert_enter_sets_run_action_and_exits() { let mut app = app_with_rows(); let outcome = handle_key(key(KeyCode::Enter), &mut app); assert!(matches!(outcome, Outcome::Exit)); @@ -231,7 +317,7 @@ mod tests { } #[test] - fn tab_sets_edit_action_and_exits() { + fn history_insert_tab_sets_edit_action_and_exits() { let mut app = app_with_rows(); let outcome = handle_key(key(KeyCode::Tab), &mut app); assert!(matches!(outcome, Outcome::Exit)); @@ -239,65 +325,128 @@ mod tests { } #[test] - fn up_arrow_moves_to_older_command() { + fn history_insert_esc_enters_normal_mode_no_exit() { let mut app = app_with_rows(); - app.selected = 0; - let cmd_before = app.selected_command().map(str::to_string); - handle_key(key(KeyCode::Up), &mut app); - let cmd_after = app.selected_command().map(str::to_string); - assert_ne!(cmd_before, cmd_after, "Up must change the selected command"); - assert_eq!( - app.selected, 1, - "Up increases selected index toward older row" - ); + assert_eq!(app.mode, Mode::Insert); + let outcome = handle_key(key(KeyCode::Esc), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert_eq!(app.mode, Mode::Normal); + } + + #[test] + fn history_normal_i_enters_insert_mode() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Char('i')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert_eq!(app.mode, Mode::Insert); + } + + #[test] + fn history_normal_slash_enters_insert_mode() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Char('/')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert_eq!(app.mode, Mode::Insert); } #[test] - fn down_arrow_moves_to_newer_command() { + fn history_normal_j_moves_down() { let mut app = app_with_rows(); + app.enter_normal_mode(); app.selected = 1; - let cmd_before = app.selected_command().map(str::to_string); - handle_key(key(KeyCode::Down), &mut app); - let cmd_after = app.selected_command().map(str::to_string); - assert_ne!( - cmd_before, cmd_after, - "Down must change the selected command" - ); - assert_eq!( - app.selected, 0, - "Down decreases selected index toward newer row" - ); + handle_key(key(KeyCode::Char('j')), &mut app); + assert_eq!(app.selected, 0); } #[test] - fn ctrl_p_moves_to_older_command() { + fn history_normal_k_moves_up() { let mut app = app_with_rows(); + app.enter_normal_mode(); app.selected = 0; - handle_key(ctrl(KeyCode::Char('p')), &mut app); - assert_eq!( - app.selected, 1, - "Ctrl-P increases selected index toward older row" - ); + handle_key(key(KeyCode::Char('k')), &mut app); + assert_eq!(app.selected, 1); } #[test] - fn ctrl_n_moves_to_newer_command() { + fn history_normal_d_opens_delete_confirm() { let mut app = app_with_rows(); - app.selected = 1; - handle_key(ctrl(KeyCode::Char('n')), &mut app); - assert_eq!( - app.selected, 0, - "Ctrl-N decreases selected index toward newer row" - ); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Char('d')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.confirm.is_some()); + assert!(matches!( + app.confirm.as_ref().unwrap(), + Confirm::Delete(d) if matches!(d.origin, DeleteOrigin::History) + )); } #[test] - fn printable_char_appends_to_query() { + fn history_normal_enter_runs_and_exits() { let mut app = app_with_rows(); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + assert!(matches!(&app.action, Some(Action::Run(_)))); + } + + #[test] + fn history_normal_q_exits() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Char('q')), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + } + + #[test] + fn history_normal_esc_exits() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Esc), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + } + + #[test] + fn history_insert_typing_still_filters_regression() { + let mut app = app_with_rows(); + assert_eq!(app.mode, Mode::Insert); handle_key(key(KeyCode::Char('g')), &mut app); assert_eq!(app.query, "g"); } + #[test] + fn history_insert_up_arrow_moves_to_older_command() { + let mut app = app_with_rows(); + app.selected = 0; + handle_key(key(KeyCode::Up), &mut app); + assert_eq!(app.selected, 1); + } + + #[test] + fn history_insert_down_arrow_moves_to_newer_command() { + let mut app = app_with_rows(); + app.selected = 1; + handle_key(key(KeyCode::Down), &mut app); + assert_eq!(app.selected, 0); + } + + #[test] + fn history_ctrl_p_moves_up() { + let mut app = app_with_rows(); + app.selected = 0; + handle_key(ctrl(KeyCode::Char('p')), &mut app); + assert_eq!(app.selected, 1); + } + + #[test] + fn history_ctrl_n_moves_down() { + let mut app = app_with_rows(); + app.selected = 1; + handle_key(ctrl(KeyCode::Char('n')), &mut app); + assert_eq!(app.selected, 0); + } + #[test] fn backspace_removes_last_char() { let mut app = app_with_rows(); @@ -413,24 +562,11 @@ mod tests { } #[test] - fn ws_enter_is_continue_not_exit() { - let mut app = app_with_workspaces(); + fn ws_enter_opens_confirm_modal() { + let mut app = app_with_workspaces_and_commands(); let outcome = handle_key(key(KeyCode::Enter), &mut app); - assert!( - matches!(outcome, Outcome::Continue), - "Workspaces Enter must be Continue (no-op in PR2)" - ); - } - - #[test] - fn ws_enter_does_not_change_tab_or_filters() { - let mut app = app_with_workspaces(); - handle_key(key(KeyCode::Enter), &mut app); - assert_eq!(app.tab, Tab::Workspaces, "Enter must not change tab"); - assert!( - app.filters.session.is_none(), - "Enter must not set session filter" - ); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.confirm.is_some(), "Enter must open confirm modal"); } #[test] @@ -468,33 +604,8 @@ mod tests { assert_eq!(app.query, "g"); } - fn app_with_workspaces_and_commands() -> App { - let mut app = app_with_workspaces(); - app.ws_commands = vec![crate::search::CommandRow { - id: 10, - command: "git status".into(), - directory: "/tmp".into(), - project: "p".into(), - session_id: "s1".into(), - timestamp: 1000, - exit_code: 0, - duration_ms: 100, - tags: "[]".into(), - workspace: Some("ws-new".into()), - }]; - app - } - #[test] - fn ws_enter_opens_confirm_modal() { - let mut app = app_with_workspaces_and_commands(); - let outcome = handle_key(key(KeyCode::Enter), &mut app); - assert!(matches!(outcome, Outcome::Continue)); - assert!(app.confirm.is_some(), "Enter must open confirm modal"); - } - - #[test] - fn confirm_y_sets_replay_workspace_clears_confirm_and_exits() { + fn confirm_replay_y_sets_replay_workspace_clears_confirm_and_exits() { let mut app = app_with_workspaces_and_commands(); handle_key(key(KeyCode::Enter), &mut app); assert!(app.confirm.is_some()); @@ -505,7 +616,7 @@ mod tests { } #[test] - fn confirm_n_cancels_and_continues() { + fn confirm_replay_n_cancels_and_continues() { let mut app = app_with_workspaces_and_commands(); handle_key(key(KeyCode::Enter), &mut app); let outcome = handle_key(key(KeyCode::Char('n')), &mut app); @@ -515,7 +626,7 @@ mod tests { } #[test] - fn confirm_esc_cancels_and_continues() { + fn confirm_replay_esc_cancels_and_continues() { let mut app = app_with_workspaces_and_commands(); handle_key(key(KeyCode::Enter), &mut app); let outcome = handle_key(key(KeyCode::Esc), &mut app); @@ -523,6 +634,69 @@ mod tests { assert!(app.confirm.is_none()); } + #[test] + fn delete_confirm_y_sets_pending_delete_continue_not_exit() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char('d')), &mut app); + assert!(app.confirm.is_some()); + let expected_id = if let Some(Confirm::Delete(d)) = app.confirm.as_ref() { + d.id + } else { + panic!("expected Delete confirm"); + }; + let outcome = handle_key(key(KeyCode::Char('y')), &mut app); + assert!( + matches!(outcome, Outcome::Continue), + "delete y must Continue, not Exit" + ); + assert!(app.confirm.is_none()); + assert!( + matches!(app.pending_delete, Some((id, DeleteOrigin::History)) if id == expected_id) + ); + } + + #[test] + fn delete_confirm_n_cancels_and_continues() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char('d')), &mut app); + let outcome = handle_key(key(KeyCode::Char('n')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.confirm.is_none()); + assert!(app.pending_delete.is_none()); + } + + #[test] + fn ws_tab_toggles_pane() { + let mut app = app_with_workspaces(); + assert_eq!(app.ws_pane, WsPane::List); + handle_key(key(KeyCode::Tab), &mut app); + assert_eq!(app.ws_pane, WsPane::Commands); + handle_key(key(KeyCode::Tab), &mut app); + assert_eq!(app.ws_pane, WsPane::List); + } + + #[test] + fn ws_commands_pane_d_opens_delete_confirm_with_ws_command_id() { + let mut app = app_with_workspaces_and_commands(); + app.ws_pane = WsPane::Commands; + app.ws_cmd_selected = 0; + let expected_id = app.ws_commands[0].id; + let outcome = handle_key(key(KeyCode::Char('d')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!( + matches!(app.confirm.as_ref(), Some(Confirm::Delete(d)) if d.id == expected_id && matches!(d.origin, DeleteOrigin::Workspace)) + ); + } + + #[test] + fn ws_esc_exits() { + let mut app = app_with_workspaces(); + let outcome = handle_key(key(KeyCode::Esc), &mut app); + assert!(matches!(outcome, Outcome::Exit)); + } + #[test] fn confirm_other_key_does_not_leak_through() { let mut app = app_with_workspaces_and_commands(); @@ -560,4 +734,35 @@ mod tests { assert!(matches!(outcome, Outcome::Exit)); assert!(matches!(&app.action, Some(Action::Run(_)))); } + + #[test] + fn ws_enter_is_continue_not_exit() { + let mut app = app_with_workspaces(); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!( + matches!(outcome, Outcome::Continue), + "Workspaces Enter must be Continue" + ); + } + + #[test] + fn ws_enter_does_not_change_tab_or_filters() { + let mut app = app_with_workspaces(); + handle_key(key(KeyCode::Enter), &mut app); + assert_eq!(app.tab, Tab::Workspaces, "Enter must not change tab"); + assert!( + app.filters.session.is_none(), + "Enter must not set session filter" + ); + } + + #[test] + fn replay_confirm_is_still_replay_type() { + let mut app = app_with_workspaces_and_commands(); + handle_key(key(KeyCode::Enter), &mut app); + assert!( + matches!(app.confirm.as_ref(), Some(Confirm::Replay(_))), + "Enter in Workspaces List must open Replay confirm, not Delete" + ); + } } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 018aa7f..1833c2e 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -18,7 +18,7 @@ use rusqlite::Connection; use crate::error::ThothError; use crate::export::{self, ExportArgs}; use crate::search::Column; -use crate::tui::app::{Action, App}; +use crate::tui::app::{Action, App, DeleteOrigin}; use crate::tui::event::{handle_key, Outcome}; use crate::tui::render::format_action_line; @@ -91,6 +91,27 @@ pub fn run( match handle_key(key, &mut app) { Outcome::Exit => break, Outcome::Continue => { + if let Some((id, origin)) = app.pending_delete.take() { + crate::forget::delete_targets(conn, &[id]) + .map_err(|e| ThothError::Tui(format!("delete failed: {e}")))?; + match origin { + DeleteOrigin::History => { + app.reload(conn, now).map_err(|e| { + ThothError::Tui(format!("history reload failed: {e}")) + })?; + } + DeleteOrigin::Workspace => { + app.reload_workspaces(conn).map_err(|e| { + ThothError::Tui(format!("workspace reload failed: {e}")) + })?; + app.reload_ws_commands(conn).map_err(|e| { + ThothError::Tui(format!( + "workspace commands reload failed: {e}" + )) + })?; + } + } + } if app.needs_ws_reload { app.reload_workspaces(conn).map_err(|e| { ThothError::Tui(format!("workspace reload failed: {e}")) diff --git a/src/tui/render.rs b/src/tui/render.rs index 616db27..7db40d1 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -7,7 +7,7 @@ use ratatui::{ }; use crate::search::{Column, CommandRow}; -use crate::tui::app::{App, Tab}; +use crate::tui::app::{App, Confirm, Mode, Tab, WsPane}; use crate::tui::time::format_relative; use crate::workspaces::WorkspaceRow; @@ -312,13 +312,17 @@ fn render_workspaces_pane( app: &App, now: i64, table_state: &mut TableState, + cmd_table_state: &mut TableState, ) { let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); - let border_style = Style::default().fg(BORDER_COLOR); let highlight_style = Style::default() .add_modifier(Modifier::REVERSED) .add_modifier(Modifier::BOLD); + let list_focused = app.ws_pane == WsPane::List; + let accent_border = Style::default().fg(ACCENT); + let dim_border = Style::default().fg(BORDER_COLOR); + let h_chunks = Layout::horizontal([Constraint::Percentage(38), Constraint::Min(1)]).split(area); let left_area = h_chunks[0]; @@ -327,8 +331,19 @@ fn render_workspaces_pane( let workspaces_block = Block::default() .borders(Borders::ALL) .border_type(BorderType::Rounded) - .border_style(border_style) - .title(Span::styled(" workspaces ", dim_style)); + .border_style(if list_focused { + accent_border + } else { + dim_border + }) + .title(Span::styled( + " workspaces ", + if list_focused { + Style::default().fg(ACCENT) + } else { + dim_style + }, + )); let inner_left = workspaces_block.inner(left_area); frame.render_widget(workspaces_block, left_area); @@ -353,11 +368,23 @@ fn render_workspaces_pane( frame.render_stateful_widget(table, inner_left, table_state); } + let commands_focused = app.ws_pane == WsPane::Commands; let commands_block = Block::default() .borders(Borders::ALL) .border_type(BorderType::Rounded) - .border_style(border_style) - .title(Span::styled(" commands ", dim_style)); + .border_style(if commands_focused { + accent_border + } else { + dim_border + }) + .title(Span::styled( + " commands ", + if commands_focused { + Style::default().fg(ACCENT) + } else { + dim_style + }, + )); let inner_right = commands_block.inner(right_area); frame.render_widget(commands_block, right_area); @@ -393,8 +420,16 @@ fn render_workspaces_pane( Constraint::Min(1), ]; - let table = Table::new(rows, widths).block(Block::default()); - frame.render_widget(table, inner_right); + if commands_focused { + let table = Table::new(rows, widths) + .block(Block::default()) + .row_highlight_style(highlight_style); + cmd_table_state.select(Some(app.ws_cmd_selected)); + frame.render_stateful_widget(table, inner_right, cmd_table_state); + } else { + let table = Table::new(rows, widths).block(Block::default()); + frame.render_widget(table, inner_right); + } } } @@ -416,6 +451,26 @@ pub fn draw( is_bottom: bool, columns: &[Column], table_state: &mut TableState, +) { + draw_with_cmd_state( + frame, + app, + now, + is_bottom, + columns, + table_state, + &mut TableState::default(), + ); +} + +pub fn draw_with_cmd_state( + frame: &mut Frame, + app: &App, + now: i64, + is_bottom: bool, + columns: &[Column], + table_state: &mut TableState, + cmd_table_state: &mut TableState, ) { let area = frame.area(); @@ -481,7 +536,7 @@ pub fn draw( ); } Tab::Workspaces => { - render_workspaces_pane(frame, middle_area, app, now, table_state); + render_workspaces_pane(frame, middle_area, app, now, table_state, cmd_table_state); } } @@ -505,35 +560,74 @@ pub fn draw( ); let controls_line = match app.tab { - Tab::History => Line::from(vec![ - Span::styled(" ←→", accent_style), - Span::styled(" tabs", dim_style), - Span::styled(" · ", dim_style), - Span::styled("↑↓", accent_style), - Span::styled(" navigate", dim_style), - Span::styled(" · ", dim_style), - Span::styled("↵", accent_style), - Span::styled(" run", dim_style), - Span::styled(" · ", dim_style), - Span::styled("⇥", accent_style), - Span::styled(" edit", dim_style), - Span::styled(" · ", dim_style), - Span::styled("esc", accent_style), - Span::styled(" quit", dim_style), - ]), - Tab::Workspaces => Line::from(vec![ - Span::styled(" ←→", accent_style), - Span::styled(" tabs", dim_style), - Span::styled(" · ", dim_style), - Span::styled("↑↓", accent_style), - Span::styled(" workspace", dim_style), - Span::styled(" · ", dim_style), - Span::styled("↵", accent_style), - Span::styled(" replay", dim_style), - Span::styled(" · ", dim_style), - Span::styled("esc", accent_style), - Span::styled(" quit", dim_style), - ]), + Tab::History => match app.mode { + Mode::Insert => Line::from(vec![ + Span::styled(" ↑↓", accent_style), + Span::styled(" nav", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↵", accent_style), + Span::styled(" run", dim_style), + Span::styled(" · ", dim_style), + Span::styled("⇥", accent_style), + Span::styled(" edit", dim_style), + Span::styled(" · ", dim_style), + Span::styled("esc", accent_style), + Span::styled(" normal", dim_style), + Span::styled(" · ", dim_style), + Span::styled("^c", accent_style), + Span::styled(" quit", dim_style), + ]), + Mode::Normal => Line::from(vec![ + Span::styled(" j/k", accent_style), + Span::styled(" move", dim_style), + Span::styled(" · ", dim_style), + Span::styled("d", accent_style), + Span::styled(" delete", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↵", accent_style), + Span::styled(" run", dim_style), + Span::styled(" · ", dim_style), + Span::styled("i", accent_style), + Span::styled(" search", dim_style), + Span::styled(" · ", dim_style), + Span::styled("q", accent_style), + Span::styled(" quit", dim_style), + ]), + }, + Tab::Workspaces => match app.ws_pane { + WsPane::List => Line::from(vec![ + Span::styled(" ←→", accent_style), + Span::styled(" tabs", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↑↓", accent_style), + Span::styled(" workspace", dim_style), + Span::styled(" · ", dim_style), + Span::styled("⇥", accent_style), + Span::styled(" commands", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↵", accent_style), + Span::styled(" replay", dim_style), + Span::styled(" · ", dim_style), + Span::styled("esc", accent_style), + Span::styled(" quit", dim_style), + ]), + WsPane::Commands => Line::from(vec![ + Span::styled(" ←→", accent_style), + Span::styled(" tabs", dim_style), + Span::styled(" · ", dim_style), + Span::styled("↑↓", accent_style), + Span::styled(" command", dim_style), + Span::styled(" · ", dim_style), + Span::styled("d", accent_style), + Span::styled(" delete", dim_style), + Span::styled(" · ", dim_style), + Span::styled("⇥", accent_style), + Span::styled(" back", dim_style), + Span::styled(" · ", dim_style), + Span::styled("esc", accent_style), + Span::styled(" quit", dim_style), + ]), + }, }; frame.render_widget(Paragraph::new(controls_line), controls_area); } @@ -570,32 +664,61 @@ fn render_confirm_modal(frame: &mut Frame, area: Rect, app: &crate::tui::app::Ap frame.render_widget(Clear, modal_area); - let ws_name = truncate(&confirm.workspace, 20); - let title = format!(" Replay '{ws_name}' ({} commands)? ", confirm.count); - let block = Block::default() - .borders(Borders::ALL) - .border_type(BorderType::Rounded) - .border_style(Style::default().fg(ACCENT)) - .title(Span::styled(title, accent_style)); - - let inner = block.inner(modal_area); - frame.render_widget(block, modal_area); - - let hint = Paragraph::new(Line::from(vec![ - Span::styled("[y]", accent_style), - Span::styled(" run all ", dim_style), - Span::styled("[n]", accent_style), - Span::styled(" cancel", dim_style), - ])) - .alignment(Alignment::Center); - frame.render_widget(hint, inner); + match confirm { + Confirm::Replay(r) => { + let ws_name = truncate(&r.workspace, 20); + let title = format!(" Replay '{ws_name}' ({} commands)? ", r.count); + let block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(Style::default().fg(ACCENT)) + .title(Span::styled(title, accent_style)); + + let inner = block.inner(modal_area); + frame.render_widget(block, modal_area); + + let hint = Paragraph::new(Line::from(vec![ + Span::styled("[y]", accent_style), + Span::styled(" run all ", dim_style), + Span::styled("[n]", accent_style), + Span::styled(" cancel", dim_style), + ])) + .alignment(Alignment::Center); + frame.render_widget(hint, inner); + } + Confirm::Delete(d) => { + let label = truncate(&d.label, 30); + let block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(Style::default().fg(Color::Red)) + .title(Span::styled( + " Delete this command? ", + Style::default().fg(Color::Red).add_modifier(Modifier::BOLD), + )); + + let inner = block.inner(modal_area); + frame.render_widget(block, modal_area); + + let hint = Paragraph::new(Line::from(vec![ + Span::styled(&label, dim_style), + Span::styled(" ", dim_style), + Span::styled("[y]", accent_style), + Span::styled(" delete ", dim_style), + Span::styled("[n]", accent_style), + Span::styled(" cancel", dim_style), + ])) + .alignment(Alignment::Center); + frame.render_widget(hint, inner); + } + } } #[cfg(test)] mod tests { use super::*; use crate::config::default_tui_columns; - use crate::tui::app::{Action, App, Tab}; + use crate::tui::app::{Action, App, Confirm, ConfirmDelete, DeleteOrigin, Tab, WsPane}; use crate::workspaces::WorkspaceRow; use ratatui::backend::TestBackend; use ratatui::Terminal; @@ -828,23 +951,52 @@ mod tests { } #[test] - fn controls_history_shows_navigate_and_run() { + fn controls_history_insert_shows_nav_and_run() { let app = app_with_rows(); let text = render_app(&app); assert!( - text.contains("navigate"), - "History controls must contain 'navigate'" + text.contains("nav"), + "History Insert controls must contain 'nav'" + ); + assert!( + text.contains("run"), + "History Insert controls must contain 'run'" ); - assert!(text.contains("run"), "History controls must contain 'run'"); assert!( text.contains("edit"), - "History controls must contain 'edit'" + "History Insert controls must contain 'edit'" + ); + assert!( + text.contains("normal"), + "History Insert controls must hint 'normal' for esc" + ); + } + + #[test] + fn controls_history_normal_shows_jk_and_delete() { + let mut app = app_with_rows(); + app.mode = crate::tui::app::Mode::Normal; + let text = render_app(&app); + assert!( + text.contains("move"), + "History Normal controls must contain 'move'" + ); + assert!( + text.contains("delete"), + "History Normal controls must contain 'delete'" + ); + assert!( + text.contains("run"), + "History Normal controls must contain 'run'" + ); + assert!( + text.contains("search"), + "History Normal controls must contain 'search'" ); assert!( text.contains("quit"), - "History controls must contain 'quit'" + "History Normal controls must contain 'quit'" ); - assert!(text.contains("tabs"), "History controls must hint 'tabs'"); } #[test] @@ -1790,10 +1942,12 @@ mod tests { #[test] fn confirm_modal_shows_when_confirm_is_set() { let mut app = app_with_workspaces(); - app.confirm = Some(crate::tui::app::ConfirmReplay { - workspace: "proj-alpha".into(), - count: 5, - }); + app.confirm = Some(crate::tui::app::Confirm::Replay( + crate::tui::app::ConfirmReplay { + workspace: "proj-alpha".into(), + count: 5, + }, + )); let text = render_app(&app); assert!( text.contains("proj-alpha"), @@ -1855,4 +2009,74 @@ mod tests { assert!(text.contains("workspaces"), "must show workspaces pane"); assert!(text.contains("commands"), "must show commands pane"); } + + #[test] + fn delete_confirm_modal_shows_delete_text() { + let mut app = app_with_workspaces(); + app.confirm = Some(Confirm::Delete(ConfirmDelete { + id: 42, + label: "cargo build --release".into(), + origin: DeleteOrigin::History, + })); + let text = render_app(&app); + assert!( + text.contains("Delete"), + "delete confirm modal must show 'Delete'; got:\n{text}" + ); + assert!( + text.contains("[y]") || text.contains("y"), + "delete confirm modal must show y hint; got:\n{text}" + ); + assert!( + text.contains("[n]") || text.contains("n"), + "delete confirm modal must show n hint; got:\n{text}" + ); + } + + #[test] + fn ws_list_pane_focused_has_accent_border() { + let app = app_with_workspaces(); + assert_eq!(app.ws_pane, WsPane::List); + let buf = render_app_buf(&app); + let list_pane_area_x = 1u16; + let any_accent_in_left_border = (0..TEST_HEIGHT).any(|row_y| { + let cell = &buf[(list_pane_area_x, row_y)]; + cell.style().fg == Some(ACCENT) + }); + assert!( + any_accent_in_left_border, + "focused List pane must have ACCENT border somewhere; ws_pane=List" + ); + } + + #[test] + fn ws_commands_pane_focused_has_accent_border() { + let mut app = app_with_workspaces(); + app.ws_pane = WsPane::Commands; + let buf = render_app_buf(&app); + let cmd_pane_x = (TEST_WIDTH as f32 * 0.38) as u16 + 1; + let any_accent_in_cmd_border = (0..TEST_HEIGHT).any(|row_y| { + let cell = &buf[(cmd_pane_x, row_y)]; + cell.style().fg == Some(ACCENT) + }); + assert!( + any_accent_in_cmd_border, + "focused Commands pane must have ACCENT border somewhere; ws_pane=Commands" + ); + } + + #[test] + fn controls_workspaces_commands_pane_shows_delete_hint() { + let mut app = app_with_workspaces(); + app.ws_pane = WsPane::Commands; + let text = render_app(&app); + assert!( + text.contains("delete"), + "Workspaces Commands controls must contain 'delete'; got:\n{text}" + ); + assert!( + text.contains("back"), + "Workspaces Commands controls must contain 'back'; got:\n{text}" + ); + } } From d3434bc848ec0c690048c2d3cd3713f8244bf7b2 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 15:16:48 -0600 Subject: [PATCH 112/151] style(tui): fmt render.rs dump test (#56) --- src/tui/render.rs | 131 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/src/tui/render.rs b/src/tui/render.rs index 7db40d1..a954fad 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -2079,4 +2079,135 @@ mod tests { "Workspaces Commands controls must contain 'back'; got:\n{text}" ); } + + #[test] + fn dump_pr4a_screenshots() { + const NOW: i64 = 1_000_000_000; + const W: u16 = 100; + const H: u16 = 18; + + let make_r = |cmd: &str, ts: i64, exit: i64| CommandRow { + id: 0, + command: cmd.to_string(), + timestamp: ts, + exit_code: exit, + project: "proj".to_string(), + directory: "/home/user/proj".to_string(), + tags: "[]".to_string(), + session_id: "s1".to_string(), + duration_ms: 100, + workspace: None, + }; + + let make_rows = || { + vec![ + make_r("git status", NOW - 60, 0), + make_r("cargo build --release", NOW - 300, 0), + make_r("cargo test", NOW - 1200, 0), + make_r("docker run -p 8080:80 nginx", NOW - 3600, 1), + ] + }; + + let render_text = |app: &App| -> String { + let backend = TestBackend::new(W, H); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + let mut cts = TableState::default(); + let cols = default_cols(); + terminal + .draw(|f| draw_with_cmd_state(f, app, NOW, true, &cols, &mut ts, &mut cts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..H { + let mut line = String::new(); + for col in 0..W { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line.trim_end().to_string()); + } + lines.join("\n") + }; + + let mut app_a = App::new(); + app_a.all_rows = make_rows(); + app_a.recompute(); + app_a.enter_normal_mode(); + app_a.selected = 1; + let dump_a = render_text(&app_a); + println!("\n=== DUMP (a): History in Normal mode ===\n{dump_a}"); + + let mut app_b = App::new(); + app_b.all_rows = make_rows(); + app_b.recompute(); + app_b.selected = 0; + app_b.confirm = Some(Confirm::Delete(ConfirmDelete { + id: 42, + label: "cargo test".into(), + origin: DeleteOrigin::History, + })); + let dump_b = render_text(&app_b); + println!("\n=== DUMP (b): Delete confirm modal ===\n{dump_b}"); + + let ws_rows = vec![ + CommandRow { + id: 1, + command: "git status".into(), + timestamp: NOW - 500, + exit_code: 0, + project: "proj".into(), + directory: "/home/user".into(), + tags: "[]".into(), + session_id: "s1".into(), + duration_ms: 50, + workspace: Some("my-workspace".into()), + }, + CommandRow { + id: 2, + command: "cargo build --release".into(), + timestamp: NOW - 400, + exit_code: 0, + project: "proj".into(), + directory: "/home/user".into(), + tags: "[]".into(), + session_id: "s1".into(), + duration_ms: 8000, + workspace: Some("my-workspace".into()), + }, + CommandRow { + id: 3, + command: "cargo test -- --nocapture".into(), + timestamp: NOW - 300, + exit_code: 1, + project: "proj".into(), + directory: "/home/user".into(), + tags: "[]".into(), + session_id: "s1".into(), + duration_ms: 3000, + workspace: Some("my-workspace".into()), + }, + ]; + use crate::workspaces::WorkspaceRow; + let mut app_c = App::new(); + app_c.tab = Tab::Workspaces; + app_c.ws_pane = WsPane::Commands; + app_c.workspaces = vec![WorkspaceRow { + name: "my-workspace".into(), + command_count: 3, + first_ts: NOW - 500, + last_ts: NOW - 300, + }]; + app_c.ws_selected = 0; + app_c.ws_commands = ws_rows; + app_c.ws_cmd_selected = 1; + let dump_c = render_text(&app_c); + println!("\n=== DUMP (c): Workspaces with Commands pane focused ===\n{dump_c}"); + + assert!(dump_a.contains("j/k"), "Normal mode controls must show j/k"); + assert!(dump_b.contains("Delete"), "Delete modal must show 'Delete'"); + assert!( + dump_c.contains("back"), + "Commands pane controls must show 'back'" + ); + } } From f55c3cde81c800dbac8a2843dbfbf4489c319877 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 15:23:15 -0600 Subject: [PATCH 113/151] fix(tui): allow Ctrl-C to exit while a confirm modal is open (#56) --- src/tui/event.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/tui/event.rs b/src/tui/event.rs index 143b8fa..5ed83bc 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -4,6 +4,10 @@ use crate::tui::app::{Action, App, Confirm, Mode, Tab, WsPane}; fn handle_confirm_key(key: crossterm::event::KeyEvent, app: &mut App) -> Outcome { use crossterm::event::KeyCode; + if key.code == KeyCode::Char('c') && key.modifiers.contains(KeyModifiers::CONTROL) { + app.action = None; + return Outcome::Exit; + } match key.code { KeyCode::Char('y') | KeyCode::Char('Y') => match app.confirm.take() { Some(Confirm::Replay(r)) => { @@ -634,6 +638,19 @@ mod tests { assert!(app.confirm.is_none()); } + #[test] + fn ctrl_c_exits_even_with_confirm_open() { + let mut app = app_with_workspaces_and_commands(); + handle_key(key(KeyCode::Enter), &mut app); + assert!(app.confirm.is_some()); + let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app); + assert!( + matches!(outcome, Outcome::Exit), + "Ctrl-C must exit from any state" + ); + assert!(app.action.is_none()); + } + #[test] fn delete_confirm_y_sets_pending_delete_continue_not_exit() { let mut app = app_with_rows(); From bc6af262b9cf44e094b05478e485f2214e45b046 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 15:38:27 -0600 Subject: [PATCH 114/151] feat(tui): add in-place command edit via DELETE+INSERT for FTS safety (#58) --- src/cli.rs | 4 +- src/edit.rs | 220 ++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/tui/app.rs | 140 +++++++++++++++++++++++++++++ src/tui/event.rs | 144 ++++++++++++++++++++++++++++++ src/tui/mod.rs | 14 ++- src/tui/render.rs | 98 +++++++++++++++++++++ 7 files changed, 618 insertions(+), 3 deletions(-) create mode 100644 src/edit.rs diff --git a/src/cli.rs b/src/cli.rs index effc901..df7b7e6 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -307,9 +307,9 @@ pub fn run() -> Result<(), crate::error::ThothError> { match cli.cmd { None => { let cfg = crate::config::load(); - let conn = crate::database::get_connection(None)?; + let mut conn = crate::database::get_connection(None)?; let columns = crate::tui::render::resolve_tui_columns(&cfg.tui.columns); - crate::tui::run(&conn, now, cfg.tui.orientation.is_bottom(), columns)?; + crate::tui::run(&mut conn, now, cfg.tui.orientation.is_bottom(), columns)?; } Some(Cmd::Record(mut args)) => { crate::logging::setup(crate::paths::resolve_error_log()); diff --git a/src/edit.rs b/src/edit.rs new file mode 100644 index 0000000..acd91e8 --- /dev/null +++ b/src/edit.rs @@ -0,0 +1,220 @@ +use crate::error::ThothError; +use rusqlite::{Connection, TransactionBehavior}; + +type CommandFields = ( + String, + String, + String, + String, + i64, + i64, + i64, + String, + Option, + Option, +); + +pub fn edit_command(conn: &mut Connection, id: i64, new_command: &str) -> Result<(), ThothError> { + let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; + + let existing: Option = { + let mut stmt = tx.prepare( + "SELECT command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id, workspace \ + FROM commands WHERE id = ?1", + )?; + stmt.query_row(rusqlite::params![id], |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, String>(1)?, + row.get::<_, String>(2)?, + row.get::<_, String>(3)?, + row.get::<_, i64>(4)?, + row.get::<_, i64>(5)?, + row.get::<_, i64>(6)?, + row.get::<_, String>(7)?, + row.get::<_, Option>(8)?, + row.get::<_, Option>(9)?, + )) + }) + .ok() + }; + + let ( + _, + directory, + project, + session_id, + timestamp, + exit_code, + duration_ms, + tags, + terminal_id, + workspace, + ) = match existing { + Some(row) => row, + None => { + tx.rollback()?; + return Ok(()); + } + }; + + tx.execute("DELETE FROM commands WHERE id = ?1", rusqlite::params![id])?; + + tx.execute( + "INSERT INTO commands(id, command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id, workspace) \ + VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)", + rusqlite::params![ + id, + new_command, + directory, + project, + session_id, + timestamp, + exit_code, + duration_ms, + tags, + terminal_id, + workspace + ], + )?; + + tx.commit()?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn mem_conn() -> Connection { + let mut c = crate::database::connect_memory().unwrap(); + crate::database::apply_migrations(&mut c).unwrap(); + c + } + + fn seed(conn: &Connection, cmd: &str) -> i64 { + conn.execute( + "INSERT INTO commands(command, directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id, workspace) \ + VALUES(?1, '/home/user', 'myproject', 'ses-abc', 1700000001, 0, 250, '[\"rust\"]', 'term-1', 'ws-a')", + rusqlite::params![cmd], + ) + .unwrap(); + conn.last_insert_rowid() + } + + #[test] + fn edit_command_changes_command_text() { + let mut conn = mem_conn(); + let id = seed(&conn, "git stattus"); + edit_command(&mut conn, id, "git status").unwrap(); + let cmd: String = conn + .query_row( + "SELECT command FROM commands WHERE id = ?1", + rusqlite::params![id], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(cmd, "git status"); + } + + #[test] + fn edit_command_preserves_all_other_columns() { + let mut conn = mem_conn(); + let id = seed(&conn, "old cmd"); + edit_command(&mut conn, id, "new cmd").unwrap(); + + let (directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id, workspace): ( + String, String, String, i64, i64, i64, String, Option, Option, + ) = conn + .query_row( + "SELECT directory, project, session_id, timestamp, exit_code, duration_ms, tags, terminal_id, workspace \ + FROM commands WHERE id = ?1", + rusqlite::params![id], + |r| { + Ok(( + r.get(0)?, + r.get(1)?, + r.get(2)?, + r.get(3)?, + r.get(4)?, + r.get(5)?, + r.get(6)?, + r.get(7)?, + r.get(8)?, + )) + }, + ) + .unwrap(); + + assert_eq!(directory, "/home/user"); + assert_eq!(project, "myproject"); + assert_eq!(session_id, "ses-abc"); + assert_eq!(timestamp, 1700000001); + assert_eq!(exit_code, 0); + assert_eq!(duration_ms, 250); + assert_eq!(tags, "[\"rust\"]"); + assert_eq!(terminal_id, Some("term-1".into())); + assert_eq!(workspace, Some("ws-a".into())); + } + + #[test] + fn edit_command_preserves_same_id() { + let mut conn = mem_conn(); + let id = seed(&conn, "old cmd"); + edit_command(&mut conn, id, "new cmd").unwrap(); + let count: i64 = conn + .query_row( + "SELECT COUNT(*) FROM commands WHERE id = ?1", + rusqlite::params![id], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(count, 1, "row with same id must still exist"); + } + + #[test] + fn edit_command_nonexistent_id_is_noop() { + let mut conn = mem_conn(); + let result = edit_command(&mut conn, 99999, "anything"); + assert!(result.is_ok(), "nonexistent id must be a safe no-op"); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 0); + } + + #[test] + fn edit_command_keeps_fts_in_sync() { + let mut conn = mem_conn(); + if !crate::database::fts5_available(&conn) { + return; + } + + let id = seed(&conn, "old_unique_text_xyzzy"); + edit_command(&mut conn, id, "new_unique_text_quux").unwrap(); + + let found_new: Option = conn + .query_row( + "SELECT rowid FROM commands_fts WHERE commands_fts MATCH '\"new_unique_text_quux\"'", + [], + |r| r.get(0), + ) + .ok(); + assert!( + found_new.is_some(), + "FTS must find the new command text after edit" + ); + + let found_old: Option = conn + .query_row( + "SELECT rowid FROM commands_fts WHERE commands_fts MATCH '\"old_unique_text_xyzzy\"'", + [], + |r| r.get(0), + ) + .ok(); + assert!( + found_old.is_none(), + "FTS must NOT find the old command text after edit" + ); + } +} diff --git a/src/lib.rs b/src/lib.rs index 31dc900..cc4d0d9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ pub mod cli; pub mod config; pub mod database; pub mod doctor; +pub mod edit; pub mod error; pub mod export; pub mod forget; diff --git a/src/tui/app.rs b/src/tui/app.rs index ca54961..dcc3d75 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -52,6 +52,11 @@ pub enum Confirm { Delete(ConfirmDelete), } +pub struct EditState { + pub id: i64, + pub buffer: String, +} + pub struct FilterState { pub project: Option, pub tag: Vec, @@ -121,6 +126,8 @@ pub struct App { pub confirm: Option, pub replay_workspace: Option, pub pending_delete: Option<(i64, DeleteOrigin)>, + pub edit: Option, + pub pending_edit: Option<(i64, String)>, } impl Default for App { @@ -151,6 +158,8 @@ impl App { confirm: None, replay_workspace: None, pending_delete: None, + edit: None, + pending_edit: None, } } @@ -333,6 +342,51 @@ impl App { self.selected -= 1; } } + + pub fn begin_edit_history(&mut self) { + if let Some(id) = self.selected_history_id() { + let buffer = self + .filtered + .get(self.selected) + .and_then(|idx| self.all_rows.get(*idx)) + .map(|r| r.command.clone()) + .unwrap_or_default(); + self.edit = Some(EditState { id, buffer }); + } + } + + pub fn begin_edit_ws(&mut self) { + if let Some(id) = self.selected_ws_command_id() { + let buffer = self + .ws_commands + .get(self.ws_cmd_selected) + .map(|r| r.command.clone()) + .unwrap_or_default(); + self.edit = Some(EditState { id, buffer }); + } + } + + pub fn edit_push(&mut self, c: char) { + if let Some(ref mut es) = self.edit { + es.buffer.push(c); + } + } + + pub fn edit_backspace(&mut self) { + if let Some(ref mut es) = self.edit { + es.buffer.pop(); + } + } + + pub fn edit_cancel(&mut self) { + self.edit = None; + } + + pub fn edit_commit(&mut self) { + if let Some(es) = self.edit.take() { + self.pending_edit = Some((es.id, es.buffer)); + } + } } fn truncate_label(s: &str) -> String { @@ -888,4 +942,90 @@ mod tests { app.cancel_confirm(); assert!(app.confirm.is_none()); } + + #[test] + fn begin_edit_history_sets_edit_with_correct_id_and_buffer() { + let conn = make_conn(); + seed(&conn, "git status", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.selected = 0; + let expected_id = app.selected_history_id().unwrap(); + app.begin_edit_history(); + let es = app.edit.as_ref().unwrap(); + assert_eq!(es.id, expected_id); + assert_eq!(es.buffer, "git status"); + } + + #[test] + fn begin_edit_history_no_selection_is_noop() { + let mut app = App::new(); + app.begin_edit_history(); + assert!(app.edit.is_none()); + } + + #[test] + fn begin_edit_ws_sets_edit_with_correct_id_and_buffer() { + let mut app = app_with_ws("demo", 2); + app.ws_cmd_selected = 1; + let expected_id = app.ws_commands[1].id; + let expected_buf = app.ws_commands[1].command.clone(); + app.begin_edit_ws(); + let es = app.edit.as_ref().unwrap(); + assert_eq!(es.id, expected_id); + assert_eq!(es.buffer, expected_buf); + } + + #[test] + fn begin_edit_ws_no_selection_is_noop() { + let mut app = App::new(); + app.begin_edit_ws(); + assert!(app.edit.is_none()); + } + + #[test] + fn edit_push_appends_char_to_buffer() { + let mut app = App::new(); + app.edit = Some(EditState { + id: 1, + buffer: "git".into(), + }); + app.edit_push(' '); + app.edit_push('s'); + assert_eq!(app.edit.as_ref().unwrap().buffer, "git s"); + } + + #[test] + fn edit_backspace_removes_last_char() { + let mut app = App::new(); + app.edit = Some(EditState { + id: 1, + buffer: "git status".into(), + }); + app.edit_backspace(); + assert_eq!(app.edit.as_ref().unwrap().buffer, "git statu"); + } + + #[test] + fn edit_cancel_clears_edit() { + let mut app = App::new(); + app.edit = Some(EditState { + id: 1, + buffer: "something".into(), + }); + app.edit_cancel(); + assert!(app.edit.is_none()); + } + + #[test] + fn edit_commit_sets_pending_edit_and_clears_edit() { + let mut app = App::new(); + app.edit = Some(EditState { + id: 42, + buffer: "corrected cmd".into(), + }); + app.edit_commit(); + assert!(app.edit.is_none()); + assert_eq!(app.pending_edit, Some((42, "corrected cmd".to_string()))); + } } diff --git a/src/tui/event.rs b/src/tui/event.rs index 5ed83bc..1936114 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -2,6 +2,32 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use crate::tui::app::{Action, App, Confirm, Mode, Tab, WsPane}; +fn handle_edit_key(key: KeyEvent, app: &mut App) -> Outcome { + if key.code == KeyCode::Char('c') && key.modifiers.contains(KeyModifiers::CONTROL) { + app.action = None; + return Outcome::Exit; + } + match key.code { + KeyCode::Esc => { + app.edit_cancel(); + Outcome::Continue + } + KeyCode::Enter => { + app.edit_commit(); + Outcome::Continue + } + KeyCode::Backspace => { + app.edit_backspace(); + Outcome::Continue + } + KeyCode::Char(c) if !key.modifiers.contains(KeyModifiers::CONTROL) => { + app.edit_push(c); + Outcome::Continue + } + _ => Outcome::Continue, + } +} + fn handle_confirm_key(key: crossterm::event::KeyEvent, app: &mut App) -> Outcome { use crossterm::event::KeyCode; if key.code == KeyCode::Char('c') && key.modifiers.contains(KeyModifiers::CONTROL) { @@ -37,6 +63,9 @@ pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { if app.confirm.is_some() { return handle_confirm_key(key, app); } + if app.edit.is_some() { + return handle_edit_key(key, app); + } match key.code { KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { @@ -133,6 +162,10 @@ fn handle_history_normal_key(key: KeyEvent, app: &mut App) -> Outcome { app.begin_delete_confirm_history(); Outcome::Continue } + KeyCode::Char('e') => { + app.begin_edit_history(); + Outcome::Continue + } KeyCode::Enter => { if let Some(cmd) = app.selected_command() { app.action = Some(Action::Run(cmd.to_string())); @@ -205,6 +238,10 @@ fn handle_ws_commands_key(key: KeyEvent, app: &mut App) -> Outcome { app.begin_delete_confirm_ws(); Outcome::Continue } + KeyCode::Char('e') => { + app.begin_edit_ws(); + Outcome::Continue + } _ => Outcome::Continue, } } @@ -782,4 +819,111 @@ mod tests { "Enter in Workspaces List must open Replay confirm, not Delete" ); } + + #[test] + fn history_normal_e_opens_edit() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Char('e')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!( + app.edit.is_some(), + "e must open edit modal in History Normal" + ); + } + + #[test] + fn ws_commands_e_opens_edit() { + let mut app = app_with_workspaces_and_commands(); + app.ws_pane = WsPane::Commands; + let outcome = handle_key(key(KeyCode::Char('e')), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.edit.is_some(), "e must open edit modal in Ws Commands"); + } + + #[test] + fn edit_char_appends_to_buffer_not_query() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char('e')), &mut app); + assert!(app.edit.is_some()); + let query_before = app.query.clone(); + handle_key(key(KeyCode::Char('x')), &mut app); + assert_eq!( + app.query, query_before, + "typing while editing must not change query" + ); + assert!( + app.edit.as_ref().unwrap().buffer.ends_with('x'), + "x must append to edit buffer" + ); + } + + #[test] + fn edit_backspace_removes_from_buffer() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char('e')), &mut app); + let original_len = app.edit.as_ref().unwrap().buffer.len(); + handle_key(key(KeyCode::Backspace), &mut app); + assert_eq!( + app.edit.as_ref().unwrap().buffer.len(), + original_len.saturating_sub(1) + ); + } + + #[test] + fn edit_enter_commits_and_sets_pending_edit() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char('e')), &mut app); + assert!(app.edit.is_some()); + let outcome = handle_key(key(KeyCode::Enter), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.edit.is_none(), "edit must be cleared after Enter"); + assert!( + app.pending_edit.is_some(), + "pending_edit must be set after Enter" + ); + } + + #[test] + fn edit_esc_cancels() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char('e')), &mut app); + assert!(app.edit.is_some()); + let outcome = handle_key(key(KeyCode::Esc), &mut app); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.edit.is_none(), "Esc must cancel edit"); + assert!(app.pending_edit.is_none()); + } + + #[test] + fn ctrl_c_exits_even_while_editing() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char('e')), &mut app); + assert!(app.edit.is_some()); + let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app); + assert!( + matches!(outcome, Outcome::Exit), + "Ctrl-C must exit from edit mode" + ); + } + + #[test] + fn left_right_do_not_switch_tabs_while_editing() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char('e')), &mut app); + assert!(app.edit.is_some()); + let tab_before = app.tab; + handle_key(key(KeyCode::Left), &mut app); + handle_key(key(KeyCode::Right), &mut app); + assert_eq!( + app.tab, tab_before, + "Left/Right must not switch tab while editing" + ); + } } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 1833c2e..0940394 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -47,7 +47,7 @@ impl Drop for TerminalGuard { } pub fn run( - conn: &Connection, + conn: &mut Connection, now: i64, is_bottom: bool, columns: Vec, @@ -91,6 +91,18 @@ pub fn run( match handle_key(key, &mut app) { Outcome::Exit => break, Outcome::Continue => { + if let Some((id, new_cmd)) = app.pending_edit.take() { + crate::edit::edit_command(conn, id, &new_cmd) + .map_err(|e| ThothError::Tui(format!("edit failed: {e}")))?; + app.reload(conn, now).map_err(|e| { + ThothError::Tui(format!("history reload after edit failed: {e}")) + })?; + app.reload_ws_commands(conn).map_err(|e| { + ThothError::Tui(format!( + "ws commands reload after edit failed: {e}" + )) + })?; + } if let Some((id, origin)) = app.pending_delete.take() { crate::forget::delete_targets(conn, &[id]) .map_err(|e| ThothError::Tui(format!("delete failed: {e}")))?; diff --git a/src/tui/render.rs b/src/tui/render.rs index a954fad..dae923a 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -13,6 +13,8 @@ use crate::workspaces::WorkspaceRow; const ACCENT: Color = Color::Cyan; const DIM_COLOR: Color = Color::DarkGray; +const EDIT_MODAL_W: u16 = 60; +const EDIT_MODAL_H: u16 = 5; const BORDER_COLOR: Color = Color::DarkGray; pub fn display_command(raw: &str) -> String { @@ -543,6 +545,9 @@ pub fn draw_with_cmd_state( if app.confirm.is_some() { render_confirm_modal(frame, middle_area, app); } + if let Some(ref es) = app.edit { + render_edit_modal(frame, middle_area, es); + } let query_text = format!("> {}", app.query); frame.render_widget(Paragraph::new(query_text), query_area); @@ -584,6 +589,9 @@ pub fn draw_with_cmd_state( Span::styled("d", accent_style), Span::styled(" delete", dim_style), Span::styled(" · ", dim_style), + Span::styled("e", accent_style), + Span::styled(" edit", dim_style), + Span::styled(" · ", dim_style), Span::styled("↵", accent_style), Span::styled(" run", dim_style), Span::styled(" · ", dim_style), @@ -621,6 +629,9 @@ pub fn draw_with_cmd_state( Span::styled("d", accent_style), Span::styled(" delete", dim_style), Span::styled(" · ", dim_style), + Span::styled("e", accent_style), + Span::styled(" edit", dim_style), + Span::styled(" · ", dim_style), Span::styled("⇥", accent_style), Span::styled(" back", dim_style), Span::styled(" · ", dim_style), @@ -714,6 +725,40 @@ fn render_confirm_modal(frame: &mut Frame, area: Rect, app: &crate::tui::app::Ap } } +fn render_edit_modal(frame: &mut Frame, area: Rect, es: &crate::tui::app::EditState) { + let dim_style = Style::default().fg(DIM_COLOR); + let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); + + let modal_area = centered_rect(EDIT_MODAL_W, EDIT_MODAL_H, area); + frame.render_widget(Clear, modal_area); + + let block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(Style::default().fg(ACCENT)) + .title(Span::styled(" Edit command ", accent_style)); + + let inner = block.inner(modal_area); + frame.render_widget(block, modal_area); + + let chunks = Layout::vertical([Constraint::Min(1), Constraint::Length(1)]).split(inner); + + let display = format!("{}_", es.buffer); + frame.render_widget( + Paragraph::new(Span::styled(display, Style::default())), + chunks[0], + ); + + let hint = Paragraph::new(Line::from(vec![ + Span::styled("↵", accent_style), + Span::styled(" save ", dim_style), + Span::styled("esc", accent_style), + Span::styled(" cancel", dim_style), + ])) + .alignment(Alignment::Center); + frame.render_widget(hint, chunks[1]); +} + #[cfg(test)] mod tests { use super::*; @@ -2210,4 +2255,57 @@ mod tests { "Commands pane controls must show 'back'" ); } + + #[test] + fn edit_modal_shows_buffer_text_and_hints() { + use crate::tui::app::EditState; + + let mut app = App::new(); + app.all_rows = vec![make_row("git status", TEST_NOW - 60, 0, "p")]; + app.recompute(); + app.edit = Some(EditState { + id: 1, + buffer: "git status --short".into(), + }); + let text = render_app(&app); + assert!( + text.contains("git status --short"), + "edit modal must show buffer text; got:\n{text}" + ); + assert!( + text.contains("save"), + "edit modal must show 'save' hint; got:\n{text}" + ); + assert!( + text.contains("cancel"), + "edit modal must show 'cancel' hint; got:\n{text}" + ); + assert!( + text.contains("Edit command"), + "edit modal must show 'Edit command' title; got:\n{text}" + ); + } + + #[test] + fn history_normal_controls_show_edit_hint() { + let mut app = app_with_rows(); + app.mode = crate::tui::app::Mode::Normal; + let text = render_app(&app); + assert!( + text.contains("edit"), + "History Normal controls must contain 'edit' hint; got:\n{text}" + ); + } + + #[test] + fn ws_commands_controls_show_edit_hint() { + let mut app = App::new(); + app.tab = Tab::Workspaces; + app.ws_pane = WsPane::Commands; + let text = render_app(&app); + assert!( + text.contains("edit"), + "Workspaces Commands controls must contain 'edit' hint; got:\n{text}" + ); + } } From 76a780d269ce76217577a5c689396e9161b7a1b1 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 15:56:06 -0600 Subject: [PATCH 115/151] fix(tui): run workspace replay directly when stdout is a tty, fix zsh widget (#48) --- shells/thoth.zsh | 3 ++- src/tui/mod.rs | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/shells/thoth.zsh b/shells/thoth.zsh index 45d4702..26f34d3 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -67,8 +67,9 @@ _tth_widget() { CURSOR=${#BUFFER} zle reset-prompt elif [[ "$out" == REPLAY:* ]]; then - bash "${out#REPLAY:}" + BUFFER="bash ${out#REPLAY:}" zle reset-prompt + zle accept-line else zle reset-prompt fi diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 0940394..7543442 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -5,6 +5,7 @@ pub mod render; pub mod time; use std::fs::OpenOptions; +use std::io::IsTerminal; use std::panic; use crossterm::{ @@ -168,7 +169,15 @@ pub fn run( .to_str() .ok_or_else(|| ThothError::Tui("replay path is not valid UTF-8".into()))? .to_string(); - app.action = Some(Action::Replay(path_str)); + if std::io::stdout().is_terminal() { + println!("Replaying workspace '{ws_name}'..."); + std::process::Command::new("bash") + .arg(&path) + .status() + .map_err(|e| ThothError::Tui(format!("replay run failed: {e}")))?; + } else { + app.action = Some(Action::Replay(path_str)); + } } if let Some(line) = format_action_line(app.action.as_ref()) { From ecefb329e67b96b9857c476549ca35490e87d678 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 16:16:03 -0600 Subject: [PATCH 116/151] fix(tui): run workspace replay in the interactive shell so functions/aliases resolve (#48) --- shells/thoth.bash | 2 +- shells/thoth.zsh | 2 +- src/export.rs | 26 +++++++++++++++++++++++--- src/tui/mod.rs | 5 +++-- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/shells/thoth.bash b/shells/thoth.bash index 755bafc..c11a2e8 100644 --- a/shells/thoth.bash +++ b/shells/thoth.bash @@ -67,7 +67,7 @@ _tth_widget() { READLINE_LINE="${out#EDIT:}" READLINE_POINT=${#READLINE_LINE} elif [[ "$out" == REPLAY:* ]]; then - bash "${out#REPLAY:}" + source "${out#REPLAY:}" fi } diff --git a/shells/thoth.zsh b/shells/thoth.zsh index 26f34d3..e67598d 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -67,7 +67,7 @@ _tth_widget() { CURSOR=${#BUFFER} zle reset-prompt elif [[ "$out" == REPLAY:* ]]; then - BUFFER="bash ${out#REPLAY:}" + BUFFER="source ${out#REPLAY:}" zle reset-prompt zle accept-line else diff --git a/src/export.rs b/src/export.rs index 78d29d9..f6271e7 100644 --- a/src/export.rs +++ b/src/export.rs @@ -176,6 +176,7 @@ pub fn render_script(rows: &[ExportRow], meta: &ExportMeta<'_>, now: i64) -> Str pub fn render_replay_script(rows: &[ExportRow]) -> String { let mut out = String::new(); out.push_str("#!/usr/bin/env bash\n"); + out.push_str("(\n"); out.push_str("set -e\n"); for row in rows { let escaped_dir = row.directory.replace('\'', "'\\''"); @@ -183,6 +184,7 @@ pub fn render_replay_script(rows: &[ExportRow]) -> String { out.push_str(&row.command); out.push('\n'); } + out.push_str(")\n"); out } @@ -670,9 +672,27 @@ mod tests { let rows: Vec = vec![]; let out = render_replay_script(&rows); let lines: Vec<&str> = out.lines().collect(); - assert_eq!(lines.len(), 2); - assert_eq!(lines[0], "#!/usr/bin/env bash"); - assert_eq!(lines[1], "set -e"); + assert_eq!(lines, vec!["#!/usr/bin/env bash", "(", "set -e", ")"]); + } + + #[test] + fn render_replay_script_wraps_body_in_subshell() { + let rows = vec![ExportRow { + command: "z somewhere".into(), + directory: "/tmp".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }]; + let out = render_replay_script(&rows); + assert!( + out.contains("(\nset -e\n"), + "set -e inside the subshell; got:\n{out}" + ); + assert!( + out.trim_end().ends_with(')'), + "body wrapped in a subshell; got:\n{out}" + ); } #[test] diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 7543442..450e53b 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -171,8 +171,9 @@ pub fn run( .to_string(); if std::io::stdout().is_terminal() { println!("Replaying workspace '{ws_name}'..."); - std::process::Command::new("bash") - .arg(&path) + let shell = std::env::var("SHELL").unwrap_or_else(|_| "bash".to_string()); + std::process::Command::new(shell) + .args(["-i", "-c", &format!("source '{path_str}'")]) .status() .map_err(|e| ThothError::Tui(format!("replay run failed: {e}")))?; } else { From 8468894cbc480eeb4d86c91e8d937be7122d483d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 16:27:43 -0600 Subject: [PATCH 117/151] feat(tui): echo each command before running it during workspace replay (#48) --- src/export.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/export.rs b/src/export.rs index f6271e7..af3a340 100644 --- a/src/export.rs +++ b/src/export.rs @@ -181,6 +181,10 @@ pub fn render_replay_script(rows: &[ExportRow]) -> String { for row in rows { let escaped_dir = row.directory.replace('\'', "'\\''"); out.push_str(&format!("cd '{escaped_dir}'\n")); + let escaped_cmd = row.command.replace('\'', "'\\''"); + out.push_str(&format!( + "printf '\\033[36m> %s\\033[0m\\n' '{escaped_cmd}'\n" + )); out.push_str(&row.command); out.push('\n'); } @@ -718,6 +722,28 @@ mod tests { assert!(cd_pos < cmd_pos, "cd must come before the command"); } + #[test] + fn render_replay_script_echoes_each_command_before_running() { + let rows = vec![ExportRow { + command: "z somewhere".into(), + directory: "/tmp".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }]; + let out = render_replay_script(&rows); + let echo_pos = out.find("printf").expect("must echo the command"); + let run_pos = out.rfind("z somewhere\n").expect("must run the command"); + assert!( + echo_pos < run_pos, + "echo must come before running; got:\n{out}" + ); + assert!( + out.contains("'z somewhere'"), + "echoes the command text; got:\n{out}" + ); + } + #[test] fn render_replay_script_escapes_single_quote_in_directory() { let rows = vec![ExportRow { From 713a13056822fde21652221b092569aeb7b6174d Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 16:42:48 -0600 Subject: [PATCH 118/151] refactor: replace temp-file replay with inline command emission (#60) --- shells/thoth.bash | 2 +- shells/thoth.zsh | 2 +- src/export.rs | 200 +++++++++++++++++++++++----------------------- src/tui/mod.rs | 16 +--- src/tui/render.rs | 4 +- 5 files changed, 108 insertions(+), 116 deletions(-) diff --git a/shells/thoth.bash b/shells/thoth.bash index c11a2e8..313a75d 100644 --- a/shells/thoth.bash +++ b/shells/thoth.bash @@ -67,7 +67,7 @@ _tth_widget() { READLINE_LINE="${out#EDIT:}" READLINE_POINT=${#READLINE_LINE} elif [[ "$out" == REPLAY:* ]]; then - source "${out#REPLAY:}" + eval "${out#REPLAY:}" fi } diff --git a/shells/thoth.zsh b/shells/thoth.zsh index e67598d..51337a2 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -67,7 +67,7 @@ _tth_widget() { CURSOR=${#BUFFER} zle reset-prompt elif [[ "$out" == REPLAY:* ]]; then - BUFFER="source ${out#REPLAY:}" + BUFFER="${out#REPLAY:}" zle reset-prompt zle accept-line else diff --git a/src/export.rs b/src/export.rs index af3a340..ffb327d 100644 --- a/src/export.rs +++ b/src/export.rs @@ -173,23 +173,22 @@ pub fn render_script(rows: &[ExportRow], meta: &ExportMeta<'_>, now: i64) -> Str out } -pub fn render_replay_script(rows: &[ExportRow]) -> String { - let mut out = String::new(); - out.push_str("#!/usr/bin/env bash\n"); - out.push_str("(\n"); - out.push_str("set -e\n"); +pub fn render_replay_command(rows: &[ExportRow]) -> String { + if rows.is_empty() { + return "true".to_string(); + } + let mut parts: Vec = Vec::new(); + let mut prev_dir: Option<&str> = None; for row in rows { - let escaped_dir = row.directory.replace('\'', "'\\''"); - out.push_str(&format!("cd '{escaped_dir}'\n")); - let escaped_cmd = row.command.replace('\'', "'\\''"); - out.push_str(&format!( - "printf '\\033[36m> %s\\033[0m\\n' '{escaped_cmd}'\n" - )); - out.push_str(&row.command); - out.push('\n'); + if prev_dir != Some(row.directory.as_str()) { + let escaped_dir = row.directory.replace('\'', "'\\''"); + parts.push(format!("cd '{escaped_dir}'")); + prev_dir = Some(row.directory.as_str()); + } + parts.push(row.command.clone()); } - out.push_str(")\n"); - out + let joined = parts.join(" && \\\n"); + format!("( {joined} )") } #[cfg(test)] @@ -661,46 +660,14 @@ mod tests { } #[test] - fn render_replay_script_starts_with_shebang_and_set_e() { + fn render_replay_command_empty_rows_returns_true() { let rows: Vec = vec![]; - let out = render_replay_script(&rows); - assert!( - out.starts_with("#!/usr/bin/env bash\n"), - "must start with shebang" - ); - assert!(out.contains("set -e\n"), "must include set -e"); - } - - #[test] - fn render_replay_script_empty_rows_only_shebang_and_set_e() { - let rows: Vec = vec![]; - let out = render_replay_script(&rows); - let lines: Vec<&str> = out.lines().collect(); - assert_eq!(lines, vec!["#!/usr/bin/env bash", "(", "set -e", ")"]); - } - - #[test] - fn render_replay_script_wraps_body_in_subshell() { - let rows = vec![ExportRow { - command: "z somewhere".into(), - directory: "/tmp".into(), - timestamp: 1_000, - exit_code: 0, - duration_ms: 100, - }]; - let out = render_replay_script(&rows); - assert!( - out.contains("(\nset -e\n"), - "set -e inside the subshell; got:\n{out}" - ); - assert!( - out.trim_end().ends_with(')'), - "body wrapped in a subshell; got:\n{out}" - ); + let out = render_replay_command(&rows); + assert_eq!(out, "true"); } #[test] - fn render_replay_script_cd_before_each_command() { + fn render_replay_command_single_row_wraps_in_subshell() { let rows = vec![ExportRow { command: "cargo build".into(), directory: "/home/user/proj".into(), @@ -708,60 +675,80 @@ mod tests { exit_code: 0, duration_ms: 100, }]; - let out = render_replay_script(&rows); + let out = render_replay_command(&rows); + assert!(out.starts_with("( "), "must start with '( '; got:\n{out}"); + assert!(out.ends_with(" )"), "must end with ' )'; got:\n{out}"); assert!( - out.contains("cd '/home/user/proj'\n"), - "must emit cd line; got:\n{out}" + out.contains("cd '/home/user/proj'"), + "must contain cd; got:\n{out}" ); assert!( - out.contains("cargo build\n"), - "must emit command; got:\n{out}" + out.contains("cargo build"), + "must contain command; got:\n{out}" ); - let cd_pos = out.find("cd '/home/user/proj'").unwrap(); + let cd_pos = out.find("cd '").unwrap(); let cmd_pos = out.find("cargo build").unwrap(); - assert!(cd_pos < cmd_pos, "cd must come before the command"); + assert!(cd_pos < cmd_pos, "cd must come before command"); } #[test] - fn render_replay_script_echoes_each_command_before_running() { - let rows = vec![ExportRow { - command: "z somewhere".into(), - directory: "/tmp".into(), - timestamp: 1_000, - exit_code: 0, - duration_ms: 100, - }]; - let out = render_replay_script(&rows); - let echo_pos = out.find("printf").expect("must echo the command"); - let run_pos = out.rfind("z somewhere\n").expect("must run the command"); - assert!( - echo_pos < run_pos, - "echo must come before running; got:\n{out}" - ); - assert!( - out.contains("'z somewhere'"), - "echoes the command text; got:\n{out}" + fn render_replay_command_two_rows_same_dir_single_cd() { + let rows = vec![ + ExportRow { + command: "first_cmd".into(), + directory: "/shared".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }, + ExportRow { + command: "second_cmd".into(), + directory: "/shared".into(), + timestamp: 2_000, + exit_code: 0, + duration_ms: 100, + }, + ]; + let out = render_replay_command(&rows); + let cd_count = out.matches("cd '").count(); + assert_eq!( + cd_count, 1, + "same dir must produce only one cd; got:\n{out}" ); + assert!(out.contains("first_cmd"), "must contain first_cmd"); + assert!(out.contains("second_cmd"), "must contain second_cmd"); } #[test] - fn render_replay_script_escapes_single_quote_in_directory() { - let rows = vec![ExportRow { - command: "ls".into(), - directory: "/home/it's/project".into(), - timestamp: 1_000, - exit_code: 0, - duration_ms: 100, - }]; - let out = render_replay_script(&rows); - assert!( - out.contains("cd '/home/it'\\''s/project'\n"), - "must escape single quote in dir; got:\n{out}" + fn render_replay_command_two_rows_different_dirs_two_cds() { + let rows = vec![ + ExportRow { + command: "cmd-a".into(), + directory: "/dir-a".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }, + ExportRow { + command: "cmd-b".into(), + directory: "/dir-b".into(), + timestamp: 2_000, + exit_code: 0, + duration_ms: 100, + }, + ]; + let out = render_replay_command(&rows); + let cd_count = out.matches("cd '").count(); + assert_eq!( + cd_count, 2, + "different dirs must produce two cds; got:\n{out}" ); + assert!(out.contains("cd '/dir-a'"), "must contain cd /dir-a"); + assert!(out.contains("cd '/dir-b'"), "must contain cd /dir-b"); } #[test] - fn render_replay_script_preserves_command_order() { + fn render_replay_command_preserves_order() { let rows = vec![ ExportRow { command: "first_cmd".into(), @@ -778,7 +765,7 @@ mod tests { duration_ms: 100, }, ]; - let out = render_replay_script(&rows); + let out = render_replay_command(&rows); let first_pos = out.find("first_cmd").unwrap(); let second_pos = out.find("second_cmd").unwrap(); assert!( @@ -788,30 +775,43 @@ mod tests { } #[test] - fn render_replay_script_two_rows_has_two_cd_lines() { + fn render_replay_command_escapes_single_quote_in_dir() { + let rows = vec![ExportRow { + command: "ls".into(), + directory: "/home/it's/project".into(), + timestamp: 1_000, + exit_code: 0, + duration_ms: 100, + }]; + let out = render_replay_command(&rows); + assert!( + out.contains("cd '/home/it'\\''s/project'"), + "must escape single quote in dir; got:\n{out}" + ); + } + + #[test] + fn render_replay_command_uses_ampersand_continuation() { let rows = vec![ ExportRow { command: "cmd-a".into(), - directory: "/dir-a".into(), + directory: "/d".into(), timestamp: 1_000, exit_code: 0, duration_ms: 100, }, ExportRow { command: "cmd-b".into(), - directory: "/dir-b".into(), + directory: "/d".into(), timestamp: 2_000, exit_code: 0, duration_ms: 100, }, ]; - let out = render_replay_script(&rows); - let cd_count = out.matches("cd '").count(); - assert_eq!( - cd_count, 2, - "two rows must produce two cd lines; got:\n{out}" + let out = render_replay_command(&rows); + assert!( + out.contains(" && \\\n"), + "parts must be joined with ' && \\\\n'; got:\n{out}" ); - assert!(out.contains("cd '/dir-a'\n")); - assert!(out.contains("cd '/dir-b'\n")); } } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 450e53b..3fd7ec5 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -160,24 +160,16 @@ pub fn run( }; let rows = export::collect(conn, &args, now) .map_err(|e| ThothError::Tui(format!("replay collect failed: {e}")))?; - let script = export::render_replay_script(&rows); - let path = - std::env::temp_dir().join(format!("tth-replay-{}-{}.sh", std::process::id(), now)); - std::fs::write(&path, script) - .map_err(|e| ThothError::Tui(format!("replay write failed: {e}")))?; - let path_str = path - .to_str() - .ok_or_else(|| ThothError::Tui("replay path is not valid UTF-8".into()))? - .to_string(); + let cmd = export::render_replay_command(&rows); if std::io::stdout().is_terminal() { println!("Replaying workspace '{ws_name}'..."); - let shell = std::env::var("SHELL").unwrap_or_else(|_| "bash".to_string()); + let shell = std::env::var("SHELL").unwrap_or_else(|_| "bash".into()); std::process::Command::new(shell) - .args(["-i", "-c", &format!("source '{path_str}'")]) + .args(["-i", "-c", &cmd]) .status() .map_err(|e| ThothError::Tui(format!("replay run failed: {e}")))?; } else { - app.action = Some(Action::Replay(path_str)); + app.action = Some(Action::Replay(cmd)); } } diff --git a/src/tui/render.rs b/src/tui/render.rs index dae923a..1129803 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -1969,9 +1969,9 @@ mod tests { #[test] fn format_action_line_replay_produces_correct_prefix() { - let action = Action::Replay("/tmp/tth-replay-123.sh".to_string()); + let action = Action::Replay("( cd '/x' && ls )".to_string()); let result = format_action_line(Some(&action)); - assert_eq!(result, Some("REPLAY:/tmp/tth-replay-123.sh".to_string())); + assert_eq!(result, Some("REPLAY:( cd '/x' && ls )".to_string())); } #[test] From bbab731cbb9841ae925bfdfeeeeceb970fc63c48 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 16:42:52 -0600 Subject: [PATCH 119/151] feat: default history filter ignores tth commands (#60) --- src/config.rs | 39 ++++++++++++++++++++++++++--- src/recorder.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/src/config.rs b/src/config.rs index 30943ac..2c34546 100644 --- a/src/config.rs +++ b/src/config.rs @@ -32,8 +32,10 @@ default_limit = 50 # filter = ["^ls$", "^cd "] [history] -# Regex patterns; matching commands are NEVER recorded (useful to avoid storing secrets). -# filter = ["--password", "export .*TOKEN", "AKIA[0-9A-Z]{16}"] +# Regex patterns; matching commands are NEVER recorded. +# Thoth's own commands (tth, tth-sw, tth-tag, etc.) are ignored by default via this filter. +# To add more patterns (e.g. secrets), extend the list: +# filter = ["^\\s*tth\\b", "--password", "export .*TOKEN"] "#; #[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)] @@ -121,12 +123,25 @@ impl Default for Search { } } -#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)] +fn default_history_filter() -> Vec { + vec!["^\\s*tth\\b".to_string()] +} + +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] #[serde(default)] pub struct History { + #[serde(default = "default_history_filter")] pub filter: Vec, } +impl Default for History { + fn default() -> Self { + Self { + filter: default_history_filter(), + } + } +} + #[derive(Deserialize, Serialize, Debug, Clone, Default, PartialEq)] #[serde(default)] pub struct Config { @@ -465,6 +480,24 @@ mod tests { assert_eq!(cfg.tui.columns, vec!["exit", "command"]); } + #[test] + fn history_default_filter_is_tth_pattern() { + let h = History::default(); + assert_eq!(h.filter, vec!["^\\s*tth\\b".to_string()]); + } + + #[test] + fn parse_empty_string_yields_tth_filter() { + let cfg = parse("").unwrap(); + assert_eq!(cfg.history.filter, vec!["^\\s*tth\\b".to_string()]); + } + + #[test] + fn parse_history_filter_replaces_default() { + let cfg = parse("[history]\nfilter = [\"x\"]").unwrap(); + assert_eq!(cfg.history.filter, vec!["x".to_string()]); + } + #[test] fn parse_default_config_toml_equals_default() { let cfg = parse(DEFAULT_CONFIG_TOML).unwrap(); diff --git a/src/recorder.rs b/src/recorder.rs index 53fee6c..48597c3 100644 --- a/src/recorder.rs +++ b/src/recorder.rs @@ -392,6 +392,72 @@ mod tests { assert_eq!(count, 1); } + #[test] + fn default_history_filter_blocks_tth_sw() { + let mut conn = mem_conn(); + let filters = crate::config::History::default().filter; + let args = RecordArgs { + cmd: String::from("tth-sw foo"), + ..base_args() + }; + record(&args, DEFAULT_GAP, &filters, &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 0, "tth-sw must be blocked by the default filter"); + } + + #[test] + fn default_history_filter_blocks_bare_tth() { + let mut conn = mem_conn(); + let filters = crate::config::History::default().filter; + let args = RecordArgs { + cmd: String::from("tth"), + ..base_args() + }; + record(&args, DEFAULT_GAP, &filters, &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!(count, 0, "bare tth must be blocked by the default filter"); + } + + #[test] + fn default_history_filter_does_not_block_cargo_build() { + let mut conn = mem_conn(); + let filters = crate::config::History::default().filter; + let args = RecordArgs { + cmd: String::from("cargo build"), + ..base_args() + }; + record(&args, DEFAULT_GAP, &filters, &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!( + count, 1, + "cargo build must not be blocked by the default filter" + ); + } + + #[test] + fn default_history_filter_does_not_block_tthx() { + let mut conn = mem_conn(); + let filters = crate::config::History::default().filter; + let args = RecordArgs { + cmd: String::from("tthx"), + ..base_args() + }; + record(&args, DEFAULT_GAP, &filters, &mut conn); + let count: i64 = conn + .query_row("SELECT COUNT(*) FROM commands", [], |r| r.get(0)) + .unwrap(); + assert_eq!( + count, 1, + "tthx must not be blocked (not a tth word boundary match)" + ); + } + #[test] fn workspace_stored_when_provided() { let mut conn = mem_conn(); From 2bb55b6029062525294853616031609bacf3f9c8 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 17:07:11 -0600 Subject: [PATCH 120/151] fix(tui): separate replay commands with ; so a benign non-zero exit does not halt the rest (#48) --- src/export.rs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/export.rs b/src/export.rs index ffb327d..d998d0b 100644 --- a/src/export.rs +++ b/src/export.rs @@ -177,17 +177,19 @@ pub fn render_replay_command(rows: &[ExportRow]) -> String { if rows.is_empty() { return "true".to_string(); } - let mut parts: Vec = Vec::new(); + let mut units: Vec = Vec::new(); let mut prev_dir: Option<&str> = None; for row in rows { - if prev_dir != Some(row.directory.as_str()) { + let unit = if prev_dir != Some(row.directory.as_str()) { let escaped_dir = row.directory.replace('\'', "'\\''"); - parts.push(format!("cd '{escaped_dir}'")); prev_dir = Some(row.directory.as_str()); - } - parts.push(row.command.clone()); + format!("cd '{escaped_dir}' && {}", row.command) + } else { + row.command.clone() + }; + units.push(unit); } - let joined = parts.join(" && \\\n"); + let joined = units.join(" ; \\\n"); format!("( {joined} )") } @@ -791,7 +793,8 @@ mod tests { } #[test] - fn render_replay_command_uses_ampersand_continuation() { + fn render_replay_command_separates_units_with_semicolon_so_one_failure_does_not_stop_the_rest() + { let rows = vec![ ExportRow { command: "cmd-a".into(), @@ -810,8 +813,12 @@ mod tests { ]; let out = render_replay_command(&rows); assert!( - out.contains(" && \\\n"), - "parts must be joined with ' && \\\\n'; got:\n{out}" + out.contains(" ; \\\n"), + "units must be separated with ' ; \\\\n' so a non-zero exit does not halt the rest; got:\n{out}" + ); + assert!( + out.contains("cd '/d' && cmd-a"), + "cd must guard its command; got:\n{out}" ); } } From 431b30a6e2649cd0180d52369b63e11b303838a8 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 17:32:50 -0600 Subject: [PATCH 121/151] style(tui): uniform cyan selection bar, green active tab and command text (#48) --- src/tui/render.rs | 61 ++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index 1129803..267065b 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -145,7 +145,8 @@ fn tui_cell(col: &Column, row: &CommandRow, now: i64, width: u16) -> Cell<'stati Column::Exit => Style::default().fg(exit_text(row.exit_code).1), Column::Project => Style::default().fg(Color::Blue), Column::Directory => Style::default().fg(DIM_COLOR), - Column::Command | Column::Tags => Style::default(), + Column::Command => Style::default().fg(Color::Green), + Column::Tags => Style::default(), }; Cell::from(Line::from(vec![Span::styled(text, style)])) } @@ -167,9 +168,11 @@ pub fn resolve_tui_columns(names: &[String]) -> Vec { } fn render_tab_bar(frame: &mut Frame, area: ratatui::layout::Rect, app: &App) { - let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); - let active_style = accent_style.add_modifier(Modifier::REVERSED); + let active_style = Style::default() + .fg(Color::Green) + .add_modifier(Modifier::BOLD) + .add_modifier(Modifier::REVERSED); let (history_style, workspaces_style) = match app.tab { Tab::History => (active_style, dim_style), @@ -287,7 +290,8 @@ fn render_history_pane( let table_header = Row::new(header_cells); let highlight_style = Style::default() - .add_modifier(Modifier::REVERSED) + .bg(ACCENT) + .fg(Color::Black) .add_modifier(Modifier::BOLD); let table = Table::new(rows, widths) @@ -318,7 +322,8 @@ fn render_workspaces_pane( ) { let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); let highlight_style = Style::default() - .add_modifier(Modifier::REVERSED) + .bg(ACCENT) + .fg(Color::Black) .add_modifier(Modifier::BOLD); let list_focused = app.ws_pane == WsPane::List; @@ -498,9 +503,12 @@ pub fn draw_with_cmd_state( let version = env!("CARGO_PKG_VERSION"); let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); + let green_bold = Style::default() + .fg(Color::Green) + .add_modifier(Modifier::BOLD); - let accent_bar = Span::styled("▌ ", accent_style); - let name_span = Span::styled("Thoth", accent_style); + let accent_bar = Span::styled("▌ ", green_bold); + let name_span = Span::styled("Thoth", green_bold); let sep_span = Span::styled(" · ", dim_style); let version_span = Span::styled(format!("v{version}"), dim_style); let count_sep = Span::styled(" ", dim_style); @@ -957,17 +965,11 @@ mod tests { let app = app_with_workspaces(); let buf = render_app_buf(&app); - let any_reversed = (0..TEST_HEIGHT).any(|row_y| { - (0..TEST_WIDTH).any(|x| { - buf[(x, row_y)] - .style() - .add_modifier - .contains(Modifier::REVERSED) - }) - }); + let any_cyan_bg = (0..TEST_HEIGHT) + .any(|row_y| (0..TEST_WIDTH).any(|x| buf[(x, row_y)].style().bg == Some(Color::Cyan))); assert!( - any_reversed, - "Workspaces tab must have REVERSED on selected row" + any_cyan_bg, + "Workspaces tab must have bg=Cyan on selected row" ); } @@ -1147,7 +1149,7 @@ mod tests { } #[test] - fn selected_row_is_styled_reversed() { + fn selected_row_is_highlighted() { let mut app = App::new(); app.all_rows = vec![ make_row("first-cmd", TEST_NOW - 10, 0, "p"), @@ -1158,17 +1160,11 @@ mod tests { let buf = render_app_buf(&app); - let any_reversed = (0..TEST_HEIGHT).any(|row_y| { - (0..TEST_WIDTH).any(|x| { - buf[(x, row_y)] - .style() - .add_modifier - .contains(Modifier::REVERSED) - }) - }); + let any_cyan_bg = (0..TEST_HEIGHT) + .any(|row_y| (0..TEST_WIDTH).any(|x| buf[(x, row_y)].style().bg == Some(Color::Cyan))); assert!( - any_reversed, - "selected row must have REVERSED modifier somewhere in the frame" + any_cyan_bg, + "selected row must have bg=Cyan highlight somewhere in the frame" ); } @@ -1682,13 +1678,8 @@ mod tests { height: u16, ) -> Option { for row in 0..height { - let any_reversed = (0..width).any(|col| { - buf[(col, row)] - .style() - .add_modifier - .contains(Modifier::REVERSED) - }); - if any_reversed { + let any_cyan_bg = (0..width).any(|col| buf[(col, row)].style().bg == Some(Color::Cyan)); + if any_cyan_bg { let line: String = (0..width) .map(|col| buf[(col, row)].symbol().chars().next().unwrap_or(' ')) .collect(); From a8d83c8bd067c3b539b08dd08eab55bc3111bf48 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 17:39:44 -0600 Subject: [PATCH 122/151] style(tui): blue-purple selection bar, green controls keys, plain command text (#48) --- src/tui/render.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index 267065b..0b33ab3 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -12,6 +12,7 @@ use crate::tui::time::format_relative; use crate::workspaces::WorkspaceRow; const ACCENT: Color = Color::Cyan; +const SELECTION_BG: Color = Color::Indexed(147); const DIM_COLOR: Color = Color::DarkGray; const EDIT_MODAL_W: u16 = 60; const EDIT_MODAL_H: u16 = 5; @@ -145,7 +146,7 @@ fn tui_cell(col: &Column, row: &CommandRow, now: i64, width: u16) -> Cell<'stati Column::Exit => Style::default().fg(exit_text(row.exit_code).1), Column::Project => Style::default().fg(Color::Blue), Column::Directory => Style::default().fg(DIM_COLOR), - Column::Command => Style::default().fg(Color::Green), + Column::Command => Style::default(), Column::Tags => Style::default(), }; Cell::from(Line::from(vec![Span::styled(text, style)])) @@ -290,7 +291,7 @@ fn render_history_pane( let table_header = Row::new(header_cells); let highlight_style = Style::default() - .bg(ACCENT) + .bg(SELECTION_BG) .fg(Color::Black) .add_modifier(Modifier::BOLD); @@ -322,7 +323,7 @@ fn render_workspaces_pane( ) { let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); let highlight_style = Style::default() - .bg(ACCENT) + .bg(SELECTION_BG) .fg(Color::Black) .add_modifier(Modifier::BOLD); @@ -501,7 +502,9 @@ pub fn draw_with_cmd_state( render_tab_bar(frame, tabbar_area, app); let version = env!("CARGO_PKG_VERSION"); - let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); + let accent_style = Style::default() + .fg(Color::Green) + .add_modifier(Modifier::BOLD); let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); let green_bold = Style::default() .fg(Color::Green) @@ -966,7 +969,7 @@ mod tests { let buf = render_app_buf(&app); let any_cyan_bg = (0..TEST_HEIGHT) - .any(|row_y| (0..TEST_WIDTH).any(|x| buf[(x, row_y)].style().bg == Some(Color::Cyan))); + .any(|row_y| (0..TEST_WIDTH).any(|x| buf[(x, row_y)].style().bg == Some(SELECTION_BG))); assert!( any_cyan_bg, "Workspaces tab must have bg=Cyan on selected row" @@ -1161,7 +1164,7 @@ mod tests { let buf = render_app_buf(&app); let any_cyan_bg = (0..TEST_HEIGHT) - .any(|row_y| (0..TEST_WIDTH).any(|x| buf[(x, row_y)].style().bg == Some(Color::Cyan))); + .any(|row_y| (0..TEST_WIDTH).any(|x| buf[(x, row_y)].style().bg == Some(SELECTION_BG))); assert!( any_cyan_bg, "selected row must have bg=Cyan highlight somewhere in the frame" @@ -1678,7 +1681,8 @@ mod tests { height: u16, ) -> Option { for row in 0..height { - let any_cyan_bg = (0..width).any(|col| buf[(col, row)].style().bg == Some(Color::Cyan)); + let any_cyan_bg = + (0..width).any(|col| buf[(col, row)].style().bg == Some(SELECTION_BG)); if any_cyan_bg { let line: String = (0..width) .map(|col| buf[(col, row)].symbol().chars().next().unwrap_or(' ')) From 88f8ee57d0c005509a2102c10908904b54f09fc8 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 17:43:58 -0600 Subject: [PATCH 123/151] style(tui): use the blue-purple selection background for the active tab (#48) --- src/tui/render.rs | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index 0b33ab3..061014b 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -171,9 +171,9 @@ pub fn resolve_tui_columns(names: &[String]) -> Vec { fn render_tab_bar(frame: &mut Frame, area: ratatui::layout::Rect, app: &App) { let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); let active_style = Style::default() - .fg(Color::Green) - .add_modifier(Modifier::BOLD) - .add_modifier(Modifier::REVERSED); + .bg(SELECTION_BG) + .fg(Color::Black) + .add_modifier(Modifier::BOLD); let (history_style, workspaces_style) = match app.tab { Tab::History => (active_style, dim_style), @@ -880,33 +880,21 @@ mod tests { } #[test] - fn tab_bar_active_history_is_reversed() { + fn tab_bar_active_history_is_highlighted() { let app = app_with_rows(); let buf = render_app_buf(&app); - let any_reversed_row0 = (0..TEST_WIDTH).any(|x| { - buf[(x, 0)] - .style() - .add_modifier - .contains(Modifier::REVERSED) - }); - assert!( - any_reversed_row0, - "tab bar row 0 must have REVERSED on active History tab label" - ); - - let reversed_count_row0 = (0..TEST_WIDTH) - .filter(|&x| { - buf[(x, 0)] - .style() - .add_modifier - .contains(Modifier::REVERSED) - }) + let active_bg_count = (0..TEST_WIDTH) + .filter(|&x| buf[(x, 0)].style().bg == Some(SELECTION_BG)) .count(); assert!( - reversed_count_row0 < TEST_WIDTH as usize, - "tab bar must NOT be fully reversed; only active label should be reversed (count={reversed_count_row0})" + active_bg_count > 0, + "tab bar row 0 must highlight the active History tab with the selection background" + ); + assert!( + active_bg_count < TEST_WIDTH as usize, + "tab bar must NOT be fully highlighted; only the active label (count={active_bg_count})" ); } From fb0e8e048e8f337b040a379f2d2a457a24667cbc Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 17:59:49 -0600 Subject: [PATCH 124/151] feat(theme): add Theme struct, 7 built-in themes, and parse_color (#62) --- src/lib.rs | 1 + src/theme.rs | 373 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 374 insertions(+) create mode 100644 src/theme.rs diff --git a/src/lib.rs b/src/lib.rs index cc4d0d9..00656ee 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,5 +18,6 @@ pub mod session; pub mod sessions; pub mod stats; pub mod tags; +pub mod theme; pub mod tui; pub mod workspaces; diff --git a/src/theme.rs b/src/theme.rs new file mode 100644 index 0000000..24975e1 --- /dev/null +++ b/src/theme.rs @@ -0,0 +1,373 @@ +use ratatui::style::Color; + +use crate::error::ThothError; + +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Theme { + pub selection_bg: Color, + pub selection_fg: Color, + pub accent: Color, + pub dim: Color, + pub border: Color, + pub ok: Color, + pub fail: Color, + pub project: Color, + pub command: Color, + pub header: Color, + pub controls: Color, + pub directory: Color, + pub tags: Color, +} + +impl Default for Theme { + fn default() -> Self { + default_theme() + } +} + +const fn rgb(r: u8, g: u8, b: u8) -> Color { + Color::Rgb(r, g, b) +} + +fn default_theme() -> Theme { + Theme { + selection_bg: Color::Indexed(147), + selection_fg: Color::Black, + accent: Color::Cyan, + dim: Color::DarkGray, + border: Color::DarkGray, + ok: Color::Green, + fail: Color::Red, + project: Color::Blue, + command: Color::Reset, + header: Color::Green, + controls: Color::Green, + directory: Color::DarkGray, + tags: Color::Reset, + } +} + +fn ember_theme() -> Theme { + Theme { + selection_bg: rgb(0x66, 0x5c, 0x54), + selection_fg: rgb(0xfb, 0xf1, 0xc7), + accent: rgb(0xfa, 0xbd, 0x2f), + dim: rgb(0x92, 0x83, 0x74), + border: rgb(0x92, 0x83, 0x74), + ok: rgb(0xb8, 0xbb, 0x26), + fail: rgb(0xfb, 0x49, 0x34), + project: rgb(0x83, 0xa5, 0x98), + command: rgb(0xeb, 0xdb, 0xb2), + header: rgb(0xfe, 0x80, 0x19), + controls: rgb(0xfe, 0x80, 0x19), + directory: rgb(0x92, 0x83, 0x74), + tags: rgb(0xeb, 0xdb, 0xb2), + } +} + +fn frost_theme() -> Theme { + Theme { + selection_bg: rgb(0x43, 0x4c, 0x5e), + selection_fg: rgb(0xec, 0xef, 0xf4), + accent: rgb(0x88, 0xc0, 0xd0), + dim: rgb(0x4c, 0x56, 0x6a), + border: rgb(0x4c, 0x56, 0x6a), + ok: rgb(0xa3, 0xbe, 0x8c), + fail: rgb(0xbf, 0x61, 0x6a), + project: rgb(0x81, 0xa1, 0xc1), + command: rgb(0xd8, 0xde, 0xe9), + header: rgb(0x8f, 0xbc, 0xbb), + controls: rgb(0x88, 0xc0, 0xd0), + directory: rgb(0x4c, 0x56, 0x6a), + tags: rgb(0xd8, 0xde, 0xe9), + } +} + +fn latte_theme() -> Theme { + Theme { + selection_bg: rgb(0xcc, 0xd0, 0xda), + selection_fg: rgb(0x4c, 0x4f, 0x69), + accent: rgb(0x17, 0x92, 0x99), + dim: rgb(0x9c, 0xa0, 0xb0), + border: rgb(0x9c, 0xa0, 0xb0), + ok: rgb(0x40, 0xa0, 0x2b), + fail: rgb(0xd2, 0x0f, 0x39), + project: rgb(0x1e, 0x66, 0xf5), + command: rgb(0x4c, 0x4f, 0x69), + header: rgb(0x88, 0x39, 0xef), + controls: rgb(0x88, 0x39, 0xef), + directory: rgb(0x9c, 0xa0, 0xb0), + tags: rgb(0x4c, 0x4f, 0x69), + } +} + +fn frappe_theme() -> Theme { + Theme { + selection_bg: rgb(0x41, 0x45, 0x59), + selection_fg: rgb(0xc6, 0xd0, 0xf5), + accent: rgb(0x81, 0xc8, 0xbe), + dim: rgb(0x73, 0x79, 0x94), + border: rgb(0x73, 0x79, 0x94), + ok: rgb(0xa6, 0xd1, 0x89), + fail: rgb(0xe7, 0x82, 0x84), + project: rgb(0x8c, 0xaa, 0xee), + command: rgb(0xc6, 0xd0, 0xf5), + header: rgb(0xca, 0x9e, 0xe6), + controls: rgb(0xca, 0x9e, 0xe6), + directory: rgb(0x73, 0x79, 0x94), + tags: rgb(0xc6, 0xd0, 0xf5), + } +} + +fn macchiato_theme() -> Theme { + Theme { + selection_bg: rgb(0x36, 0x3a, 0x4f), + selection_fg: rgb(0xca, 0xd3, 0xf5), + accent: rgb(0x8b, 0xd5, 0xca), + dim: rgb(0x6e, 0x73, 0x8d), + border: rgb(0x6e, 0x73, 0x8d), + ok: rgb(0xa6, 0xda, 0x95), + fail: rgb(0xed, 0x87, 0x96), + project: rgb(0x8a, 0xad, 0xf4), + command: rgb(0xca, 0xd3, 0xf5), + header: rgb(0xc6, 0xa0, 0xf6), + controls: rgb(0xc6, 0xa0, 0xf6), + directory: rgb(0x6e, 0x73, 0x8d), + tags: rgb(0xca, 0xd3, 0xf5), + } +} + +fn mocha_theme() -> Theme { + Theme { + selection_bg: rgb(0x31, 0x32, 0x44), + selection_fg: rgb(0xcd, 0xd6, 0xf4), + accent: rgb(0x94, 0xe2, 0xd5), + dim: rgb(0x6c, 0x70, 0x86), + border: rgb(0x6c, 0x70, 0x86), + ok: rgb(0xa6, 0xe3, 0xa1), + fail: rgb(0xf3, 0x8b, 0xa8), + project: rgb(0x89, 0xb4, 0xfa), + command: rgb(0xcd, 0xd6, 0xf4), + header: rgb(0xcb, 0xa6, 0xf7), + controls: rgb(0xcb, 0xa6, 0xf7), + directory: rgb(0x6c, 0x70, 0x86), + tags: rgb(0xcd, 0xd6, 0xf4), + } +} + +pub fn builtin_names() -> &'static [&'static str] { + &[ + "default", + "ember", + "frost", + "latte", + "frappe", + "macchiato", + "mocha", + ] +} + +pub fn builtin(name: &str) -> Option { + match name.to_ascii_lowercase().as_str() { + "default" => Some(default_theme()), + "ember" => Some(ember_theme()), + "frost" => Some(frost_theme()), + "latte" => Some(latte_theme()), + "frappe" => Some(frappe_theme()), + "macchiato" => Some(macchiato_theme()), + "mocha" => Some(mocha_theme()), + _ => None, + } +} + +pub fn parse_color(s: &str) -> Result { + let trimmed = s.trim(); + if trimmed.is_empty() { + return Err(ThothError::Config(format!("invalid color: {s}"))); + } + + if let Some(hex) = trimmed.strip_prefix('#') { + return parse_hex(hex, s); + } + + if let Ok(n) = trimmed.parse::() { + if n <= 255 { + return Ok(Color::Indexed(n as u8)); + } + return Err(ThothError::Config(format!("invalid color: {s}"))); + } + + match trimmed.to_ascii_lowercase().as_str() { + "reset" | "default" => Ok(Color::Reset), + "black" => Ok(Color::Black), + "red" => Ok(Color::Red), + "green" => Ok(Color::Green), + "yellow" => Ok(Color::Yellow), + "blue" => Ok(Color::Blue), + "magenta" => Ok(Color::Magenta), + "cyan" => Ok(Color::Cyan), + "white" => Ok(Color::White), + "gray" | "grey" => Ok(Color::Gray), + "darkgray" | "darkgrey" => Ok(Color::DarkGray), + "brightblack" => Ok(Color::DarkGray), + "brightred" => Ok(Color::LightRed), + "brightgreen" => Ok(Color::LightGreen), + "brightyellow" => Ok(Color::LightYellow), + "brightblue" => Ok(Color::LightBlue), + "brightmagenta" => Ok(Color::LightMagenta), + "brightcyan" => Ok(Color::LightCyan), + "brightwhite" => Ok(Color::White), + _ => Err(ThothError::Config(format!("invalid color: {s}"))), + } +} + +fn parse_hex(hex: &str, original: &str) -> Result { + match hex.len() { + 6 => { + let r = u8::from_str_radix(&hex[0..2], 16) + .map_err(|_| ThothError::Config(format!("invalid color: {original}")))?; + let g = u8::from_str_radix(&hex[2..4], 16) + .map_err(|_| ThothError::Config(format!("invalid color: {original}")))?; + let b = u8::from_str_radix(&hex[4..6], 16) + .map_err(|_| ThothError::Config(format!("invalid color: {original}")))?; + Ok(Color::Rgb(r, g, b)) + } + 3 => { + let r = expand_nibble(&hex[0..1], original)?; + let g = expand_nibble(&hex[1..2], original)?; + let b = expand_nibble(&hex[2..3], original)?; + Ok(Color::Rgb(r, g, b)) + } + _ => Err(ThothError::Config(format!("invalid color: {original}"))), + } +} + +fn expand_nibble(h: &str, original: &str) -> Result { + let n = u8::from_str_radix(h, 16) + .map_err(|_| ThothError::Config(format!("invalid color: {original}")))?; + Ok(n << 4 | n) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_hex6_color() { + assert_eq!(parse_color("#ff8800").unwrap(), Color::Rgb(255, 136, 0)); + } + + #[test] + fn parse_hex3_color() { + assert_eq!(parse_color("#f80").unwrap(), Color::Rgb(0xff, 0x88, 0x00)); + } + + #[test] + fn parse_indexed_147() { + assert_eq!(parse_color("147").unwrap(), Color::Indexed(147)); + } + + #[test] + fn parse_indexed_boundaries() { + assert_eq!(parse_color("0").unwrap(), Color::Indexed(0)); + assert_eq!(parse_color("255").unwrap(), Color::Indexed(255)); + } + + #[test] + fn parse_indexed_out_of_range() { + assert!(parse_color("256").is_err()); + } + + #[test] + fn parse_reset_and_default() { + assert_eq!(parse_color("reset").unwrap(), Color::Reset); + assert_eq!(parse_color("default").unwrap(), Color::Reset); + } + + #[test] + fn parse_named_colors() { + assert_eq!(parse_color("red").unwrap(), Color::Red); + assert_eq!(parse_color("green").unwrap(), Color::Green); + assert_eq!(parse_color("blue").unwrap(), Color::Blue); + assert_eq!(parse_color("cyan").unwrap(), Color::Cyan); + assert_eq!(parse_color("darkgray").unwrap(), Color::DarkGray); + assert_eq!(parse_color("darkgrey").unwrap(), Color::DarkGray); + } + + #[test] + fn parse_bright_variants() { + assert_eq!(parse_color("brightblue").unwrap(), Color::LightBlue); + assert_eq!(parse_color("brightred").unwrap(), Color::LightRed); + assert_eq!(parse_color("brightblack").unwrap(), Color::DarkGray); + } + + #[test] + fn parse_uppercase_name() { + assert_eq!(parse_color("RED").unwrap(), Color::Red); + } + + #[test] + fn parse_invalid_name() { + assert!(parse_color("nope").is_err()); + } + + #[test] + fn parse_invalid_hex() { + assert!(parse_color("#xyz").is_err()); + assert!(parse_color("#12").is_err()); + } + + #[test] + fn parse_empty_string() { + assert!(parse_color("").is_err()); + assert!(parse_color(" ").is_err()); + } + + #[test] + fn builtin_mocha_values() { + let t = builtin("mocha").unwrap(); + assert_eq!(t.selection_bg, Color::Rgb(0x31, 0x32, 0x44)); + assert_eq!(t.ok, Color::Rgb(0xa6, 0xe3, 0xa1)); + } + + #[test] + fn builtin_mocha_case_insensitive() { + assert!(builtin("MOCHA").is_some()); + } + + #[test] + fn builtin_unknown_is_none() { + assert!(builtin("nope").is_none()); + } + + #[test] + fn builtin_names_has_seven() { + assert_eq!(builtin_names().len(), 7); + assert!(builtin_names().contains(&"default")); + assert!(builtin_names().contains(&"mocha")); + } + + #[test] + fn default_impl_matches_builtin() { + assert_eq!(Theme::default(), builtin("default").unwrap()); + } + + #[test] + fn default_theme_accent_and_selection() { + let t = Theme::default(); + assert_eq!(t.accent, Color::Cyan); + assert_eq!(t.selection_bg, Color::Indexed(147)); + } + + #[test] + fn all_builtins_retrievable_and_distinct() { + let themes: Vec = builtin_names() + .iter() + .map(|n| builtin(n).unwrap()) + .collect(); + assert_eq!(themes.len(), 7); + let mocha = builtin("mocha").unwrap(); + let latte = builtin("latte").unwrap(); + assert_ne!(mocha, latte); + } +} From 4bf62126e1f1e6492264c4a60d6970d08e5b42db Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 18:13:11 -0600 Subject: [PATCH 125/151] feat(config): add ThemeSection, apply_theme_file, resolve_theme (#64) --- src/config.rs | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) diff --git a/src/config.rs b/src/config.rs index 2c34546..c3b00e3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -3,6 +3,7 @@ use std::path::{Path, PathBuf}; use serde::{Deserialize, Serialize}; use crate::error::ThothError; +use crate::theme::{self, Theme}; const VALID_KEYS: &[(&str, &str)] = &[ ("session.gap_minutes", "positive integer"), @@ -36,6 +37,11 @@ default_limit = 50 # Thoth's own commands (tth, tth-sw, tth-tag, etc.) are ignored by default via this filter. # To add more patterns (e.g. secrets), extend the list: # filter = ["^\\s*tth\\b", "--password", "export .*TOKEN"] + +# [theme] +# Built-in themes: default, ember, frost, latte, frappe, macchiato, mocha +# You can also drop a .toml file in ~/.config/thoth/themes/ for a custom theme. +# name = "default" "#; #[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Default)] @@ -142,6 +148,25 @@ impl Default for History { } } +fn default_theme_name() -> String { + "default".into() +} + +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] +#[serde(default)] +pub struct ThemeSection { + #[serde(default = "default_theme_name")] + pub name: String, +} + +impl Default for ThemeSection { + fn default() -> Self { + Self { + name: default_theme_name(), + } + } +} + #[derive(Deserialize, Serialize, Debug, Clone, Default, PartialEq)] #[serde(default)] pub struct Config { @@ -149,6 +174,7 @@ pub struct Config { pub tui: Tui, pub search: Search, pub history: History, + pub theme: ThemeSection, } fn config_path_from(thoth_config: Option<&str>, xdg_config: Option<&str>, home: &Path) -> PathBuf { @@ -204,6 +230,111 @@ pub fn load() -> Config { } } +pub fn themes_dir_from( + thoth_config: Option<&str>, + xdg_config: Option<&str>, + home: &Path, +) -> PathBuf { + let config_file = config_path_from(thoth_config, xdg_config, home); + config_file.parent().unwrap_or(home).join("themes") +} + +pub fn resolve_themes_dir() -> PathBuf { + let thoth_config = std::env::var("THOTH_CONFIG").ok(); + let xdg_config = std::env::var("XDG_CONFIG_HOME").ok(); + let home = std::env::var("HOME").unwrap_or_else(|_| String::from("/tmp")); + themes_dir_from( + thoth_config.as_deref(), + xdg_config.as_deref(), + Path::new(&home), + ) +} + +#[derive(Deserialize, Debug, Default)] +struct ThemeFile { + extends: Option, + selection_bg: Option, + selection_fg: Option, + accent: Option, + dim: Option, + border: Option, + ok: Option, + fail: Option, + project: Option, + command: Option, + header: Option, + controls: Option, + directory: Option, + tags: Option, +} + +pub fn apply_theme_file(base: Theme, toml_text: &str) -> Theme { + let file: ThemeFile = toml::from_str(toml_text).unwrap_or_default(); + let mut t = base; + + macro_rules! patch { + ($field:ident) => { + if let Some(ref s) = file.$field { + match theme::parse_color(s) { + Ok(c) => t.$field = c, + Err(_) => eprintln!( + "thoth: invalid theme color for '{}': {}", + stringify!($field), + s + ), + } + } + }; + } + + patch!(selection_bg); + patch!(selection_fg); + patch!(accent); + patch!(dim); + patch!(border); + patch!(ok); + patch!(fail); + patch!(project); + patch!(command); + patch!(header); + patch!(controls); + patch!(directory); + patch!(tags); + + t +} + +pub fn resolve_theme(name: &str, themes_dir: &Path) -> Theme { + if let Some(t) = theme::builtin(name) { + return t; + } + + let file_path = themes_dir.join(format!("{name}.toml")); + if file_path.exists() { + match std::fs::read_to_string(&file_path) { + Ok(text) => { + let extends_name: String = { + let tf: ThemeFile = toml::from_str(&text).unwrap_or_default(); + tf.extends.unwrap_or_else(|| "default".into()) + }; + let base = theme::builtin(&extends_name).unwrap_or_default(); + return apply_theme_file(base, &text); + } + Err(e) => { + eprintln!( + "thoth: cannot read theme file {}: {}", + file_path.display(), + e + ); + } + } + } else { + eprintln!("thoth: unknown theme '{}', using default", name); + } + + Theme::default() +} + pub fn config_toml(cfg: &Config) -> Result { toml::to_string(cfg).map_err(|e| ThothError::Config(e.to_string())) } @@ -374,6 +505,8 @@ pub fn render_config(cfg: &Config, path: &Path, exists: bool, color: bool) -> St #[cfg(test)] mod tests { use super::*; + use crate::theme::Theme; + use ratatui::style::Color; use std::path::PathBuf; use tempfile::TempDir; @@ -606,6 +739,103 @@ mod tests { assert_eq!(content, DEFAULT_CONFIG_TOML); } + #[test] + fn theme_section_default_name_is_default() { + assert_eq!(ThemeSection::default().name, "default"); + } + + #[test] + fn parse_empty_string_theme_name_is_default() { + let cfg = parse("").unwrap(); + assert_eq!(cfg.theme.name, "default"); + } + + #[test] + fn parse_theme_name_mocha() { + let cfg = parse("[theme]\nname = \"mocha\"").unwrap(); + assert_eq!(cfg.theme.name, "mocha"); + } + + #[test] + fn parse_default_config_toml_equals_default_with_theme() { + let cfg = parse(DEFAULT_CONFIG_TOML).unwrap(); + assert_eq!(cfg.theme.name, "default"); + assert_eq!(cfg, Config::default()); + } + + #[test] + fn apply_theme_file_patches_two_slots() { + let base = Theme::default(); + let toml = "selection_bg = \"#ff8800\"\naccent = \"blue\"\n"; + let result = apply_theme_file(base, toml); + assert_eq!(result.selection_bg, Color::Rgb(255, 136, 0)); + assert_eq!(result.accent, Color::Blue); + assert_eq!(result.ok, Theme::default().ok); + assert_eq!(result.dim, Theme::default().dim); + } + + #[test] + fn apply_theme_file_invalid_color_keeps_base() { + let base = Theme::default(); + let toml = "ok = \"nope\"\n"; + let result = apply_theme_file(base, toml); + assert_eq!(result.ok, Theme::default().ok); + } + + #[test] + fn apply_theme_file_empty_toml_returns_base_unchanged() { + let base = Theme::default(); + let result = apply_theme_file(base, ""); + assert_eq!(result, Theme::default()); + } + + #[test] + fn resolve_theme_builtin_mocha() { + let dir = TempDir::new().unwrap(); + let t = resolve_theme("mocha", dir.path()); + assert_eq!(t, crate::theme::builtin("mocha").unwrap()); + } + + #[test] + fn resolve_theme_unknown_returns_default() { + let dir = TempDir::new().unwrap(); + let t = resolve_theme("does-not-exist", dir.path()); + assert_eq!(t, Theme::default()); + } + + #[test] + fn resolve_theme_file_with_extends_and_override() { + let dir = TempDir::new().unwrap(); + let content = "extends = \"mocha\"\naccent = \"red\"\n"; + std::fs::write(dir.path().join("mine.toml"), content).unwrap(); + let t = resolve_theme("mine", dir.path()); + let mocha = crate::theme::builtin("mocha").unwrap(); + assert_eq!(t.accent, Color::Red); + assert_eq!(t.ok, mocha.ok); + assert_eq!(t.selection_bg, mocha.selection_bg); + } + + #[test] + fn themes_dir_from_uses_config_parent() { + let home = Path::new("/home/user"); + let dir = themes_dir_from(None, None, home); + assert_eq!(dir, PathBuf::from("/home/user/.config/thoth/themes")); + } + + #[test] + fn themes_dir_from_xdg_config() { + let home = Path::new("/home/user"); + let dir = themes_dir_from(None, Some("/xdg/cfg"), home); + assert_eq!(dir, PathBuf::from("/xdg/cfg/thoth/themes")); + } + + #[test] + fn themes_dir_from_thoth_config_override() { + let home = Path::new("/home/user"); + let dir = themes_dir_from(Some("/custom/thoth/config.toml"), None, home); + assert_eq!(dir, PathBuf::from("/custom/thoth/themes")); + } + #[test] fn ensure_default_config_does_not_overwrite() { let dir = TempDir::new().unwrap(); From f941032575afd7680defb4f2c1cf3986a313b89b Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 18:13:16 -0600 Subject: [PATCH 126/151] feat(app): add theme field to App, init from Theme::default (#64) --- src/tui/app.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tui/app.rs b/src/tui/app.rs index dcc3d75..0f0e6bc 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -3,6 +3,7 @@ use rusqlite::Connection; use crate::cli::SearchArgs; use crate::error::ThothError; use crate::search::{CommandRow, ExitFilter}; +use crate::theme::Theme; use crate::tui::fuzzy; use crate::workspaces::WorkspaceRow; @@ -128,6 +129,7 @@ pub struct App { pub pending_delete: Option<(i64, DeleteOrigin)>, pub edit: Option, pub pending_edit: Option<(i64, String)>, + pub theme: Theme, } impl Default for App { @@ -160,6 +162,7 @@ impl App { pending_delete: None, edit: None, pending_edit: None, + theme: Theme::default(), } } From e8b1943d441e64583cb595c9d4b793001a0805c9 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 18:13:19 -0600 Subject: [PATCH 127/151] feat(render): replace hardcoded colors with theme slots, thread theme (#64) --- src/tui/mod.rs | 5 ++ src/tui/render.rs | 149 +++++++++++++++++++++++++++------------------- 2 files changed, 93 insertions(+), 61 deletions(-) diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 3fd7ec5..062cd0b 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -76,6 +76,11 @@ pub fn run( let mut app = App::new(); app.reload(conn, now)?; + + let themes_dir = crate::config::resolve_themes_dir(); + let cfg_theme = crate::config::load().theme; + app.theme = crate::config::resolve_theme(&cfg_theme.name, &themes_dir); + let mut table_state = TableState::default(); loop { diff --git a/src/tui/render.rs b/src/tui/render.rs index 061014b..cf5873f 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -7,16 +7,13 @@ use ratatui::{ }; use crate::search::{Column, CommandRow}; +use crate::theme::Theme; use crate::tui::app::{App, Confirm, Mode, Tab, WsPane}; use crate::tui::time::format_relative; use crate::workspaces::WorkspaceRow; -const ACCENT: Color = Color::Cyan; -const SELECTION_BG: Color = Color::Indexed(147); -const DIM_COLOR: Color = Color::DarkGray; const EDIT_MODAL_W: u16 = 60; const EDIT_MODAL_H: u16 = 5; -const BORDER_COLOR: Color = Color::DarkGray; pub fn display_command(raw: &str) -> String { let collapsed: String = raw @@ -53,11 +50,19 @@ fn format_duration(ms: i64) -> String { } } -fn exit_text(exit_code: i64) -> (&'static str, Color) { +fn exit_color(exit_code: i64, theme: &Theme) -> Color { if exit_code == 0 { - ("ok", Color::Green) + theme.ok } else { - ("fail", Color::Red) + theme.fail + } +} + +fn exit_label(exit_code: i64) -> &'static str { + if exit_code == 0 { + "ok" + } else { + "fail" } } @@ -130,7 +135,7 @@ fn col_text(col: &Column, row: &CommandRow, now: i64) -> String { match col { Column::Timestamp => format_relative(row.timestamp, now), Column::Duration => format_duration(row.duration_ms), - Column::Exit => exit_text(row.exit_code).0.to_string(), + Column::Exit => exit_label(row.exit_code).to_string(), Column::Project => row.project.clone(), Column::Command => display_command(&row.command), Column::Tags => row.tags.clone(), @@ -138,16 +143,16 @@ fn col_text(col: &Column, row: &CommandRow, now: i64) -> String { } } -fn tui_cell(col: &Column, row: &CommandRow, now: i64, width: u16) -> Cell<'static> { +fn tui_cell(col: &Column, row: &CommandRow, now: i64, width: u16, theme: &Theme) -> Cell<'static> { let text = truncate(&col_text(col, row, now), width as usize); let style = match col { - Column::Timestamp => Style::default().fg(DIM_COLOR), - Column::Duration => Style::default().fg(ACCENT), - Column::Exit => Style::default().fg(exit_text(row.exit_code).1), - Column::Project => Style::default().fg(Color::Blue), - Column::Directory => Style::default().fg(DIM_COLOR), - Column::Command => Style::default(), - Column::Tags => Style::default(), + Column::Timestamp => Style::default().fg(theme.dim), + Column::Duration => Style::default().fg(theme.accent), + Column::Exit => Style::default().fg(exit_color(row.exit_code, theme)), + Column::Project => Style::default().fg(theme.project), + Column::Directory => Style::default().fg(theme.directory), + Column::Command => Style::default().fg(theme.command), + Column::Tags => Style::default().fg(theme.tags), }; Cell::from(Line::from(vec![Span::styled(text, style)])) } @@ -169,10 +174,11 @@ pub fn resolve_tui_columns(names: &[String]) -> Vec { } fn render_tab_bar(frame: &mut Frame, area: ratatui::layout::Rect, app: &App) { - let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); + let theme = &app.theme; + let dim_style = Style::default().fg(theme.dim).add_modifier(Modifier::DIM); let active_style = Style::default() - .bg(SELECTION_BG) - .fg(Color::Black) + .bg(theme.selection_bg) + .fg(theme.selection_fg) .add_modifier(Modifier::BOLD); let (history_style, workspaces_style) = match app.tab { @@ -197,8 +203,9 @@ fn render_history_pane( columns: &[Column], table_state: &mut TableState, ) { - let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); - let border_style = Style::default().fg(BORDER_COLOR); + let theme = &app.theme; + let dim_style = Style::default().fg(theme.dim).add_modifier(Modifier::DIM); + let border_style = Style::default().fg(theme.border); let list_block = Block::default() .borders(Borders::ALL) @@ -273,7 +280,7 @@ fn render_history_pane( } else { content_w[i] }; - tui_cell(col, row, now, w) + tui_cell(col, row, now, w, theme) }) .collect(); Row::new(cells) @@ -281,7 +288,7 @@ fn render_history_pane( .collect(); let table_header_style = Style::default() - .fg(DIM_COLOR) + .fg(theme.dim) .add_modifier(Modifier::DIM) .add_modifier(Modifier::BOLD); let header_cells: Vec = columns @@ -291,8 +298,8 @@ fn render_history_pane( let table_header = Row::new(header_cells); let highlight_style = Style::default() - .bg(SELECTION_BG) - .fg(Color::Black) + .bg(theme.selection_bg) + .fg(theme.selection_fg) .add_modifier(Modifier::BOLD); let table = Table::new(rows, widths) @@ -321,15 +328,16 @@ fn render_workspaces_pane( table_state: &mut TableState, cmd_table_state: &mut TableState, ) { - let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); + let theme = &app.theme; + let dim_style = Style::default().fg(theme.dim).add_modifier(Modifier::DIM); let highlight_style = Style::default() - .bg(SELECTION_BG) - .fg(Color::Black) + .bg(theme.selection_bg) + .fg(theme.selection_fg) .add_modifier(Modifier::BOLD); let list_focused = app.ws_pane == WsPane::List; - let accent_border = Style::default().fg(ACCENT); - let dim_border = Style::default().fg(BORDER_COLOR); + let accent_border = Style::default().fg(theme.accent); + let dim_border = Style::default().fg(theme.border); let h_chunks = Layout::horizontal([Constraint::Percentage(38), Constraint::Min(1)]).split(area); @@ -347,7 +355,7 @@ fn render_workspaces_pane( .title(Span::styled( " workspaces ", if list_focused { - Style::default().fg(ACCENT) + Style::default().fg(theme.accent) } else { dim_style }, @@ -360,7 +368,11 @@ fn render_workspaces_pane( let empty = Paragraph::new("no workspaces").style(dim_style); frame.render_widget(empty, inner_left); } else { - let rows: Vec = app.workspaces.iter().map(|w| ws_row(w, now)).collect(); + let rows: Vec = app + .workspaces + .iter() + .map(|w| ws_row(w, now, theme)) + .collect(); let widths = vec![ Constraint::Min(1), @@ -388,7 +400,7 @@ fn render_workspaces_pane( .title(Span::styled( " commands ", if commands_focused { - Style::default().fg(ACCENT) + Style::default().fg(theme.accent) } else { dim_style }, @@ -406,16 +418,15 @@ fn render_workspaces_pane( .iter() .map(|cmd| { let time_text = truncate(&format_relative(cmd.timestamp, now), 9); - let exit_text_val = exit_text(cmd.exit_code); let cmd_text = truncate( &display_command(&cmd.command), inner_right.width.saturating_sub(16) as usize, ); Row::new(vec![ - Cell::from(Span::styled(time_text, Style::default().fg(DIM_COLOR))), + Cell::from(Span::styled(time_text, Style::default().fg(theme.dim))), Cell::from(Span::styled( - exit_text_val.0, - Style::default().fg(exit_text_val.1), + exit_label(cmd.exit_code), + Style::default().fg(exit_color(cmd.exit_code, theme)), )), Cell::from(cmd_text), ]) @@ -441,14 +452,14 @@ fn render_workspaces_pane( } } -fn ws_row(w: &WorkspaceRow, now: i64) -> Row<'static> { +fn ws_row(w: &WorkspaceRow, now: i64, theme: &Theme) -> Row<'static> { let name_text = truncate(&w.name, 20); let count_text = w.command_count.to_string(); let last_text = truncate(&format_relative(w.last_ts, now), 9); Row::new(vec![ - Cell::from(Span::styled(name_text, Style::default().fg(Color::Blue))), - Cell::from(Span::styled(count_text, Style::default().fg(DIM_COLOR))), - Cell::from(Span::styled(last_text, Style::default().fg(DIM_COLOR))), + Cell::from(Span::styled(name_text, Style::default().fg(theme.project))), + Cell::from(Span::styled(count_text, Style::default().fg(theme.dim))), + Cell::from(Span::styled(last_text, Style::default().fg(theme.dim))), ]) } @@ -501,13 +512,14 @@ pub fn draw_with_cmd_state( render_tab_bar(frame, tabbar_area, app); + let theme = &app.theme; let version = env!("CARGO_PKG_VERSION"); let accent_style = Style::default() - .fg(Color::Green) + .fg(theme.controls) .add_modifier(Modifier::BOLD); - let dim_style = Style::default().fg(DIM_COLOR).add_modifier(Modifier::DIM); + let dim_style = Style::default().fg(theme.dim).add_modifier(Modifier::DIM); let green_bold = Style::default() - .fg(Color::Green) + .fg(theme.header) .add_modifier(Modifier::BOLD); let accent_bar = Span::styled("▌ ", green_bold); @@ -557,7 +569,7 @@ pub fn draw_with_cmd_state( render_confirm_modal(frame, middle_area, app); } if let Some(ref es) = app.edit { - render_edit_modal(frame, middle_area, es); + render_edit_modal(frame, middle_area, es, theme); } let query_text = format!("> {}", app.query); @@ -677,8 +689,11 @@ fn centered_rect(width: u16, height: u16, area: Rect) -> Rect { fn render_confirm_modal(frame: &mut Frame, area: Rect, app: &crate::tui::app::App) { let Some(confirm) = &app.confirm else { return }; - let dim_style = Style::default().fg(DIM_COLOR); - let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); + let theme = &app.theme; + let dim_style = Style::default().fg(theme.dim); + let accent_style = Style::default() + .fg(theme.accent) + .add_modifier(Modifier::BOLD); let modal_w = 50u16; let modal_h = 4u16; @@ -693,7 +708,7 @@ fn render_confirm_modal(frame: &mut Frame, area: Rect, app: &crate::tui::app::Ap let block = Block::default() .borders(Borders::ALL) .border_type(BorderType::Rounded) - .border_style(Style::default().fg(ACCENT)) + .border_style(Style::default().fg(theme.accent)) .title(Span::styled(title, accent_style)); let inner = block.inner(modal_area); @@ -736,9 +751,16 @@ fn render_confirm_modal(frame: &mut Frame, area: Rect, app: &crate::tui::app::Ap } } -fn render_edit_modal(frame: &mut Frame, area: Rect, es: &crate::tui::app::EditState) { - let dim_style = Style::default().fg(DIM_COLOR); - let accent_style = Style::default().fg(ACCENT).add_modifier(Modifier::BOLD); +fn render_edit_modal( + frame: &mut Frame, + area: Rect, + es: &crate::tui::app::EditState, + theme: &Theme, +) { + let dim_style = Style::default().fg(theme.dim); + let accent_style = Style::default() + .fg(theme.accent) + .add_modifier(Modifier::BOLD); let modal_area = centered_rect(EDIT_MODAL_W, EDIT_MODAL_H, area); frame.render_widget(Clear, modal_area); @@ -746,7 +768,7 @@ fn render_edit_modal(frame: &mut Frame, area: Rect, es: &crate::tui::app::EditSt let block = Block::default() .borders(Borders::ALL) .border_type(BorderType::Rounded) - .border_style(Style::default().fg(ACCENT)) + .border_style(Style::default().fg(theme.accent)) .title(Span::styled(" Edit command ", accent_style)); let inner = block.inner(modal_area); @@ -774,6 +796,7 @@ fn render_edit_modal(frame: &mut Frame, area: Rect, es: &crate::tui::app::EditSt mod tests { use super::*; use crate::config::default_tui_columns; + use crate::theme::Theme; use crate::tui::app::{Action, App, Confirm, ConfirmDelete, DeleteOrigin, Tab, WsPane}; use crate::workspaces::WorkspaceRow; use ratatui::backend::TestBackend; @@ -885,7 +908,7 @@ mod tests { let buf = render_app_buf(&app); let active_bg_count = (0..TEST_WIDTH) - .filter(|&x| buf[(x, 0)].style().bg == Some(SELECTION_BG)) + .filter(|&x| buf[(x, 0)].style().bg == Some(Theme::default().selection_bg)) .count(); assert!( @@ -956,8 +979,10 @@ mod tests { let app = app_with_workspaces(); let buf = render_app_buf(&app); - let any_cyan_bg = (0..TEST_HEIGHT) - .any(|row_y| (0..TEST_WIDTH).any(|x| buf[(x, row_y)].style().bg == Some(SELECTION_BG))); + let any_cyan_bg = (0..TEST_HEIGHT).any(|row_y| { + (0..TEST_WIDTH) + .any(|x| buf[(x, row_y)].style().bg == Some(Theme::default().selection_bg)) + }); assert!( any_cyan_bg, "Workspaces tab must have bg=Cyan on selected row" @@ -1151,8 +1176,10 @@ mod tests { let buf = render_app_buf(&app); - let any_cyan_bg = (0..TEST_HEIGHT) - .any(|row_y| (0..TEST_WIDTH).any(|x| buf[(x, row_y)].style().bg == Some(SELECTION_BG))); + let any_cyan_bg = (0..TEST_HEIGHT).any(|row_y| { + (0..TEST_WIDTH) + .any(|x| buf[(x, row_y)].style().bg == Some(Theme::default().selection_bg)) + }); assert!( any_cyan_bg, "selected row must have bg=Cyan highlight somewhere in the frame" @@ -1669,8 +1696,8 @@ mod tests { height: u16, ) -> Option { for row in 0..height { - let any_cyan_bg = - (0..width).any(|col| buf[(col, row)].style().bg == Some(SELECTION_BG)); + let any_cyan_bg = (0..width) + .any(|col| buf[(col, row)].style().bg == Some(Theme::default().selection_bg)); if any_cyan_bg { let line: String = (0..width) .map(|col| buf[(col, row)].symbol().chars().next().unwrap_or(' ')) @@ -2069,7 +2096,7 @@ mod tests { let list_pane_area_x = 1u16; let any_accent_in_left_border = (0..TEST_HEIGHT).any(|row_y| { let cell = &buf[(list_pane_area_x, row_y)]; - cell.style().fg == Some(ACCENT) + cell.style().fg == Some(Theme::default().accent) }); assert!( any_accent_in_left_border, @@ -2085,7 +2112,7 @@ mod tests { let cmd_pane_x = (TEST_WIDTH as f32 * 0.38) as u16 + 1; let any_accent_in_cmd_border = (0..TEST_HEIGHT).any(|row_y| { let cell = &buf[(cmd_pane_x, row_y)]; - cell.style().fg == Some(ACCENT) + cell.style().fg == Some(Theme::default().accent) }); assert!( any_accent_in_cmd_border, From 8de427980c526a93dab3f8aa8b11ca2919509e55 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 18:23:21 -0600 Subject: [PATCH 128/151] test: add e2e tests for tth theme command (#66) --- tests/theme_e2e.rs | 158 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 tests/theme_e2e.rs diff --git a/tests/theme_e2e.rs b/tests/theme_e2e.rs new file mode 100644 index 0000000..b7999b8 --- /dev/null +++ b/tests/theme_e2e.rs @@ -0,0 +1,158 @@ +use assert_cmd::Command; +use predicates::prelude::*; +use tempfile::TempDir; + +fn tth_with(db: &std::path::Path, cfg: &std::path::Path) -> Command { + let mut cmd = Command::cargo_bin("tth").unwrap(); + cmd.env("THOTH_DB", db.to_str().unwrap()) + .env("THOTH_CONFIG", cfg.to_str().unwrap()) + .env("THOTH_ERROR_LOG", "/dev/null") + .env("NO_COLOR", "1"); + cmd +} + +fn env_pair(dir: &TempDir) -> (std::path::PathBuf, std::path::PathBuf) { + let db = dir.path().join("history.db"); + let cfg = dir.path().join("config.toml"); + (db, cfg) +} + +#[test] +fn theme_bare_prints_current_default() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = env_pair(&dir); + + tth_with(&db, &cfg) + .arg("theme") + .assert() + .code(0) + .stdout(predicate::str::contains("default")); +} + +#[test] +fn theme_list_shows_seven_builtins() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = env_pair(&dir); + + let assert = tth_with(&db, &cfg).args(["theme", "list"]).assert().code(0); + + let output = assert.get_output(); + let stdout = String::from_utf8_lossy(&output.stdout); + + for name in &[ + "default", + "ember", + "frost", + "latte", + "frappe", + "macchiato", + "mocha", + ] { + assert!(stdout.contains(name), "missing builtin: {name}"); + } +} + +#[test] +fn theme_list_marks_default_as_current() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = env_pair(&dir); + + tth_with(&db, &cfg) + .args(["theme", "list"]) + .assert() + .code(0) + .stdout(predicate::str::contains("(current)")); +} + +#[test] +fn theme_set_mocha_writes_config_and_prints_confirmation() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = env_pair(&dir); + + tth_with(&db, &cfg) + .args(["theme", "mocha"]) + .assert() + .code(0) + .stdout(predicate::str::contains("mocha")); + + let content = std::fs::read_to_string(&cfg).unwrap(); + assert!( + content.contains("name = \"mocha\""), + "config should contain mocha, got: {content}" + ); +} + +#[test] +fn theme_bare_after_set_mocha_prints_mocha() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = env_pair(&dir); + + tth_with(&db, &cfg) + .args(["theme", "mocha"]) + .assert() + .code(0); + + tth_with(&db, &cfg) + .arg("theme") + .assert() + .code(0) + .stdout(predicate::str::contains("mocha")); +} + +#[test] +fn theme_invalid_name_exits_nonzero_and_does_not_write_config() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = env_pair(&dir); + + tth_with(&db, &cfg) + .args(["theme", "nonsense"]) + .assert() + .failure(); + + assert!( + !cfg.exists(), + "config should not be created for invalid theme" + ); +} + +#[test] +fn theme_list_after_set_mocha_marks_mocha_current() { + let dir = TempDir::new().unwrap(); + let (db, cfg) = env_pair(&dir); + + tth_with(&db, &cfg) + .args(["theme", "mocha"]) + .assert() + .code(0); + + let assert = tth_with(&db, &cfg).args(["theme", "list"]).assert().code(0); + + let stdout = String::from_utf8_lossy(&assert.get_output().stdout); + assert!( + stdout.contains("mocha") && stdout.contains("(current)"), + "expected mocha to be marked current, got: {stdout}" + ); +} + +#[test] +fn theme_user_file_is_valid_and_appears_in_list() { + let dir = TempDir::new().unwrap(); + let db = dir.path().join("history.db"); + let cfg = dir.path().join("config.toml"); + + let themes_dir = dir.path().join("themes"); + std::fs::create_dir_all(&themes_dir).unwrap(); + std::fs::write(themes_dir.join("mine.toml"), "").unwrap(); + + tth_with(&db, &cfg) + .args(["theme", "mine"]) + .assert() + .code(0) + .stdout(predicate::str::contains("mine")); + + tth_with(&db, &cfg) + .args(["theme", "list"]) + .assert() + .code(0) + .stdout(predicate::str::contains("mine")); +} From fd5c6938a0448e8c339b9c042a0146d145d15d78 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 18:23:24 -0600 Subject: [PATCH 129/151] feat: add tth theme command to show, list, and switch themes (#66) --- src/cli.rs | 54 ++++++++++++++++++++++++++++++++++++ src/config.rs | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/doctor.rs | 8 ++++++ 3 files changed, 138 insertions(+) diff --git a/src/cli.rs b/src/cli.rs index df7b7e6..597b665 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -63,6 +63,8 @@ pub enum Cmd { Workspace(WorkspaceArgs), #[command(about = "List recorded workspaces with command counts")] Workspaces, + #[command(about = "Show, list, or switch the TUI theme")] + Theme(ThemeArgs), } #[derive(clap::Args, Debug, Clone)] @@ -295,6 +297,12 @@ pub struct UninstallArgs { pub rc_file: Option, } +#[derive(clap::Args, Debug, Clone)] +pub struct ThemeArgs { + #[arg(help = "Theme name to switch to, or 'list' to list available themes")] + pub name: Option, +} + pub fn run() -> Result<(), crate::error::ThothError> { use clap::Parser; let cli = Cli::parse(); @@ -601,6 +609,7 @@ pub fn run() -> Result<(), crate::error::ThothError> { let framework_config_text = read_framework_config(&framework, &home); let config_path = crate::config::resolve_config_path(); let config_present = config_path.exists(); + let theme_name = crate::config::load().theme.name; let inputs = crate::doctor::DoctorInputs { hooks_installed, db_result, @@ -609,6 +618,7 @@ pub fn run() -> Result<(), crate::error::ThothError> { framework_config_text, config_path, config_present, + theme_name, }; let report = crate::doctor::run_doctor(&inputs); print!("{}", crate::doctor::render_report(&report)); @@ -675,6 +685,50 @@ pub fn run() -> Result<(), crate::error::ThothError> { println!("{table}"); } } + Some(Cmd::Theme(args)) => { + let cfg = crate::config::load(); + let themes_dir = crate::config::resolve_themes_dir(); + match args.name.as_deref() { + None => { + println!("Current theme: {}", cfg.theme.name); + } + Some("list") => { + let current = &cfg.theme.name; + println!("Built-in themes:"); + for name in crate::theme::builtin_names() { + if *name == current.as_str() { + println!(" {} (current)", name); + } else { + println!(" {}", name); + } + } + let user_themes = crate::config::list_user_theme_names(&themes_dir); + if !user_themes.is_empty() { + println!("User themes:"); + for name in &user_themes { + if name == current { + println!(" {} (current)", name); + } else { + println!(" {}", name); + } + } + } + } + Some(name) => { + if !crate::config::theme_exists(name, &themes_dir) { + let builtin_list = crate::theme::builtin_names().join(", "); + return Err(crate::error::ThothError::Config(format!( + "unknown theme '{}'; built-in themes: {}; user themes go in {}", + name, + builtin_list, + themes_dir.display() + ))); + } + crate::config::write_set("theme.name", name)?; + println!("Theme set to '{}'. Reopen the TUI to see it.", name); + } + } + } } Ok(()) } diff --git a/src/config.rs b/src/config.rs index c3b00e3..056bce4 100644 --- a/src/config.rs +++ b/src/config.rs @@ -9,6 +9,7 @@ const VALID_KEYS: &[(&str, &str)] = &[ ("session.gap_minutes", "positive integer"), ("tui.orientation", r#""bottom" or "top""#), ("search.default_limit", "positive integer"), + ("theme.name", "theme name string"), ]; pub const DEFAULT_CONFIG_TOML: &str = r#"# Thoth configuration. All settings are optional; values shown are the defaults. @@ -405,6 +406,9 @@ pub fn apply_set(existing_toml: &str, key: &str, value: &str) -> Result toml_edit::value(value) + .into_value() + .map_err(|e| ThothError::Config(format!("toml_edit error: {}", e)))?, _ => { return Err(ThothError::Config(format!( "unknown key '{}'; valid keys: {}", @@ -445,6 +449,35 @@ pub fn write_set(key: &str, value: &str) -> Result<(), ThothError> { Ok(()) } +pub fn list_user_theme_names(themes_dir: &Path) -> Vec { + let entries = match std::fs::read_dir(themes_dir) { + Ok(e) => e, + Err(_) => return vec![], + }; + let mut names: Vec = entries + .filter_map(|e| { + let entry = e.ok()?; + let path = entry.path(); + if path.extension().and_then(|s| s.to_str()) == Some("toml") { + path.file_stem() + .and_then(|s| s.to_str()) + .map(|s| s.to_string()) + } else { + None + } + }) + .collect(); + names.sort(); + names +} + +pub fn theme_exists(name: &str, themes_dir: &Path) -> bool { + if crate::theme::builtin(name).is_some() { + return true; + } + themes_dir.join(format!("{name}.toml")).exists() +} + pub fn ensure_default_config(path: &Path) -> Result { if path.exists() { return Ok(false); @@ -836,6 +869,49 @@ mod tests { assert_eq!(dir, PathBuf::from("/custom/thoth/themes")); } + #[test] + fn list_user_theme_names_returns_sorted_toml_stems() { + let dir = TempDir::new().unwrap(); + std::fs::write(dir.path().join("mine.toml"), "").unwrap(); + std::fs::write(dir.path().join("other.toml"), "").unwrap(); + std::fs::write(dir.path().join("readme.txt"), "").unwrap(); + let names = list_user_theme_names(dir.path()); + assert_eq!(names, vec!["mine", "other"]); + } + + #[test] + fn list_user_theme_names_missing_dir_returns_empty() { + let names = list_user_theme_names(std::path::Path::new("/nonexistent/path/themes")); + assert!(names.is_empty()); + } + + #[test] + fn theme_exists_builtin_name_returns_true() { + let dir = TempDir::new().unwrap(); + assert!(theme_exists("mocha", dir.path())); + assert!(theme_exists("default", dir.path())); + } + + #[test] + fn theme_exists_file_in_dir_returns_true() { + let dir = TempDir::new().unwrap(); + std::fs::write(dir.path().join("mine.toml"), "").unwrap(); + assert!(theme_exists("mine", dir.path())); + } + + #[test] + fn theme_exists_unknown_returns_false() { + let dir = TempDir::new().unwrap(); + assert!(!theme_exists("does-not-exist", dir.path())); + } + + #[test] + fn apply_set_theme_name_works() { + let result = apply_set("", "theme.name", "mocha").unwrap(); + assert!(result.contains("[theme]")); + assert!(result.contains("name = \"mocha\"")); + } + #[test] fn ensure_default_config_does_not_overwrite() { let dir = TempDir::new().unwrap(); diff --git a/src/doctor.rs b/src/doctor.rs index 6d900e4..ce1ab84 100644 --- a/src/doctor.rs +++ b/src/doctor.rs @@ -29,6 +29,7 @@ pub struct DoctorInputs { pub framework_config_text: Option, pub config_path: PathBuf, pub config_present: bool, + pub theme_name: String, } pub struct DbInfo { @@ -108,6 +109,12 @@ pub fn run_doctor(inputs: &DoctorInputs) -> DoctorReport { guidance: None, }); + checks.push(Check { + status: CheckStatus::Ok, + name: format!("theme {}", inputs.theme_name), + guidance: None, + }); + DoctorReport { checks } } @@ -190,6 +197,7 @@ mod tests { framework_config_text: config.map(|s| s.to_string()), config_path: std::path::PathBuf::from("/home/user/.config/thoth/config.toml"), config_present: false, + theme_name: "default".to_string(), } } From 2e314723f7f7e46b48ec6520c20a8f4b0a4ac369 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 18:49:12 -0600 Subject: [PATCH 130/151] feat(tui): search history by tag in the fuzzy filter and render tags as [a][b] --- src/tui/fuzzy.rs | 32 +++++++++++++++++++++++++++++++- src/tui/render.rs | 2 +- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/tui/fuzzy.rs b/src/tui/fuzzy.rs index be6144b..1018745 100644 --- a/src/tui/fuzzy.rs +++ b/src/tui/fuzzy.rs @@ -17,8 +17,14 @@ pub fn rank(query: &str, items: &[CommandRow]) -> Vec { .iter() .enumerate() .filter_map(|(i, row)| { + let tag_text = crate::tags::parse_active(&row.tags).join(" "); + let hay = if tag_text.is_empty() { + row.command.clone() + } else { + format!("{} {tag_text}", row.command) + }; let mut haystack_buf = Vec::new(); - let haystack = Utf32Str::new(&row.command, &mut haystack_buf); + let haystack = Utf32Str::new(&hay, &mut haystack_buf); pattern.score(haystack, &mut matcher).map(|s| (i, s)) }) .collect(); @@ -46,6 +52,30 @@ mod tests { } } + fn row_with_tags(command: &str, tags: &str) -> CommandRow { + let mut r = row(command); + r.tags = tags.to_string(); + r + } + + #[test] + fn query_matches_a_tag_not_in_the_command() { + let items = vec![ + row_with_tags("cargo build", r#"["release","perf"]"#), + row_with_tags("ls -la", r#"["files"]"#), + ]; + let result = rank("release", &items); + assert_eq!( + result.first(), + Some(&0), + "command tagged 'release' must match" + ); + assert!( + !result.contains(&1), + "untagged-for-release row must not match" + ); + } + #[test] fn empty_query_returns_all_in_original_order() { let items = vec![row("git status"), row("ls -la"), row("cargo build")]; diff --git a/src/tui/render.rs b/src/tui/render.rs index cf5873f..6dea3ae 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -138,7 +138,7 @@ fn col_text(col: &Column, row: &CommandRow, now: i64) -> String { Column::Exit => exit_label(row.exit_code).to_string(), Column::Project => row.project.clone(), Column::Command => display_command(&row.command), - Column::Tags => row.tags.clone(), + Column::Tags => crate::tags::format_prompt_segment(&row.tags), Column::Directory => row.directory.clone(), } } From 87b71f0d6037c1302994465a5d6b8baa24be7b9a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 19:07:02 -0600 Subject: [PATCH 131/151] feat(tui): extend fuzzy haystack with project and directory fields (#68) --- src/tui/fuzzy.rs | 73 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/src/tui/fuzzy.rs b/src/tui/fuzzy.rs index 1018745..9cd8de4 100644 --- a/src/tui/fuzzy.rs +++ b/src/tui/fuzzy.rs @@ -18,11 +18,17 @@ pub fn rank(query: &str, items: &[CommandRow]) -> Vec { .enumerate() .filter_map(|(i, row)| { let tag_text = crate::tags::parse_active(&row.tags).join(" "); - let hay = if tag_text.is_empty() { - row.command.clone() - } else { - format!("{} {tag_text}", row.command) - }; + let mut parts = vec![row.command.as_str()]; + if !tag_text.is_empty() { + parts.push(tag_text.as_str()); + } + if !row.project.is_empty() { + parts.push(row.project.as_str()); + } + if !row.directory.is_empty() { + parts.push(row.directory.as_str()); + } + let hay = parts.join(" "); let mut haystack_buf = Vec::new(); let haystack = Utf32Str::new(&hay, &mut haystack_buf); pattern.score(haystack, &mut matcher).map(|s| (i, s)) @@ -58,6 +64,18 @@ mod tests { r } + fn row_with_project(command: &str, project: &str) -> CommandRow { + let mut r = row(command); + r.project = project.to_string(); + r + } + + fn row_with_directory(command: &str, directory: &str) -> CommandRow { + let mut r = row(command); + r.directory = directory.to_string(); + r + } + #[test] fn query_matches_a_tag_not_in_the_command() { let items = vec![ @@ -105,6 +123,51 @@ mod tests { assert!(result.is_empty()); } + #[test] + fn query_matches_project_not_in_command_or_tags() { + let items = vec![ + row_with_project("ls -la", "myproject"), + row("git status"), + ]; + let result = rank("myproject", &items); + assert!( + result.contains(&0), + "row with matching project must appear in results" + ); + assert!( + !result.contains(&1), + "row with non-matching project must not appear" + ); + } + + #[test] + fn query_matches_directory_not_in_command_or_tags() { + let items = vec![ + row_with_directory("ls", "/home/jose/special-dir"), + row("git status"), + ]; + let result = rank("special-dir", &items); + assert!( + result.contains(&0), + "row with matching directory must appear in results" + ); + assert!( + !result.contains(&1), + "row with non-matching directory must not appear" + ); + } + + #[test] + fn command_tag_match_still_works_after_haystack_extension() { + let items = vec![ + row_with_tags("cargo build", r#"["release"]"#), + row("unrelated"), + ]; + let result = rank("release", &items); + assert!(result.contains(&0), "tag match must still work"); + assert!(!result.contains(&1), "non-matching row must not appear"); + } + #[test] fn ordering_better_match_comes_first() { let items = vec![row("cargo test"), row("cargo build --tests")]; From 66331a21d6df5acb699c9db69be58e4d8207e662 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 19:13:34 -0600 Subject: [PATCH 132/151] feat(tui): add preview pane to History tab with selected command details (#68) --- src/tui/render.rs | 423 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 413 insertions(+), 10 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index 6dea3ae..dea2e82 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -194,6 +194,97 @@ fn render_tab_bar(frame: &mut Frame, area: ratatui::layout::Rect, app: &App) { frame.render_widget(Paragraph::new(line), area); } +fn render_preview(frame: &mut Frame, area: ratatui::layout::Rect, app: &App, now: i64) { + let theme = &app.theme; + let dim_style = Style::default().fg(theme.dim).add_modifier(Modifier::DIM); + let border_style = Style::default().fg(theme.border); + + let preview_block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(border_style) + .title(Span::styled(" preview ", dim_style)); + + let inner = preview_block.inner(area); + frame.render_widget(preview_block, area); + + let selected_row: Option<&CommandRow> = app + .filtered + .get(app.selected) + .and_then(|&idx| app.all_rows.get(idx)); + + let Some(row) = selected_row else { + return; + }; + + let label_style = Style::default().fg(theme.dim); + let cmd_style = Style::default().fg(theme.command); + let project_style = Style::default().fg(theme.project); + let dir_style = Style::default().fg(theme.dim); + let tag_style = Style::default().fg(theme.tags); + let exit_style = Style::default().fg(exit_color(row.exit_code, theme)); + + let tag_text = crate::tags::format_prompt_segment(&row.tags); + let tag_display = if tag_text.is_empty() { + "none".to_string() + } else { + tag_text + }; + + let workspace_display = row.workspace.as_deref().unwrap_or("-").to_string(); + let duration_display = format_duration(row.duration_ms); + let when_display = format!( + "{} ({})", + crate::search::fmt_timestamp(row.timestamp), + format_relative(row.timestamp, now) + ); + let exit_display = format!("{} ({})", exit_label(row.exit_code), row.exit_code); + + let max_val_w = inner.width.saturating_sub(12) as usize; + + let lines = vec![ + Line::from(vec![Span::styled( + truncate(&display_command(&row.command), inner.width as usize), + cmd_style, + )]), + Line::from(vec![ + Span::styled("project ", label_style), + Span::styled(truncate(&row.project, max_val_w), project_style), + ]), + Line::from(vec![ + Span::styled("directory ", label_style), + Span::styled(truncate(&row.directory, max_val_w), dir_style), + ]), + Line::from(vec![ + Span::styled("exit ", label_style), + Span::styled(truncate(&exit_display, max_val_w), exit_style), + ]), + Line::from(vec![ + Span::styled("duration ", label_style), + Span::styled(truncate(&duration_display, max_val_w), label_style), + ]), + Line::from(vec![ + Span::styled("when ", label_style), + Span::styled(truncate(&when_display, max_val_w), label_style), + ]), + Line::from(vec![ + Span::styled("tags ", label_style), + Span::styled(truncate(&tag_display, max_val_w), tag_style), + ]), + Line::from(vec![ + Span::styled("workspace ", label_style), + Span::styled(truncate(&workspace_display, max_val_w), label_style), + ]), + Line::from(vec![ + Span::styled("session ", label_style), + Span::styled(truncate(&row.session_id, max_val_w), label_style), + ]), + ]; + + let paragraph = Paragraph::new(lines).wrap(ratatui::widgets::Wrap { trim: false }); + frame.render_widget(paragraph, inner); +} + fn render_history_pane( frame: &mut Frame, area: ratatui::layout::Rect, @@ -203,6 +294,12 @@ fn render_history_pane( columns: &[Column], table_state: &mut TableState, ) { + let h_chunks = Layout::horizontal([Constraint::Percentage(60), Constraint::Min(1)]).split(area); + let list_area = h_chunks[0]; + let preview_area = h_chunks[1]; + + render_preview(frame, preview_area, app, now); + let theme = &app.theme; let dim_style = Style::default().fg(theme.dim).add_modifier(Modifier::DIM); let border_style = Style::default().fg(theme.border); @@ -213,8 +310,8 @@ fn render_history_pane( .border_style(border_style) .title(Span::styled(" history ", dim_style)); - let inner_list_area = list_block.inner(area); - frame.render_widget(list_block, area); + let inner_list_area = list_block.inner(list_area); + frame.render_widget(list_block, list_area); let has_command_col = columns.iter().any(|c| matches!(c, Column::Command)); let n_cols = columns.len(); @@ -1436,8 +1533,18 @@ mod tests { } fn row_y_of(text: &str, buf: &ratatui::buffer::Buffer, width: u16, height: u16) -> Option { + row_y_of_in_x_range(text, buf, 0, width, height) + } + + fn row_y_of_in_x_range( + text: &str, + buf: &ratatui::buffer::Buffer, + x_start: u16, + x_end: u16, + height: u16, + ) -> Option { for row in 0..height { - let line: String = (0..width) + let line: String = (x_start..x_end) .map(|col| buf[(col, row)].symbol().chars().next().unwrap_or(' ')) .collect(); if line.contains(text) { @@ -1451,10 +1558,11 @@ mod tests { fn newest_command_renders_below_oldest() { let app = app_bottom_anchored(); let (_, buf) = render_app_small(&app, TEST_WIDTH, TEST_HEIGHT); - let newest_y = row_y_of("newest-cmd", &buf, TEST_WIDTH, TEST_HEIGHT) - .expect("newest-cmd must appear in buffer"); - let oldest_y = row_y_of("oldest-cmd", &buf, TEST_WIDTH, TEST_HEIGHT) - .expect("oldest-cmd must appear in buffer"); + let list_pane_right = TEST_WIDTH * 60 / 100; + let newest_y = row_y_of_in_x_range("newest-cmd", &buf, 0, list_pane_right, TEST_HEIGHT) + .expect("newest-cmd must appear in list pane"); + let oldest_y = row_y_of_in_x_range("oldest-cmd", &buf, 0, list_pane_right, TEST_HEIGHT) + .expect("oldest-cmd must appear in list pane"); assert!( newest_y > oldest_y, "newest command must appear on a lower (higher y) row than oldest; newest_y={newest_y} oldest_y={oldest_y}" @@ -1675,9 +1783,10 @@ mod tests { } fn visible_commands(buf: &ratatui::buffer::Buffer, width: u16, height: u16) -> Vec { + let list_pane_right = width * 60 / 100; let mut seen = Vec::new(); for row in 0..height { - let line: String = (0..width) + let line: String = (0..list_pane_right) .map(|col| buf[(col, row)].symbol().chars().next().unwrap_or(' ')) .collect(); for i in 0..12u32 { @@ -1891,8 +2000,10 @@ mod tests { "reduced cols must NOT show 'time' header; got:\n{text}" ); assert!( - !text.contains("dur"), - "reduced cols must NOT show 'dur' header; got:\n{text}" + !text + .lines() + .any(|l| l.starts_with('│') && l.contains(" dur ") && l.len() < 30), + "reduced cols must NOT show 'dur' column header in the list pane; got:\n{text}" ); assert!( text.contains("my-cmd"), @@ -2318,4 +2429,296 @@ mod tests { "Workspaces Commands controls must contain 'edit' hint; got:\n{text}" ); } + + fn render_app_wide(app: &App) -> (String, ratatui::buffer::Buffer) { + const W: u16 = 120; + const H: u16 = 16; + let cols = default_cols(); + let backend = TestBackend::new(W, H); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + terminal + .draw(|f| draw(f, app, TEST_NOW, true, &cols, &mut ts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..H { + let mut line = String::new(); + for col in 0..W { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line.trim_end().to_string()); + } + (lines.join("\n"), buf) + } + + struct RowSpec<'a> { + cmd: &'a str, + ts: i64, + exit: i64, + project: &'a str, + directory: &'a str, + tags: &'a str, + workspace: Option<&'a str>, + session_id: &'a str, + duration_ms: i64, + } + + fn make_row_full(s: RowSpec<'_>) -> CommandRow { + CommandRow { + id: 0, + command: s.cmd.to_string(), + timestamp: s.ts, + exit_code: s.exit, + project: s.project.to_string(), + directory: s.directory.to_string(), + tags: s.tags.to_string(), + session_id: s.session_id.to_string(), + duration_ms: s.duration_ms, + workspace: s.workspace.map(|w| w.to_string()), + } + } + + #[test] + fn history_tab_shows_preview_block_title() { + let mut app = App::new(); + app.all_rows = vec![make_row_full(RowSpec { + cmd: "git status", + ts: TEST_NOW - 60, + exit: 0, + project: "myproject", + directory: "/home/user/myproject", + tags: "[]", + workspace: None, + session_id: "sess-abc", + duration_ms: 250, + })]; + app.recompute(); + let (text, _) = render_app_wide(&app); + assert!( + text.contains("preview"), + "History tab must show 'preview' block title; got:\n{text}" + ); + } + + #[test] + fn history_tab_preview_shows_selected_command() { + let mut app = App::new(); + app.all_rows = vec![make_row_full(RowSpec { + cmd: "cargo test --release", + ts: TEST_NOW - 60, + exit: 0, + project: "myproject", + directory: "/home/user/myproject", + tags: "[]", + workspace: None, + session_id: "sess-abc", + duration_ms: 1500, + })]; + app.recompute(); + let (text, _) = render_app_wide(&app); + assert!( + text.contains("cargo test --release"), + "preview pane must show selected command text; got:\n{text}" + ); + } + + #[test] + fn history_tab_preview_shows_project_and_directory() { + let mut app = App::new(); + app.all_rows = vec![make_row_full(RowSpec { + cmd: "ls", + ts: TEST_NOW - 60, + exit: 0, + project: "proj-preview", + directory: "/srv/preview-dir", + tags: "[]", + workspace: None, + session_id: "sess-1", + duration_ms: 10, + })]; + app.recompute(); + let (text, _) = render_app_wide(&app); + assert!( + text.contains("proj-preview"), + "preview pane must show project name; got:\n{text}" + ); + assert!( + text.contains("/srv/preview-dir"), + "preview pane must show directory; got:\n{text}" + ); + } + + #[test] + fn history_tab_preview_shows_exit_status() { + let mut app = App::new(); + app.all_rows = vec![make_row_full(RowSpec { + cmd: "bad-cmd", + ts: TEST_NOW - 60, + exit: 1, + project: "p", + directory: "/tmp", + tags: "[]", + workspace: None, + session_id: "sess-1", + duration_ms: 10, + })]; + app.recompute(); + let (text, _) = render_app_wide(&app); + assert!( + text.contains("fail"), + "preview pane must show exit status 'fail'; got:\n{text}" + ); + } + + #[test] + fn history_tab_preview_changes_on_selection_change() { + use crate::tui::event::handle_key; + use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + + let mut app = App::new(); + app.all_rows = vec![ + make_row_full(RowSpec { + cmd: "first-unique-cmd", + ts: TEST_NOW - 60, + exit: 0, + project: "proj-a", + directory: "/tmp/a", + tags: "[]", + workspace: None, + session_id: "s1", + duration_ms: 100, + }), + make_row_full(RowSpec { + cmd: "second-unique-cmd", + ts: TEST_NOW - 120, + exit: 0, + project: "proj-b", + directory: "/tmp/b", + tags: "[]", + workspace: None, + session_id: "s2", + duration_ms: 200, + }), + ]; + app.recompute(); + + let (text_before, _) = render_app_wide(&app); + assert!( + text_before.contains("first-unique-cmd"), + "preview must show first command initially; got:\n{text_before}" + ); + + handle_key( + KeyEvent { + code: KeyCode::Up, + modifiers: KeyModifiers::NONE, + kind: KeyEventKind::Press, + state: KeyEventState::NONE, + }, + &mut app, + ); + + let (text_after, _) = render_app_wide(&app); + assert!( + text_after.contains("second-unique-cmd"), + "preview must show second command after Up; got:\n{text_after}" + ); + } + + #[test] + fn history_tab_list_pane_still_shows_history_block() { + let mut app = App::new(); + app.all_rows = vec![make_row_full(RowSpec { + cmd: "git log --oneline", + ts: TEST_NOW - 60, + exit: 0, + project: "p", + directory: "/tmp", + tags: "[]", + workspace: None, + session_id: "s1", + duration_ms: 50, + })]; + app.recompute(); + let (text, _) = render_app_wide(&app); + assert!( + text.contains("history"), + "left pane must still show 'history' block title; got:\n{text}" + ); + assert!( + text.contains("git log --oneline"), + "left pane must still show command in list; got:\n{text}" + ); + } + + #[test] + fn history_tab_empty_list_shows_empty_preview() { + let app = App::new(); + let (text, _) = render_app_wide(&app); + assert!( + text.contains("preview"), + "preview block must still render when list is empty; got:\n{text}" + ); + } + + #[test] + fn dump_history_preview_buffer() { + const W: u16 = 120; + const H: u16 = 16; + + let mut app = App::new(); + app.all_rows = vec![ + make_row_full(RowSpec { + cmd: "cargo test --release", + ts: TEST_NOW - 60, + exit: 0, + project: "thoth", + directory: "/home/jose/thoth", + tags: r#"["build","ci"]"#, + workspace: Some("dev"), + session_id: "sess-abc123", + duration_ms: 4200, + }), + make_row_full(RowSpec { + cmd: "git status", + ts: TEST_NOW - 120, + exit: 1, + project: "thoth", + directory: "/home/jose/thoth", + tags: "[]", + workspace: None, + session_id: "sess-abc123", + duration_ms: 10, + }), + ]; + app.recompute(); + + let cols = default_cols(); + let backend = TestBackend::new(W, H); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..H { + let mut line = String::new(); + for col in 0..W { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line.trim_end().to_string()); + } + let text = lines.join("\n"); + println!("=== HISTORY WITH PREVIEW PANE (120x16) ==="); + println!("{text}"); + + assert!(text.contains("history"), "left pane title must appear"); + assert!(text.contains("preview"), "right pane title must appear"); + assert!( + text.contains("cargo test --release"), + "selected command must appear" + ); + } } From 1ec22892f9fbfe7f6f832fa8ce06f66fc4f7da2a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 19:18:54 -0600 Subject: [PATCH 133/151] style: rustfmt fuzzy.rs test formatting --- src/tui/fuzzy.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/tui/fuzzy.rs b/src/tui/fuzzy.rs index 9cd8de4..80f1f0a 100644 --- a/src/tui/fuzzy.rs +++ b/src/tui/fuzzy.rs @@ -125,10 +125,7 @@ mod tests { #[test] fn query_matches_project_not_in_command_or_tags() { - let items = vec![ - row_with_project("ls -la", "myproject"), - row("git status"), - ]; + let items = vec![row_with_project("ls -la", "myproject"), row("git status")]; let result = rank("myproject", &items); assert!( result.contains(&0), From 8977f6f6ef5d869fdc6632af5788b874e367b3cd Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 23:51:09 -0600 Subject: [PATCH 134/151] feat(tui): add parse_query DSL parser and fuzzy_query split (#70) --- src/tui/app.rs | 214 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 212 insertions(+), 2 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index 0f0e6bc..bbdce4c 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -10,6 +10,67 @@ use crate::workspaces::WorkspaceRow; const TUI_LIMIT: usize = 5000; const LABEL_MAX: usize = 40; +pub fn parse_query(input: &str, now: i64) -> (FilterState, String) { + let mut filters = FilterState::new(); + let mut free_words: Vec<&str> = Vec::new(); + + for token in input.split_whitespace() { + if let Some((key, value)) = token.split_once(':') { + if value.is_empty() { + free_words.push(token); + continue; + } + match key { + "project" | "p" => { + filters.project = Some(value.to_string()); + } + "tag" | "t" => { + let v = value.to_string(); + if !filters.tag.contains(&v) { + filters.tag.push(v); + } + } + "exit" | "e" => { + let parsed = match value.to_lowercase().as_str() { + "ok" => Some(ExitFilter::Ok), + "fail" => Some(ExitFilter::Fail), + "any" => Some(ExitFilter::Any), + _ => None, + }; + match parsed { + Some(ef) => filters.exit = Some(ef), + None => free_words.push(token), + } + } + "since" => { + if crate::search::parse_date(value, now).is_ok() { + filters.since = Some(value.to_string()); + } else { + free_words.push(token); + } + } + "until" => { + if crate::search::parse_date(value, now).is_ok() { + filters.until = Some(value.to_string()); + } else { + free_words.push(token); + } + } + "dur" | "duration" => { + filters.duration = Some(value.to_string()); + } + _ => { + free_words.push(token); + } + } + } else { + free_words.push(token); + } + } + + (filters, free_words.join(" ")) +} + #[derive(Clone, Copy, PartialEq, Eq, Debug, Default)] pub enum Tab { #[default] @@ -58,6 +119,7 @@ pub struct EditState { pub buffer: String, } +#[derive(PartialEq, Debug)] pub struct FilterState { pub project: Option, pub tag: Vec, @@ -65,6 +127,7 @@ pub struct FilterState { pub since: Option, pub until: Option, pub session: Option, + pub duration: Option, } impl Default for FilterState { @@ -82,6 +145,7 @@ impl FilterState { since: None, until: None, session: None, + duration: None, } } @@ -91,7 +155,7 @@ impl FilterState { project: self.project.clone(), tag: self.tag.clone(), exit: self.exit.clone(), - duration: None, + duration: self.duration.clone(), since: self.since.clone(), until: self.until.clone(), session: self.session.clone(), @@ -109,6 +173,7 @@ pub enum Action { pub struct App { pub query: String, + pub fuzzy_query: String, pub all_rows: Vec, pub filtered: Vec, pub selected: usize, @@ -116,6 +181,7 @@ pub struct App { pub action: Option, pub tab: Tab, pub mode: Mode, + pub show_help: bool, pub workspaces: Vec, pub ws_selected: usize, pub ws_commands: Vec, @@ -142,6 +208,7 @@ impl App { pub fn new() -> Self { Self { query: String::new(), + fuzzy_query: String::new(), all_rows: vec![], filtered: vec![], selected: 0, @@ -149,6 +216,7 @@ impl App { action: None, tab: Tab::History, mode: Mode::Insert, + show_help: false, workspaces: vec![], ws_selected: 0, ws_commands: vec![], @@ -321,13 +389,24 @@ impl App { } pub fn recompute(&mut self) { - self.filtered = fuzzy::rank(&self.query, &self.all_rows); + self.filtered = fuzzy::rank(&self.fuzzy_query, &self.all_rows); let max = self.filtered.len().saturating_sub(1); if self.selected > max { self.selected = max; } } + pub fn apply_query(&mut self, now: i64) { + let (filters, free) = parse_query(&self.query, now); + let changed = filters != self.filters; + self.filters = filters; + self.fuzzy_query = free; + if changed { + self.needs_history_reload = true; + } + self.recompute(); + } + pub fn selected_command(&self) -> Option<&str> { let idx = self.filtered.get(self.selected)?; self.all_rows.get(*idx).map(|r| r.command.as_str()) @@ -682,6 +761,7 @@ mod tests { let mut app = App::new(); app.reload(&conn, 9999).unwrap(); app.query = "docker".into(); + app.fuzzy_query = "docker".into(); app.recompute(); assert_eq!(app.filtered.len(), 1); assert_eq!(app.all_rows[app.filtered[0]].command, "docker run nginx"); @@ -1020,6 +1100,136 @@ mod tests { assert!(app.edit.is_none()); } + const PARSE_NOW: i64 = 1_700_000_000; + + #[test] + fn parse_query_project_and_free_text() { + let (fs, free) = parse_query("project:thoth cargo", PARSE_NOW); + assert_eq!(fs.project, Some("thoth".into())); + assert_eq!(free, "cargo"); + } + + #[test] + fn parse_query_short_project_alias() { + let (fs, free) = parse_query("p:web t:rust t:cli build", PARSE_NOW); + assert_eq!(fs.project, Some("web".into())); + assert!(fs.tag.contains(&"rust".to_string())); + assert!(fs.tag.contains(&"cli".to_string())); + assert_eq!(free, "build"); + } + + #[test] + fn parse_query_exit_fail() { + let (fs, free) = parse_query("exit:fail", PARSE_NOW); + assert_eq!(fs.exit, Some(ExitFilter::Fail)); + assert!(free.is_empty()); + } + + #[test] + fn parse_query_exit_ok() { + let (fs, free) = parse_query("exit:ok", PARSE_NOW); + assert_eq!(fs.exit, Some(ExitFilter::Ok)); + assert!(free.is_empty()); + } + + #[test] + fn parse_query_exit_bogus_becomes_free_text() { + let (fs, free) = parse_query("exit:bogus x", PARSE_NOW); + assert!(fs.exit.is_none()); + assert!(free.contains("exit:bogus")); + assert!(free.contains('x')); + } + + #[test] + fn parse_query_since_valid() { + let (fs, free) = parse_query("since:today ls", PARSE_NOW); + assert_eq!(fs.since, Some("today".into())); + assert_eq!(free, "ls"); + } + + #[test] + fn parse_query_since_invalid_becomes_free_text() { + let (fs, free) = parse_query("since:notadate ls", PARSE_NOW); + assert!(fs.since.is_none()); + assert!(free.contains("since:notadate")); + } + + #[test] + fn parse_query_duration() { + let (fs, free) = parse_query("dur:>30 ls", PARSE_NOW); + assert_eq!(fs.duration, Some(">30".into())); + assert_eq!(free, "ls"); + } + + #[test] + fn parse_query_empty_value_becomes_free_text() { + let (fs, free) = parse_query("project: ls", PARSE_NOW); + assert!(fs.project.is_none()); + assert!(free.contains("project:")); + assert!(free.contains("ls")); + } + + #[test] + fn parse_query_only_free_text() { + let input = "git status"; + let (fs, free) = parse_query(input, PARSE_NOW); + assert!(fs.project.is_none()); + assert!(fs.exit.is_none()); + assert!(fs.tag.is_empty()); + assert!(fs.since.is_none()); + assert!(fs.until.is_none()); + assert!(fs.duration.is_none()); + assert_eq!(free, input); + } + + #[test] + fn parse_query_combined_project_exit_free() { + let (fs, free) = parse_query("project:thoth exit:fail cargo", PARSE_NOW); + assert_eq!(fs.project, Some("thoth".into())); + assert_eq!(fs.exit, Some(ExitFilter::Fail)); + assert_eq!(free, "cargo"); + } + + #[test] + fn apply_query_sets_filters_and_needs_reload_when_filters_change() { + let mut app = App::new(); + app.query = "project:myapp".into(); + app.apply_query(PARSE_NOW); + assert_eq!(app.filters.project, Some("myapp".into())); + assert!(app.needs_history_reload); + assert!(app.fuzzy_query.is_empty()); + } + + #[test] + fn apply_query_does_not_set_needs_reload_when_only_free_text_changes() { + let mut app = App::new(); + app.query = "cargo".into(); + app.apply_query(PARSE_NOW); + assert!(!app.needs_history_reload); + assert_eq!(app.fuzzy_query, "cargo"); + } + + #[test] + fn apply_query_recompute_uses_fuzzy_query() { + let conn = make_conn(); + seed(&conn, "docker run nginx", 1000); + seed(&conn, "ls -la", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.query = "docker".into(); + app.apply_query(PARSE_NOW); + assert_eq!(app.filtered.len(), 1); + assert_eq!(app.all_rows[app.filtered[0]].command, "docker run nginx"); + } + + #[test] + fn to_search_args_passes_duration_through() { + let mut fs = FilterState::new(); + fs.duration = Some(">30".into()); + let args = fs.to_search_args(); + assert_eq!(args.duration, Some(">30".into())); + } + #[test] fn edit_commit_sets_pending_edit_and_clears_edit() { let mut app = App::new(); From e7da9171e09bef47b899d9228e0118af7f81092a Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 23:51:13 -0600 Subject: [PATCH 135/151] feat(tui): wire apply_query into insert handler and thread now param (#70) --- src/tui/event.rs | 227 ++++++++++++++++++++++++++++++----------------- src/tui/mod.rs | 2 +- 2 files changed, 146 insertions(+), 83 deletions(-) diff --git a/src/tui/event.rs b/src/tui/event.rs index 1936114..90d4825 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -59,13 +59,17 @@ pub enum Outcome { Exit, } -pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { +pub fn handle_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome { if app.confirm.is_some() { return handle_confirm_key(key, app); } if app.edit.is_some() { return handle_edit_key(key, app); } + if app.show_help { + app.show_help = false; + return Outcome::Continue; + } match key.code { KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { @@ -84,19 +88,19 @@ pub fn handle_key(key: KeyEvent, app: &mut App) -> Outcome { } match app.tab { - Tab::History => handle_history_key(key, app), + Tab::History => handle_history_key(key, app, now), Tab::Workspaces => handle_ws_key(key, app), } } -fn handle_history_key(key: KeyEvent, app: &mut App) -> Outcome { +fn handle_history_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome { match app.mode { - Mode::Insert => handle_history_insert_key(key, app), + Mode::Insert => handle_history_insert_key(key, app, now), Mode::Normal => handle_history_normal_key(key, app), } } -fn handle_history_insert_key(key: KeyEvent, app: &mut App) -> Outcome { +fn handle_history_insert_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome { match key.code { KeyCode::Esc => { app.enter_normal_mode(); @@ -132,12 +136,12 @@ fn handle_history_insert_key(key: KeyEvent, app: &mut App) -> Outcome { } KeyCode::Backspace => { app.query.pop(); - app.recompute(); + app.apply_query(now); Outcome::Continue } KeyCode::Char(c) if !key.modifiers.contains(KeyModifiers::CONTROL) => { app.query.push(c); - app.recompute(); + app.apply_query(now); Outcome::Continue } _ => Outcome::Continue, @@ -146,6 +150,10 @@ fn handle_history_insert_key(key: KeyEvent, app: &mut App) -> Outcome { fn handle_history_normal_key(key: KeyEvent, app: &mut App) -> Outcome { match key.code { + KeyCode::Char('?') => { + app.show_help = true; + Outcome::Continue + } KeyCode::Char('i') | KeyCode::Char('/') => { app.enter_insert_mode(); Outcome::Continue @@ -253,6 +261,8 @@ mod tests { use crate::workspaces::WorkspaceRow; use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers}; + const NOW: i64 = 1_700_000_000; + fn key(code: KeyCode) -> KeyEvent { KeyEvent { code, @@ -344,7 +354,7 @@ mod tests { #[test] fn ctrl_c_sets_no_action_and_exits() { let mut app = app_with_rows(); - let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app); + let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app, NOW); assert!(app.action.is_none()); assert!(matches!(outcome, Outcome::Exit)); } @@ -352,7 +362,7 @@ mod tests { #[test] fn history_insert_enter_sets_run_action_and_exits() { let mut app = app_with_rows(); - let outcome = handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); assert!(matches!(&app.action, Some(Action::Run(cmd)) if cmd == "git status")); } @@ -360,7 +370,7 @@ mod tests { #[test] fn history_insert_tab_sets_edit_action_and_exits() { let mut app = app_with_rows(); - let outcome = handle_key(key(KeyCode::Tab), &mut app); + let outcome = handle_key(key(KeyCode::Tab), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); assert!(matches!(&app.action, Some(Action::Edit(cmd)) if cmd == "git status")); } @@ -369,7 +379,7 @@ mod tests { fn history_insert_esc_enters_normal_mode_no_exit() { let mut app = app_with_rows(); assert_eq!(app.mode, Mode::Insert); - let outcome = handle_key(key(KeyCode::Esc), &mut app); + let outcome = handle_key(key(KeyCode::Esc), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert_eq!(app.mode, Mode::Normal); } @@ -378,7 +388,7 @@ mod tests { fn history_normal_i_enters_insert_mode() { let mut app = app_with_rows(); app.enter_normal_mode(); - let outcome = handle_key(key(KeyCode::Char('i')), &mut app); + let outcome = handle_key(key(KeyCode::Char('i')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert_eq!(app.mode, Mode::Insert); } @@ -387,7 +397,7 @@ mod tests { fn history_normal_slash_enters_insert_mode() { let mut app = app_with_rows(); app.enter_normal_mode(); - let outcome = handle_key(key(KeyCode::Char('/')), &mut app); + let outcome = handle_key(key(KeyCode::Char('/')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert_eq!(app.mode, Mode::Insert); } @@ -397,7 +407,7 @@ mod tests { let mut app = app_with_rows(); app.enter_normal_mode(); app.selected = 1; - handle_key(key(KeyCode::Char('j')), &mut app); + handle_key(key(KeyCode::Char('j')), &mut app, NOW); assert_eq!(app.selected, 0); } @@ -406,7 +416,7 @@ mod tests { let mut app = app_with_rows(); app.enter_normal_mode(); app.selected = 0; - handle_key(key(KeyCode::Char('k')), &mut app); + handle_key(key(KeyCode::Char('k')), &mut app, NOW); assert_eq!(app.selected, 1); } @@ -414,7 +424,7 @@ mod tests { fn history_normal_d_opens_delete_confirm() { let mut app = app_with_rows(); app.enter_normal_mode(); - let outcome = handle_key(key(KeyCode::Char('d')), &mut app); + let outcome = handle_key(key(KeyCode::Char('d')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!(app.confirm.is_some()); assert!(matches!( @@ -427,7 +437,7 @@ mod tests { fn history_normal_enter_runs_and_exits() { let mut app = app_with_rows(); app.enter_normal_mode(); - let outcome = handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); assert!(matches!(&app.action, Some(Action::Run(_)))); } @@ -436,7 +446,7 @@ mod tests { fn history_normal_q_exits() { let mut app = app_with_rows(); app.enter_normal_mode(); - let outcome = handle_key(key(KeyCode::Char('q')), &mut app); + let outcome = handle_key(key(KeyCode::Char('q')), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); } @@ -444,7 +454,7 @@ mod tests { fn history_normal_esc_exits() { let mut app = app_with_rows(); app.enter_normal_mode(); - let outcome = handle_key(key(KeyCode::Esc), &mut app); + let outcome = handle_key(key(KeyCode::Esc), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); } @@ -452,7 +462,7 @@ mod tests { fn history_insert_typing_still_filters_regression() { let mut app = app_with_rows(); assert_eq!(app.mode, Mode::Insert); - handle_key(key(KeyCode::Char('g')), &mut app); + handle_key(key(KeyCode::Char('g')), &mut app, NOW); assert_eq!(app.query, "g"); } @@ -460,7 +470,7 @@ mod tests { fn history_insert_up_arrow_moves_to_older_command() { let mut app = app_with_rows(); app.selected = 0; - handle_key(key(KeyCode::Up), &mut app); + handle_key(key(KeyCode::Up), &mut app, NOW); assert_eq!(app.selected, 1); } @@ -468,7 +478,7 @@ mod tests { fn history_insert_down_arrow_moves_to_newer_command() { let mut app = app_with_rows(); app.selected = 1; - handle_key(key(KeyCode::Down), &mut app); + handle_key(key(KeyCode::Down), &mut app, NOW); assert_eq!(app.selected, 0); } @@ -476,7 +486,7 @@ mod tests { fn history_ctrl_p_moves_up() { let mut app = app_with_rows(); app.selected = 0; - handle_key(ctrl(KeyCode::Char('p')), &mut app); + handle_key(ctrl(KeyCode::Char('p')), &mut app, NOW); assert_eq!(app.selected, 1); } @@ -484,7 +494,7 @@ mod tests { fn history_ctrl_n_moves_down() { let mut app = app_with_rows(); app.selected = 1; - handle_key(ctrl(KeyCode::Char('n')), &mut app); + handle_key(ctrl(KeyCode::Char('n')), &mut app, NOW); assert_eq!(app.selected, 0); } @@ -493,23 +503,23 @@ mod tests { let mut app = app_with_rows(); app.query = String::from("git"); app.recompute(); - handle_key(key(KeyCode::Backspace), &mut app); + handle_key(key(KeyCode::Backspace), &mut app, NOW); assert_eq!(app.query, "gi"); } #[test] fn backspace_on_empty_query_is_noop() { let mut app = app_with_rows(); - handle_key(key(KeyCode::Backspace), &mut app); + handle_key(key(KeyCode::Backspace), &mut app, NOW); assert_eq!(app.query, ""); } #[test] fn typing_filters_results() { let mut app = app_with_rows(); - handle_key(key(KeyCode::Char('g')), &mut app); - handle_key(key(KeyCode::Char('i')), &mut app); - handle_key(key(KeyCode::Char('t')), &mut app); + handle_key(key(KeyCode::Char('g')), &mut app, NOW); + handle_key(key(KeyCode::Char('i')), &mut app, NOW); + handle_key(key(KeyCode::Char('t')), &mut app, NOW); assert!(!app.filtered.is_empty()); assert_eq!(app.all_rows[app.filtered[0]].command, "git status"); } @@ -517,7 +527,7 @@ mod tests { #[test] fn enter_on_empty_list_exits_without_action() { let mut app = App::new(); - let outcome = handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); assert!(app.action.is_none()); } @@ -526,7 +536,7 @@ mod tests { fn up_at_oldest_is_noop() { let mut app = app_with_rows(); app.selected = 1; - handle_key(key(KeyCode::Up), &mut app); + handle_key(key(KeyCode::Up), &mut app, NOW); assert_eq!(app.selected, 1, "Up at oldest row must not go further"); } @@ -534,7 +544,7 @@ mod tests { fn down_at_newest_is_noop() { let mut app = app_with_rows(); app.selected = 0; - handle_key(key(KeyCode::Down), &mut app); + handle_key(key(KeyCode::Down), &mut app, NOW); assert_eq!(app.selected, 0, "Down at newest row must not go further"); } @@ -542,7 +552,7 @@ mod tests { fn left_switches_to_history_tab() { let mut app = App::new(); app.tab = Tab::Workspaces; - handle_key(key(KeyCode::Left), &mut app); + handle_key(key(KeyCode::Left), &mut app, NOW); assert_eq!(app.tab, Tab::History); } @@ -555,7 +565,7 @@ mod tests { first_ts: 1000, last_ts: 2000, }]; - handle_key(key(KeyCode::Right), &mut app); + handle_key(key(KeyCode::Right), &mut app, NOW); assert_eq!(app.tab, Tab::Workspaces); } @@ -569,7 +579,7 @@ mod tests { first_ts: 1000, last_ts: 2000, }]; - handle_key(key(KeyCode::Right), &mut app); + handle_key(key(KeyCode::Right), &mut app, NOW); assert_eq!(app.tab, Tab::Workspaces); } @@ -577,7 +587,7 @@ mod tests { fn left_on_history_stays_history() { let mut app = App::new(); assert_eq!(app.tab, Tab::History); - handle_key(key(KeyCode::Left), &mut app); + handle_key(key(KeyCode::Left), &mut app, NOW); assert_eq!(app.tab, Tab::History); } @@ -586,7 +596,7 @@ mod tests { let mut app = app_with_workspaces(); app.ws_selected = 1; let history_selected_before = app.selected; - handle_key(key(KeyCode::Up), &mut app); + handle_key(key(KeyCode::Up), &mut app, NOW); assert_eq!( app.selected, history_selected_before, "history selected must not change" @@ -598,14 +608,14 @@ mod tests { fn ws_down_increases_ws_selected() { let mut app = app_with_workspaces(); app.ws_selected = 0; - handle_key(key(KeyCode::Down), &mut app); + handle_key(key(KeyCode::Down), &mut app, NOW); assert_eq!(app.ws_selected, 1); } #[test] fn ws_enter_opens_confirm_modal() { let mut app = app_with_workspaces_and_commands(); - let outcome = handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!(app.confirm.is_some(), "Enter must open confirm modal"); } @@ -613,7 +623,7 @@ mod tests { #[test] fn ws_char_does_not_modify_query() { let mut app = app_with_workspaces(); - handle_key(key(KeyCode::Char('g')), &mut app); + handle_key(key(KeyCode::Char('g')), &mut app, NOW); assert_eq!(app.query, "", "typing in Workspaces must not modify query"); } @@ -621,7 +631,7 @@ mod tests { fn ws_backspace_does_not_modify_query() { let mut app = app_with_workspaces(); app.query = "existing".into(); - handle_key(key(KeyCode::Backspace), &mut app); + handle_key(key(KeyCode::Backspace), &mut app, NOW); assert_eq!( app.query, "existing", "backspace in Workspaces must not modify query" @@ -632,7 +642,7 @@ mod tests { fn history_enter_still_exits_with_run() { let mut app = app_with_rows(); assert_eq!(app.tab, Tab::History); - let outcome = handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); assert!(matches!(&app.action, Some(Action::Run(_)))); } @@ -641,16 +651,16 @@ mod tests { fn history_char_still_filters() { let mut app = app_with_rows(); assert_eq!(app.tab, Tab::History); - handle_key(key(KeyCode::Char('g')), &mut app); + handle_key(key(KeyCode::Char('g')), &mut app, NOW); assert_eq!(app.query, "g"); } #[test] fn confirm_replay_y_sets_replay_workspace_clears_confirm_and_exits() { let mut app = app_with_workspaces_and_commands(); - handle_key(key(KeyCode::Enter), &mut app); + handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(app.confirm.is_some()); - let outcome = handle_key(key(KeyCode::Char('y')), &mut app); + let outcome = handle_key(key(KeyCode::Char('y')), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); assert!(app.confirm.is_none(), "confirm must be cleared after y"); assert_eq!(app.replay_workspace, Some("ws-new".into())); @@ -659,8 +669,8 @@ mod tests { #[test] fn confirm_replay_n_cancels_and_continues() { let mut app = app_with_workspaces_and_commands(); - handle_key(key(KeyCode::Enter), &mut app); - let outcome = handle_key(key(KeyCode::Char('n')), &mut app); + handle_key(key(KeyCode::Enter), &mut app, NOW); + let outcome = handle_key(key(KeyCode::Char('n')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!(app.confirm.is_none()); assert!(app.replay_workspace.is_none()); @@ -669,8 +679,8 @@ mod tests { #[test] fn confirm_replay_esc_cancels_and_continues() { let mut app = app_with_workspaces_and_commands(); - handle_key(key(KeyCode::Enter), &mut app); - let outcome = handle_key(key(KeyCode::Esc), &mut app); + handle_key(key(KeyCode::Enter), &mut app, NOW); + let outcome = handle_key(key(KeyCode::Esc), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!(app.confirm.is_none()); } @@ -678,9 +688,9 @@ mod tests { #[test] fn ctrl_c_exits_even_with_confirm_open() { let mut app = app_with_workspaces_and_commands(); - handle_key(key(KeyCode::Enter), &mut app); + handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(app.confirm.is_some()); - let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app); + let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app, NOW); assert!( matches!(outcome, Outcome::Exit), "Ctrl-C must exit from any state" @@ -692,14 +702,14 @@ mod tests { fn delete_confirm_y_sets_pending_delete_continue_not_exit() { let mut app = app_with_rows(); app.enter_normal_mode(); - handle_key(key(KeyCode::Char('d')), &mut app); + handle_key(key(KeyCode::Char('d')), &mut app, NOW); assert!(app.confirm.is_some()); let expected_id = if let Some(Confirm::Delete(d)) = app.confirm.as_ref() { d.id } else { panic!("expected Delete confirm"); }; - let outcome = handle_key(key(KeyCode::Char('y')), &mut app); + let outcome = handle_key(key(KeyCode::Char('y')), &mut app, NOW); assert!( matches!(outcome, Outcome::Continue), "delete y must Continue, not Exit" @@ -714,8 +724,8 @@ mod tests { fn delete_confirm_n_cancels_and_continues() { let mut app = app_with_rows(); app.enter_normal_mode(); - handle_key(key(KeyCode::Char('d')), &mut app); - let outcome = handle_key(key(KeyCode::Char('n')), &mut app); + handle_key(key(KeyCode::Char('d')), &mut app, NOW); + let outcome = handle_key(key(KeyCode::Char('n')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!(app.confirm.is_none()); assert!(app.pending_delete.is_none()); @@ -725,9 +735,9 @@ mod tests { fn ws_tab_toggles_pane() { let mut app = app_with_workspaces(); assert_eq!(app.ws_pane, WsPane::List); - handle_key(key(KeyCode::Tab), &mut app); + handle_key(key(KeyCode::Tab), &mut app, NOW); assert_eq!(app.ws_pane, WsPane::Commands); - handle_key(key(KeyCode::Tab), &mut app); + handle_key(key(KeyCode::Tab), &mut app, NOW); assert_eq!(app.ws_pane, WsPane::List); } @@ -737,7 +747,7 @@ mod tests { app.ws_pane = WsPane::Commands; app.ws_cmd_selected = 0; let expected_id = app.ws_commands[0].id; - let outcome = handle_key(key(KeyCode::Char('d')), &mut app); + let outcome = handle_key(key(KeyCode::Char('d')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!( matches!(app.confirm.as_ref(), Some(Confirm::Delete(d)) if d.id == expected_id && matches!(d.origin, DeleteOrigin::Workspace)) @@ -747,16 +757,16 @@ mod tests { #[test] fn ws_esc_exits() { let mut app = app_with_workspaces(); - let outcome = handle_key(key(KeyCode::Esc), &mut app); + let outcome = handle_key(key(KeyCode::Esc), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); } #[test] fn confirm_other_key_does_not_leak_through() { let mut app = app_with_workspaces_and_commands(); - handle_key(key(KeyCode::Enter), &mut app); + handle_key(key(KeyCode::Enter), &mut app, NOW); let query_before = app.query.clone(); - let outcome = handle_key(key(KeyCode::Char('g')), &mut app); + let outcome = handle_key(key(KeyCode::Char('g')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert_eq!( app.query, query_before, @@ -771,9 +781,9 @@ mod tests { #[test] fn confirm_left_does_not_change_tab() { let mut app = app_with_workspaces_and_commands(); - handle_key(key(KeyCode::Enter), &mut app); + handle_key(key(KeyCode::Enter), &mut app, NOW); let tab_before = app.tab; - handle_key(key(KeyCode::Left), &mut app); + handle_key(key(KeyCode::Left), &mut app, NOW); assert_eq!( app.tab, tab_before, "Left must not change tab while confirm is open" @@ -784,7 +794,7 @@ mod tests { fn history_enter_still_exits_with_run_regression() { let mut app = app_with_rows(); assert_eq!(app.tab, Tab::History); - let outcome = handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(matches!(outcome, Outcome::Exit)); assert!(matches!(&app.action, Some(Action::Run(_)))); } @@ -792,7 +802,7 @@ mod tests { #[test] fn ws_enter_is_continue_not_exit() { let mut app = app_with_workspaces(); - let outcome = handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); assert!( matches!(outcome, Outcome::Continue), "Workspaces Enter must be Continue" @@ -802,7 +812,7 @@ mod tests { #[test] fn ws_enter_does_not_change_tab_or_filters() { let mut app = app_with_workspaces(); - handle_key(key(KeyCode::Enter), &mut app); + handle_key(key(KeyCode::Enter), &mut app, NOW); assert_eq!(app.tab, Tab::Workspaces, "Enter must not change tab"); assert!( app.filters.session.is_none(), @@ -813,7 +823,7 @@ mod tests { #[test] fn replay_confirm_is_still_replay_type() { let mut app = app_with_workspaces_and_commands(); - handle_key(key(KeyCode::Enter), &mut app); + handle_key(key(KeyCode::Enter), &mut app, NOW); assert!( matches!(app.confirm.as_ref(), Some(Confirm::Replay(_))), "Enter in Workspaces List must open Replay confirm, not Delete" @@ -824,7 +834,7 @@ mod tests { fn history_normal_e_opens_edit() { let mut app = app_with_rows(); app.enter_normal_mode(); - let outcome = handle_key(key(KeyCode::Char('e')), &mut app); + let outcome = handle_key(key(KeyCode::Char('e')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!( app.edit.is_some(), @@ -836,7 +846,7 @@ mod tests { fn ws_commands_e_opens_edit() { let mut app = app_with_workspaces_and_commands(); app.ws_pane = WsPane::Commands; - let outcome = handle_key(key(KeyCode::Char('e')), &mut app); + let outcome = handle_key(key(KeyCode::Char('e')), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!(app.edit.is_some(), "e must open edit modal in Ws Commands"); } @@ -845,10 +855,10 @@ mod tests { fn edit_char_appends_to_buffer_not_query() { let mut app = app_with_rows(); app.enter_normal_mode(); - handle_key(key(KeyCode::Char('e')), &mut app); + handle_key(key(KeyCode::Char('e')), &mut app, NOW); assert!(app.edit.is_some()); let query_before = app.query.clone(); - handle_key(key(KeyCode::Char('x')), &mut app); + handle_key(key(KeyCode::Char('x')), &mut app, NOW); assert_eq!( app.query, query_before, "typing while editing must not change query" @@ -863,9 +873,9 @@ mod tests { fn edit_backspace_removes_from_buffer() { let mut app = app_with_rows(); app.enter_normal_mode(); - handle_key(key(KeyCode::Char('e')), &mut app); + handle_key(key(KeyCode::Char('e')), &mut app, NOW); let original_len = app.edit.as_ref().unwrap().buffer.len(); - handle_key(key(KeyCode::Backspace), &mut app); + handle_key(key(KeyCode::Backspace), &mut app, NOW); assert_eq!( app.edit.as_ref().unwrap().buffer.len(), original_len.saturating_sub(1) @@ -876,9 +886,9 @@ mod tests { fn edit_enter_commits_and_sets_pending_edit() { let mut app = app_with_rows(); app.enter_normal_mode(); - handle_key(key(KeyCode::Char('e')), &mut app); + handle_key(key(KeyCode::Char('e')), &mut app, NOW); assert!(app.edit.is_some()); - let outcome = handle_key(key(KeyCode::Enter), &mut app); + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!(app.edit.is_none(), "edit must be cleared after Enter"); assert!( @@ -891,9 +901,9 @@ mod tests { fn edit_esc_cancels() { let mut app = app_with_rows(); app.enter_normal_mode(); - handle_key(key(KeyCode::Char('e')), &mut app); + handle_key(key(KeyCode::Char('e')), &mut app, NOW); assert!(app.edit.is_some()); - let outcome = handle_key(key(KeyCode::Esc), &mut app); + let outcome = handle_key(key(KeyCode::Esc), &mut app, NOW); assert!(matches!(outcome, Outcome::Continue)); assert!(app.edit.is_none(), "Esc must cancel edit"); assert!(app.pending_edit.is_none()); @@ -903,9 +913,9 @@ mod tests { fn ctrl_c_exits_even_while_editing() { let mut app = app_with_rows(); app.enter_normal_mode(); - handle_key(key(KeyCode::Char('e')), &mut app); + handle_key(key(KeyCode::Char('e')), &mut app, NOW); assert!(app.edit.is_some()); - let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app); + let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app, NOW); assert!( matches!(outcome, Outcome::Exit), "Ctrl-C must exit from edit mode" @@ -916,14 +926,67 @@ mod tests { fn left_right_do_not_switch_tabs_while_editing() { let mut app = app_with_rows(); app.enter_normal_mode(); - handle_key(key(KeyCode::Char('e')), &mut app); + handle_key(key(KeyCode::Char('e')), &mut app, NOW); assert!(app.edit.is_some()); let tab_before = app.tab; - handle_key(key(KeyCode::Left), &mut app); - handle_key(key(KeyCode::Right), &mut app); + handle_key(key(KeyCode::Left), &mut app, NOW); + handle_key(key(KeyCode::Right), &mut app, NOW); assert_eq!( app.tab, tab_before, "Left/Right must not switch tab while editing" ); } + + #[test] + fn typing_dsl_filter_updates_filters_and_fuzzy_query() { + let mut app = app_with_rows(); + for c in "project:thoth ".chars() { + handle_key(key(KeyCode::Char(c)), &mut app, NOW); + } + for c in "cargo".chars() { + handle_key(key(KeyCode::Char(c)), &mut app, NOW); + } + assert_eq!(app.filters.project, Some("thoth".into())); + assert_eq!(app.fuzzy_query, "cargo"); + assert_eq!(app.query, "project:thoth cargo"); + } + + #[test] + fn backspace_updates_apply_query() { + let mut app = app_with_rows(); + for c in "project:x".chars() { + handle_key(key(KeyCode::Char(c)), &mut app, NOW); + } + handle_key(key(KeyCode::Backspace), &mut app, NOW); + assert_eq!(app.query, "project:"); + } + + #[test] + fn normal_question_mark_sets_show_help() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Char('?')), &mut app, NOW); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.show_help); + } + + #[test] + fn any_key_clears_show_help() { + let mut app = app_with_rows(); + app.show_help = true; + let outcome = handle_key(key(KeyCode::Char('j')), &mut app, NOW); + assert!(matches!(outcome, Outcome::Continue)); + assert!(!app.show_help); + } + + #[test] + fn plain_text_search_still_works() { + let mut app = app_with_rows(); + for c in "git".chars() { + handle_key(key(KeyCode::Char(c)), &mut app, NOW); + } + assert_eq!(app.fuzzy_query, "git"); + assert_eq!(app.query, "git"); + assert!(!app.filtered.is_empty()); + } } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 062cd0b..b6f5c6c 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -94,7 +94,7 @@ pub fn run( if let Event::Key(key) = ct_event::read().map_err(|e| ThothError::Tui(format!("event read failed: {e}")))? { - match handle_key(key, &mut app) { + match handle_key(key, &mut app, now) { Outcome::Exit => break, Outcome::Continue => { if let Some((id, new_cmd)) = app.pending_edit.take() { From 12fdd2f6958d21ca632dd76a141ea816106b9670 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sat, 27 Jun 2026 23:51:15 -0600 Subject: [PATCH 136/151] feat(tui): add dur chip, help overlay, and ? hint in controls (#70) --- src/tui/render.rs | 168 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 153 insertions(+), 15 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index dea2e82..df955b3 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -14,6 +14,8 @@ use crate::workspaces::WorkspaceRow; const EDIT_MODAL_W: u16 = 60; const EDIT_MODAL_H: u16 = 5; +const HELP_MODAL_W: u16 = 62; +const HELP_MODAL_H: u16 = 8; pub fn display_command(raw: &str) -> String { let collapsed: String = raw @@ -104,6 +106,9 @@ fn filter_chips(app: &App) -> String { if let Some(ref s) = app.filters.session { parts.push(format!("[session:{}]", short_id(s))); } + if let Some(ref d) = app.filters.duration { + parts.push(format!("[dur:{d}]")); + } parts.join(" ") } @@ -668,6 +673,9 @@ pub fn draw_with_cmd_state( if let Some(ref es) = app.edit { render_edit_modal(frame, middle_area, es, theme); } + if app.show_help { + render_help_modal(frame, middle_area, theme); + } let query_text = format!("> {}", app.query); frame.render_widget(Paragraph::new(query_text), query_area); @@ -718,6 +726,9 @@ pub fn draw_with_cmd_state( Span::styled("i", accent_style), Span::styled(" search", dim_style), Span::styled(" · ", dim_style), + Span::styled("?", accent_style), + Span::styled(" help", dim_style), + Span::styled(" · ", dim_style), Span::styled("q", accent_style), Span::styled(" quit", dim_style), ]), @@ -848,6 +859,65 @@ fn render_confirm_modal(frame: &mut Frame, area: Rect, app: &crate::tui::app::Ap } } +fn render_help_modal(frame: &mut Frame, area: Rect, theme: &Theme) { + let dim_style = Style::default().fg(theme.dim); + let accent_style = Style::default() + .fg(theme.accent) + .add_modifier(Modifier::BOLD); + let kw_style = Style::default().fg(theme.command); + + let modal_area = centered_rect(HELP_MODAL_W, HELP_MODAL_H, area); + frame.render_widget(Clear, modal_area); + + let block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(Style::default().fg(theme.accent)) + .title(Span::styled( + " Search filters (type in the box) ", + accent_style, + )); + + let inner = block.inner(modal_area); + frame.render_widget(block, modal_area); + + let lines = vec![ + Line::from(vec![ + Span::styled(" project:NAME", kw_style), + Span::styled(" p:NAME", dim_style), + Span::styled(" tag:NAME", kw_style), + Span::styled(" t:NAME", dim_style), + ]), + Line::from(vec![ + Span::styled(" exit:ok|fail", kw_style), + Span::styled(" since:DATE", dim_style), + Span::styled(" until:DATE", dim_style), + ]), + Line::from(vec![ + Span::styled(" dur:>30", kw_style), + Span::styled(" (seconds, use > or <)", dim_style), + ]), + Line::from(vec![Span::raw("")]), + Line::from(vec![ + Span::styled(" esc", accent_style), + Span::styled(" normal", dim_style), + Span::styled(" i", accent_style), + Span::styled(" search", dim_style), + Span::styled(" j/k", accent_style), + Span::styled(" move", dim_style), + Span::styled(" d", accent_style), + Span::styled(" delete", dim_style), + Span::styled(" e", accent_style), + Span::styled(" edit", dim_style), + Span::styled(" ?", accent_style), + Span::styled(" help", dim_style), + ]), + Line::from(vec![Span::styled(" Press any key to close", dim_style)]), + ]; + + frame.render_widget(Paragraph::new(lines), inner); +} + fn render_edit_modal( frame: &mut Frame, area: Rect, @@ -1481,7 +1551,7 @@ mod tests { state: KeyEventState::NONE, }; for _ in 0..3 { - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); } let (after_up3, _) = render_app_small(&app, 80, 12); @@ -1616,6 +1686,7 @@ mod tests { state: KeyEventState::NONE, }, &mut app, + TEST_NOW, ); assert_eq!( app.selected_command(), @@ -1638,6 +1709,7 @@ mod tests { state: KeyEventState::NONE, }, &mut app, + TEST_NOW, ); assert_eq!(app.selected_command(), Some("middle-cmd")); @@ -1649,6 +1721,7 @@ mod tests { state: KeyEventState::NONE, }, &mut app, + TEST_NOW, ); assert_eq!( app.selected_command(), @@ -1670,7 +1743,7 @@ mod tests { state: KeyEventState::NONE, }; for _ in 0..10 { - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); } assert_eq!( app.selected_command(), @@ -1692,7 +1765,7 @@ mod tests { state: KeyEventState::NONE, }; for _ in 0..10 { - handle_key(down_key, &mut app); + handle_key(down_key, &mut app, TEST_NOW); } assert_eq!( app.selected_command(), @@ -1721,7 +1794,7 @@ mod tests { state: KeyEventState::NONE, }; for _ in 0..15 { - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); } let (_, buf) = render_app_small(&app, W, H); @@ -1764,20 +1837,20 @@ mod tests { let (s0, _) = render_app_small_with_state(&app, W, H, &mut ts); println!("=== FRAME 0 (default, newest=nav-00 at bottom, highlighted) ===\n{s0}"); - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); let (s1, _) = render_app_small_with_state(&app, W, H, &mut ts); println!("\n=== FRAME 1 (Up x1 - cursor moves UP within viewport, no scroll) ===\n{s1}"); - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); let (s2, _) = render_app_small_with_state(&app, W, H, &mut ts); println!("\n=== FRAME 2 (Up x2 - cursor moves UP within viewport, no scroll) ===\n{s2}"); - handle_key(up_key, &mut app); - handle_key(up_key, &mut app); - handle_key(up_key, &mut app); - handle_key(up_key, &mut app); - handle_key(up_key, &mut app); - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); + handle_key(up_key, &mut app, TEST_NOW); + handle_key(up_key, &mut app, TEST_NOW); + handle_key(up_key, &mut app, TEST_NOW); + handle_key(up_key, &mut app, TEST_NOW); + handle_key(up_key, &mut app, TEST_NOW); let (s8, _) = render_app_small_with_state(&app, W, H, &mut ts); println!("\n=== FRAME 8 (Up x8 - content has scrolled, older commands visible) ===\n{s8}"); } @@ -1849,12 +1922,12 @@ mod tests { let visible0 = visible_commands(&buf0, W, H); let highlighted0 = highlighted_command(&buf0, W, H); - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); let (_, buf1) = render_app_small_with_state(&app, W, H, &mut ts); let visible1 = visible_commands(&buf1, W, H); let highlighted1 = highlighted_command(&buf1, W, H); - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); let (_, buf2) = render_app_small_with_state(&app, W, H, &mut ts); let visible2 = visible_commands(&buf2, W, H); let highlighted2 = highlighted_command(&buf2, W, H); @@ -1918,7 +1991,7 @@ mod tests { let visible_start = visible_commands(&buf_start, W, H); for _ in 0..8 { - handle_key(up_key, &mut app); + handle_key(up_key, &mut app, TEST_NOW); render_app_small_with_state(&app, W, H, &mut ts); } @@ -2617,6 +2690,7 @@ mod tests { state: KeyEventState::NONE, }, &mut app, + TEST_NOW, ); let (text_after, _) = render_app_wide(&app); @@ -2721,4 +2795,68 @@ mod tests { "selected command must appear" ); } + + #[test] + fn filter_chips_shows_dur_chip_when_duration_set() { + let mut app = app_with_rows(); + app.filters.duration = Some(">30".into()); + let text = render_app(&app); + assert!( + text.contains("[dur:>30]"), + "status bar must show dur chip; got:\n{text}" + ); + } + + #[test] + fn filter_chips_shows_project_and_exit_fail_when_both_set() { + let mut app = app_with_rows(); + app.filters.project = Some("myproj".into()); + app.filters.exit = Some(crate::search::ExitFilter::Fail); + let text = render_app(&app); + assert!( + text.contains("[project:myproj]"), + "must show project chip; got:\n{text}" + ); + assert!( + text.contains("[exit:Fail]"), + "must show exit chip; got:\n{text}" + ); + } + + #[test] + fn help_overlay_renders_when_show_help_true() { + let mut app = app_with_rows(); + app.show_help = true; + let text = render_app(&app); + assert!( + text.contains("project:NAME") || text.contains("project"), + "help overlay must show filter fields; got:\n{text}" + ); + assert!( + text.contains("exit:ok|fail") || text.contains("exit"), + "help overlay must mention exit filter; got:\n{text}" + ); + } + + #[test] + fn help_overlay_not_shown_when_show_help_false() { + let mut app = app_with_rows(); + app.show_help = false; + let text = render_app(&app); + assert!( + !text.contains("Press any key to close"), + "help close hint must not appear when show_help is false; got:\n{text}" + ); + } + + #[test] + fn controls_normal_shows_help_hint() { + let mut app = app_with_rows(); + app.mode = crate::tui::app::Mode::Normal; + let text = render_app(&app); + assert!( + text.contains("help"), + "Normal mode controls must show 'help' hint; got:\n{text}" + ); + } } From dc0e3f87d0eb69927bbc098f3f816419e73c04e5 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 00:43:49 -0600 Subject: [PATCH 137/151] fix(search): match project case-insensitively as a substring, tags case-insensitively --- src/export.rs | 22 ++++++++++++++-------- src/search.rs | 22 ++++++++++++++-------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/export.rs b/src/export.rs index d998d0b..08fb6a5 100644 --- a/src/export.rs +++ b/src/export.rs @@ -37,8 +37,8 @@ pub fn build_query( let mut params: Vec> = Vec::new(); if let Some(ref p) = args.project { - fragments.push("c.project = ?".to_string()); - params.push(Box::new(p.clone())); + fragments.push("c.project LIKE ?".to_string()); + params.push(Box::new(format!("%{p}%"))); } match &args.exit { @@ -63,7 +63,9 @@ pub fn build_query( } for tag in &args.tag { - fragments.push("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)".to_string()); + fragments.push( + "EXISTS(SELECT 1 FROM json_each(c.tags) WHERE LOWER(value) = LOWER(?))".to_string(), + ); params.push(Box::new(tag.clone())); } @@ -275,7 +277,7 @@ mod tests { ..default_args() }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); - assert!(sql.contains("c.project = ?")); + assert!(sql.contains("c.project LIKE ?")); assert!(sql.contains("ORDER BY c.timestamp ASC")); assert!(!sql.contains("LIMIT")); assert_eq!(params.len(), 1); @@ -288,7 +290,9 @@ mod tests { ..default_args() }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); - assert!(sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)")); + assert!( + sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE LOWER(value) = LOWER(?))") + ); assert_eq!(params.len(), 1); } @@ -300,7 +304,7 @@ mod tests { }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); let count = sql - .matches("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)") + .matches("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE LOWER(value) = LOWER(?))") .count(); assert_eq!(count, 2, "two tag clauses expected for AND semantics"); assert_eq!(params.len(), 2); @@ -372,11 +376,13 @@ mod tests { workspace: None, }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); - assert!(sql.contains("c.project = ?")); + assert!(sql.contains("c.project LIKE ?")); assert!(sql.contains("c.exit_code = 0")); assert!(sql.contains("c.timestamp >= ?")); assert!(sql.contains("c.session_id = ?")); - assert!(sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)")); + assert!( + sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE LOWER(value) = LOWER(?))") + ); assert!(!sql.contains("LIMIT")); assert!(!sql.contains("JOIN")); assert!(sql.contains("ORDER BY c.timestamp ASC")); diff --git a/src/search.rs b/src/search.rs index 32d70a4..a3a4c82 100644 --- a/src/search.rs +++ b/src/search.rs @@ -239,8 +239,8 @@ pub fn build_query( } if let Some(ref p) = args.project { - fragments.push("c.project = ?".to_string()); - params.push(Box::new(p.clone())); + fragments.push("c.project LIKE ?".to_string()); + params.push(Box::new(format!("%{p}%"))); } match &args.exit { @@ -286,7 +286,9 @@ pub fn build_query( } for tag in &args.tag { - fragments.push("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)".to_string()); + fragments.push( + "EXISTS(SELECT 1 FROM json_each(c.tags) WHERE LOWER(value) = LOWER(?))".to_string(), + ); params.push(Box::new(tag.clone())); } @@ -584,7 +586,7 @@ mod tests { ..default_args() }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); - assert!(sql.contains("c.project = ?")); + assert!(sql.contains("c.project LIKE ?")); assert_eq!(params.len(), 2); } @@ -683,7 +685,9 @@ mod tests { ..default_args() }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); - assert!(sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)")); + assert!( + sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE LOWER(value) = LOWER(?))") + ); assert_eq!(params.len(), 2); } @@ -695,7 +699,7 @@ mod tests { }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); let count = sql - .matches("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)") + .matches("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE LOWER(value) = LOWER(?))") .count(); assert_eq!(count, 2); assert_eq!(params.len(), 3); @@ -775,8 +779,10 @@ mod tests { }; let (sql, params) = build_query(&args, FIXED_NOW).unwrap(); assert!(sql.contains("INNER JOIN commands_fts")); - assert!(sql.contains("c.project = ?")); - assert!(sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE value = ?)")); + assert!(sql.contains("c.project LIKE ?")); + assert!( + sql.contains("EXISTS(SELECT 1 FROM json_each(c.tags) WHERE LOWER(value) = LOWER(?))") + ); assert_eq!(params.len(), 4); } From e9d68367a5d45141a2be1ade496283f446fe6718 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 00:59:55 -0600 Subject: [PATCH 138/151] feat(tui): add cmdline state and methods, fix recompute to use raw query #72 --- src/tui/app.rs | 164 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 158 insertions(+), 6 deletions(-) diff --git a/src/tui/app.rs b/src/tui/app.rs index bbdce4c..9e1b222 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -174,6 +174,7 @@ pub enum Action { pub struct App { pub query: String, pub fuzzy_query: String, + pub cmdline: Option, pub all_rows: Vec, pub filtered: Vec, pub selected: usize, @@ -209,6 +210,7 @@ impl App { Self { query: String::new(), fuzzy_query: String::new(), + cmdline: None, all_rows: vec![], filtered: vec![], selected: 0, @@ -389,7 +391,7 @@ impl App { } pub fn recompute(&mut self) { - self.filtered = fuzzy::rank(&self.fuzzy_query, &self.all_rows); + self.filtered = fuzzy::rank(&self.query, &self.all_rows); let max = self.filtered.len().saturating_sub(1); if self.selected > max { self.selected = max; @@ -400,7 +402,43 @@ impl App { let (filters, free) = parse_query(&self.query, now); let changed = filters != self.filters; self.filters = filters; - self.fuzzy_query = free; + self.fuzzy_query = free.clone(); + self.query = free; + if changed { + self.needs_history_reload = true; + } + self.recompute(); + } + + pub fn open_cmdline(&mut self) { + self.cmdline = Some(String::new()); + } + + pub fn cmdline_push(&mut self, c: char) { + if let Some(ref mut buf) = self.cmdline { + buf.push(c); + } + } + + pub fn cmdline_backspace(&mut self) { + if let Some(ref mut buf) = self.cmdline { + buf.pop(); + } + } + + pub fn cmdline_cancel(&mut self) { + self.cmdline = None; + } + + pub fn cmdline_submit(&mut self, now: i64) { + let buf = match self.cmdline.take() { + Some(b) => b, + None => return, + }; + let (filters, free) = parse_query(&buf, now); + let changed = filters != self.filters; + self.filters = filters; + self.query = free; if changed { self.needs_history_reload = true; } @@ -761,7 +799,6 @@ mod tests { let mut app = App::new(); app.reload(&conn, 9999).unwrap(); app.query = "docker".into(); - app.fuzzy_query = "docker".into(); app.recompute(); assert_eq!(app.filtered.len(), 1); assert_eq!(app.all_rows[app.filtered[0]].command, "docker run nginx"); @@ -1197,7 +1234,10 @@ mod tests { app.apply_query(PARSE_NOW); assert_eq!(app.filters.project, Some("myapp".into())); assert!(app.needs_history_reload); - assert!(app.fuzzy_query.is_empty()); + assert!( + app.query.is_empty(), + "query must become the free text after parsing" + ); } #[test] @@ -1206,11 +1246,11 @@ mod tests { app.query = "cargo".into(); app.apply_query(PARSE_NOW); assert!(!app.needs_history_reload); - assert_eq!(app.fuzzy_query, "cargo"); + assert_eq!(app.query, "cargo"); } #[test] - fn apply_query_recompute_uses_fuzzy_query() { + fn apply_query_recompute_uses_free_text_as_query() { let conn = make_conn(); seed(&conn, "docker run nginx", 1000); seed(&conn, "ls -la", 2000); @@ -1230,6 +1270,118 @@ mod tests { assert_eq!(args.duration, Some(">30".into())); } + const CMDLINE_NOW: i64 = 1_700_000_000; + + #[test] + fn open_cmdline_sets_some_empty_string() { + let mut app = App::new(); + assert!(app.cmdline.is_none()); + app.open_cmdline(); + assert_eq!(app.cmdline, Some(String::new())); + } + + #[test] + fn cmdline_push_appends_char() { + let mut app = App::new(); + app.open_cmdline(); + app.cmdline_push('p'); + app.cmdline_push(':'); + assert_eq!(app.cmdline, Some("p:".to_string())); + } + + #[test] + fn cmdline_backspace_removes_last_char() { + let mut app = App::new(); + app.open_cmdline(); + app.cmdline_push('a'); + app.cmdline_push('b'); + app.cmdline_backspace(); + assert_eq!(app.cmdline, Some("a".to_string())); + } + + #[test] + fn cmdline_cancel_closes_without_applying() { + let mut app = App::new(); + app.filters.project = Some("old".into()); + app.open_cmdline(); + app.cmdline_push('p'); + app.cmdline_push(':'); + app.cmdline_push('x'); + app.cmdline_cancel(); + assert!(app.cmdline.is_none()); + assert_eq!( + app.filters.project, + Some("old".into()), + "cancel must not change filters" + ); + } + + #[test] + fn cmdline_submit_project_and_free_text() { + let conn = make_conn(); + seed(&conn, "docker run nginx", 1000); + seed(&conn, "ls -la", 2000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.open_cmdline(); + for c in "project:thoth cargo".chars() { + app.cmdline_push(c); + } + app.cmdline_submit(CMDLINE_NOW); + assert_eq!(app.filters.project, Some("thoth".into())); + assert_eq!(app.query, "cargo"); + assert!(app.needs_history_reload); + assert!(app.cmdline.is_none()); + } + + #[test] + fn cmdline_submit_only_free_text_does_not_set_reload() { + let mut app = App::new(); + app.open_cmdline(); + for c in "cargo".chars() { + app.cmdline_push(c); + } + app.cmdline_submit(CMDLINE_NOW); + assert_eq!(app.query, "cargo"); + assert!( + !app.needs_history_reload, + "free-text only must not trigger reload" + ); + assert!(app.cmdline.is_none()); + } + + #[test] + fn cmdline_submit_empty_clears_filters() { + let mut app = App::new(); + app.filters.project = Some("myapp".into()); + app.needs_history_reload = false; + app.open_cmdline(); + app.cmdline_submit(CMDLINE_NOW); + assert!( + app.filters.project.is_none(), + "empty submit must clear filters" + ); + assert_eq!(app.query, ""); + assert!( + app.needs_history_reload, + "clearing filters must trigger reload" + ); + assert!(app.cmdline.is_none()); + } + + #[test] + fn recompute_ranks_on_raw_query() { + let conn = make_conn(); + seed(&conn, "git status", 2000); + seed(&conn, "ls -la", 1000); + let mut app = App::new(); + app.reload(&conn, 9999).unwrap(); + app.query = "git".into(); + app.recompute(); + assert!(!app.filtered.is_empty()); + assert_eq!(app.all_rows[app.filtered[0]].command, "git status"); + } + #[test] fn edit_commit_sets_pending_edit_and_clears_edit() { let mut app = App::new(); From f71719a2151a962ba609db5324e056703cc71f5f Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 00:59:59 -0600 Subject: [PATCH 139/151] feat(tui): wire cmdline popup keys and revert insert DSL parsing #72 --- src/tui/event.rs | 143 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 135 insertions(+), 8 deletions(-) diff --git a/src/tui/event.rs b/src/tui/event.rs index 90d4825..78b71a8 100644 --- a/src/tui/event.rs +++ b/src/tui/event.rs @@ -59,6 +59,32 @@ pub enum Outcome { Exit, } +fn handle_cmdline_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome { + if key.code == KeyCode::Char('c') && key.modifiers.contains(KeyModifiers::CONTROL) { + app.action = None; + return Outcome::Exit; + } + match key.code { + KeyCode::Enter => { + app.cmdline_submit(now); + Outcome::Continue + } + KeyCode::Esc => { + app.cmdline_cancel(); + Outcome::Continue + } + KeyCode::Backspace => { + app.cmdline_backspace(); + Outcome::Continue + } + KeyCode::Char(c) if !key.modifiers.contains(KeyModifiers::CONTROL) => { + app.cmdline_push(c); + Outcome::Continue + } + _ => Outcome::Continue, + } +} + pub fn handle_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome { if app.confirm.is_some() { return handle_confirm_key(key, app); @@ -66,6 +92,9 @@ pub fn handle_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome { if app.edit.is_some() { return handle_edit_key(key, app); } + if app.cmdline.is_some() { + return handle_cmdline_key(key, app, now); + } if app.show_help { app.show_help = false; return Outcome::Continue; @@ -100,7 +129,7 @@ fn handle_history_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome { } } -fn handle_history_insert_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome { +fn handle_history_insert_key(key: KeyEvent, app: &mut App, _now: i64) -> Outcome { match key.code { KeyCode::Esc => { app.enter_normal_mode(); @@ -136,12 +165,12 @@ fn handle_history_insert_key(key: KeyEvent, app: &mut App, now: i64) -> Outcome } KeyCode::Backspace => { app.query.pop(); - app.apply_query(now); + app.recompute(); Outcome::Continue } KeyCode::Char(c) if !key.modifiers.contains(KeyModifiers::CONTROL) => { app.query.push(c); - app.apply_query(now); + app.recompute(); Outcome::Continue } _ => Outcome::Continue, @@ -154,6 +183,10 @@ fn handle_history_normal_key(key: KeyEvent, app: &mut App) -> Outcome { app.show_help = true; Outcome::Continue } + KeyCode::Char(':') => { + app.open_cmdline(); + Outcome::Continue + } KeyCode::Char('i') | KeyCode::Char('/') => { app.enter_insert_mode(); Outcome::Continue @@ -938,7 +971,7 @@ mod tests { } #[test] - fn typing_dsl_filter_updates_filters_and_fuzzy_query() { + fn typing_in_insert_does_not_parse_dsl_filters() { let mut app = app_with_rows(); for c in "project:thoth ".chars() { handle_key(key(KeyCode::Char(c)), &mut app, NOW); @@ -946,13 +979,15 @@ mod tests { for c in "cargo".chars() { handle_key(key(KeyCode::Char(c)), &mut app, NOW); } - assert_eq!(app.filters.project, Some("thoth".into())); - assert_eq!(app.fuzzy_query, "cargo"); + assert!( + app.filters.project.is_none(), + "typing in Insert must NOT parse DSL; filters.project must remain None" + ); assert_eq!(app.query, "project:thoth cargo"); } #[test] - fn backspace_updates_apply_query() { + fn backspace_removes_last_char_raw() { let mut app = app_with_rows(); for c in "project:x".chars() { handle_key(key(KeyCode::Char(c)), &mut app, NOW); @@ -985,8 +1020,100 @@ mod tests { for c in "git".chars() { handle_key(key(KeyCode::Char(c)), &mut app, NOW); } - assert_eq!(app.fuzzy_query, "git"); assert_eq!(app.query, "git"); assert!(!app.filtered.is_empty()); } + + #[test] + fn normal_colon_opens_cmdline() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + let outcome = handle_key(key(KeyCode::Char(':')), &mut app, NOW); + assert!(matches!(outcome, Outcome::Continue)); + assert_eq!(app.cmdline, Some(String::new())); + } + + #[test] + fn cmdline_open_typing_appends_to_buffer_not_query() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char(':')), &mut app, NOW); + assert!(app.cmdline.is_some()); + let query_before = app.query.clone(); + handle_key(key(KeyCode::Char('p')), &mut app, NOW); + assert_eq!( + app.query, query_before, + "typing while cmdline is open must not change query" + ); + assert_eq!(app.cmdline, Some("p".to_string())); + } + + #[test] + fn cmdline_enter_applies_and_closes() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char(':')), &mut app, NOW); + for c in "project:thoth".chars() { + handle_key(key(KeyCode::Char(c)), &mut app, NOW); + } + let outcome = handle_key(key(KeyCode::Enter), &mut app, NOW); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.cmdline.is_none(), "Enter must close cmdline"); + assert_eq!(app.filters.project, Some("thoth".into())); + } + + #[test] + fn cmdline_esc_cancels_without_applying() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char(':')), &mut app, NOW); + for c in "project:thoth".chars() { + handle_key(key(KeyCode::Char(c)), &mut app, NOW); + } + let outcome = handle_key(key(KeyCode::Esc), &mut app, NOW); + assert!(matches!(outcome, Outcome::Continue)); + assert!(app.cmdline.is_none(), "Esc must close cmdline"); + assert!(app.filters.project.is_none(), "Esc must not apply filters"); + } + + #[test] + fn cmdline_ctrl_c_exits() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char(':')), &mut app, NOW); + let outcome = handle_key(ctrl(KeyCode::Char('c')), &mut app, NOW); + assert!( + matches!(outcome, Outcome::Exit), + "Ctrl-C must exit from cmdline" + ); + } + + #[test] + fn cmdline_left_right_tab_do_not_leak() { + let mut app = app_with_rows(); + app.enter_normal_mode(); + handle_key(key(KeyCode::Char(':')), &mut app, NOW); + let tab_before = app.tab; + handle_key(key(KeyCode::Left), &mut app, NOW); + handle_key(key(KeyCode::Right), &mut app, NOW); + handle_key(key(KeyCode::Tab), &mut app, NOW); + assert_eq!( + app.tab, tab_before, + "Left/Right/Tab must not leak while cmdline is open" + ); + assert!(app.cmdline.is_some(), "cmdline must still be open"); + } + + #[test] + fn insert_typing_project_word_does_not_set_filter_regression() { + let mut app = app_with_rows(); + assert_eq!(app.mode, Mode::Insert); + for c in "project".chars() { + handle_key(key(KeyCode::Char(c)), &mut app, NOW); + } + assert!( + app.filters.project.is_none(), + "typing 'project' in Insert mode must NOT set a project filter" + ); + } } From ecac4a32819bea4b468fd45caa262bc30fc8a7c7 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 01:00:04 -0600 Subject: [PATCH 140/151] feat(tui): render cmdline popup and update help overlay and normal controls #72 --- src/tui/render.rs | 124 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 5 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index df955b3..8fdc3f9 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -15,7 +15,9 @@ use crate::workspaces::WorkspaceRow; const EDIT_MODAL_W: u16 = 60; const EDIT_MODAL_H: u16 = 5; const HELP_MODAL_W: u16 = 62; -const HELP_MODAL_H: u16 = 8; +const HELP_MODAL_H: u16 = 10; +const CMDLINE_MODAL_W: u16 = 60; +const CMDLINE_MODAL_H: u16 = 3; pub fn display_command(raw: &str) -> String { let collapsed: String = raw @@ -676,6 +678,9 @@ pub fn draw_with_cmd_state( if app.show_help { render_help_modal(frame, middle_area, theme); } + if let Some(ref buf) = app.cmdline { + render_cmdline_modal(frame, middle_area, buf, theme); + } let query_text = format!("> {}", app.query); frame.render_widget(Paragraph::new(query_text), query_area); @@ -726,6 +731,9 @@ pub fn draw_with_cmd_state( Span::styled("i", accent_style), Span::styled(" search", dim_style), Span::styled(" · ", dim_style), + Span::styled(":", accent_style), + Span::styled(" filter", dim_style), + Span::styled(" · ", dim_style), Span::styled("?", accent_style), Span::styled(" help", dim_style), Span::styled(" · ", dim_style), @@ -873,15 +881,17 @@ fn render_help_modal(frame: &mut Frame, area: Rect, theme: &Theme) { .borders(Borders::ALL) .border_type(BorderType::Rounded) .border_style(Style::default().fg(theme.accent)) - .title(Span::styled( - " Search filters (type in the box) ", - accent_style, - )); + .title(Span::styled(" Help ", accent_style)); let inner = block.inner(modal_area); frame.render_widget(block, modal_area); let lines = vec![ + Line::from(vec![ + Span::styled(" :", accent_style), + Span::styled(" open filter cmdline fields: project:/p: tag:/t: exit:ok|fail since: until: dur:>30", dim_style), + ]), + Line::from(vec![Span::raw("")]), Line::from(vec![ Span::styled(" project:NAME", kw_style), Span::styled(" p:NAME", dim_style), @@ -918,6 +928,28 @@ fn render_help_modal(frame: &mut Frame, area: Rect, theme: &Theme) { frame.render_widget(Paragraph::new(lines), inner); } +fn render_cmdline_modal(frame: &mut Frame, area: Rect, buf: &str, theme: &Theme) { + let accent_style = Style::default() + .fg(theme.accent) + .add_modifier(Modifier::BOLD); + let text_style = Style::default().fg(theme.command); + + let modal_area = centered_rect(CMDLINE_MODAL_W, CMDLINE_MODAL_H, area); + frame.render_widget(Clear, modal_area); + + let block = Block::default() + .borders(Borders::ALL) + .border_type(BorderType::Rounded) + .border_style(Style::default().fg(theme.accent)) + .title(Span::styled(" Cmdline ", accent_style)); + + let inner = block.inner(modal_area); + frame.render_widget(block, modal_area); + + let display = format!("> {buf}_"); + frame.render_widget(Paragraph::new(Span::styled(display, text_style)), inner); +} + fn render_edit_modal( frame: &mut Frame, area: Rect, @@ -2859,4 +2891,86 @@ mod tests { "Normal mode controls must show 'help' hint; got:\n{text}" ); } + + #[test] + fn controls_normal_shows_filter_hint() { + let mut app = app_with_rows(); + app.mode = crate::tui::app::Mode::Normal; + let text = render_app(&app); + assert!( + text.contains("filter"), + "Normal mode controls must show 'filter' hint; got:\n{text}" + ); + } + + #[test] + fn cmdline_popup_renders_with_title_and_buffer() { + let mut app = app_with_rows(); + app.cmdline = Some("project:thoth exit:fail".to_string()); + let text = render_app(&app); + assert!( + text.contains("Cmdline"), + "cmdline popup must show 'Cmdline' title; got:\n{text}" + ); + assert!( + text.contains("project:thoth"), + "cmdline popup must show buffer text; got:\n{text}" + ); + } + + #[test] + fn cmdline_popup_not_shown_when_closed() { + let app = app_with_rows(); + let text = render_app(&app); + assert!( + !text.contains("Cmdline"), + "cmdline popup must not appear when cmdline is None; got:\n{text}" + ); + } + + #[test] + fn help_overlay_mentions_colon_cmdline() { + let mut app = app_with_rows(); + app.show_help = true; + let text = render_app(&app); + assert!( + text.contains("filter cmdline") || text.contains("cmdline"), + "help overlay must mention ':' cmdline; got:\n{text}" + ); + } + + fn render_cmdline_popup_120x18(buf_text: &str) -> String { + let mut app = app_with_rows(); + app.cmdline = Some(buf_text.to_string()); + let cols = default_cols(); + let backend = TestBackend::new(120, 18); + let mut terminal = Terminal::new(backend).unwrap(); + let mut ts = TableState::default(); + terminal + .draw(|f| draw(f, &app, TEST_NOW, true, &cols, &mut ts)) + .unwrap(); + let buf = terminal.backend().buffer().clone(); + let mut lines: Vec = Vec::new(); + for row in 0..18u16 { + let mut line = String::new(); + for col in 0..120u16 { + line.push(buf[(col, row)].symbol().chars().next().unwrap_or(' ')); + } + lines.push(line); + } + lines.join("\n") + } + + #[test] + fn cmdline_popup_120x18_dump_contains_buffer_and_title() { + let text = render_cmdline_popup_120x18("project:thoth exit:fail"); + assert!( + text.contains("Cmdline"), + "120x18 dump must contain 'Cmdline' title; got:\n{text}" + ); + assert!( + text.contains("project:thoth"), + "120x18 dump must show typed buffer; got:\n{text}" + ); + } } From ca2b57127cf8e63433d20d2071cedf2addc7d177 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 01:25:57 -0600 Subject: [PATCH 141/151] style(tui): reorganize help overlay into Filters and Keys sections --- src/tui/render.rs | 84 ++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/src/tui/render.rs b/src/tui/render.rs index 8fdc3f9..17da4b0 100644 --- a/src/tui/render.rs +++ b/src/tui/render.rs @@ -14,8 +14,8 @@ use crate::workspaces::WorkspaceRow; const EDIT_MODAL_W: u16 = 60; const EDIT_MODAL_H: u16 = 5; -const HELP_MODAL_W: u16 = 62; -const HELP_MODAL_H: u16 = 10; +const HELP_MODAL_W: u16 = 64; +const HELP_MODAL_H: u16 = 17; const CMDLINE_MODAL_W: u16 = 60; const CMDLINE_MODAL_H: u16 = 3; @@ -886,42 +886,60 @@ fn render_help_modal(frame: &mut Frame, area: Rect, theme: &Theme) { let inner = block.inner(modal_area); frame.render_widget(block, modal_area); + let field = |kw: &str, alias: &str, desc: &str| { + let left = format!(" {kw}{alias}"); + let pad = " ".repeat(28usize.saturating_sub(left.chars().count())); + Line::from(vec![ + Span::styled(format!(" {kw}"), kw_style), + Span::styled(format!("{alias}{pad}"), dim_style), + Span::styled(desc.to_string(), dim_style), + ]) + }; + let key = |k: &str, label: &str| { + vec![ + Span::styled(format!(" {k}"), accent_style), + Span::styled(format!(" {label}"), dim_style), + ] + }; + let lines = vec![ Line::from(vec![ - Span::styled(" :", accent_style), - Span::styled(" open filter cmdline fields: project:/p: tag:/t: exit:ok|fail since: until: dur:>30", dim_style), + Span::styled(" Filters", accent_style), + Span::styled(" (press ", dim_style), + Span::styled(":", kw_style), + Span::styled(" to open the cmdline, then type)", dim_style), ]), Line::from(vec![Span::raw("")]), - Line::from(vec![ - Span::styled(" project:NAME", kw_style), - Span::styled(" p:NAME", dim_style), - Span::styled(" tag:NAME", kw_style), - Span::styled(" t:NAME", dim_style), - ]), - Line::from(vec![ - Span::styled(" exit:ok|fail", kw_style), - Span::styled(" since:DATE", dim_style), - Span::styled(" until:DATE", dim_style), - ]), - Line::from(vec![ - Span::styled(" dur:>30", kw_style), - Span::styled(" (seconds, use > or <)", dim_style), - ]), + field("project:NAME", " p:", "filter by project"), + field("tag:NAME", " t:", "filter by tag (repeatable)"), + field("exit:ok|fail", "", "filter by exit status"), + field( + "since:DATE", + " until:DATE", + "time range (2h, today, 2024-01-01)", + ), + field("dur:>30", " dur:<5", "duration in seconds"), + Line::from(vec![Span::raw("")]), + Line::from(vec![Span::styled(" Keys", accent_style)]), + Line::from( + [ + key("esc", "normal"), + key("i", "search"), + key(":", "filter"), + key("enter", "run"), + ] + .concat(), + ), + Line::from( + [ + key("j/k", "move"), + key("d", "delete"), + key("e", "edit"), + key("?", "help"), + ] + .concat(), + ), Line::from(vec![Span::raw("")]), - Line::from(vec![ - Span::styled(" esc", accent_style), - Span::styled(" normal", dim_style), - Span::styled(" i", accent_style), - Span::styled(" search", dim_style), - Span::styled(" j/k", accent_style), - Span::styled(" move", dim_style), - Span::styled(" d", accent_style), - Span::styled(" delete", dim_style), - Span::styled(" e", accent_style), - Span::styled(" edit", dim_style), - Span::styled(" ?", accent_style), - Span::styled(" help", dim_style), - ]), Line::from(vec![Span::styled(" Press any key to close", dim_style)]), ]; From 76b7a16385505a58fe0895595d191f6faaff36c6 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 01:59:56 -0600 Subject: [PATCH 142/151] build: add package metadata (description, license, repository, keywords) --- Cargo.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 7237e73..39d7d18 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,13 @@ name = "thoth" version = "0.1.0" edition = "2021" +description = "An intelligent shell history that captures commands with context and makes them searchable" +license = "MIT" +repository = "https://github.com/JoseVelazcoH/Thoth" +readme = "README.md" +keywords = ["shell", "history", "cli", "tui", "search"] +categories = ["command-line-utilities"] +rust-version = "1.74" [[bin]] name = "tth" From 9c29ab4c5edf9895d3234e64fabe1b45a4946bdd Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 02:17:42 -0600 Subject: [PATCH 143/151] ci: set up cargo-dist for cross-platform release builds and installers --- .github/workflows/release.yml | 296 ++++++++++++++++++++++++++++++++++ Cargo.toml | 5 + dist-workspace.toml | 19 +++ 3 files changed, 320 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 dist-workspace.toml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..1dfcd0f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,296 @@ +# This file was autogenerated by dist: https://axodotdev.github.io/cargo-dist +# +# Copyright 2022-2024, axodotdev +# SPDX-License-Identifier: MIT or Apache-2.0 +# +# CI that: +# +# * checks for a Git Tag that looks like a release +# * builds artifacts with dist (archives, installers, hashes) +# * uploads those artifacts to temporary workflow zip +# * on success, uploads the artifacts to a GitHub Release +# +# Note that the GitHub Release will be created with a generated +# title/body based on your changelogs. + +name: Release +permissions: + "contents": "write" + +# This task will run whenever you push a git tag that looks like a version +# like "1.0.0", "v0.1.0-prerelease.1", "my-app/0.1.0", "releases/v1.0.0", etc. +# Various formats will be parsed into a VERSION and an optional PACKAGE_NAME, where +# PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION +# must be a Cargo-style SemVer Version (must have at least major.minor.patch). +# +# If PACKAGE_NAME is specified, then the announcement will be for that +# package (erroring out if it doesn't have the given version or isn't dist-able). +# +# If PACKAGE_NAME isn't specified, then the announcement will be for all +# (dist-able) packages in the workspace with that version (this mode is +# intended for workspaces with only one dist-able package, or with all dist-able +# packages versioned/released in lockstep). +# +# If you push multiple tags at once, separate instances of this workflow will +# spin up, creating an independent announcement for each one. However, GitHub +# will hard limit this to 3 tags per commit, as it will assume more tags is a +# mistake. +# +# If there's a prerelease-style suffix to the version, then the release(s) +# will be marked as a prerelease. +on: + pull_request: + push: + tags: + - '**[0-9]+.[0-9]+.[0-9]+*' + +jobs: + # Run 'dist plan' (or host) to determine what tasks we need to do + plan: + runs-on: "ubuntu-22.04" + outputs: + val: ${{ steps.plan.outputs.manifest }} + tag: ${{ !github.event.pull_request && github.ref_name || '' }} + tag-flag: ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }} + publishing: ${{ !github.event.pull_request }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive + - name: Install dist + # we specify bash to get pipefail; it guards against the `curl` command + # failing. otherwise `sh` won't catch that `curl` returned non-0 + shell: bash + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.32.0/cargo-dist-installer.sh | sh" + - name: Cache dist + uses: actions/upload-artifact@v7 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/dist + # sure would be cool if github gave us proper conditionals... + # so here's a doubly-nested ternary-via-truthiness to try to provide the best possible + # functionality based on whether this is a pull_request, and whether it's from a fork. + # (PRs run on the *source* but secrets are usually on the *target* -- that's *good* + # but also really annoying to build CI around when it needs secrets to work right.) + - id: plan + run: | + dist ${{ (!github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name)) || 'plan' }} --output-format=json > plan-dist-manifest.json + echo "dist ran successfully" + cat plan-dist-manifest.json + echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT" + - name: "Upload dist-manifest.json" + uses: actions/upload-artifact@v7 + with: + name: artifacts-plan-dist-manifest + path: plan-dist-manifest.json + + # Build and packages all the platform-specific things + build-local-artifacts: + name: build-local-artifacts (${{ join(matrix.targets, ', ') }}) + # Let the initial task tell us to not run (currently very blunt) + needs: + - plan + if: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix.include != null && (needs.plan.outputs.publishing == 'true' || fromJson(needs.plan.outputs.val).ci.github.pr_run_mode == 'upload') }} + strategy: + fail-fast: false + # Target platforms/runners are computed by dist in create-release. + # Each member of the matrix has the following arguments: + # + # - runner: the github runner + # - dist-args: cli flags to pass to dist + # - install-dist: expression to run to install dist on the runner + # + # Typically there will be: + # - 1 "global" task that builds universal installers + # - N "local" tasks that build each platform's binaries and platform-specific installers + matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }} + runs-on: ${{ matrix.runner }} + container: ${{ matrix.container && matrix.container.image || null }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json + steps: + - name: enable windows longpaths + run: | + git config --global core.longpaths true + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive + - name: Install Rust non-interactively if not already installed + if: ${{ matrix.container }} + run: | + if ! command -v cargo > /dev/null 2>&1; then + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + echo "$HOME/.cargo/bin" >> $GITHUB_PATH + fi + - name: Install dist + run: ${{ matrix.install_dist.run }} + # Get the dist-manifest + - name: Fetch local artifacts + uses: actions/download-artifact@v8 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - name: Install dependencies + run: | + ${{ matrix.packages_install }} + - name: Build artifacts + run: | + # Actually do builds and make zips and whatnot + dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json + echo "dist ran successfully" + - id: cargo-dist + name: Post-build + # We force bash here just because github makes it really hard to get values up + # to "real" actions without writing to env-vars, and writing to env-vars has + # inconsistent syntax between shell and powershell. + shell: bash + run: | + # Parse out what we just built and upload it to scratch storage + echo "paths<> "$GITHUB_OUTPUT" + dist print-upload-files-from-manifest --manifest dist-manifest.json >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + cp dist-manifest.json "$BUILD_MANIFEST_NAME" + - name: "Upload artifacts" + uses: actions/upload-artifact@v7 + with: + name: artifacts-build-local-${{ join(matrix.targets, '_') }} + path: | + ${{ steps.cargo-dist.outputs.paths }} + ${{ env.BUILD_MANIFEST_NAME }} + + # Build and package all the platform-agnostic(ish) things + build-global-artifacts: + needs: + - plan + - build-local-artifacts + runs-on: "ubuntu-22.04" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive + - name: Install cached dist + uses: actions/download-artifact@v8 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/ + - run: chmod +x ~/.cargo/bin/dist + # Get all the local artifacts for the global tasks to use (for e.g. checksums) + - name: Fetch local artifacts + uses: actions/download-artifact@v8 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - id: cargo-dist + shell: bash + run: | + dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json + echo "dist ran successfully" + + # Parse out what we just built and upload it to scratch storage + echo "paths<> "$GITHUB_OUTPUT" + jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + cp dist-manifest.json "$BUILD_MANIFEST_NAME" + - name: "Upload artifacts" + uses: actions/upload-artifact@v7 + with: + name: artifacts-build-global + path: | + ${{ steps.cargo-dist.outputs.paths }} + ${{ env.BUILD_MANIFEST_NAME }} + # Determines if we should publish/announce + host: + needs: + - plan + - build-local-artifacts + - build-global-artifacts + # Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine) + if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + runs-on: "ubuntu-22.04" + outputs: + val: ${{ steps.host.outputs.manifest }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive + - name: Install cached dist + uses: actions/download-artifact@v8 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/ + - run: chmod +x ~/.cargo/bin/dist + # Fetch artifacts from scratch-storage + - name: Fetch artifacts + uses: actions/download-artifact@v8 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - id: host + shell: bash + run: | + dist host ${{ needs.plan.outputs.tag-flag }} --steps=upload --steps=release --output-format=json > dist-manifest.json + echo "artifacts uploaded and released successfully" + cat dist-manifest.json + echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT" + - name: "Upload dist-manifest.json" + uses: actions/upload-artifact@v7 + with: + # Overwrite the previous copy + name: artifacts-dist-manifest + path: dist-manifest.json + # Create a GitHub Release while uploading all files to it + - name: "Download GitHub Artifacts" + uses: actions/download-artifact@v8 + with: + pattern: artifacts-* + path: artifacts + merge-multiple: true + - name: Cleanup + run: | + # Remove the granular manifests + rm -f artifacts/*-dist-manifest.json + - name: Create GitHub Release + env: + PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--prerelease' || '' }}" + ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}" + ANNOUNCEMENT_BODY: "${{ fromJson(steps.host.outputs.manifest).announcement_github_body }}" + RELEASE_COMMIT: "${{ github.sha }}" + run: | + # Write and read notes from a file to avoid quoting breaking things + echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt + + gh release create "${{ needs.plan.outputs.tag }}" --target "$RELEASE_COMMIT" $PRERELEASE_FLAG --title "$ANNOUNCEMENT_TITLE" --notes-file "$RUNNER_TEMP/notes.txt" artifacts/* + + announce: + needs: + - plan + - host + # use "always() && ..." to allow us to wait for all publish jobs while + # still allowing individual publish jobs to skip themselves (for prereleases). + # "host" however must run to completion, no skipping allowed! + if: ${{ always() && needs.host.result == 'success' }} + runs-on: "ubuntu-22.04" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive diff --git a/Cargo.toml b/Cargo.toml index 39d7d18..01f30ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,3 +33,8 @@ regex = "1" tempfile = "3" assert_cmd = "2" predicates = "3" + +# The profile that 'dist' will build with +[profile.dist] +inherits = "release" +lto = "thin" diff --git a/dist-workspace.toml b/dist-workspace.toml new file mode 100644 index 0000000..0330c09 --- /dev/null +++ b/dist-workspace.toml @@ -0,0 +1,19 @@ +[workspace] +members = ["cargo:."] + +# Config for 'dist' +[dist] +# The preferred dist version to use in CI (Cargo.toml SemVer syntax) +cargo-dist-version = "0.32.0" +# CI backends to support +ci = "github" +# The installers to generate for each app +installers = ["shell", "powershell"] +# Target platforms to build apps for (Rust target-triple syntax) +targets = ["aarch64-apple-darwin", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-pc-windows-msvc"] +# Path that installers should place binaries in +install-path = "CARGO_HOME" +# Where to host releases +hosting = "github" +# Whether to install an updater program +install-updater = false From 93c9d958d2c735f28090c1616d27ea032f93bc38 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 13:50:52 -0600 Subject: [PATCH 144/151] fix(shells): load zsh/datetime and round duration without zsh/mathfunc --- shells/thoth.zsh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shells/thoth.zsh b/shells/thoth.zsh index 51337a2..ad6bd38 100644 --- a/shells/thoth.zsh +++ b/shells/thoth.zsh @@ -1,5 +1,6 @@ command -v tth >/dev/null 2>&1 || return +zmodload zsh/datetime 2>/dev/null autoload -Uz add-zsh-hook : ${TTH_SESSION_ID:=$(tth new-session-id)} @@ -17,7 +18,7 @@ _tth_preexec() { _tth_precmd() { local _TTH_EXIT=$? [[ -n $_TTH_CMD ]] || return - local _dur=$(( int((EPOCHREALTIME - _TTH_START) * 1000) )) + local _dur=$(printf '%.0f' "$(( (EPOCHREALTIME - _TTH_START) * 1000 ))") tth record \ --cmd "$_TTH_CMD" \ --dir "$PWD" \ From 9b0415f9cffff43a4751b20904ccb5c8a01e7649 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 13:50:54 -0600 Subject: [PATCH 145/151] docs: add demo recording (vhs tape, seed script, gif) --- demo.gif | Bin 0 -> 727818 bytes demo.tape | 69 +++++++++++++++++++++++++++++++++++++++++ scripts/seed-demo.sh | 72 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 demo.gif create mode 100644 demo.tape create mode 100755 scripts/seed-demo.sh diff --git a/demo.gif b/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..beedbee855d49a949a2afc9307323edac947504b GIT binary patch literal 727818 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

2syz4-}p&Ud%1gPvIj?k8Zl9} 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�yul3OW=UE_QaARO_iJ)Q#pRnT(ZodLUh} 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

F=d&P#3ykzr5gib1DiK!6FSCh06JAoiv?6m= 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�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�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%0AtMy8Bh>m?routXci85A#``Mp)-!k^H#rtqx47Wz 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

ZSFzb?*sWg3u4}j2VX%4g2GuCy9Vb71euerm0L{ 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 RH}F4e^{+Mh|9Fiq{$DWy%{Bl4 literal 0 HcmV?d00001 diff --git a/demo.tape b/demo.tape new file mode 100644 index 0000000..a0e5a23 --- /dev/null +++ b/demo.tape @@ -0,0 +1,69 @@ +# Thoth demo recording. +# Install vhs: https://github.com/charmbracelet/vhs (needs ttyd + ffmpeg) +# Render: vhs demo.tape -> demo.gif +# +# Everything runs against a throwaway demo database (see scripts/seed-demo.sh), +# so your real history never appears. + +Output demo.gif + +Require tth + +Set Shell "bash" +Set FontSize 18 +Set Width 1280 +Set Height 720 +Set Padding 24 +Set Theme "Catppuccin Mocha" +Set TypingSpeed 90ms + +# --- hidden setup: PATH, demo db/config, seed, clean prompt, then enable the hooks --- +# The hooks record every command, so set the prompt and clear BEFORE sourcing them, +# and drop the two commands that do get recorded with `tth forget` (which is never recorded). +Hide +Type 'export PATH="$HOME/.cargo/bin:$PATH"' Enter +Type "export THOTH_DB=/tmp/thoth-demo.db" Enter +Type "export THOTH_CONFIG=/tmp/thoth-demo-config.toml" Enter +Type "PS1='> '" Enter +Type "bash scripts/seed-demo.sh >/dev/null 2>&1" Enter +Sleep 2500ms +# Enable the shell hooks for the Ctrl-R widget, then disable command capture so the +# demo session does not record anything: the database stays exactly as seeded. +Type 'eval "$(tth init bash)"' Enter +Type "trap - DEBUG; PROMPT_COMMAND=''; clear" Enter +Sleep 1s +Show + +# --- Act 1: open the TUI (Ctrl-R) and filter live by typing --- +Sleep 700ms +Ctrl+R +Sleep 1400ms +Type "cargo" +Sleep 1800ms + +# --- Act 2: Esc to Normal (vim) mode, then ':' for the filter cmdline --- +Escape +Sleep 700ms +Type ":" +Sleep 500ms +Type "project:thoth exit:fail" +Sleep 900ms +Enter +Sleep 1800ms + +# --- Act 3: Tab puts the selected command onto the terminal prompt --- +Tab +Sleep 1800ms +Ctrl+U +Sleep 700ms + +# --- Act 4: open the TUI again, go to Workspaces, and replay one --- +Ctrl+R +Sleep 1200ms +Right +Sleep 1200ms +Enter +Sleep 800ms +Type "y" +Sleep 2800ms +Sleep 1000ms diff --git a/scripts/seed-demo.sh b/scripts/seed-demo.sh new file mode 100755 index 0000000..2aa5c5e --- /dev/null +++ b/scripts/seed-demo.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# Seeds a throwaway Thoth database and config for the demo recording. +# Nothing here touches your real history: it writes only to $THOTH_DB / $THOTH_CONFIG +# and to a scratch directory under /tmp. +# +# Usage: +# THOTH_DB=/tmp/thoth-demo.db THOTH_CONFIG=/tmp/thoth-demo-config.toml bash scripts/seed-demo.sh +set -euo pipefail + +DB="${THOTH_DB:-/tmp/thoth-demo.db}" +CFG="${THOTH_CONFIG:-/tmp/thoth-demo-config.toml}" +PROJDIR="${THOTH_DEMO_PROJECTS:-/tmp/thoth-demo-projects}" +export THOTH_DB="$DB" +export THOTH_CONFIG="$CFG" + +rm -f "$DB" + +# Thoth infers the project name from the enclosing git repo, so create the demo +# projects as real (empty) git repos. Their basenames become the project names. +rm -rf "$PROJDIR" +for p in thoth webapp infra; do + mkdir -p "$PROJDIR/$p" + git -C "$PROJDIR/$p" init -q +done +THOTH="$PROJDIR/thoth" +WEB="$PROJDIR/webapp" +INFRA="$PROJDIR/infra" + +# Demo config: a nice theme and a column layout that shows tags. +cat > "$CFG" <

+rec() { + tth record --cmd "$1" --dir "$2" --exit "$3" --duration "$4" \ + --tags "$5" --workspace "$6" --timestamp "$(( now - $7 ))" >/dev/null +} + +# --- project: thoth --- +rec "cargo build" "$THOTH" 0 1820 '["rust"]' "" 5400 +rec "cargo clippy --all-targets" "$THOTH" 0 2100 '["rust"]' "" 5100 +rec "cargo fmt" "$THOTH" 0 120 '[]' "" 4800 +rec "cargo test" "$THOTH" 1 4300 '["rust","ci"]' "" 4500 +rec "git status" "$THOTH" 0 30 '[]' "" 4200 +rec "cargo test --release" "$THOTH" 1 9800 '["rust","ci"]' "" 3900 +rec "cargo build --release" "$THOTH" 0 33000 '["rust"]' "" 3600 +rec "git commit -m 'feat: add fuzzy search'" "$THOTH" 0 80 '[]' "" 3300 + +# --- project: webapp --- +rec "npm install" "$WEB" 0 9100 '["node"]' "" 3000 +rec "npm run build" "$WEB" 1 5200 '["node"]' "" 2700 +rec "docker compose up -d" "$WEB" 0 4200 '["docker"]' "" 2400 +rec "npm run dev" "$WEB" 0 210 '["node"]' "" 2100 + +# --- project: infra --- +rec "terraform plan" "$INFRA" 0 6400 '["infra"]' "" 1800 +rec "kubectl get pods" "$INFRA" 0 540 '["k8s"]' "" 1500 + +# --- a recorded workspace "release" (safe commands that run on replay) --- +rec "echo 'Running release checks...'" "$THOTH" 0 12 '[]' "release" 900 +rec "cargo --version" "$THOTH" 0 40 '[]' "release" 880 +rec "echo 'All checks passed.'" "$THOTH" 0 9 '[]' "release" 860 + +echo "Seeded demo database at $DB (config $CFG)." From ed6ef98d078dc470533731c0ca75d20cc140e84e Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 15:24:40 -0600 Subject: [PATCH 146/151] docs: rewrite README in English, add features guide and demo assets --- demo.gif | Bin 727818 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 demo.gif diff --git a/demo.gif b/demo.gif deleted file mode 100644 index beedbee855d49a949a2afc9307323edac947504b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727818 zcmd?QcTm$&)c%>C03jqu2|YCF7#2pXEAqJjlbEGaZ;21Gza4L#Bf9RW4; zfPg^}5K)67O~gnS3qRko^X~5K%$9%mzi*j)=gygP=X~ySp6lr3U}_c&fO0`wyLwP@ zS-7C0AX-rfyI)w2h{C9%#B@-yDk3ubMO6IIswx->JVwe$R7`P?yp@=ks+hRCxWry@ z2@P?neG({12}w-}ISWY%HAzWTNf|>)oR;KXSFDs8R!SQyqlZ<{k&?toVKt;=w4~(q zq~wjHRjg(9$jL}+$jE5R$mq(*?vs(zk;AIW$!N&QYRSp!$jRx+$!p20SSrYBD`+|? z==$PhRB&<{it6f0Vp2-7no24r%93)*`iE7dlvVZ`t7zD$m`1DaHQcMBw^z+VO;$xs zSx-&JKuy<4-7H)~(?Ub*fQG)ChRroC6>S|&6CEuxoqe`C`a~VGBf9wgx|Y`al-2j) zZSk5$cs*;pzCGT=Q%~Ps&%nyS#?eT})X3DuXurRaU8J#@vx%Cnsl1{o-on(;#mv~j z%+$fmE#A!Mi1~gm3;Pg@BQBN)+$|4y95~==ML1+-7eFwwBv`sw+xl4B``g(1*x38n z_)_iMPdivxJJ@Q^ToE$0HL?kWQUAe(A)i_!FnDM%;`!dHVV(cb`*7 z!%m%vKOK4H^rh_63AfHfUO9Uq@!Zjn=xFNs>$T@^bzV5fyjYMB6A>MA{(4LvBbNLi zKBM(&;n?*Xnb$LGZZLDH=VEEsQxgh@5{oNSJdfSHM!T8%=w|wZROb7%1a?Mh-mQCW zw^)yFJ!Rg$NzbX9%jsa>VZO*KsJffOEx2%_Ag`>jqVHkD*u#-NM(+L6s+Q8}7iCrb zWv!hR8lyhS;MS$YB+AC!>{} z3yF2by=hp3Q`4NflKxvb+f-Sn`qF{h>W3-=2kOgSRX!O;r<*N!_V(F3r_%8zNp;2EAym zdDjy4dGNkVOYQsixV5GCFIpadd`<=n$-B0)X1Y`MXdNADt^3?hS9W>e`lSBLi+qFA zABLVZ%)eyVrpddtH7>qp9;!Mz+}8AUf))DWfm?g?w|A`5dD_19o!6bVt8nmH$IrEe*Hy<}K70CWi~sq> z!-LPC{rR=M_Vwe-=g)U{0WftQ86pwEqagM&c~qqF0*{7vP@hQ<^NpBE#2#nPB+14s z%p~KI)IX)DDX5o6#xCEY3y5Z)+=Uet>1OfAo{9q8m zz7;T=?P`4ZHrUBBpra;GjstfZ>-y+JNu@!^*{S zLvuDjxR`uF#I&xb2rO7wUb&QlTGku3;4yZ+k_99iSxYsoXCo-8V;sRQaPyqzGHXu& z8zLz};!=g2MZYdL2-dPYp~E((zcoRgakQJKW8Qsi{*a_~_8Kqq^vaWk@~V}#<>s#| z?fgEi?;Y#or@uelo~!!)?Dyu^@6Q2nZT`Q>BKe&NwQ7DB(qx(6jds-j(Ie&;`J)$m zqWVXlZ0z!neq6HlDn}(Ra&}Fp z&b5;~vpz~xt66{LYVvLUwTGk5#+bL?nTAFgige%ty;hU;$g5+u)V&!ni;ZhuNQS=s(fchvnk zo8x!(=a>8wwLj+yV^@C8Gm>?87E1HZ?kqAZYIl~ZTUK_yvify@EjLb_{q?PNzV_Ej z$JWZP?`-(K-~1lQbH9IZ)E@s{9Wwd;dyVV3@6Y;}-?={T~PSh1X4Tmg3I1;-=3-}4@u0?`=oGytrej+}-2zi3o zEj`6gG94;H#d5mkclgN!WHEX-nb@Nw{Ue3wS}dB!>Dg=kmsrS|UBc=`(Kokr9<%B0Ep)H=p{E88=iSzs2c4u=C>< z8Ci;hJ8^8JSLrFPrAm?m90&8&EP8sWikj1abHHkL{!r;&lYs&EE33B|$TD?Dr$MiR z)f}d4nWo>spl{pi9aego_6esK0aL5FtwUwHu>&uT?yTmqk>&Vgr=bw(wS10ixqjZj z&~fv%yWI40!wRS2QvquQlSAdkEd#@6udLnUAuCM#okq?VtQ9V}R+vu=jKs99-RGxQ zSk61WyfU@+V0)jo&REMd#yd4bKtj`~=K5p{j?Z}nQ28M7=grm#UtAfo&rd!P^zZX;E zZJSN3jGD+3F7Kvxr#72ghilHpzIgXxXS0PZTpN|_GW|(p2|teOcloedu+_2P_V~)giw~P^TTl5JkFU+*wq~As)Fp15j?Wpg&kofnGDUK z;r(xOK1sB1_u@0_(oeX4mVUS0XF5`s89Ve@{?~Rt0aZ^= zcAZs{`N<)=*JtMq&F;1MIpC35pHt!bMf1qdLI08Z+?Js)y750>kWdZz{jPKR_kIpV zxHl9`49yw0|I8YW%4{f{cbzwX_j4p}q~XEV(ENd4KVOnjjSRTkf{n}$H^sfNSaNv5 z!D45Wp4nKc=CNMpIl@S=PC&T9s$iRtLJXBmTYq`}D7T|KI%32FL% z=uGoch%n#MKFW%_Zv}ssbT=4@7W1ldzps2LG-)@mk<{4@7ny22(*h8*F#i659Sr|} z5{du!vHSn;2+4n0qxPR!lLXim_)i*?{0|!3?qYN&gQT2Y5p_zPH?cYaJ*J+a_L-vl zZ6HsgNc|Zq;tt50`l?-bv>n?b5x0X~@^-xr6gp+ix<3%UW)2Bho3(ymf99{<;1A_j zg?iy5t~;xH-R~$B>6hh;M|cz*Zu*oUoqOtaz2w7UqkGXc19fNL=BD5C4I}(drvJy% zUP1Ey6I6GDr2Y?}n&|S^>Hh<$iYfdTsA>h~G64TqpsK}9I$V!NYHc!dN`h}y`s81H zH1U4|)jXBSdOwbQdVK;XTixz;ZBQWV%*X#dsIG;pLj^L_{7WyEE6%!1sfI+pDe0Sk z@lor3p0)roziw39W4bx8uGm)arlwtEt6o=k)NN(&!ibr!#JT?g)r(T17@v{AGF75o z&8~%{K-#40slgvdk_U{sUz6iTv%$TaQ`*kQiYN7wToBkm&JQ~w3l^|fShWa1lemQF zl#TfxP|em+fui$DZ;NQ@;erAclC393Y5lJ^)4v1RN-A9$DB zYlht&y(?aJbLL)DpT>OQ#qrB`l4Q#diD=p3q6KaikgR(}^>YX`2~R?&@^!mq9uwU# z;|l_tjF%9F9F|#j{s~5H-6GCnjR_?s=9LNlp83wb1ef0|Tc)7m?$2yN6>=vG`FmhA zQJ65K*CRY~iEE8eRQV|)$SEc)dmV}S8J>ScLTfa4P}e1^en8^1cD?MyC~DmJT zJ%vqa6feUsx5oT8sP4NjEjl{$K=HbbQcCccm%HgqeuJCrapV|SlxDaGWj+@enj%F+ z6uTNPc7%#_FOW-aih8coqm1WB20~JvSF<3>Go;rkT_0v`97N(>54r1JyjY&3zk+z( zTj{79-Q}X8%}K&Iusao=_3>Hlyiu1!kV(1B;ii|`X!(>TVjLikji@Pkaq({jQun^*JNf*L%T4zImyV=}> zJ)dsfJ8|+B1A;xz$x1@Ynwot7Z%}=nIRCW3)uT)Gdycv-wr9Ir#A>H?4?+U0H%c_y zIv ztd1mm^JT-X>q6zAvNooQ{Spy{IH-*J&_5=^#0I=*1Kk)|H zP4L*xFlt%?e3RdgB5}H~zwt>@oDApl09(*EdXi!x8!CsR%FgkvcJPkYq)9h zvA?3=3LHkFmI?*C!*@^>8%3O({w#TtNy9;a>9Nzcl36^6$`XN=|D#*3f7{Mx_Zu5p-;7x3mW?2TzOL#CNxK$F{RSi}X97y=wwG0pcu{3@84zR3v+y7i_(E7z zvY~0Gr(O?Lcqa*FLFz;(tjN zY$4~rLA5N;#(1pggX+2X75~IyIv_zl9h8dqc zBUtUR_|HQ78Fm&QqSN(NW)6PCm)dS*iP#1f35@dl^_m&UTJkj1oD<@DW~&Sa4MepL zOks2INrre`L7#d`TP`Vi-vR+D&Yng`@_?e~Ly=9XG>j!WF%kv8>(UAq_a{_~6K_Xq z&Qeilc@zZ>P}rmuSQ~<)BJ4;I68bc^)T2xy{Q}&3+vhExk$`5AK>B=J$&3736TQI* zNhX0y;yoe%H>jEza4p}5Vl!BF`v8ehF-1j06F=DuWSvCWjhqpm&`LI8MQ39JTUD$zwIz;cO>=I1?OD$7N(+D%<9TXiVMj%v&_BT2#IRNB>6Tj7p;$IPME0~Dlq zj`}uGhRuNLVmos#E!bQrje@HM8bP1xcMG!$l1xogOq@Mzkbwlyj&w$X_XXg&7(lW` zwckU>p)%Q4`oxo&Z?HhsPH{Fq$(+@R%9E>pTsuqst&<1|&j^r<+(-tr;h+JnwzK*X z2_qSs{{^bQZ@*rAB&w=TiE^2Rh`Fs7g;akNzk*9T7>K$2d-Ar_GmjEKWQ(XHVN{%c zFEa)|@r1h{hB{h#E5@`7`4OC8|Hy-8U2VIo@Gw8gsAPP*t^9u`I*R{w=CcpDcw6+8C_;?t2bv2>mu;}0Rycs z^Y>^Y5$$hownC$0d28q=T&Q9kJ|ZBLCcDbT6|Zjp7pP`n6edC?2x!l*{+_d9P~bof zMR<=h078hPiZyZi4*1)`_C}J#tophn2RUE91W;g$!H-<_SqHh&DMATv$HY&upy87x zvfupW#RtDSMU{oQ=(7vQF5;8$V?d$jMUStE=+Mj-B(05x^5)W7gLp?cQNj#5g zSjGV9a>hQd;2@vK0b`20h9Dtt(v{FNit z^%EB&^Jjs0(A+9RSV?8!g&c(n!VtMM7k;rA&x?3=N>!>BRGD=y=iuzl4Y?$mlT6h z$NVq$9KlDQFe?Hp$I)b6^Y^;-;vjNNvgisw5lh4(O-wr>WPGqPnfJpx0wAc#=Iy&l zdK1eA{o58}dKZVmE}ZT$c_FaoG65o}i4?T??o%fbw8*{nY`tQiTIfp~m@BroKAf8r z04R~1VL9$v)Mljz^MeH^d5-3BoqwZ-o*2a|K-SB%(!*qx(NC3NR#TLWwi))q<+k&6ty1L@w=RHg<7`BN;kZ3a81`YoGB_hWJlPqBz zddU4`6u2YHH;@5IqQEZWAPPBVhtZ@^F5H6$Qe)UeG9VATpt$2Uy9CuJ4=isM-dqmC z)6F~y5Z5noTe9{=Fx-<5wu^!m7=ZseTnn5`Ji48j6K%dpa2hZc^fVSyp(7UQmi08t zzbuh_HiU{7ep<5sR}|_F308Xt@|2D`%M@wgs?iw8Uv$gODAW@^^cb1g`1x$mE?xzS zfi&Yqw(vs77zbkKPHT0_K#wEN@jx^fBASoW1h~iG;D5nTJpfgl4vWDkr>uMp{J|)DH(a$Ve5{b2odNZQ+Euej6I#LCaYa(O`hI%c+i#fS$P&*b$u4tfsFNIdsy)E92n|)^^llF z^$SkQ(LeL-qLfnVVjrHrdAts?ze&XEi##ggwpMh6EDq$isPmv(W-df$f~tE)U;Auy z#6rEQ5*H}T269$UI$Z{9qYK)A_vVXrUQkp&6&KV`>h!*n^$*dl*C;&mq;TkM;fR^2 z#h&~5L^SoJ!nl;ym1IaWOXMd*AXO>*2uD(WmjIE@^Lu&u!NT1KON)D6Ju#U0`M}0n z*_AIa%n(8@ps6NOr%IsCqz7MrJ_JZJK+d8B4+b<90v^q_s%Idl7^ocvTDk~b2@T+? z+Yn?#D-X^LNKWcAL?0f}hlBa?5`fLc+Ec~4JH>eE5`FU$-8PEhQn3}Q zNU^QNa;oIO6>$TCh>f$zHVf&%1%Aoac5W+m9*pO7#k&XSdJL9&2bB3rm-)6`B^H#q z?35hcDI-ajAHbB_I*YUrU{Z9D7DM%PK{nl3=Uki2nM%xArSh076>$X>hSue_SIVWL za%6%Fce%1!XfVAQM0FM&?ld{ItAt5t1BFV7U(ytf1c}}jbiOdPHzPpmPG!Y|ok!j? z(HiKzC2t=2pT}I)EWK_HE|F%c5wx-BDy#<(%LOX&Ku;erb)rCO=tp}fRpM;mvmLR| z-uD!(bW?}+A8f_S z5X;)z`biU{BGs`Atk=wcG~U)=d0N!j6jJymTBkk3@e#DK(Hql?!q?l zeH#$5+^6dx`WHjsQVG_ioR8+{JEtU;sx=<@$v>gY49q)ny@70#H)rwg& z)puFITn1{^qVx{~#pOdokCfW;z$YugKDYNukO3NW;GY7JE(s`s2RJcM>vW;Lbl~P! zumB6W&O(~ef#ztCIpJ{X*N)ekxhISFUfUBIjkjxunKZ;>3W>+sV<_2am~h+l2rg7O z31%YJC6{&5Q8m<4KND#Jzea}z;$g7>_~r1*0&{n-ujMDH+P6}x&ths`nD_9!dZCa)%DHsy_Ub~p1d>aQG{ORKKxY%@(pFaJYkx=*`rSH(ZGX< zJh(Gid)S2t>!@ zb+Nch@|USSt{oi9YCFyb))Q3?kfx~P4<4N=4<`YarYgm)nFg%qU=qOELwKEp1d~8$ z0vpzW3@5;lJ`i*INlgzBkqq%9!0-&PIteIL1)Gf*8vX}ybf7i6d7K5b<3sJZY;((| zL_x5)VXkw^Qx~d0;<6+&;@vgPqgc!U)HXrrCP76 z64s&6UQlQ(*J#2LW7z`6b6vygL8mTotvfF0vA_mVT=#(sB66eRL73Jq?t_LJXw9(v z>?x`J;OdHqtFK2LxIO-buf{5SCH#VqBKr>i;<`-_!*;K|dT^-8bc>5{wXbsUhf z@Z%oP!H5kXPO=?Uc#7%B8a0+{aD6(eiF;k9QEyWdo60$*?9qJ0Q@2e@EZVEJ(^d*bRiHBsgln)6wcQ{>6afCF2l`1Es>}rGTz&6q09KcH8bOAm z`Z`ARK+0_BgBM3*eITI%VE;+@#QT0tIbPfj$CK?JOf@~$;nwck#$LBoWkS#MKAxvT z@ppZ1;Nds8@EdgaWwK$|p^wCO&K3lw93UZx)EyhuAz=s)Xz9)$89VzW-Va7ov= zwCIMKDAvq62K+0r{fT6s3yZ!t*&5i@_Ni4Ykn~>i!ORWxzi`{?w|_nfNRoTJFY4}u=WitllsFm!W*p8b7+ssezuJ;1fHli{b4 zc;4h+tWGyjT&T}r(pF=O1Q+AVh)sNa2P z+W6-fJdgm1X1hoN5)u^QkpxHt4#&~I5_@S@XXL}}1HsOu&cx3^5B*^JZTRshAI&Ie ztOwk95*|bt0DV}&IrCs245i?&8-O!^eN0c<91FCCm~fyjb*Hv&!wn0eL3qeW5hyaM z+h`houi}X;9crGSaAw#=(8liEbcPq(Uw@=iiL|1aU}hR;^ZBjS)n>v;F6d;o?>}jX zEjhcK^GTMLdT^JoGu!};1P~}ds9KGcOMTlp-n+81Mn^t;N$w+E;zKghyys5NT{9mn z8(N}tfE39SeWd4~$0n9YNQ7-3K zBnli{OlldyTvK)qB87@7f|OaO|GtN&3~tprnEbV0)9W9PA$rBTbhJ67F{?@^k;}t`)k= zhV2zI1kSB|I#&_;_Jhs>mBfYPuSK+dkMIjIJ^JO34i2QpfHdc4kEGC!b>B9<8v!V? zwNF;Rz+517TD!=r%X-s!O7l)aq6Gd$>mMRXg{EqOt=p1bvqW)=Nw(Ch;_giI(DXta zu! zd6AMMa9&8kQs}_hM^$qiP?q(2rIZjon1H^ND9L6bL!(0#Bt*SSP7EVHiC^Eft>j&< zIGBgVow?Cd6Ot}V!MjUGE85&F)Ux};dW#tqNE2^5^U+;zdhyco-p*w#D$MDjntGu3 z{Kz#Nra|^<$s`bdP(n5EFXP7*xkRM#$)qq>U{a1V2#iuzSE8g^KFFVWXu`$@!_88N zzzowE9yv`Ylw_MK!JyLwZ#iI#+At(uS0>nrP%NT;JYNy4@|)3>C_&CINt1yEpfZ#! z$v~t9!xRV;e`Txhq?#92@1*uHLEl-UqO{&w>v501i%!dIz01Dm5Cd1eSS3ZlmQ_x- z&g$7oOp9P&iY-FsY}(1pn`48I%_Rm-cbbS>q6GyhUXz`f<-Q)o-Qqpo*cm}HMno_~ zYN?eAEvjF5ZSveXo0bMHO6^2o0_Z^Z%E;_45jFDi0F03v@mWYNb!kjPWYVQugBg-) zU{y_h!SPe+*Gv=K>Y<9D%3{MKn_IZNI6o@ zS1XqCf@iHv6M}hGDCn_=NrIE zD)5A~$HOd_ug*?MCoGWOF{E{qU~iPgP1+7>q9I? zwl&JIu%M{zmWrElCOFvRr@iDSG9PZ1gYN87(7zhG3r9WK#@k^;M@mFmR_LL(|2qv_UfzZR#6dH9d$m`##FiIKfM7U!OB&9$FV&IxM5#r~D5hGrqHPdL zYz}Q%#>VENsp47YO8Aq-O?6#~KXFP{46&`7^Jd&u#UgF7AmB4aOD`bIAdd_bHcQH% zZoYr^j%}LE#cf90)MjW&rV>fTT5uJ#{K&K@OlL{S*nqBxG7RC|PtcJV2VS^UqGH?= zDj2P{ft@l8F+VpK6KhQQtIm92JpSUuD_q04GXY8rw_vmAY)hV zfF&YGxT?A&RBLbksh$R2+;?zImq*+ zV7qWd)In1UKX-v@cRTY}ei1CCwoi=tMr$%vA`kB!W5oyd*eePoQQ(b5D^;rGeF zb#gyokcGX(|E~XrNrNI-wLW5OIM@TXKRuX=WE0@?Aw&9XBYa#KKraB4DLBbaQW%>N zF4mtppUb0GqyvzVSgNo-{La&!eWq`-Xq<#Z8JX0CxCp{qEAPH~ji=Q@7KKdhXl1ZP zsp5$pimJ~zoObXV02xgb5D;x-!1g0xKIzgDkD9@EgN4(@qoyPr#7bFj3Ae++Alu`7 z2ZL!GR1QEby1rf^^w-v_{8Xpn7jwV1@i(=xy{C_ERH{tpXqnltk(Fwz&Hl3M(PCQ`aTDG5vSF zWqrfzOv}s3YSRq$q=KUx9(hl7)@KOwKd@)1Wd;&441bG+ZmbO+Ec%C#GE+Dnq`CHN z^l#|(E%S7XKR&g{YM8tXAK1Z6geAEH14}4wO}Hqa!~)~kE|m@PJ=7^i$ho7TPPA*I z2lzT8ko$g+ohC_;tXe{7WIn=aJ=|Y1#6TrV1}vRW8G!e$*{dgT#HA#G+92BLAT1zhDF(PylG7f8V=-xk{LI^RrFX#76{fs zu<8-JzkS|;W+FYsRF}LxfCjzMa6fJr^mJrCnp}j z>kdB(X<)_02RIsr>Yxzrx*F#CZao3r-^-X(5GK|58c6^6`*V%{XPJ`mmW zTci4|4>Lm7LLLTH-vLFQ{AxMvHLr7?O-oKceItC~V@%N>={9DGZl8KL$cqKQO&3q? zg6vTe4bNp;^Yq5mZ4pcN%2GC6Q8C1UGvj_ZBWiOl9g-qp?kqLzX4#Symm?ibIQEzUr-Tt}aa-pbSsH0yk8j5sc&!iF;abnVC2b&viDI zFap(OclMZ=Vz4W;a84OeCma?(*?S^asqvy}`X#t$YnM2W+o>HEjF7{A z#?~{SoDA!36+T{;mHw!=UQy)AJV<`lqrpovwKeTdr%cL&2;|5w)H#Ovky^T*64~ub zD92VhDWcGlOcBzTq8(C6JaT*~#zMbLQD&(YGWglS=5icOJ1YTHacnnm=29z2Jc-|I zBlm2n=vJ=jd&i*A$K)eRq+~rC9t~4Un*P+98%x2zl#aWn%g5SD4bmlr{CQ8e2{&|m zYOLb0Wax*Qp|(0PPZ8FPNF2;5DwmvmV7&lE&2km9Md~fY;k{(F~7jvAA}V^@rk#? zZx*jDC~DS&nNGBKkH}g(z|SmA3kKEHK+}>#b9VyAt!egN&XU3bAwvYw8LCJaSZ9G@ z{1&J|r!_AyQ;BLHFx1LJ3K2o;lCePqt#vptFm-`iwWIe8O^x8EuSha z*x=N|79wA%;Gzd5ar;H+6b)~->647fw>A$8RR1inMSg=}%QS6*R9|JU)dE#Ip?0%Q zLV@(`t3ObV3{>HPl%i6fasW6UNQDoS!vRh}Kyn;1b&9No2kYX%rw0HMcy&1zK#D-s ziR;rR0)-er6##V{N0#2Eo*EO{cT=uP!|tm;1xp52+H?w}Q{-Cj1cPUAivzN$}YtxjQ+MHH0ako+*lyx}!ii+m_C!F+jrI}I3Ylc*13h>$(;@VJu zGl*mJ+wuA`#|q4OH`y;8dHu^UTH)X$`Y#v zhy}95*%YNLGUtJ1Ywr|LnM{$vN+sB3_U~bvGQsZ;Wv8iBlI>cr4b@e-rd=Bwoah!- zX4*}29kJNEJ0Z@r^v1&J0hOCXYAG?JgL4DPA(cqzr&vAX5}H~ap2qFRa?(1`{V54R z1++tSBS4u&{$Y!}rr1o?w2E$Y6^c`ki^w=_rhcu+QGBu>-jevT+AiCJGH(4MWOb+o zLwUSMKG_?O!HToOvUhu&DK*xV=|*A`b6@)?;gynxumzDB;l}eS3lbIhX@CtnPnoGi zy@^Dxv3im)wa!C@E!IFLM`W5SDaLm%346JD@#R*+%QnH6DX9j_t;3%TZ~0bd)>yyz zF(x^G)eO}xQ?w}iJgUu-o#XG?x&9m8*dzQA!u=t}&ANNg1(J3j_egBpd>LD-GQj=Q zi1|3_zN+o|MY$rlBU8%X;SExtHX-Y2ibL|LA(}b!^iUc~UG4Q4P=Y=h)ic_W;<>F? zv90n-$>^1`{VNrpS6c}pCoaqJ%)PpEYG25{`kF#K z>7UtmjY83VpSBBlJ8Bd(qMG>H^v-Luve)KKukq0@KBs$KWu~2I?|acG+I!XWssHPD zDr4=J1+kv4Cf7XepT2fX93$Qtb1EA%^Eqgm2-NfcC+jES2(;5quS2@CcQg-KUpf?U zif&Rf<`e$L_tG1`#5ewOvT`Ypp{;=69v`vyqW1fJ4sX0U1|27fj|Z!ctLP1HJ#nQ~ zz6uE+KYnTaMB;dauD;nO>LOGoACCGXJq6uD}t;G4|2GSD%*Y(Qsg9QbYi zows+th%y)a4y^eXygA$^EuGSOAB~+zIw^-*APYrIJm&gh00Hrdse*`}cfml^q;#bi zu(;-?rQ%4X&r6%gi7Kvd{QI{o@poIYh>fv;^2ki|#Etx^I%pt!@okC+RgFW{;u+RWQrfC4)X6|M%7iwLN~KZK`FnMEAY;>1 zU1qyntDx96r7ew`7k5jQOqC;3yZ<^tw@%Gq8I0;z5TH5t<{-vc#q zpk2lMr`QNA1`(t~rYdk!#`W5&0)eUws+_5aDlbrnL7n^~IR1tD+O0900Wy0*Rmca{ zFzlvOKjMF;NbeEFW5HFYo8)ea+&#^{-`Jz(oofvi3O85V7K>Gqz5783&4m_Lf*Rf$G#K#XdsS!>8;T>`*>x+_WIm z)cvXIblSle2n?Z3oB2r_vA?>Zu6M1Hv!*DFqzK_=ZH#Aa9cJx(XYG&AI>gL6Ce0Fa zXPwGtottM}`et3nXWiyz-8W|s!oGM&eDT~HPCPm#$#i< z)sR_~%>tWxfC3(TR-~7pL{nr}r4o34O4~pkHtqDQ;HF8S$%k;Xz&(|As(1<_4-YbC z=P%h%yyoW4ZqA*9%|}VhM?VW=T>GRVKv|&E6g@uJ69e28^{?~k+(+XA33qRO!1al5 zF5H4G(j^wN_AX`{FWz=o%<)~kb9^y3W-%{mF+X?lZuw$C^Wwd}#lrE$`*VvAjxXw^ zfUpZ>l|_K6I{MVqU8Mq=VH60(1N>zlYt<8@#hC9YN!i~GK=}jg0}iLM1&+A`HS_C2 zJr7ok+T0Hj(?BR9Nfbd36?M|>oHXD@A~@iI-Qd@11%S-Mxv$SQzdna8vn7^0uP@@> z0o&bfp~+N>e{Kwas*wD2@8{1N9kSTb@%WMXXKkVCli}j*uank_nNDfg?K0U5Hfl%S zO0hyqQyXTpSPj|eQtpF8AxBvLKw?V5^!T^;bKiD9Y<~L)Tj5Ep%nw&i5FDMvh0sSm+g z)#_i>o>i;4GuQ&FOVA#fnF5 z&^LA(t;Qy&SfD|2De5x)^X*b8+4weM$6j-5Me!?5MOgx`YY|CNsmTtNtu{+H_+)2C zunwKJ&tI2#sO+NO)}<3$F|k{*$y;%GTbC=guC#2$_itUD*t#~qb$x5=27H?=xlK{q zrkccEe+=+57k%devc*vaJ+ya~1S<>h#gCW*s`wnx>H9gJ4}$sz?gv_kGICntr6p1n z+#FBe5-h478-S-#aqWhNJgOeHcgkUk*8j6`;^+POpAWWvKAhMxZxp%Gl!5YS4HDUu zJSb2)0J3bAeG+$1rbR0AA_YY!Z}UYao%r;fceBwub=1pQOm7OS`a31iz2O0<>C__t6C04e%;wTSQOyPLC$xAvFBkV6w9E$I$5EPDZ=8r68ez~e8rv=Q8lmXh#yLQ>Cz_Wmlu90bLdKr z+36`DSe}je-WdNzTRVG6T}wJa*^!fhQE8pU=!Yg`>qYiWFB%+oEx>BUkne)$nbxYZ zfxizGfl_469NVW`>q4OU7Pd3InKloI%mG^ug7+u|A!BvW-9zW(mhOj+D_g7IzHaT~ zv8nJqx{=X|DZAC;V&--~LNN(xS{@vPaz&@Xsda#)%VY3u%&$c<|!ar%6$u)fH9-x-)8FzuPPjm6@`sD-;`7O zLvryfhhzQvuurV1kUQqKf$1sPJ}6n!f-fE3qYs3C>p6#v`D9Tc=+H1DnESB|Tp~G? zFxn-2f|AvTR%?7iK}PmO(_F_+wkjseUD;MlQA}0;B#6N_PTFSLzoLZY3{d(aqZq+G z-uDH5z{HAb@CAbMJ^uZoLq@ZoWkQjoT{iOgJ3d#VdVYKo`1=T*cvbLK_#JpaN1ZL) zRqEz!%5HF~+1|V1m7HQbab|HstoSumD&kBr8g%4#^gkQu<)ycU2-(@2Hur>!xWEUL zwkYaDvhhXrNOT4dC>G<oMbuTOrT@C}&x z35Ljh-jZ#~=-a&^*L)fC52+t6+f=h+#wo>x((&5$1Ntgd(aJE%tb$1A%{R;@FN>@Q zvBTn?%~Frp-m*4CruLIB1@XFVi{|qh%;E#ynwrdj(xo#F>8Jf#ke)|s?0#1M+Q$Z3 z^lNLrv=P&Box8%fl?!6y@I4q8OTFGZ^)i~zg*vq!+p90L9VE@YE%gUf{hV2yBK9(; z>vwN~PU{cpy|6SG7JY=XZkO6^h;~pe<#i#Ag!UVbsuo#}4%%xyHGJ)6@ol0PL+Dw1 z?Q`Usk=+CF^z{Pm&_70#!D&H1hQGN#wd)A2dfGhTSn<~AUG$6nChz}s8G)g~o%ibP z^#>Yj*yI!bTd}$T_tx^Wwn8SKGA#a@&Z^uALVWmMJRIwKT>-`74ckBCe!P6+K>2vS zL5`sVER)XV;uosli~@z-bZcAj55Ol}<;t}TE{g^_5PG6O3=+cbyd zEkb=S`TW-Uz7PTx>e7?gK`3tzcQ|&*)PhzNRxB)u`irvw5a%o4?@!)*li7Ea#&!JX z-HglorJOIPk4Cfsz8Hm;ku_pCHVC!}VV*C7jN^3uB6?|OYO}6i$1tD|4a{P*md=+f z5+HWuXNlS*)Fi=CRh=RBB3JF7^fL2QMWo0@UTb|{H zj_bW!(*AI8Jco5Mm4Un0S@O&m|4(NKwhEXP!#&}{ZKQWs{W}hWBp={P6B++Ju}(CL zBCwk{djlRc5GFQ3aVQJjIuXO`QE#p`zDuvprVaK z<>$sa1rh9&tFobpm4p*833kf)NoCo&R>%G4I}cXi#fgR zk!g1kv_B%r3=~XFU^282>OhUD&Q$u}1PCIcXaCWxR}r;airkBflpFd~VT2Oeb@;yf za42~{b__`n|9Iv(eE6~KCD0jlxS?+4{tath!R|^F#OK#fvubllu#i9vT$2T{kSztt zMOX`k%u`Um)6G7w5d=S}5HN*=bOWYbVM@9K>SwY?g4b#3Wh17{N5+83@mojYmS=mH zdNnn05`y^+RBSqKfS?ls4%6%e1WIp?+)!kzwT+LwS4;l2SuNc;X zzNwZFekf)IQzY@;H|!^zLk=*?MKsOdNH88(Ct3?S4@;lrWgkyo!VF6K@6cF8wI?;dmvkVRKE4Y zl}Xq5N#LI^K=~f)@*?00zb`TZb}EeH8Cp*4<}5K~$Rs|WW)Vn}5~Cd95)2x<&BthF>Qn*k9taM& zFAl8X(QTe@tLs5VR0CKW0DLRWEFGjh+pTSC{c8X1nG^t8g=P^2n$%-!RsS!J&ONTh z|NsBjwQJ|CZPluEUhA|{Sx24ZS|_Qnl1{=^k|f?kDhk)O&L@*73G1i`laQRY4oXfd zA;-@OiMKZ)#M@iHeSiP%kL}v+b-12~$K(E#II+NYhBf0Mux?<0?=+u=ge=&-!duwm zc@46u0x6vU$ben$1XwfqdD^gU4dhw(7#M|J1OaS?Ng$C)N*65&3#5lEr>4l7*uZA9k`s z-fGLM(0pvtLPk<5b8Jz&#xgwNfhZRohHPRLX3|DnC+OV{d3OZ_lMhgm0aB5_r!2tb zs(88fG3W#6k-Oi42YHTyLlOOp62GTVW_|C%n#Z``fmkb%OS0}r zTkPwam+yG@E)9b0-~9jn6UF=jnSEvk>2J(m^G)i|&^AE(xzhA1Sl++b>?&VnQe>KK zy=q95P%cf(TbBP^wE9tS)vcP%o_tD^LZ^;xwI5~v7Hysd*G*VADQVQ)a5LVdIV&G$ zzl5`qAN@!3<#RBFhl``>5FN0g(l;jA%`qJ%+V4y4AFVZ;U2m>d1|1zpn&5K|TCb@c zpq25{TqaFNMYL9coFH0za?(67u3~l2=2#nC2fQrrsY#Sg%p)bWNfE#6O~%QVgsakk zG8D6=d2Qqgj$siLmy%#sygNj>^(BAx7Cc1?GY4(Vcqyi>MyGe6%=8m6L;So!6W!4_ zYaiL@yylz93ryso$!n0+ic;m)#wwPvT=d^RKu#)u_036hwKX9-ob? z#1HUxm&uF*a+@778VXS65$84k3;zxLuIx4D9w=!t(?yyCCyyKoo_D$Tjkw|50P zoU=87)A=)epaBqEM8~>gIjTzwhbu&uTpq-(Tk#3Ppb3Duxa70SF zBFJnMERVvQ+kpw(N^L1DssLBq;WK{&|9DNAjEU0oKInZ{((?dqt4RHDn<_1SwVZD} z3TiqEl%a=2^n)pL?TWhK((cwZuM^AO-+hxDeYQYiQlrdy1I<$%g3@8FSj+w7;r%+j zK17Lby26auU^oq9%2vC|K!d=8ey_!cB8{gyQTbBUztMD8nD2VEchAzgBSpaN&20;`7$+EH z=8Cj6>3o^#FCFEtTFhqCc`Gwuj6m#zh*|0>XHNyU4l*o*4J`Sl$9uJ3w>`x1y=1){ zwo-pu>{k<`Fd0}in1)nkCVZUKH#80sDP_j{3VLVzjEXCfln)qSgY zH8$#~P46pKI$_^uAZ>R<=AL}r{*v4^k(55*!I?M4*?``2K2rghJXg|$irfk%H44Sv z8B1YSzW>wzzb2I3uZ(Y1tm7BmeVM2A+Tovt;QcQVlrc2vk1}rA_TW}JmC>)42jjx$ zQ1&^S9Jl_A3DC+JPtF@iYT%dG^%LdzHEr6LY8?Ew!(;&bd!dM6Li8FqrZ00%J*<-# z-Wl%)n?`jZBkN*bcj8T%sc1Q=s3 z`pK}UMJZwuN`{ohBQJ@7lYvyhn#m)EoF+yASgz7EFN~NQzT`X{{ZeVrsYrYy+NMJ& zEiuPP=7$u`C+z?0>P&s-%ij4+K8*@n-ht*fG08j>2lRSJVMglb6#IkiZC)!dDu8!K za>YhrJ=NI@XJ8FuUpFb-J_ zO!56>Ogb9{N6&c@O)1<30ez9jogei$RhT@S6FB~>)CL#{$?H~Z#a~S8HfAC$x zM5b4f+|l(}9`1>Gw4j(c!X4N0DThSy*L%mlwjL%hn)n8RlOaOwO=`ZWqHyhqtNHoh zt-tjG@&@z;j)dqSc)|bd_WTq5%DOInhi0`2o*70$*Z~)Gq_B2vRz4wwZ$5ZNN*%a4 zGI5|5e()iR^*H^CwMb z)yAlD8~gT(()>_kC*OKNhxjO=4y6wA%@GkHcSoz8W64u~+yVFaUf5Lr?M1K%9UMql z#K(M;{Wm!=a&7nA2Zy3=nw}rV|%9A;WWK@KQsUR z-HQDl0VS@mmh`~}TX@r1%w}zL`~5>&os<6yQ81+|!nz^P!I)R&066;Dr>pm3t#OcF z-d_2=0ALlN1-^(7-7r@Aykivj75i8F}7+H zcP!V<&ge$0p(-yh&{>hwUrl0)f-mTTzo&d=e?;sbWn*g&(G=`XXg=5TuxKBdiW=4Q z&X4u?P+>e(R&L?VpJ!mNI*6vyC$SWT)uI!#CZDa#jMXZvA~v`fB<9m>>cYZ(<^Vw(*%?n<&>x_XWMEBa|I91)QHLd%)-{Svy_Gee?^89RT z=G5iz>6=NJAn>FRrti9Ob@F5*(6Cq8uvlrWG^et_y(W+1gQ~t|x?PX~wcCGv@i=an zD$-BpGoNe2Qs4mLZn?32WF0)-(@)lpob1~wo>&`HYTz7grG0aGt^NZ0lL9_=*>Sgo zPQ}jyDItZ{nXi2}j)Ng)Ua_&QW7@cTNB#Hy8Ffw)_Lr0`-fy$AyXswJfo0R{;&qIA zqPF8QhvJZeIf!hy{Wo$8wOU@Qz3LbI#A4uHktuJn!{uJw%^F|-=nudHTUxclx{rN3 zBNGWnd{WZ0xw&09(iPlh;_u%4*5Q_F=M9gp9^Ss;{&Cl{Mbjq)*xLrH8!CD0ZWd|N zj9xUZ%p+hH{*!%heCxUb96>R(aVRmMA2qwH@*3J-kC*SP*_O^a_}5BpV=VX0?R-gL zq@HPw)W4wY$=S6jv5Z1Kdr9~1x2XnOwRXMJGN75bZ936fwD0ew&o38LXqXCs7!%ti zvI&zeDX9K3izqRa7VcXUTuDv6#G;_P%>7Yd!+o|6%k$n*c-!>2M4QS%Brz`!ukSKW z2tcGc$#cV-(csDP{4$dymPMms0>UoaSi3Xdh~GoXKax;z!~&Y^_*pr zZpJj*3xY`6PQRATTXf8`-r{!3tR}$v!)nZDAsYOU&lqdG#ODlJ-(>13ov83Gh_%4y z31ou;)v@?QncJ44ddMl-s6kx)TG)WA{#aCu(`lNjf(-s_t$(ztafkB4f{%kqc!74u zOq=7!8p~FTc=S*`6OlHQyB)g_lCMn->&2%Y-bN(KD~RKHIlW(yJg)abC5JgQx1-&` zbW4rwiMRbK5SQZP&T;0vu6ac=N|c|>H}v=dmG6r}!4mVL3?ipEy}u0WG4zXTrKgyM z$}Nx(QK?Vtwj~w5GKB&{|CcSsF}($4M9v{@Tj@~iX79EW4JDQZ5=7u%%vuI>I1bA^ z`FO8iiXN!rj(?cr#pmKMr|u6r4G&|^M)S{j<`EN}`b5$q(*cG`po%7VKrrI+~8t&_vWo8m3D^o{F4A?@nI%Secu$ zHR)wjUslut}iANMVmF9)zu6DX^X%?XVt+s15q{!oK9OxJ1 zW9UE_*A^XPJzd##qKut_v?`eOQk=zecGUb^a}xcr=|U$~;yU{pK<@(k7BNo|{Rz|C zeQXS@wp)gU$KnjG>*gzp%CW%z^(pY(DG&n!T6I^Prv9pIa$yn zg?CK%C`92EiG)v^4k5&KtgDU%u zBfrx45RR?%3OEs;2Sz=*74eJag()={_GbqI0vnQeuz_LkdPl9>)G`%oG zam1u+NGn(Jc>6SxRv)JXJmiG1-`o|)i{D@?kwsoSJ;+f}S?Z@LZV41vI-*>Zy^D_d zf&h{l0_L^?v`EaeptdTxFTsk0QP^-&IIw210)SWu^n^#Caa91_0oHmqhS$d+C_lEE zstx$h|DdFDu1=W^yiwx)66wo@?m!MJ*mSz-M26KX5=I7i>`=uW{#bn@%wnRUa%7Hc z-Sokn_;bBLAuVv~OeVzCoJjnD;@v{{QCZxB_A4&fYY)QK>!vUUFWE~xzF&&xfIX%| z7`(?=y+bez-l;6c^VAmf)yV(Mp?95p%s4#@4q&EyDAa6ytOY)Rx@Ll4KPAKYsC#_h zNZXyt#>tqRnDZQ8yjy#O-S=9_(wjg*)|XJ+=?r~`(<=`sWEPdXyJDTPp0qp9=p5cQ zh%xw}LwGd%g|-)!l>OU|E%*)LTJ8jxPHrr)V9avQ^>yT3N^s>p2kD7slCJkf(d@vH z`|A{v4qEzK2RQK7FRQJxm*19c*rufI9mG6Jmgg@TOQfz#bwBIzP<3st&aolw2!-?> zji9x<(Bts|r~VdPx?-L3Wb3|09fC<@V5A2>TWB`c6;s+SryNe%(nPHSBSJaiVX|B z5XMw&A+Ln7{eJGFr9VOnY&`3U76@rkxt!q1Ru+e*mQHp!syE*TnqD*<2CcjD7TyyT zYcVX%-wxI}7!MPJn|e)K1ixrDDro&{iJ?T^=k~$51)mJhQJ<&^y*l=5Wz{?e(^3iE z2})9gtk-now21y?RFc{iV6ab}C-_pj`PKjvSB&9BV((1tRUk4L%rlq4EFVB)1GHGW zZv~u}+{Qi-GbRcx6Jm~r8*#I1nkJWoV;l$TXVwv&!@4J5`&60HQ-q%RQC$Y$W_$G2lc{r0BX!a7>&1#}B zHZoYj{`&b@d)CkdHTC6C^>;!IL(<4+Haz(gm1618!rVc$>L#L+!Hn&kY4OVan; ziQmU=;f6lhzGV0PDgv?q@*#wP4~;|AggKyh<~5*|fqa1>+>C$1AAr7Q^RFUyO6Wdz z()~MkI4PqOw2!bYR}0^YxFGDlJQ#~;#9jj0OE&$NY)ctz-K}na7Q^*e{U`fJz=8I(ZDh8)SJ%Kn`J1;-T-EXZTw-}?7PT(CeiFmBI{;@;YZNh z1|YTa&6yU2+$GErzWGNBlUAkq#a_aMt!vUPs0J~b;Ts@ZAT-gufS<{|C)lF)o{^cg zf)wUCs0G;Za@_2_$Pfb_2|gE3wxYfqHxVN1{2|;UA-!Hi2$bnu3$QA44s`I3XCQR- zN3)OPCKwRnSVD8V0M^TK(=YXAp-KWnraha;>PZ8Q63r{e7bi4w0~@$34itiF&yIJ6 zq6WW3#@RBW2@w2o+;moCUU$xn$tN5dHvYgj*Lcz=m4CxB=N?#Z&$zCU$mkJxIa#4I zWMTfd(!_ooKh%H50p)xZn9D>oC-}xqxmDYn8)c~qmma7ymDIo{%MhZf-+H5t%~^yL zslZmlwhag&5+Sv+A)p9HG9LDQ9Ft~w7MoTE9ny_5Fu2dj(cSZoP2D?V%~9}w$|V3Q6w)PwP3Du zI@;l|1F?@mp${8lD}yov{qbp)M1{)AwKsL_i~YKL?it%i$JpOJQ?LgSY!U3}`Il{} zF1~Xc;bZ~1snYt{h+Vy=irSvmfDHNvXX!7oDmiakcz_ry@lc+(x-H+z<7jPwtxOPd zV7(R~Vuo1gv?~bFGE9p?Cs4WY#R2^czIF&o1QK=bpafqT7EtP5M+qACfCtP75$S)I zX>AkHfuf(aoI}9?$)R4iO0mcUB_)h&w>RpOnwcaSUY=+=XTpbr2qY|@iMdA&M>l4d z{*^wUW3R+}u9%EQfn5q+0T@)U-!4+~GK2w)EM#95MnB)e`-GN*CR3?rsw`0llw>rn zmt>(o3w*xFW=;dkTiDEx>~^*+WPfLfof-^LK)Vz=vGv4In3}-XhGBvULJzc9{`r7@ zl8Ba}z%bZU2fn@ypJv9_ZC7I_2LLRJ!yr&BF+Ui^n#i<#`OI(&I*hEzSb}qqVW+F~ zQ~A1eYMlLZrX zTnUi6F@lc-Fh&4Ybpphy<5>RKq9}j^Y;Z>X9ZNS**jU+mKb#t5*y5uB5U~c*{a0nMjyg53T3ll=#+I(9-pH(_XJPR%7s| z6|s-faLDgyHg+!jA}0`l!XH5)GHukt@Mf>@fXL9T9yIB>9*E%B?Cz2YXlOKiwLX-B ztWW$78p%NHO@kbSJ_9qd>&+A*k7&i2iD)3S^yl@)Z4@=weQ@2z$15G@TRRFiZK@Vz zRD0z7;OxoT6h?B8BboCX&q(uU{;+9>TDHt<$g2NAZR<~b-!mf&c6euzUGtJ%f-h%rx^9 zTd<7hE{b%GfVwh&D~D`cu(~kvhk0yc{*O!X#LW=P*>q;u)J=)?c*}B*m1yjz1DA^S zVXWi6MU-V1FJFmoRMeEkOxAf)T4PloKSi}=k-Cu5hdrr>XG@iyWq+;ry)Q@}cCg$t zxKpoCI8yVo=aTD7*4`KxQ|TdkHFmz^M~-t6Mq1!_7RBy!*>k{IG|#`>wPDMR0K61& z+OdJubUq|p2G4^#FIOvT%C0PRzsItC+O=kE%w=@8!ad;dc-QVL;rr%D z&0Bi2uug55_9wOTfs&fPDhmzm7*Ece{8>AXjb(dPUV2io|4C&Gie)_vp(wB(E$6#- z1_wQ_AdMEWjV96-om@VdRK#; zQQ1ngUKejnUR{Ee&|q z^?gjyJhA(h_@WW*+Ib%%fd^5Gj9i-xTlb4wPxZ6kr?qV8%s+g&b^R7Mmu}x{OEFEm z+Q3$(mbjei-{u%`!m;5L!SmGJUB$+`noQSMzdc;MvbK4>K3?-5hC_>X?P~kSrG0Mu zFHW}iSrHfed|-E`mmuELGQ~qaACWKo)w=K%#tivA-Q9MObK>ETb}d}Z>G+!bqITxL zqb%_${w>{*dSoMAZ-xUE_nD$dam8*f%a4a@h5v5xNvecGOy<2y>X=Cek?CYCk z&jhVItB%EBQxQ7W;_54fchr%bB?!iBRq(ZT1COI6by4+6OLcCH-d5Jcinf|cY=0v8P`r&Vghv3Dte5YLiIl-}HVCG>W4N!ot?e*J ze&w|<3gP#dA zVX}UkR7V_W2X9z75z0-?O_Wav+ z|EGJ-2<~PAe#_Ce^|@mMywme1>fOcI8bl|9uRr%2fT$cO6wwY>Qia@y$DiEZk2$oq zHb271O|cZJfpt3Tjk}c;8heFbU-NO}XQGf6$D}_94BkUc#3HK33z=;6;0OmRMzuo{ zNypxF?%8DY5jOI=z_}iO?C-2Mp|5p}MEKtli?Uw*D)3xO$5kyHPKWJNAfmPJmhO#z z_2h9>kiXJ#-O_%Pl`<|V8lKn0Cb8LRiOy?%_S$cnjqmOWd3){h zigUf@DUC#LR@65NTlLr zq!y7u7YfzXu1Sgg;fb*K5262P<=&ASgH3s z^G&FX0gqD#FXO!bU3sN|=iIO+NYO>os$LG?(!vFXsEJ6uaTDLTvz|-?to*E+?Ez?} z|AnsYkhS6n=VHp#Q4^u)JffBg6rX$`9GOi_2U*=}&=Xk^Hltev(v46YtnRzfjWfEv ziYf;6*~B7|0U$0W>D$J$Tb+jtOm$5>J8M4AZ|Ey#&Wpb~OAo??{(ujw>-`%jG*fS3 zD_Wl)$h7d670nHfyeTnsjg5w%Bx%Z|y82T)v)aQYWDBc`8XjDJWm9tY?`Or%Cr8_& zEW162LF-bcUB-w*F$fjv>aIe#Ph9$_N1YOWhxt5eUTMHtcCl_hr>Xy7mfM=PC?D zozkAuvNb0biOEn={T=J**D3)8dy$Y-#Hk2LDz-URlvKjuib8P_D>d+|!ZsD3c_5sV zZ(83cQfe)TWkc+G;kjO&FzWbtA#1;etO;|^|vwueH7k;WNm zM6KKrHw=_lcK)`ZGUQc0#^esKhiJqb?>F2KC6Zvw@5qu%^xib1_?6k?_~Ya;l^C~wlCGQ!HVvFrOK{fd z7WsOXN|X~m$$04oBW_mP<>_(F5rBey6t43f!vv^=aXF!jBN@y2U;3|Mk4 zT{!+GfX0S<^%L_%c>Ux3p#iK&hpo=0!Lvv}J8ec$Fc32R8QVpRm20F=ETvfMbVT5a zwOC%#K5mTcvrs#zUCqDq=b}_Rygqi7gk|t`Yo6Ao(*h;*`{DU=g|3$x(D^jVl9IVg5~D0J5h*0hgc?m@l7ZXJ5b#{T}HkpW-Y>%gEOp*;?5I4or=vh%OkR~Lp z7xd^44c?rm0Zhflv5DV{gFVpUe7!jyN?KmVVfOB)dL%eoR80lBwR|oyt&_!ZcSZY! zf@jj!1Ee>x1ec!reK}1x36%c>74ZvA9N5(HSWPXLHyBf8x&MbOm|cR17GCW&YZ@)| z)2ITr=87P2lMfPtMocP38)WGwovkpd_Ve<;fOV!xVf(x`6%UsM z2X5}>uMT{U2fI$o=6pMVK#OpGX?X59ejW^xbVMcof&O}@WBYWsi7|%hi8>upoc(X< zA_J+KuCXHHc4$+$Sodvvrvv8+z+$H2JA#s;7c^f5_mAL{Zr|WdH=Xe-=C=k61a$@60tHC;pe&EP6Fjdd|4JC+RYk!p zkmE*vG8mfKA+N`5;nB**V_m5 zaRl`x-qQ-mDiyK|Pb~6J_ScgsFmwkrPawtU6l7!VJQKUy4o^Ymo-l5ru}Ax4b8-LN z)J>=7a8Xj(I$f=7#~&V31skN6tgbE#uV1fQ&A+#i7i35<*&$)t7p%9XwbEPt5=mj~ z2~y0}K(}3qB=@ls2J0v2&Q-&u%g0U_hEFMIql%)uSwRM#84XiyHyuIQGqA z_!k>LZ!AiyV=G;louqSDKHw}z0Ovf&cz=R|Dc7zD+k$Qw=jC&xTlZ~85~U5O2-aos8V%nK7TT2{Vy#hs^Z&uYuBt?O>T3i;n_aR{ zHcSkay)vue_T1`8+_&9oozXj0Aulx;T{8ul-jdz)ez~8bt04n=zdAhUi!CqD8kNu- zx=^DLu-v5+z@%{pJoHDN#i-oP2LM?6DMy}{v=ln{GXkH+D_`GjX!{OvG8~POH_y|8;P!#ftd(Q_>YaWT1SIL4)2LK5gfO4M zMB4VLJUh3G-V`E7zf>(Yfkh?jT#B`tJo`C$VV_*IMOvF{He3Bx7ka`X8@yx0s&uvF zv0bBf!N1`cu_9&-F^O@#<|aFmvvvKn_zY(QOg_XbqW;fTaR}}0X)!2|2gKUBdVx^7 zN|^X}?pxnaUcnBV{0zO`p0EFB{~C~A;*B5}A9bGHmN}z?7!1hBWb<)s03XF|AexOS z&3r|8h674G%Kf-Cz_yT*hhWemoGH2LtM+aLhx-pEb%gn|cnZo0_a+e(chap0O$p($!N}d)a_xmuN$;BlJDdhl0)vOL$9nV^Y6P&bP_m-j->{4Y z>`iwrck5(>X|c!N5fnw~#3X_p8%o!t+rS<1MbWYF6$NHbd zE;b2u%@@{4=y;ixX1}23dtX($v4VVb_#h)3W?Y^XlU+~%-#TvEJ1xT6OU;fVKMzhJ zp|l~JxXmIUNlJUb#?l#cKn^=41;MxrD7V-+kO5R>&@$Md{&N#u=$J>ZyTXmbaILSbdeL96gUlA$^{^ON`ZDnf~GuBmse!eh%rO4#{@(l z;f{D!`Z6BKpD3gYKpz3|=rqnz3hGM1L>UPWG*?+9M7 zBT%#~poM-;fMpNXbR#$$8Q~4v!xzqrVlMG>$yt`INwXp;BbX7_O&2Bsh)04W@Xg9v z6_ViLdf@5QQQgFX&0mcNCo$0-xRY$cnj|nBCGV9%euB--Djdx@>L^U0DE1vzEZyZw zXo3mLA`Xnt67xbZx{NveF%`jIurESNIyjA`XbLe>QmkChPJ@Dl;Y9zE9k7emPL78V zlkUDXBxx%jrd~jCHbS3^DoO+bG!Uo@1wJHcP?Efw$Pf>!i00FVI5*(v0vF>K)pLFU0A5HVa%(@g}>1a4YJc*$OlJedz%CG&`EvL_9RO@6R9v zydy2;OYuK_R>-8(jpd}TQaco|7En1&fWb8VF^4pw(sH!YvTp;)BMV(+7>jq=)@>jG zt*p)h_K5>LoA#5{nr13zvokb5jiRA)x4u2l%_8_OsTx8E9J%(AjSzdRtO~(-NWuEI zbCjzJEL(szbD2kq&@6?s#zyALIAJldxJ3aaUbb_SYE7ze4r&aQf#1r*Lh9Z7M|Z=S zOQ>x87(y@ZOU)IW%BTd;E_tekph zO_k$Xg@k1a%om&ELu4y~#zdglcT|4-S`ax!4Y}Jz8BP62)Ekq!m?8vuF0{rPpO)@QRfS*(lm#P zDb_Uzer~tWaD=%il-ek066Tyg5O(>=VEOX*b7&OrMVg)HeB@pA(#qJ zhHkucD$OZ|bub)0I43+6({?JJgkMpbq_S=A^PW32KCR_31zAcpA}ox-$f1RYu%oq* z-jh`w(hN$6)N;lZ%*7?PlwRU5DaAja=f?DrX1o@KpVp$k zWPN4bHz9SwiM?M--N^#%JRiVu9yM7Fx=_+?26-GjRc;S}o3Y+3Wr0{mb{|n0vCKJxd6q-NOAE(T=GcZe}hYR*Y8~^9@r*b zwJ`0xbq{xYSi`w7Y@dSS76vR)%~5hswJ8+Xcg`JGx~e-c7Ui&^$Ag@^*`#GVEdpzy zamqk{`W^3qrZ*4DYpu`KZOS-S+Wa@`!m1MQjVr;B7=klw8IJA?3&V=lq_x5pm`94e z4PiHuKek@k@}3|p;jD1Knr)=Pc`q~)V9HJao2IGv1UNS8mcOfYv9y(}!kDXCJpsTk zk7DUod4E&ejd{j)2(Xk#zNWyrzdGP{lG^=keOw-4`jl^u{7C1(u5Y)2A7Q8L&)vA( zeQId>#uBmhem#I2gQUCbqMaOylh&u_m^Gw(YrpU-c&K!~JIAIu%)J(pDjO9K3s`yQ0YV!gOr6 z?lhr+K`3}X2maSaTBZW$q=x&ZabW3sjZlc)q_x$> zPFIER2Plgb*=rco-*r&Lt~HhjNM@5>%d^WCR2B;Gm9}fi(lz%5mA-;w8#;i74U{G7 zUB}5)Y|oQ>fEyRGNY@tw)jX|oHqTHva#89-MZlfTz(VvCTQ!0JMj+MkJR`($5^zTp zDFWBsAopcpN{tGj3XL8M@Ln*anNhZ#2Xf@#St-4p=V)9<>qViR5tGN2dpnrv7%u*e zTFYP|AV%F&VQ^OG5k(40fc3d>Z~JAfGr{cGNnpuzYNrBsNI?6eKH^X_r!~$aFc6?v zPIJ$e>{@v4{U}x823!UD1B4)-q4iNgxWy$ea|}G!11znf%VDtiZ_APMv@scYeMOP( z^v1_>tjQqdr$65P)JxyTPmZ5HUw`f5?e9d5&hw8}p>k8_Y5)^DV)g70-htr-k#{_g zxDZo{TRBm5NKOnE=)?geD8n#h0p3ClE|L@9-8pInY)NMX*VwN%H)=T31?|Z3Ihl*~ ze}X+5j-$&;cd2(ZJf%K30%Ete%MRTpOom@ZGn7HetYh zbZ3SCPBH)-dTe`emyND$_@c~^_UnLg`RlmX1Y6#`3)zt3d~N>Zt)_%$;eDKwEH@}>^mhnnw|?djT1loR8VhC zQ>HsHMQ8B;J!Y1E#O!!V{e;l&0Mz_LlwcKb;j!T{l=?*e?&zPx&N6nxN1zy`wM5bG zO2vU;z^0q2w@{k&X5BG|a|cuCUjT->U~Xy7+k0i@`quMk0(VEQr#vLi+-}#oky#-{wxr~pmpFDWGT*l9*S;vn~ zMKt-ZglAW9d&tL456LRkJ-B6*RUtdYGq&1xE0!Z$?6|8eXRdxZWO}|Uu zM8UFCRxU7k6I4K;<6M%7GSOk~uDUgv91|xI~OtJ-P)OAqV+yYe) z3+m#SYOugCvW}0#q;*-i&sSVvGXqHXNVZ{jok+J1-%`B3}_QvcbkBFjmP_2EA!Ru>hYx!$s+@Gp>UVoiDMxv zm6(W`ah&n)nem(ZIex5YeB8Hl8;-y;tJ&1_*>i=D)_(f0r-0>w;U@;J4yb1x1`F8Q=ES&JTEm7#|#PSt8((^Rom(` zW#cy}H3`8;Neb#E#!*5Ty_ZsJ55JZ?JTs&*uNGOj)-B6K)UTGykwlS4 ztzl4xL09yPY2N?%g;&Jn%~&1G z%1P?~-kYg{CvAi~R9 zfkMbS`}oR?36x-i;z_eg;>Ap*@tDHj0DHVCGSDteGq=S?uGC^4@Uch*tQt6ab5ubr z#)zRLdQXcUy^IoD1LFiAE@mL3|I`AIPYRU#>&B=>Bo?eS5E}iVATp3p#w%V_G_INE zV`2!1h(25;yh~!u%vI7l zyP)wtBv!xb6=PR6q;u77|F#5-c9l9WIG$SyD=_vu&=3xTpS4U5elgn^oG>|JyWsZW z_Zb|$le6LTwvCCjGZ_-Y=g3Ygq)98Q$M;kIa-1DQL}bCx3SrNtIl15?CId=t*@9C& zH?59NcDnd_OLlN-(~F_)?iec>)=EweA!+W`hhl- zGiHT%eITO!5n<}C4%j=Uf@>1kV%?gD_7B@zNMYR#=L;q?w_JU(Xe{29nU3oG?po~k zzP{*G8?M>!TnWWH`^>ZaoA&OfZQ?fC*NP)`o97iNm_&_GGW`|BK{2%)-#xG6OP{@L zGZ+$JT&p|!u-$$d&~i{x)-Ye0eN;n)bh++aeS-`~W)8)kof^|?#hr2V3qFytrI(f{(f}aAsV|!Y{d8| zBoN>Aq)pnlQ~duuP#YY|y|wc6oox;ChBKw@rKj6cx2T$bv|o~^EEFy~x$)7z@0+@w zHVg9|bI1Ql?aVZLNZWO-al}Ve=qF|PKg(>0J#c6-F1>BCWHDP@*QIUCnFb^gHV92@*u zmf!4JHFqxgR8icHuw&dti=1UlT~_Y_eR|eW@oFR*cQsLl+bL=4_72eL7aWl|gjkd= zX{sj z+ka`*niH39U#SXV2Cq z-yD@u%-t~iqoFV<#Sr#G9RF#sUH$H^&BfmGqc0B6U;W;lP~5m<Mbmd;=nFpN>YX|=A z??3jnLpT3Ze&PB1hI83%3;we;ZT5M+laty&cs6j>@~2|qpYELV>v5*PeY1bR(VYzH zo;h?j?yL9xU7@|JHY@~FdiRMB_`B}8siRg5Z}k$B5cHb2_R5c|2{Xhf#h~1lyo$pR zEika&B){qNeDkLRg|5f%R1+>uzJ1aC_%GYvXI9OX02sFBn%cYL#HV5c8T|tY0Nkm^ zf27anqlAnbe-5k(&DwbX{BVtpCe-}T-dAr5ofn(usq!fC2My&=$gFrs_aGAmzHK+9 z7m0(UlFd(V$fg0%F3*-b@7>?%TVuaV2Yf$l+Bftsp$@qI_V0zKq+Mjx@4qn5i=F@k z0A^9Z+oz;=Pkqz=t~7aNpruI#fy!s0qO=2tckOD$p?=pMl;U_OMde;<>DvD6x^KLO zq$XmGknG)1T~E1rlOa=OoTez)4iFX*+aF)CHo&?V8(r{q0rXp`F{E;G4F;LUrvrrv zV`edJJn=Kqr3v@{Nvxc7Z!}tpaC2M~@LWU&L?@PXGFrjVG5oSrbor)^`MO%=#y2dM z1jbr|5O2}fM!+?>G=z%&XauN(J+kR)-cZ2NY^(ScfolT-E90*oomzB4BL=3DAC&+n zoDJw~4UaGHZo>^)sTGqbnmWZjB}b{VP-KyWBkiKdZW`AaJ~~N^7Gf@NHGC0l5Dydi znzr{A>LJ5zNe9(A0I_R;LR~=qfTqp#e?m}49xg#6sF zG_-1v#sWQJv4MkP2K%6CHWVPh=s0x0kCUwC-ij2U^Il)q)Amp3KF1j?rcYsFrPz6L z(E$l)J9WMqbR6*rlmo?@3QU0MD>SvOr-4-v-#J*oY~NK6>ig zgL!*+gcMc*#;b32?Sj?q0q_4MScPC$-X_&fpk|tR18mmaG`%a0TzQ6jkd@cfyx_Gn za?-5iQWHK6!Fv~SqwuD<8<{R8TUGiQC?&-?W{(r{rjtvh4qpK}}k zF74Wp{VA9tU#Qv^V$go*TmFev5%V}qewil8~#g_7-_Q{S7*!aP|LUZ|Q1H$x^ z?)>IJGph^hOVf9!7p>|GR;M<~t~l_)9zJ!-&hbs{6VUYKgdlhV%DiA4ny3v zUQs{ID{bP((YqghQ%f=oaBrj1%SX_6K1>f-0xds zqBOVWbWoeKG^uFS_^fn0KovQJ7w7v$HdAgtn2tq^vfQG^=^@r2aJQv22_U4P1Xix{ z^`i7(uNkQ$8}D9f`0MvgcU3ztu(Tj5MFKkyMeRy&S>q-CyNUv+Ci@Za{B6>)+sCUw z?JQN4#c->OvM&)qb>7ogoedi`rN(ATR;U>_jO|hwSS&;;Divw(m)FQ-!zxmR_-^!3 zyFq|bGJ!5Vz~LytpBI@p0XDgc+m5Z-2r#reST4#49%+F<6QO_?3=$VJGFt)rioH{0#4&!@*EN;j zXHu;}7-@*(AX0+**>f$WHag(vZ#v;;f=~xoHvt|~sr*xQe2emB3(kH2yNPW^e9 z|Icxj^6P`3)_vH=Js7E^`jZV1QBppyM>#nhWNVZR9uT1* z3RjjzuIEkH!$psJ!8(khy}z^+W0Jx1^RID*M)HUOySV4>++rCvpX zD^&N>N>Q`2;n_d|LwRds9yxzN77I?E^MKY4WLvQ;pRC;C196A*no!Vm7F)H#NNpd8 ztw#cT2FU#bSr;+aGTQ>z{No-}O|>KQ3{)*}!hHfoh`meH%s4kI z@K^iXFS88GUo1U%pzHRFr3EgpM;_=OL>i8tQM+i>vI;e=!n_@VMI{>p&5tu@x!R)8 z_5h8D327}eHxrO(oc-7d&#dVjT6A$@yKE-C+RhzB`jLe_S+Ee0$ZmL=F`8Bx(XW|p zAWR;D2!ogI{5AGRq$aKZx3Mw|hxOcEN6gZ}@Hl9)lrT;N)H_x`;cKSw2yM z@`mugkhx}f{4kP`55t4*1zr4vP9&jUO<{ujay6GSh_8n=)9W>UQch0>e5p+%^uuCy zI`XfSrwl2lRXxFTZ?vQ|cbE`8w751TBD4o2qEJdn>F9a~T0N93Ez7kKq{6!|iDh#H ze;Stc?E zEz49mI(mSq%0rW-n(WL;ZYciPSduFu1jysg-J&5f_{p!*$wKA!g-V(qh6u{INg0(c z33B|yP(+-X59BUV+Q`&%0nOc)}W<6jid(yQ2BTusY)o`22=yq7dHU z6#j(>9TxOBqy3XJHB&}waPTROFwT*zmH?Uw7(^#GwKb|I3XxzyEg8DJZsGl?61uPx z{AkbSDzGsM!URPF3sVLG8cF8x#36Xa##Xvq6*W{G-l=rWqivfxykf*TIlC!js5naT z^}W%_PMaVrL1yLzrQSw-d8m(Glb}#_uoK3N$V#FWD;-mn6s>B*h&n_tY6GmADE*ru zP(@~qLX<(M?~@veFR4dq;RTm4ccN`ax@GT_wSxZM z$l;eW8XvHf8fg!bWIL)H?RM%lb-#^Vj0^zQsW^4Z*Q&fNybtI z<#NFrS@xT;Eg;s}nmD6F+12*n{xIFeJ^8y=->Y14$fm;CK7sx*UFaN=6vY!bKC9A+ zH7WL+Q@-e@cjPV>_73|N`CM%nv-EN77A)mlR^Zx$nPLxkQ{h*A1a15EMh`dIeciwD zzL!)&>zxmmv)y|;iU$pciuV3pSvuz4m9xjUU!Q$?^`)NT%w@Z~frxkQ*_V|?qyIU# zep$_sAiv@4%J1(&b{Dk}RO9;}Up>C}eU>-XOG-X=a}GIL!NYPWzeP#y0w#gMwnX{|6yHy>Rg985HbwlA@Hr8Z+*wWch@3%xq7a=;*-`YUL!glhjLIceO>_Gd|%Ceap< zvaRmcwdfy%$8B7gIuscFLwDicxYzm;2{i&JvWy$7KVIz<*K2`(7wr=m-AZE>siY~o z6mY8NMj3$mu)32RR1e2&Wla)+n@FkAq8&)5JA;`_TQef z^~|95Qu(PKkM`kggz8`LLF%`I|D&9fm^DCQO)!y2`NR}Qo-_>WTkjXiiITqTm8oh$1%7a$Ty;@;i66G7GZf;b?y_YhonQ0N)N$W^_-x< z7a;4_6^MH3lwusrthGG2{7)P7WJ7=MPE`+QO!SP}^Jvy7smG2k=<+jj5=TDsD?KX7!*7fC-2V}0o5TK8k;=0+W z8K-qj9qC@lrI3J-ioC(6yd%BN)pn`N>Yu%Jcai(<0*QzVZqJ+sHn{IM_ zF7FnUC^xS<*g_twbMXCoOhr!ImoVn9ns?!C5L*D+HC3p8_=v0U#}ElOrEpud75L3< z>IhDMF$t(iW~F|MY=q!qzN>CsrX=qP>vjl8gT!q{SsVu6K2!4kmLC0P=enZ z3*yypx^dAmA$olF9PfP1sGlgod+jt;`rVJnum2v!xFEdilOeYtXbh)8;{l$#S`~VZr>tdGZ zQ3R_^r(!ITCvVw8C%j|hIfqQSLpj<;uASx6hzGuAi?LAgk7w}~BCi;uG%=TuMglO+ zlpy_MpxFmfv`7@=NQIXTx#+SzTwwLQr2Z82qvd5+7XIK+qF%UM1wvDXPT z_MLrp)%pMYNU$O-cQIFsUSQxDh9uOAglD79N!D`9hWt^j6`GQfflBirZibb<{j2`< zk>*f$x~@LfY49NOY^Zx~I5W=wryhB`si@?_n1k$UTa9mr&SUA9LR- zrcZAiy0$Vr+bnyhpZ+xRPXt2=PQeDiG4KhudEx8w?|W420(UA4PqS2QWZy)LtkQQm zB;vN5+!juzMNBzIBhuw^un4bl3gh3L)nT>FMi9Ou7_nK{Cf%+AK<2 zVcA6|MT8Aah}xK}n^7K0x8}!Z*lUr3wHH{C{RY2xH!1*`07z75?BanU_S8pkQ|(cY zo&QjG*?>kg1H|DfR&qo6|xv^Mej)c@^3&5zXIl2K@_DI@}= z@VEMxxPsvqq60TLq}R?e+HK9GY?A_&5%&H+m1H>v_KHUhi{*riNTOk{S4N^RLtk$h zL2?be9*ICV%~=OI;Jy-`!M+P}GoVzzdmcOxL9xA`l%05wybg88AUxZ>;|H;#c%WU-f6j;r#7Hh6$A#!5ucDpVt&V0wM*FbpFyv;^Teq)boAAo3->?d9lF=+r5KMlh8?GmS9 zps@n0NjL3Et|c4l?OL(Z;gGLZOn8F{N+hR)fDsDM;Bo+=*oP)r_hX8K871ow7i zOD>BX>l~G&9;L5dNqT7X(gNIKiMJe`(XQfhf#@=@^xmZ%?h;lpfD{;O{!1jCndOlP z+1CT{glUvFMt_~rJ9K8S*+>Rj{Cdo9oA2u6w9djzjp87(JlzYT=od*(?XA9-~XIv7_+; z5@_^HG=1A>u+1F!CfzeKN-K8wi(48ZEjYnPwqW2vWmx_NcRpHp!w{Sg2TM)vOcTow zjVpLQ7u6E^%FBO=8GHknC=0LvKqE-lqq@9r0kGQOux=Nv7p3tGy`Loxf#!rq+R=!L z!ZZ-c8W$$XJ2A$Yt4xnjhRRfS`K7l$K%9D}T0H^~{9nD?0&QKQ7vV}uTEwf=W2q)uG4E`MM)``JrE z#p;^hy=G6?NU+T+V>89{K>(II`}aUWpCpluYR_P}5G*M8sP0tzM5^mFUa5$5a{M;53Zap-e>oML}sUBpSm`UY8A`pqr46kAK8}JT6@29GW{n!Lg}G&V(9rmqet=VGvg9) z(5^F}3Px1)G+;3Ss(px(HexITpw9I7EQ>exQ$t;qi~-$ugYw$umd`;K$q$ttmZ@Zc zIF=!v(EyT|Z{~dBZWwZ=`<2rK09zp$`yIVK0rK?|H+6c@H;w6%-ZKMY;<`j_ApC!&Ui@v3HtL7*PiL`5h*vGow8}qEDzCU`KoHa;sbC6 znBn6~;)$oM#%jLNsl|rc<@1O=;E10=Y0fh-=-}A(S6$m7LGN3ax&k+Yfvy`km1fvM z*&ZK3N?orkKe31^ogW<7ZzIC2V>bByQt}OAhleldZ>COEiv7}5tPZT|QQ!ijcLS~y ztV^C|z37z)6|FOr=V5c2stXrwmamq03;U@Lujmgx@efq>)Epd@ree#{S2@NU>7M@{ zW8lfgqw9Q*ecqgZs}<$o3>QXf_ZH2!_GN3!JDHLpz2HjD33 zVmf2<;$A=cU6xt3N_bSv98FY@_+_#1@%uqzFuHe4{)OO1rOm*mnh7$hA09R@NZMp@ z*Q&iRZBH^YQX7Mh!$)k>-knc*Sojb_!j(avpu$6aHu4G-FWrg&WdQ72VMt26;Ce6w z3?EcW{9!~nI?)fv=`HFMcJ>$*Gn8Nj|GN(jW_)r`xmkk)lJXQKYqQWD=6Sk*XEBX zU5m~4*)N)^{&Lxt&vEhWjDt&9-)5`!d`F?&MZrA==#4Qd6Lu^CkhS~yM-7zz*U_0! zn(V>|6Or4^yhRH`JxgLl8k~mQJxDmn3y)c(fybe+TNcnnF^%hoYjR_7it+Jdb%YX~ zrnA1|)kE@O*atB5F<$T3rk->f7MZQ|@E*Y#wGh#rTm>*=Q^%JSM-IYaos-PBV}dK( zpiF~9CJ6NbqdP7Hs}LR~I?aHZ;enVxQ#teZ!KY5CgGW zLI^6cf5KYtP3Vd6()~i9&84DqfMNW#k!s;3r;FW{4p^u$?_GL z$ob0q#}@nY#pxQAFFs5fe(z}k4{w(8I!$hM$ptm2=kSc$jY|U&iTv#$K@)}f)96)i z^6!Ma6bWBypl;rZU2Bz$-oLx2nrw@fzP!kbP4HTle*Igg)Oq7Pmyfdw4;v_r72mZK-RcV&+dq@A*R^q?bn1lBE=Nc2h6C;~f1dm(*rkUnI z1o{Kb{#B|)r-!?jCtI6TZN(zr9wkc-Fv+UeU(bl;@gtY#}YN2um!!ibuW~Uu2yBOd7^SoG>3I6p&`t9?ws{E zkJ@Vt6BB!`QDR*%14fN?tGIFdP#V;(RKL>`{6am$jL>BS`h-dQjBAE=g{FNRUA5)= z7C+y;$)dF}4v1x<#&9GmP4tkJKA8OY8A`@$c!1G0_qWKtn3L3upxT?-{n+n3|8coD zeGYxwH|aXf_tE$s(>Hpz?N0+e8gtcgM@AKZ%y#h@^f+vO31uge8?hvzX?&MS#lZY} z)k3ln))Wz>sBK*l?!bPw?w#}z+-$G3{%2qa$zL2vyK^>I9l>bGN5RGmAwyx_>8~pG z?`v}k_xJA*tM{)N#=N(xL+LRYsfNzsZgPGGPY?3?j2yx89hU*lM$ozOtfMrA?4=9^ z<~n65dHtqiL`(UjVuu@b*XB#7?L;3Vo7+moE|_xh<@b)t*D2eLJCSZcW{M71`!tR8Lnfk#!fomqyIFTNMvpiBo5fXN)%x3i zo-Z+wW0RbQu;!sZN8HX(d@uJ;?D}m~s}dgzvEE>;EW_`MaUh23=QT8fHfhu7CvnFB z3wq5T1yj_#9ezczzoyo%{h25R}$>P@b0Aq!RF>s({u8=JNA&T1oR$!m|-#U@T* z*;j246+l?B4H@~AJ$nc(NfIB-oiMne)`b(-QQzDG+lcoJ$`v1MbER4@r>%vd7fRK_ z!%rUSmB8e^3Gp*qwX*E;I$@Rc>Kg&f^bd>ic~@a{$BU2fX4g z#y1{J6x8(8a@-uHz3y?B%GF~I-+b5^Vp7lIxz=Z<47A3OylV6Ev>fW@%85Hxkp2Ix zfGKGEh=J$$@j^bCT|C}DKy~!6kFVda`Pwb{Y)98*@wWb_)G8a7fO#J_gm@AVyMz7E7b;-8XD*uG4IsyrZ#S@W`>JH8wN;2=m+c))c3v zfO{2ImpGaO+0^*`->#n6hE-F@Pc#Gq^;X-t{?2CZZl+9O-K}kTrBiXJ+=U{>I6XO< z`#);vQ0#ux&RaygT*~p0%Nf(2l;{Z068sQuSZ0q-Gf{I)X?Tr#C^S@60<575`ddQJ zVC+&`H)+2|T~cR}B|I!i1S-emEPP3H3~H>oqLt-f8{{4LVwEsTb|a)7pY?hYt$8z&6K(wt<436$G#(@NeyRRL;q+Wb2es7kJGHdmQ zCrTQsS7JzTa+$3?zh9m@F-3}PS@=m0;uo!~j1?Co7m(+cG=rMasRCVD@>;Q)gcPO| z>2CJLb(vhY&dV*eWXKv#3)Hzg7o7r(BrVTHKv~*r^(28^IEnemJ5Ao9RH2MXIQ@QH zrb+@e(>(1X*UFX3F*A?uCc7PL7?GDzGl?k(gpBk%O8ahBhRXq%-7mJ^ z2srqpT_gvRLHYobg6i?MggJgn>wJ=&`B5VV}#`^=_j5b*m+0Q8s>tK)S6K07isnI%tm`ep&-4MKuFc>##(%>-z&hD=v6rGdFnBHHb? zM6RN41gHs^YhGaT29Ndy30@(T1ip|keOOHTG*9JE57F2g1k{8<14Kntv2_rQ(=V2t zQz*Os6VPI$l~nF6YH-2mfYg0g(vj_sz9j^fS1$;2J?lCW-R+fr$)pvQ^6*{)Wt&;U z3I;|%f9)mmdXT`6SCCBPW{wt@O*}V9=z74H+n6{T%GMn0i(_S25*fZ9O8FHiGGd-q zbH8<4X2*PDl-b1aLVNrgO`#+8AbkJdI(xD&!Ap_iRxE^l5>0kjZ-_H`LN`nn;UBB; zWa6<}GS(#6sbE+8hG#c@Vv)gFitBU_GVF(fM1Mb{`&B^6>|0Rz3pBIML$Jt+jAJt) zF7NX$ZlYG@3sjSR(%b{Gr7@;vFBS$M4$rKlBpw7OA(f*KN{PRtrH=9e$p1z=lo!&) zS)oVJGad~tGO$|mp*%8LVi*5JNoc64@Q!w;)>@{~%OdptBjRZl>HTqIRaV02H0xn% zrh(s@Ods37m3f^^+_~sU#)bW<1hU!Ctg@B`bh`6a1;prxg!X{gFHEX|PiN5f;!Sw+ zsgxMoHlUPedBr}53SLS|A*fyKc!C*YtCCkOd}Ac;*ooQ}WLMo-l1=f{?L7QS3nON9 z`cmH11y6GWbGMpEQ~$)^Ma<1h+w&I&pcE*t0zu55zqTA%*ZkC}XO^Id@^e?a0HfTKUh=#tB+Pl^nMaVvj%#O; zy)@a}FaM*mTCmOHr+_d)N&WZ?a08Z0^Ar5Al0j&5F)KP`eGKUVfl=d_1B33^^@Q*!6-IcN(? zZ7qov>=+`?>=KhCBan%WG3!KRF(tkp&&4t7#39SQ5d}W(5L}FnRg#l|F77`s%9Dn{ z)vf|%)i9uP+uZ8qyUci85<&@P8uuT?R^z>&ibS1~9NRAPNCjZnK8G@;0`hAA*Pe|t z5F7m@-?{aw{R$77+%`c_z`Q=DB4@R}C4~x0N@ey4k{y)vo zc|5dQSrVJgP=f`N)>3Nc#`^2@Dn=HQvwhXs*^N4ZE%y>mu`n2o>>dc=~hOKVyW@+Fr?TRstl4nV}1@Tx}j*(fcTOr9o5?)SN;ujFA z8!u_TH^$2=zf!Uv**gaDyt0`6YpT6O$q7(0>@Bepaa{D%%KH8CSXF#9KsHoz?2Ug& z#bM(Fgq~L{)XD;~S(5DYv3`Ezl$>ZIhg^M#`X<XR+6;QfF@k9cYmm|UWhAp{4206a9%|LP`+X!N)oqK^P18XYQ{ z9Wb#&yC8Lu*pWGy8tm@$)9`0_oMVO2ey!MXPBT(C3J%56>WmIpv!f)NLKIA2+uX^N z!}0D;7v+Dw8j5NhHDg=pp~h0;6{Aa=_i5cFh>0@udihtHT?}GYB1RY^XWnUc>9yMb zlkIHIImb3Qd=&Gpx;rd7a{g1C?KyWt3AQxxsG&u5&99k1)W*jNs5qK5QFr2_(WM=9 z<_5Zkm(8nS0kL^q33RXx;F&;|2J6|Hk&T37M3?(Y*9S&t*$ZNx;SyE=FLHNzXtf{j zGj^@~GSBF8$H+HX`I$zb19LFDJ6*|ktGmJ1S$_*Q;`l=sQ?|=<(5Vu*`Xr9`GTE(D z$w(C3qg!%bDLH-^NiM%Wfb^kHu5Z@*?rDJv_u!mXr-o+!F?Y8Ncha_tu;i$#;3nVD z%&4)!v8&D(jQnfO927%Wd~|Ec>06CDif-~n%G+JQ8iUp8ShmwA<>HzJ+-q%jO&8!f zRZdHeI@DPEPfQ}AEaxxA!opFH(*US-u>ozl9{}`e{QOXyZ)t>kLV z9Es63*5_&BlZfbdkXFai9Z@{#T4C`OEd}N-0en!9yRFetJJST0pq+j%(m>liY1*3W}m@xvC;@+3tXRC8y1kdqPbb$DttZ_7gg!XLO1{ zypd+$Bxa)#AT7`XZo?vcvn4Dm1=R&g#0*3&ti#4lwe>r9EBumQ#N26I;fRqelYhzE zK*-XCokS-@x^vpD#FpGj*q|K}^~Fy76q*|QC1)Qy`fYUEw4zoE%fMk$-R*k~t4k|;+G1)AI1kiG0hgjj%V@6K@*XWXsh+ys0F09IaI z%@e`2e<(>la>_6HIC?gnZnW*XL?~#1@R?S01h>m0;ED$;6lC8NBpkXib2Skp8y$3d zUW?f=rJ3pl0Qng6+@HJ^**07`be}qFZ!Cdf0qEX5)d=Xoa3|qPpvy9LYz(Ln*f|}b zqX2Q{6>jZvAOY7_G&@u%?c3$x7#*tww2>IXd{)r=781!QGrrl@O^k>PGk+<;waF=~ zo9$Y35Qec9S&=Ea`KJxU#}QtQuU!+e3j$RbCUC4*Qhz=jmy!>5{f&b;9eOe7j3*&p zZi^Y6D>EEU_3mq=PARc2+_8n;9*?)lfG*wKSaseOCV{70Sha$OtHe?a1UgEcgY%T# z9Yd`SI7!$8ZE6=gbQWfkb0J7hiWUHY*8g#qOEAPOv*gfxJ#|CnRt z82e0tQqmGeXm-?pL4Pux%y(cc(8>PE^ZiT zy&)ROt7OZHHt3k&4b{;Yx%X1F&|}}7G}bAgEL~2bT5-4w)jpdd6WG$Nq>mTiR)FaP zvVR%KDC*CX(-J{e78HHVBz|^;8(W6XG{7fx%%o8%o44&wdJ+bc-t^)8m_R|1^df#nZ5!%L;jt1N_sy{=&tXdXm zlZM&QL1LMK`5lAfx7zsFv0q`!it{LJqZ-MlFq>^Nl6Fev^iUBob)JY{QXaKx=?b9E zP0Z3^1CP5IBHMWSmr>KvNsDqJ!2ORvl})&a;~~yCew-#{c&-=$euQ6RY7A4y8N?#_ zAL*;Q*2`Jp;gmgTROm1ELmvFR8dI0Js1l9)+2P{ikC=c0j?t0gnk5m@7B{ z3P@ZXIYqwz_RQm(p#ygt&g&y8Lgm26)c|5aGShyyt3`(H0|8zuKaT@=C_+UJ56wJ6 zLlG%JBpQGuK@sxcw}*c+c1>}^`T5)tE9IA;o`wRwPgj18C(P*v9_AISE+7=g|Bg>w z{d8cvcYsRz`y(G9Q68RBY13t4zp^?VTzHVy3(ko;5fonGV_2N`eEs4=M2>-o1sv{Y zEWi*P=iRC!HCSCgT~ka(j}cHHFKX`L;OL|W0963wKA32q8#-srS$`n-Vf+~adUoDU z65GQ0=+4P2gGxezh^Xy-&`~ZpC$_AT^ni23bL2IDD(@0B(qq{V009Qw*HkA*0ewGA zk0kzqa&Yj+`M(ylC?{8X@=PJ)@p>+}PxSRc}Q$+2+DEBSSca*l3mft5^ z5~av$)d}JC1#2dbG_3Q&#M^S9nNG0c`-BCSr5=_&JHO8y5449kMN4&;y#;NjKVI6F z11{RI4BfP}^Gu@<|4FA_uV1Z@7%qH12nm5w;{`a)G6X3}PH_Y|Mp>P+CC;=o_fp#= z%idj+{Nu5G?f~47;J-vt=&gf4E?wkx4{m5wFlX=nqKgosf5$+?^@6u1lq=)(+MT`Z zY|+e0@EZQdlnBxn1VT8<`@ePePK4*w# z`YHt2GOxd2Z1r#R{vrsZYwZ5Jz3Sk4tExZbKCC%)ZAAGuyf-Db^78EOf74oT%(=A3 z`B6}`=Z{k(^wmEL2y(ecUodB!)$5&p?}5e}yIxGZbM~&IZ{uMBjp1rNZlS~e zqwgOc$)23|VpQ^z#Jxw(?9L&4+!H(S);imwseya{CHw*wAB^g9xa5L#p3|M7O;m$IcDD+wL~N}JW?ezR*Ch|k^$o3mcJcoV6wryjnrE=@OT7C;C* zKWg1b0ecO=Ys+?e2ln;=`O^V2^3R8$f#_KD-*t&dIJUGE^2+?Dw)F9v^9A+;RWBa3 zbbhtCBuzh8ObnbY2igGVJ0R!qOX1u5Z;n&EO^xfX-v0!~{#)Ji?rl?K^_;!TKi`L+ zz+#BUJ^uhUzTyAl?xu4;X<3RsxqAJ|UZ%hxVINQK{qeyF|FEq>vxZpXtnGttf?pJV zh-zwE_*f+1=L=JJr5)saxZ;DNxx0!N77%+BVYc}C25!cV#+i3dI+~DtBRP5A#qyxA z{q>j2Zq+-F%?T~G9@~5U57c2yfnT3{R|^$)9=~*_woZ(h$@TX0PHvfeH0N73t9Z9* zgcV>aNh#eQ7?6ILyUar2c1!GBFg%{z6L)R5L-v!m->1Et$V!lM!|-1l0cF9MnJNalx{(7uTCc_Fy3~g8b|LX^J_Ujuuxs3gxY1X3soPX+ALn zUR-jaZ1ZWGd9p04qi-)yw5I%B^zO0Onu8Vb8=GV&ua_|vX(+I-P1OK9dk*(-rti~p zYno|&r?ano5lu_fKm6_Nxwwx7v-bZJ$vL&k!7*3Z9saEDDI-G3&Au>u_$7h6{`H<0 z(5jK%@JDgM9a_Ni#laR_(-MiH&X39S2($^iNzckAT~vm)vHo{^`EQY2aNASCJev z@JBL5Am)^=fY+R)3T(l2#a4Z} z&$RwMe!FLXE0xIA3)A|uw=E%VN7z{k~JFZFFdyx zXw&(14(8NJKmr-X*#wC@mrQpLXPOQ%OJxRvZ_jBn*)H5{pq#w+n|@@+D5=1J7uK{h zjH4INAR}|jX1p=-W_`*exHn#YX|z83Q$@Nu2UDiKY})zZ3i*gYf?Uf{gm!Iemj8Qo z?5uLt@rtXodb!5Y2l^WVCwtb!`X2gpGttw#ff_Jx&78ieUn5f&{+<3`ZPUz^hXS=R z-(J^l%UZpPRiCqZQ_$_;qc%%=oUWIIU+p_}XvN*woYg0d7of!lv&X*=8n$R0mJC}f zd=C#l3XsZH?8u*cW_V!2p0fGV+HXj|J#SnYY`$JIx46L4w0+6m> zpy^W7r$h1U(#aRY+P$D}6wUg5%XSdGK5U$t=`K6@RL59OHk_vn1qBE|N&{&ZODl+& z5wmLnxkbtLvuqGG7!##Bkk7Ynczs&QO_!+xp4di`Qr&($E{`dWG=QAHn&3c1e3{n= z$@cFoI{r*l`EA&Y2+*b46Bj1jnM4qZb`zu+$5|iXX~XgmthqIQ;-W*#=8qhx|L0Au z`|NHB>%;fES72=_zI`I(oPBbwv!L zWJt*$_i_92*V*y$U$-%O0OpJhFwrR#a^ynX8RQMGwhb!7MDzIf+aYrFZhXlfW8UOl z5~;Guz#v-bmKhV$5yDs~g^>O!)88@_WlQyJ1lJLrkfE?RRzg88P@w#w$~=qvoa<^! zbu_Au7vzvuu*k4hR+U#$UTx_0li{Hmcs9oEyXcZbCVH|g7bR}dmO5sdrJHV1(c2s&-*xobGK&O!z&Da6Fx9pPvE%4Z1KAI$ z>nk2Zbjk+{o86?&dgso;Ji&q0sIyIpKLh$CtNd#mSxtK4+ z1j8za@xw_mc*!PtxP>7gr(|w_-aa+yfcItZYaMS+sfJd!c@I3BS*r7y15v%A?v;>4 zx-A7OXFXiE96Q7* zzL&DzJ2r~KqMOR_16@-Vc1<29$yXl`$W6fyzr~JjH`{#Jj}k;oki~3($4?QH0u(qF z32m6T&xIreAf^Hs zavdDA5QGx{%NlWt#X0FHxcpEQkwb2f$K^R@AwkEMj>{TN< zuM6AR4GV_+#RV;-N&TfeQ?Y+@3R(~VMeQ2hZAJqIT6amj9m9Y*$y$!OX;tAWcbmnn z9(MQZk3$m-SU^F`zs2CVoqlo&#tKWt*tME?efXse|P;uhARY3(!CiT zVJHwU-|g~NchRA8y*iqjxISw?#= zQ-4v|zSY{kGf=>cSuaV!uCXD=Sf77uL3=ZCmyWtaLE6{_&XQBMS`a@b&dMY=qC}3+ zuT@{##w7m+N)rXtoOWt%JM}1&%w8cnxE$H1oi`vX^2sZV+Y0|xPP?uk$Gu=r|2%I% zK@KOuVatH=zH5q05U&-)kTK9W06MaF%Fw@RZF_`C!|LjobM%9P`b@FoqEcBj5bM^ zds@i2rl;ucW^yr4Cu6dI@jRn0p;HmlP(};i3v>>Z9p5|ci;_>)gS`uAcNWlg3#mFY z;qpq#4GV3zfqYJAa|D>iK;Z{3XnaST^Lm7i!W)Iu6PC5qNNTMfu{vzoE?aj?P8s5E zctsL;38@i-HiJ6bcNhitx*|iAmqU!lOvZN{JBxzx?IZ_3%pk*m9uhed>XO^Owb;Ct zF}}+^a7OJBW}OwSdncoCq$(YCs}RY_1J~&6eC5a*l&S=v-A4(S zmh9I|76>MV>q$7dF#&fJ$tdLP$~iEs^i9`KA_@dKMqxQsPuXcd&uL54n}4fEKZj2& z18Q&tGZC1ilT`Gt8BqWtU3$rIMcIs9qrx_{Tqura3yLh1w67V<_E42N*b75;nJGy! zm-QiwVzuN_fDomFiZE)W9Cj7JYXsD_GQ4U|Xl7D#4KRaAJgN(bmq98EHBacj67ao79S|lTw?k(8a21F$kjbXxDL*dpA5HTa?Fucxr(h!F)r!1E>hT9Fk-G5?$X(w zk|Pd6LH54(ZRYk&IiyJO!A*nDikp!-QLtMNRIp38l2Ca(HC0oFvToKaS2muBHC}Y#2rG9XuH5Ik(C>VI|DQb` zJCAeD=X}oV{dzrLT+h|K>m;857q1H?<1vffEmg{4qE1a+E-k^^;*L8((dhmXX=d2) zNxQi&{njDk8SH_#2lkT>7BQ(4)+86nsH-~6-&;on12`)HBrpjY4H-iiM{vnI5kiP8 zd7F_EHWymPq|Fnqw1hQlP|cm-6ui;Y2+!f0TZa zowd%)%K-&0`cqT2fV0sSbxq&G1=0HjD-DM+l<)=wa>i)T%%h1?9NCb5RYD5|_~(6d zuNsIPVeU;eG4cKxe+8fvnzl*_Q-qT35^^FI@41LGVFI85*K1^~mVuUN!xN;6!94av zyQ^GgdWZ_)U`o_mys3uxO4xuMh+&7{NJuB&SxKiuyHRrMDC0FuJ))+mxww{nCRtj- zvr(EYO!+3HnHZoh68$|OHI2Uf1v(WTcq&>&or6MdQXoc3-6F+%41q^{DH;PM8q0b~ z!MSMTEjCNCF=HiS?VWvk=6~S$4&nKaI6yfZ=5l?T*Z0g2R8G1T_G6f^g`>K$o*YW5 zTiah_J!)n3q{L@YJ-(oQcirl$h6BAmP0u|RYSc}>qof8YaWsn^>0?gk61D==@wb#F z-zKDh`@rChTSGJxFw!$E6LkJ%>qTH61Zx$OYwcj0i#RNiL%gdoDbxToDX>^p zF(1Jv2nlN!)$wiUizk>YeP2gH04*|Ye+lg`WOh^m>*66Gdh`&NTfahub9h&L{AG!c zn{8jy|M1UO420*O=H4ushu4C7SCR+3Y2h4v2y*x)O!>VSJaUVc06<|}=BY*V)@U!^ zKTOX;H^dBBj1P*i#qi2ZW6A`kEjt*vUd9;KGDPbc1yV@8k6}>bqAuYk|An*NVan>n z;ZSl^ES|t6zfK_9Yk^pd6)mieM4+pEOb0E_mP`Bro6M9F&gi0UGa0#D!jJz>e3Mey zGTd(q6tuiOoQb~3@)_I?E`zBDrPL#`b(b`ruP;FiW>0P^-Whf|sM8&hk{w&kEiGvU zKvc<#yn^a8Au=Ft7d2bG@kc}4iZr6z1NrTpP*Rol=ZqR<^~TWSV)I~g%UkC9Og<8^BZv_(UmNuS&cTE)O?w+cyl0Qu|Qv+Kd{pOUo;wYd5rdtB;!O*8n6gma#h5A9KMLttgQ|soM3f$ob_6 z{xWy{&UC^CHT8XA{PNLeucMF+TI~Hg)!eWOIkDu-k8QuIagz-vcV{kbq~E%df!p(* zc3}3czlA2N3}D|;`bJ?}{J*yz=7Qz_rFRr`k0U^+rkkq<{R{kg1q~kZZcDwgOQYf z*WhGk2AYM!rSp~}7h2qBFtxu|Cow%NO+2-m&be}C@V1TJ73OwxhjAXW2QiQ~Nl9y; zP7r|SHgajFU=kNFG!Fvy1C6~adtL0x6*FvjGN31R6&!l=;-0KyquctcaRT(o0aoT8 z&XWK@QZX!JF5Y|C(uKNlw^UKZ$v6xm%=*447}E4>kZy z4bB<`c2!o8P|y!ZE0JdKqHr1vA#og_13*VUJ{G2&SdHhZXVi>5{@d=!j;DHuOL3`& z%&;qw_w+Za zlz8Clrh9Lkl(3sQ8Rw`0^S*MQ z{@rGfDGHEfHvlPgXgZ*NlSoqkG}X3v?TZIs>{8I48i@;S=|>n{f4$FN2GEv|{v;YY zAJ@;h;2g3Z;4Pl5h;CKNYKm zu9knB3%oU2o7s6i*5fgDff3%jAS&p4R9~yPc~+XrZdw1m+l1hdz2{C$tw_nsE0K*M z+nqbW$@^Bm1dK&?jh<6-%d4kr;)M6F&r2wFnD_7MclS>%xN*?FXoq&%gob2ih_}Ex zp+7gakjml&i8)n#{JX6cbk{!`->j^cWsTe$Yst#01XQK3jLn|jUTXeFG{l+>cV(MN z#$la;WLD4ZFrRXL>_t^_al=SZOBA=3D&}o}X}v6YN_&M1W4N|@`N8cknYNTEVoZ*D z>sB59Am(ti{ZVd3v48VQWohQYV?&6r{vL66I8PU8n_g)&PB}c2D^fo53+7qmb=JC& z2!(B~euVac1kh33`mvZ|#);e;|JC5K&57JFXtwa3QI44W`WlXhj*LcH$94B_i^x*_QZw^_JVhvAZYUr-$wE}8}6T)dMXbj5ObL2ZWURJ7Cn*|M@;acxuxeS5fh-XU9kfa_!8nm)Zs7ygsl<>_o8JG+qqW9y^m@ z_QGMQ%s5EgBmLKn?y>YST(u!?iIGUm9&10i$j#@lnQubqnp8Q-t@^lyv!U!n{Z(M){9z=**a-cDn*Z~+MFczqCugrOvP?}M%#xc~>b4avqSd-y`~7cl zd41Dka->D7Z)_oZS`7>mRJv-ViMJV8M5o1)v&>R>+g@(99dEMTju&6Qcf|J5!ac9) z0KRnI+GUx0uA2Z@;M;5huA@ZfVrsoa(okK+qvdA;nJEkk?;JV8{@g z+}dk7{h6kY2KX2D@#fF-w7EA{WJxqA35vLsLn@*jZ1lUZ%TO3+T}lveiJ8r94wSAA zRvFfaErINRBTi`hCw;i#AmPNDi`A<(o6zL-HR2$)*Rq$Ojb5Ij;qxtQzY= zBd{3QXKT10w{&LjzK6}!flF;w|L{Ryu1LpdL5afp4EpN?96Jb5x@vS}cYbVeiQ!6p zy_7VoWwxaXExG_N!kep6Oz%}hOH>3KTb&syB>M3O@n7rjkV8$P5940{IaDlp^G4$u z)KZGNGn|#nRBkDk;^+L7GwGj*obp<;oEG>+cathX2AR!k$;vwSKENUdo-oc-Kc5b) zXa8w{DYQr&d(P->emO`z5f0Lu)kLR4^S`}t;Zv;R2DaoR)Oej}GmmO|dI*-_QUj0M z-q8Rr>;TeoSws%Z-4{Npo0cS(S``1JKj9nku932bmbo>y94`y_N%=~0Yo_IeH0hH^ zuahtRoTh%+3|WvxmEnloQte8xFgnbRkjP8IBD3t#m1GH1A&_U|BY?KR)MB#Z7$We@ zUq}#+8am<@JB<0Tm|FyP|kww1qe9@t|P%H*jIpDdhORuA4B$iv0G$O<#*?= zKS0G^XGrMC-2(`Bn*R9&vJfM%{gT{-A@SRtZjpL%$@m9|&c%!_FoB+iOdVf>5afk; z^E4Eo3+0#m@3?3JP>3gFnj#yBp?|(YiLlt}#|F=A>os6;kAfMS(o1MT2|}r2>==wU z3H*SBi+7t1pJScoM~AX?%F3F@00A@Pw>*4Rvfc=?RJwO%!4MhNG`?{V5gcUlo8>$l zWbqxBrdht=$CIF^znABS`#w`w&BDh#`#e4GF|_8#qsn#rQG8y(3%kib9dWVp_H*3} zt<3$qFQ&YcMWdjvt$XrLqE2=>eeanAqMYF#IG273i1>m|^E3cXM;>JC9((d;Dk&&g zY8PYOd#dn~liV&w9y7a2K`qX(-8~+P{jGc{ew}U1{iBJ)LB0Jg&K%La%lf}B&EG`0 z^9P<)AGXGn9^rXszNnsi%GC;Mw-T(dm^c;s+D#xrNqrvQ-jOh zFEo>m{Juu}`@aXIYcmF(Z8FP8h;{uuuQ;E-|0#L?+jXQ>-wIilTyYG>MS&OXpI2?m z0q|8<+WodGf}H-x>C>PzZ6L87rT3una)B`GH9X4;fK=|x8J%36c}m;SbG)xFq=&V120;ftwRyN=5io7kx) z%m7Dh^}J>(`)ljZZ~|E(4p}<&C}JYts-M6PCB1YT?Vl>h6<}{qi`+6(ZX1hxTF7p* zZIx^H%7ubj|8%=Qfo1-Mw8@2K+l3)ha_s_FgTcA`J-+JU1gcxr)KAcr%J^_mN_%9V zxBYW;19%9BCzN zqze%uS-w=@ZDwdT^#d)**Kbd1{j|R_x4q-slxp^`R!-ZI3Ht#$6WlDQl_zv=rAI_p zoq6@-n(GYT?K!))t)AKf%W3(@FWcyIgER_)(FrjMYseq%(V#TKB)*an1G3eV_Y?pW zt+*ivv}DGP=YVt-l6VGt4o)&!IKzk+7`;}Wi8f7BM5yrm{tGrc<)KW%41h3=31yz>XuEvwhT-P$*e&n& z&Xn1mZhjFZDP^uM-S0c?4jVWe)ZJCuVy>Vu8UTH_&y6oJ4HLTW+J((aDYO1hRJvoY zA6A)}9-f@skUGb%Eg?cKr@8F&uyVT6hl^?I4a|5F0IFi%=pH;-1BIB+=VqFgPx=a9uws zQ5x{48gVri<;9RT%Sd6;s8#7@{_VlpzeK4K9fZ*R#CgeK={1z1dy;hO$XUdUgL6fb znp9CgQZ8JrH~a|_|7ezjL%8Wn0}Ls<+63+L;D{sm4mzMH?g4E%+gv}~nshR{2?3os z3Pn!otJeLl`GpJkg%?}fs>;hAH3Ob8%Bi7ck9cyv=5(;WY0(mEPi=2)*);!eed*=< zNxzP4*Ix3f#?Mm|rlN>{H(<@Rn!Z)3{<-Y^&?D_J(Cu*<1o4p(i2izcFq)P)ZN(?RP4NN7&+Dx}bM z6#T-x^I=+6YTW}3<)kekUVGET?{5D%f}B6^}Ko+ zE&Sb1P3`x6ijx`eUwA!9hsPNK6_Nj*y&kv_H@g#OFY)6ov#XDsd%ln3%*RjVC@#P6 zx$LBvT3r~{B0ndHe6SZ(y)B#}#P#WKV;!T3!XodMlUqhHqa6gR379=eHki_QIQ_4l z&U=2B{=~_XKjV{tqM0fjGp%hx#kL93CMMsv0XRSF9dLQ)b#~{m?%7Q@1&uZDfM9V9 zYp?wIF9cIf30c@v(6nR6mFV|E`;=m`E z4NbnlbKf+CVUT;J6@?0mH&@@WE0u zLT9R9(u+%H*7ImYDL~<5&<&tD(Gh1*uHzIt=L2MEl+r{FN^q-Nh=NWzcmiOrAx+aD z$}+=M!ruf0A@^U{E_9aA05c9WnzF|N+4^9gVu_FxWITUrTG{e+gn(i~&r?gHKZV@6 z@)I(N$R|r)kbaje&%I!K8QF9eOumUsD#jMe=yR^L|CtV%_>K8R&O&fge8&AuWNj8$ zbKo`wI7e1z+Kx6)bpxUdC27@@>HNW)ALfKD?VSqEtyecNR4qaoVG4g7a!hL}{sI&$ zI~nM!2fIY2`w#{hyu4q&V=OCo9^OR-Ftou$212%h^HXBy<2AT%UbvA{O?1S>S%dpfuk;Emiz^1K;cvvXWMyg(Gq1Suxu(5`r_Abjojb?FMM^6j!FR@=Of&p zwB$O{LxWCC-y6-vT^0+9XZzRqaimK_Y$sl->=xTLr$&!AF?)e%^@?O zP{J>a3FO739p3Oq)Pz(=94#VsTZk+2Nq>&u9HmGA zOj^M=Cz6%2G}7_9yR&jiHg=Y*14xm42&0p))0XVIOWM?5vWZC&j6H9)2SUe+`yGUj z9SBbnr)+eQ@5~|Yxjj|`3)s| zCXy1hirC7!1!*OFu9ajnvn+aW8)YTge9}30!UR5qf2_>yCv6%nUNlN_SJXKeiyWVp ztWgo%IZl!UYV%{Xcp6|4nooflHJmhW#qzlxrMv- zxa_&mn%eWl{A;5aIBhbOYL=nEO)rWD@Uup7_EOM|S#*m9GGHiPN^nm*DpVImOYlkD zqC{93WbrLpLYS>7iq$A>M*-(R_176iX@;U06^}EfoRw2_<2P==n|8JuKZpMJfQrpesqY`Zx3CNH&@hXteUx}+@%OWK3nF)(;p${v?6KQ_{4>W_!Y@f%WmPV?@jdh(vc%M zG&O?QH~c5GAmAKgw9fIWRRgX+yN59C>?GDV?Vr8M)PFaxr#tM16vNyNO2eZWv;_II zz=D?&1^;_~TdZSi^D2h5B{zfOdZiy%iP^Z!R2Cj5W#Kdo-Nx|GemQzK)*SB>7kUCQ zXlT}IVdRv5q;2t&z6~g2S*PDRl?ev>4yh;s4H_twmw*{vUmJ8v)5ZF1IlZ^_#qEh` z^Ufsi$y%*w;*b0`n(yE+ZW_ZfO>-moz0gJF`g-6{EQ|3~;u>&`IioU6&(YyD-wSur zeLoHy+Dh>X4165tqBh`M{{C8L8qoZ5yl$&w6ru%v{*}0>+=mBd#4%=m%6s9w5twl| zAPUtM@%MaolV5h?K{8|*YJ@rd; zpW%1{Jx%gZHj#-8(Mt+H{+H7&$LWYZw!=3;eA96O@<}yeiFEYQg=Lq22Mnyd6*_sE zGdZ#^KFaB^S!(i~!P1nJ(D7O1xo$#kn@jD>)U^0)P=B3l#@0si%Q(~JbaY>a0`I$e zh=L(U4N-!XQWWYrle1cxLzpv70qrkW##5-wrduqkP+jPEC#4nuqM1X*n60|+U(5Rq zy{2D|ecM@6esq`56_*QG7Z`~~*CIa0cYQ+1RA>ubcHN#n4x#NfZ|7!$~9jz8dki*hoq=+QHAkFyqXksUKK{0MUSZH&VWA zV4rR(v&wV^>OnMZLJHq)CwBQb*}Wzgf_kG9v$WF|>+xj-2+P)y6%e}t;KqF-SmbLq zEzKV<5#E#lWIw#?WYz!L>MQ;#WDwl9!&~-!BeB;X#M4QB1fOmL*aKq0D@q4d+pD9+I_crLR@IFM2((M^AFYD5NP|(7*nL zO(Gu#`XrUh47EULe~M#!H8`yb^03bbK%$S>JlzO7Nozhe9lO1(=&y8^bXT0gpM6G? zOFISNX=zeqYO|j4U2o;~y+dx}CpMpnrJTvc8%MNqw%icU9tWHVlo%xZj3)fNuNL6u z>zPr3^ODlRt8XaU{wOE}#JPnWP0UL_qoEu(ysm zm*o3)7>-Q7(&Jh;#TYU_gK%#)V3NbfLh=Y;oeRbl3o5{7b~_ zhos27K!z5K4`-6y3>g114GuWq!gR~Yi;sa7InQ2LEHuh<^!}>VznqyEe8HxPWg5mt zh*zY3mh~v!y&Ag>xI-I$)+;f(?f%7~{>Li>jpBlxu0tn*DU%-)Q_G#^S}Z$yWrMUd z|MOPjH(q!j*^J=3?0u6E+`ZNGwinG~Osb@62ifs6ERqkO?>nM!W=$}N z`Spk*GHngsH>c3uU@UYT0b-6_4ZJ?7apiJC0Zfdv1OS|k4HvTv4wYV3qRp4or51u95Xh}P!%~wO7Iyo^AEw)|*Bg4YL#eYZP6ns=n?} zhA#5wE6rw{M>ic-<814vD}SE~XE0&qpR3@#Wx*0f%&?Nv0#Enrygr$?MM;qjnuK!@ z`qUI6jtAO47fvVX4dv^G4^8hQ<4t?2z^J|b#JY_8=7$113{Gzy)5f!R?99n^uzjwy z2;r5z9^zIt;Pc2sefMJq9-WA5T%l7(;KLDGaaa0^aGXez)EB zLhIg!hxutjyKz2pm@onc3@AfeaX~_yeLrFf#5TNAn6~!xEvsQ)zfFxmCVM@b+B)at zs~G|e9W@8$G$`y^XIveLCmD8zE<{naqKkfmEYLBzv*#a!Vz8c`VaV}oMe~{c=FO-{ zO=+4SGVFlZLB)w)y?=r*;psBDCn{$&qunii;P}witJV0#@)`{&p1`XmrJ&8J3UdL> zsnI(#rxDZo93=W9oRHf`aaSNB13j>86f^2Q}7nFqY}(Z4l0 zJh4x_dDDXA2XYEOYRehWw8i9Og@p3$ATB0m^b?S|yAKHLDPeEr$l4|&owvG>eF6mc zRUCE_GG&Xp-im^%IV25`_A7ksEf^%Zx1ASj(ys`vf8I&3cI^-MSRG3gh@AUGtUwZ! z3;a2CFsHr?&)>U0|D7i25tWW|n{g8p9$oX)J90pRL>xp9XPvy~aX{&kAf-5$5t(GQ ztS6Y)X4;Jcql&O$g?R`tabBBM0)QX2&T)2oQBedi^ugmX)~59wyx{S~0rTTGVM$mt z1>50_-tg}W=e|T;8XtzXL+{@rM~ghw^OxnMIi1L;4J>+d{N+whta-GiZbGMsrA5nA z^vs62p@f96GfrfBNn91|Qmtp!;30LQ!}3B>w<`SSpg&`&mNkUrRM9awaJGmR60zw1 zt*Kw(_`&I9bf(az*Uo)I1a z&iCVh3DmW58I|=ZTHon8BaW691-_q%$)F2bbkuMZC6;=OsM&O%t}gJG^`8z zo`q```JnoLs!(fu+oTi_$T|H=#)+X=vpuqiUTbrevRj?25C-SStIaXo(vNoSI9h3|D`YG+Y z0q`sAdlHA8!(txFttn%1bS8m?_o361$HUhx|FEvI_o1&dH|H#F1iX^+l;|h+kbu;P zzxlFQZLMD0wJfd*;a2NelH+0T#WqOO5=i6%>&+#Ee@cmiCeBeyR`jjz!`Mq*=T2KA zOL=odq=+2rIm@T@+ffEUkF-kgjwlBA)Knm6=jbf3(vTK~~4??h~12Rj#bkNLRNg8 znYF+_ku;W~YSK9);@Cqdr4zMpfV?z%7hYnIsJ&kxc8U-SQuO=tXsl@{iHm}P2(b$A z9(@7Y0p{%R$$@R&^$I@>FKvVejsQ<0V~JdCo`68tqAR(iW&Kf6dYIQuT-;mi!h}8YHt{u`XTVm4FjQ=(<*8 zSad~hZvby3ddnCz(lviehYndEFMs7wlj3UDVz}e?S5*SSAFsy+`QiLE;h|M}oED~F zR8~#6FAo>ctPCFBZz78@iNF=LUkI&5w{hw1AH*L}ogcH#gBEflZ!vmVz>MI`I20K|i?{P2JXoZomoxTOH{q1&$bFM!IAGwE*i<+r&5BI1ZE9sR}VEeQApSqb3P zPgpa)@3~3{$*Jo5T|H(V6iqZB>;5jMB9{MUwgnI10@PhYe@?g;wuKFc2d6up-SCmj zL~Ib;w}oWuv6xGhj;8GEKX3QT9Vde6K0*EA!9pcd@(fB42lXpoyjO+_xeou;O7ilZ zE^LUa8X!s(Q&JX8>SvMHxcU#YVOy--vXkYrxa4-2rXs#xgkU#r{9PI<3? zvwvgy*75Vpr3SI{fINQI0nIWUui!stSU&x!n_as*nH@yw1o@-R^ID+8EBJf&5#aW^ z!?7_X{EF=Das8e%1&L81Y5*edIxbnad_b~YQQ81U1Kf1A~PiB z+z!H$n60+%sSSZsoXS0>`poGBzIwWO$j@-saG|C5s9v?rHEDgZsuH&O^n1w!&q~(* z2{X0q;N7{i&n~`qB=z#{WpgjA7`(nK_y_NQYODGbrnZ(<@uE&5KAhq*jyHO+#>eI8 zkoBTfmB{w|Vusb8=xnz^kbE>Tya2f!66o@@Y4h}YiOB-k(-MvWQ_=SE%X$YhN_ zXnuUl!{1cpwwClH#9voS=eXLq;K)^?G4(bo8GAQn~N5%SWYx2a!~wxm}=E z>U8}YohMLN4`vop&3I_o{J%GkX50`insHZdk-`yN?TAv5uie-%m-7Eb^yZcYoiYBL zDAl0QDn&ea^}mC?gG6oKzszE%<=TvP3-7rm?Mz)BAP4(oZ)^m4V{e+MOF4%RMkYu; z5xc|soQlg;c5*y@QlBIUwc|*sx!tu&lB3Op_^$tadq#atotvau`c|#3=zf?%OJJ-K zOf32)fKg!n=dKQlgWp^;B9Har_Q|o`enUk2IWSoCEyngU&nh8z;&^0L3h+LxtA3SS zNA$U!(mTy*mvNiedDQ$cV>kNO;cnl{xmRx`Cg*88lIK*U?ut-m6nD)WHSM_{)pD+> zLdYxE+BzIcYI-yCw#QM+IXP3K*Pywgb2Z-aBY$@^o!ou0^Ya?|B(FbXIA&7%PaNJp z;zUwW&x3g*XH;QhFwR7hHi#p#WtgFpF$T=b-xBW>^maA#AIF!g)0R(pdov9#(cLuE z()XU}U0zK09j=^mU|FK5uWC+;D3oRwnA`QAuvc)+`eXdW)BvzJV|)oMra9@V_2*{4 zrzDR@(SH|wo?ib7!ab3>q95l94mG;lI~}?>+t2c9jb^TsLa04+e4?~-~Rp0?ZV*1mZS}A*I4lE{{HyEiuwOOOF@jil3C7co>lq2 z*mHaK&Crq}SslT;g!KMpw-Rpj(r2-3v8t+AOWebL zS?+>Jg|)10`Gw9YRaYMpWJ^=n74*l38`1d8X;&v~-P8Z_wBPxzjla$AFAOj*UcGv` z<2PWCGXI9Vw)vi*&hGGWPT%#|<2?j*H^sxAb1QA;KN|%14&rY^@oC2w?zt5_XRcs< zW~4Gj@aSb^(o_Q6X-XAkb* z<+Ec?duI5S6zJlk;B!Y z{!2hH2ud7(>X7ZTfA;O=yU&^w z8W+w=KE2ULd*VQ^Jc3#8&0Il<_KJSQ$6Q?IL?`tA=|P1?Q#p#OX;87&g^UU zJ-N>Q?f$Qod#+q8N55@eAOB5%{>uKk6`M#;k}s_Gx^(L{W$oUdvm1`{_8GkX$vYYx z_TJ3`ohSHb-J{P>3x@XSmzBL+FTXe+_xytX@44oG=czN*?hFijtS!) z;9pTYZ3^yB07%Dkce7(OkTYLO-&MeY692 zVtGq!@&N^{bAy)yGr#Rk#ZGohAY_G{pObATC)d~|(;V~3;)A=FtSVT~$HZ2#cKL*L zQs?I32rF*M4mOIIY#R>GKXpvk9Ka-3s3Lh+g?}eUkM{NObodw{DF%j2xM)57rB>w* ze|%aU$)r4x&=;S4YONz*x0VS((;TUZHYZqsS+c!*cHbM!Zccyp!;zDtp|mB4%p-z+(g?3hD309w-x+IcOlcT2 zUBm{f4qO0i-7<6RmY6`jsiU;*JDWmTyjDn_~P}hoM%w~;s>|#ZvRM( zy?U<>I{43^%We0hN0UzMqo+yfrTG!OA)v~(&mD(J3HIY$JhLWyl5b0!i(3ZSQ+4si zkDuYrTGaQB{uW|19lgtJgr6nrUFlebvZj|P#Ho#@#(ya70{3T16U#vs)rpo<{^Sqz zzU(9GQsWI@nE0B@@~vg|NPjezO%H*Ie*m)vguuZO-GGtqe@rz-+${!fA(s^+VqHZt z6ZN>wFf(6nUOmy<`$cFAmllWhbxSF)VRp6Tmfi4m&9Re`Oh_d)jS*SpI5Ar95E8Xa zv5wyPvE|NklOyu+4>h&6*E3A=;8?QA=90*^Im50-XTpbFk1u2{A#a9dUeM`Nl`nuh zSbeXKp3fzQ7?~Sg@EfG;&9yXdR72Jf!!m3}0i5rO3b$il+%%*OB1<(w=x!%4HPI@$ z=^e?xM|_Z$nKZIouktPFx^Xg} zH*$Tx8Xtt1#MGJ< zN}pthQyrX~Uu-uYg57UHxHky<4@%BO`eYEXUdmXVUxmD(pxPy&RX%ltyZSAg9kX>g4y```EJ~{d-U#2v=TJuCRKR{yaAxGVuvmlJ8 zH#3oTXd!;HhT1BnKHzeioh)Q15!(pXh-`Q|+8wERbB2}72rx8&!USL#{rr)%C@GXU zshN(5Ey02Q6;0kc;aZ;_iVdq8tOI&~UM z@>PPC@WYXv7FWuHlp4G9ayrBn%|>rgVIU1AeS8r)+h>xSG4l6WAQ$yDP6~Ves;ytp z9wl&(zopb9YA*jEwpIc;`V@p#}^{d^4I5&~SU`rPt<8|Jb7B z`<^Ia4kDb}G<4o%%t4p3|Nealq%0~n353V(7rvnW zk+Lw3WR>(urHm5v-PB+-p^M0V&V(4mgzChi*V4p@)1-y|3?SPN@S9Ofo$~_t%JqwW z4IJTe4(e#Iks$>w*J8eIk=a@uTV~AMjfIbDIS0R!S9f@&gl93Z+ZD9(b0UcW;_6=3 zN)4SMr38RB$EAM?S9$OF^fgy!RRwbLzD!Qjy5)Ht@UA9GJyS zG~z>~nBkJ0E3z)Awfgv--3Ww6>#V+`=J|tI+7Za^jkb^ZPoQD#klUmTvZ@E2#2S1= zt#yOkrdq^$ZA!?7nW|cAz0ToIhHd5^^EulETJLdI;vSpLI@2@+$Ms)#YtVkf51U4i zg-t`_eyrZm&A z8#DcxtReV}!-PqXQFGNA$P%EZh*)I^Sj}ZqF+#Z%L;$lukeX)XIcAXXJMn;%Bk((C-I57%+N7<_Tgb;xE7-3^LMqznD5JIu3EyCSNiXWtfNN2`6 z(Y!T~8_LK5O^)zWBeDLw@0yGcT=p;Y|2R7PxEA;Sk6+iW-QTrp)w;h{Q!ACJB;C2z zol0fhAPGw$gq0-ZxOUUF5>}EBRzhwLL!1z2Tgfe1D8eXjTW^?E+>D?*A_FWS@TFbexm_`(wkDIUNZ zs?gyoFtZmI5&@)UbRM)MQT|&qkqg?sw)lv|_+C9r3xw#A@$H%sDi`bI*(mj*ay=6- zWQjlrxWx`OG+Yk8pAA!~Al;&6If6D#Rl=mh1x`X{Ew)q=%ihAoT7-!m_;X?E@r!j` zsmvrUv&M2F_0~oIBJXmPERisyxQn-ao{+?~`+XNX!mwFYF*o;j`y?(qyTt(>q9IyA z6T<4iu_aU3N}GK>X0LY-Y-Cfjf_$JNz%kaI#0H>D3qTf*yM_rt**0Ri(B(D)lJngT zfKDAl&gIfzn;~Gem|EV_7MbfR86x|v4!nJenkjX=By}sxwPVeiI^!ETG11P=c0IXm zYG~n+AcIpS*M+y6qaJeV2cjo&v5KElBG*MNWC`>{vKZp$AKN887A+)l07|{f$<5sL zi$I28F1DjD-6iFG(So8WTO3A$n_k$59rL)^;`Rx2F~OuTt>d?E9-o9xd_57PPPnw3 zeq``?2)aKuxTP3KDFNPLhmhY|-1iz>UmM)Qxug`m-M0w$QG@$q(ET>I!yTY(FVAiWfI|WiVk#l->)E)(*PA16|4- z7M~hC^~aJehLT0jOYj#^cCN%`Ay{?e46_C$x`1piAz?n(PNzK>4LhYt?d?EzQf8l< zmVvRU^QL+H5GO_0?J1R!I|2XG=~NMj=^1EqJ`gcLNs5+*LAJk5qt-~gWjj=}T){J_Z1k2+%GM#{QIk7_{URK>d9ZkAZ#|*&N+b?HRMp5pX(ft9JXMvYS}b#+LLEC zQ7txwY(_>0z;2;qDA%8|&StTcS?u-eI_&E;Nt)Ep$Kc>E zq{Je`K!aU&{={Gd+aILX_NqM z{saJCzFWD0mh_PEyWTbdfnr^p9&4$$0jK5`>e(-k4KJX_+O|LS4CautNjh$mxO6Hu zbboAdJ}~rT)7|S&pSB0WWEo=9kjs$4lzuV!K!{7CboevkyjMu>%%$_@GWH^jV$k&k z45gsMq@m%RFr`yW5=?ao;!18m44IO6#h872KC(uyP6Glr%+mv)K$?!&Ye&HB!0WRh4~F( zc3x%l=eyWpad(632hcuIk2`|UIW2C3Eq22e=7^TQJ@V35eP`V!_nLhlM!C*Lfb!1b zf-U;vhwo{h+HXVdg5`J(ynl^&ZCc*IkH_kQmT?<3K&Be*t%3=OT83@`wpD%L zX(WD8J9((SKG{PPrBQ3ZJVt} zTg6jM-$Zp@8y;N~y1cI5F$}&`S)H-ib=I=fs6IV@;E-!nRK=i|Kg-4`C<)6NrPSFw zg{;0=5%0fk8#i0o4A)6bo+6D$T5w0VvU_(>_4X#Sl6|m|g&~b(yqk8@TG;P%>RJ^| zc?*gkOUyow?wk;fI=5kos(yO2Ryz)Zir&W5J-q=fABKAwXKkuo2sf)~brW{v?YTH4 zO!S_${#245`^}x{oK-#<(%>6AJ>Ac58*3ji=vuud&*`+(MqT{yywBTTI9s@ZFgqo_ zA#iX0_M_pP&=7tG*}D$EXHY zjti{QBjU;)3AE`}H2E$)q+MWOUmk5un|jQxL=P&8&fQS;pFFcQWEme(ht~6T$)U5e z-=_*lm3mY7F#tdTYI8|E{ko7dME7jaP^YQ*XhEIIB0-&oEv*34pm|2Li3%m~6d}zl zDJUEaPH|#LfLPi%hTy0PR*ED`_m+I$sfTaU?Sv41#P$|E$12bR!m-k12DZI3P{;$C z7jA62NFI3eQ`M5j`t+3LhZ`4ChxY%&%Zg`0g3>#a3hCE`2T!-1qY%P6#Sjf*!80RI zio`~OLp$2Mlo!BC40}>&ivSEv_{nhN=!Aiaio!#>xH_ z-8ug~>Dy!U56~<8n#K7LG+*IGayg#*A=hu74jw9T)>uh?HDid8j8u5he5+Ae3O9XF zoI&!)=~+k%Jc)5Nw!x(dK5fOei9yR1T3P;?CiYD~{yrWI|ayfrgdyOTVu0UK*@q^>>1yPwK zntuh*<8i$31KD4L7-FxQ_RKc8W&C(yNA;EHg?JB!Zw6&k(_&>JN-4LsZ{_2R5TR46 zu;o8C8`sxKJ}4+$QD|ibuUMD@hgFD#ocDhTr0kZ8RYu%+lJyAct#=}o|Lm&wQJCb8|m&SsB1DdARUfMbcdR{nhg*P&L6PYv&Ok+p1_QltkwQ>vVJ zLUqV!tc&kAvri6ho6|KlcE*bf?Wm*XG#eRI3%bK+iX1bLkrR&BIi)xYH}tO4Yms(_mozvuzEbGk+PfQ6!2l(^Xw zQ63m(ty$maMT(FZ{t7=dkyfmA{zuy@C+%tA z$4xRJVJ~Z2h1r0Yh0F~x8&vB)Yn|VqyIp=C+MfSC)}g9XXjL5jO`THK+6*>fOr=J7 zODrzJ+u+Tztx9g-(Sq4n#lbpxqFM_j72!?sLYJol7j14DXvamkU_d7 z>R3cQfy_*k5?%3u^p;M!-D?&RX1Cfe6+fisS(^myPi+^S$aO8uPzSMu)UDbCw;HWX z{v+SE3hD8BD!`B1w*73oRe<9R1Bz+%HmGAml~whD!GOgTu@$i}Wuh+3R zPRblNF5X7d?N@$i8WNg%uGpgJfm0lxI!|IG3|iKid-4BHzlZ<=H-U&9N-0Gz;Z9YCp<03q%4C6;^gjM%BrFDOJSMc=>{; z0tUan*GB?u70eO31V>;8+zhW(>J4!i&DHIB1wKzyO>!~oxh5{fZB*?x+*I%3ATq^0 z?VnjYiX*|!H(XNBGGT0n;qyR6=~?NrNwfloBvah1D4src&+lGxL)jwhVCpU6 z{KSfZwyW8z#tpx1GB2J5nY$z6uR%nv9z4yN5rj<^h|k%3-!?6^D>?5*R7jl$`PU=g zfy~rl#QSWv7W7J6J}%xA@7oN>4!9=TAGQbYUim;y z|71Ahv(SJq)R1Op8{4K@{`N+O6mCVFpQN3_dyQ)^@5%1(8L#Mb0P4s;igrWOBc^O> zm{~JDTu9_~LjE{xafUUe>-acX0E~S?aORD5bsK zq#f;NY@{Pjk&d*>?+bo-6;9NU)G$6w3}!15Q;#roS^&0!sk(&K08lSrE*kJ!2zVRx z012B?N$|@Ma=n%Q5FsBgTS`S{WYM;+Dd!1DdjN8s4yv}2_E<<%)nxcw<`hdNH_oLIASAN3U|Ku_R2sc2Ymzw3*C zX&7QA^LLj9=}M27NwY@s;a*&j1m~^Kz5wF7{_)%+N}ZjB+X>jYHmr@uAd^-oQIt0G zWoE*-I0v1~TJ{HJr&S?9a1(&CbQlNvLh)8;I*d=0K=N*In~GYeFJDE%@3)c@kSRRO ztGBzfS>@)IKW&)?@)QYT>eha|zHZGYn|LXXE7A0PB(<6;yENo#ahAq6^oWRzsXH9S zV4jxx7^?r{{f4XmR5jPlXdaj$Xym~AW2MoYDu?~T|!SuZrz37x*!ET00>#iRpPB14<~ zm-?q*?N3XVHP{2>Hi3r&09p^R-F4IUuZ8}$r|ySgQVF$40#l4x^wP!O#&Pp`R?w+p z22n?O##%<#lKO!ONtpx#E74=|5-~5)U|zZqA1=`kXb6wycz0CiWhK8}lwk(CnK-%AW3L6Ds z6qit)kL3V1VU0glK&XK6f+dQv0Ovk2n-CC|fP4+kmBsih!LzY(ynyq^tQ1GOW>*VR#AV@J3_z-G zI`g?_oraPlZsf6u90~!0R1!*ZMM6S=8ML$53jfKmHyj&B!&uiTaVXYZ0q+$M-K?IV z5ofQNzG6mtkOtSh5$E(JbUllz7T|5fVS#AmkALv6{&?_k8kMw!)0A_TE@R`M(f=!VRHdv8-T5&Dp@ zyZ$8w)k^+@kN`Nkg+*Cs#c#t1$YR2Jl|w#E(;PiIj_$Tx-z^ZhBmv~H&-hsayzi&{ z5moHOti^|xJKBq*YEZ)Od&xg7Ayl3xG_q(RQz%EZdjii9eg-H@0Ya*Pg0$6qZ-v6w zW4K(#WeYK1N9<=Mtnb0!)-qI9uiaY4nH%JpjY~XCOGsLq$Rp2(T7XE~WepFxFW}C00D=Vg0)Z(vXC?pGC|UQ=UthmKV_3Pn5qU^c$|ENONnC zVA47y^4G*A+;$nCE<2Gf?R*j@pG1b6K0)VTYr=&KN|s_a0?Aj9+B#iPN|gJSOA{h&xe_ zEi)Yjm+>=oB!--jg5h?Dae-p+Q~^0)^3OBwQaXN#c zPU5FDhrENPFM0*$?uKGEglRCb2W1YKncoFALl)+BB<7c$_Oee=&>Do!$->|A0XT6PRbwSM zz_^v)XpCEb4O|aBeCc)zLWB6(zYT#IR&uMv?p-lF%8fn_(^_EK({DL%cg_jCc6+D! zuU(d9zA&`y>rjW7>RyvK=?v~=7fEXg8$CJ15vTdH7M!chKVT4?*3ev?{QLw5J;njB z)J*+J0&%4HYM9n0p?2sgMJU)?**97TWp!^*wq$jCcS-5e1`&l!EaglUd zOKG~d+e-}QTd2EW?!-rDhx6QDG)L}`?A)p&*NG_B07#LBejYHca=eV(DgJwg5vpvvrxN&Q)KfdL z>acd;$64oPtt1TRe!)V`HvcNOQt;CI8%4AQ=KGEq<{Pyhk{s~T!<#qw$WiMRfI3ru zv=+hc;W+P5@@_q$#p%yUf4K#r0Ejw(TGCemeW)IP1!df_d>lX+7A;oHjPyf*Ymevy zI>xTe4+7c*y2~I|g|V3FeJDABwbHc?#HgQoGubG_q*oSX~-L_C#Dk{_8uhHR!tK( z-C3Rht&;q!_oURI&l56mYehfQV%Yw`wXlU{TSY$%vno~_zLhX?-zNO`>He#)m5#Y0 zvT^#q&HyX)T~uy%J5B8z@?T)#pt)+R!^B{dx-I3d6Nfr}KKyP=94E6THQudG7SD;V zre}a9-cRGFZMB>5P5wM_tI9jOxnW*%9n00sozSYk0=RmXeYAoh8q2AATfK*kwDsm?JujPv~abdBnqc zoNg+c>(xBw^d1W=t{ZQGzguF}G$&D;2rMAkdd(a}Hx~Bv8rcpoqSnWLcyn=LjGF+~ zUqI{q<`ijHX)mByEWNV*7HR-3^vbQQ60{tB2w;$^z};U#;DMjWlJ9*D&txEjx)v;b zM4iSQ;m^MkvCM%+XS1yE2RV+L*N(hL5H))>Cf@rxvI$Xq@z~oU$GwTmSF&Ng#ju6k zY>vi4qL`Z|vQJROb`vk&DliruIgq!yvjqp@wEAlRelUoj^y+w${5~GBDpQ%Er#+21CLvzkDjos?8%n`pJj zZU5UNB-o%Ht2=F*?73bJ@um&ojnN8!;s=vldM;)`5omBM4%c>7&Hu7N*%XaRlbq}} zZawF^cyQ8)Drfbk>CKZ@r>@?9<-)(KyYeAhN?{k}rTb6%7D(Z!STSV%QB?NE(`C2U zrl7`r5!kx*&33-h;mL&u1oq<2V{fZg&jCOFqTMT0DdTq}UF({^{>SJ3N0nLcs$QI2 z%ik7wbpAWloG%XLr>pX$A>01C9sco)!grzR`pbpFw|_mC`L`Z9F@9<=y7A3zkFT!_ z3Z4YCNOo|8hNiT|d~@gKN1X=GRRxH=ho=^wIO{ z(@#;2yTmqIIK~@hQq-l#&&zG!%q)b}E<1J7pZ2H~o~x~T+R~9pj$Mx)AtNEcg@CHE z$p`XsIkB8xNt*kJFvOV8TrKiuMPWFV!m&7*n4yl#km4WXkNz^qTpU-p*na<5k8(DG z%lrV?0+T7}@vY1-Et4JDAgj1?b1S{hV)u4ncaTyOB51;lr#ctMvQ@QfzYkHlqzI>{ zb=x=LJ+fJ1l=HxcBz({HWNa`^KKn}D@vrJF4^2u+%&Z^Z@Nxfb9~~Nft)zb4`~6(^ zFkxp>twMP6kx$x&lMdof@!1JK5W62@Rgod=y z!;`jcNG*I4NHou!$KCn0FX#5z#$Vd*dADpxE54~~dca=n{Ew`rx+G-x^G8hp)R|Ut zB;9+sHvjqX(hI=i_T6g=mPNd+PF;RGsQP}_vgtp*&dS-C71WJy_j~izg{?)x7`7e} ze;?B*f@ib@#~UcvD|*${wZVLSd)$yQBeArn)p<#wFwOr)rB_D!_o(GF7ktZvsSUEB zHqMr$k-Kx#XW?DO5PGO2)_E_J5MwpW9S#5Gc7v3@gg+if(AMMJbqFaY++BHUZkD#B z{eb^ReTMT3lmUPgk>1EMwZ>fDR=S$m4q}ZAf^TI)(q!Po{4?U6HmwdpHe8V62H+_N;`x}?@?$;c-&a_<$#~Ox4k0otB#di2zv3yzdzw=Jt2yJi(*uSh6 zkPrV4_s#bUXgMqQ{Em>rIg7mJuEalf5t2eGFmpYMU#aWnEFlY*t=>0(;NsDc$sE_X zh;wrH(5Z2EW^ojn+Q%PznsDQp+}Rr*vvWQBc&eazpC~z_5~G9NvXFEQ9Xn4DMvF1(i zHDi2195afN(PMN7nNzoo2G&d}e*N_Ro(-yvzA}IIA=iFP9oNyqm<0DMaoG@z-+ETD zHL3{&DR~DQOQE16fVPb89Wo{^kV_ z*G)g5-*o5S6KCuIyhx36Ikxu?wC3t-xIpH{x7)|4l^4f8LS$Z`S#X69l*}$jL{VE+mli({j=Yl)0V1_%6 ziF{CKt7>GKUVP&Aanp##MvhwQed>b)*7-M2lN^}aW%89+S}O7 z^-t!3sh=j2ntJj-f?majo32D(E0D&!;4r2I&GI#4QEWbqBJS9jQ^lLS-)=Wusc5SmFCcyN#IfV&=$&!nG*i5*C1Ihf z)GRCUgvsipV0yzNP-u$}bLd+U~>i=xq%>SsU8KV4f^d0EkP zJ)M4iRxLTNdGAKLzl|JNwt^QSbYza62ozOKL&1SFm-i^TFPPQ#Zs0cC#AG+ALL`jv zufaZ_!@mx%1vJI9(JaubXNFzQk#=7494{N_@y%@9kt=ZEIV-?xg5VJ#l1!i!U!;D* zN98DT1XY;pp5Z3_nn9S2;zI%9PC%Xv6Vk`z2>@X{fLyah10paXQ$Vnx8bclg+G(YW z&B`ev6heSW8s)Nf83cen6@=v+)oKYbRuATdL^$aHqD1i%=iH;;fF18IC27yz=bfjI z030$Q^o?q^0DKg+pUyXWry6ZjJ&$p!iqym<;kTEol^7xo={qOn5Q>|WSsLKZt6CQ= zevz73Tv5d>0*PYW{P5e)vX#XqWg!3|#i5CSa(R<7wFr$1wP!blzL_62;}hUw-M7f9 z+|;hhk>DJ~s6ap}#(aJ`D3-G-`~)}`;n(O?wRT50FEEl?U~;OF694@SynWb?v4OHYSCuXq=cgC1rvJ<+8_^c*Tozv zNvHVr25CjR{N$KwWwD~TLbXYt$^&XvK9-jk5f@^}vvAdPOTzwk=~9f-mPA}=A}x^M zJS+N(J4u@WQbG~Bwsx!Ii7xt|s-GTZP#0v`v8syAs`5c)LWqNpwdRdlVx6hOUTfNj5&=H0>%?Tv0@7xL zlv$aeeRYZ#O-h%@?3<+3NT#(^wMdlJP>2&Jkv0od`Btf?e{1f>#c`Pv&F!9IGP1grAKNLIt3dE^m0Im|?|dvr;`U4p9?+-UvR)iqC9U zbb$W(gh<*u?C+!)|ZCC)G|7Uq#&kuD-cB#u;w3m z4bXJN!{>+(LY0r?(&$dYg}17qjereM7ceTfe8O-AhpNr;@tGXL5|J{aqG}eO;Lkzv zg7n1|ghVT0$rwKJg!Da6xo|LDjNmZnhmf4Ngx@{4qH0Et>~k$~z9i3dMM2b?8jsCN zD2zXw1A3j5hD}kKf9y+`0!+3lp<7@exkaeW8SqnmFMSvSLI~i{TP`>YnLu>$|y!u1+< zH!*5gQMFz|%4ZRZ&7>04Bmk7}2UKg5l!e$_(sC{GbvW1WCOpvPqE>FQC>Lo7Uv5@m zN(B6vf*YgE<*PPY@Ko*bte;I=-Hh+6@>j5`mX17~WCHPnfY>aSkV)9Tab^*UI}%!E zt`e!utN1vM3FVoTm7T=QBI4#E<@0~{uxh5?I_uM}kxn0!&wvRcK0bku4;8u6kO!ii z2aT)3_V1DHNyEJ)1Ek`L^FK5>r7yf|7Lcox4;{aO(#<*B2~WF6 zp;`hi9U%Cs|A2pUL`1U94bWD;jG~c7v#KJBq_%3DXapZ%nx`3qnosI;1kl?|d-o#D z7y{;*iBm%ioQWm3!@HKV@cWa1_MmQI07f$g4OzrQ(PJN&xHud)Z7=%|#s%)R=J5yHlpFbY zXB`@bsMcyBs7Nj;A`Z;m+>%=+4(IMl zK?Zx*HHYYlUMHhgj7hitMA*zCVjeABt8}U6ulItj-}a-hd;g?V$4*CisYw~i$KiB} z%0cBM0eF+3io^&Dk)+@zfaH-M3{0HWsVcxwlOjm65a(=p_P_&YpCnsOR>g8U5_3pn z8wH6qSL_CX;Z6TrB>i~_WEIIu0aAM~Nb4p7_^%I30&!JWPN{}H@3pff<+EUpT+ zpu5Z5(}9bph2!DqpcXO1;TEwAN( z0>N6p2j2NVkyeb!93Q{Wv_X=DiDw2&IJakikS6SswE;;XnCSXATRWBQMb?db;mXaBrJ(4qbTP*9;iSquPEl`A+wO@TC@lkzK{(TWK*iX624 zT~$z$UF7_{MPrbC#p{`BWqA9nL=jP_3yIdedA>6`c(}@CgxTDAE^#NsLI4-m<51Je zDH-H{o2x2z7Py#*>ql^oWU1Ra(sThTAgi8CLH&S*GfYy(*#D5nfIvzrl78QyZhAEu zJYv-btcpfRbLH>PHUT%+sqQcRg~6&?-&Ez5M20Ky*vTrQU>T`Mxh_X8e7b6JXz#_``ISY;f&NVv>;vp{#7I|w~pGQAj;1-AW~p)pY-4QLy4!?H{zN) z&BkO~(uBk-ZwibkDEwQoYe@Ul^G3bTtk%?HrO$tLu>Fr+qr)vxjsLGsUp5q5RYRYj zeammL+&9^dCr)j*0ylVRb9{h#_>>lcvs#q@K0lv!EY`taS7cj2{O#=0JFN*Do+%-k z{K>qDJEhXYJLVAE=dItCx*bgJ+;E~mmLHwwlQRI6&&nWk4nA>sSR|fxsbEQZXVQrc zAun$qm@a1qZVY|Ze`M+*QR&VlSaMXj_F8t12(yP4f5HjnC zXtMOTL!x$3UHxGbWnjiOla<5uuJaw8@TK$H;y9Ju@66MY&iu!p=uRF1W_TdY^~dV| zE`B%yG+y|6yWF-FpcU?4+E@}YB9_|r>I-VUmoyB?Z3F@6_>I6HdU^izUULQ!?@_1& z2~vBZfOpOUay56yC(rV%%$hj3Vmz$;}2BO~lFg5Y-Zvq&_2G0^7e&O>g5ZWZNJ+966KKv-9;Mm#y8!-4~+)IOc*J`F~?`8Uy_xTS>p_&N1on~ZXs$(>>;VM<{E z)1A|a>OItMXHd?N=zkIc$_m@oVL3c;~A+D3B zkEa4lF@CDvd%kPe2j;|tK7l+#(6%0;I5z-&5z3BB_i}lunx4=X*8Eu88!ctWsd#$n zj-bJ9685R79CKpGo5%NVM}BGEIewBLYr_Dlo*GfCw>11lQp}muX@K|V@4@llaBN)f z+}^$RYD&!akpATJAL0@3f4VY>Hds0rhnKglofZAI;_|GhO2jfJ;#k5YuX0JMgy^N^|D3b)>Mzi9g>7TRIG^iu^M0Y;xe7 zLG8Z4zoXL548Z4M!MiwC_BvhP37P1us$z6 zsMZ2zo#A_tTn%Y+LDsfZOvz-`mq%e*^-ABU7e3oI!A@XF>C)iH z6|8ajmP)_W0{^Tgi}uLKhB~{iO;tAPEZ;H3GuNen)FxXeCP{+TKc=EelbGqLZ8_ea%P_>kLS(nDsYVIG|+XWK0JZdv%;D~{}MmKSV0rtvQNJ^g?~-~#^1J>EHhcfXL4kH$J2u;P7A z0x{00!OmnN{?)|oJ+Y^c7{dYaua3!>g69sWwS>Tk_f?LMQ51WA1cV>Qc4vd)xl`1= zQ%!nr+a5jHe*lW;s-tDm2iSFbTvBr5`GSu6K=CG0NUAM03!cJy&W5JGDA|@LkU72O zXEXm3$^t8JoS~-ck=hK!U!lXCi<}~UtU=|aN2>?DtEsTKv*y1;J}2hoMgP)T6BEDP z*Ig_0Ufe+(4I{>j={Z*%c}2kX zkr{bq;jW&X?kZMpg50AJ=aGwc_nL%c#n_GqZfEGpp=ai;7~Y!OmR}R~!B+EH4|#1~ z>{4#^@;+$X0CHw+CG3v{g#oC-r5$v8 zXXy?oVBOA3YG@6}Z>A=}ayyfl6sdWoOSAy634R>OqM8-u3R8=ACNu~|?0sM51z(1^ zIltXMOT>(0kGxLnNK3B0l~PCaBxtNBszRvrVj&C<`92!C^@U3x==x3)PbiekPix@* zDL^`z>PNr-;>C2ZYx0~m>e8_2xE8kxPFSChRs2GYesqmAn{7PtqHqbps~sgJ=^*$! z*KxU7`nqOiDwB__+OyG@N3wi%KpoPcZqG0SPJc?|xNr@QsK|G6$p(PqtlDMSLPU^r zVr+C+?RdpBm3xU*4L1zA?G=M|E_b(9PHUkL2;Hak37I!x>5)T)M4GNHaD^B<{AdY_ zj!!15@w}*J7~H5PdXojfhJ-`5>Dv0b8ACq^*)Rbbk-7;{K=2jkmUpw^m96L3y8V{w z#*#hMj`8b&z!2JiQQuGyQ&U#D#<#@E-Wk zCIggbjQk$Ulqg)OBhO(=kqA6Uu3TrlL{+k3AU} z?x`7@&ooD0>7Iz9lqdjef8nF3Q$(P<5}Y(Fa}XdlUAReN1Kv(QiJizC1a1h7Q3@jz zrO(fC%+(@%BeDF)9RAHj;>qlp@5%NIgi{z7W(Em(#D*Sscw}5X#xO?dV}Y{P@p*uE z&QKyA;qv4@?czy&5I;{3nSP5dmbVP(y@R9x8yIBw5;)+5E+|l>$34ba)eqKD{&3d{R73XI>t1^h^2?-dmybI?=meMFn_% zRsXCc7GoH=ry3{nWe#Ns6_CQ_aibq<p{aFw628?;qtIiBR9zyR2C<26Eb^{wDehjCv&2DsuX#H{$jOUU{Xe@nV+PSPs*mm zzwnPrDkub;JJgfKFZ@k}FN{7s9@ON?;83F{UAjY&e5=XRX+HqwRR>qbdW&SitZsJC zJR(oO=j03CV*`^80Jm+Mv^RiL=^lpaW-|r1^g$zo0J$&*2cfAw#)*aUjwZmS7zrGO z!p*S(1F_SF<=FcsB?nu%pE#@{l> zrzaO>?3Tp^b>X(Zmfd=c?jF7tF(UKtiJgG)OM#JSIwU>SjcLfb`k;v6ST5QglP8bm z^~PYFy>^_St-B*_p?w>4MT5f-j1iSmSHu0!nrB1JioBoQ7C4hA0J!GsxX`@^WcLB2 z#|3_4LUy0f+fp#MU+thmND<9tm*_YR@=2+sXvReEE5yfIzfmGBmuH3QI* ze%$)k@*oL9*3F5oT=2e$m*OMr`Hu5Tx*x&L(u>}7^{>3rzj6iq$74UI`S}Aplg!@~ zn|xO`u}65_!T2wBICH=SmPwf+mlV!*a-R^n8|%Y1`en!F5g!#`FM6VMeol=Y#${`l zX=9D{ofgZA&(fYcfnwawenl^<_F-uC)w>NvVCK^a}qZ!Mkk)YKst(a~wF5*D)9?x+%^tT)31&0&`@~-*r#c2&rz@seAj6C85VT z#FCT9QjsX6OCFMq(kF!F9%_Bbx^B1$&Bp4cXT`C2aE7{(3|ZSEsSjXRR_vTfK! zUs~f_OOdw+IIJ8awCPl2=O1^){opv*o{BZvV$pYT;c#5EpugsV^mfI&zHHpjod|`D zQ@suf?-3r{+dO|)!Oa`)^9=~60vD)}VaGdL9YDe2-}MZI5+aFZ1LG?>rs8vlN|R?PlI&a@*e7N&srAG<(VE$R3$}8Mfw=?(@SDn*m1I z$_Y6m>r><2-LCcQLE|32;boOhuy?u|^gh|_F1iWWOQh_|U?+*xIb3+2FJz}m&a(^- z9O1!BXO6PWc17bL2Qk>hgN~p4y30^}8Gs+f7_>5bc0aWiV4WckV3h*RKC zMabRn&?PhCaMCd4wD6rFK(c?a^MFvLKpOsos#u^)xNNcnbPqSm14JCjk-}3Uk?R3^ zAxf}Hy(K=8M}h8k1qQFig(EhhQck3q_G;wq zYXz+`jYaQpsWmXIDKy}Cr=ifcezM}^!0 zsVlKB^&a91;4l-TOP^)-?vc z3Aqm)ayj~afB!&_t=i}N+2`|mKVLoH9Wg7zY@9u5LT->=a(seJiAHZnc)tx6su*&v zsQfz{nGPn7ifsFU?9?w+oki7g%<0Ee-_hxlThL3+gPWEfOVA)B?}y~U&$HVRflCYN zcTjeh7Yh|(1Fwl*kk99Lo5pP)KB6buqoBPW*S(okt_Ouc0}KH6Kmh$AO>&eem``|L za8&aHN<+UG(47ZRMivs?fb2;|nS;oeAIR>@D+y_Oe9)`Cp9*FV7U5C=T#A0>L4*_y zQ0$28I(2hGF5qs4LmJ_rkx|iJ+qnJD zM<%CjCy4=Em>%CAba@K0zwF%FYcq}&WRlwSloUO8STPaldD4IgVt`3)AwjutmGw2F zXAI6fd2%_jzhD3!THAUafcao~>7?PAL$D2rn6tKZ>bZmKLUAgrUId*~2{cbq=c=(m zxek6RG_HM8cu-Vbm!47-GN$Qgb|Z2=5+UWbQFXtL+2!ZTP+V~+LF_+oWhidw+^e1G zlxSq+>%64@Zk|jlg8uyq2-2Nkt*oR-CWC@!!*X>lYb|^4D)BjQiA?@OW%UW5eg{iEGpl4p(^8woPrMd&%1eP#roEto@{NuDmt0oIJ zu3vw7j_2sEY&~~t=U=o>jKImiH(r%R{{97bMaoBKa?_lRqa{`HQI2g`J1aA~!ouAu z9?O^N6;!)p5^ZKowc2KEL{|<=+aY(t-^M-|+3`CpW{5|U1&Zr(hkDH+p` z>?y?^|L=^dY)?(BPVLC1*#$_Jzh8g&q4|-Gr`7oM-~KUK*SD<9GO}mKmGx{-PFsF+ zN5P`2<1MyKyPkJw);-SD1L+q-PEdH!Iio>$tODQlLNng;zf9_;vB##IZi#731D91!_$Bx z8kjMMwAh&*+KMVIR&~8?cAi8sOc6|O{&Zw>tWbkOwnb=3$A;*47Xl4o%S3pKVvF@i&%KCtpij z%kG^X=`igc$)e_-F=@uUZTDy1NCFkR@+-?Dr_8%(`EWFC*^D+g<;7)`BaO$H+(OG>?~G{Ld;)=DtsudZF|`|Fnwe`v!NO za8i9VFQDdOD`5eNecG9=wDW_o1x!*!6hg`Qa68;jM)MwtqZ=5HsXnG)C zk}`iI*{g4E>O!CPnK}6EhQTeKXM9;20K}2N`(>kVGyr95AlOnzEo^wPLsEpG)O0Asx$?!k?l+wAj1%vd zhhMFq84+{F_GA0YJ%KN$d_GsGp?S0e@L0TUhRSEI^vs;m?EqGY3Nrv{9uQ>VGij`XXKK8br z!$+!TrQ5`A56Ddo_hVWC@*!PxtAUfAekX=KrntfGm_pp3d1sd^Ue{zZM~rMv`wbXM z*{9EY+Sn?^rL`*AxNfh`HF|2jx{Km2B28`(!4_%-b#`CJgg!lC zbI(&YNlUWt)1?2)-b-sxmuTEoIRDWcC4Y|$8vHLOuJ(}}Bc41{^c3>RX?b5;R2J$ld`GwrFUf z12UX{pHh$`q9kKx_vfkIBo7T-i7t2RXzxIrn&ZjJHL`g5_}S^Hd{w~J z#9MiV&34;@P~2k)ZE5-`yLR5Z+gUB+JKLw?t>uOgOBo>__ktAG4u-%7>sh#dPD?pd zAj6JSdI1#V`Px8JYIzg$0k{p=_@ub;6*EhiqL?4qQ7sZ|UI>~34|AYrZ|X@I+E zho>`Ta^hDuB(^(WThNWHvst-G6+#!`i!k>jmK z^abLbyy=UK?Dani@st7)IodcjOmk%)LytX2OKl(*L?{k-u_$9h)enp5JYWJZ&1mJV`(SldlF<$x-&Y5>bGH`yD8={CEiJWIT#zx7YYjGQaSd--91R`dYI$i!;3Z>?bQWI(aEp`B|?BVU5}x50dVqdJWNR>YfOq@kAl4h4 zj-^dWdFbU@4dq$5%I<;&!1vktiV{)6ZByyKiQxx66caXB$^hqf1O0Pj!`zSCo_Ms% z*_X^$_`RC4u&@kZLc7YpmxY_qDkoc%%jw=~Ij--&kI5`K>E@Y* zxFii>7-jZgCbWj|4H;QAnU+3{6`*a3eP<-`NpIzMz2n^N^*ZmKh+a+0Ydx%T#oMBPZOb7`clkqLdLNNf$wi8`?wuuX>y&TUO53}q%%^|a)5LO zpxV}u2aIqST7DIvwMsiPO|B?HX+p>z3Cy_&F=VXu?IA)wm3|J`uxc?`4=}?SgR49# zqb(@u81VnOu~faRmq^CGf*KJruoy3xOgJMQ&>+M)D02qCO30=)nFw>oaCyS&8LVd=c~A0$j8P_W-$Y2mu>jEBvL{pf9hjpT&(MB01EKsdg(!%9NPi@ z$5$UY9$vOvKr-U{tyga)_P1Nx&&NOli=2+hnYmK%G2n2)+0~j)>&S5MzYDc_Ieg4;_-L>T(2~40^t%Sf zXGu;2`A(XCYLFB^ybu^R*9-6f{HlUF(STRv`S*Z2duAzk}Lf_fhWj zG{dTt2@RVt!j2Yg0(5C-a6Z-8p!WYMsy1y8c7b6 z(dU5lToWT*#C~eDK&ImBrOZZ!RlI?jslj7H;~>JtnBOotcZ!x_9C`wY>bx;D*1)RP z;Kfp^qsTJKP`6oFyr4?z3WYQj z7h9h**f0!l%ryk5^Z5rRTA;|bQUvzxn{l=c_Y}4NIM!08ot*~|xq9lyrE?COY_5(a zRs#6noQY}tsxE}-EBfHw509EiBt95*(%M!__I0*ho1ybo^S1U|cxQavnL$aD5_clZ zySK5+ZWhOxxdHt=u#&w~W7U*_J*fS*CQ+}sep|w~``B;m2(nOvqXwkX5LyRlH^e7e zNhvyKd;fflU3AikEZ&+dA2{p8QnIaqliTm0ceX~HxsZW8`uiOrQ$KPH{IPXh#A3j% zE16e>(TgJMMm;W2W1aQEvdCZ;7)ZRmdE!6)ygkR4+}{FhF?k;sS(j%l9$$wKM0r^? z)*GDdpY`(qF;O2iDlj+>_S>q!3Gd|0IRH*o7wU}Adot{j;yuIU?6nxZXu#baa=K6k zw2X)ERc3yY+oppy9T~n;S-sMzP!CrZk4fV=5NNNl?kTY9MXevp#}-IOKN{>2EerS6 zet+dBZ)wC?kkr5E|Egq%g)K|VKI!a~=}b&Tk3TcmrT1Iw`ms+0u{Vy1)LHiFEsO^H zw;EFX<~3Ro+gqC%+Sz98TE=IPxJ|gB@1(Iatg07n|ATP7wA3?v_MCp^vqO9Qr`CMzE&Eq6-MS-5 z(zyy+DJeM2O3^ZGrBIfMod8mwbuVsHl0E{oFyuxHpL=K#vD==(jy2{31gSn&OQcBwW8A#{8B7W?Z&`-z zT|S|Ej4dx?D-mVy*RofcR*Po~mTCYiJ`|099=g44skEu7sVt-EOMd@RPG;t*42QeG z%C&s^r*bCEH1?n<>*C$4@prpEIChSqUc9I<@f0^-4+QdU z9%onykfygHHft?_Iy+(Wh?y%Q7SRXOGJA}2+YS1?SM&~g11%quOXb$lA%GaLd)iM+ zMF@g^hj_zv$VA5wsw6BdK1Xk1DK(EPU?rX(2lZ1#M`;#w||p80MgJnGF@L0svUqP-|~ju zZs1-15MX*=x)3*z-gvj%Zj)qn6*~J9Ge!Q(%ELV(b9=dzd`wF2;Bx~EBrkNz81R4? zB{ki-7xcH~rnwuGp^QRw#`CDyzC6kUgad4uIa`BYwT{w-vMRN9fgpgO1Ygn2izeCy z6X{$6W$wRD0Va~>KKZ@1vFYFNE9Bg`sm^!(YZP6In1A!yFoTtygtQgS{@ygF%8(N|uN22YCRZwSmO zdyv?j3HZ*jPT7o$F<^ATKrfc+*dX;06W6z2BV z*czz;a9VpTc;Ln-?>Atp@u8}>u3zGvQZf!<5=p~9lz9D$yh9+g`oJP-C&zTa(mE#a zeV!kyZ1@UD&~u)Nct`Y50KM;p=aY?D+xMe?9Q)ZWa$2Ryb&l^ZPCq*cq?=Y0u5)$> zkV76CT$aHuRSqfi)=#yZpO~0B(J5Q|EB7JsgT;n4>HRxen?D+67s9$J*A^guP(JOI zlrf6a+PpQe5rkM|VJC~AT>@}ztnK$eo3wPAtzo}^60LJ^PS1DRkE{b(QVt*weZ{w^ z2U1Sxar^Zgp_VigJ#VYUQXWvO)RV)NwIKb1KTnjT)QhmX#BM+!Mx5=Iz;yMd;u%;gc7U?LDLc+ z&vwM^6f|d*l;H`Y;?J2-lbC9aTT=aH1`!9@j(y%Y5_f9V14@z;uJ*1mrZ@`Xctj+}RmO=&eYl_*8;hW}ajefjg?2)Z|E3eo3U zCCyFW5Zo=8f6OI@AUt%SN-V!+>`qauTXvj9Jc^G1WpQ53z@`klfxZJaOod#g)SJmw6I>Z=~os~KwG5qo{(Gc{} zy4B40M}Bw-`BOrEUu^!{Z@vyiVSP(;#UdKuS8Bm`>%S54WB7YQ$j2icN_zCPL`G0h z^+Y8VrX_8P_%V1YBmAK;LxEqXI`wxJ;oOUIdPuMFM#%TRd$)tP1@$YJyy?3)Q2JfC zpmfoSAMWl6USe~cGdp^5GI6RV36u`k0^P3C_>(anQtu>ENpg9UnC(}tlk<a=!T!VD60)vDx-iOpKm7b~UxcP+KtfrpkeWN2_4#C}f3)#x?Iv^IzHzN?cqV0>o zv!!cG?8=PtjyN`Yl;1I#Cic5N_C#Znz^h7XP|RIdBP4pYgxTJ3ift3VJkjlO`2ES7 zf$!d*GRBVm(AFC4XCI799=MPqzIbITIO3G$@K9=tmj>ah-#{3LocpFZ?560H$} zyp}>v95-6kU*Qp(0z|vibiJ0-DpZQaPK2A}~UN{Wc&eY?8TpEN%4*DgX_OVlR2;2fmGc~GoSLg{LYYP;yj z<`c}(l(c0OYCy)+akE)jopjGp&lF-T)AL0f(IVzvEIZIm!;W*Lv+jz6)!Xh)SviR6 z3C#kylqsJv*JAqCK`gr(2*h&fkBS!%Nare83KERO+)AOkVX@s!gGK{Hkol3vJ-hH? zlTE}3>zL!4)`gwKVT1d2+mC6=7{-QBDsP(VpXRDOw^VflgVkC)E&N&=c$NPstyG@f z*l(|-IJB`kSAK8J#8VHwY_4J*&-0jzpB!H>clptWg`Y`wTle?GsBV3&vb?cog%UJQ z-ad(X-(A=pb`6l=)(bV~@&L6}O zDd?c#XS0M4KJ!NzNBH>vPu@i(ZJtprVq}nDhenASQ!Hr&GA-kAZ8c(crY&n#+N=WP zp7G6-H%dDl_xEo?fD(`ZM7b5+sb1aI$v&8Yh1L2yc@LbavFPIqhxS3FG*2kFf6Mm4 z7)4ki+S2MhBm@jILFF6{u`?Y$u-BuKOiO2n-I%fhCDS6pwRCGLIsMDL-w z$5-i8f?*CNszLOjbn?wi+pi7X@%#P%D}{1rAakF7ssE9!2J>pE@W`a?=lZsRHWx<6 zru(XGFZTF@h}wnjBNpKsG;w3%5rV>udm~0w391fqpg?4o=C>0makk3Cesf(vj#RBj zvlj^{;g1LifBM3DG|M=J?3hS$Az_C^BY0-e zn9@N%)f%JB5m=xO9T`CZy|K)D$PokJ?TQY^vw}&LXGoFcu?A8|H{b7Y;njdulcC(BUY^-ivh9*=z~yQ`AWHFSCxrN zDi>BHbZKBgx87+^ZE4D}Ei(i>(E6N4N#kd5Dl}?hm=5L*Aq~Yga!Qg>9y`(FqL&_8tEZclD8OF0;6e1?*8+_QIHkqa277GMkaat345cmo0TUjr zV=>nK9$@ZGtrb>F6>eFu14{bW?eU2k+#5~t<^OI;c^O#zO-`}{N^h0v<$OV>LusqO zcham`kpohCZGK`VDQo#Nxf9U&J$l~a&`?AVI(u(WvKR^-jMa{3GY-qE`2cUv-1 zzYV=JQK0Yb_RGTqz%!aFY=b)6Y&YyB`Wuz`#V{>Wcac7@_F-g7B>Odwz^3ub^QB6v z8_55!skJWn-brBA@x zjv|bNdMTyQ2-zcWotlgtR(t6Q2ZX76J;W;9LeyDs)(2r@!u_rpWa=J?V0^$qr?h;RL7_8KuMKmJY2uzV-w|A;JAPN zA*|8ofRt3ECSht^r4(N?6S~|)X;qUp8_AsyR4o9x+@w-VVS#$}J!lz2M!0LF8+2F| zQDvM4;FnM_1g>2|d(5XV2LOj6^6_$NYb)Jg!V}fwwIj^nA%X#6{Ebqt@Mv+TR*c^V z0Fo6m)Y!jurG=W+Bc<+@Q0s$Iddw5z+ygCV!Dm?XGiq56Knp;}_h;6ekx(y~Ns;>e z!UYqHnrRDw30)}#X94c=+L=rD1%)4gN|ivpgz*lc&+BJ2B47kId$mgaP)PqIvq_GF zCSXb?z<7wzXP1vcWA!U_lj!P_(y>FpMZGiW2jgD}Wuh6d)iOqOQxhLz{Pp(V#|XE+G%4JKOyvWPuO0+@0R%&Kw$rJT;IN zfZKymR+`|0nUt9_j+K#c2%umdTPr|GU#U>0i2psIV8gJl9$2TL76Y)rs5-q-+4dXIsfBM#xJCua;6~1J%L(Ru(dRg@)3m zBju~fl~UZZC}_vog`w)~)qXiUIeT~Wi4`fKHJ;G^Yq;}#`l)uZyC%_54`3kN1Xucb zqkr%|&|kCfg|KSgTEIoBy*mIBF_BPB8O=_n=tto&8IW$K9h6y9P%ocYM(F@Z(h&=0GkaMit`ORr2-UE*e%CRs z>xqFnNNza1%xL+aA1zA_ja4gQAoS#<&?TgBtSm|Ni1E;f_uz*UScGmPA=fyp6FEJ9%y|Ep@m&}^+T3U%J952; zwo(fDNi1)fEv0^=%>VKj^U=uQZrnUS<_{BN12zMEl{%zh_Gzdeg|zwTVFlSoQ%id; zA%7pgs)9|p1-QMEQn)NQ0OZk7oNKSszZ$a82r^_xyw=b+AmAt;`q@K$Tgf=5rg_`| zD+dpYr_w8>EKd{o+?H{DEj>pH-AfG}%K~ZT7E5|d1MW0!)==ij;F4}~l=+CK#G@6Z zV9*fH1PvPq8gtfyIB2evl8-pIYzTHf!(IoRK=7!0h!zYrUlf>VA@Qo4TT-L3#2VZikv2+XM+&zRFclMcbiX$ir0w z+G+rX&X1@8oMdo?7W{PH??@}qF${j13ys{UtO|}FuDv{BCkvCowr242FX#8?{lJM% z_yb}q1o;1|t>;B&IF{8bBiC>SrUDGaK*Fy2Oh@E?aJ0x^6$W~;d@X4u!D4`9gdT^+ zA6*h2z&*V8D!@h~&w8ma`)YipV?URjJK(i zc)0Q1gez2xzm>8wqM)fy!7pt1gzd6*H`6%)7&OUo@BV940Q&R_j`o|+5rXfpK)R4q ze`kVs0zrav+oZWx<<)?N4)AP&?=21bx)0%?R#H;Z~ zy73vX%Mf5??6EY0bCvry+&i;kokiYKi-FLb$FIS=7Q6v!iwi4!jHrEBd+Xk=o{RT* zo2Eizgr%cu-h+2J0Y}cdYsw`o=uTB+KrIicyy$7?-?x_=VN_JdqZppy_9Wyxy}{%wOC z8Ox9N;zMJ6AfFGQi|N4l*gZkY>kI68zO28|3|Qpee7eqfeQ`u$_VLo-guy)H^#i>q z`(jtfw8Q6muc)Adi5~=){(gQmKXBydO+iB=&yM$f4y*X zck*$s2yfmt&9heK89lFf{`%1;3${ODtbf|Q`)SWIi_Wok?xZYc3znQjDEE$%V#+UF zz4hp?N#~K@6H)NVn5ajIt9q|S%LKsV>UkD}(=68X=k{(feml{->sD`B`17X!`VQt= zoSzrUFv6&sR0&KjJKFcf=YdD@gY0P!YR4p;KLKW9}SDe>$R+h-4x zO_p<~MR~BF{_=VHJ>>D4zaIZwX7coX_F}8)YxrW#hkMs&HEh}a{6I~gWc|SS+mE-r zeyppB4~T7SbGXy>k2N-Pdi)hMlHr-kdRjcq zZ_jjm72-F5OL+An>s1ezH}7NLw)#=ta*-@E;+3dTsm;bs1a5qEc)fP{;!ZNS^l&Uk ztsQoLxh{REbi>e+zNf(_UKaZ*WQ^zKj<0eO20H&6sITXp3wheTl~=oG;GcNNRd{(Y z4_@=^&HnVz^?zQU_8D51(Q)9jU3h4xQcZ_#9gQ zAalFv+@_}|mo11+Uu?JG{p~;Rjhie||7iEjD>XQN=-U%tfBXGT#s$4&WBwk~!wvCQ z_k7UX4dw(4$`eX&E&urO&&Se)cN0%6mW{l>1U`G}u%`C=izV&PZg5|8Jo_MVG@Jjt zTUg6;MIS?(OM`hY7F_wXko0-~JfBO;OYeG*4)zu=SeP1NIp0kA=d)v^dtLgAm`$Z$ zmRnRW|McB)&0x(Z&c@O|$Krv#1N_lJoYNP(IpZA703HR0=6=m;00{`F{AC`p`y3bf z`OSIrgO6u;m)&irmsY(>UsLlnnK3-`xV7u%=k6Oz?mdhXybRsksk^7mE(NoB|Lk-^t+@H8V|sJ z<9yIOU+MeK*Zx-s!t?5Mi{=Q^DDeDFb`<{34JSXKqj7ll-d8zqt#n;Dy@@{UEL44@ z(*XegzWHzdrhx_DKLlR-l~_N#IvjSEjKZg-j1#Q3=X75iGvKWeEM4baf9%%=Fow2c zAT$?%Bmh?mLE+CQ|M`&Una`HZU-i%1z=)48=RbPm4MMDI|Ll4DHvN6C3RlGnQdqc1Wqy-PB&Ma6w4E=CQjxrulTx%Doj98H=t6Fywj@sO zn^w(t)+(Yac?k_%-uV636`W<6dZE8-1=-RojpUc~%GfY=X0@b0d7q?d+O+JaL!9j7 zLo<%1zg(lel2UC;k2SB+m2@=FTxAWSK-WnXyzcb>7Hy60+$&nabMON@x=5UH?e3v} zMX62%)E&F<2y(5iS$6FbmR)`1MZpMw)T95;qBaP!0O&rsHz#4Gumv@E48Kh%jcQlh zhkm5&NL%>aBV+*9&bzy6@?D^#8KP6Z>FV$_v8o>FKKw8v-q#XRsf#V=I27ItzIxPs z(E|UgmUok!@iu>kMsbwgDeA=dM^BHiA~<5?iv1*sYAT-mM}ULgl)jacZwOSvqh!4# zraox7sag`ZD?i_#GYGg_JV;a4IJ)FDR?mcf! zRPeJ_qTQ)nV zriyUDY}Z>X2gntyjngzZ_hqkKXkEjK*ol@$4*v&NQcd*j0=C!TEr)IfcD5=xwuvQm zF)kIOxVbEEooVwdf4M4K{IkfjS$w(8tJ!VQ?|+*kYkqFw%X0(99Sz>m7h|`q zE0>qZS$wYc)w@McbM&RmSffeVHo?d*e zAsF4L8bi zrB05#3LqvL4aCOr6>tuVl5)h4v$++=O^>pytInZq#+rY|Xsf>cBTYd0C0_pW$_59T zBFfHUwpxM11Qd%FVTltW(H!os0P`hymqwk~5vq+zYTLJLbS=py_KY4}R*ttt79QvF zo!Mpa(b#}Gb$lb=XARil8ZRodD9VanW>$IUB$62yn7##M<(L$(QqpyV>YW36&aJK3 zLC)OLs4GwO7M7$6pxMh$0dz!O88__B*`|pixs1fjP&GAbT4808&9S=sl7&0jq8ow6 za&cA$F?2-EGSz`ZY{F#02pC%;#nrW-KNnb3@iIhQ7Ks5QT&j~$7!(D9t4-j&I+qfgUnP>Rjdw$ zcnH7>vZj2o#mzTo!k|VEOEe)5xW}G86bSHhCFd z3Q$l}@mMvwj9AM|mPr4i2W?;J@ABXX#RSrejvZ~W1SdqlurC(MOO_*NMK_ym#3qGJ zH%pmy5P&{R5H$-SIi#?}mj!RVE+ zfJ7W_^iPG?T7{OjAZiks<&L*Rk@x~=hq^8LlGB>S@rhGT?i@(H_GZFjJPoKlp&8rl z?{K3n1d#8!Iy}L5=e!;1Zx@W|9OjD-XWB^&*ywdXM)gFUlR#0XJhxqIUeVt3}jZ6p`ir5ho{H>k!A3AfNR ze(YKN4i1G)jcmUr2>LT{kUHf@DVg)!I*O_N9s26wfPAsD>e z%SoR3KwzmcE!-xHA|)WpM^ZJ-8lm#)bm14m1_G<92xn(9lP2**#M7~}D1%>5#Bm|| zh1g2kW8?HdotBfWof{Rda^=VTW#j?t7CWPnm)AY6<-<5BZi4=E<>WM1>)37sA-$HKD^uET6Uw8~ zt!fr)IvsIgW#F0*T@9&HFw=w&)PJT1N;K7u2*ONv{*yHni1%z2joTuk=V}yOlQ`Bk zwu>s|ciLSBN-$w7{{NC1I8_>v+eb)F-ACig!y8I-FqctATwy9L2)g97prysHBABhr zZn&J?y?=C_;(D;{p;Qpgfqpe9?T4EFodU#S>>>%U$N^4aG+2Ww+g!SI2xn#XrFH|j zK3K}SJYVR<>;tECm*$Gg){%&^(V()|3qYraI=TrjQAZnYs{7P{o+xEKeN;fOh_ZouzXBJHg2&=o1HI^Qa0bjFc-Jif~i;uC47*GyppU z$?;MsS?%t`lQT4+NKjIc$tLE)iLJ^AI!UpbEmfQz>m090FIFvDqu69doz%QBQaLt57|F*+4n&OgtRq&J#Ms2t zsO6yzsyLF39;qbrFdhVVPq*#L76?i0ju0v~A%^4vz^}bISd0_P95(a+!Y}}gB#o3o zTq!$E8SSlZ?ibbt11bqz5@+64;!;UdL(>733n0e>khl<{0gAvPOD;*SxKZL-#Cv`( z@atl>2*SsRqw`%SZvPpZz*1Zsp(Sge;$6E-?@nrJXs3lbO78oC{vrRFWjQR@Wzw=9i>)Dl4VbK%7#!bE}GYluEkf@R4MrAW}DP4am~rQ;<)6py%ATypqP$)RACRjS-aKv;$_ z7V*8jk*af_Q7>`Ha(>w-x3Xyhm{Bw~t$ZxLPqkb)-LV|Bu4C1uhCN6o%pbyMBGYc1 zSLN_8CQ1lPa#S-0cHh|XH)f*F>;u!z<{j9mF(y|! z!9n`mhNSgDgh%=Ma5G^{^&OiD#AKo3?BO^@p*;AJay3$xg_Nz-lxDS-%@>NkyH#3h zj{nyWTNirr)CzvPsyL|B7l8wcpgw)aDulQMxs##p#$dHXG^wz?40~DeEWk$EkzW+G zrXf)#!Lf8voCd{eQ`y=P1ub8*cGz7cC|jLc=C;s@BB=A^m##OK}t2QT=OeumSwc96Syl5&e8N~@mv6drE$*HO+0Kc@rBaMA) z=MCJfR-EflG%|{P8q4vsh7|APw__-75>V1GS;-m+oZTL?ItJfd7ZZWQrI1P#H6>GW zg0?TQOj4&7Yyo0(;pB3~$B-&jLx7F6E6%LSDRkr&wPmf-Cl@IP*`W6cT%-_WwVwf$Sr;zcj|ojB~ya1v-<7+6^b~1$*2aw|QV7 z;2Kql7Z*XNyi#`M!qaT&bAUOU(Z9nHJYtmFO$#LU!O4h{sGn_ekx$u$x)0$Fj>ePP zHLhD@U?*d+M6K+p2^9Y#da&@*_-bbnG+m6d6UrOW>8mf)5k{&slfj$Q+~1R6Nqb#w zx0v#I>P@tDr+?j%TdKgH%5g)15xq7@wJIuT%MhSw-3kWsPC0a|;?<{`9)Y<%umFLA zN%(}mal}4oMmhE-6+RM=kaD?|2ApbA1(YkW?NpLUIjre9+}dzK14hXRPuiwU3+WF-v*zAaoRx!7n@WuToL)rC zA*lj$a6UgEN3kN`MDUWTRwMZFImx~#m?FH#9UKHb9*I4117fO#+of( z_s^Jdzich3%qO@M&j%-r77=A;*n)0S|qtOghgGC@mf-aWTt9GnE);ym$as zyQm3=KOwEL7vC{ZSQ`6UR2794T&HA0eIvV~VlmSXejb*{6yJJQs@X z(k4qj=)o_E(qosTibxdaTy%N+8&ybqYakyFwKRvDRY5Yy#t2O^SzF6c&zzDd3FK<# zO|KBt;~`u1eqTV&zm9VBEpL}SmlUaj|8t*{stTQ?m@F*GDb_joqj66zT*TNYn!6j;N;ph(Q=cEdjelsBkGxn;>4pu zoKN4lt%7TNU%ZPC!g~wmx*_-thjxS&LHY18|23D_EaZpJ>j@-!vIgebZahn)S$v{c0I+o-rr?h<6je5Pa@U$7$fL@ZW*_aVvWdmwcy3=kU&2_nXkP2AJMjZ z|6c)$89h`FGp=BsDpI2umhH0Q)wXZI=~<3XuD;(`J;Q9ut$y#XnZ=YGH zCM5&r;@M(7IB5xvuf$mGqFF&zmsVF-h(RZbngpEm&Mbj}%+Pgs5ejS$iTa)y?(S8* z!a634Nx%LLe`^bGt2pY@!6UTj%CCzCb*ZCV=2bZs}` zO(=d(mZon%F*P{5G5L0yL(dWMyyQ%i8=6Y;!l2HHEN@U=7ad9E)r`KbHs?D$YN#sG zi7KbgTb!@7yRN99n#u={Eev;(S0>G^4Ie_6?Pr?`ntOJ>>Z;f{5!384P`;~9=L$LLX7W!hmMbZ`e%zmeY|aaqiLc`+;z(c z`ecD9Y<_)ad^p{sQQyuCt7ezF90^gWx%(Y_)O=k=9%QEt;uO(7ACn{tO5D|QI~}4f zVQueBFJ*b;zoc5*mPo0#5%ofdyGxwjIT8J%=k-2Hm0l>MR|kOVNvF^>d~Ibdq*|llOBk* zQ4_&?1-D}-rK0`4foa)>J}=AGXWLwOxy!0WmqhcT=tHAtk4D=kIxlTAtY#57K^F=vC=8!mEQX74*a z_;t`7n9J3}uCi}FSlcc$VUimdep6YizQ z)JS1bR6#m9Aan2H<8@b}5Gc}CC$*0?knBd3)UDzY^AH6m9=o@c$jL5m6?ii(wn+X6 zWZ-qQsmV8S@L0Qp-N!Py_!-3++rJ<-m&E4V1v?Z_U0{_>d`%nOnGBk^>nOrL81E*5 za%KVhID{B zS;dCfZ2)x!Y=|eBOLgQaC;zZe06vEjmO$aduqZhY61MD;yU&z+HI;rsgiWG zu{`<>oWEgeL}3~!4#2y--Q5d#mpS_S$;cT(a>AHOn%0eXE=E1Ro}4*_$9+=x?XKd|{0F3b~;nrnAVdereLl>nL>Jl@PXvKKs(Mu+tk}(gMbW;Y-%L zXV|+vT9~t>1z`0{;(h1M{7B3j`m$6SZNJz zBTd^*bL_1@EmAZOSQMO3cputROgZMP*U_bsN6pI`^!X1oOlMf>{|r4UvFcz>XhxMViE`$*|HR zSKVq*z6>Ngw>0ABj>d6Z+3H1IcI={KnUsYq?aNz?crNDf#p?m58X4zy(~#}6i3?=; zI7s_3T}qZIxU38#%c1ck>96nmqp|FH1S}=gjU6)a;}SeFrC6OY6o8Gkk~3EdE@;SO z6g(qPQ0X^e#1o$k@iyo|9HO+6XUf>+aJX%8KQ#G}0V|g3bHHVF+l4Fe&UqP@HmYk8 zyq|x2ei~+2DWj)6c6#^^(fuMW4S&7Xjuor~aqgqLf)Qjcxm@OKqqBPa7z6AY@LtZq zUz2JJL7!nos>Vev*xNQ3*#FcaL^m}WXE0g7%OnJ8-p$)5GYNaBc4p_{42d14c}noe zpCNPlT32>|syw=J${Bn>b37qzCf>PQp|VC)w8wRFn?zOV1Wzp0(O;^=_U9Ij$0C#+ zHF#?xK4zvyMX0@acB(mG8r%U8s6DsI1^IWXEw;>KYNe9qI08X}fJwPszOBezmrfoS z+s##!{C8Ng^;oR8KTJ8UC(7`LEH^2T8=8ou;D?l%-cOd!HZ>Af7~2>N)|XoHP@Hwe zlTg*U2rsNa(lnQruy-?#9CG;B6sJpD@$Hz8N^nRJvC-A|42H_JhmH;O>gB)q7&` zrM;mq)N?y2F%BjacLRphndO3f&33|AuU97GSRZCxC=Dpa-RVF!m`+>PP$6l)CtN=L zL3Nv%yMZf_bB0j>!$=ij!a@UaSX$h#Ko%6;XQA39AM}XZ{xw9F zpKr7+mQAE4qgKOD#@z27IK18Eyh)6(`0NjZNjJPEW5+M!Oi_?@1Eq>njenv8TXcx6 zX)Uu65qfGIb8pD;b%YVn_i0y|I9y2HP76Z$67%vh$a)avJSn3Z?pQV?TnHlBp$p&8 z*+l{aQ@;he_k=M9P?AyWkbR2_5bVvF?eNe{9yJtwJ8is(RDp1mDfGuLwqm4K^Bm!& zeww+IZWT@lvJ?-q_c&(!wMga!gYpk3y%{;vSMqfI068Cs+fXdJmq9Ytv#Bo?dt+%K z#I3b(m$!*E3Q#i*f*{TE<h1c#P^yE=kt3UAc%<#H!rJ z3`kl8iA@lH>XHwbkdVLECC?%BS``jNxpt8rZA~U1D(7)2M~>ozQv1R`R1q2?ff z)D&_J2mhJVP0An}SCPXxHUbSKR3a32kHsL+%6Go$>G=r7vf$Y=BWS(;qdpYSOeBx6oSO28X3tbR4fgs#aVQ_Z1xVb5CA4H z-AMt1L4c!0EH}J8zzDSS)TZpPj`1+x;xI;fFHs>2wQ9o!rGQpOZ#+OARSJCCu)8YC zi(_YY*3dE@;oVU@7S5*EeD3D^<|6$WX#u%mobe$u&+EruwF^>W=-CX%!J-p<7|=?c z2Cy_TAn9$NaOge;rqUk20I0)5rKS+!1&S+!h1*a*EaQhH)C%qFTid-}0L=l?fYus^ zPi-NXXe0nYzxI$u^-HS`d^hNl?Qo&wnRxZhpx-#xz4LO!2EhnSkOOrAJ2-meyr~o) zj*@ewX04X=TrBPd-~|9~+^|KDc%3mYVYnwp>OQLC6k3w1=WkLN<~0M>iy(f*QM$WK ztW+_ofia_b(1Gnik+UXMq4t_KwqFNSU$46j$4^mVVGa5hgRR&=a5vcJsyUbm7*gV< zP_c#)az2W$fb9y@L_ILj9ZULBHuJ-+GKuQ$Bm+)~Y-vf6mC1w%G7*+o9X?#^G9abt zVe$beS-xrKpMbm`ppJEs$AQ(uENNOo?9wjs3(>qm)yoEi5&$^|sRr8+YeAbyEIdeeU61=D5nXtTd_srouU-LQC4kGTUxXsDNNyjsG6LQ~6jf97YfNJY*mUDrj@5 z2gw~MB^JPqm^g%^%eM`FUyZ=iS`EEzQ4e26<$&s+JgGSQ=qCEp!dR4y+rch-=#mfdM^Q3c zYS%4u5U7O(ZH}gniu^W9xrztN+}wYkhS$6O7StDF||dR)MN|_XjaXAIEyi;_8L|R zim??mwEFGliC;f9pXxB^3ta-&to*7AC*4i_Jd(QfZ7hTf}M0Ob@;Q(0dKkx130|~+b3a5EZwLx<|Yf;Y&5b^Esn2;bI&Q; zt#)@PVg+*5%B+gXFVukYp-qF-qqp6^7K`3I7CIspgE)U)o2^*JOV2ZAmn>$N<635$ zrnD7i4c&IwdZvbsoV&MRvoyG--C;x}M2aSh)eJi7_&Cg$2U!do_T+>;ZbnGiaM)+H z?Z{bn;&skFZ2T7HqcPZeW{WLQVSRgGVjF)%>eU+Na2*w*`Hmx?V@udy%o7s~Hcas= z3T?sJ7VSU0Yb{x(NEkQ;{Fuv`v*RDmwYx(OW2KvaW@kl}&Ux7VR=P6w9z@FhR;_gS-3) zYF6^?yVa;ogG@9qFJJ}4EK^vPwRuJx__;E-5EUaCFwx4K^al1+wVN=fu9Xz@$1OL3 z40~-EgO`jFxKDR|@O3odUT9mhKy`Ngt4Cei9=I4LO!eQ`gZYJt5oyO4UimX1;zxkV z4XHES#(+&ssx1YnpdeQ5+20g;u+2)6CrY%8S#@S{#UGZ*B(s)9;u^I{@|;KbF@CrN{?L@VYtv{Mx2XbxOKn@) z_ap0r+zY#RkXtqp=(k-EHF(UEtbvIL*AN>oKn>cMSVfyjFE-8A>XXdS?~|$cy|k!@LVrkbKkVFC3*1HXV%CYH*WUJ{^?U zTDJ@zP$nJi^qGH5$F^gD+>rsb5B}8ALYd!~fv%+5Cx&<@w>nlMa}8^uVQJ?~ zfk(Ij_=5N@_dB?Tg>R#`eK9Bw>fNbW7uS*=$!Xl?iX2T#jhGWHDws)*5iVjjgtjt z0rf>4V>HVOL!dBhg7R24r9}o*fRg60Nq$$RC`0|x=Z6OXe|YfT?zY~@pp>C6Q)9Oi zM!rmTz>ySflfM|us@ntUZUgjlvhmbN;gW%-Q+IHK_XPnL}QyYs?)}?LeoqlQ{EVLjjC^l?TYYn9W<_@Z-JPwbI9{j%c*(GNGZwPvnkfQzTQYw-Dnl|YJseQpQj02^}c$Lt%(V!2RZ3>cuyE+i zHkPg1#H{hV7k4a~d2s5y7J;|jb^F=1PSe*qxG6YXS9#=@@Z(i`%sqUBb9fxy@u`KTS8+vz^X?H1!1p__Xddq1vYreeuBmPIzL6Ps`WaTIEvmV)kLj0AH zx`^_CX1hhyd)E`Jj4oEq(Odd?HueFL-AFm+$d~Zu2>(=<@Ka>n?kTWKCwsKxQU#th zabBn}P093rL80d;{I6m9YTBzQ*LAB<>= zsPs&GelR*Mff_)I4kIyFaPJP7PEn$uO!;t;nT)42;y6x9<>u+DRS{M8fKa6hP|gVh z{R4DEWz)%NMu1qOsZW}BA_&GOOrJi4EPEm+>`r{#E!t$s98TX6HgUaM3KE#nog6}e z_WqNvA+Q$jFaGgj=M1e9E)5Ouc~(sSW?Dis%MSuop>KCCVlnBzmJoS@n(sSi7W|n} zPRZzRukxB9)Zs(LKk81diS~T>Vn^JJIg54_?G+*vS2C68?{N~cL17sH!p?;X0h}h7z*C(*%O?s zm!9P|Oeql^EeabzY%Rc7dlvxS5jBrelmI!t@IwY?@mNb5QRh_ie0LP@kCTa}!m&dd zvfn?)iX71w(Iw0b<)J>=3wCNJ6RA1W7gUPE?z}SS_*89L`~;hW0d{3FfgN*3nc-)> z@~3gT@?bEpE**i@8&K~$4`%h2G zXONT$&mjQ_6feO|u*#772P=+|OVjV*I<5oM3YSOic`Y_0LgBa zQVZ7kgyTHKZ{ubch|N+nfh21L$jrc2g^f@`A3CcYt9eQG2k2~R2^yxRC*K2z!vIAo z0dQJGZa?TsN@pis`LOf!`uEEgp9e?*BRcc%l9K6cC4yNxz?OOL_m>I|5O_j>fPGFi zN80wo%kgwYBOq3ExKt{k!VSM~Wdf$V*RDesD;d@mx6aVp1SUy-1gbRJ^EpbZ;fXWnXYsL28C zmPJr%SnH?ESulCk89P=i3^C8uGZX98r|+BKMo;#ax+!L^^V}9>S&Ajz^jda#2IzIZ z2@kXR&(~@pS|(h6_OhCjuhlBvp#)d^DOW$dkeL>IBm}WlY-Gu`(BFBqbYobhga_@y z-{QQ^T4;G_xX6{A>3LH8j1Ue$LL;)vt#ioiEOL?dWXZP5AE!8@1$}1Pl_8VeZy#t0 zf`rMB54`??l-|F4>*rzqjJokxg*QK6+xWCcmS6==B$1sbJm-JBEMInP@^`&#?tGMB zXN=q5unICM0En9M9f~dHUBdKJB|-l!_1nF)y)rupR451D`ftE+Dim)p<&3O8^WYZg%v}CV=f%OF! zUYjhYURZNiy`o59#D{nbCe6^VtK@gT$(lWsMcwznV8xuyM9x zie`3i3oz>R{lbvhcBtzFe0K2>$$%GKwg2?Uo8s7i9<5=nt=%%^c>O=)5B~W5t|8{l zm&I2n-9VrI*LmZq^ZuxZj|^Lf4z~K{H#^TMQwhtW93bvS1@}oF(`IwRpU-INbk+0zP91>CBc#1#RC3yt-p=ea+4pjXC^YIB~1?>CN{WV!mddat8h# zIg|Z~t1m!3p+HSaDSlLO8anu4#8doAR`JI31Ady~-wz*fW~ZTZvCe!wU@3VutNzpV z*M*Yp>;1eYY?i-y9C22uKfPITdYe9@iv2o~MgD%AlE$L;{QEWI*0&jp-w#GV_AL5d ztI1FZA#@b%$qpYd7oz$hjQO?T$;H1B`mi_XU|5KN0UkDM-!yv-x3@C3?W`21k0moU4Xq#x$aEmj8h1$7=G4V zDb(d)eakqR5Fe!d-ZhNR^uhnvXZtV9WF6Zy=(cnD8S&N?r-3`Xox=QC#rO<_tgRv! z!{p*fcOTTH+(=ptTn_g>DL0aj3*GZ3U{Jqo9BTUM2at{{-M7F$2NYk`Y9Iih#2~*5 z(=9J+Lb*onSeor8ku6VU2&zhH?gcZov{I#CIBUldA$F3o86UFf6_UdB0>eU}LumCa zjUTJ^*ws(8Zlh!ajDJ@gmm|dU2&D$4>y>h}U9v|@YC&j!Y03I`zT2xZJ}J!oE7yPV z4pjLDm8^8Gy5s!x*yE=pveS@zrizy-;*SfV%x!p|j!CA^)Uw+?4J*y+b(YOK!DBeD zm&-1H4%~z-a}D$YWylS-=R5=;imaRrp6@)r)hfJP3^oNK_Ly+DIHROcOo#ylUvyla zuhY&PTop_gPv~sUgEa9De)&hA??OvVToXJiXIE>25K4i_tQHl;dEpR1@NFpkSDIz& zN}>Q$*$g({47M0&2;&1c`39{{kWHkS{Lvh>zFN%4v#30ai_vmorJNBX^Ao_*B9U?- zcA9qt3?``{cQ`v@g@Qco6?9>G)bp&B&)~8hTM~9h=uSpNv*DH4h;rkS(IT2Glt*3TRasa4z08(4} zr@Ea%f5j5G(GH2)S&duV)O$zUXDEW5TiiH&lcI9mwGq)(C4en3PjeA zv9_mrpN)x&G~Omp`uVK$Y1a1zTh2POKdukZa_-kbo7;zS043LewLL*j2%bK~`%4&p zo<&Rt79|DDaE@8jboSACuSE%~pQq1S6ul$k4i!}DER|{QrZD%C$n-dX#|na0D@hxS zq+;U-PY$uvh=B*B3Y1V5HuDFM^cR7+L5Wq8Wc_+uc7B4Jy+#?KRJxh7h#AJrHSn)g zG;U`ayHrWuwkv)%f?o|2?*!n^{hRYX;E%M`r2kfvN)h9i>xpsxX0Vo=axVMcYEp&r zIXcUAtMEqI(d>=bRsK)}iu(UA-wd_@~sQ0JY?$X!+w(EA7UkhA+Z;feDJ}pjVkpvJnH*@t$$F_Gw z0YVh2On!&?z5q<$0t7_Ja{_sC-E_Imq+tRkS@l5)D0JLJHV)^FY{3s~#U`k1Kx#Iu zMBTOcSEzeKn_cVqjHTU@BB^DoaF#$ztsgRPH3F_$suG-jS!&^s=KfmqZJQiy1*1LPbu(|hq+?+7O(7`-E=*V~$E@tVQXW}L*=yh*QDXaKf>T($NlS?oS=1T$ zcmp)c9t+Q7wkWS!S8+{=M~eV1!YNc$ESIvlD}klxRu==mT52Ay0x?5)Ajrbgu=P+H zZyS<0yDRszj+fo`!W{rH78xrff0Sn1D`FOCMLtU0Gn2?Zl}W5pZe?6}-C%QnDDx9& zl8utc!j%suR6Fy`;W_^^n`i9Ky{msuHdd`!yrUh%j*YesLUNtKs?=aPf=SE< zYJsxmZ;=(|9V0q@i;5N7=;ON(%0vX;z{t-kQ?c*{8=zp`a{*{IqO-06BlztgcH;OT zwS5X&TItA6N}APY@2^tZ8DFfd(k_HQw4Beg-lhvE?I5-dO8vFuj&!-;5V19o2_s3m zg7seZX+@s`L)X?v|HrZ4<-EdN zogoYdO}S}q=~B*cwy(SNf6g-7&MbJ4;109p*xpJSH(kfOWbDH(Mq(xqVtfk~i}(@| zN-bCl0_4?cR%$8NVaOcw5&>=Lh86f$qxq#FbG4|fNJp<4Te=b;A!F>ph;#o@pOdwu zwL_*{dNU5H7V3(kIxyYhgYGQ$G zzc$DhfM@;x?teRY)=SF5?BgmaIbeV`)8BSQT9V5i>|4$HkGzgh^Z8Gqlb`deh( zpyCyz**rFIT#bSWmG)nDS+8rT(P)H~Pc>FYci;&j>5N&iO;R)fM?V0}yISpFE0ecfCsh_owo<78i zYzOhGq7%iGaH&bHF&@LTA!%OnE@x^NCRUg=tMsNY?mldhD@r*6TWn4%VHszU4V2Ym zU$l`#rphXQD3u44JyE(}nJ_Nhxa(e?cBTEVd9gD*qc93x$u2bT2ZUthkSS5=wG(6u zkZs^3Mm)MaN{9DRdWpUgleMI!D(+GQD4k?o+bDM}H<(>QNz5Ny1x)(3 z!U7X{mh-9{=XmF!ARA^sO|$IP;^;hOD}k zHSdN57~%F<$HJ)L7Q@q>wQo`Z&v8)Z|jcLiXMU)U}R8?Q`MR`$M~N?kFQ-1O|=^_}i>FNIek@qfinDSX^A1gNxYu61Wfgkozy zA7Y1gS)?bTe@{GzsRKo zo_c&Se~8<^(rb>n4em?h!pN@h9htAK;u8xc(OCs77Q%NB}>DkrI=-}ip(t`xQRnfpe{GvjmS#tS@CHF~8APvdh= zpQMGajZ`~*J^xUz`{eYA@vyhkJ1uPGlaDWM?3=oM%9XXdU4;|lF8H*SH<;5D(aGDV zUj6-R{O8XJmJ)%Oa;1v+$yv>9NR-Sb92cw9(^@Ny27Z0wvkp9*`>D(%Sa_|}HM<_h zi?>v0BgAvG2w6O%!>CSm&Bq+ih6Wkcr5VBc>m8dpTg)HK0UWH|v}~eFA+J(K@=LBO zH*xMLJ3w|TGy3qKPE^hH!Vt+8!Y);NBMBPCbs5z{f6>Q|(=R<(xCeyfr2P zY;CE>?To!HUNI73rPrz#nCfY60A*3vhbM+`Ec^8@I-*^Uk#@vh)GJM91b@tkAky&u z)!;g-B;v_Xzl3dR4=xo^$nM$bjgZaN_jgYD(YkVb=ubMKjhgwj|W4Ym?mT2?)c0jO2u6@HXp2Tdorr`9|HG1Gps6N9t6+cbmvuE%-_gZJ(#|I`nNyD;%;p!Q`XI;=1lmiNw8lV zl}~g3NOpE|G)uR3*jtt^POa^)V-NOBIJU9W8g7q3+3ii)J_T}l!3gh4cc`kzw`Gvz z$#rF>;+FEKRAzN9QB;gSwAFzsmVl6BfvCsxR=!KmsyN%AA}X~%YYEdLR{vTQBnF0k zHw~0eiw{6GZ5#c)w3|G3SNM?a52dzkF~faP(i)aF=&p?g76h01sCh$SP`wXkfs))- zM*lFsat7aM(wDL<(sUJ%;a~PPVJ(>-b3dVR&locO`lBB2y_sVkHD9Vno`QKJZ$;cXrcMl4p|PiyX}4EJEe6b&=4Jy zmny+Drgj@6xl<@MZ0*FqPYl02gZ^9PN6XL>pN6@y?DGdS52n_ZT7)0aBN*2a|w=MC)d<@mT4nq zv=~zF2sTIHZ$SQ^@aD-zB%mdo?yeuSk(l8e%G0B5M$y-Geuuv{!gyODg1fKXs!YTL zu(EwMep-al2u@GJ64J~?r=L!O!DITn@4j?6TUnvBTWEx7E}Ooh;TYK?IsG2LA3t|6 zoi|-DQ4IenEdlXqcCi9b=8htQGUMzb_THaI3}svi!o999rdy%x1)~u8zt4nIWWB1q zTQs|3@ZPEoN!&D%#Oa45g7im~2`R;Z;}jG5^-0^PpN#71-m!^qhc+E`1l*oKyFNKN zjwl$xjxsIGn5Ty~{n5RJblYuiUgC<~YsaBY8=@nX_|@Bvh6^d3$*~Is{5`=TBR+d3 zWvtE_HJ{&DWLnQLWX&%s*MJK%92cUvU_H)0Tg(5E+c{sZ0F7j4l4nbK%KbRHPqhjN z)po61k-Ou~z;g>(LbT2IVaCcaFvLw^039iFzcvb?f6GyQa^1P+&ea!M-=F+rVk0ee zmqSC<(#si6ld;&kxQ)Utz242rc&kxrxC4-r95npm=v!k#EI+3Sc-nb_n%4l%_!)nd}6`Vg4XUr`ejWq9Z({! z_%Mqk1wb1K*4`{ci0>T+KtSRAT(sS)CFp=<_eXkQwmU)4HIwSpUmPbc(lS1Fx|L#y zmy8!o0>+?Pe5B6#{njK<0)i=z%D8kR_cpr&x{S6ae0s5*vL?+7cw408PFqEk5@bGg2hv1Jyc=w88sJ zUbHo%{T^z1?t({o?Hk@mNYDwAlbHQ_Mg2Li4}!?{Z8aVH#&$S*ps4Ii44LW&;H`0y zlcB#Y&{s-)>F;)eP;)vhSw)hRW&0H$TFP%$27J{9ViRh@~Vl9#E;L0*it~9rJWu?bUAC+UQnpbLsUd(8kZ=+F?mJ1`?6Nk#f zl{v(Z2fo|A8YLyP)X_F2u>MfO5Me?tv%DOnh7?*gCDCC1oZRIUz^TYFJ|hb=!F!Ps zHLhjI++jw<{sRUtLV>E|+QKCvrsy)DPYKbs61})={DSay6Gk^c8DKLOq{`OaHAc`= zM%@-vs5$0YL_vWodx1p8*gaa}V^eoEGkJU5bz^5W(6IWw%OP_G8+_9pdw0$NJ}YyB zcCVvY#re`^^R%GTt5vssAp+nX$@#$rqAiQ-+wTO7N?CO}ma^5({A+HMRRL1<4s|Qt zdL%yiyJOZ_>SBu@0Lg2uo+W-_dDobqvVc5jizrT!9II)b0w zo|2(*l-iHPF$X?Bo3Q+^CW4bMnZERO1pjn$i7CCmG`rQ_ynL)UaOtgV4wB$!d{UeI+8=W{|tgMC4|e zw$VsA1Ji0X#K3+?Vgw!8#64Q-aSdgo5$`_BmU4}793_ZH$w!6rSE%x1N6E)wnhqdu zN2tk0oIDDWql7sCKBCRC6;JjUQ_m9?jeT5U-cP)vW#nKt8d{vI5`2(Ie*$dsdrbtC zxb5GaHrD|;nwcsteLk|ve(}snS|AC{KlCvqB@m=2T~6ykqY0x}0Z2692m94o->DOR zN}L-2AJV#JeJ43+p&dcwotdE}yQenYS+hHyCf9RG*dv-LXGCm9H}GkW@&;~G|2C2oy3tKSIhRt+k*!s=PY-Sassr zoLwCO?v>DF7(WeLTa@5VABH57oeC}9r;KZ>#ZMh&MQZWhdT6Q^@2fBq3zMel@i9t# zra5lu50--jv{ryLfP4`sosdkAf3r(A%5tf(b=9ZM*Aw)Ic3~|eOawn)NSrSre0l-G zSzfllj3gr=CwFED;%tZD<|_yVST;JDkf8;p2!-ZIe6}9%07J2Q>|uhlhieifgt?=* zwi?LHn_#KHUHp^a_Z$mM0*)xYpCi&|La}j(X zy!%I-`}ck_PqSo?)Gk*^oS3~QC>tgOvPI=MVm6zUCB%ym?p+7mc3kdalqBnS$~%kC z9wp{!2*C*SqZ}Zzmt-5f=3&-1j9-;Y2o&iS=4u7~`0JPwI~tUgi}&b<97b_jFhMzq zI9UQMM2Pu1$iauWLPEkqg)4-ly#6{#E@73DuqOzLA0-}H;ozeu_@^9{DR;HoK~qx> zVLACotacuT;+2Q8F`qy}#IWDQJC-TRLmL#NFzv1@&tv^vNgDt{Yg2VaqTGU9{rvoq zJlCTuV~*y>sTpc&%xI2c50vvfAo-z#wFcVu8v2p7zv#!&if9|JN1$~s{YtUgD{ADhA$LWCI1Y@BW4_U|{#Fuwn&tLbfQAk6--7tLON;WD`TYP}nBA&s z5};t-N-$_PXlAT427_GTSzk-gN|$+YL19Kb?Qf9K6x|YVE02)PPyfk66i5=TAGoXxVw;V0Gu=qm>SX zdM)(~f@DdW33gE53vk_W?%ucytEU}Le-4TAtalGNZCn?rx_mfoW#sBIn@-iqq0dp} zv{MiFFxF}jARSCI{@JdjDf*o@|8x?MI<$_`t}4mC%KTRUx#=3l)P)c$P~Kc{e%YfV z;pKB9%`acra`~cL^qS-6i{Hq@j}uZ6V(q)LE&E!k@>_qzSuL-@rz_Z+6Hu)q5#u*@ zx#3_16b>BT|I?qZxq?;91skDxZqXkf5V!RonmBOc^1I1G<+RIg;L#DctDmP`J-8)c zM)`%Uywmt;`oHF0jrkLFqnWuW^gsT#b$9^Ay}df$clrjZ?ynMv)qi?onqk7b`j4fT zu}*l)Uc*YmAC>d}c9Azu(6j%{;mtTuB$@6_Gq?cRRjr{VqLRNvTuiQ{c6 zKZ2nlkh`vZ*N;mFXqSOAmR~NlC#*D)FKqiOsbkf3%g)Mv{{GXXkc))ye;) zcdIILvS@9rGiV-1xw0ZBb6hUgnYZeW^Dm;t9kN6aZ4sbwA(LkZN`&^{QuT^<3W@o!Pyu z_d1<3yYp0#NQk}~hD2=eZfu_jP>YP$AG!mCTu9?LosHaJi~>g|n~7D)HA?z=1(Az| zi`gIn23y8~gA5YUXS;8D#E+p?>b7WXmZdK zHXwx1Wvk;yNfV*(@2--Z2GUgr#%)c~!6ZFJuc5|Vp&Ww=B;bIiahD4ax*(y^R+w}` zNuRr%z6d$Epgdn5Rcp(}WfjxMl#E4~8KcLoNAGp%sf%*K#-%BeXOMhHOJH77paJeQ zSmN3E18m|0@W9cbjFPVbEg@zk>1bSLLbS2-B!%tOEMVE&ETG_{ELve(bc= zRRLkt^a?lkK(hlkI>RPS z_+yU~QoTOpyx04u|1tu+-*?`4%uV>2dKf0S=i(NV$fsed4lo{3lBN5vyGsXtrwuGa z9Uq~_M{t_L!6GKYs3JUBqT?)gmQVxLf+*16Kw$?*}#3568U^SZ*cUZ+y69 zpkx0N^MifdIw#1snYCf{Bi0htwu@kqQG0gz?RjC(6F;R~wC-PJtt^kdHPhyC`$;JG z!1L@WX1mT21{JJXJo{U}25&!^{7K|T?kDzW=(RZCbPPe)FkSc1c>O6?vR_U(3M*^- z*S2%Oy_L#OC^fS!5t< zaP#~fQB0UL3b48qq-`i6Sdr_(h9+r0Oj4NGNFa$2d^g`?5dfNNajE^J5+&VoKG6w= z-d=7s$5QGrG_?t^SNhWW&l0Y(i4uTrnX-12BU}Vf|8erwSkju<3<(%$7^N8ioD$%$ z&#_;QGOhyG_S-IvPB^TDS}s8HKrnPMAY|Bpkx4|!^$8Z@{^tpZuJ}wa0>bJi2|*Bi zwa>|jGr0?iwES#CW<|#C(DQ)s7qDArJ~a*CDn7q1e@j;Y^QMBtet@CG1&{u{R|*AR z1&pmrr)Y5m)=eb5h^x5~Ao)sDd|l+_Em%C~ftp#szC{3RT*2!M1hlydoLD^OZwpu% zJ%%_t3$&!t`^>Y#kR{bSVcTzXfc71rL@4k$ws~dXX96S9V^z4oM$4=c%V0kXJ zREeLfddnXr>6F+&_No~BQ~=^<3Mo!QSb-1~o8Nippvgi)HbBZ8#lNV45~!qE7KA(@ zKDdAKmybc&N@AeW@om${U^8XnPY8H$s!=R~(qM9xkg`lc5avc@9PlH*;Z|9r3 z?}BCn?3#*`D-ye+h^CT3x|RG$FC>t}kB!EW4xIA|@fm+Uc>55|%si84u@EF{r~1hC zKRzFdAeyIt@mm`9vTZA$@+JJPeWXSk5SHCrQz;5#`EUI)KIhIeVsF5@Bh7Jpj~FU8 z^3Rj^+I^0*WCx}eILy62GPRK+e(C$Ny=$|neWLuMABina+L@j!*rEnaq;;`LZRxVk zt32yWvYr1i#_2!z7K{moL=}f;?SY!$Ji*B=;L^Y5+3#roJZIoo(rKrCQfkAbb#SLT z17EzE3F9NGKFfJ-!4p>44yn(ZN*Bc%pi`F7(KSco8m|HTdOTecHstF^g@^t#E30wc`_jTNAt`O@u@%ra@ znq|CZrWzy`ygV>xMUb*|IHbRCNAx$Ou?hpB)27^yPt1$p&&~hXXlnPr6~bBK6Ge`S zW5x)ZbzeS435$3u-~K0tM9GzA+Q zwnyzvu(&Z^7yR1hO}j}9UX@$0q^6J+dr3A%HqET>Fn`arB%C0I6URgt$sS~{3 zaXOM>D-|D_D;EH`3Vu*XF^GjZ>~$?QSq-u~*@%~GgmR9Pb3c!4pLcUGWzkXF)2$A& z@288Z{1Z@Z?N7tt{d#}h*YjFIgp{6j|!CvYqq0n zYDV4xrK(}8b)Ut`=ERpKR+4%J>Kb#v^I|eMO&qiN4wiDT<*Y+(r zn0U<+iIES_W({YoJ;ToE02IQv@5v4FcdL(^yXAFYN)CE))sda=(pwG8a^)Iw+S9S) zhjR|zpqSYdz%u6gM~jc!ZFY56QohQq5#!w0=Z=Na6k_So6MxevGq#(buAXh_Dd^Ia zW`DSN?aC^h?<{rV2!UyXA9>2%Qb;C9L$ zTUQOp{)vA>3&u}r$+p{`E-v2VgsD%peGYNUP{!|lREzqK z?{>Rhzb6nale)BIVvydYaWS{ck^FV*yRUz(R=d^|?~)9B`}SrH{2#8Zib^dPvPRIF38k78>H1E^!ekCM(AXe*93EhVCh9QFRbpd4IL}vkLr_x zJJ8lkCX6_y&TyANWFVciTqS?aSc?`0aX^R3+hx>iU8G;+D;aCq&*3O^c3{QE=)6zj zvPe{DO#R@Q6@mB+ok1K(k?soH4!M22xGZ+2z@hMMBR$%v-Uv!lj1s{)&12^pzUv}eY^uIeh0njQ|GWCS@3%qfhH;g-Eru}fx>iNJb+r1( zoIN@`Xe3Vn+25Fb4wE-jS8h|}RwIb-Cq-rK^qBeI0?PmL6j@7;NzI|r=RS)Di#vEDhwN9fq05h?_RgMn_x0kZ zi;h*nGJ{rqubI7u6xE_7b5W4(57OtWm8^yd(Pu_|2`v?5En;e&LLG@fqYEi)M8uX! zP^emOqQM|z+rc7fuVRM8mSOe@T@Wir$SRu@lIR_zBs{{L!S>xxDkiL$#E=Lf}1bgVSa)SpI%0nn$3F{=e}8|vzXU<4=PtYFT=ff(c_ zGQ@y^xs!dqnY*9zoHh!u_dLUb%h2jE$ky zFRm#YUpLtecR(ZtuVg#pDDPcvu`>jt9PZJk1)Hz)m>6{%+C+Y;$L)u&Yao+O%YT`h zz<8hnwnS+rjcpXy{Z%Qc$qrZhg+`1?+RiQ=U2^vD`N?}#DdSyay_DjxsT!@%>L-8M zd&2B4TR~4;VJH8N8od5^Pm>j!%;^Vye+QNU5*eYlpHfe z-@J6g+Ul5KY7^ceTPxgx5s+9F%M$PDpK&wZm{G7rM3I^`k%~h zZL|K%m-}n+7M_aXnyvJIrlpw0!n8x%h=+=26d~LC6|{$fV#5qM;p!I7?>4}-Q0DuS zrV_|@FD|*?EX$Tj>+1i7qfKt!DJiI~yxZdJe!=I6D$aF+MHr+FL7n{;sOHxp0`zth}J(ES!Nz*I_H)UVtHLlUWai$S560L&A&Q>_)= z^@hn*QZh`s`AlKTRHgEalN<%3QZ0gO>F`y)NAxV|vKXs29z-R6C_%!DV;3h+){!Kt zj5hDbAC!d2pvjGOpmYXUlWwtWF-l^a*Z1sQDcz^k|I)XVw1rn>D^nOxq2|0YUROy4 ztT1lF&d6CuRuGrU)N{Is@m<6ipeTTi!fh?9*?j_t9Ig*t$y6WzYH>P1X;f05$k?Ah zMzTWoC*oBB&%@s{2$vu80`sgJCFF=~D{MuLX+Yr(#Lqme$Y0uhO-1(Np%F-N*5KaS zHAS21+pPO-X3G@66N>T&)n@gI#JuACHp;Qplw2m+UtjKi)cP*3^5Jvp#T%5zs#&A= zezTPy|MM2eq(aXEfCzc<3K)owz4GFD(KqzU*DlkDQ^D zNB%`4g~%kxDgj-l6yNd=gbPUg5xh96^~hm?WhE(9%z&`Oa<2-u7jWs8WUr zpv~dxXC~UE$8=%gSp#@$^jdbqwKW4E8QYyRcr9zP?K>eNI$L1||CXv(`N>q?BalC} zaaUf%`VXxqZl1~Sh_J6eIQlrE^VM|%(C=>+yA36cFNl1(BeH0kY6*j>uSswA#Ih%W zp@8~|2JQ{otld#prQDj}LzFXGT^-+U4YjybWVwHuzyBb~UJoW6jXT6a4JGGrKAOcu z9K^?*U{-UcD|4zlvA+1#iNmLI;xjynZKIe`>VlBQnFXOgFTiyXXAYkKdAx*`sfv?` z=EI~EN#XYc0355HJ?QYwPraZ^$&x@4glH-Y_UV}86jez>ype2>DFdwZ!JeB@UUp&F zpu&o)h~hO_Wh+!4RZf#AT?Wn16ZmH0g_xnCTmp$|F6!`}U!%a+a9ITEkyrHerovnr z@3K9T$VMkURJMW=M!%2uqrH)B`x-w2Wxyq|?cRURP~SIG9WeU8tCc5h3S9?PCwCM& z%P)Vm2E3x7S&w{UG=YuvCHeT2^NG^+TtFs>2-uW>9;qXam-5-BFkis420WrSg+aa71PuK&S@2^BuXKEuhQ>P)a?tiW?9VR%9_ZR#zTbMYS@3+g_g{mga)y zF#TdV7Z;9`>l?Pqi5@G7J0*q39bKIp`GI!s_g0g)k35=M(K>%=d1?u2)MmHE11kK8 zf>X0{sYJSba8bbFT(*aOHfYRL1YM#aJOxt|N%Qh}-nqc}gvUGWN!yyB8@E$$KS{k) z81%(YI5l>URSn{}R2Ljj*iSe+ta!)070QFGs-bxkYWzaNX_6Q8$=k1Jop60pyC2)(O68d36xM8K=zn&UfDr%1)z}w zwRJ3dvApP0DiB{*RPeLn=|_@>zQxdn#L*~V&HjjN(5^&keq+8aAiR88cTE4t%|rNu zljJsn#z-mhsl}Tv7B7b(u0&N;%V0@Vxf*h$;K_2NI9?8!NELS#5k`&IcU8~Wc%Sz- z`D6CBlf|h_9KoT^9U=Qy+b9Pj)tQloU1zJ%N5vJf)t4SwA*iV&BD+J`$1Rq3Nq~FB zjxQ8WDOasxlcv!#)+4POCjA=ahdfcpuf8Zh7Jq;#T-p@7mrhwh!eV~#LqSl zy4rvmYScUQcp39WPF^bgZK_k#=&29X6H!^Ke#*+elN#QadM3}|mrQS54TIOmSSad; z6t15G8jnEpk-}IhQNk-k+5ls{HhK#1p%%s$5^?!ccesJ^6o|lu2@@)j0KWM_QMgAL zCmyvj#cB%W)E)BdU=tII@6pXP!j3^*O9{Y)kU&;@8y-u zcI{!slDYhhCoCDr?{DTN`MiH7T&sCiF0=5tiTZcFD(@gyWb1cHUslyCXlP@0UZEj1 zBX$j%O@o$8iqa-XOEGeC^~8T4NG~$$GbKuz6xf_nl$d>~4QH;R9VV@7mSYc2O|*Qz z6uok)&~BuD!3TEcCpqx^EImNLYq>QL?cn4gf zDSOu`mK`dVOYatRWia(rqbC1TajQ=#%TFA5&NNqVi7oQgN33is-i(oR1lLnF0C7-d zoD!;L6mRB^vw?1fhoYh7(Ue5t`F;is!ip|~#cS@8%sPzcV3|%k*YEkH==|>xn^&*( zqin#6wzL(m&;T}a^qR0CYpMwEEEFC>BY>ib)&IjvuhEdBx%U>DsyD^How`F}cA!C2 z3hr~*z@^Zp!&X+lG(X`%J5GiyztOxD zxa5y0|2y`oUNuAUp9KBCDI+UFW=|@NO8z`kuP92foCBj5or~U-mwfLcX23;hOdHfs*d5dA_f{i*2%@uY4r$_F*4F5DARvN?fsuNd}>XVvz z-K$w-H}sDPD#gzLG)B;f{u^7WH_&AZiA+_NWOiC!q5oyD@ga~%rL=x6bfg;m9-|m+ zv-W)M(KWawmv@7iLfG69VJ3HzGs)-2iWVME3KUS5$$>fgqEJMcr78M0v98&kOVN`y z^VDQ!_Oru7Ci=wOj*KV`YSpnj1}RSB&8po{bJIF#&m7S{`T+YVUn8+T(To42j>)blijNKxwF4);cnd~@rHKEPu7|Q zr^tIgFDDnbDi7z z4{;SNDbPI+e-`ZP<IWVj-#K#gSBuu%gPr2%HJ@Ys$#k{1U3RlVDY3ox=3=2L)4HcFnj`(V>fyai1G!0oGk?%RPv zUHD&tD;-NrH2+ahfKeZeN)nIrmktUI$F^9A*m0c2+m1xSP{<9Uw)@1^`0AMBjtuJ6N|7 zh;~(r=%|CYkwYX4ZrdKQVJ)wT)Ok^Mh;E<7UrswFS*;JUK<25hBpdihkKyr<}8el}cQYclP(NZ#*&C zz{e}(X}a@|dnN~bqL@+qnZG6#3VQGeU{1>pQQOS3@OU|@ihA~yxz7BOtY^1J!z<`O zeA>BWl|5&>Sn5UHI%8e;EGMhwYi%*^~^S(c_qGs;alc#>w zS)Xb@dw0pHpAVMGmz-jqXjM}$G+z=OOR8=z^Ee)^>@$3RJ4m#);r`-Aic^UmY(2Y` zDyCZj{b{Xl*Bw%H`CnSKoQgY|*I)AAYICUKxlf0Er)eSmakt&r<+tLmTa%xQPk&y! zbRJ_^Qtn-VGGEi}nY@1fjw$A7MSiU~H*x9^^s zDv+r(-~7h`h{2QPZ#cM;`)(FjKE3(g9Qx0X-&}sN?|Us{uJj4Rdn)Y9(1KGP`9|T` zA7_VTP-AY*-S2P0|CzIZ^ZAe8X9oWJWDK78Z&tG9Om*&>{l9H_uzbes%P$i>4p*l? z-dlb(I_Iiy;;-`KJFooLL8fhbJ)_X(53j&J!xE?SO{p)|oC_<1lJi617nC@$o~_x$@K z2NF7zv%2*RC-yA+YrN9&3{%eSI^;CGhQ!pz8=Ey31a>J zJiG6-^Sm6V3#umB`i~cG=P~ks@qdWSn6yuOFX-0|ws>q0D$3TA{knwKr}xIpA39SX(U~&O7DJo)de3k9 zX;T*4+3wM64jwSE!}-oA1@0riaGu-b^<2Yy-Ld!cT8pO{#~^CE@!s|%w}>~ZfB*Vh z(ymiA$D)#XAfpp-@`x2uJaFTC19HHAz-3`hGr0WVI+9a12Iio9>fd*`FeiX0$2A_7 zof_i4?Ac)-5{<>#0r4J#vBV|%p)#+P5D7zr{G2bvRCn5cZtHDL_*`SqHQZp&#Yoq- z&;RBf?eWt?=kV{``KI=PCzBdI+CNyCczvlR+E;^cyn@W=k3srq(Oml)GL!v>>a-(B zxTCMYJG1Q*Eih%}%(0)ZE~b+yle&N;A=y5;Oxf5{F~yShI=%7+*JKyL`p&QufB#bO zn|5>#jc}JJ5jhNVquq;;0jDj!kO8wdI9EaX_?DB;=`o-UON{W8s>$ii?Ig~do+mXj zg9==k^F>?c)QM1%KUNHrary5wWMJT!6xEg$cI4v!YFgKMWiplaOUEh}i(%XtW^10j z^}w39BmHV;|D>PKU)(ToSmYpj@WrV$xbt*W2;QVMYX3L+MCi(>AF+STKmts2!#w%d z*Shw6)Ubu8HYxen(OoJsZ|YZjq>dFcStfpHXOl^R=-Ay8NJ{a!uvZ5evlD1<&N1xjJ z$4~#Utq{6kxY>S7I(0g#BpEO-ed|c5t}dNdugDANKxlx19>NfkV^OvH;Xw#Tazi-U zl)_;`td>BhC4pR`4+ib@b|ILRAjFbNuyiO3*QL-A1zW?&MwyS$H()L=(mZ=c4*-&X zFPSrk7bWt-UN6McZ4ElZ)icKPPD44cGT%W%<(9N$Wdt}95-{lZ1k0s{)$V^7$^d+< zkoXjr()W}A(N+NEe83wn>{~#C3e=P)AR=pIDZL+a$kaLagSK*!C2Ob{6*^5Xcfc1kH717|Yc5a)wQIrArAapc zN0y2o+vCGkLRiD8UK^uW5ieZK8&E=%2z~tVl`+H$KrHnlo&cgUY*+P?2|1uIM@b@% zc>)RsUxx>21~7h!FY@L0c;e`rnNh69Q0dQroB;x_1Y(tpFfvh6o7Rml_KkInoeMA} zkne=n6A=5tN}yxZ9#Fv&okbZ$Atn!`FN~~*j9H4Nl_;ZI8JtP*t=5Iws`gI+giesB zR)wUB?IghbT)>dk9D<77B#1#~iG7QB|7w&tIuKMZB((s9w_sq@Gv9iUgkcC35==wx zd8!be$_hnC9-;&R^04vA_M8W++J}8NsX_{LZe8O2lPDztbB=iyIHdsIrhhHPy&%o* zxy^r`>)}a-COm|V_5|jF1{HnwFd-DSw8r~HwJ0nTdp~swsB`{ZW_oF`DMU?(NJ1Dh z3>G0l=pW@2$c0FG7&So{AnEZwsq@qj`1M*zCm7TZdCQ&$_6l_s*s$;@=Nm{0r>+Zc z4$%;T2bE^259lT3E__uOD)wT7WNHjm<|LRDQq{wrs2I+}!tx33-8%fA@e71|932+G zpud_Bop$h}0&uM8Qm2sH z25~h?k0_m42fDJih){>Q<`TTP7&zKXm$SXH#mi^@RtClPIPw8MlbYknpbw5P3-8H! z1{rfvXwuxrR=BQ%{*=gDqRYRD zPlMcRdNSYPC1f01p=2Vyqbi&p7^?1x^m<0*VQ`%)va=_2L=}<@k){BMBMg|JhIWg? zY*pq|DtD_Dl!F8eh<$Ju8Voqs^@OI116q1Qh)UWNP&LvMDk1pG#G&=guc&)`ujs<% zkev2FZo1E)dYSuUnss2?n|ngJnPGVZ{AFsMZufcuPln^xdMqcg-EWEX!B@M_tM+F=#+fD7nW~6k zama`&tWE^tqa`gpq20=mPI17bC<0M260mzW2m

2syz4-}p&Ud%1gPvIj?k8Zl9} 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�yul3OW=UE_QaARO_iJ)Q#pRnT(ZodLUh} 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

F=d&P#3ykzr5gib1DiK!6FSCh06JAoiv?6m= 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�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�DfJ{^_VE^`#<5FZf=2By{5#6W^lOnP&;wYlyY{T8ni@Hz?rori^Z?7 zj(Wf>sWbj!b-tkYYfSHaVzb}_tj;z6$Hx_!}vOvqOA$(F^e&DkK`l5bi60{a_ zQhiyH!AIlAeVU27Nf$S?9J7CGP>>~&GKZ^9oJfO)*qUqQ{Hc~>#7~=8qsDGBY%t#Tyrf@xBSK03Z~U)l^yjE* z$;b3WpDu1;P#&1?lYYg28&aCL5KHBv0NdP(T^kfj?S5xXn?O-vqnKEm_qm0E)(m=N z`6sWG=-Z(mqy>(R-1~%VaM|SUT^kixyWas`c=w14Tl=*(Z_)?c8r3q&oNe7_Hvai& zambSsE3>Qz@O)-B-iG(lp$T|RVncFYTsZd`_lDE^mfOC=7|Xl+3r^jxD0Wketc@dW z-m+|f-W&gWni6r&G9}XU-aI)^wkP|kkpD;#tN5T<&B!67=qS#ZF1vcIONR3qa5&b7 zF^gDX-K$QjUiBxFM=kK2#YZA!cyNC@XC(NL3oBC6Z%fm?*ZAt5ljk8~8|r2^j-+yAaxDWl9&q z$m5baK-&V8n}?Vy0h>02nyBP-)Y9LoZOdy3i)-zZg}`Efv`E+s03Q6ilW*67CRdX*CAkg06(z&JrglG^& zTWdyM3LQSz+C8ha-^Ih)LMAT+<)74zJ}6K@I6I_%}`o(O3n5`6oTfXUV@2%&4xkiP9;ezwMS`a5fZ(^ z^he8io9h*;bu!!~HDlPoupD5;A|~_I*v5B11=AKJ3^+7{RS#}X}UFb!O``l)OZW35%72oD+9oUKuas{TIrOSwS~<++~V@1nDt+!>BnX|cf4uj5(%*BS1B73 zpz{}iX|Q<9vr5RqlhOe{bxpDcCxR0{WI0Q42mXS#%?1Z&B@SmqEOzZ67uDKg5DZ(1 zTP!xug~%s0gi)ofqlVO|q9%LTw83P<=d1k#%vi%K7Z^pio4Xng6Ly;t&f@oV?rZAd z^HVSp5McvU`WM7e-kEG40N6ac4*&&)arL_sqPS9bB`$MteTamzc)+|!=%7Yei-l}K zZI;J?9TUM|xWEsk-7XCUrRP>jusDhTZna&5hPGB6zb)FHf?)EL(1vW>Ga?<8?#SYK z9%aC037I1C_g8ZI5fd&<_;AK7765IzoW}E{Ov(2fQ$pXY3tiW)k#GsAFb?ItHtX>o z(d$3gPjWY4oi&f{qp}Z)`HyJsn9)tus;1U+AF-6X#mvDUCi zMy2&mblvdv#k2Q;V@r?b@TL(VlMg)3+TKOBu-1=93_xks3ZValT^f(r8Sybe53U{I zmKYqGobL`PX_khoFQpd6N@B-=^`Ms>OG9ofrzW4ZRZFNXD0WXtoly%aL`I6YMXWm3 z<9|-ycvh;1nKiH1J924_BRBh{HW(=wEivgCu=0Vf4;rXV8XK09RM6NyUm1}E;1glI zEAno>n)J%};Lfndu9Igw_Bo|df}<$ul^WYlo=u0)p@FA|Gw%5eOxu29<-$6=2uQj- z#U%w+m{JT2-U%1p zv9P>DRuY*0}y?0 z$pOIX@EXzWT9FAg{KA6@90cxCQ}>;-VFpqkF+klfK zatLDVk2ThO-h-5Bn>HIH{eun#?;VO*UhX*7)p*=RC=t2TVfiA2}#~0ydLS=ryo&g}1)1nJp(JNTL!Oc3?A|!xELi+e(`; zu2nmX1|c@x^j)}rH;~KgO7Odf!Z56j>M7@b?#m9`?<87tNo~#=AUGR9loaZtA-hS) z`pftjB`!;|js*dKrSy^qYyWD>&AiApwQF6P9kSuyr=aZ@*PtlO3zh)Ds6E#+0@u3k z$&|9{lmHjNr91P+VHuHUZ9M>3Lr0GyrfZw!n-D_P2RBph=Db=4q>kRp%dg#;zcJzE z=B0LB!kv{8>mO3mCN2txJRQNatEt2|Lj28Rc5VnJRtbvWpn_cP5EtO1j8~}*n?l~q zvr7{C&rrUpUSIs=(yB9J>R%r*@uK*JhGlKQIij<{3-*$M21jmMibVEV!-`eo?77EZ zv`kd?U|l4bA4U~EQ<(*Qw^|LGcJ(CQUb1>C zHH(EY&Zq1veTg1dtcpK0*h9F#)9_v}eU_AF&kysdHhVc>wU!G|lpkMdOk2O>mm?UO z8m#7Z6|0GoWgx)g1WDWL=kA|(?c(}hcrie-1}**qv^KzOp~fW3tR%vK^=f*QAT-Nb z#m%x>yFo+WhnhU3Dz>zYB{4s$q1yYg*^+;6X*djoN#e0_Y+_VS4C9UOsXD!Er&+JT zVO&DWs8mpo9{v@}$wN$gCCog~rVYYo0)*Jdmai7jf57xx8><*sqa!~$yaXgk#=hD~ zSz)_mc3WGB7c|d)OeUsFObE56qF@deF@FWrRIg^n_?rjRn%z*xlQ-rq=@XgAY- zlYJ}C`~z%SFLbyhTrpL>^<^!`Z=tCQ%JDpQ^a*d?ddu87YV=1w<1L`Q^2ii|afE@9 z*jm#JsoiJc&Z4@l^|jY+rMKZH7ia$Iz5d0?9VVNB7Kx~dgJ+Uqj5(|$jitlPwP$Ru zN~QR=4g2D31e2NqW`NF8+g|^5II})Fglz+w98awCn}M=FOA$i#VhJJEFVZNrJ}PA= zo#r|QSpVft_^$4YxoZW~;)--wi6lRdXWjJ4s^biC?P*5Og=ZzlYb|OpZ$3FhOE7*A z6J^U11}y%9)-^EZ8MpTzjs2K(^sCgS0M7E_#<^!_1b~v}XNPb_7a2!MUsXiEKlXoX z?bNl}+PXgm1T4pkc057;$B_!tw0TGDnnz#)eR+){FeYX=-c9X^A$uS_~t!d8C= z(3N|_?$1*`Ex&u5AB7vRt3$e3z3F13SHsOzC#l4uwN?V8Tm$MUfSC+$ZE?CL?= zF{x$$?n|}+`-jGMOuanD?or^)Z|0xy3FSnD-&9PV#eN4xOR=zQ*q7`X#C$=uqt)e1gGex1nvahFK(; zY!ov84&ZPpjK3h|Y>0C`WI`A)?SpW$fP6zly$&*|95>mfzN?d%9G2M4fM|bf|Ne8* z<;S9l;Hx8Q1V^+FWz%DCVYNpx)hmy zZ0`A#M_;~-kPEnTe!F`q_-G9q6MgA`lfD9JinUz-ouj%cJlboM{tPU?{d02Zw;K-8LYCI&m4 zuErRLf68V$rK(;71h%S;E4i|@SJ;?d02+QLA}9iLySHkk>D zErvkMaaWi;xnHsyPa9tf11yzNySDJDj!8DRbyZ_s`oxI@Je;MiVK>8RThUUEh=^*# zM0h$3i3o809antVeesgQ^aNP5VD1gb>eM5P5twQ|E^njZ*^=Svr%Wm`fE33e*EUiD zqhue^wGLWR>DW--7Iyh)kd+=R^M4rbKfbPQ^&g&YL91V1mSE$R$2paBN8L#IydaAo zVwzF!{?Ex1Z{5llMq*>%=m$=A2~8e0KfE704uum)(RULawzt0c9Y-^v>K638Xjim_ zPY!dw@N|-nDUWpo{;YfEq533RD4_LUpz^y;WNlA5QM};=58 zr6-@)oVu)CzMB!m*DXIA_|Kl)a>#lVL;GugX^Y6~0PPdK@xsEEPEX?YvAb%9$uC3s z1%A%nX`YOcG4I#U@`SceAhKucxFgjrM2#Q*I=}GGB-O+%<5Paq=$^YToSe1FZeoHbazcP7eQkDWX67-Qe@M3j>Zg^i z?KSJyh2IYPkX@EHe9XZ}(nFMl6`O49aucT=7Fn;Y_%E#JK)w^*F{>h*CK>uaitat2 zrT&it_&Gbfx3+b)?(2S$T36jWweD_Nd1h@u zSLgsDKCsAHp7hP=Etx0wRjDO!j;J3_J!vquQ|nI-Ndt%VWP@LCIMjxBS*duEnU%+! ze0bu?H`^@__$l<>#z;dZJa*cQ0twLWU2~Y~2i~J7Nm4s$!e>UG@ ze_oyS$poa-D5dWB4fXk_PA-K?&(qn~2B$|w+m<0X6J@8tS;h5GT6~qu`f5=jP+tKv|01PE zf=0`u_t})#m>a>`Wb20}?A5UEBG~rbI^ChE((MWJPq4>3X^w&)hcbg#hy1m_TG_fV zm|I8)T_2CHd%mIL%?x)|Xsjr_xr@O$08$da?++gy(K}Jlvt;U?(CUW0$3ppy&|%E2 z(nO^h_yHuk3RhR|tw>0iPqJweQP?^}5@pZWu{ZqFvjrWAosJ(|`AQ zAU^@}g|fX^N~4b@C_5wYnSYsjK+5X@?r98wCXW zGCpas3`gTDB~EQ~2zGFnF=pNW>&F4bJWRhr37jnR+-VTb;DVCiq8;P=W4projR1aU zTo}b1e#q^_)G%=>#bOqt!ntx+3WD5wc=E2%4Q8q7Y}~C3r`;s1aLu;^)Quu{KH|Zm z=}Mt)HWE&5&ROA_9!T(HaZTIu_F5oe^bNh?kMDFyJTk1QIWqC{b$>lce(F0dn$9Jo zw-3!IXH(M)xVpsFis1KZD+>rR$EV@x!#i#j6?e06LF;|m(pft#!=Amo`qq$X{V7Me zCF2tp@0(KpeJQ8wMN5yjO^!8vZS$4KtrsBYEDPOme%RJG^iq#OYibe#nU)G#i_5I3 z@yejbdQn{#IV0chzPI}H29O3!b|==%>ePQ1LUbZ0X`dzFE*szH;Nj?cIu{8x+p8IW zp^bU)$j6J;juKOq_=g*FNlHPM(JWok8l7H5B=O;WBRBDhl|PsmUc3vXM4^x|AIw3h z8#K6C2=$PhqGeJ7?F_EI2JDo?r$|ialq&)kew@1x>5g*~G#5hGCWfdqEjf_lTn89$$yA0HgM$A5}vSj^a2x$q?2+hUoSw=@%Y?7=n42NB22T zzsP3IL;!mQ@d2OlSHRHrEyPc2B7KpspdmmxpMklCOgZSop^hpTU(~uS8c)wi3TAMk zOrH@2B~lUU%Pu&>Vbrk~_BvQaH8ZpvU6jYTa2?X}pa!K3r>Ao%EY*y&ea{44ix48! z(7XahHy8R{4 zf5C@dsJ03yL+F!3^qU&SZfoKf9=#dsIMvWUBb0~rB$12;En+nB31(T~SbD`@CH)d7 z31e5QH4JRq0K*|Gc=)<7AQqruEG%Y=3gN{6xCU-aT$oztH$w48aXx$nMGP!YpJo7*|hvH$fi+Xx|07Pafr7-@R0~ch6FjIpZE+E}J^L&o{FZSXL>F zMYoJ@O-=tuwQqAXoR-d_jcwDMA%2YD5T zdf=iH=wDK;AXY1Ag9`lo^_J25@`DtfS@F<4K4S!-VKU+$0WE_G+Ht5qdGtF7?US5w zQw6lQlRjwZLkR7Kfbm&F(8|G8==K$yHE(%zEv9wa^1&-?nF6Mc$n!Cz5%gz#LTDll z^%IX#pP`0*mCPr>M5lYa>4;YuLs5&f}>+@PlaR$w0;V635N6^(re zT`Qp7`N>cu(+>gU4gsT~7w61_p70r{hTOqp{9uw3(|6m8LHGkbupgwTbbc$T=Dg}J zDtaG!xHyia^%xbOuq6)r%U&qyKmWh)u#4K8((rN5(N!l>B*1JQ^(ahWF$u+dqN^N) zHRMVrVW*nHmlIo2qE@hW<2pi6h5-l0QQ4HIN}Xr{AOUn1%Gs%G-A*1sM}(KcWG?@> z>|#U?7cgT>F|G0{U#F0XSF)*|>nU0lk;rCZQ06+7hy6?{HsI7yvYD-d4s*z6O4~UK z+8GVxX~WzCgOC!upkZWb7F>1$2f;TL6~BSjkjwE zhJ0X^ny%&({gJ~e6z9N{KlXR3^iY&+Dj+?z+#IEw$WtCh>$IHBt4GNo45led^Ocyy zOVzSzS{^{tQ2n-)H{7JztAWSBkwnZ!U=yEUsG}ev-em_9#+7MW{gpsuHshuoTC$PV z{0RS+y~D+7!wM;*pG0#J6%9O+)^qAld`;moQ#OdGHxb)L{eVaK^Sk zf)=4yXc(Xzk8cIFDtbA5K?fmU(hyQFY+sZKfJoz_3uarYcH=q^`SN%0)4{zOx(bCX zzGYrimZRiB@NIUaJXC_n`rW?ivLU&BIwW zfKNVFKQo2M%+@RN1M7Rqs{opWZF@wmld6Pzd&$y0%L{?iwlkS?RXDO5z>q!)P>#Wh zvp9g_FN3dPkTr}Ce~4^&eZPX_{yLSt(R9U%R-K*sg`*JK)%tWgZQJUUgq6S+&cO`0 zX^Dz9$|U>qpesB^sT>MX1Kw=X$9-T@luyj6C2R!*DM+JoT0VBOWE0h>?pW;q-OHOW zsC`_s(s=RocE19_J7|4r!RN2k6+Aq|As6m7*mqGk!wigtY0_1I4}dK~7Z*OVUyixX zNY-r_dU}ACD985tfq05;wgMl)CO#0*EBJsN??_b(E}L{QIh*AIfI+UzrVqdZl(d2a z#0t*lYc5_>(My=PqX%fl9Lgsp$xL-A4h0HT^n~4@atZwzpGZW{4#C8E!w{;ZcT8XW z3!x?Q2{0RC!%mjG+>0=A7Jy#`XSi?Kvb+QgMwG!6+~dns8%=W;kGMYV@=ZRW;FaI{ zd(wCgX+4`%fD!|co%ZU}CpEjs0!rc{A_?8Ld&9LqCm#gna<#TRFcqfmQRCb ziMJ`cI1S}XNGDKYo;4o3 zJXfboKv}z$A_i!s93TwYKi{e3iHcSN>~Z+TxLHtJ#>YFKAYDZs&+pX<1=7(2r*i~{ z%lOw#KBYP&?S2c^UF12Wl>vu1j1^-bk$?HZo*Sbo+6vVbOb`AP3+B<9gV3zXSG;UY zPv>I`GkNG8PLfk`&O-JFpcla)xQNjWh?AtGrSR+rmFExSC_Y#2Dw8uV$txx1n}65U zYtfY~CU#ue?+wciodjpfaTap^Jk~Dlp5EObogCvYGTL&h{%W2PTsVLFPNrkiFwG9Im^HQJ=6}=M0rON3j2Um*>e9WQG0xs9Z5WlwEc%~r`RK!ti ze739%<qt~{@ERoJ-kz-L>V{rOkO&zhgCW?V!L(NyHR zQEb)7oq2Gr7YZ!k=>EH;>NBV5(=DAZN~+I6a3A~H{(as*&2nYm#X#6+bEx}J9qlrhKxU;i*f9Ok}kN|Xwi1Jn9p${ZEG4C$Gr z9Lg4ydHiKm+)=JlRO}8Wi&|6OfOUnv%58uIiBdZ@*Myd~Lc zTGEQ7DBYc$dKJ*`0YASZCvR1fwkXIO_=JSp(AbTp5A%hJITQ8h9s zzpEvy`wwoB(|D2w744mZ@eU?g@ZMs6^$vin&mcc>#d%qR@NdRgZF5h}y(fR^At5+O zbI9q0ormN5M=gR{fK4NHT;TSn?u>nz9h**YEGEW zDb-lsH*zf>AHv6!58??q(OH4lB4j%iH?tlj^B(#Zh|}&oj5@K;Q~=Ng#Jiege>Sc^ zuWNqW%Q^6eBPx6${NW5tm^Hh5J`-mw2aVOhvhR$bAhPATzgk`iO+e{qlRsYs<{&*D zp%|6`;+fa`*`LHfT5`(zLNz{UaqElLPg`W?$?%OtfkW8bvqzuNwC+2{*4`$qpMA50 zk1I%lWY|Ez8Vp)O^kF;fQB({bq^(*DdH_tX{I(c0>xBmpkTSWX_0`L3X1?Zr1wShG zFf0P*Hx~@udmSye4nED+tbK7tiYJzfqe?~lv%dBYp>j!0U^H<6X5E{8h2YrH`6Zb$ntwM_GFq1ZS*(k-{m_E&3gRK zda}3wBgmi9ZLSkwF}#_u3jG z+Q_cU)h**_Z=e0bSX%#KQk)~WjM?=PFTcaJT9Ikk22_m3~{ zU%u291CXHr#_4!#V7zXEHNm7tCE7Wo(dkV!+)`C9=UHMMgAsGLHxTUg4cA>Ynfi@| zTpqDABEv=ZZs-t9$wyep6@Dn_E~;#z0&5iX5O%boXQQDpIn8iI6s3W(ylC?ZS+RaW zvs|acpk$w0#KcN@@hagrtGEWeMhWN^pIOCV3XsYyetoJ?+OWA1#8qYK>zYw_ysMI7 z_3itE*J$dkwY(Uls%U*`r_?M>00@I$WN+7kBn)$}u{EygGP}DTIbptbv^P~e@AK~x zoS84+V6`BV7q%-_2io=3!>L8+#G*4wj(^=@g~H(h8I2?@wL-GC3<@b_ImGo6HbZ|WLSO}D55;mZ@t z1Z#7zO2_}MMWJa$f-aqzlbY_n!h#k(7rt$EXwFcUPW;qGad}MI@kWtez&BtW_`oz3 zM~qP+LjAa*w~++ePy=gM<2~Xu^BmZkaPBmUOs#7lBkP4``&W}*21vnnJ^BLQluUUU z-kV><$|o>_nuVXU*+)#?4c)xWQHbUZz0T-^qeJqAE~K`4^DkLM&*oOfrcrxHS@jT) zH7{==cT>&TVeT*VwDb%h-Qq`0Bt-6#rP()bvp9Yy!sY+lm-sLzCBUry%E$?_Gy9XZ zoig=x$L4C=l9#ju?$+rs2!ybeQSQ^j|+pEqK z*pNH~)zE&pYzsCWea$IcZ}_P9q8ZUUMs{@KPnXiS4t1ODuUU17mgbtVwXyV0mvx(d zhLARnu)YsP`xbyPo^RAvX37ZPsn%W1Q{BYLlMi_Req~_+H=_Mp<7uBH^w=Gh+T$Zb zHvJvr9cK-p&5aOxRCcArM<& zC)&||2ik>Uw6+I&te^~%m%1W4jh$NAZa{F?p!g6T&dfq>)yVbGovO!5LE%Hxx$d&J zyFnbrs|9M%%Nb1Zw03|H?AA%lU_+(VRrBq!5y+GdG0QcAkfdGbsT+qi9k4(Gd9?Fa z4*;=y74h&4nddnFjqPPc1bFFXuxl7-Fr+5t9U7p^l<6#HD%omEN{te%v?p5=XRxbv z60s&MCm}g1OIRNbM%m`MbQ(3DT(&;H^}F+>e-$>P^)jZAF2>P#&&&u8OHIN6Cxn@01(VCrrj*;ttEM z{l~m;))76{mf(En1+YjOlzP{UvOeNp^U<(*@1bx`mrfdtXQ9Z0T|4?YxA_uB^8RkE zAS|L7z{ht31l?>hO*ThjMN1vf{f%l#85&5IWOl{JcxSOyINo}cKVaZL*R7Y0U$bX`Aa9|3Lh79nHbeF; zG)fJg@cpBa&kTCC1khjLK4$S}=%(uqm8i|0{7LNSL**$J+&T%*V$=>K)4%-Do3)JK z#4Cy*UHdY`xJr0*I$-RgR=2TSjzV7=|J&tzM!xMNpK$tR#ft>K*w~K`xUG&Q=lo;w zIifgVyOh;w7FwWJhjgbb5Bai^^L2P|B{6Sc-OY1V1^h?5-h91#{!^rCv}X0LeXAK$ z20L+*0Q_v2kOC8P(9SR&DN~pgt8?peN60M;Y?_C20v?5GPk!~H-mG+1|-Jdw;-jC@D=3| z2F;tf;2bb-h?LqZGvn>Gz8yYeINWV4+&#lFOMfTR%wy_-*W-+K z+flj0QESGcNN+g&6E|iK`>%D4&I^jppB=p+C3>Tsxge!uQgCr&U36i~&E<_ZuK$ku zcPQZCES=FHz#-K{69LIM!F4AA7tm?nE8qL_dJBU=bJ;rtXiMfSAmP!>>8|eu&GE zgpWyjJY-DSQJf`CD3Hx5AWJ7@#Vv6iuJZC{NNh|gJn9yP4_mRwjD9)Dw4emLHV^AN z;D*GR1+!PR6X&xbOP*KzPUCuao${p;dXzWn?`^GDGT4*NaXb2ma3JaguQpl&R$Hf!3ajztRyer_wc}rNzyn%hnwOm8I(@NaH;v<8c4S zmU&>U7hVBos7M#~p9ApQJMmRrhG6}D(p(G@(0F0M;XpVkKTEoK2rKqd-Wn`Vnm#a) zP}d6FVH?bOt_1NlxJ46$0QBm^lyi@~cfK)1pSVW-X}@zFa=`H=>zzpXYH6Mlr=BE@ z6oo2g54^s8=dt%dFBJFA_5NREAY*gX-<<;hu`Abe7EnUh3EP1VtuO4NgeoI5-;HkUR>`QXDB(KvWqRI>T)NzjS#s z-ijQp$47z-2pKHmToq`{PxvVqq%;ecX#y>sL`DE7s$I(K1r3xtHvm#}KWkL{(b=KV4EK! zNt%!@Z-%IRbA|$pS8tC*B&p5fl018(4Il&SZ!9Q@*5I$Hp6Z~Fm~7XMazcm`kaQdY zn@#co(sU$A3JVEjaS}khXoNFB!2W}PLwi+*s^r>(2nLLsg+5#EM2MQMXQjm+v5DcGuTAmEcF!9s&50r9`w@&z@6Je;8b@iR=XZFS)!cV>BCTO3WvmlM z>)~^3>i0uSumgAY?`b(q+s&tXUPJdL`xIud0xHN+;w(&dv_Y^5lc`sFgGf;u+ z@J-K72By8X$OnnF;Oem*UI^Rj86N4;vYMNbuAN1Qt7(x~+NdhN{ z9h0!|53cY-nUsm=X-bP!lJ8Y1kG*Hl;+HxlKkW}r`>N6EFBoh zl#{TNKByU7l}w6ewiNf0Qjv4us8b?2eHw}+%=!WYJ6Xz|2iD=KPKa~6$+9O%e6O^) z3Ba*Si+GaLg+e{qomQT~xzrM=0LZA3Mtv^d&@5hRfz0cbE>wb6%JiT|>2x!|Cz+I? z5-$B0%mYaA&ca|Oo;0+Os3ubh|w~^zd#IblY;2gD>QDO zC2JQ>b~L6;tc9>mas)rRAlGfv+tyhikL%5@fv}s=Vx7tZfjSaeW_HZWlUuaDkV5z{ zmS7eZQ2d9K9CO$0*iAyNG?PVKIw4usD_xB|ap)!1j@rBC^&Fpiu&@^-4FSt)NF!5t zXwG)SFMIpV(}(39bPNhsocM6no|jG9#vvW{6OK7c_bP=rr+pgZ6LU=vOQ5u{_shvX z>7ryqTswa0Oi^7Vh>JnS>DgvOU+hrgh0lAOorw8rqsBc6czaC|M{+tGoI6to&j$E0 zq{9ls7p`B}nvx?5!r}=@w(1ARVO_JO?lcw>2JA`gEtxm*U}>L_AY;cD5EiLRa!?8# z0nMUFOZ`gb%FK<~>!Y%y+00V-eaRN&tGS#mN9UQ2Zk*k#6-L{Fb^_6imw9r>Wd5ok zI*Rm6KS&=D6|+TiVnjcLyuFGeZa2l@ZIuSSZ zei=EZvsP33!xwRe9kS*vj;!IY`sb$&y78x6uvSZ=GeK4|&Jh3uTO0Do8Ec1#vjv@} z+F!S38h%E8Z2;cDbZH)o=-rO!EAfF<+H@;o_F)$=ezay|fpmkMFx^Q6CKntFCHWIc zOS9Im%b0vIP+&fe5Y&jlTjjgR!f%KBTc3e0h)8@M2@(*zRc1UzPR$opnczS%noMX1 z>h=L9qnihb+$JvEJH;!=k*yq)7+>>83;!xnl*kYo-|F5K&jmrIzo*p1@SF=vukx8q&wt1$Kb(8Lu}dc1RPCbi~n z2{pG*_&GmT^Z8zN7{Pk1%XYQ1i z9~B*(P_7fBSg#cBZI(wmtkqxpV&V;lbJQf@Hl^_4f@-d_a&zg9iDco1ld*U@a_T`u z=M9;m!D2o+{I*4tQwqPzqhUxScK(E6tf}dxJ3(>Nr3{<5+x0A_Jr1Ak)zp`oCDwq*6I-sBU8m5}WhIGvzlK;NE1Z2kjsBR&7aRRNt`}0k!D2(|w*&&K4X#~LnC&}frM6nLJ-CCZ zCuTi)b0kJDsD%@L*u9-NJ7E809!hh#h=l2172{8`gJI ze}@@%>(W%bTY)V+6oB$3Uwzs}=O|0qMSk_kWeE*+XZxq08$Nr>{bZexCX>IqX`t2S zr1pmfHo_7|Z5i-A%JDd-i?L)f??(BWf^~R0tyubx@DLOd>=rGcEW7>-k%RY z9NTWPcb1+nvo%sbjem~rnBQnEIl1qx5`9xK`5Ix340Y3H+-ZEUS}#(eG+m8n@?FpR zwxF&g#GH9Svpv5Z zS{}uW3@DA4awNiOKWidQSm>$sSt9xZtOzE*9@2!3S$oL9b>kYkKx0kIMQ?y)m<^(#EA1pe(DbD6WC5{kFq2 zrjnG?2w99YO9S)wIV>AZcjCRi9#R#KL7+DB5y8#is;>lEyE?TdkP^``-0w>mZS z90>2DIV$-;IXOC@OIT5uBBnd25^&q^L#u{uXHX_2+K|jjO!Eo1x+n`H|KyYlB(E+1 z!cza+^^`l_244NIqgJk0;Pin8lL9=E^R1p@Wmuop@|F53PTT@z*zcy3yS-m@-riuS zk6#uWMlGwNU#x{n3~CVj{(BXIn%9fQu5cS=d^3LB4)Am^!dZ&LUX9rrej^&%fKLpT+l2c74vUbUcRDZc`q=(e+o zCwuW>0!NW;Kmf111&DWE)`&nXdy?(<+9c+`S5-Oj=ZnWg6fJt)Aw+5Cj@sDtUvge_ z>*-lq1^|k(h%?czRL2^W;H3m0U#(1ctsR$cs0MLaOzNse!n%4^Gb2V0lDr#CUI3&S zYuI;ZmooD7zP=%wv&jNioDY69%%kQj;VNCBizc_YDfl=uHsI8U(r|M2&P;wLB$i2S zwml&WvR)CbnLXYemAW}dx7o0t)Y(;_%6OB3o2|aSDvu+gxx#=a9|4hdjOAYeV%Jlu z{|wEJO#CY=Q<(><;Kr^sY%Xu|3_!pgDH#BJQ3r_y)Z(#d0|Y?J z{=13u<{%Q5+RA1E9@;z3WVn91k!JZ_JQoLgS~r%vYx;3E_Q=AEYHY?54Gk9<8AW`= zX*K=i0as+^mdM>(FZFi+F$ZR6dg6-{Y2glPcQ6PcFqR0(@AjyT3fS{q+xu(XneX+y zVZfmvnJ}dXfOV!14GR$Je5SKy8x~_pZquC_X|m)9DY-RvAIyyxJ?a?+acY=0*@%nQ zUIZC6U_=z}LnsOBQ30y)!zsud+lWU@zYU#_BNQq3S8p}W5T^j;sOz&E$ z*L)cS<7Ctz4HjcllxMt{dF}7NUz|73Z$25ul;$V!BV^~70&{L@AXKtNpaE5q+ z_BDgxV!a63Pe%6283hwBZLBs&b%f*e2bYj$a$+OW^0^_TIKp4b_?dsgNBLo{YLBOk z@F?V)VH^6`EeRBr(!cv1=y@_@BD#L{Zk+#3nOci<>g+fzlKy)WveVFgyF3_MVXous zGn?NDCK;h%Io_5XaPELb^Z9dEwmU}4l9>9o`Y3Wpn-zFi{C51mn#=FkMl|A) zb>N<;h5 ztJ0QxcJU-#$?s|7ysri|4leN_3w+b8H7o2`7b?oSu+X{sT(M0har$UVdePW z;qgf0ANQ7iUib2Aw$<-iE67wq)>i`!ha(kyGGY11lb1SOd|E%&@yyqqOL_WZ$xj7B zdCF(}Q8RF?T&>rAEVF$4n!DXT3 zTpKr=*OvWhwKHBTzNR{rrn;^zyR9Dp(^ zG0=ot|4@%9GAtK+wF@ii%)WkoVLM{;#(J%B;r#(y3d2Q~WO!vM#>c&s>BXMd;?nu4Q81{7T=fZfkG&)Dv4=*Gsq0uP2{0 z8cn^9As&Wbn1p>iB&}40?UiI4te@>`m$)i2;==QYHT=l%N0FI!J@`1v7-*4kBxa-i z4{O;+y_W>jRM*oPHW=^PX%0CX}e zkPq*0%=d%k2q6PlJtf8mNj7_;p%E}1f%PUAhbuD)gAV=&9ig$^_ylA<+0<|2iaaWo z$Zy~`yc61Fy|K4RKX zMb+k}yTNVUa&5m^p1#wJ3ka0l6+jc~DUnC^T>&ses2dJD^?wR-hLaQ<^rsB(apiZ1 zwnMwmqU3y-A`ADlkI<__Lz7|Kj_$xg$hFTPsTZBDcJ|_f4l`g@0VXtxX4W{{@L-z! zxhFAmPnt{etE1spvyK&htO;I0sfJzh#dZbnz!sz`XO4?^AIRx+vn$6jy9Q&rys{wI zMv-r07uW-v#pt=kbh$O_8I8X?c3+Y6s4KK4+rJo?jRGzk$h5JC+v zIHx;wJUp;$?sv8%c(6OPnj0`G<|y<*Y?`>fJ4nH`uYpznIVQ<%CdF;1#lZ#Kxs%opzuIkZXNCN_4 zT5SxsVv_5KDV{OSzBye6Tkp9Ab&Cf+IwXX-#B`e$bb8^T@|0X7^G-eUE~Dp&YJktG z=K88Zy`c}78*9vta4&$^Kp4gDr9Wm`WPJ)0h|BLIF2mg(&DTRaAYY_YKPB$cl$c^C zY$1ziy@+EAci1@l%KFGe1@Ja_>AU*|RK$%sj6GArx>`GK;O+2lm}OkVo!k2;Skt9H z2IzW=XL>Bro!uQABs%qPn4d}&%IWmZ;9Ac*151Xe8q>^r(Ww5%3O!KZAD1|H_JJDvdK@Q^nmy}{k1nofce&@T`N zI)#JywE?WIYcQ&7_f@x};et$f#0g*|tR%7{+}IMZL&rPl`gitSfU^pHhtz>i5jAUV z4!c8M>ut}K`FkRR>MlKItgNsT44UDZa_8abnMd#`Tu!)mO8H|?Y@%Ff7%cWSgdSO< zPXgBeIoiV>?xrrNAz;zr$v434Fi(Xzu!S3Nn`wn$XUW~68PhTE)~13d$ZR%eyF7YXUstevaY~kabQ8WPY`Z)$(xi# zsCoL4G&w@xTzAc?4cgbe#1;LHaOZLmmH_&ea@~6Q37hUV;ni=mAB>j{)`tzt?CLsA zS~|2kM?jX|G)hww9Cr9i~a?x0Rtw^)vw!-BANGSe6;VZ8(Ok)Axy$V z%5lJBwA)`Jaw_Zc>w&C_1U}sEieZF2hK@QQ$#q?!jr!hNhR>2bLIRw8fXl7{e&S7> ziE(CwUG5!S?i!J8?|Z7`_H<2n8lyYhkwqE=+Olxim)aj)K}-1=9K)E=(KTKBCY;TB zM9koR`W!<=QD($iN?YfqdPwoH>kLO~evHdu-moYh4;3IWJ0X+md_Nv{t}CpcA&z_t z9KF=$bYna(@cqJBzw$$6bOlOc!<>9^eB8Z_TZAhgeQ|Jt>1_1ml-LYF>>{9(Yr3>k zTn-1QWFfee@@eGh)@rzN{-)Q9w!2k_`IVzaSwcNSl#R|Z?FDEUtlkb;(7cvdA$`E} zi`z@wCcDRYT|uKF=IDr zML){(Pr>GhonM4@%6-9uUemHJdk6vA!;Zf~=3o6?10KG1f$QZ5hRZ-dj@X2UVwWH1 z4cgI0(5(eLzL4$u%|Gnu3{`a7plHyslLjdWs~Q7~JFm5Y0fLQJ&0mLys3{7V+z7Ou zDb;C1DQ)m*190m)aCjxxo5THhJBkLBhSYQ&FhMP0uDQAYs0FI{^71%7HH=4zeIt@BS2IzZQ6JV=hP$GUw1c;NJ+ihHP~OyoM&IlWnFqF)OotOzb+7Qu`nAR=GCX& zD5H7e=WIDP?`22co*haBc>BfW;>n2*muISOg!&9we)PIYCG9HCRn;E(eix}(`+4F` z!8(JL0|&GPKi?cT$l}#=w;THuj+e|kI;+-q!ym&{3C9;4Pdr~}v^w$Bl8YOE{4vT& zZcXpo>$64s^Mj6_%Y21jWoPGppJ+o4UorC1G&uX{M zm&wg8nP)1_7n$T`-Z{`&!3tAI6;Zp3Zos^TIkvp*O_QAo?;whUXkc>Z$g3uuX(T;7 zU&%(Ai!QZj1c;(^G&p&d>D`T|&nEqkWrC2oAwlLnpz}Hhg@ek=9(~PJ$ zF#4Gv*Klvw$6@6?-1(zX<(|R&dp_uS<_Oe>ou{m4Fs-I8j#!ya{T4govj9BPu?Q`1 zZfblc@1|)#a2y9B%qx5J=LG3pH(Z!f8F_Zi{;*RF8b=K<5+~SDO#zON*9)mp1JIN< zRgDy5%OLwdW@BX(BPFY{-{n+Cm5X5_iX0_6hTA#Pie>UgxCRrr2u35i;u202HmAGvkgY{spo@tPGvqD^vY$#5FeT12|t0nCqy z2Mh@c{m2nqs9Cw9M4TX3-^DpODZs>eHJv5KcFMs!#q6zMNwH1u!uYwi7A~h~Vdfi$ z!nr;APcrr_-TNf-;MSj>2iKT~l@#+M!|;rV_8%oiQORMFwUII4rD=x$kqEi_T8y7= ze7<$&^yh_XJZDx&kKkB@N09eiMicq{!A%oS-m@H&$$gKE3gSjjq<`1`XmfnNravKd z^-6`G^^WavS+9)pcP=P7$ln0IuH1Zo#_Q!&X!&U9bY}SqDdcXtbQ)5`--hS z=HGhlqvLgE?0wbn?e_CKqVKMS?~1;uBCWQ5ogNcv@uTGoXX~ejOSLP146ZnQ@aNN; z>w`Bw+wk(gxZy>QpZ}q;3g4fR9zOQ#aFwOZYHz#N>i&^K%w}}= z?{!~D5zMY%LBAMwuDi&T$!IWj-<65&yEc5c?b5$`?ApmJIoYD;`HHBC%ZJJ|l2_ev z;{(&W-k)cbdSsYQ+lxvfB;iK#nC>5b(+JLh$WYNN{-Jyy<`RkZK-EMz!L2fHW~=DS zW&ZEeOafT#>h7mP+i2)>GbZ=%o4Z zpm`TO@QL%C3lv_~p9A(0Hhk7MPgE}ZT=wD8w$tmJZ)J3`U$pL8?bk^oPDV3Wsf+C&#hUC$ME^edG6uXtz2! z;bpGZ^dIKgq1w#^&1NR@>`e-zM^4`czqbFU=>7cKKc}5FU6$JT=OjOKVF__rDkV)x z2vyZnJjVs%(Iw%ALpNh`eo9*6csSC6nn%SEAa!+QCa3%HokOk$lxo?kfDR#jE3=HA zW;Fdj)wGg_dWok-cduk!^zV1K+(@xgLr zkL*g17`K|m6VKRtxngUbn33FkGUocFMCyG+?^8jvTZ{6M_6ogqbb6-os*{OM5uJJ7 z$_W3=9by-UN5}3h6)k@3@~oM>@!IP1*@RhtLl6A%J{3pSTCcIby!_B4qp-V37>r(J|4(D~>&&QLAe>M^ru+=7(R2<_UxVJ0u zE5C}n;_|6Or@L%l)l_d(Dsd|~J``k4`7+FFVm#oNulU&i^KL$=DyY|NyT%4hQZD+~EUmxg-Ef)I@*CbM#*Igen{9D`8Q-a}p?88*SfFm9LVTI@ZJ+Bf%>2Ojg3 zn(4M^)VMyf#`ussgKjTrXe$d$5s*IIL6;^pO%*ECuwynhr?A)THTi+z zCA!gE`z^iv1dOx98QNG=M*9cT@NekC->S>fJ9f1!OJyK++vnrFFTOf!0&zWRod6%8 z5J79R9S{D(Qq+Z8Uwm^dG$-;W*Frk8vEfj!@+m$LUWL1UR; z(G%xeGYkGn%UyK1J8SfM&CS}%nQK=)tI5qZHonneB7!|n8$q~8r*w>@K$1cy0tum8nV!pf#?qs?w#MUAv1X-sq>cCs96J1v!*`rawj? za@4ZK6Y%ByVBT8xXKPi!@-_Ez4%>%i@5CS3FW0Io@uP$q@5w!bFnBal=B~p>IlA{q z5zc{&6lC?Bb;aM1rlWjX;~?o|Y^3RJE^kr9y#w|kEb?9Q$kH+CZo0)5VyD&ZrSmn_ z>73W56m*08+sVC)RJ~f3CNb|mDkJ29F<2(|`{JGalE@A5Ptt;Jd-KAo3+J=8eTe8e zeT z-4nigZ*5=3DQT%jEE}ykUf!NBJ;ohDt>I6XBU)b`HBiKx&W;=Ez_3F+jdR3LvoK?w zaa___0#8cy5SSiY^)czIuA5K&q!hqmG)9^CJag{ADYN@PAI!N7f-#% zzd0L!`5zs#Jsx-mqgH-0j^d+7C6=T7(SLN)LLbtKB%&2=+KOq;M248e{1d z5_21NX};{Ddhl;1@rkYSoMXG^1(~lP^|Y?~r`-DR1vz*$9wM@+y<)X#FJ19|&}5RY zi~9s2pg8LR6Z5TPM_9ol-pxtAjw{@7UVw%oYOjP2| z;lGWsw6*RIj*XLQX@h=rO+}Z{oKiRE9)4_!x|5|w=W?*Tc%!6otk)#j_vF2Qe2BD0 zQ#j-~ypCQsc8}7+c|oq^lrfeCra^c4Ri+T2qWVd_Hza2pphkKp7(YC+)8|f{Znz(;WL^V zOX(U?C%jlnozVK~Ml$-x#5eM%`r||SAyQu%97>m;;SzQaG@z7u?ACJ_zZfxJta&g`)qp#NC>A8^nNa)^1 zKtZt77#W9{$kLzYATsu8j?$^3E^M#F_&v(O&S4V|2cv41+S_z^P31?B zGVYo^jtQ?y-tolN%T;5GGiQ=-q=#Ic+@;aZ(=bNH7x=U^z%^RpP2_yb{B0&f{7*61 zy0hpcP4o+1blY1TA`tv4F@FlHP_SiVh8Yc!c>Hw^<$TEjMTiQk~ zN36>Xvp}?%oTKAfd6X}(>w9>(%4m&NpfhVTr-7?C09@|i2K|siFC}H}y!E-O=tc1+ zm>RqrbLUf5_Em{yP=aYK+iDvO+pcuNrER||B|f|ph^v^XTczF1#8}|WN?kZ(L;1uUUCG zjd%21y56irZ*)BUd$8Nd@%f1Nbb zq+4#=Oe^Rsze+D;kizLRyLrIsR}Q%FufjgTHeS4GyHv*oc3)3QR&YS4ADG%?Y~3Eq z#LLzV5*Ic71^cOSvudl+U@XE)BgTXKL)z{!4coHc3o&6(u>XV0KIE#c$nbgK>PQ;M)q@?EEl$WsUtxOMp&qMMlYMNvDlH`{+8{+yr^tb=m zp`S~2f#E_zj96V5rzv9}y5@VXN8#kd7;-t{hng}$!^Z8>?_`3h-0EvkYST>ixwk-aj zfL}DW>B8pBQ%9>-?uu_DONmKOJ@)~WM!5DKNvQp<)=#P1_D z)9`qt|96_vG|RZZz4B|wnsc7@JPyd`$ zr+c4K?R<5zCag$6ifm|h*uSRc<0bBSuy%&p-DP}X+-`VfVbgccw+hj5*Xu6V2E6v` zmp=gZ(=^3&10CtF!fuTxRdIJ+duI7+{eJm}E5J#rmFIub`g$gr$2XW=z4et;vl}p~ zJOAE%=D7EMbfTB(6&Nmb%U=CClb9}zLXJ+*KJ9Xv)dRkEE)BaVyYVgu+rqqPy|(Bl zfW5-IVme_O@EAG~pmnaA#Ka35%o6-dvIJZmI zUM9_dt=UeKq&6&k2{WJ$$DW?p@|6xcLp-T6$8cTWBIelYB^=6}aC2sqKO+&C; zLyWJzrawzJz9PfbOEhNN46uCMLx8|0XmoRQtg5w-@p`E4l2+z3ojlV_{y!beMHorJA$4|9v&OL!UWpodN5IoRe|lNZXX>P;;J`SpU+MInZXlL- zC3}U8d-=S{gP)8iZlCQSk85;ZWYlno6`5B10aDf;Lw1vfYLSVOj2Y}Aho0A?&6zgI z`+m?3x;ePTEUjo5rkiIu#?m~TrswG~z+Bv0wyrd10V321D{@m! zS=gp1wPXfn(41wntm8-;vn8`89q~SWP>zYWUU=lAY45n{J+5^Y-QdvtH<4>$ebvp< z{rF=imW0J_!NIzU8D_V#SCu{Y*fLsK)7Sl&siRIa4c~@%q%&vUF-LeZ&SK4+nyLM&N*eX`g5vzQ&`ybade7Gzw*xOpD|Ke2)H69+ zi5@eU(Na=J_x9u`hFx^kH~lB$>FG8FVj8wt{&af0y)ePNK%jf+>rs~BoS1V?P1kez zgeVKuHQ}=hx+D*o8Y2>Y1xxR&g4K1YQhL0?!f!fb>K^LE#ly@;w*sfvK0WSQ{kn^< zeaT4U)DA<#SJane+)~xVKNhCW=lMO~>Dh5z*DgFh-PRCGn_fMTfZip^{hjsqs2M7_ zA?e$fkHc5b5_RmuTDGTIh8?-i47>2hC^+j_P}$|q8`qQX)g7>Nu{(QEe=wM^{OhQO zx`$q}OOj;#!V#DFen7XZ^TLawygmC4I5JfG zs5^SghbNyoTb{YM-)>C{J2v_JA-n83$pOE?j?15)$~F!jUU~h>*XQlopI_d+e)Zcc zxe#X>+L^yue^J2PMAvc4{q}J~T9pa2i}p@LAFHf0TUZ!7xhgQq^vJq_tPgAC#n-fs z(|@o&&Qg!g9Dl3#_4{z`E0U2*o`o9fsnuTMC@sm3^Xo$L)P9tx5X12?tsV*4p)>SP$D;^ww^^ytiLVsoPhwf6z4#r7v#0tjzkc z>!(@0IQ+ojf{4VQ;bAMz6;N}{4?OVQ-P&^M)2TC8K7BeZyLIY0&OsvSJ)+lrazm_S ztH$V>8_ma0pR@QoFk19L60s-g=NTUx{oanKLzz&`Nv7l>%P1puAG!l{@z?nX*vD8b42fYW-xu1XiM?G$sdcF=KuXVpYyx1ZR5eTz3PpT6>7r`2~^*mGQV#_!l2-=D;N z+dgwUc}Mxdk-o3#vh?JqdguGs>&KltpY-2BZqEh(?HY-V;;z|SE`h%<=c93pv+lm$ zmN`FOZh3D0b?>uNB_$U&cinosQPMU4t|9r{&-W)cw{9E!;t#t;*^;B__N-@9%A!wA zS0{gcmfbc{H(?CY<9~m>u=&$u&xIe8zrV>(RQ?{XUf$-Y-(!^bdwLN3_Gd;B=EO72UrvudFuxhj&Ok|L@nAtKa_pR^4_`zy5e4#P;mWhx6)x ze|~&Zs{y=Z_!>V$XJ#@`KT^ztV%!`lAzuDyNHD z8dV~z6;f<;f45$Ts)SJ~#V12s14dP)9z#-MUVo3tFI5>6-%KupCQgP^Sr19pdxm*nR2%^z#ZC-S~z=@MmQN181k^TarT(i%9A0{ z1L}wM9ka(7RVP;@hYUB4&bD~mJsFxeFnst|WL5tz7QXhPp!uBgM9}IacG)k|Q4`mb zZ0dW$W)2KZkwd`-p2lWzQ){7aL&PS4;P(K(nQ>H0XF?wRv}5q37XXV$DNPdi>^7U{ zwXWK9dVRd-YGfTx>zm}3>8Jve{T88Z(ZGtB>3DkU+%(#a#w3X!5LZI!B@-*8!yh^P zt;gKOGomwzC;7ysZ+S>_NR+5l!0!v@E}ziJ)C&4s{=X6v6CU*LWO((+uc*4_udvjW zMZ#h^4eP7?x@A8u=ctCSL=z(to43Fuu zF7K&r@Y_lzatUv<*OLdt?6(P+tDDa6wB2Q_+sXl;(lAEt6mA(tj_!MLUSRp`6;TJ; zfG%MoVkIw7Yv*hJuI|D_%Gc^g&Ue$263YUo$H@mhY8I^jvMajsHV**kKanUTpa$&J z$op^@00RIF^eObE|NjjdkO=%kIKu&q8c=H(2gxK|LX5UeT)#}(Q$}78(iGIz+_#(J zoHo|qcJy{N&9}lh_`NgD zCB=Sg2jAKM&ENL)k@X(V#njpia+x0&)gIe0(V)MhUiFfB5 zh_yI%M@#?s#T`D^;`gs_k=21_Py?#z@4I3ju<^k6vq{TYzcNAl#MU$ZNhg&oaN-J0 z5w5CzUWa+xqGVys^4%U^*8W2aG+7?U>((I7eRzejSv>c3qfo=8n>l%yC+n`efpfgI z^2T#m?_jR@Yu~<(bTMdB3EZM?9NDz>guF)Cg*@7~hTliL@_B0qcj|X0)~cL5#r%zR zd3CXB&%4c642ZolR`k@tvpo~{mZ;ego!FrFQ7E4X{uE)RFDixiA-=18hX&~kvEWi zo^Yz^zfDo^2po=(SPT+xoU*Eu%QQu2R$Amn9{}DZR?~ zzf%5ebfaX&Y4%aR7)hUX=w7=9g>`~^v~4)<``W%C-*s&;{1--d>mTQ5k>S|&Y&v6T z+%&IWNPP`8h%w`f|An!1Mou6ZkK*w@3Orxf?=^dsgipoDK1Pt0oQp-uu_a|ZVrR$`d`drq14Yrb%+c<-8A z2?~5d$62-xsNXWs3%T^-tJmOpZ^dY6WM`A1J-Bhwvdmqwl{Q)PhMB~LljO>(xOvcU zrwr-Q3ZgZh?Ons61$y>MaVM;+wUms~#a(n_$V5fa5Lh-HjK$f!9s3bgpn2|?(zIS4 z;5p`qw``EanWXeCdqO9#?B$?~)BQYZr?5F^5QaJBz-!1j%xe(pUx4b-DwPPi3*2Y| zq8^4+yr|Ub?5}Nd+p(=!qsYC;dS;-Vl}tdK1t_=1(3V&(B99I;dIbG1KG~|?6EYz| zIkZC8lkuut)wHR9{t6Adnmyaj2abTUPKG?K53IYQ6Tzl;X({H)tnYP^){!y#lk74h=mZ}(FJyYjgpPl@h&$$eS9Wob z^%h_0Nd~M1GZ7KqIegUlUXn>2_sHV6@tA8p%4Kz<;KGy^KCdCcr0!It%X&?}MHD`i zqq>a=d z3{<;wJame<@vpD(PAKno0Y-K`{>hX(D$wj#5*kqUoUR#?fm+6*o&4*|`CuttTIot! zH}WO8%ICn>k@&O4a)eR23sj}ar{$F+5NqbkjKZg`?3DPR$xhGT?}3qugKSozYz3A( zpU74|8r6P!isd;nj&qwZw*BB;L)|CQ|JYvUIT~M`t?B}|8Tl_6)g-Pz=c}#m=OHLl zq`W^u{oZ-dZAgybb9`wpg91Hg9dSR&61}hOfgYn$(q^O}-``A+EArp>=?1Sa!f_BV zY}=D0rh|A6oH5!}VN7P?$J#+xaZOd8@d9u%#K&`TD{(#TDD|Vl&wwn0t?%qH?%{+k zNq}**%mtKT#%;)qgBy*>9n|G2<}8a~`)8vXNVB@_E#F$16!(*)qv~oIdKo|6U%m7`jg8`@vs_SqRu}bu|TJ0t{-?1H_}Bs#|4++ z>9*!00#hYZ#NRsZ9bLo65B&h?9x2vN^S4*@C5ot&@%>v?ua5gr2%14sO-9gtYB0HU z*`s)kj+-C#ZJ4P>P?sC;Q;)X7JS|LnoKVco*rY&bh9It-bQ}>}MmhC4NO(vm+H2|v zLqx^1WL2OjdHm9)i`)# z=?47-F??pdw3Mh{K0>C>n2ybvw$?f9I58=vUZzu@i4ppRa@-E%p86&8pa(!lnRmW6 zRmi%LdVh#%ig-kXvTsS&_#4*H8`G=0zApb9ah7q+JL54(ZLw;1(W8gx$%wXib`Jcx zMBc|vWxdH<@WzCrt?dbIbG$iDaDK}{>~FvAP|g%FRzNHjnT4(;R~1IWHH^r9-dE^i z>pwk4JD_+E5>^%SM~G6LW05Qzldxk0@WPbe%vMKeln@UTSp|AB#zoM6Qj;OsyTgbZ zsm!7cMQaUb)khcaSlWAq10n`LE_?JM!hOjo#_xq-XDl=FXf7XNTy_eR2>6@%(U1)8 z(%eK>Z#g=$4qTjP7{)Si0zfq<%E}B*RiqUFC}R%de6JnM47Ed^Z4O#(lPq(h6-Uwv zuIw{;G>6Vppq4)7*~TokS5fk{EjF-Mz3*~juwhyfWRNTK=#+quM6-GDuQh1}VzfJ1 zsGVq2;s(cs+nT3&#=uMf(BmDPsk<(KV;}5}q?1GPxKNiP%#4f(kZb+P*0GlR zWGW(TE+99`ObhmcTR0wB-@&|jxa~zG3IkI1gHtmkmprl~SGPF|R)In96r&kxGJKWD zz>>WlK82(($m@9g1Mj1!j)z44*hPrfP}6Xm#84L{>J%F@9R?3#!_i~_#y~wIlM*2n zk*N_dN7CZJ>SZJalYC7@qNzwn<$2!F5`~zUdKEy?(C=h~B(7KN#>K7zcLW=L;R=Ew zMigFIj8+0hGK3Qc3035|DfN%4h&h2k9h(%0{-2ZmnTM8n0FWqp5rU2sh<7SNq8z5n zKwb0$(PHE{naBZlTR@1a1mP?eL4EWBNhQEWxqm@f*<3->pT{!Lp!8010MrBT{7ueHk*BZTKwV z5WEWpcLq1e;qY;uO1*HKB<3)N1*z*A{%j;ew#8dTMJv#9CE-1p_>Mz*&IAb@7_9)W zLxbzdk>`+x8<2fma6uh_32<_PzO;C1oJNgi<@ z8|l;yR4EDcPsB+TE(UVwPJtg~giVk!%_cQ+ydfd|mvY5>GU20=bdinx9Yg%UL)eSq zLGQyA&T*^53Y8)UkY7&z|DR*#c8Fn#bsED`UX4EDqi2Y2^>L=l@ zyyg3Bt;lR|&Zk{3eC-=*Eqs1ZIkjLCdy%|*vziuDHwP|P(j1fxm)0B%QQz73@BnI! z92E_qyd?(a47m1FaKq{Y1=16w5!aONeV8Bn_IaMjZG!>?2Ml=i^bvUBcW|?(ZpEkA zEj&ctw%WYIFH)0J>_xMS~x7r}640DkzpqLjsqIWjeP$x5mcK~C(T9~OOL)jXb(6h<@ zLseusd0|h_y?@rG zRswZgQVScsF$Au~fH|o0dc~vJlVDzWz%rGI|B3N;9z(u+-5M~UdFEfYAL+;|?N5sTAC9z3fmDF-PF17|@qe*k5 z1~%G^-Qt>#!pXqTV!XTCHJdvv_A=>M^ohd%RX4|6O`8xI`4+#k-2)OCIW+om=ncV_LyKW#R!l zV`DlrM~V~&9CBn`Y6M^Ha?hZZZ&!Qj?$q#mr-@qZinQgHTk{w;Dg@9}tv^3#e``D# z)`ke7As;xR{mBSzuF0?1roV+vcM2fNJ;e!$u*nwfOFPt1V-G2DtK^3!OHjiLLHL7R zy2c$5``zhASbsS}oP$~pAW*#BLvqlMfhbf}>KE>IT@G_&ihQ&YYL4Wh7~#eMj*>4` zk!v?W$E+biFAeT5zC_ldnX}<8G9*)y?Jq%in;~3Ox0Xwg0bGO|fPmT_;Pp8CwnR5J zELe$~RAOGL>tQFfufCHL5+$CSeHQ7G0Te@!$q0RofP#J;5DNphW@u^8rla8b*4eH`1)(j!0d$Pb?XsPlI`@fwh$9 zJxjOhPV0ld3g|aL$}(mEjrt5gz{Te%VS4iFF&@HSe)1I`h)`j7@!+x;gpxzt4izmxUGl(= z0Sa(sBaHT&be02GlY#Rb5<-fG8W-H(4;&cmTcD<$HB1?eZj32;O#d!6_Ka;=hU?T$_rqkWWne#fu?u=DwQwD4&6zjac`^=4NNwjT4?7=zeq!cC%fI z{riLU9C;2wYqjg5@f6P1MdPNW)2WXaj<4fH5v*c4ssQ)nCe93QmLxL&M5DtYg%hk;cTrC+YixyeL{SmV5WRU*SNYx&go}RozM71Ux&hRe z%yB(>q zThISaK{cr4tbjZ<8xzu})M>hzKl4`2J}`zxEBD2Dy0X*^c(kPFz<1Ksc=z`K)1{09 zevS*@hol!XXP!QPcP9$NpMGok)t(^_3haz9bZ0sDMcqTAPPCN_c|j`6n^GteeH^7?J%yDcK$99fw(VrC&` zSV64*M`}}U)@37PwB$)L@h*e(f!xT+<8C|C;5kp_?`B& zr`*Wtr~6UpFQ`OrKnVwk>St2IsC<_{wSkWg776vl`z*^?4W12nK0PTlq->uwN7!5q~L zk9^RJA-^Aub4p+ zlMr`oYu+D=xZmS9q3xx$PQaI1waedBJ0$gEP!U4^vohBCO)F!4Sx(l{4O6|}**Z~V zH{Yr+UuGCpqPx3CKDzz7G#0d@@5=h3Z+-3?9tX5ac*TbKw3GUg6uJnGB`f(jLum5f zOUws^6tD0KktTa=S*@mZJIm4^m54GH^%c|INe|5@$^{z-| zQNp7j8mltvVQQJ_4pCcoX?1Gsxa3K+^O~r(alw*r#Q}`ak^yG)((uOcAQt09`0912 zl);?m9XVzO3cJ!bT|s`n}4uJx{OwxUofT2Js*c`Hqz_%yG2v4gq`K zb=gz@v;{`^T@hOP-nISWjMr_tBe8ETf0HS86n&Chv-5YOCMn7TFKvjMK=$nA2cpcN zv7^;K!OY+Df*rfej_c@lnVCJH_1Tv<9z6&86Wq4!{Dt4;bl~HPLH}XbbvY|B zCICM-oP3aSA<67|!L1!pkD50fEC->+JgZzzbiv}+tN?}pQ5T7b*0lagQE3t;Xe*B& z-GwFsaKadrZS+gYXB-!3w8~NLD<2DOc<|#YMN}xA9}qznQaEWyy%;7Ku58PJPd8VX zcfpxT#H8%J_W~7wG*`f>8Hq?6$aT>J_@EzvbiuZ7>`I zKr)pkyXsSrRG^W-EL?rdEow1?CQ$1cj>!LNZmV>L0^0XvXosd*6d1-rUr`+?j_g8P zwx5i?-y+a8jwfu8vGC!$nfV=wbU$`Wa0sKsvF*e{3__p7T)lKk z(H8H=$G<0omdbbBms0?Fng$+-%mUYrAe8tAWs7uJ>$!v0!4qk)^{O6fsEV@TeyO#A zD4tYe)oVJz>~r+$Lzn|SrV>fa+NDsPiHSypnl4-h1nXX6``gjF_&}J>jdh7F#NmTO z2FgjiY$Cw@m=rLY0P>t-d>L*J3CZm&nCqtF&LpkDDp~fe`kYCdWab+qstD=i;pZM+ zBh=E~vi%gQIs&5>i(O5W#+22a=bI3!&e1%y678s@M@M;(tpVXZI$_y@i)G>4>9h-i!e)iYNz>u_R z*xD5IvM+6zTA?4vQbs*DLig}7~6`mVV)$;Q~KYEk;Hsbj{P5h(LeP~@`A@>v zfI=CB%(WZH&#cg)$M04*0WT>W*jyx;PxD(~k|P0d4259XRoZ7e*|{fVC%{$GNF3Sh zqMb3dC$aan?xWV*UdCOBu&U+Eoj$OYu{=IGs3zQb#0b}14#UUjn`y`J05NYcW6{ki z{rve>(y;1C^={WiOq`A_IVUOM2ApI0srm=4V%4mf>FxY<**fv}fnxQs;^czAPrkQ@ zg`EAH89Kh?aHIWwBcS;ErUPyc{~NON8*G=1c;Uyuyh7ne-u7v%2Q zr6Nrm@#U`_x|R)X(3SQCp_$MSxl%C$7y2QCc&Jng$~_;Q%;ss!U|LKdm;wf~0ceDX zUV$=J02V3%?u-CGD_B5tq<9K!JP`Ou9zsSnM`+X-!i-zt?)^+-2oIj;X?Y;U+SfGa zL5EhjmiDFH>4e50o;gOqVwZ-c2uv^t^K!oROi5S}^fBDRieK-6fztrXKV>HKe3A;# zo$s=sh*H``v>+%GC^*x6Aq*oh2@(`r@zvTXr%nwn^?wK3TDdXMMlD@P-kTjd=XEuYz4xyo$Qq;u#OSfixG@`IN1XOj_?>Mh{Z05 z8)h&ZbCCrT?j}aKl*5dIyt0lCS=?Z{`G%**3Estn(U>SUfLa|R z@?oPQCIqtxbGHU$tOOOwMjjAjAbvYojEZaxUKb=B2*NXIs5Px5XI}YZGJkNJ+AyG*Ti!r~va3Wa>nz@Hxssb=6H< zLqy@5dWe!~Wt(Yb8bdIGm}PhjI&Y%mFo&s^Y@SZ+cHUh&*g2Ge0T0^poc|y<%!3&z zA`0`Y-U!tDSTfjzUNaBo=pZ(=4^@?;@7AGcF+Ar^WI}&wDj8WnJGj@Jq-NUkm&i+@ z!9@-a?L3bmO~5`rFWbQYS6T`5F??rdFa`5J>o;Bw*WD!k$%H;M>IInBii`_6WvDF48v%19=oWnn zR6IkgvTZ@7Tv^%nd6csXrrY`;!gkdbs}eI0jlDrUR{M>s;T7>Z!lV>%M@(6ID0M#b=ly$c>(TOt=)~XqM%ax8ptOXrZPfvMoQI9$AX-)_;@j&)qihCYuN_*rPQL5 zJSLjk4i*96(g|m!&ZF?@E6Y?!w-LVSJnV-MBEI3PRHAEA6tf*3k&m=g^zMB_q%;VN zff648$xbQp=kS;Kp;phAElWYJDo1(sS3$P#Y9*2xBw{mB&gJF*BKFl90!R-;Dubz+ zuUYHFLrm}j>X4Zuq6Jp4%VWr3acMFQ0&`1!q4i^lXtVfr9Ly(OBFJOhYlpvjZDt4+i!wxtnlnqf;gqA)gktpvGTCGw=e5fZ0O0D6f+_~;7~ z&jkKNmZmC8mdi>qC@A%6mVh<#G)0CAkRjP(p%%k=1G_XYF&kfm~9ytkpqNaM!h$Qwu?&~yDk=y!R0g*^~M$3 zKVXqZS)5Fiq$o>gz)Wc{3o>ebOcH3C zP{wWd9-JQ}ZoHS$4|0K$6%FVjGTJEy00HzedsJ9Iq&Jtyzg{yx3#I@(v-y)9pZMym zelUp)fq~FrhA`>pX{D6rsnADOf;;+4&=99Q4?*|nP=+WyzbsP*-!goth*BEJEX~7! zPUPOwT5ZUihYo3oI>?fhWm*Y&XHbWil(JGvix{BL?oR#p4J!u#+(hK+d`1KtX{X|S z`2=if*F$ff!w@zH@+A2u!Sf2g@2>{GYuCO+o z=PDL00HU@3U=E*x$I(D{003GA92&UP12CQk#m_Nn$6TRPeplgTvnTDEAccqYxVW6g zgF){ex%}s|s0|GQ7{_zdJj#m0BeaW(*--ZoFKoWdQ3c={-dL2Q1KKxY^52RVmYM^J zOW38+Y=Pd0E#&O0R}zld@K@!75fT6$0}LH1apC}uBN%!<4;T?1c12*tZwuujAcnWZ zsw^97OauhFtKXrRyz~apU&a5o#NY%cfDt2*Z^MQnOLG)Rrv|}d|FW)#SC{SKNQtPx zN@2_va!lR>DWV)Q=p=uh(~887U^Xk9^%$DWBzTSzjUxL&oeaq1Xge$N@)T$W20a%+ zY7pp)0T68AHU{W_aF<%)T4Pd<-t%$4IVNc-nP=T!n!)r&kP+F8vg_Ahuv*I^V=f9I zn}>od5|?NP*@i2?buxiH3%#BOM{0@+M@lUjd=nZPGCi^RfL6aKjtlo#*cStNK@bxE zg!H(TXQC=83=#oWfME(ck1Ik+))!IGSPG9IDJ>G;OEPw6J*m@s0_G4jKCjLQmo=bl@2j%*Oqi)ltg$Pg9uX!&EzKL zGUUqg_{S61@UnQ$YCyBR%|OP(d%!QRKpA-Ol6IiYqXrj zx+id*WIU27STBQ?A3*yMa@~mo!+3niq`WtQu6ZLE%ztRx zH5ZGU1X;4t6>G>(Em<|HF|Dm0DrwtoQ zvz3UlMNm;qB?0R4*(Ne>;A;mxTxj3+Cl`o(FLIE;41+|u9uW7giL`?CVeW5{lwLo2 zB`?2ZY5`m~#yQEjB(MLy-xd-2NLp&ML08-yjMfAI}BuedOst0yBpufT3^ zbI3~9Z`Y)#csi6lTCJj(b^)};$c_=+nEd>oo*-_ND60?zN=jlRB`1cEb|dAtqwWblSfR?R394_vILnNd@{h5TedJfa&FnBO%znRZuI)e71BsgxrrV1soMuw<^%7 z9?MH`ldRw6;}*<<`+R7b;eD>qI3>ErC0d=O9Gv-XS-*{t;RTf#Ifrlqquy*>PutRX z5yg=RAnGZM23hCNiYcNWp|G^3Z@-8pJAevxd{ZdTQp?*pXQl2WCt>MhLX~4>`Pk3AiChnkEx2mf+@p>Rk2pc z1dpxQ^0QmqN}QBiO&t`7yIEe0|Md{0FtZTsEDLoRY=WOOQf~F%!>s_g^F6=sF(SYc zL7JGhBV{|PpiA|2RD&RO9_{}-tYY&FXDQSm!-ruIOXaW*TQKkJ_i4;MDI%uklrsN>;NCzBZxA_=3PMW zQtynl0Y(%3y6Z|Ja(K})Ft)5S;UM*hr5f+UQtrehbs|O0FGk~$+Snz-SxX(Hmvko7dGE;qTnNGYP%BHp%L0I0{)WnTfE$AU611`Q5-6j|j(O-7x9v2|HJ5yw;wgmsN z*4*UbbD6*0CdWGRX59LDrDyZ5G5$V7v?}yX>eL@?W~!09_PaA(cIj2GBH~#s*WL_E zz{}f4sCDG;=OQ(!?vbs4!EY3&)j5vV3bUhHXbT=@4n9agZ~EB~F3PGLJ36?`!lj1j zk~q)d8NSQ#4TLTEBiysaHSS_4E%O=FixE-RLs;uydF8hEZSgoCCI|{Dg(c(*2~me$$eMuwEcd5^>)_T+Rw!@~EMv2V>B$x@~*+%*Oj}Q4^j6-rXEHrn$JG z%NKv~thmAH1LubnWL#?tgTTY(pusMCU5xrzgRgF@=m16as$*=*l1u2>#`esn?COQ8`pf2UGd6w`0QFP{UG3|dCKj+N8 zPc`k^G%ecHlu8?&X;;ZqA|$6pLKq22bf#VFND{)7q6i})#68od5<@7(-{`$s2-5ofCwlzye|c6-%voqK1XM_p*U)l6ve5g>&pzeQ_7aq?fU_E*{WAS z=koYh@Q6?I>_qQ8lYcOio^6dGb3xVa?>#ugMo;=wn`?1JPg^z2r#g*A2KM`8XDDzq zN|VN2Zg@;)E}=o=D~(|WOAR!+?Zkg}w{5uT`uDZ9LSM(3?MDRZ3rCgrxj$zUdbaI; z>Vzi?VhW9ki~QdOgFhZm1T&eb+>oY)S^dX%U+nqWne`ov3g7GM62-DI0{Vg%UStP9 zS4`@6@3D&bcRoXRCpQg}1`B6EIqu^Ui4A`$qOyn?^xgYE@g^KqN1 z5}7*|w&^~s(Eld9=drj4edn{O9yfT5`+}d#3}3tAz7yAddoB)-4(wyvW~hA<3upM4 z-B(F{E_2g$zr|(dFo}m#1$%$&!+WvMP*`95ukbj6)!TP1)jGA6dFvtutrB+Y@?EXM z%M?*xkpPX_FPh&LurgQw%O(3+cWPA1^4gw66H!T#Fv$#WG78QK6XbD#I<0+toz^M> zb&mI^6>aBhUbe9k7Xyt=L7&lW7 z^U*{~RO@A9c()pHT$Q|t!Btr5Am|1ZH8`{4gX@ZUX3hsz7-ABbSe0?xkq;QJ5Sg=Y zX!?1y#uIhuF#CIZfqoeG>ieWQlxJf&GAbc8~JW)xg1% z`W^}~Zdh5KoJC3fHI&D+W!K$*A_Y#K6lxw3GZl}y-sKtP1S18YA@;*n|89g0UBo(0 zQ#AG{$e$K4e2VJy|K;B-x!=gBaz`fa?)4QqgIPdFy% zFxTgEE^}Tr^^X*4m3NP+db)zywZ9;rxPEH z5m%s{Y&Am2o)ZCT1L7F>u#wh01Xuk0okl~Gzri16g)py^a{qz7ZGuKgAepC=UL>a* z4gC|;ut>X3Qc60T1L?PbIBWtW=Ws$GW zCcZC7j-uHj+=EyjgoA#w)@F@sUMV6v+A1JJ&Rn_5=#;rR>=iN@tX3PV;Gne5VK@&@yzS@1obN2lwwE3E_O9>M8PgL)l6uh)pY zG|?!rXLoR6v9sjHCP^JctAY4x!E^^=Zq$88-k;@yi)*uY4L0Ec_~a+ zK6FkWG}rIf3v|$9H>5txHSoDt=yAmZ6||f*9<&Z{9C$F{^#IUw3?MqnwkG`_R=$XR z<(zn$VOM)Mg2x5S-(4)<$n7%x7g4$3@HeR5`pcHi54P8Ajjw21SuAqjJHKOM?iP(e zgkUk+X|YsL65c&_(VyJITZ-jJiN^2}AfKH%W1^joQ1%J)?S0KwMX9Zq7sU58i{Ko$ z$?>a4)jSYi0WBJa?h#w=(1j>IX7r??!>3;N-my|vmO^s^{pEwaV2Bik)103OCmTQ}Nay&uuX%G1+Wz83qav(WZ<}1`GkNEs2IIYfPtUj2TqJ%^pq( z;>HM}#DBWD|BeVcWVh1Pw^ZbrlR<+ zO{ira?)NS~OB8EvE8`}0{d$}0RU>A)16uZLywE7xDDae$Gk>&eVMdo@JI*~gkjRzW zHQ;`K*E5{~{AQxPrg4b^`Jv%Jpb|Av!(~Tvz1nkr)@VCU;q17kcP@4w;@^cjRGq|! zFBu(yuL9~g;b!Ww6eA10DY(s?hR>WUq?TgLjvk+Bj1Ft)+Qz1`nUvIcItJ6HvGZ^| zF&2*leC=!G-~EH;?E#F&d-{L%QL8WwKB%=6)LbgiRshTtlxPGp@@Sey0ySedCIzMl zD?6=u3}HRQ2PpJ<3lq@lPvMg%0s0S(c$PfNi}^$e%B$93wV{x8J(R?LvcPyt2OhM5 zp<$R(h0&WZhqO9c>?$>2n%ag3+3NBNjF<{gvH&U^K?nLBe$>;aVIl_1E2vXvzhA0* z9kTXK_5^4jH{TR{oSL+hGK6ZfQEY5fi|cgYbRQrdUE;O3H&jAm&*C)HOwZ^^qVlAA#|T%;@$RrdN6bR|m~8Q) zm6HJj|0jg%xPx?WZ8rT$sLO$eO}8DL0GuAIC(WHN5$LPynDnJocYv*cHC&1#DuXD1 zSWwX0+zwEZI1If>Eq8D>WjM-UlHCTU0F*_Va?L)JPM5Qj*k09`CLm@{qmBH$)2W!3 z+a1OTF&(g2$`sJEs*X1`u$DHiC@2X3a%aVv+gdtYPY0_+x7TEO;q?}jEQLSj`={+% zvG!iT(iVUU1eWQm^5}zd<5}^>t-cz_7%tF%bJir-W`%2ettJHH`(ERXu#GQXgQcjt z!trjvZBoNMd>H0~)RDVi%ZaxnlrJ?kUs_qV$^b}qttt)FR4jQ~2 z6mI4G$B!m_?bCvNjftmcHKd;@$%?I{Nr5ci*YwgkOS4Xrv;2Efl9N5HvLRyD6)dBA z&Imq^+5n)wJsaEM%kIaLo??{2+szznG%}g{gkU8gpl;OYB8*amCY*uAKZ0pedKO@v zo5>-$9D7uUI?3lyrD4>tiR^Cctm6Zeu!$h+CK}pAP-8M@)!wQury79Oespy^95kyM z^O<==MXk}_!SvwQNh3|Pw!A!IlOQ&(g4Hcr4{uJIg zhEX~SN?Mx|Y^Rbcjk90a9Dn`xEPQ|6_2Q)#O|);#97&EnXM=SOSauFu`u@58b;dO2SHJQNL%%+Bfu~_$Gf~nVJ3-bl<*6n=}7}|twzc=-nGexU19&cz4 z!atlmM@8E3oY&SL*S_uF(|_)Yzy1cR3n7GW?DzfAO|o~*iJ7PB1Fc4y5<|HumkjJK zoJqX+@$|>&uvnvT?yEC`cEf#Xc1g_lv~TO%m)VG;&sN68k*WaaT2r6tE>{cH?Zn2D zm1pdBr#}fJ*agpSxb@|1$LQNi;=5YUjfX&6sX^Y=dj&0f{m+=NF6H>2-*I@q?b)6< z``+TA9p#unQ_R+rf3=?;QKalzHxBhs4)9QWykq!N~?EM_(46b}peg^nI@HSPT zD*|o_K)#cQIcW3gGH6I;6^U!vqP59i+P397%1xbW0 zKGytr@7&RXbEB^VAC-UTc>d~6cw?un)dijMC+`YkE#8wJ*j|YoYaT2_|4je$aqi0> zn|iCyy!^hr`*KX(6Zgoh` z{74OhK@PU(W8j#BLx)o=h=&0(K)@ddeNkYxt6TZ;?^~PK_MHFtaP!9<7k=*D(vpWV zW2Y-hF;J~PreNRg9b~ra@{gF4A8XOc)1kGF0a;0LZ&Z` zA0J*ROXl&<#9SC~c=tKSQD@!O;|?HKubY>#)u8l3&mS^H2->Sj_$|PTD|4VXb7uES zW*>ec*UBAII>9MeRynmJ?R1boVD6vm@l0HAAnS+`(P98CA>?TP#k>f{hw`69is+$V z2rn^!FE}dpbDr#6Uci4;dctQom$5KlLJjqr7C0j~*H|?<9u4c+thr?Dl^o@G=MXaS z`<`wbn|yb9S&z1(!xJ*(EX=jC>(sd2`nSV|vV9wqeYftma(esQnf>0DvGJnony(#; ztk?i#oz!W8Ry*Kx7%h3No7Yl;edkZ-K-|w~_nO^ZkG6QKKAUX3>$Q6+UE%as>T27z z9{NyiOG4!t8A)ORnuq0Z0NtgjLyH|g9#RwUhmSd1gueNh+Brc(O~l`KMkHa zbmQo)z1`iuQyV*a-K}MU{P6X-5u<);^nSC!7dE+cS z1NQ8|aAY8HK0v0o4(?@>T-01}6bPnA4*=N=Re;7IKqAAq6x93vw$1!n^@9zt)z6!W zcr^hJqaYauMZi**Ho}zHxztxHOwO^ElaLKy#}xqwAkwD;@1zF3%x9o&{sf3Hd;97# zfJQ>`LhR?#wD@ycj%x9A7}Up0(seQ1Z0^?r?0n_4k9t4Xca$0o19}*Dw97tb2T%iu zo6&Ele&SkwUVZ&Dhyw?81ZFt?_?CcK?y(blT_|FNPkrz7Qg#~72#jXG_ou^P*p_Om z%jB?683*Qvs+U3%jAPH>mXiDOJBPwDF{>C~MBV)Kr0v;1uk`T3R>%6c2$ZxBB$_oyKE zY+2iXbl6bg>FDpP;f~PQsL5=nd03~9g&!|Qz>EPXVW1;m~!njy~o`HF-fE;JL?C_n1UVx^W3eV|u$a0*P-G~ z$2~8H@l=Cbi*u4BpXl!2)WbapKq)Odf%CQMt_G)Izw`)s;zUAAZGzc)zsCeW<)Y`w z69AbEI;3}5(PNIjAtLTr;tb?eg>y|8kla_7F7|W$204Y{98m#o>3Rq+=cWfzti_so za`AW6IV^XsGVJOW@UqKbkbmy{*)F|W_fvkKS9b%!QCWepm)n|?W%G=e!_jq z21!MxjG6;pOLMfcK+ZI*o}V;ms1~R>{7u^M>^6Smb05+0pXa#Sx1oLOKgkZSBAtJ7 zJzM3_G1R_wqEyRp;b&YSW7W;f>&2t8&-Xh64yjy{`(&hlZtVQ|?bz9+3cNb6+9CeB zjJ4W^ZM(E%>Gi7hQKy&G1s?P~xFP!N@{7rjuOC!xTz+AVyg>VXnt8EiPE!6C^Sqw2 zY?t2NMo+)OTod{A4*KTs7qkhD)U)H`Cm=0R53 zyB=C(Nwy%%MoZlw-9{LAZRd@fv;JZ1C>*`r2lJ8kg3jQhFd)uYIT z_L3uR=bn3Q8^*2$9w3p2CXCbn)cG+IzBu)eOuMb$oDkwaThwN|)GcvniCGn&|Ko@7 zC)` z(>gsYHA7n;1Rc;xo=GxDeRyq-wMZJ#jcQsu6=?}F*55X=a|q!bOV1ngD_!~RS3X(q z$f9)>{zG-I?`FoVm*#)koMI*pO|!LNENE>mtf+FRH#>SL#t$VT595Z-=2)$Sdt$=Wb{90c<=af=o`?lsn1n(PtCF^?c z3P4i?*mCmm$~$VSoTidcV{6gA34D^OdMigk>Ayh~Vz;cPdMe9?sTcgm4DeiKgkTA4 zGk1;W;A<1)#NCVbjx`%5=t&EchUDFOI*~XI;UuO&$I@HQCUw zIRHs=_;#aq*F|0-SlM*D)*9hj9i7{te60)lH?PwH(t+W8!S@IGIc(yL#fcTQ3UOm& zf=KXi!H*h+lF|OFpu)&ob@R4X0|~G?5t8aY_i@X$PcQ!cBxkM3igxuhE68q`DXfCC z5TGbqWc<>0(U;(mLP^FyoK}KJ&%&A00gOiT156*PiZ`)fg!ZvqI^cM44vze zqtiO$KkthZ{lP($xTvPU%Xuu%5soL(YkcPo2nw^401M=fm~cwQ+{_V|y9D<-qHs=f zmN`9AL3DIu--vWkUvervk@(%qRLKQP`-1FSxZZgC9>0tBa+9TICCina#;+APmYc97 z%ReXAkUMN%EX3=U!h0Fpr~J$eBKGB2;^(Fahz?M3$ZXdhtupF=IwJL$?fvJGr`yo8RL0t#dpbn|l1UXv^@tS;;>LXpk zI#tIinLTOrL-y2%`s=1&vRY*Zj+!T;RbcxLa*u`?b})c>7T=@irDV2re9|ZJ^p|>*%?KbFQnXFFr-nQ z_N?oK2YKpyngS=8%GDaK1^pHnBxqFBbXyiYW-p5bEnMm~!`sPoOvc7bN(I{HadV*& zX_?wtiL)Pt4b!J}abzhzj@xZj`=HD(>Ff?yMkrBFuN27;#A${d>hL~LY-^O@;u(NY ztBbW+&FapaB#5+3l0%5i(~ZC|+NQc_w&eEN2V8%A0+I{=car#LZ;!g0~Iz2NECE?K2ux_}OwX?mO`lUK>Er za0e;DeCqD1B1-T~w->%yyhwHDK2)64V1A&I6EZlVozC|=SI5U2lg}I|lwx!yB}WIp zoZVEr?K6J}jH=+7_6zg$H;DGd7MJ7o`4wIqr=Z|JiPW*^*FJ;q!%|x3*BOWeWMA0- zS8F`&{6Co8JEwa-jl{KoHW`4{X2=HS5}T{)#*~2wj^_|+HI?xq-z-8HH+Zt^Z1}l- z0+Y1;6|s}4K!DMo2yr%FuBqa89SHH* zF>)(j$HilCjaa_8r_q60`+h+C8~rg$oNLq#3_gE2Kot&&2{qS1J>gfMWmC!S8?{SU z|M$*g=bogR@2!Zi9q}w|~jF3iNopF<-5{pEpcjOs>?13N>%ouGP51XU=`MRW+uH@Q?F>dgSZ0{X zgBL#lKE-t>UbttzAQmBdcS90{+9`e7E@n(Ap2ybH;XzAI$wi}$!)n3YTiW_GUf1~! zxZ>pBMPtSZV&(>fbt>Kz{}xC_vSQ3}!3g_>Sbqkf_hQs60Iaq!ek#R>ks6QzJurSIrw^CB zs1i1Rn`<_gRx{&DyQN%$Lnr4{ptg?O2Cg%)+}NEA<3rTb3tz*AI>R>5 zg~`R;lj^mN>8o3-{97GYqHjAK?0J5mK}u86JN??SdF`oMlLWvTrz?_@t3_7LyvQF| ze5#p2{a6bMGFv6O?NZu*uc-91XLsb$S^GW~)#-{9>MCV2 z0|e@%At%S6-YmrS0BNL{xYy=+DwntnDd|QGJ_@cs1&zby_$(A4=NOJtWG=jR8EAY3 zpbv_5Ljc9I3)UXv5)sMhW2>>6D6B^~Sp#XDXX&X2Dp%sw-I&JD#&&IhrS5W%`B)%3 z4bS;v2D-om7kCYZi$rLe;Bx0V_}Fph)#IB&1_|nnwVsrO)LE7YH1RN=$^lOyTE%si z@ndwR!gO%o16A)h&T45+gT3~!rr*Y;R+@2=5KZJei1~T=PMt@+-rme8{j(Gj*Nd$p(xDXGu@m82xD0tymcY+np3dZSS z*?B%y{S_)P2fH0VJ6s4z6A;yV5C%l z7|6v@6{dVd6!D4RW|xKo)|20^oTrYV0XuIV#8VN!MY@o)BF%LD>Mh)3A$6M`2i`aF z^WF@ku}%YAWcwbqy<_K2wR_PX>ElaxYh8(dFn`Zu-N`e{Czm03e++hn2$ip)dwsOpHTXKr5_!%0AtMy8Bh>m?routXci85A#``Mp)-!k^H#rtqx47Wz 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

ZSFzb?*sWg3u4}j2VX%4g2GuCy9Vb71euerm0L{ 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 RH}F4e^{+Mh|9Fiq{$DWy%{Bl4 From d9df6bcc1c54c6ff5d0e9953553dc640a25a0cc9 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 15:24:41 -0600 Subject: [PATCH 147/151] docs: add CONTRIBUTING and CODE_OF_CONDUCT --- CODE_OF_CONDUCT.md | 132 +++++++++++++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 107 ++++++++++++++++++++++++++++++++++++ 2 files changed, 239 insertions(+) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..4938ce1 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +velazco.joseh@gmail.com. All complaints will be reviewed and investigated +promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..db05028 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,107 @@ +# Contributing + +First of all, thank you so much for taking the time to contribute to THOTH! 𓁟 + +## Guidelines + +The following is a set of guidelines for contributing to this repository. They are +guidelines, not strict rules, so use your best judgment, and feel free to propose changes +to this document in a pull request. + +## Development setup + +Thoth is a Rust project. You will need a [Rust toolchain](https://rustup.rs) (stable) and a +C compiler, since the bundled SQLite is built from source. + +```sh +git clone https://github.com/JoseVelazcoH/Thoth.git +cd Thoth +cargo build # build +cargo test # run the test suite +cargo run -- --help # run the tth binary +``` + +To dogfood your changes in a real shell, install the binary and enable the shell +integration: + +```sh +cargo install --path . # installs `tth` into ~/.cargo/bin +tth install # adds the eval line to your shell rc +exec $SHELL # reload your shell (or open a new terminal) +``` + +The codebase lives under `src/` (the library plus the `tth` binary), with integration +tests in `tests/`. + +## Issues + +Before opening an issue, please search the existing issues (open and closed) to make sure +the feature or bug you want to propose does not already exist. + +### Bugs + +A bug report must include the following: + +1. The version you are running (`tth --version`). +2. Exact steps to reproduce the bug. +3. A proposed fix or a hypothesis about the cause. + +### Features + +Feature issues are split into two kinds: **UI** and **Code**. + +#### UI + +UI issues are specific improvements to the user experience. The proposal must include at +least: + +1. The section you want to improve or add. +2. An image or mockup of the result you want to reach. + +#### Code + +Code issues are improvements to the codebase itself, whether for better component handling +or structure. The proposal must include at least: + +1. The section you want to improve or add. +2. A proposed solution. + +## Pull Requests + +To contribute, take one of the open issues in the repository. Anything tagged `type:bug`, +`good-first-issue`, or `help-wanted` would be fantastic. To claim an issue, leave a comment +asking for it and a maintainer will assign it to you. + +Open your pull request against the `develop` branch (not `main`), and link the issue it +resolves. + +### Quality bar + +Thoth follows test-driven development: add or update tests alongside your change. Before you +submit, make sure the checks below pass locally, since the same ones are enforced on review: + +```sh +cargo test +cargo clippy --tests -- -D warnings +cargo fmt --check +``` + +Production code avoids `.unwrap()` and `.expect()`: use the `ThothError` type and propagate +errors with `?`. Those calls are fine in tests. + +### Review cycle + +To speed up the review cycle, you can allow maintainers to push directly to your branch. +This is only done for small fixes. + +### Commits + +Commits must follow the [commit convention](docs/commit-convention.md). If a pull request +does not follow it, it will be rejected and you will be asked to correct the commit history. + +## AI + +We are not at odds with the use of AI. On the contrary, we push for more people to use it +to speed up the production process. That said, using AI correctly matters to us: every +change, and every issue and pull request description, must be tested and understood by a +human. From 51b06627ae1c898b6e0c4bcd37097d2c1269b8c5 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 15:26:34 -0600 Subject: [PATCH 148/151] docs: rewrite README in English, add features guide and demo assets --- README.md | 133 +++++---- assets/demo.gif | Bin 0 -> 789040 bytes assets/thoth_dark.svg | 601 +++++++++++++++++++++++++++++++++++++++++ assets/thoth_light.svg | 109 ++++++++ demo.tape | 2 +- docs/features.md | 169 ++++++++++++ 6 files changed, 953 insertions(+), 61 deletions(-) create mode 100644 assets/demo.gif create mode 100644 assets/thoth_dark.svg create mode 100644 assets/thoth_light.svg create mode 100644 docs/features.md diff --git a/README.md b/README.md index cd37dca..0a38ee3 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,105 @@

- header + + + Thoth +

-## What is Thoth? -Thoth is an intelligent shell history. Instead of a flat list of commands, it records each command together with the context it ran in: the working directory, the inferred project, how long it took, its exit code, and the tags of the active work session. - -Commands are automatically grouped into work sessions and can be searched by project, tag, date, result, and free text. - -The name comes from Thoth, the Egyptian god of writing and memory. The binary is tth. +

+ An intelligent shell history that captures every command with its context and makes it searchable. +

+

+ Release + License + Rust +

-## Status +> [Thoth](https://en.wikipedia.org/wiki/Thoth), the moon god of ancient Egypt and god of +> wisdom, was the scribe and counselor of the sun god Ra. Just as Thoth recorded the memory +> of the universe, this tool inherits his name to become the keeper of your workflow, making +> sure no valuable command is lost to the oblivion of the shell. -Early development. The capture engine is written in Rust and ships as a single static binary (SQLite with full-text search is bundled in). Shell hooks for automatic capture (bash and zsh) and the query commands are in progress. +Inspired by [Atuin](https://github.com/atuinsh/atuin) (highly recommended). Thoth shares the +goal of a smarter shell history and focuses on turning it into something you can act on: +record-and-replay **workspaces**, a themeable vim-style TUI, and a finder-style search. -A Python prototype that validated the original design lives under `prototype/python/`. +

+ +

-## Prompt setup +## Features - +- **Context capture** - every command is saved with its directory, project, exit code, + duration, and active tags. +- **Finder-style search** - an interactive TUI (press `Ctrl-R`) with live multi-field fuzzy + matching, a preview pane, and a `:` cmdline for precise filters + (`project:`, `tag:`, `exit:ok|fail`, `since:`, `until:`, `dur:>30`). +- **Workspaces** - record a window of commands (`tth-sw ` / `tth-ew`) and replay the + whole sequence in order, in your shell. +- **Vim-style modal TUI** - `Esc` for normal mode, `j/k` to move, `d` to delete, `e` to + edit, `?` for help. +- **Themeable** - 7 built-in themes (including the Catppuccin flavors) plus your own, with + quick switching via `tth theme `. +- **Sessions, stats, export, and tags** for organizing and reusing your history. +- **Private by default** - Thoth's own commands and anything matching your history filter + are never recorded, and everything lives in a local SQLite database. -After running `tth install`, the shell hook exports `TTH_PROMPT_TAGS` (e.g. `[work][api]`) and `TTH_ACTIVE_TAGS` (JSON) on every command. To show active tags in your prompt, pick the section for your framework below. +See [docs/features.md](docs/features.md) for a deeper guide to every feature. -### Starship +## Install -Add to `~/.config/starship.toml`: +### Prebuilt binary (recommended) -```toml -[env_var.thoth_tags] -variable = "TTH_PROMPT_TAGS" -format = "[$env_value]($style) " -style = "bold yellow" +```sh +curl --proto '=https' --tlsv1.2 -LsSf \ + https://github.com/JoseVelazcoH/Thoth/releases/latest/download/thoth-installer.sh | sh ``` -**Important:** Starship does not render modules that are not referenced in the top-level `format` string. Add `${env_var.thoth_tags}` to your `format` where you want tags to appear: +### With Cargo -```toml -format = "$git_status ${env_var.thoth_tags}$character" +```sh +cargo install --path . # from a clone; requires a Rust toolchain ``` -### Powerlevel10k +### From source -Add to your `~/.zshrc` after p10k is loaded: - -```zsh -# 1. Define a custom segment function: -prompt_tth_tags() { - p10k segment -t "$TTH_PROMPT_TAGS" -} - -# 2. Add tth_tags to your prompt elements, e.g.: -# POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(... tth_tags) -# or POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(... tth_tags) +```sh +git clone https://github.com/JoseVelazcoH/Thoth.git +cd Thoth +cargo install --path . ``` -See [p10k custom segments](https://github.com/romkatv/powerlevel10k#batteries-included) for details. +### Enable the shell integration -### oh-my-posh +```sh +tth install # adds the eval line to your shell rc (bash or zsh) +exec $SHELL # reload your shell, or open a new terminal +``` -Add a `text` segment to your theme JSON or YAML that reads the env var: +## Quick start -```json -{ - "type": "text", - "template": "{{ .Env.TTH_PROMPT_TAGS }}" -} -``` +- Press **`Ctrl-R`** to open the interactive search. +- **Type** to fuzzy-filter across the command, project, directory, and tags. +- Press **`Esc`** for normal mode, then **`:`** to open the filter cmdline + (e.g. `project:thoth exit:fail`), or **`?`** for help. +- **`Enter`** runs the selected command, **`Tab`** puts it on your prompt to edit. -YAML equivalent: +Record a workspace and replay it later: -```yaml -- type: text - template: "{{ .Env.TTH_PROMPT_TAGS }}" +```sh +tth-sw deploy # start recording into the "deploy" workspace +# ... run your commands ... +tth-ew # stop ``` -See [oh-my-posh text segment docs](https://ohmyposh.dev/docs/segments/system/text). +Then open the TUI, switch to the **Workspaces** tab (`→`), and press `Enter` to replay it. -### Plain PS1 / PROMPT +## Contributing -```zsh -# zsh -PROMPT="${TTH_PROMPT_TAGS} $PROMPT" -``` - -```bash -# bash -PS1="${TTH_PROMPT_TAGS} $PS1" -``` +Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) to get started, and please +follow our [Code of Conduct](CODE_OF_CONDUCT.md). -You can also run `tth prompt --framework ` to print the snippet for your framework, or just `tth prompt` to auto-detect. +## License +Released under the [MIT License](LICENSE). diff --git a/assets/demo.gif b/assets/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ab042de56bf7d8228dd779f07ccc02c0b19648b GIT binary patch literal 789040 zcmWifd05Qd`^P^spV{~Jy{3KIr+wEptgw-gnHx=zzcs0IfoPoA*TPn_~&q z1ey)eIFxAbOty%n=-5;A-6-aERI^Z;ZHkT|Q^&+tSKnICGE86JUf+OWVCZ0A=wx8x zVPJ1&NHH=rayGOKHl({689Evn*&CVp7&*inn>ZSqxSAMQnHW2nn7Npkd74=M8NQ~L zuBLWuGd&A4QztVsS2HtrGjk6!3pWd6dkZrs3v(9>b2keMPYX*IOS=$DCnqa&S1ad* zR_@7kb33|)leL|{jlPMExwEa2g{{|0I};l_2R}RKaJzs~2Rly(doKsaU`KO1M_VsP z_k|2MA4Xt~lXI|>%K|5_M5pjAE_SZ2E`e^&0d5`0~4wP zm#+#AT^byf8N4bkWI0v6PAN>OSeLq{a^>Se1|Z?0UEzLuL= z%FW%HQQ481Rhe0|Ju7!pj^Jz_w=gfaBCoJIuW)l-ktl!rhJv+Q3low5gVnv`kpm*k8U*UcU98%KXyGvaOZ-B~|=GoA$O>H}r09eel;` z4SzMB`0Lmn(Yh+pUpqvtw`vY|*DhJJZL4V8j_z%BZ9C-8>%{%_+glnHipI-w>4Cmo z+oZcL!Of@M?vdYYX};UC|M>n2=s-)?LHW?3o(G3+54G=U>wI?e$f>@rIugBRyif`NGqkBfA*Oy3Blz-Q~Rc#+hUHk8(N|9b9y_`@!F-J%!J2oc;UJN$%iwi@0;gANSismX+~u<7_N5Cm?^GRehY~Me{PJGiv-aif%YEPe(+uvIw_1GV()XFk`+u*wbLH~S zZ`$#jhZbMG^84r9%=?#ju3nv=2QUl`gfh(6@No`ujR4uL5G4AJX_7=PA;!zZq+I!{ z8cZM##05kJWRQ)AIt5rKp8WOp6PLB&+bB_t*KGIOsTuWNrb(~rTouf$I=d6Bc5$GF z1A($6Fq(*pQrk9!?%@dP*e~Y7MU;<>SFA7!%9f-PB!w{aUog1Tz=6r4hG~_^@HJ&; z5cul&WieD{9i6imM}9o92erb9vu*2u#)cjGRr&gG-QhQxt;8kUXbr*>knJI6z7wah z#n~sjJ<5RtF<$aY2M#SxUlGx~>_%$)?$j&uPwczaL@OcsN4r7vu9$xSwwb1=Jes)5 zc@sxW50SEC%0D(GSOkyB99tlVq{+4i$(!=K3=J=S=-TGz{IQpOVXk7@*)F zBPc;IjF>f5!T9N=i~%%Jy#u6pO5t^vG3HzdL2ZQw(WDSo5t-x<35g-be|O;Ut}^W< z$6xdaiXD>!nck5KZ|XT3m-eIej8y|vTdB&c4>_`G-Ef$cIdF-*nf406`aq5(ki^m6 z#Y}63*PR%gxX>Q+PeO4-l>DvxG%jlhV-x})`aCWLbDAhE9DLx@&C&>p;o`^v47%rOj}bD$B*S|aqwy#7{aegm!z6ns%f>%>a8l}iO!+ZNdAc0b-$ z3L_yP#;cQ8TgC)Q7Tg2qu$Y+A)m+fPc`0FmQW`VTjd9O3Xh@Gb%MZve4w_0n*b5ppiyo%>@w}S!=;FesAdiO3skk0 zX@ezs&e;~vPQzz$FLMzKyYT9O?6H&QwC`h5H<-1X2ar$E~xI--yz@&Cvt zdiTn9d*>sutzYWHczj}v0&;(T>WbmyX-ht?i#(If&myed_mnY6_0b4d!W}xYs%W#e zrpDz=?t$mi2)w!CVW}5Hm{4Nqoix$v30tE;IV+?f5bMJbntz0&&=uUVwB~mFGAUB8 zO$+kPXOVYU!_K2Bew^t9#|eS}T_T^~8;iC{JdR+UIflgn$bDOY-Ua$uqq%UJHLo-? zCrxVV^P!*@o&uV+V02-Z|H*w-R) z1Wq;hO%GTdr`0Zzlwus{?D^V{^1%rVOAOkcB?Z^+!wYzzeMpCev=(X9rh$-EhYu8N zxgPT5A_8*;VR?reZu8_6d09fj$<4QXgai#LJb;ZL0Blkf?TKij0*%)qICq*zQAxly zu6vBbs1Fd+JZ==HgpIpC5t2g2%^zvO126otxzOOQ6N#A!IYj143Fdb+GEmN}FOp{M z`N$allO@=ptySkbW9m9NM}G8ZC@5}t_ z6dpWmkjlc}V-DNCJuWJ!>d;j(uzsm`LAxLpRYQ*nyy02**DF^1`c2neE|pSpS?mmV z-CdSlpU6?utSh#fpdjZ@lCrUO(mHPVD6YxZdoveF&_;#&^mj>jf+i1`SgT5vt@#-` z!aueq$nx$f!vF}}&GNzPY6%;g2mT=$gCX5ID3(0SY)NWCm(Q)=B>U(1b1LDy-gXs| z);cogq1%7?9lt)iHS4Xr@ruwJO*K|?bhB?-A<2t3TJUh z)SLQ2OCHhYZF&bR07&-~N%xbohdCIFuf?4`3wwqg7Gfz=9PFwrHsb1WC$!a1n%gA&+SukWZ2OpOsEDyfbcUA=>m_OM)&zNjF2nx zgJGaBhdS;92$ERdqEbuBnIn9plaQQp|Gn#X+tAi}11&u21uZI6 zvAWR)xrjxYfhq4~)GtiZVg)l+OPYo#8X5J6G~Q6L{?0s;S|}oYR8bOr5jHZ+V+D1Z zL(!eZ1=EqSEYdWS`i@8a29Tp^NUJkQ3^&O{4F)i?Yj6~;R)SAP_|p7WFQ@F7tonQy zI|EQZNXXx%>s)7%cpjn;rvBiOioC)?u5Xn|*9FrN)-0qQylLgkCbWk5omCyCDtV{D zUFA{sLpxld$c4kf_OsyPmd*bD2&|Sc4d*x1P@4P-;?I!)QMR_8pJ1!3%jJn+kJ5C3krWOFSI8Ivz$T%1J2-fUP1<@<{6y z=mr_(1xsXG9>NDO3n2XWc^+x86kMi4iQxD~DS9;x{cf1QU%y050}xF94+S}m!G8yl zqO`;*DK3cI_=8r_ ze4cu1)B@<*;%e`Ib+So-FRCiej*_IOl?(a9%-dn37+GNSnDR%IlOE zAkdo*9@qt@je~n=i@qz!)sD-5k5N9dC=;AN=UHt1jaU~5=&vB>$jT-a#BDTL6SVIF z7l?szhqEa!G~~B1>G0$1O)%xv7leEp2*-rHQv!GhdlJT)6@o=faFGch(yob7AW35UT<2YmS&}@js;aIWJ(3l-kQgslOvZCgw8e7C;9hYRKb+_)1dZP9s*4AJ@-DbV>`R1`A6j0e_npzmCYy&d!T zI|@vo`~)a_HJdCnC_y3S+q{G8jUVOyaInb@FpL8@X#VaBiu}MloT3V{V}e0aq^%6} z(k$^bJqr$i3x0yKwVruq z=2-#0-T+Le7N1>#vIbvQ^P)4`rxXeuU64fsed!(ofb;+&$LB4N(ERiCJJw3-y+cYY z;{iz=uf9CQmu-~3VMK?N`tWBC-MYu;q1jB(R)+j|!OOUa`a()Q!BkFT&Nu5Lx7Wp|IAb1b z$g0!8Z6U>e0!ZYH6xq;%u>nL{TJsp_At)Gn#((8k63UCUuUqp58iqAw%VCEQl|Zn` zF$`vU)p`&#>-a2B5fFzo;N%@d79MocWueb&@ZK8yOAYwcnS=$_^l%o9I#Q3*8bYsM zQV?pK{BbUi!P5Cr#M@TlTJ=8vM~Dp9XA72sAdCxK2!?7epme;DD!@(Q_u*zwFr8_~ zM8`;Xz*6cd2$QwtB#|63CBqSRg$2jtUDNg(z(@Xj0#lFUtP*gaS^a0X0K+$mt+dFB zx~25#E5J7o?*w!idPn2Y`wk=bnQ04|-bfoBK!uPve?)?UcoIOp7~lULCSA)+y8b}c z-f{2|mVB8>{-UW1W3~H3q`_}q(XRp1M__$de){oKzm*SHHdyJ#;!6JkaydYf3(}YK zh^M|{V~)cGA;dfam-Ez25&uGkc@Eu6+!X(ogI(k#x+OYtpG83!1O6=1q!yP8qsk3b~Xk!gHU__t=htjgrmJD<%tlsp;{aq37QuHCkOrl?JRtCG{b~=*SSw zm)wu#dd0}!BJvI?Ew@GmixXVMKh~bUoy#Lm` zWGYLS-7mWLA1VV8&Z21O1c?H-ixB(LFq)u+$8%8|o59S}#Lql@v;rVPYaVIho%Jrx zy^Rl3<=?*^_vq}!5E;m(^~EuF#zV+cM`%u3=`@Ri`boZ?iXqAN@96Rx&7j198X?*0J<~pqHj<% zDx82u$c=kt4vyRVc|CO zgMS<0Vj7T(Zmh3P6+}@?z~+#i4Q@@c)nBfd^uL0(Te90HcE@!tyo|?C8h3A0CwqmmF?9b$rX$N)eaHsTgG1wX-X5pAIEKfh-=!oF~l^^fn z&AkZEV!KK{QX9;jZw=;%P{Nd%*wBLhtm_2hdW*0c^A(@7Z|rtkGt|0bCinKi(7!Mi zD`)fX9Z5J8eQ@QM!iWE?zFK3k>T8kOci#M2Z-0M0-^!*+tNpMls(v`IEKRKeQ-j~S z8*EXQc09b25m6POK1*HMj4f1doT^5h?(FYZ*qr#N~S`Hy)+n zurvIY%|4IY#b&j4hsm9>EijT=g6aoBk3P5Ng6UJk2Qw_6Xm@Wxn)M@6=Q7@GC+n)R z_HR@#i)pcA(PX+CW&gfH8wAWn9!fJ+A@sJ+9+Opd~Fft}UZi%?{fcf1~E$I?UPO*0=?e{WYuA$F?8Z^5od?K{s7m z_MxmBEnNP>X+DP3sms$CZv7SbR%Chju$1QX;h5vTHBofF&enl&x@4%3*AA^T{{<|W zo*p@ZH0K$^lDxMUvL#k;%jwPQ(YAF~DJNo!JfB$B1Y~Y=?CQ)w` zZ@%Q3-z2$L0|m#4mFdz9fr-QSH+z>&$hjh2L4erMqfnV4bSf*&!C=N%5|e~7lOcVN zDME%A-wAy;T6Ry)ny)d4Z3#C_tgI_SV{-Ge_qGJSLW+WH<1#R;GWPiSpcuwsgJoZz zFBZjCVA^X8Tw4ZqB_59DON>KWGIY+daTzu2GQ{}tk=Z_15iWkwTl0iAIUTDT3kwbF zRbZrHU|DUy82y%IpBq~fkbxpzlU}EpCvo`YD}E`sXwS+f``niXo`(U-CC{^1lclvq z0w>nLo!bqkH)jYBqKQGw@g$z>^KR2haiR z#L1yCi&)1D>Wa#dH-SdUS_oOYq%lqdqg78?G%o~!)#+}ubq*qha|Myme?|{}UT1Dy zf;JGnnm5>975+#0#H?Vw#<|N8_(&l5E_>LMp32fIVK=O3X-A+;5YtG+u3@_p-3!_Q zEY3y{tPIz2mWG@mT8{n zAIa4UO^5V)i5MSUn7qx_M0c)qXLI(;$2L8DFbO~nZH!Oyy3ll83Lufn120;0A&d;d zp0+#Ugxz^FbwNqk9+OxEL4z-9Mg;AD3ZYKF6Ub9pjeG3+k#;Nia8%Sj$N83VLbNQN z>{Ej{gmPR>VBxmt50ZwmNZI+>0C)!83I02QSg`F@Ph`~oU7KN-#oRqQiXN~*$p5*N zhp;=7L9MP5hg>PWZ7zG)*1VZbNd^$1ib379Mejse6K{AYoB+jg9S z084G8ZXFjP9s`^$%K4~izImRM%5HT4eihyGv|}8hN#vuLF*@6>iuLt2GD%J$r@Dc zudH!J-Kx-@7Jlu$ObWPyta>0>Mq_vHUHG1mWC(H};uZfrnV82A`biPWGYv)8<5xb% zawe^7>6T2ky|T1n<8+5*GkoXq?WK-H0BN|tcOb)l25B_+z_UEbJhn>VWBs+xHHFm~{e!OI(b< zx}RF3C_fe#JXL1s`{NVKGRG{#`{K8gCrK=TFp{CWSAESfx^(;UOPOP|;nL}Z`mJ-@ zxrRMe=pPyE6|QMnmfzIFVVE+h_?PBC%6DJzZlh%R{H}*Ke|4S2ZaUs{BqYZ<9rfg$b*5T0{zw?i8t*a?-J-K<0?<$88?8UX2U-rK< zdbZ-0|NnCM?UD)a1LyAqeq7u1dvqV_9~hN{LmB<*v_5W%NG)6ZGZFou>ZM zc27`cvt!>~pDy*`HN&p&x^l5(1ura{E5iY_x%u`pgVJ}w(TolRgj+%uV`p-j<+ zwGbuwsrk^iU*WHdXfd9(ly|=o{&HxS{Ft=8yAtpE-d~&ZR0|efUU$%^p%ERoCnn zlo~5pnDw4tviDpZ>1(qe^SV5_Azg1zz{L*Nx8`4n@Rb8K%oHPXg9F8sd} zUiP!k*Gd`dTL#|*%KOpru*g;eVQsAY(Yew}Tdm9=atIvODJ~s}X#e~@gD=>*72{pO z@;n>8HqvdQS)ko3Y*>C>DbAwo>h1Z|Z;U&2r4HBlK2mFJ2s79!bB8c!*|YC=BwJ^f z7nRm^to&pznI3i<`T6{S`OmEXTuF?}mnj^CaZgov@qw_f04PuQ$|*z#KRHR&Z%-PIp`H9qp-CCfrEEI~R;vO>+bR2}%Wv4%B?FjXbzsFKlmje}5`_3bpn-CHYM%S7GL!#~nN6*_?* zR$L9*=`^jyCNc#$K7alt@vM)K^ztUcp`1NJyJBt(`EevAOr5_*Bx^DjsCQjq+g%Iy zx%RpYLdHhgYE0gmoz;H=#YQ4l>|zw#@E49E%=4Y7#to*m*8qKlfqJizy7L4VB5NUi zu6-N{;qwGAV)5%I?JzW*O6GPF4q-HTCTMEA153QPS4_E3lSacN!iI+eFy3kiEk{)< z#V%Zks20-~))b~1q(C&!DshThoW{pwDA9>6kTDmf$PdLRL;;?{C*2*Fb&zY6*xV{~ zHm@;Djp*zVH7mudVGQofo|oX+=3PfZLa+;-@oBvPhRNUD*-ukOSx$BWt=HuF{NFz! z=M8W$->D(&6Td)?U7)z+$k*L6C$`P!8}j)5#!YLL0upP)@g5Z&cs=P^tz5IM^d5F4 z&1A(>GhfAZF9o2Jk9fBB_|T*s6^EcO!hL`3Nqhp)ViBu150G)N*%Cx22@$iBA3NQ= zT@+X!*G}Xq5yrx@IZW$k{z{%CE&wo4U9Sti*4upZLT6n41u{hgy;Mc9MWksPK0ROH z3JI*|4*iW6xY7mj=6n;Sz#iIb!a_PQkWMW~_bTMlqPpv-_4F z1zfiiKkWX&XhohRQxCde2Od#MDjRmj>%q#gGb11Gp)E-;Ek=+=&o93OQw zb|23VJN&pN@EHI1EF!vBvRW?m4iGYMO}it73?-6DAN{cKvax~>n~%;nZFkV}IlX^^ z3%vh)_N5~5bklq}=pc``B<$DLE_E5{` zdp2BwD}emx5`;SVCo&Rris*@LH-VA!P8uk5vZf~lVa>T2*Anlw8}a_{n;{SGhrYRg zFIImQ4{6PTkiF0<0z(l=(W9Z(sj$@yNt%@ZbR5Dw7F#Ror=c1f2sres=Ehy@dYTx1 zZ%3h{L~87MCHm$#;ztXXXN;**U`@+(J?WCU9_$vCWQ$g^RwE>_6kBxKR<~diScGaF zRAm6h7CMxxpLk#sW+niL8mW=+_%tqHChdnZu8g|Gq%lEaDztg_VSGUho`cNfNn!#J zwAeW0NR)#cCPv->@Nu8RGVB@RdXZo!7|zd zvIYocV8O`c%5g*}6h`lV@IzQ*t65UP!sJ7eEdf~HF-xB#gFQ4$HmkN8s7Y61lexiI zEq^sfl63(SC`ah?04_^X-YY4O#Y896bi@LBYGDBruH<4Yb;Fhf6DPF%^j_>1Wz8yP z+?nIz$~kmV?}KcZHadNO!1vi;)Uz9kdL$3IijE4U32a;36-8HHBuUl);;o{Z?U(A; zNhRSLekeoVT>)6G-d(5_rSK%xRkVtQ!_`$ag#nVyPz@&afhVuA5D=%(B?jMb&U1Rv znOsR3RMV0ncGT=20g@?m;*6;6?-|ew)OHc+wo3ryN0$^bgcioP3$!(oIlfNs!$}_@ zwRb;Jk?2iZ6EDTC`v9ozaOF`c>vJBZ%Ox=!W!1ry>3m5XQ(&M%*t!W2xdMA*!AsDY zn1KAwgFNR@+_|Q80T?Y_WYvo(;7AnvB!x6l83P+82OK$=pExmxA*oi1^)%}5S_F?F z@m4={s1h%Mbk-Tym^~DkNFkkll65R`3P(~+7hC*cXST$0YfZTdo38{cWrD?%;=I^e zk|`!i#ZQRB?gd_K3ixNs(v{7^y_gbgwYDakE_soIo;RQ4FS;wq1H^kc5|$E}Zjr3k zipm49i|52&{{gUSutK%F5WsHft=YR{)%EhebOp9bUQ;mnyjU(INSAGauwouIyvs2p z;aS4liNvm6(^|eU13=S|tAHf-@A@7=UBhMm8%RVj1~&CcVwBQamZZp7xULtQz!c=n zQp)ARlzU(qU241uQ^suq)qjKbkB>srQBSTnj_L973?Q^ulEM`3s^E*vbv8_bAa`iY zRfw)-S8&CI0Kg8$R8-X(bD`3U*p+j9Lv`*+>;3;g5btc1H&Z(Lo-iQXYX+k{S3ELn zsWB)pITT-GJLj>uMUqh^K&jDXG?9tCCJ%>X2S~C2fYK|j4iFQR0EN>;XppW9CY}z# z^8P3mxhQdvkPv%wGpz;);F~FHD*jP=f0-Cd{_tRrcim_(ngb1;MO!n4Xysw0GICcc zF1U(6-zO8VK9Pf+6KzytwiwsI!FFXdEVBi&aKJwB0X(HOMa;&vs~ez&&6NyHXRQ8) zUJO1yHqu#`s@u1`jY?6YH_{*S9tKy)^LL$P=>$sh7@&6mVBbAIy|CJEO-at5 zl$Pua-Fdj-!pGK^dMZdb^iu4TO8;Kt!$h{bFj#;n9M*>OEXT5d^`K-~#+5Bmiz{Vp zhF3wsT#bvC!U+)U*;-J*&>^<~zx=T4cQdHchRv*hthk6`Q@-rPU0)wc=hlzj^dma_ ziOJjlNqQg7ri(3l_anKY&8mfmMV*#zV7u|#VrJJQUcdxqm;s>v6eR2t&4<2*mMA4F zXzdj~Vp|?WlnKk#7-lT+Cp|)Of_``8pe5!`bV^7piMj7dyHC({Gr%`rk_`wgVrMTu zM+Dl-gnj%aa>?>J=uy^(gm<%vc|FpCFmQ^EUw*JjCGuMta)F}j zJ%`A#fWjPT`s!Cjb2ULsAV`T>C;tyr@RzV8j*FW&sXtmxc7_>S)Sdxc=Me{|-p&|4 z{Bnhon}Kx*VPu^B!&~9^7cV~kPWM&;pFXVP|4W!XdwqETgFE+bz38Py=p#Y8b|vqT z2@YM&#YFK?*~U+UXctHOAY*l__4B>PYQV|E$d-1gc}Ls43GLs{^#t8s%{m!hC*#we z{|O1kps{}=m4?ibmtsn|6}&(Go-;2V3O6g!-pp(){ie+$Xtlq@ySAiAR`S#RYu4UI z9aX{JLt6b>0)~}vrJVnfH)Sa+D5|}hw)!TPQNEdK9Jyj?f~<*y({8{0hv!I)T3j9= z3jM2Q!PPWCYqUWFc5;BYUM$D>M}kwsP8GPGF13uE^}p`)Z|Y6cm1fIJNJ+yrQ(2RN*O{5@1q^IGUNO@ zJ7#6J6_|5KM^{BqOwhew}vSOn(-NM`!OXNlv#)RpQXyfK*#0_b+b~>%xg&BY1zI~1pAKC z%PLK+UN*9%D}MhC*(9$c`Ep$7Rvz5kXuye^X>oJzW85{jG^#xKRIhX8S-N2CH&Qdc zFL=Q!1MbC`DM^#QOZp`!!#J8UZvxJaWhHkFL!NK09DMw0aBp8+@PcQ?%hxS$+~!Kz z5XKJiFrKjY>58r9^>Ad?Vihufje0Fie%*PKu{k56_iJnKvuYk`J$1U_}udnTK zvko`cs^JI})xeS(XD*v~92o58m!|w5C;_p4UAN*YJs$72v=bZ_R^|=}JSUP)kM1ef zApL=khFr9~J<+#aC)yORCtqT<++$2}uu#_k?suQbKW#uo2hf!v!!4d`?58Knt|O|Y zGovh09X}y(eM@^kfuvRugYdr)-M>8>$qdMmV=y2NjZCf&vmlE2@ zgxQRl(M%DDKXdoC-+W3cKnVK!tm96|%yiE!6Sp)TWIEBZ%!FcJhXL{4shOSOE@O%T z^1aOw>{gk%r_9PAps7A^{bnX#_x{8Y4q`!4MP6I{*A=Ib%G(oF(JbFRMzcIvsiZ2h6!&d+C$NsVA4icSQ zyAr*2o2cs-eaKutg14;5EzWm2E;GNT6Bpun-C)&b&mohwmpq3ps(*PFQy3XU>qJ~T zgv?Eq9ITu_@uadh31#h$B1IO+^?5F!I*(#y&yG|Xh&sR{X|X}4uH^s=@&y0fDECPJ3-fol0o zy-9E{GaMPKNxe_Cot?{)TDWrT++(}APj>1uK26vnS+bX{q!!r+*I*J8vYla-Uq>y& zy^gir)p;9l8um*HqYnWq5EL&?c4}L7<^T9-Cg5Bjm@=6+3H`-zPRIp}wcL*8DeF7F zj@p~+k8T>B*`X8s$F+)fZ>Wgw{`<2d+Vkv39`I+o`s7pnYP$%FZzeupH)pQc zSTMbyAkmRn}1G$99};KoRQ3qU6)( zc0mqMjJG=tQLxpf+3m4$^yCS`9ZV6$?Mh&GnreOL6g3@q1Z6mL#NMY zPj3C~!UbK_{krEAy~p~+0n*cMpCK$=V`Drh-$QO;(IjVvFWL=&R`C&5vi#$qb9>`D z76MrsKIA*rNm+I+4`rqStl{>?Ev>djKc}Rom!_1#I?+2Zy8kYi>vteej``@80yVSj zZB|+!l)@8*#^amYEXMJARsY!EZl_i^3w3`wXV#?Y{4toluHp~ZX zB$czI!;9$_UXgX~-5i=yJE@pW5||rBd+2z{B<-WKh;OzdOZ{?;+idoL0>!5VZ3xm| z`2)BRZobv~pY;o7*QQNLyD>*JwUsOo*#8vtn{IEEENFN9Yb6`ey}o`<{V&o?%l7zq zidqH?T9gOz`&{vqtr;Xw&IAXgoI#ycE z$3@dbIUD#yzSDe30WLzIqu>6=HR!Ry z`z|yLNk%{N+?t)>ZLM3x1xWyckR}DeKELr0C1U2?Bf2mA$6%`jaIbx>pKXH>cNX_w zxp;w3Ylc=la#zf_X%NOw7d-PYK2Hc?`VIU-rQX}nf{TY{KdqVZWX z8q~EN;l&Ux)+#DiHhYWi9(w4C&uWp$5XKI|ZC^w7IYczAS=-L)=^W}}9{Sb9C8odZ z^|iwP&x*f|g%iO9DOW3oh%96GKS7pi?r(eg;|MI$juDObqq@_Phnh_Mn+xAbX|n|*TnW>@vv>v(ESn3A(Lo)MLKdC;jBbDs|H+(vYgcXbYJ2l z&MT2?>`D{cLf4TYG2ck}B=J<*3!R}#Kzf!vueB^8)e6sUOmE9(n~py99?A-= zO!o?U?&Z)SDl!Q%t@(M`Hi{V+E@r($j1$cdX3(O+8?PT;%3`LQ6{wyD40L#$enwP1 z%`hJK%$*3_b2#pbUHnjI{OySkN1hlxw?CZaKja&ITu_%wv zdtP|j#jTv^B6TEww%Z$;x!Ad5(MP*wPpp#uw@6g_20i(RBszj0g>^{%cRk}4p3Y`_ zO|ZhV-Yw)3>uv?7o00C>#=Ypk@c;v5?1uo7?PPzghI8gL}`eU{6;;n?qrjL)r910%15@ zz`|ZiVO)WGZnY3Y%RfvG=-Pm~HI+6zyRoj8ypWQ2#UVK+52LGfAC`pMm!`feiggt2bQCAc z#pw)&u6(UFZ>`)h@1jk%J7e>dW1Q*H%&B)Jxj9>NbGF}()`qeGno*gi0| z@9?5BMlnaUcr|E$i5A(=3L)h?Fl#ukqxa>mY^CJeS;B)OZ%RU(N`8s9xH}!K>^{0Z zZ`bGLxDfd3tm7^m3y^hpV_4`afE3HBzX(KSvyNx}YheO(Cj+<&%i~?$C*KwlE&<1L z0V)TD!a?fPPOQfH?D@t!X3!R71z*G^=nK=o%nDc^bvcW+)HWE4AWgm5Il z;1ZI_9CYHb(Z8-)&W3y8+^h^fc(gt>o*l4PK1WR>m>~ntEu1nc8p%oFVZR5gCS)0% z61w)T2V;Q!iG{2~SbgH_Fk!=A19l<(_-8D8!0oOB=$$qIUW3(y4=S%gW@|rH${PFe zK~)*P(`ml2V2njzK&DA6PZ|%Q)sS@sUrsw#RCjw4?)|QJOoR_UA?o62g}0 zPIs>z0|*S5F&W{+*!k~Ac3{f@@rXwe_hVZvF7XtE=JflRgWdFKO6&*!-UxateEWZg zwO)WlRfKyao9hJ`w+j8QEutMg%3K8d?7J7q%tmB+tV{b(IRX*Wvf46afr@Z2wwB0) zELjomvj3V0S`3QKr~(H9)<}1nbZu;`}KH-&2+u__uVxZBRlXee5sIA zcy4O9nL7lu!k;(JfU!!HF^piT&i`r5S|sx`1HxV>2Aa)7C`~tF(%`Kn3#emnNn>{> zv*7fnr}X=+NmhX|u*SyVdPY`Q<{=RMnB ze2ZDv*DY);6Bws2EQH+GJR9_nAF#QE4AQShr@_MB2uEBvBaL}G6BVcxE}FO%2t?$> zHw3o|tQbhTzQBsbw|&Agn?!g{40@oDR`Ib2MnCbLz=0N?_iBK~C>2k@DfbfYa_Arq z2I@Y#Oam`MAUg|SFvlgRr-?t}i+VK`ycbgzDh!dkVPs2zOC>F{<;ijWrq&k-EM7U+$Eu@O=?lYhR!TPcR z8z9`}SGZFZdoA`QDz@M560){~jlKr|F0OL;#drOMWIzZ?EubqJa34bkw+wnJk{o#m z9PT7C90v5~VfQnGwFhB*C)RpYNCBg^O=^*~Y`@qD@|&6Lq-Z1)MzjD8&*~BXN70>! z#k4+f06)v@d;3&VO{=t-QfYUlL`WuzgiMPhWJ(gknQ2w2DIp}2EZH*AC2rg^l{R4z ziZCsbZZZ)yGQh1&L1t%p$`$duetg$m2st2NhQFV{A3p}HTFc~3V=@?Y?56!Kb^YzzC1w>mEGvK8NxscA zbalJehFhSQusK$a9r{O7bP{&@+~k0YcZI z1MTvfZq6ub1N^tm;J7UwcDDY+tg*yG6p!QIe2{L0(+!MU8@%*)Uk*Usis|?5wNN(A zNo``akNjhYIM!s^OzxmwL1;>`+cs}&-GNf&-wsNDi)p^ov_gxwwdoSd0Gb@f{N3f5 z9;ATVGyJY+kUG(*gUC?(YqR&Hg&C_t@RuEy3ql636mj z&BfV}@ z3bN{`FE?)<)-0$HlLRxKUh>S!=KDfgr=9tyb z^}JDXc@<-(^6r-Xc5F{_=GI<=IU#oPvy9mdG2gR}D=_5YjWnIdeE5b6vfMi)fByA* zVTJcHlT{-5e?fz zyl5KVkN?3~puae)*j|txjSZ&uZ8TlBX9~=H&x!s}K3BpMdq>x@WrucD&Wjz3>~64l?w+*tVdo;!6UBD1GxqfwrI&-(e43? zvBbk7#{emB(pjTClC8fcXyQz!K?+udIzRfEXWC&jI=>Q>}=jdn)#lvb>F>BU#< z8}P?+%J)~r7H|6E8J|gK^NDQdOPkwDd`ElFi`lKh+=|t9yYHXc1AQ!ZxLBQL?oEt} zo@E^7!#{6QWSPg0Kk>CTH+J{81fpr!a1VSkBZAD&UR-IOQ<2fN_`Feq?iw`9_`9;Y zb=&CDN1$C!^RFXYC&Bt$tq3d$uNVI^Q@UyR=Q(L01so(2Um+iomPgHa=6i&OgkKIq#;wK3Truzi++U-~IQazj(tRqy6o5fc7@$P|!4{MzL&W zARI8$RC;%6hV2A-!QO-zqJ0m_lr@odHDoe<8!(_7E!tMW2SD4W?wAlLmkw&_kx)A2 z<|W9Z%Jj{Mfxj%cm3?$pd1zVoj$0t%>IvRANAZD&u9I1q~c^I*! zCf5QIi0QHc`{lp79cFCy00lXTz>&+X3?`DdhnGq6AqBe2N}0RTtKCi{h^diEboWI# z&7+1-*F{JohEYDQnUGCA&|y69G&6GW7=r-s_)N9ooQa zGs$Bw))bW~sY8pYOet+mR1=^2Y~;RH7(X~xJ3d@TuCVQ?qpafZAlxP0Fl4Fb*GFLFp@t5!${J4I zV|5Bv^WD0&@=W@;^NMQ@L+mDF`f1?18wmBD)fq}LZ(h@UA(LXOG9A)JP0 z@Tnp=_CR(~6Zz|=W3-m{V3794B8Sp8>Y^Tm)zxUnmZGe&h}e~{C#V5#;U--wf2xNP zXFgT08(iLGSj$^!ZZD(_qU#xtR-lUUQ6k*)V(lPht)V9W@I-G%)*>Fn=o>ICD8G<6 zI#FQJf*y+r8k-aMTuvDRu3wY3?YD4m|NZ!Nl(0l zLE)%>%0ix)W^r|kR(BvRzl{F;g-cj{)NQEIhybf}o<^_PQ z2|AbZSdXGjZ4xXxL8F_<+4yDponp$2Xqz#c`zd1^j4oSV%f(wDtm~jDB>;GgLHa`4 zdH$;qu8R)<`N#_XP~kbU*8^uRTGZ0^pnc^E@@4^;s4ywL2)km}h1@7zgr0IJyf1D> zB=(xVY8s~?4|Yzq4_qNVQejfuLK%>gpv0C9q{{}*%Z$^id`88(0IF06%%6hS?%DL7 zHo?+z*3wJXGOW{LF2FBPK~jW7QY@%INHJJF`{8iA1+i&!#Uqd<7gBEm)H5pbe$|!w zbKbOSYYw-e#!?t{^kXuob5#<)~9+Y_W z0`O%4I~@gQXx!DZ1VN4MEV;Sys&n`VV8x%M1vrb9FGc{|QqvbT@T>M+9EWhDVw@CX zHpq%>9)VRsEFmiPx``pGP0mgc#huc1;*v znT|EC5<;)W9xefhakAg?D$eNGqc4Sj#y-!ToYOk|afY!C;5VPXXMRey4SeA%zQEnhC%z{QV_4P-U# z=eqSdxrbT3aJ3ekwS8K)nHFhTaFfJ2XRmg#cJdN}{*GZ#_bwZZICDv$W5zmDBugz>THmO!1VVxK|%BwNGat7)~ z{9f@*E~WZSAuzg}+*!rJ0HVK)^}dN1Gav3&Qqz_d7T`vqB;b~g4Z9UV>w za2|CIlJ>#xaTGw|RyJ!DsxTEqgJJ!qMOC!4OF=D`)UztJte?UFUb~*7okv*RVp$q$ zu&*xUPb{+ci}ocM^$beX4a+O9%Tq7tsTJa^QoYzR@=&b)BN;iW%A{05Yb^xpnON(S zZsk^J-OfW;*u+d)%Bdm+^*Tlf-}n*-20ay0YgBHg=4Lx|aSK6{6Xzp}&T(?;JvYh7 zWio?R12hc77Zpc!_G>@Fh^__}%Q0LALJM-HwV-s`L8>9&w7d$+(=CmX0o^iFshIf) zqoQ1EMYQ!*+JpLF${zDGokA*(?|WmUYBc^t7ez1&A)QrlOcm5SDD`HlZGp?5ED3z` z+;`3Qe>Gpn=@@_lJ#3{kh%T7}IEq`sz%{2@X_3XqQl~K!t-}9>&jVjtY)K(sygY^HJjP}|OXatY5`irdo z9C6>K(#g6?1AdTJ00+mbjM5D@PJ-GoD#+H6b`$l`3m7c3ELPRh?f~?oTwGAvq27i= zZ>A3Qmm`TP&47=fi+XRa#oxIx+&6;P9&dLNZ%le#9J+=`b`<T}}-E`94qv+t@4TpX=l>8nVo`TZR+iTK_ zH`fxP3KZH-U>UOIdakw|cD?1N@wAK|TVq@sP1YCn2w4$o#uv9 z==>Daq4txGJUYDGaD$6y7)z*_spji+VfYmouv&*tqhs8k$7`}K-Y&2MX)=CIF-Yr+meH5Uu6pV_^BkBeW5!S#Ml zpZSyY&eZFq)&tRY)kjr+{bl#6bQk&);xLyCfPFn$()v8%5@>im0lEpWFPRsJgpdCl zv>F(Cd|08=XddP-ghj`W*-bYQZM5D_L%~%>rc*|;DsTz1$e%C0Yi=+)SOsU*-v6i{ z*T}L1I#+R5C0&S`SqB0O@w@&J>$i)T_xSn^GB3eboh}7^yuQv%$~jt5mLBqIe=Z1N zxKu7+R~3EHk`TkqxnypL_;!d6KmUeUR8)wERybP?yh>KVX*PzH(UcQh!#D-buHV?U z3Y_|IBk*9;<7ner;KAYF1I~VfZuB42=4IZYdYXKz>Yi>|kaQc2w#tb^8z? z9Icz}-eH0B;=VUV;B^Q+Kn2=yM{F!%oC+rp;+F`a%D3PNMDv{9`Q|O-sm#*wHMHUn zZpKvhf)W=Ia+Dk=uA z@3MKYv%n=0z^$mvb@&&=p)2-XM9JWye;^m`^lT42Fn|J}o{?IpIFm(y znd=%zT6_d&z!O?c3;Guv%IB@hLwQOJ6YH(J5|OOPSz?8KDRG&R491bj5G^BJQ8GxS zTjJ|gp`rIP#qZ`xDzP_`MI# z@7t2_^w2@8p&@&tX2j9>W`2c(bk|>RlJ76<%v)Zpif-7#;E*${V1pWB%9x(@h1$x! zmlFufDogg(SK|vfo<1p4Lkw$=Y0N)yjk$Xh$r>ZBNvi)VccwemL6G)z@f$tcsvX4E zS^9~dT`zjFEnDO#QqCUAsoFul>Aoua)pNus!}*H9pIml7?^$*v|LBo|GfyI*1NJp& zi_>GD>PLR>Dkc=n9^Z!WLhDr?)@AxhcoUk#=>3hyqV|*H%VUZb#~+WcJQ#l>?geJR zG{xCSC_Xi;sI{aJl<3j6)!mqyc*awqo2ue3GE3E^v}v16cf44v=S@u< zIqWak+@5fuGAEl&wh(|J-k-W-ADJy|l*>+^zDL<|<@%!~Tdv-Go4=(tzHae_io4g> z%vwt-l`9~}X;Jm%J5K{O6R{+f1Ie}l>%ab&+v;s=Tb$%G8d=qLp-IMzqJKBmSVp92 zBo`kg%pmg@CpCU~v~>I3?{5pPHJ1I?dH!f>hkoom=&_ygUf67G6^U|z#cN{BrzN*& zFAq+>zYfeebKht%TrM^~K!aP=lHimMo706Uop#r{QXV+{L)+2i@;G?ML-%)uJ05v` z?%MI#Z>CEV4)`!MkX;{rYh%P={N)!)WIlao_lo7qc0Ly{KZ0Nt&s8MEiBZ{2x& z^Ig&2@jIU@zfzsrQTRgC#5|OFw`Y*fdt6an?0sxf^VWSP&t$lN8-X9{*>;N%;6uxo_$&FGy3JS$})+3F;=4oYpSQ(I??O zwSS29ZAJDzLzvUJ)&kCuEN$u5vzBJ$j-b)2E^UksgJx`FbnymK;2vIfKJavv?Fm=lsHt7eI# zndxPNoKH&P+)6Cd-2AY~_k`SePSKib5T3wb*?J}YbY$`rTG!gM9TFxek$D58enT;% zs8lC=nT!<6&h~m`Ug$zv;o$7?Z}8{*myM%4uWc@U#!TlTvkJcw;?J&J<<(n2zc-+F zMhzPjSxfYI06A9K%o`77_yzrC5x(p^WrI{^sM))&cJ$XuRo#3QyeYs^j)8=>;%(ji z@Jc-O{8awyzR|Q>jn)N}1qfF0s)_8+YbHFp{VKoah6#V&Y#bsg)k1(3MhRlbA-Q;U zdH?<+Gj(>WwjdHRhYJijUIWrpP8P#fjYM0-R-Rm(giCh6d-dAB&jlNPYu3^{tXo6} z*Jk}wkI6khT8$x|FUJZ2-P9>D$W(jXp*X zK@uT(dsnmZxga>0ee@msL3*p}y?8K7wPAoFhFkG8A!%KSofofQmSF9n=?-yJJIwmm z3pE-~K4d>Bi-0{a$J$6SB~=EmAmLp~!Fb*Sh-RzqB>C`iHunu0pR38Fy0V~eFVY{S z*4{WZkrt~M?`bfeQWW0`3pDd#l{xsjP$?SQp`uy0LcYL#a-!4>7tJhEHqW>YgY;FL z0h&HrOx`Md#Vub&bZi$N_mvTa^$mD4fwARh+P@JG_PlU;jcBFQ%Kd&%&B5&CwEWeF z_AaP*bKvq>(>+DIhnh`p+rnfAdG6Nfc(Z9`u1}xhAVJ2(nUai2J}NiC;%JIdJMdS+ zq4Ctqd*9f69VWbWWP9KV?VS(#kcS{IxT1enzc~nVl!WD3O}aTee`*XDG7B5ft3vR0 zk$md9v;8(CaP^v|98Q1T-a*dihPJjq!;9mu=G+?%FY{Leu%?K)uB0~TyXV!z>4=pZ zc`@EaJyG#*#s?pRp6$DplJ%cY%n2?CJtVwQUertQ(>IEHe0qlQt!C+e!HuQ2Na;sh zN#g94^-rd{|6zQW7x-$f(^LN9{I_eOH{nrcf4_dm_|cHLal^?4vp%bTB>va`cypRo zY1{4;p}vt)bYpvmU?=F{h5Pj`BcRNVV!z`8u!DdOx<|8=7W zJFF&8zdM<^r1+@78CWruDHwVqVG%eg+{Zxb#-MlHKMlE`*WbPyw&3x+mB&7R+5h3c z!Q$c!*Smil%Vt(mPC$co_3Is~sQ%_OKF%Po((&x9r9TYMd37)UgE#1btez@=NdwPE zZ;e(s;}yBHT6(|VS`<1yU)Ox_!G%A~#OKs0c)r)ff&W6yJ2s)jh#8xz>!3aWo+295 zM1xc{{MRCz>sr33ni!yje;w1YY4z&^=jan%Gg&}c2{&>ISVhVq+2-zOcRn!>j#CmtMM+6@ zkQYWsSL1$}Yxb-SX#(C9Mhl@4BX=bsTS*k6@HM`< z1q-)LM%o9UsifkGbQ25ZZpZsxn9WviR)MF&!ePMFAyu0u$2aGh**Hs8 zRI$%4+LNcq(LwON0%iuX_VOU7rJ2;DgZEZLZ3*0t0giKr|Mb+}b019IJ2*4_%m%bz zW=fA-n#J>9;1f0jRPvZ@tZ)ZBJe>?urAw6Ri1{k^qbI5LB~l|YjF%C>9dmZv>=u+=qEyMI1ZW$4?pTSWyDH?A{+{(h8u<1WzH2wvVH1M*hvYF7|tZk zy{$DHJH?fqe4okQZWHClqaVL-=yy+-`#nS1y=QLE^&q@a(wQeG z?-`;|6OgUC0yx33!$6JGc}{BfoqWvE0CwTYB9Dh$Z3Z86nfdC~UfqxpcdvxYY{u|! zuS2ud6((wRSYxMv2?toFr)6clK?o)Wvb*<$2u!-Bs7di z|Bf(fRuJrmPMltn%a9Wf^6+(wD>qbysHG%6Mu-*`<)_Yohjzd*Ttb=@pSfGRE*}@h zBW^_r0X*^j0Gdif-iTaY{_2eJ0AQfR)!Pvgc;z8yprU72t{UZ?`rr}6!)w;iMM}J> zorXAo!nlNOQbH7gP`4I`pcI^2!b_VG}p}V|Y-b z)Zbg?UY7{1MJ{W4$#ALBgIBmlBSNv8sqXzy$`)dTP((@wHRj~d9sD*mZ5$(dBixi> z2iA*A^Hij7BHC&-Oj?THs=g*BEz|7cuf+&)C~g^-xCYQcM}ZrWm%}l{i4tiW4X;&Q zi$QA&_N@P^BCi(`xAO31H@wRDGiDMcVSyCBFnZKY2E+=O?*s&20Dd+KXxS6odE`;4 zFX6oh?4ijnkObvMl*dT=U7(%LpOwm%SErkYB`KMpC(Q2IGQHZsQxEj6c z$2#C7S_ms~BXYW{EC~N40~P?!MT`PNC~;G6$62zT5Fje4d*TQ*B|##`FA_O?bdw#8 zU}mxaTPgJ&cEMN(!{5lU0>=5UW!0oh4}PaJ1pK!cc@rzI{Kv{qa_UzpEJa7=Aui+Kn)}gpBNJ!-ANqGn5TqW%tf0?`0^!BLL&@ zMMe{E26tivkO-OY)kuCTWx2{B3}uuZFTb%%=z zMn#fl-g}RbgR)tJ&i|LF-wB8denMn4IQQb#E+H|I4BIFP$Id6bR^hX5gPgSTja$wp z$LDvnFh2ma9-)Q^wz_NyIZNaFz3F#V*H;_`+|`sJA@hfj;ok$*q_T}J5l+ZVNNbJX;)dYCP2Gxmq(3dxx0 z=1~RdJC_!Z0!NgL4+tee9iuZ)Qz&3G%V2#qKvz1^Shzz{5-h_ppWpl5-uRoAo=?Rz z46jV|R~Oz@Cdya<26b>g3i!?aj6A!3D6(B! zt|T74Vm*fklna=+itwYhZ50BN;wF7LreSUTf2gSvWWF#C_akldON@LCWqbq3%&Wj@ zxyB8rcW9heAtQeZuBl`9NZ6}zj2|sD4Z!(Joi$4a+?6tiRpd%QliYx<8{+rM;;%`` zoI@}}1%F_9>iIIqxx|JM*Sr$IMos?FLP1g5PXT>7&~a48RAaOfkY#xBef++Cy zP_k@Bpp^x9a-U0Y(9fz84i}zWBB0t`%$X;kepCAtt~@cKrn{#0svup#3AT!148f%PaQUxYugls1M@ z^tjIh&gGdTvxA($M2ul_2Oy{kSAp>R)dG!CPEg`rVy*16#4l>PxeO%Bh#Et+EY=WK z0dD}t+`e)mgHfys*(PAT0|?&SB{QMS644Grk;oDwX*gbQ`AqgcgnA-dCvg<+MEdol z@V+Wsi|Pd=0=$%@1`$5rn6fenSldATg;6%&BaUb&bR__CNk1^!IuW#lNB;nj#I=MW z2{?)sO$9#;zbRKYQ>iTmh`mmHhU;*0zhQ?quy2QAK0aYT#S{eS-ACQ5N zzRIb#Y5)`k)d4q}|AQuPtM9ZR7 zk^;W%sJTMMPLY?fbV!2U9hFjrycPb^h|$Yr_&hxD6I!t|c3er{C~Z8PFm&kj4n_%A zqjF~~VOozC+{qo0FEr9voaY`Ng0f zU&O)dS{-h?L}YLn+UX}|jdfFa`(Z$%Qa_LDNRh0x-aeeIDsdIDfi8lu&=y>IPz0eS8s<6>Zsel z?#gErt@Rl<3MXwt{j>7GfEzzEZSJ?+*xeDdjp*7O?zt{RWbSO<_i^~3S!1WY55YK9 z%_muwiTo+{^=g0G+-^|-!+TO4zzWb!UZB0ybz*_;%CO`>eg5Q@EUoLtaCt`2Y?!FW z?h>CfmWF;P?M~`>uStqFU^wCMlSO8G$DR<+-}Vb_>qzU;%BCLANYCMPvz4Vw=lZeD zeQH;+s?gBUCz~qmJP%$(o$r_@<+6hWe7tFt>{4Z1$cO?YehGrF8wo{d=GIQIHcO9? z09R~6BGG(J0ICD8l@zq&i2iye6=etTbb-~+UDEs;X+CUR#T+oHPX)U+moOm2$OtomYJU+I+ky+fSNy1-X{ell#mb~aqM|NH{D@cOlMkjRU2Ve_neM~6 zfW~Q?F9hlMKeZMl<>o3}7c5pR0*P=xHDW9SWFx6>x$!+gC}>h<}H(-=NA5fSFux(%25vjhGH+w$8~#+kEKHdl4s4BQ*~kM40LYZg?d zoM@Fu>$g{6y;(OB_r`Y7u5~KCkIq6udiwpj=j-Wntx))HInhZMBq6#3%uVfz;9)Us z*}51e%3ENR3Wy8hhH&~L?Th@Bu#TWg>tNmjD_1Z_y^m_pZ?t;mcKgJk@M$m$RW<8< zkJCMCdq0XZwZPB9{0LN2wZV7FAmYn_!8J{*n%01s*`+h~37cuY0(5CmbXML(Em3Ix zjJl9}hsx#ak1BILb)NvHeT%`u_BI}O(4gZ=Fgv~niC0EjK9 z#I+@Y*>&fb2}nGiX93E3)P;NdV53bQsA*qGp_@LcHP(|$`>zzn+g5Sj2syM>KRi>< zuRQf{+$QfgKSR=6S5}^)t~b_n>(d&~kj#Qqo{E_p)zIX~qKgMl`M4%SjNky1t-MXp zC6bQidRdu)y36xsXfEt3X2-u);9M^;x@kA~PmE2-3y>!Z>NDrw{n zt1O)mhwWdqFJ}Po(ESTu_$_C@cLc_6jGjGr0dipTm(v%3h!t8^C|FZdXed%kj*Z1BNf|R}rZ`uGlk5=WiaaU|SayvM_ z{sitZGD@4pe&cdLo%!X;uyKxHkz1NFGqh9)RkMxo`-PE)*vEO-uAE>N!B)72Tb|xL zNY+TW8Jh3t{A#m`!IRyLdBk1Yfp#&4u8>weIR8fvUdME8AP1|*zFn?(1!K*aDMBX-Mf%;`cYJiqU5Mr#H zpv^&5z`?17PC06{sH~dBDo0I~(M31H3-R3H2ULIL$ZjB$#I;2nCzA{9D-hCC+cq<< z9PkK(jn<`~fuoX(939>pn~6}%Ggo1zgV11k{$kof9>C|}t=1pMbkimZ=b=E_^|kjI zZ%d2kJv!%9i&k$t`JV)z7j1O!TQj*3b4PlA8Q>u>x}%(xSp!5zTr4@mfO~XeX^U zo+~s)K4%uWRd8{0dO|ZtIG3imgoV;*)bbS=+43`xP!#jfn1(jm>~?^j{*8c|DT?Uq zf0w|u$?yLAvkN0esWWFy4|BMAi@Uf)H=*l0W6fD`eGQzKK&$UH@H%}I=F|)Do!^p= znF!2{e@wMHl}2BVE$>fn@pyRT;1iz`m%Im;Z@0OniD@Y#u_d%T1FtC@O=L?=cE3M6 zVx%u;Jy2~hTHfYfq@c~=s4T{&2y@Y@qP;Bxf4k&qnGaR*;)j|Tb~Q6%(;mgFxOMML zM>mUc^=osPS3W=E=1u!`iVF|CwzTAO`Q4vG55=YDWK88md6jKaJI2@Kq={}2L?@Oj zHIQFUTzSrJ+0id++z$-oS2PoFRymo9o2JO&j0T%HkK8??Y)ZMqPSjwj2hqFc*v2CP~)I=f_XY+YJy^sAF$wx%n^gh$d^$11(C()UN^C zg~s$f*}L2E6{8;EPfqV`BE+Q=y6rRZ4d`+?ahEVh^IO%I0ZyKn&bHc%5O>vNwgCmr zhjZ8GkxwtZ=A2-y8liiFj7x&tJxESmJ7Kp+j!CjE>X4>Ca(8v z>=z>|P?|wc^OgjFvj$|@TRYb0?rUhbev-Q)2ykxC*^Cl)sfat-XP6jUt6VHVatpeM ztCYa^WZd=$?Y*|dc|Q+>>G)K6q1jAdfk6;z!)q(JayM~;QnNQFttU54m}ATOTT2e^ zXgRVS2(0Y^%EA`!49amI%w({w?+T?ql%;!nh}&&BClkcWF5%W5&rOlx>NnroGli$6 z<97)&9oe(!4b?V4&fCu1Ej7@qnnPUz;&#oGmN(lB=-gLx7fCOC^(4qr9{BnoKCNZp zgxvBeRA(e-k2Q#srbwK2^#lYaZy=*nixd`L>kK5rXX5z+mG2 z-Z-#UR8|8rG$2}vZLX__n9dcumwWtf&IWs_6*`%4R$GQ3OEbpm@$5Y5Z1tC-^`e6$ z3Tr=k+c1g(YS%2RospO8ji94Lxyi>t6KVF|scd!+et&~r;aGKVs?X-G<^T09|1-9H zW_mdrtot(7Ni=5?%R$_-0!>i*j-iPTPs|-TXqYasREgU~fR0>jVGD6Rpmvf8?h|O) zP)%IV{JNWk92b-5kOdoRS5uIFfR2}#@U4gdWbjbzeLP6JT}g737z!oUc@lFW`m>7Q z&C9H>Vcesd7_OICr%MWAPs4|lwr{i|y_qjdLAB;tC>H4NeDY7KfbJ+UuX*C#q@>{? z6S<(4b*dx+;+|5r4RsQJRtC(5$onMhyKY7F@_sbYPx=7@sM4|PxPX&~&UFkSE~OaMvL zFIP7@WTFI_CQ{%Iu;?79z8-AtanoLH{U%J0Xe+TqjxWYbnAr^8p}J=lot96OwkB6N zLC=VEi8WUexswC=J~t3OH3lGVPj}RrW#HY`+U@{`AawSB_9nmzEp@2x8_hNUJ=3>( z|EJXl{#%U(&Z=!^)e4ODfB1BDR=zKuqWsKV**&`%@^lf z1PAwm2ZKSq1nNDh_)SEFnk3d$_v8egHsGxgVFVQd>aim#XBrnC4Kz!B-&4A+;JG2N zNSeDvEfL_Dr*}pev=`*<6MJv&smK=RxUCW0k2tr_pHvr_wNIwoUhpj%EOqSd>VEj9 zr}wUE&DC>}ubUzY4)(~uMHm3Rdg)-c$!l%l8nR*yVX-*YBD*=gL9%a6>GO-{dtcSc z%fFF9T}-UqPG#@T-seFun=a~X)H%Ow&9#TYNALF5?Q3B5^l>f*Pu|wK7`}%1v+vZY z$V2-YbV=gB!%zC(KFk8v-VYRayS+glu7C4p{o7CL-(9to9O~)J@Mu|o>il1htQ{Wo z#cyx#1BdVTjzr(Ac^G+UXW0%}Z*RkzHe+S(-lz|bWtFaCyO|(K(0l6eH%hqgi?4x^ z2TG&Pzlkb2w~naj?Fwhn9Nzxe$GYow;W_{9^UbgG=xaXz_3ppt@1AGNO4QJisRx}7 zLb2A%e*Egmzginbedi~|5vpAhpabyy(a~ZO{;Sg3tsWnnzvu-d0rY|TIV$!yKp8cZqfd@prW``sBYjaB&^Xl zB&{xUEGDwh7lp!5hmz%nVu$lAcCt!u;RR|008XKb(zuACjcY15M%KP3RSnVeyrk_z zhmVNyLNqvtFkiHoRJp-vSgI!gNi38=awbmzFbjBo`)cfPg>D17L`ayQfa=RPZvPW6 zVr)uIyRf22HQ=^k%atzgnD+n+rLce&b{r8bSomd#&O<39086JDYyfjGyc0|6GrJ2f zfQ&xYm3E0&bfTn)5Ow=iV#2aQvI&(1fD@|5ec+`lS(|LLO;mq}nMSZ=lC>y7Fxhl* z9a?boHA!m@$OFm_4#w14{`#~;dq#*-($O_m!tI{+DaiHZZwvP5A5N(C-(Kbhvl3jcL3C?!wy51q_6<6IMQx<`_;T2$2Ol4lsn6=wQoF=nB<_&m zs>k!+?LN6hkYy!JxHJt1a3!aP3d$u}4x*72O__;kmSx^+?RZx0$gR!l+>{2%9LC4m zbiiLoJkXBMEQ~NH2i+rZPI+sOGnhx05(EhAc+S`fr!Mz~oP~meI!=I@2q$VMuH#<0 z@fWyU16-DaYZ?gNJs;2i*`{J7_2&%1mhbD9Mc+flUy*uEK0aB(C60X0-JVBgI}aT= z4p<9v{!ECsvhAf}9nnlV@fokPn04hm|L`7^!1DlgN#&IqdR&^R&rY}+0WwtVB|){+ zow&UogtXuzVIfKFCqRA=eiaWgRJ+RaOkIzPYo~OtF|uRTaAuZhnR6~;yV$9a4@l3~9>Ap(9 ztl`8`HCUXUr85P3^<^*W&0Mc0MynM@a=^Sjr#RxPJP6bXy7-zLjkXJL9k zgrZ!8oeH+2&)=&r2?=v+(6n0r-&em_T|;R-TlCdCt&7+CK7spG;Q9-bsG4!T5TW~?BKC=lZi$r9e( z)l(BDpqRue9Pbp?7LESvv?F5C*W&a-_dCQ;P2QD+bG6O(LtBpZ+9dEY8LTx-6}qGb z|6&VqNnB2>=1k@u_`UJn?LmZiln`iJ+;KiTxZ&=KJgCh1xl1TW1a=E&f^s$pvze@3 zrD0~2El$vIH+$mLX3GjnF&+oyfnS2d-5bEZk9qA5uz zracKGB*Z<_w4v2nq&p>K%akq4<+Li2DIso{R!K5KLRY`@`@dIz)LEYMJfH9T)AhPN zkn6n)IXtuvuqY*@TKS|VTQj68qmM3ZUD%5-vzlEShH0ql8?wud$c_gHmbYyH%r7-) z1q;@hBM*~BkXAEq{A2u3*r#Qg45j_EU9CjNbq zsPqD1xnj7bYU9`O56@PwSedJ0Qs;GwIIVkcPivLZQhNTh>-K@kHum^xc67|>m4o9znN|Wj(bJ=N8gL8 z&dy;w=iIx!u=068nAF(1^m^|zn|Iu$_nOhq)`HWX(GfWDsqv&*!P#QmBUpF><6)xvNpaWd+3MKhy(OwM(XX}590Xt~d2g%S+4j^Z5g zJlWKSmh!l@ppaQaOQE`3CxWG>7**6B4t9K1dnD9X`|Qz`;cLzwTOFsJh$-v_gYX!f z)ZhD|U#u8=zyDegs2P>raR|w(YT1g;BMD{@rAOl;}~pC9MdkT5RIM^)dhzbVU7f3WWVL8{p4IiN#$ea)(S4ig`}Xts%!UQCRT3(vR*9t; zToxwKow+iM(S&euiF>jFk)+CGi>W((hG0Ibysqpq@l-~%EVB~9U5C8cu`%hz-6q`{ zYPO}`s)EMtdQKiRH@`ked%+) z*ggG{LTzsvx5NGE+&!2KON|fN-W~YfN%pc`U2I(!qS{G3eY!l~u~oFeZjlq)S5_;=Xl zR#pF}ExW00j6LDmst6#;HfcvAIj6Cvz_x>G%^1C*bB@;mqUotqCD?g=aMn1XRvQyzK^4$;%=ikOQ6 zo9WyyMcW5Q45lsH)uN?kS@UtbEcy(7+&jNWFPBM(U)(3{OMVa>=Xm7gps9uDhpy0$ zt$3$r0k%EzTq}+dgg&S)%~L{M|{k+M{UIaYHcK!u(-> z8DQd5zc`q7u*^k-dHf-cXcwgzzg*BBbO8Z}4?iVG%hk#Yzo=RWYDRkkrA6HMT{LBk z^CJPqxwKXPGznBwj4*sM-vgL(49B|R(Dv(+Y>PYj+!}Ylw{V0V-Ly81tpGR3aPiVX ztI)lZ&;G_b*ZF?hNK!`%2#HcGfz)EyQwrXtbJQmW+81w$5F6Gu=q##3fM_e`hV}AL zw*el`yfnM679r5k$65IYQkC}*@fi*8c~vRy^j?)WM)Jcu$^zJ;pvs?$HgX21bO+@N zWje<~)x`Cv`VJv#h%A7+tYzlbLBTs#C%kv&3&q5QP3!h8#Rx4*1yRSgT7qkNk&k5( zuukkCtb@!3z8qq*At0iY@E}8obC_?&VM$2+lmm5f%BaBu#9+F-Iafbq9Pkz7xf@hJ ztB!NM`}&RDuDc)KeD*QJ;n`pSC6?#_jQC%oHG}<}qV1LOx}r87wjX%s>&GJ>7ZCev z#{t7qiQfK9iN0Lff4&?&`4SS{&~3mNnD2x7mlRFGiMv@a(O%fRl82}5D5#-kxV5V6 z7pO8s8?`nD^7X6Wfjf4y1&b8TUi(_I)uW~4I2LFkH+tuk$-_C+)g-m6-659?sS)hf z#S4>Ss{Mcw1=X%7>Y_t?JAK1IONY@h0z0Zstv zdF@i2I(c5qM7*YF)Q9hTqO&e42Chh zd_mf-+^&k*24*bo*%nu{Gi)%dXk!9O>lVDWw}^STg~OsBOFy`bB9yEyZ8eycKXe!I zPU~G3g6H>^$E-wRwN0f!F()AQQA3f_b&kW$O5#HIwgauNM%YQR<0g$oembuG9r_Tq z{&Q2w-tsegFFB|V6I&wRDa1}Q^s%p%G*N;?|5r+e)j2O`Z|Tv$UXpUWT4NUOV$yQ- z<|Rkn`;_pD@52UTnH{c;Wnn&93ep}tulI*@#Gu|6+SUjYE%$=i9&$`ks^xIB5s8NjVI5393hGJ=mO9Tt z9>PnA{j-TqSFFRPwGX7A?ZbYDNr9l@7>tSIc5>%LIK9dn1dgKjpC{Ys-iNo~Ol7xR zJ!;6WfEt}zb_>p&mATRjgLkg`lHeuBk$(KAJ1`OG+#>*0V$him8O%92q(hh*djGa` z-t|swakS}u!V2}a#dn5^Hd`7eIRELwO(JnSj;8J*@6noxgc{L($^v z0Dc+hKf2vv0|8f6YAJ+tFAhoY@V+iCE6m`)0}=QpzX;M=tR==BjyPNJgo-{{3Ney$$+vGg zQabd94B@-kA7r{94w-MJoDYF9>PPt@FyI93w5@91CjbZlf$?(wNjY&pT-bC3XzRgq zA=-Wpp`&abX$y87tqct{ffF^m(AtPs}#K6SbXtQ6#k>g zhX~%elr|LRDpL_X3cUx@&=kmgi|d@2&{?^x5MIVUFk0S5A1gK6%`&U-GcXtm9h4XS z*JheHY&^~qUI924heK_9&5uJb@6{w!YS8KsUi&b$4kFFPnm59pItXb9x(`Z49G>vI#2qu9o{4WRp zLAYfn!6eU^`)kOJ@yOnI#49N-Y~W1yt0|lj4@x znOfS7-l=^mRpDs*k1RN+j{2u31ne0Ns0wqcr#gEi_-BtUt4RpDI2z=0l7CT?*Acrc zPdB(PVfpLP<--XpCP!DyB!vD#rv?%Qlre#7Vwg_id|~b59dh4avEg>T;Tb0U<8eNZ zYL`iCmYKIhsV4Jl9xlO-40P7|`6sTj9*sI~W@wNb=|5(dXGYz@vc#SV4hmoGV;19R zYFK}0V29aC>!s_b&zv|*^-aP@ouft?jKvx!#l4OWze$T|JiFw@SmYjg1S28(KC-IE zbin=WsGB+WP9pvK*$s!sk}i&glFr@9GV$IcSa(0sXKhk~zuD@Uu{)xJ8#2bj=gzv; zoL$W_-(Wqy6`L%wJGrn-PGMgWK7x;c>hO3QL}NEI2aT@Os@-kSWky+`YlAD%z}*8O z>@5~#B^>=hpWI*cD+cn|9QKAi9-L%xMYe9c&-q_BEbiW*GvKlv9#E(fru0z=olxev zmD^t|_qc75IgT(B{>})uAQ!^hFDim3^~HyQol1b6nC!7e@Gs(@QG6!r?U0+M1%tH4 z6 zVRkTYE;CjwtK6rq)jbuRxF1XcYTz$!UVLce(kA-7W<)`3BrZXi5&;|&YV`~Qhr^BfzA|``^~rExb5Q356CR;4>#Lm5Ok|u zKFk)AOraP{oXd5-50^is4mhM)n<|lxG4MbHk}=WBoq*UZiT7ZquNe$Booblw;r14K zw_Vbv0Vbmo8#a$B(0qt(eX|D)#FN5Ck6kKjSzva@CbUg^n@Tn{01j8qDs=FY$uUaQ z|0ULUL4tm$+R)>3vcZ)yH@}q!jj4ljddyVw;jKSU+OMvIakf{M+J@j#kTtxkC_{~! z4umNcs4wupRAeF{juZ%xGU4A8zsqq`RN5hffk|#l$p(KG@Rg1ko%V zwBGSe^~Cu12L^BI~pa6)M+fL3Pi`pK#M)2M{ z{_DJhXBr}jNy*;Dg+ru#1IbZT3;Ed7>Ny32+!k-S9Z7(ixZ>LXe21gOG_Cf}(=A>y zUuMLFapQ}wPuWlV;TawBvqWT(T{}*G_4l+|bvc9?M4T&Ijq?G{oQo5^=*&DV?KLR*vHJJn>~;6 z?L^{zTb6m=!#Y;-y(8XgjK^XOMQHUYF~xS*QB2)vk?(DoihR~A@jY1yQALQ`ww9N6 z<-=UYLcBg=Fwf9i11HUApVR09oSGMxN~*rVVJXl0?zB43gu zMEU>4arEOP3!zW7xOidfO!=OE%Wax3nRf>{kepp)%}!{`?rsdA&~eFZ;boX|1+?&E!hPRijp$ zEPkMEkJ|3-F7s(WP7@BkYW*ztb*_7&(V4gkFao2BosVKDwm{-{8t-q(&e$PddzfPGv(_&&qH71ek-XxJ`CKS724%I(5;tNmrVIqSzpoW+>qh zR-1pidISc`A#HXuFb6n>$j$D)&i>2VJ*UO}9@fn*+f!t>U|ZU1Cj=e6TJ1Re4^^Lz zO=JD};LU>oaYv_wDgh(1z2xIupc`Y@4aS{L@7jAmVgoKp|%%KT~AEPQFDlTs@4Xp zS%Se%Xh_}NN>5C`&U04=OV(xka6oo6FQ+Mp+YZk#a`~{@#nNIaTh{UG8Z8R&Kfu>^ zn)&BVGxg@Xqqz`4D;rY|SPMHfxX{AW_KzB+%G_IG!HH%Kr)T=L;&`_6SRR& zEPD)zOF>5#50Gy0jylF-@!bb_02cz!l0gyNxZ>f8XBu{a8IDr$qxLT2XukW=$KiWH z9UOv%@+r4-(nRp8P1x*{rbmO_pI6OOqleyze!e9=u^9x-t^;Is^fe)NMbKya?}pdT z9+_C~bJf^Eo;`c&YYI(26-mjhy4&QN^j?Q`X9HEfZ zCo5rsU!YHSHqZvCbVK2>!H#wOVCjIjyk)zl{i1TQ3bZ#Y6DFyP8559-9*-b(V66bK zo7T~RHmvuk^jNHDq~f1Fldqp|KY`Yk>z?^`L-Mlz%`Hc7J2z3=ih*NvqF%LU{j^b{D+53P1|fj z3`zpt+_iII#i+6ZEwDF4`n_Kd2|s!vrWdPMW)~VdI*fI%!YCj_LYuRBe2!R7kqKH6g&n7OH+<6!Jx zs5P?p&votlp7K+s<)&Sj-J)2jsS6jov8_Evx7Z+t_XX`fuW}DKqR*HjwNVCq-+~w(tXP(sx}FJw(DlxRQZ4nsCSH);DbD@%+jl@B+TF~ z?#~>xzU4II)gz)X9eUB0P|@~BKk-_jf863pO!I1LwfOhkYI1E>3&bGVihMaoV~rlBA?@Z+e7+Vzav9b= zyz!x9n)C12ytw{l5@z@oWp(A&dv%IqyWQMd%Us+b!cBrBn}2c>#|MfR(`oj1<;y{k3SWmg|Rqrt}d%<%x z^@XfbQJh@K+vtpRy6Q`Ytu2ag6 zg@8FwzSrnE^OOjH_)m2ON`@4#{?MwqjwTl6Xe`{ZTGeH-2J7$b)C-_>F?e@2 z!oCw$3`O%WK7k$H*xqxl7lwB+&`PWQ+s7lE)9^FO z+V23f)?$;cLPsIugj>UyCH4XLT4CJaOGK6b1v+RN< zE%Q{YMg8e@BdW=XIX>kL5;YQRe5FZ^D(hOQk%@qx)6O4KZ3p~gLjf$(=C<6lWv8^KrkZEIi9FX^88c_Em-xaXi?ob}*Tn%+QeSo!Q@3&|>g2J+Wc zRYhGZDU~r%087m*-r$;CfVpT?5_}y#^u4Z?S;$&dwC%F~HEuR#u5ncmNlGQsb5z{m zh{v6@^XOc*dt>!An>LNTn=0*RZQ-0C+tABb+5T22rl9(cw0kk&XMRVXz4cDuragjU z?ZKw}w8~l#NJm)9qQnH${RygDI%&`b2kDK_$W1)geg`>*2C#pZ4@08g2~+uLv?m*|PW=FSeU{a=W_UM5yg z7HomSt%QTCO>>!_hi(+BCSv^ewQ3Y2MV|dhHB0`BQ?07=vqIzI%#Z|w&dwh;{beP= zoKE7uZ*wh3>q`O@Xq0;**Sl(n94a(1d^o^k*5AauDg(99`0NUav28)n(Ka*15uDwx z0_F}OZIm0JDgY!7z@!H4X};$@Sfcw9JnJ0@)9(cOnmJW47sT%3Yw}FEJ6 zP1GH4ILW$p$L8-dqM(z8zsdvrEyX`_yd{RSyoGU|;b3*Cd5htc@4}a%QK8mr%x|_8S!X1bEu=Pz^&?}6$hpb=*w~zpIz2*S6f{=J=+c`W+alF$ zyoyPM!EcKHriKg>u*7HukjXPl?n*yYJl9hD zUk7{HB`VrS!n98~EQ^+sfLK*GvHHA%1i?5Zta_O946ec1!nkpcDpaj905LciN;tB7 z8lzz#)^HqRcD@gcl#*4&YK}%~nhVVg5qf(G!6XIKyxHJWnHtB4>Y>242~`0{HOp#d zPNG*@HeILLV1YyQ0B%MIQOl#(ZHQTeh-9XOyk+_|&1W*D_b4VfFNW$b1u2?i=_@1* zLn?<6eEl-2TQhSlM7S?us2ZWanZ6b}XD(!LswqLsaDfUY#fa<#_0o(ekOH?F#tp!# zjYx46y5ZhdbSE6xVM+8uu-OXcR4=PX3Z~BB{e*-Gj*iw4%?Y~6RWKQ1677m1wVAa8 zz`Rwk?s16IiMR=&N+SYx0;-)5h+T=#R6p z3!~n8LcnPvLT~e%Y+u`3h=p!5QviX*$+&Zf#m8Q>l+Gj>U`{o#?xDoYIh?tWs@ZJt z9-vzq(XrcclaA!I2&F>BDxK3Sn-l5N9sM+*Gk7jCkHq!*U?d zKsv52yz3Q9v_=3&PI+kpmH~Ovr5GP*(J}~Us_?n7_<`P)RW!us*7jVV_b2^?7={!> zgO)rTSsf?DMw&y9&+ni>tnq4{JqXQ1VM>ihC*&~3aBj9S-XFmRe%r2o7DF*3&TZ$> z6_`ki6Q)v(K;f-E=@lj=_yJf0Xwd@Ri^s89F4U^3)+xQNb9`ZkZl415kwKw~)+!NB zU44lzQY{qXjHQ^UPES7tMu&sD^957+HC6Bp?cBiI3jM$odkzO%zcElH!PHs-W*K{; z@?)f>^FF_MJz>V&H1YR03(ZG9hL8{Mx=&(1Z?|+r6Y_lAZ$aRP89<(99FT_ereU!( z1Yg(V!Cw^-a4aJDc|M5LVys2O+He~4Re zwCpNIJNuZnoa1u-nkO5c_$Jn{M#%XIk)f;BoY50s%kZ2jo1>2|DqQydS8JDumTNr4aNglOjrmuM#NBNGBNg~T(f%`9Ra zwguKFd2wFcsvl3?fA(vT^V(%ElD29lZ;wnqa3#s+yeIcF??Z~$9e&d9=YLjcHesKo z#Nrx~G>+LZ>qwdWrhntYO;7F_m05&DTfOm=-KH;*J6E6Bx$fo8y-z@o z8@y)`i9c#V|NauzDtv@utA!AoCDkIF!%wSki$O4TfF=%)Vz*w=5C|zYR{q%1;*57x zV7NE^qd2%ai7EnlCHnQaRkMONZjV9YOinBf=Xh6Z1+GW%mrv~b%Xr5=gh2&~4lze*s`DtLD+H$mtUc9RtHc^rQv4qmqMjo2JkRjHSbb)A={8?l6F_Wi^jw=v zJ*U`}0N;DDljbC*9$X07vZ0outD-+IR?ir5U^yk8n)WU{YPfdM>J18SV>?={&>{** zimBb%2B8lje!E-ryEBwng`guon?8O!ZU8qfRPpa#ZWvCq#purR+V%^I)c~?8hLs0U zRAZUllzr6lGTm2YhT7{kA*TnMGRF8~t#W+c3vsMV_9jm8KCG}qs58sMevi$*d__Wp zS*e)>-&n(&sJySp!SkqH7!wrJ#hyviLkOseTO3Q0ksK%D85hO!s1)vUguR*Q3)$YicY` z*4Vse+atJ$iFKFemhPWLm2iwP1lBw>zkkH1|6J8ih}9}>RvV1Hwt_=QzV3m|u{?bA{5hF{*_#p289P!a~0*(X3 z`_Ii?(8ePn?e&m$6>vG&%K6xLO@9%Q0bzyX0-SEGGkjXaIS~O@YXaxiEpY5r3EGNk zmVpB22>V-6@anl>W3@pa{P({osKl}Yk>6!VKhn2Z|wnmG5Y2cf5C?=QIA_1 zTbKR%G66lQZPp!!G)u*l^dX%oq*o|3o~c&PfGw_HCv^y!f)O1K53N096vMdJifqF| zb%ScwFAl{KCcH6HodQ@`4ENcujq9a`$8=dh_3bdkY$fORXCY-AV9g^`N5pg)hcpYY zW)bEn$DWWzcn#5gn`LW^Sd>^sm2h-2bj^cQjmZTC6Ttj6!pGZ5$rHl6pA=*tA^~+w zPD<&N*!JB`cvW-I1Vg9AuHpVBe~1T6O*OkIH^E7m#*6ftMD5e<`%d+I9PIh*mF}Nv zkXAykf|e{lu=LKE18Gv#o*{$rA-%k6ir%7cGdu=%B=g^9eSZ{Y2iUJ;4QH$M_lv3P zFA+{osCE1c#R2{aQe1)AS~opuj{oV2 zhRCApK!-wyp>K7#nz|gvmW#DJ-x%CC`aq)-oQ_9L8)#FS11VQVhyT> zwDwGF{dSFDyrluH)Cm5s{~@B6*NmH$>ZW7r^^tX*&AL@a9+?Q9wi&;FmyY>=S68D) zP6&bBtO|?u?~64>Mw;r)*Ko~|J4zjf}dhiF&QCy({N^hcu#o z|Nhp3&4Ssf18P|d>kaCwiHG}$s-HC{oAqXl{Wc>iw$)ndzt|$NCapS1b1xySvm3$(!UsMA~Qwb z5xS*DlwW{u#?T5u#n|I_^G^-`i%HmJfnaeM-2t&)4yMuRK9@C4uzSP8DgcUf=p~cW z-+w7%G(epEoi>!xn{eVXm4GFM6R*&U^~iQvz806U#VTCigL>LCOApe``yz}Sz#<0A zK2<6bl28A$`=z?}wlYauj`^#>-5o6GisLP zF6jO{kXhXV-RW7-+IB1&>dk(sz%HV)>>oP=Uw4{a-K)-ITVl1-xS+ zqPN>LO`c74NK=R@_H7Y-tfuOjr{3RXHJGv`&L;iLrTX8qLGqNiN3uxC>LZ!Zpj_9t z$_5G5f4PXi=zDa!FGbjXL35o#TcZ~HPyd;&BAY-d&SBc?Foxsky6aLg8u~H$i|9;fC zU47N4Ou}=W>MJ(4Fhwx7KT`VmbzC=MjJA5Tbqhr;Q|3!iD*!f&6?rz(O{2#*P2Zk4 zcWL_0)Xk66ca_t(nhA^nS$@q!zg}#nn}YRW@$b{?M z;~zGGWN$eBg}>e=C&4_jWJ->uUVUMeOm!_h{1hc;WsS-1qnsny8#!n&*S%2KEX}Qw zikbWHz7ceLzdb7!`?FQFlgVj1`s+=i=>{M#D{hiuRtl3n(F4pryP1h2OwU=j%%xP& z4cpWHwel;K?QJUJJAR68!p0@$x zJTs@D{4>SIcT0bC4WFHFd2TWRw5#ad>pR4}?YBFdvV@*NIPTrr{B)MfjQ)OTCzpG~ zRaSkjX0C0c1*}t9ndm%QX1Zye`PtSFziAu2=^3615 zp#MXk8rP@rxrj?#KGBZb)S@p{odJk;f4F&}gOe1rLJAuK6s-1Y)&B+Osbn9a?ab`K zJl2U}W(w}zEUMOj4jEG;0#tF6(}gJ^XLMe6cDUU6QY0!ovrbQ#?VZUtR6OPpqlNd# zt0sKk%Ua27nV79ty@97nbH@!awsXE$rnq3fmbt8ezVR1y-kfpx`QI6=6mUgzQn6&ovN!A#GDZKY_n6eDtJIr}=DRM(^cC!@x?spw+uv+@{h76|;)!{49cc53c=I z!@hAE^bK=g)g}$&ma;O_71@e{di6ydo?7{rB9G|Br*4%Kxie*l0?YySl&D=Td?$5p zO5aJXCfIBMt&r-3h-vX93zipP`p%q|1BKExoD4vVAv88@7!a#;1P0qXNT^(2w0qal5c%j6+JSwfO6OTF61?TO0U0-T2eR_*yhH}>KY9E7LN z^?WJx_$DMdbn3YCu{ym_>nfMb4llc2kTK_Lkk7h=&8jYm?>|R>D)eV(2jy-=w}2P? z{5@BkwQX}hL?k{Lx12Vjn05fB+Vpx+e(>P1&X1cU z9_u77ULk#~RxH+^=zM5W2%o`oCk(ov_Ql9H=JL07cShNPj)%hz>dW#s^HgzebFs{Q z3KcD{xOJG>1vx`B|Jit1%Q*d>LrK4*L^YJOvN$NQIDu=TDRjf&)(OF-R=$h2?Za%! zz|e%1e1msFe@AsAwEC_f z%c-#9t(=kKcQSL(y0SiS?doZ1tuW%m^78nTKfa z(XHi7&bb=1A3d2p*Q$PWzxVm!Ugv*1aK|T_!DJux#t%8sEgj=BQ6=EcicF7Z-;r)b zch%ly;@zAMbkao-^T^lFu8&yR-xWWwC->srUpvrryP!=LwA0@AF$CNL7-v$a>oQ(l zvam0r%~MMVGxzisuRmqN(f|&5+MxwfB5A1MIIlpPQ?Pxi)!@JHSAELSUCk3<$Id-D z=-@Cl?dh2Z2YT|2(-Dw}&Zs>N{N{6WTb@CPCPBBHcOm^t(J82v`rmN4*}$ceqfNtdi54#*IwO_(rd|ZJK`;BXfcd_j9P)WI|EkC96mJ|T^Uw^?`o|G zC{th^2gU+BN9C8zu6dLk8hV!w6{bokC)qPALZceWWRehyfMMWKoh%H8wRosvsI2Np1VU|?c~)Z z8!od5e=WH^5fJ*T@6?}f`&Rt??Q2+d{I1usciEWwcRq(T3KU@`&C;B49q32G6ALir z&aOh$7!{#|+8Fm?{C=mGH+S_~lH&H#2UlR9kF5P}v|l~j*krC$@NS$7mA?JBMg89& zwx9R3?EHRy$%+^Jzmz*ZpXgG}!r;uiKAB`@y*d$U{yBg1zBSu1%K^qKh|E`lZlbMq zx6tt`m@x;l*a3GcA7T3B&dSub*o(-vLH_v zTRamR#j0B;J1*+n(^V@rb@(e~+P5m_(s{I`G-pXo&XSpQ ztBG9{G+G~(8=09KRi69DL2MKzzB`)j(X(S-@?tW@yrw-#fvSO-IZGTRwoqOOyC7lC(yA02o+4Qrb>MjB zf%5VLCkO1319IS$1Nv^cr`!(KMjbqtd9W_Z;B-O8-%$su0}otaA8K?vbUo@&WnJF& zGke4nIc^gLL5=zL139(=$u@R@(xKpPQ^5mERd$`}!A{AAGiLslMN8@m7ycn-j(<7$ zq_f~f=T3b~NlQWgrj)|J+=_w+ibe|z-cM-muQR+u+9OLjG~-tCEvf{UUUcJYaY$Xh zGODnfT__GLd~A8}B0HyRqGXhv|FkJjky8BkM9w9C%1Culb7#@Jz#;{^G@VpLt`KX# zD%l!XdbzyVxVQLcb;*~M66@QCZC@Rp>@B4;zBKD?Og)jURZ%XYd zv0H;G4(0h99XU$C5h7*RW-`?T=%1 zb)=3~tcttMCdS$Z{zjOJS10v3t2J3F4PiR`bZ0e11xA3;=Nv0vR`IuErO?FX@T-$5 zh`F)iRF`{&1xsy|cd}v)#u7R{5PsTH=-6om&;_8i5Oenn;3dOWSph12l@BVgq3jC8 z>cpekDmr35ZUx*RS9GnxT=-C473)~O5#aU)*hsNe6_~h2!?|S@4=xlIypl40Nmth$ zH?=ZYbA-E#OO958mn>D^*PT!dRevorEo;UU!sc(4^apYxy5WbjCvF`O){LWIA%Z8$ z@c$@+$6@*dsfHtfbyZUSMTmq)m}(Kdux|@lL3#?)pO;egIVZR9N;Oik*)k~Qa9p|) zvqa$fR1s|Pi<+SXy{i3C>DA&9ZL2~BMRyS{T`nY$<+xyLn!nuasj%jql2&;GSgfSH zg3Sk%^tYv1x1sRjE^RFthRh)a|Dsi`a=`t7ePir4<4>R>e;gEgSX zRRQB5*YuL>VNONSyp^HxMXalcIxk`<0On5xqZXYxor(DYFvbK7i8U>nb@`Q$iT#)H zTa-qJE#)0CE~s25CC9d4ZVA;Uxy;u~af_sR;U~cz-^jn^49P{tZy|T(sM!=(HYwnq zRAB8m7s%@pe+e1+0?d*!`n&=)=P5VjQ>+A0Mi3=6 zi>t8)QedGCVWPC(3sdl)QS?WNkzw>n0h_(|>KMSxjG#E`Ufo2xoU)FQ8+O^q!TKp; z?eCn|LPEhHths>viX$r@XPd!S^d4QQKXv7(ZhfQY-Rr+Sw9wb95O|B(Kk9%biU7RO z_Mq}qMX#E!5Fm)qo9JY>ifOt-#l(jUW9dDj;*UMDvZ?b$n6M8ajVc(4%Jg?P z==)0v8xcYp2k#}ddc~z*5)e1TZe1e0C&xEs8wzDcYOVuQVaAwBhAg<=t!$1*NRtXib{h`envq5_PQrwZEWDL`kA*32Qp7l_Al98_ zHi>ZBLe1}JtddJaLuyBc8vx2Ak-XQ%iqw-b#h`3>pn5E0Mn%YO326(vePtGrO&8;eN_<$Vjukr#QGX+ z-?*$H7O>#%;z9Tz4(StW%ZgNz$(K*=#n0PQi@7x&$*XvbGE9&p$kn4$4jx*Y!L=pj zB;9}+?%yy-q9axGBp)N9ABy-1TW8*gO+3_sh*tP&JV?L=n(GNl6-9LZ7IKGs+_<@UKeg`{|VT0x~Mw zx`mK_Dye}H0Lay|zt6%eaO3iDPr3GwBu6|#ib^DSBY?S(lp(}w6fra~SeEj|A~PTl zVmvEF*J+fuFlGJxg*61KLO^~GP^RTpOXB0QVOrvdJqnA?CotlKVE*X=$0W_BVzjFLw#G2BSmtGgTY0d~`NOb7;8m|veg1;H-2*N`0PTIpruPVC^gBp4 zAxvXdIi5d*m{emKC}Axnw(_WPEK){kby+s!6F`ZD(EsXMm2q&5CIv=^;zZ1c za*!&=wIPgFA#ojdF-oM*YL*zWux0E64aJMT+@lo5t@9fKi+v?4Vl9N^;Y0k%5glIZ`u))a)^@C2Mh2*cL=1Zp6x}>}0sFIj4A)tz+6xHC&`^kd-+cHpt8x%U_{+}bTwr6Ziry#b9 z*(Ai(w*cBwOi<2E4Ka3MYZd*S;CU{@c#4cN?~`s}Z#@$+Xxa3SGNQyzUkkxRh1pD( z4*%suf2O34!IVVJPFHT{CD@E2{E+^DcqxW{spv@qf`9tmI*>(afP+ans@XDXpAl#g zul}U%V#Co-c?DQK;QK%+X|I&>9@aEF%0(I0mk{{i4|dy0`Y4BjvfZ7mu|RLZgp9fu zAT+DneaQQ(sx857rH$r6T!sUMvnr;^Yn9bR^#N;_up+59o3XKV>>#JA#heY`Dj1 z5H5gZRg?7VP}rHo$0uyO2Afuet~_K&;f{?&@Y~rLih8r)j0T+QGV2pAQ%693Ob%2&U<{q=|xMQ7T4()o!ajrf`*DKFFw^+83NRb?Scl z!9sO`r02uc}7{?YL9PZGrx$16BwW$Fri`t1W|PjB@ie7jV1J zwWL;E7}s4$y0?mJ`j6kg*P|KTIFK$!NUKPvUqo7BbO=f)CBg=SAp%m;C?P2z z0@CULY1APoA;{=X>Dqt4`+pz&&;R$yeYSW!J_n!J-tX&mUC*n6&6#)`PVX?c8bg^a z7c^&hXQAV@ej?~p=50Z@;~Fe03Zftor=FKrV1XE#$Bh%x_*XQ<;(YrcLLWZhvx*Cx zWfI^DO5hFY;k&77El~F;2w+4X)Yt;TbN$ekH@QCMT5qB>gOk6bvi!FGj@tHD`TuSl zE!6*aiwsdPy$u&`Fx3JlK7=sCsL%->=U7+*KXIWNL*Z;v{INy%oS?YTj#Btlsy{mH zGGWRDxM{>hOkJq5EhXXFry~B_L30uaf0gjmD@rl70+#JvBOXJ=;l8n2c6ZGtMvNh8 zPCJIv_Q7&49n-tw%5UQz*z>H&S5}c#wtaHzu?{$I0a%l}_!cXY3nNDJKK^`nGtZ_51BjA+ySf2EX!2A8N9t~aSY3&n#eDul`Wi1o zNheFW9znxj;}{_SzEP9b#(^+45A8cDO9`ksDEod%60iTj4q?`(ah)Mc+H|6X_V%QT zdy&`oip~^=B@M0o<71b%{C60{3S6_!&R{&U4!|;IcU`TWv~Y!!j@wj;qz)iYasdyu zNEWFhhF5)G9KxZhy0)PcF0p$(0?$0*kmAVifF$rARA9>_=Bu*o!J5Gun{k?1 z%o~RWF==4Y5_-@l2x@rF{SE*pHYqSYL1wHE%6Zc?D|BdyXTlSo@slmvcfpWyEjw8f z($yaZjpWWiJe0dt?gV6vdriNIq|N1m&rAR=Ic7g;c1UAG#00z(XMIQhJY>5_~Ec|Gov$p_)dj^oY z934C6A|h&wviMdl1iU?^!-TAT5lV0a(Ty8>+$4RKg3bZW-p(;lhG^ryU38GPUdbAC z#;0Ez316s_xPH0TFYRL>w=uXY#sIx_pWejSkK}|0Dxr0V=X@A05?zZ0oo{0-uHkpiU*0)~Oc6=7*sP57DG~ z93a9yN#w6TPSLkPx%G`+<+7t-hrT(*z`n}eh(KTfKe3VvRaJJ8d1L+P>Lsr z9+rrmfmaI!ZVoT9BW(h134M#^;#Teej*^m`w1FT>|8cKUB^m?RnB`?=$MEeoQzUQ2 zy0jAD6k?7+D*`a`hXiIx)`+V~#{x?(VBB%G48eKYz`>ti!ThEGbX7GB>GxIP(Bo@B z`c;m*eT(|j`>C{9Xa*+|kdf8IjQCcE1?Y(ZLx71I6l6vT`%fi=U(}CdUB)&29wrF{ zfJLm6QC=By)$Skg&b7NavIR?&Thp9VKld|SFQk+0vtO*z)a>G84dFU0-7QKP;Gc&E znU1nAo%%W$g8-WJ3<=T9LdwNp43zfDFz$wW7e6tpw#wm>N)@NcKb`#F#rMZwGOPBC zMP<-38$`HKK^LzZvIA-xNUyWs!5G}E#X%17yZ5LniqVA%s@hJ;P>0uX2U3ERFJHTg z)^_pc^nsD3vWzBKv*3^vN`q_)-Az~Yp!}MgM5{N>QG`Km^SHYrPMXoIxd6P>3YXvT z!~fU5M#H?)$@-4sz-xE~f(-UvJJj;znp9sYtg2)&qgQYN@in7B5HsP#;GJ1O$tH}OALG??+=}T0 zoS_E&Vc)U|@Unc(<2FAQ-aZ1!C(HnJxRdCpJqz~^!@?2GiDlQ!uf!v=z%r!h-+Y~n z5y{aN|A2m`6gOzJ;&{yXRWcSVmK8vRNEJli@4I$W>^-In7^U_FKSH2iATaC`7$F_e zSAnv%(KK;@P_Fvxq0i|(D}1u>zfWMHG|Ztpu)iTSnVi^-W_mwD?EWx3DGNh0pAn!8 zpF+pb5U_OVEX>rv0uluyiVyUI!#A*IENP+2H&#{fE-P`0$*`x&aKUzXa2E708X!Tb zp)th=a%$Zf2Y#8wSZUycsH(%1Vcf@dH*Zd{u=^VY9ip<2gz__mK(f4xG5MN66-r2 zt8om3?_eotuFqYxyu4x(Au%3=SgSakV_!^CIm!ze<3uUQA+o04>r@sYuyaJ`|h<$Jjvjap!$D{5eW9e*!LcM|f;}p>od%rx^TR&FdUL~78hHtpv z8wuq-27JRl2NQ5E3egNeZKMItqZv2UkJW0Zl+}lsj=zM|Vyz0=__7#;k8z*Qp$ZzE z^i&{gOpJOlHDwoQQviT-MnAyd%=S?k%H6;ntYblpyeBrt8B6&wbGmxR=|#WURnGi& znAJGrYcBAoDwwTCJ#Q8OqI4rOhYiK&)s*k&efz2cU$6V`}3C$UA zhq*rv^K=jM3X8spPRkU-!s6;_5E!~-E>;8vw$s9)kELh{U<5$m8HNS`;6MXL!*HSR z077i(tZ|f$qZzPIYXJ>JgqU5sJ_6GKve#miyQlmC?|$uX-HK|u84aJqgt?KqsiDQ<6&jAiY+cSBlsAq0zv!ze%f$t>A?U1wx& zhZ+a~a8Y5ESw>yh0Gy_l9Ld0pV?iowEUTZ{G!0g>nxYRr*OVTi2?5BK7~JH-GLfpn zNMH{-Q%+>k67^4bZEuD?kddU|@KH^8`WFCUh6urGJq8*b{N!i;$u7nqR}J9$H5{!o zj z%MkVT>#qmxdR%>2tJW(S)i!BH0QxjIHfxxT$>#cM`U{hZ6#$Xdn3pk)X>Mi0(#(p( z5Afduc!()HB(BuKHapuM8(dZKDug^yCsVyKQ+=+ec$_ER8m|2PsBaU_!`ch9~NR( z^>uo4@$c5b-|cCQn^cfp;h9}}$Sox3_h#DbW)lP?uN6A;=(P8^Wajka%vrbN%r5?7 zapv*>ZWe<1>*Sag?zr@gJhRX;0k$MT-AS+@5?2b4{0eQUQ37uy(e{w&ev{~zNGh{H z>cbfu0Kj*h#H={WqC3lKIoo$Zy7&g?*m5-S2hP~fayQQM^vv@9o;?V|UfIEO9OC`P z9R>b6YHM`z>COpR&I!BEiS)2s;hz%|nX_o-;0~IT?3t7LJtw_|=3Q|V+;Y5XDIp^= zFQ+&!uRA|+Fv}t0Ebw~nslmK*#=J`Dyy}vMSdufD%|&f#{^sHQEtu=V?i@11S+mrc zw{}j$azV#^K{v>Czsm*1Fn={-!LV_`sAoYn0?U6qs~Isb`+dQbeete{8(*xm0nA0# za>mSk(K2Y!YKi>!_IDS}L%f!Qn|05k-S0*FnqmI$E(V8i?Qtw4Y0+7c0!dv;+h24n zbyGtAb&Xx}%vkaYdT+AjYFp}t1iN`JEj>J3dUTn8Z^_XhXo&-~9H_he*wRBa#myGx z;`@2=Nyc($>9VWClHzw4Cy}MFrR9i24^Id8;4MeqiKR%zm1tehyN&Khn2X@=oqjJ1l=waUh| zcRg!WzsYOWOKUZUYwuy}we0I3MAqvR*XwoH8!Xp9y013|tvAK4H)pK3l&-fnuDA89 zxBp)Mw6y;DaQzExgTTJgAwtRWZ*=Kye6`%@cHig;+USkl=*!sXFWneu+!*ZH82Y{O zZE55C;l>ZxCXsz}SY-33;^v6%=BVZ7FZa#gL7QW-o8uXq6Q!GzjhlaZHm81XPA_f# zJ=~muZIRfwW<|E<6u0Jew-zk77Tvd&g0_}pw^lN?R!g_m8n@Pawl;omZ7ywX9d2#I zws+XKcSW}M6u1BBZtq)eAGmKH25le3ZXaiCpOkK&Hg2EwY@h$$zF6A6JlrP3b^shZ zKvD7zWyS^8+ksf^Ks|O~!8>sL4prt3b=eM0(++L#4&B%e{qhdO(GDYg7s0X1B)ZG2 zw9BHm%WAdD=CR8jyvu>#<;>jWD%<65+U4op|iDmAIm+eV3?Me3TNsaAEFYn15?OlWaLvj3*75yit^iN*zpMurD z>mL6Uga0Yv|0!qwQz`qW+VoGY_n-RMzZ=W{ZXW%+1>e`;*uO2huc@@JrMItbwXfr` zuN%Cthu_!F+&3uOH*DHB>fJXU+c#O>zjL(zAN;_S2(bL|e@Uf$3%SRDMN0IPj49786^f*fCI9l%*XLTIoaU2_bjK?3xWgb5-JC1KU ze$jiJFm{}{e4KQ2{1SeW%yE(;dXh?^x9gpxTb;b}ILQb;$;6*zWu9c0o#Zr~_N!;5aQ5JuOl?E!I1IYjs-UaatODT82L@&pfRtJFRRweb-Aqtr|P6 zUOufkI(-j6tK~TRAbM7(bXKo-)?jt^(c`Q!_^b(k)|`3PQg+tbbk^2;);@OjY5DB) z(b*UHIf3K6LzDu9I`7gu|7vyK?Qz}{eBO&c@5?;zFFPM-Iv?ykAEE%Pme0Q*o&SJe z5IHV}MK69TU5w~mj9Oj%^0@dNd@)8@r)FMElwC|VUHs|2m>Rp7UcUHybTI?JByn8M zieAnsUC!%WE?8YIdR#6AUoPV>S28bG%P!ZNF4uc6H^weEmoK-DF1O+29S-uYD0xqb z{7;X(Z$&=vARh*kkMQKeZkiKF3=^I6#u z_!`G7YF6dBE7+63trW1avU{~JSx_%k%4<((AYH<$&S!N`cqmKG<7buEKauZws=<33 ztN%oa1)6wfY43fppKlE_<$Txn#YfA{%FL?04U`G^rKg$$mVZ`1IFk9>9(J_1xqftwM2Ld3$oL$i=Dx;r$UodTmR;ye6}?yEb0W7i zl%o{5wQ(Z9LM+ltlkq)OSR1Xhs(-k7dVOQO&SRv;_e^nXsx|oE*5;Yg4yhB*a_!-{ z^4`Kgru?I=bCvy-pJn&nKfF*q+?Z?%+}^rSJKmY=O}qB!Qk{IdzcyC?X#4WU`SITJ z$oog+o0sRONB_3B$+s{-8f7FF${m7?qLyezM$@YvBXLZI$^tQLwjlzsT;9zBc)qY> zfjEJ9Wx?mdIU$1a;+4&UFQi+K1ruZkl&>aUpA5O0q_Wn0_2rGzV@eMTjfzl;4tJh`xDtdLmkYrBM|tjNuLwD|#-`Dps7RdMfrdg_5~1d1V_WUYhOQ zDqfZ!b}C+87_TZ(QIZoTQCU&hD)Fwm^;Dwj!+@$}^~cG`Fv*&hwN}aZpH5FDYddJv zq&{?WKb5NMmuQo!|E78-)i7+RCjIf3?NjN-3GX)Prs=RV>E_vZHJO&hoToCatCejs zZJVuUGVQwqYS%s;Og_E#`DCr_+Lw#dvugw(tvad$$`g+2q?T+)bVCl~?>*I*f~4c*(~3Vo@_*Z(#&Ih{yFWm9Fcal6kZ163 zjs{H2v-GbiO+cIXdNd86M6Hm1k$}CRedXTD&v=P9hWUmcB|0d0o3;HGa4+pUp<-_z z)fAucQo|SV*K?URZJX}==*%~=sz_gaSn3n5YGtleOrt*Ak*k*oHb0 z0UQBtIJ$sc-ASk7l15t${IKl)b1@oyq)zc-H{V0S%2LP2;Lh>M=i*CZE)QuAl@ZkU z=yrirOm{r*KIL-H%62&D4&jSZUW?;c{miu_UR=Q^S%7?x!F}Ez?qWCo$31b3)`6*x|Nv)m^8%@*Fp;4xlA;9rH;IoL4 zaKw}H{ll1Z&;Jw>!WB*YF5UJjh5{?qw)%xv&^lw zuA6zNjDHf=+qXb|gg%9ZtUv>XTU7|Zm@WHKr}s;`)cy%Ymtn#o%v$Peom-YZ^%`{J zhykUetoe9e^|t_@67Y;yZF_;@L|rS@AYIjnsUH2txAHC7Z|XDU&Ul!ppQz29AZJUz zH;$LVRU;-wpB^VEWOCGx;>{8z=s1+k5`WXXk~Gt_bIIYWv3ggZHBQ`ZqCJ`v|4biT zzdn#JHf{2Fm(qmYj%fBsU0iEwUZCOL7>&=got%xn_E5FrwOW!0om5Cc$70oiZ$Nl$ zy?x_E$s=*j_{hYXpjzMmvKz7s*R!6c`M=w$!etC9i;f#~j)56eglgO-0~nHyBR=uS zwEyXTs{c2{>95VZG=`jfTPpxm`l*xB!a-aj=iFaEm$IvtuY z>|&*k+KCYhrFfbJ6Bfp6B@h3w&;>U$v24A^s?!xA$g&{jV%`d1j$e;j)GmXt+}-D` zD~9yuJ;egHOd5^5vusU$-7oskaJF&)XP15tN)8`m-_C`21SX{Ii~Nt3TE~tU#lK$w zeNr{gxU<5i^8G=gzf`TEZ-0UeufF7$xN6 ze$u1=JK(8ITmI`y_-DhL{b}%kB{{G{zfF96a!y0(wP^5=EVaDC*YFo8tLLB6LzBb* z@}$dSqleb?Sq!74-Y7Z-75h94$Srw1tJ1^IU zZ)Kmq0q1AS4S)QvBfm!eU4y;Katm<@|aqD2>ZqZx6qEaKz zuM*xrbLs+0e4>{W?oW1R!dQJ*A)dOvhNG{BS&h{fh4uUmrEF-Pl&?H32bGfwYn=`8zl#Gt`un)8-=B@Y zU0(XI#-n=uzxhMc`IzhP;eXy4b$FY{q&E0_m3ZF1XVu)1WAQ=Df7zwKR5@EjzV4gr zZ}+h^E0e?^|1A3|m+iHY#!$;TV_G*yMz!)rGR<}>KG)aVV0>~U_FkdUN2%K`>w?pB z7HX_deDQbm|9st2tUsc24;-s7Tir^KWzXTH9&@R0qs z)s$jVT0UuLA<(1fk65D8=boWOo?%bH|86pu&9sXfcRd~P^k6xzP z4KdZb51?d{Q>K-jIAm3#uIkDsEsK0FtC}ExHsr5=X?${@fyc5mLbxK}$;5q*ZH6=t z8M&DG{w~-=`lyUo@Z9{5M*(XhhQ`{?nTOan>8fgVZJ|yAN}R-^lGk6~a?mSGKcWf4ub3 zvACRzYpRZNOyxPpcLq*Rq3BRC`jp>!&OR%(CkowP#j0f|l z-bkoBQF%OR=lkx@mYp`wj4yK&NZJkhkvq3SUJG%u_#TibH#HM29Qy6&4gd6}^Cjh` zra;Gsq@cap$;*w-(#yNz&U7mZ~R;u1ziEr>Z#T-&`-weG#(gpwQOQ>R(lM zjRY$T8)wg9a2Yv)go zgKDodb{782U$2Su9sE9**-3u(X^lbk%NKg#Q7I$rk;RiCf3?3`G1-O1GJ3}z9 zJ5Etmut?4*LFK4#!FRSTd?rMm2{lJaiD5C$4lcSFiIFG;>*(h}_Is&r z<;4%G-J@?FN3WVkJTHz`jPkvNUob{vLHU*>Mfpd1|tvR(#4`)tnjvsDZFZaF0c}eg$FM7 zJ}(-_Qj0zMs}x@@7F%l-Rc(o_IF7%0jI(uhH-x=tRF2V8esMD+s%iYivz7P{&Di^K zSZ|mw)-yptKOtHyp|0mead|>hF;aKjcPPa5WBIeOW{!J7(Q~5FV?v$_kcdB29@88# z*C2_6Vr*fC?|}}>yk~fyzO&cwgyz_!zTd91eIDw^E=E>~%Tx&_ONnL~_!%+Wcd@6n zBD|Z{31uOXm(4a}EAit{YY7-W?J#*O1P2XG;p9pNc%?klP3F(WT=h!o@JLn_v!z{? zvN(?F>3J#16&n-ccO^C^zdLN43{QKes6HlwE`0kyQRS{zOxhINvpw7cX84oWx~Y-- zDV$%0>8WFW>0OP9dunkVhtp#hQhAk>>Ev6Q&boBVV%2k}&a=Aa2$jZN*xCEH}j_N5w?`1`elD835E+gPOatI5MNf;eA(81^XT z3WbkkTi^qBLUJF9zIqdo%n!xHKhFun=jwVq?di{nGO!I8iE)^FSUn;5)yDD%b!e+W z*6;q5$X{L=3VD`FnF$}|o{*m_%GKu;=;sht@@J?`m722qyLGYBV~tJ2Zw-^ z@(;!nUq4s9_S0g@GRb7+iOEEMq-WG=_LTzV3>l96;LM1NiL~Y5uniSEZxu?nl>1<} zZ}i<~lc8RZR-gS`dLvMJ=iVyMoff;&OeY?0LGL46n3xanm!Tl6$ZGZJ`a$8Iuy5qD z@}ov)`%<^jar8{D-6K8MSOev2IcUw;$n)zFRh-4DiY12l=xuk5Nxa*22`wkxw<`T^ zJ<5ry;>k?$7#fzD zHS9dFv5#`x^OsF#k4vJeT1%dmrqss&r)V4g zc_Q|V>lKw@;pJO=y2!(K)P)tQRj<8GEc?^Ty+T(r9xt$0-;aNHoSiYcX7o!XYh3(! z!D_(Y0Sn{nHR^7*MG6+ns=@0y(GC?=Tilq#R^7g^fPa;F2Vr7uneQWnYME6kZToF@ zCf*!mSA8?AEn9d``+y^>EcKm!aAT#XUFZ{knh*9ucmK<=vzIHX@#vrWjXf0InX}$7b>6v>?)W;9|Tn)b@KB&gO zO0fyl&uuU?s^PpJEb}0O>ByY^MfE+Snzv>*dBZ;5HG1bz_L2Iu*8Y!~O683~yclWC zC@td4ZDcx2Eto8cRJ(24lEQ4*i1RjbHmJubsuOL| zF|^Hrwpm@{Dd{ib)(a~{V@tEoS_*hti_}_s#d23~zrY-(IY67xl^!(%jXLq+;ce+G zhYlxC!Y5X$Hk)4N_Ow-cwqC$X%iCVeai>(bJ$xG5bSm6JXWM38S<)<7S~1w7V({q; zRVt0mYleyUG-vPK|3r_IjT!)9lpq2z|Y;Ci^kx%j%!pT)iS?_cw2BN>^x_7K%SJv}SHqD2gjpcj$HG zzw<#%eYqQ4HTjgFEn0m}bDbfifXAkTx2jVz+@z4YO<6o^WR;K*qK>3%kUA$2f*aXR zW3ysIPN)g0Ly>Rq5k#Q5dux=2?8G9Gk3T+kYM-m=(iI5un!SAIrF7n*F!bh2rlS5- zCqb{?^0?I^!S>ICFB|V7(cv#uh8i9%XFPeD<5Bg(%g*J2dT$MN{`kZbE{h(K@KQJr z;dWJzs`}gPvR?JGryS&WZ`A3&Y)YDWJa|4Dn!WGYW2M@`{5D`V&9HMV)x{WJE!>Bf z`26a+ckwHaeDCKfT+ti_{m)t!S z_wEH2Q%@w`ud2?%d%A_q+J$ zx!zZGvu@sbGxV&u!cLI-*SE1>v{NwyXbxiaM?>#k6u6j)&F?J&YrE|$J8*{$s-5VOyqt}kK|253oZQq`z;WqxW zuQ-01@HU}q&89cGdPrZoqlmg&EMZI{bt1(i^LhTjYx8sJ^sv*gqQ#;}Y$0s%M z_OH3kBh!C+rQa|wmE0lcv=uB(;rQ=UjTw)ArzC8AI z8-38-a^_c;*hM;fbGCvLkN0j6YZwaYc$C;1c4J9q^OGz8PX?pjC;ZLyi%Xtr$wJc0 z|G`(@i;uk9m=FAH5=B0mh}rzpYUr1qmm`pqCwX}{?Nh!(TXH-@S5!^N-OJpUqN{1I zvv7$kzTX+Ma$G70OZ-zQP8t&dEGeD7>>!X~ZhN3nONW~lo@?T6p~H5vS? z2Qyxo|GakQ)u(M;|M_97*0aLq3oFj5uhw%Tm3gIU2I<^CG(=D39?3L@y#8_L>Gn7A z-R-8aD!koZ+z0=*{`3jgsaA$3$>vX6`wIUPcL236aefJZZ$BaYvW#6uR_c9=^7k2o zmzevBhO6p>CXqkr6SM!@9{Rz%e(y@c-N+x<+{Kglz2xSD{qX~mZ@ta?gO;ip@9ijs zFNY7ezgv+H1Kyka-Z~0;GxF=%QP`DV&R>oq$e+E)M^TR!{BIq{Ufa1Hc^v=Ww#Ap@ zq(>{vm&d8s?9v=hBK{s_yg9k?`Xq1rPd@oXbLP0<%W<9hY3Y}f()TANZ%*@PmaE7o zHRRLkFQ;{mCk>8gX^uzDZ_cn^&I%Y0KVO>!0{?IH(f<#n*8iU!>VK4BF#ym1R)#PB z>D3n8j?Cd7MfB}lNx&nn8sa*L(2np+l)F^(nwC~9iIVV~fD#EM_= zCBnOyF&dxyLA$zz=v$=Zjnust?f#j9le0|zbCDPxyyXd4!maz(u&w>|rmedJD5-m| z=vCG?8{_|ZPd&RQ?=j`BwasULdSpLZ=~f>^e_rn}hkI5J{rg0GhEJ^gmO}5YjP=RC z?|(}oM+q^<)gXWKEJr8!#hIM)f3c1qbQsBi%cD0D-w#Gpogw^vzawZBS^p2U{(ny7 z2qX*i|48f?U78e$J(`L|!mf`ZvE%8oss0a%{X=o@OQcpjuR$F}Vi&ttY1dy@^8ZTg z^`+l(l>^tN`s>SnykT?F;5BS0A1=0TMHv7aDn`moi~mPrul)7Sy54(w;Nv^10!<$G zeltHQ8{EC*B%OhvLbFoG`GI_+rkd%tkbi5_gH7)pQ=PbKggw~{Sw(cR^u<-1tLLL0 zkquuPx6~~TX30PJJ2deK9dj>vJg(Et(33}-P~|39YW2xGoSM6Aj5vk&qU-`NEhtUSzhTODLoO&*3)$v&3VW0hGUz*tq%(>3XA$AOT?Qx=}H zF`Vw@v$4FEOVhXSv0|y!4u<5w%*EsL43c;AWMf#(ab_km4ns=Tw$X{daP;pBe;3J>hQp zlEDMpg%Vv~%YAqJpZ23YFk-iJ)#R3@Ew&udrvr7^4N)KlMV6=YCW9vB zvh*s=qgW`jx7hq08IQgk(@3%Qw;-Gkoh*dMCuEnAIk??aE5I0F1Y^Cf(W^;ii|fE) zeY8`eX=TiLpj6}p0*=>|N+F8DmLS{9W214@NhM!P_UGjC!wG0TzE(xTGS~xNz!1{B zZJktRIHnL*F*_b!7T2NMx@?|Xi83+8(%)Lz>3}f5sZIMKWx@GPs76{^8p^AUknLr4_3L0ACq;2r70^Cz z2J>za;R<~Os1&6xWQ!0hvopYmKGvHoH5HjzAu&8k#%h2b<58|yO4E`S{b5Fl3a%q6 zxVDSQbO*%9>csH4_WqS60CYuNj4q^r#7EvD#XP{$Y;(p=4X zLtlkG#*jRaj7WZq73ToY1c&t_zUo#R+Vd68$ zX?N7bFH+KrvkcmP9aQ=Vh$Q{&71cgX4sT*3m+20*IugsiWeVkQF3@;nJ&MReweps0 zK#dE)t71B_x3Ur+8L4a1yBCn5w@@ok4n#C>5i**SwUE|S!-|7rfEcT~U&wbl_XZ^V zX=bySw>}QUsXZTkpK$lOS$XkI!Y*D_S%WUd6UmW`j^h6XX4Z>~>i0pb2cf`pH*2-k zmi+1D#X3?q(K=k=D4J&rT1;ksQ3~h&3DPTA-ZSMMuHP;~mX{)s-i5^RzFLSJq!wmI zWM)|C#;IYjaLHPYr8o?jIf0Og9Dl`|Q~(m65_qIS=|s!I;3XQ+Hd10@w97;&|AGcY zBMZzOkQ~jqq5%_#(}4VyzzazE(%1%cs68=_5kTUpL#;tnwkRxPSVx{bVg;c905N_= z!pfq{eLRf*Op+%Xuc4C5QWY!Jf9?qf>*xB$%IPSwfZ*OB!4^6{0mkgukEKzllhXJgN=m-C_j%iSuySGW(A zMx79dBJMV=Cl!Kag9u$Qrg#eNuryH`c=-in)*~b+$GR3G7MBcx$4)Z09fC+J0EUpA zYnroiQ9Rz*58q`LI7_OvNEp#-6#uTb}$=b=?A)G{=y{?kl)QOD@dz4Q2O*uf`0 z|21;!gb8i%@G!%Upi}$er_TQlnBK^}eUFG#)?$CCLG@&1p5^a&@AX*x%z0y~u#;Ib zrp^?ss4e#By7JC7wjuO2^>L7A+zt+#7S-S@!03=TOQ$vz#RdRkd^n3nC*7S{e`s_s zZ-Dq&A9SdUD#Nn6Kh!UXK-H6h^ky4T96~+|oC%xsfql_@aXX$8_s=HBzc)5YJ1@o< zo1507faeU|F({s~E0iuoF5?jh%Mbujq|q&1_knTzcmnpjlfrVLHn4lvK^ivD1zj%T^*0h8g?q9PJ6x$1R zvGj`rP^uMw*HYuylu??_o?-32qga~VG(5_)cKNv6J;~4;#H`DDBhYTnt*Nrnu>5+5 z5^Ldn(bLY%&Vd;AK3eL>fUbU>>OJop9pI~&Lxd@*#B{g7j@??*F(t4IwE%#!P<8UP zQtGe2vd}P5VWE#n>!LWoc!<6xttsXgYD%6el*H}jLOevMQ^|_&V93ygFbGZJ#revA zUrx72eTe`=(>SrtW?IE)#VHWyCjkD&q<^9-T{Pob7b7L$2nk_0tECS&<-V;!H4#nU zpG?<_prX^I+riTR@MBmB@_Xg#M}NY>k zkN|**T(YGXA&jLE?VYAT*P|^=0EPd88YOdjCd0K+)`7`TBcjDKgp#j7?(7tJ;)?MeGTX*3P2i!v_OKV7F<5`ym(X#QP9T!Z&*oy6P~&Q5(S{`CBe;*(C4+ZEeQDTJ`Ew6 z?n^E07YyB(9ois2P7H=7=!mw#l&bDFyBPxFgP;k@q-!C)G{ry;fpn~1R9~Z^CZ<$W z*|5n)QGF!ja{=QLO1*wJz9rSfk{qK?~I6WXMJpfY2%pLbUO9vpNl$s)< zAzmTyDzz*trNTZ{PrRB+@b-@RT?_a>rzlh*nhybT^^z&0{QLiu{tLPmkSgU@h~8lq z5g-Bih(OK$K+)fzidCWJ6PejPUVCTde}XdQ6*9yAd0R!fbuF1cRq{t|@-eee3rzla z%ay4X9vfunCp6;;xq#Y&=m{GZ$`SzSAOaKI^0!W2?{K}jk#c`BJHK>1|5%)JW&-kN zhpv-!bE(BJN0ck@DsEH!4OLD7O=|(h34D8}U{4QWW+23BTgV<($eB~fol|H_guVqq z4C@N7W^m1P7KnruiG>wiCs8G#>2M^fObo=O8K+=dtQc0ToKvjYTC5&cEIVGTL<6CD zRithERyXXe-Cgj0?c03};~)jlPyiyzm6#ir2#}s_29#J=mRQ@CIGmO^gq5Iaq#IO9 z&EwyC=9GH3mfq?B8@Ik~G==dLfLfqn{tqGqY*}clqZENDu(K4yT}~+%Qz(4Hwl~tB#$c)npWM$$bFlCzUmI*M4B0DO=9$)=+)>@TNDIohcZAZZ*4q_4;Y)KBhcA zo+)bp1oZ=J7C?NE5N9MLr~vW=4LcZsnNX7SrXbGbGARU~B&;HthF7u?D1-(pp4Zb2TZhu_!{3rtC zy^5@{cu}wV?muCpj4hh?4Xx$9lTP9VfJO}C!xxMur;TVdXb{6VM*!=hYpHnnz{8~v!&&>y4(YMCuFsob}W^n;r$Fo^?j zff#rQ5pF@eE_U~+(+)h61eHc5eCO15NX|&zy>2q7oodw3+SbO&1U4hWjZq)1ci={~ z4Rs1|mN}+jCsR*!=IHJ-8`B8e`^@}}tsz9{``qXcYH$w(_+ur=jr;({L;BR<&6ITt z;x(mSt^I5~$+!xjM-v+NYw6sPpu<5h>OROJfRfh#a*F^i>G=XKfUIgzxFH~(THq}r zh=$Oth6JetK*wi{$iXsAuFODZWs2D<0I4$^YjvBJm$UJKK?Zo_1=B+oZBG&u84H6x z?&O<&+{>yRN@}&&40ue0dl8|o7`Pw7y5(u!JMWKonm|9~-v1Fy|1MGO2dw!jP$Et& zudJ*zW~w(1*Ln@(tEB0c9c*(@ZxB6eql@CbhpLj zzmxKdnt(lJC01?ApFpKNVbwfkfuI7?)AE4Ia?yl}>m&e}5{W@VMl~3F`~V0)kUEj@ z?*YsWS$sSQI+X;?#X``gkb`v)2l9h=?dL``>}xng9SIpsX4p*z=$H>8dLq0-55O2SEgK&=#FrXaVagd3NLsd07M;3K^iLNV(4*BCNq}H`-w$f`T zz%>M|c>A33eF<2$;J;OMCA~Jy(6Gl-;SDUiwsNQ%S<_+Lb!+;Io}?#4J+%s(V2GqC z#5ozJjQYsG`N`p^TPm^AX$mK1*<<9_GeMU$5l2};xt~daW`{$0t>2dn zFBlHjvej@@kN9|I}Oxsx$l`6;=a06xK7%+TcTEjxwiXfr#!Sc2r5%*E0t1Sa6^})P&VN*y&@nC(K4_z%z5BsGK!aXyK8`Fv}69{%SBc z;f@7q%1Hi>8VA@0VA2~fP**uFi1`7+DoP{+>x>7vcECJHQ0vfVXgk9@M28Y;5KrIK zLjb4S6O3{gF36;bo`Q*2&&G`=8J{J8?{awH|JjNub+&rd?U-kbWrB&pbLB34d4xKtWI7t_am12iesDu1I)-2A2saek8K0bc6}+Z??DMFgONJyI z{!v(v4EQgEfDC8x^+d}NLlRU`Pzufi`eWzk{ingn@JD`AUv8`m0G7VfPxY}v(`n&0 z=mEFf0pEx*v$Jv}ajXaMzbL!+cqae&fBd_4u-RrChGEzoM-Fq$95?5plF$f^C`q+Y z(LvV^j)@UMs*y@kNhe9YH^(W-DXG+ZgeaAcZ^}F0eGcE-@ALcTd;5O>+aJ5_+U<5- zdtKL_ujljrfO-;O7L>o{IM@ItY7WFdsRp)hz>jiaN9m8hNR+f8k5m6VS18?%1X#u% zYyuOtE(z-k33_-|U@@>Yo-0J0z2mb%DRCNj3x~TApn(wNrY86SW}s3EoNx2tf!>D= zjgKqS|&eQ5+IATDr{FSi?y7auG;CQ=gMnp{kBxn1LFx^D(7w>{K_rZ z<%KVc?YzndZz`DztezaO=2F%@VS^-CckuZgmL1t7&y{q}#k&PPh^OMB`kfbeBgqv9${c zufNZ&(!6(ad@ov$`zi7BWRb&&noXAWSim+EKQxzRcDfxr@1hn^Z&*arJZw~;3Rav) zX$*+Gb8xMwjY>`zxj;UnA$_M%^}P-?+xpXha*c<$z9w5mv~WIOD+=XRJL~2=S8yqg zgw7|%v1>fc&I#?-nqR7GUc2ggr(K}c-Kpk4o4?@pLAE`{H-qe-`lOnx)eWpFYAX~N z=FH~b1hI@<3D3D^7HrRIMKwO|&RRZ{`-E1ziM5imoX+7Hl?1b6;g$g@u|n;6(c9c( zb&uk%O}~ufby$-_72u;6H&)3thdCiOUrzUeU!3Kl8x+)_AgAHeEI&ufi56GrkWw#Q zRrAR>_~M0pBU*%6MEWk@Y4jw%aJ~X{z6kgi8bm*Yvd7wXWv60=vV|K7NV#9IBCNLD z_U)ag@@Vi@`urjQHJi;t6838a8=grkc)>&Bea0j=(4x?4H32r*WnKV(2uYQX<(XRgV%GY@2^=Y383JhL3YWygx;%b}CUpuvp-{K5Y z(r;WQdqh9JqCLZW+otp9h;+!oZa;M;+tI3V0>NnK@H$MqAgZ~le-B7~tU{t}5r5ic z9rybYpQt0oM(`wl@=-I*f`KW5IU*4tRgJeO+2R+V=Gr0}ONMM+dgRhb;MhvkBQw$_bL?6v|kSE zNvgar8ddD4xE@ha*-O}>B{PNDrA;6#8lWhV5NYRAg9@Y-jW0u7?z4csX#=Ox3-+p$ z1!5E%6=~4Q?R?}oR9qyCH#T9cSsOl7Qqoo(S`Ja~n+DQqKS1VEIIWNM?204UuQ8GT zxct?*=K%3?tq4Kb` z)z$A2h7z25Ot5856Ax9;e0($Uru{q74jer-d>?74XjVn_XoyUkaH-U1Ny<~9Rh$eP zqIXS@0@&zZf!KzQK)W`UnUR<<`lq;tl&+GTNIs2=8}PdoCWVsG-ssxwx|Rv?{(X;F z1}iP=H3)OKLx%%S{)shr4SQE|uxnS$kJil(e?Gf@>8|2!9}S0_e|oybG!5dm;WxgA%|t=% zmGGG$v#;$jR(ZL=QM3SauQPJ;VrTih;6nAW6uW-~Or=N(j5=nx+BK22HwZeD17> z0j-6hNN@V8qJf4{oj%Ed!5fg%zq$i06RBAYQ+?Ga2;1(|i@qIxsa4M!XC|XgG-dl* z*1kOCXPW~e^4{}LdAdNKzK^#pO99d=3IKHnK8!-TV zC6ffG$#YbqKM~_!h;r^fmAyXEU_!jpuNn9Nn6=m#+xBH4+gdb>XQ$^;5U1Yh;loUa zd%a09pOALdJ))(J`-cYv_D=Cs%tr9YKDY9m)$rjp<|Lp?buO`B$4dHJVbLM|JJV4I ztEd1_uwx4uR+-jlbl($Pd$3E&%+r)&(e>9kldN1j@(fa!3$`!VW=2(u?>}x@x7W1w zb-?DiT0>Na!DRUQcamxR(R!o0ytilFxD&7KV)<>00w7JD!L+!}fhzLP>(JK>MJ_Kp zihl;;1>7Q_Q}Fw~rws+A6(_(DJt`WCS~+}as)MOa^_|>v=`sJ}$$O@TiZ*UtjI$A? zqR^MmZ)viRIr*1$08GdBN?)EtmC5&%6xVA5n|=!nUs=95&3BbyN(TTf-TUTs?H0G% zS9N;H?vc$GVYdTYH9Azaz~h)UiARekZ2`2XDmL>Gtk9y|)ku|gLa5BetFXf}^5nh# zR)GiAx;{=9xv6H71MT_UVj{kFP2||KO<_Z=GM;db*;h4ef9}h@{BI)Vm?1u9S>P(I znB*t}v7LFBnSf=7WmBb0jcFs(*)wtOpxPqt)xwo{SvN_Q|@{00>kTsK$4rj?w5c`N{ zd73m}(46RNpKHBur|11KNJl_HC-WSa<<}v8{Q1?1m72g-H>?J!53_g<({utOR_R;> zdXwvujZaRZfEy+E7V0r5UF%eb+$+m&svvy;%j-I6x(0|kV}KBiGkP=}uo$NC=9 z^)yJfLs%aa=EnGP@k(|h=3NGGbfia~uK!-=+S8GB(`~e)@#Wrq>u!HRL(OpmQ$eRk z`ae$ffBL@uL4N=7=9^!f*FDDq8kABE6wh=G@TPCw-|^z?>%WZlB7kk?GObWU=PCorCL=@t!y)(kg3c{R0mU>W&_d}pt@(}Tt$oqAu? zY2~<$*v>>+=NLp)Z=*gP+X3NqCDUF}2D6iZZikJ#?bj(U_x}f0@@!CVdQktwn*2G~ z-+(pwL9n`uNB4-|7a6c&=Q$mV^&zKiR1<;W_&&{wp{;EpU7S9hM4nDC&pe?odtt~X z!PDl)puO*~L)h?&W5Tf0iE3_VNB{Un4GB`ZU@Z*_Srt)03dXjU4wAnN{WTKOAtf=N z6sNm{TJ0b9O&IapKjNPi>KLZ$aDr#c&Qge&RE~fo*`%9Q(nT7v)p%Amba@y$65#tR zH0)Ve!n5%G&-^C=l!Cwb#nX89c29ipgj~ z!szz>qdT%jW3!rUr+FH;pLutcw2q-h3r6?+7~Q*nI3L2Bhd)m_(d&~SVm)}UPp_~Q z!ndx69x5nVU( zG8`yILOj4zF+vn+48W4m}&awjXm_dwq=~ z`n>zgn?JyC?V>N1kt!!&-q47Wy?9Yf$W?@sQ3jd{_qjh8@JaMX*LwNZGJcOqE{O)U z;xt`ZfIf%yqG8bIC!yjoyeSB!u%Vq@9YoY??6;Rj0prrL*Dr2+9gT)k>iLgO04i^b zENJ|dfoC}F0mU9xw3T!8;F7N8*ji0C-vY8`=3|sqJ(R-1jGl?24FF|Lc@{19V+g(u z9phd1`irl6h3rNR3T7vAIj(GadI4`%3e!xsH*G3kT>+c8g6q2na~U}9k$7)48+BjA zXP~OxK!I~{9wFBibq{8j4%J0N+qZ<&e}zU(gn#XlV}D+GX@2f&i-2BV_-p*`Y9>q( zajvnZvA#mUX!=`8w*+#JfO=(-)udhB>}|sZwCQK^w#5FvdOpq^>PF)e>iM21nAp

;IM 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

(C|-p5d~FCwPiU|G>$%7%i~IrC_u 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

Ez;aL1mc)O6M0WN?`4F^m%S` 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 z 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%0A4j6UlJQ92WL}nci_#WR`g8oh_2Z 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 K|I7P@!2beYr6->N literal 0 HcmV?d00001 diff --git a/assets/thoth_dark.svg b/assets/thoth_dark.svg new file mode 100644 index 0000000..5bb8ab2 --- /dev/null +++ b/assets/thoth_dark.svg @@ -0,0 +1,601 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/thoth_light.svg b/assets/thoth_light.svg new file mode 100644 index 0000000..28ba11d --- /dev/null +++ b/assets/thoth_light.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo.tape b/demo.tape index a0e5a23..3031cf3 100644 --- a/demo.tape +++ b/demo.tape @@ -5,7 +5,7 @@ # Everything runs against a throwaway demo database (see scripts/seed-demo.sh), # so your real history never appears. -Output demo.gif +Output assets/demo.gif Require tth diff --git a/docs/features.md b/docs/features.md new file mode 100644 index 0000000..c63a6cd --- /dev/null +++ b/docs/features.md @@ -0,0 +1,169 @@ +# Features + +A deeper reference for what Thoth does. Run `tth --help` or `tth --help` for the +exact flags of any command. + +- [Capturing commands](#capturing-commands) +- [Searching](#searching) +- [Workspaces](#workspaces) +- [Themes](#themes) +- [Other commands](#other-commands) +- [Configuration](#configuration) + +## Capturing commands + +Once the shell integration is enabled (`tth install`), every command you run is recorded +with its context: + +- the command text, working directory, and inferred project (the enclosing git repo) +- the exit code and how long it took +- the active tags and the active workspace, if any + +Thoth's own commands (`tth`, `tth-sw`, `tth-tag`, ...) are never recorded. You can keep +other commands out of your history with a regex filter (see [History filter](#history-filter)), +which is the recommended way to avoid storing secrets. Everything is stored in a local +SQLite database under `~/.local/share/thoth/`. + +## Searching + +### From the command line + +`tth search [QUERY]` does a full-text search with optional filters: + +```sh +tth search cargo --project thoth --exit fail --since 2h +``` + +Filters: `--project`, `--tag` (repeatable), `--exit ok|fail|any`, `--duration '>30'`, +`--since`, `--until`, `--session`, `--limit`. Project and tag matches are +case-insensitive (project also matches as a substring). + +### Interactive TUI + +Press **`Ctrl-R`** (or run `tth`) to open the finder. As you type, the list filters live +with fuzzy matching across the command, project, directory, and tags. A preview pane on the +right shows the full details of the highlighted entry. + +#### Modes (vim-style) + +The finder is modal. **Insert** is the default (type to filter); `Esc` drops you into +**Normal** for navigation and actions. + +| Key | Mode | Action | +| -------------- | ------ | --------------------------------------- | +| _type_ | Insert | Filter the list live | +| `Enter` | both | Run the selected command | +| `Tab` | Insert | Put the command on your prompt to edit | +| `Esc` | Insert | Switch to Normal mode | +| `j` / `k` | Normal | Move down / up (arrows work too) | +| `d` | Normal | Delete the selected command | +| `e` | Normal | Edit the selected command | +| `i` or `/` | Normal | Return to Insert mode | +| `:` | Normal | Open the filter cmdline | +| `?` | Normal | Open help | +| `q` | Normal | Quit | + +#### Filter cmdline + +In Normal mode, press **`:`** to open a floating cmdline and type a filter expression: + +``` +project:thoth exit:fail since:2h +``` + +| Field | Matches | +| -------------------- | ---------------------------------------- | +| `project:` / `p:` | Project name | +| `tag:` / `t:` | Tag (repeatable) | +| `exit:ok` / `fail` | Exit status | +| `since:` / `until:` | Time window (e.g. `since:2h`) | +| `dur:>30` | Duration in seconds (`>`, `<`, `=`) | + +Any free text becomes the fuzzy query. The active filters are shown as chips at the bottom. +Press `Enter` to apply, `Esc` to cancel. + +#### Tabs + +Use the `←`/`→` arrows to switch between the **History** tab and the **Workspaces** tab. + +## Workspaces + +A workspace is a named, ordered set of commands you can replay later. + +```sh +tth-sw deploy # start recording into the "deploy" workspace +# ... run your commands ... +tth-ew # stop recording +tth workspaces # list your workspaces +``` + +In the TUI, switch to the **Workspaces** tab: the left pane lists your workspaces and the +right pane shows the commands of the selected one in order. Press `Enter` to replay the +whole sequence in your shell (you confirm first). The commands run one after another, each +in its recorded directory. + +## Themes + +Thoth ships 7 built-in themes: `default`, `ember`, `frost`, and the Catppuccin flavors: +`latte`, `frappe`, `macchiato`, and `mocha`. + +```sh +tth theme list # show available themes (built-in + your own) +tth theme mocha # switch theme +``` + +Define your own theme as a file in `~/.config/thoth/themes/.toml`: + +```toml +extends = "mocha" # optional: start from a built-in +selection_bg = "#b4befe" # override any slot +accent = "blue" +``` + +Colors accept hex (`#rrggbb`), ANSI names (`red`, `brightblue`), or a 256-color index. +Slots: `selection_bg`, `selection_fg`, `accent`, `dim`, `border`, `ok`, `fail`, `project`, +`command`, `header`, `controls`, `directory`, `tags`. + +## Other commands + +| Command | What it does | +| ------------------------------------ | ------------------------------------------------------------------- | +| `tth sessions` | List work sessions (commands grouped by terminal session) | +| `tth stats` | Insights: top commands/projects, success rate, busiest hour, error-prone tools | +| `tth export` | Export matching commands as a runnable bash script | +| `tth forget` | Delete recent commands from history | +| `tth tag` / `tth-tag` / `tth-untag` | Manage active tags | +| `tth prompt` | Instructions to show active tags in your prompt | +| `tth doctor` | Diagnostics: hooks installed, database, theme, prompt visibility | +| `tth config` | Show or edit the configuration (`tth config set `) | + +## Configuration + +Configuration lives in `~/.config/thoth/config.toml` (created by `tth install`). All +settings are optional. + +```toml +[session] +gap_minutes = 30 # inactivity gap that starts a new session + +[tui] +orientation = "bottom" # "bottom" or "top" +columns = ["timestamp", "duration", "exit", "project", "command"] + +[search] +default_limit = 50 +# columns = [...] # columns for `tth search` +# filter = ["^ls$"] # hide matching commands from search results + +[history] +# filter = ["--password", "export .*TOKEN"] # never record matching commands + +[theme] +name = "default" +``` + +### History filter + +`[history] filter` is a list of regular expressions; any command matching one is **never +recorded**. By default it ignores Thoth's own commands; add your own patterns to keep +secrets out of your history. From 55ba4acea834f605f9f4a4b963caa19eeceeea56 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 15:28:06 -0600 Subject: [PATCH 149/151] docs: polish commit-convention guide --- docs/commit-convention.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/commit-convention.md b/docs/commit-convention.md index 7988b7e..1d7c10f 100644 --- a/docs/commit-convention.md +++ b/docs/commit-convention.md @@ -27,7 +27,7 @@ This project follows [Conventional Commits 1.0.0](https://www.conventionalcommit | `feat` | A new feature visible to the user or CLI consumer | | `fix` | A bug fix | | `docs` | Documentation only changes | -| `style` | Formatting, whitespace — no logic change | +| `style` | Formatting, whitespace - no logic change | | `refactor` | Code change that is neither a fix nor a feature | | `perf` | Performance improvement | | `test` | Adding or updating tests | From d0418c064076e059ba373bfcec5bf518efc8479f Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 15:33:48 -0600 Subject: [PATCH 150/151] chore: set version to 0.1.0-rc.1 for release dry run --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a7b7583..45796cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1033,7 +1033,7 @@ dependencies = [ [[package]] name = "thoth" -version = "0.1.0" +version = "0.1.0-rc.1" dependencies = [ "assert_cmd", "clap", diff --git a/Cargo.toml b/Cargo.toml index 01f30ae..f7b5e4b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "thoth" -version = "0.1.0" +version = "0.1.0-rc.1" edition = "2021" description = "An intelligent shell history that captures commands with context and makes them searchable" license = "MIT" From b1ddae3027e3fc6a115d9e22ba541307ec91c128 Mon Sep 17 00:00:00 2001 From: JoseVelazcoH Date: Sun, 28 Jun 2026 15:46:18 -0600 Subject: [PATCH 151/151] chore: release 0.1.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45796cc..a7b7583 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1033,7 +1033,7 @@ dependencies = [ [[package]] name = "thoth" -version = "0.1.0-rc.1" +version = "0.1.0" dependencies = [ "assert_cmd", "clap", diff --git a/Cargo.toml b/Cargo.toml index f7b5e4b..01f30ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "thoth" -version = "0.1.0-rc.1" +version = "0.1.0" edition = "2021" description = "An intelligent shell history that captures commands with context and makes them searchable" license = "MIT"

0V?Gt97MJw*b^n9NWx2-9i+LS^%m_QGnzgoL; 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�%c9$djciY4QE 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