use chrono::Local;
use std::fs::{create_dir_all, OpenOptions};
use std::io::Write;
use std::path::PathBuf;
use crate::agent::truncation::safe_head;
#[allow(dead_code)]
pub struct TranscriptLogger {
log_dir: PathBuf,
session_file: PathBuf,
}
#[allow(dead_code)]
impl Default for TranscriptLogger {
fn default() -> Self {
Self::new()
}
}
impl TranscriptLogger {
pub fn new() -> Self {
let log_dir = crate::tools::file_ops::hematite_dir().join("logs");
let _ = create_dir_all(&log_dir);
let today = Local::now().format("%Y-%m-%d").to_string();
let session_file = log_dir.join(format!("{}.log", today));
Self {
log_dir,
session_file,
}
}
pub fn log_user(&self, input: &str) {
self.append_two("[USER] ", input);
}
pub fn log_agent(&self, output: &str) {
if let Ok(mut file) = OpenOptions::new()
.create(true)
.append(true)
.open(&self.session_file)
{
if output.len() > 500 {
let _ = writeln!(
file,
"[AGENT] {}... [TRUNCATED {} bytes]",
safe_head(output, 500),
output.len()
);
} else {
let _ = writeln!(file, "[AGENT] {}", output);
}
}
}
pub fn log_system(&self, event: &str) {
self.append_two("[SYSTEM] ", event);
}
fn append_two(&self, prefix: &str, body: &str) {
if let Ok(mut file) = OpenOptions::new()
.create(true)
.append(true)
.open(&self.session_file)
{
let _ = writeln!(file, "{}{}", prefix, body);
}
}
}