vik 0.1.0

Vik is an issue-driven coding workflow automation tool.
//! Append-only JSONL writer for decoded `AgentEvent`s.
//!
//! Wraps `tracing_appender::non_blocking` so writes never block the
//! session task: events are queued, a worker thread flushes to disk,
//! and `_guard` keeps the worker alive for the writer's lifetime.

use std::fs::File;
use std::io::{Result, Write};
use std::path::Path;

use tracing_appender::{
  non_blocking,
  non_blocking::{NonBlocking, WorkerGuard},
};

use crate::agent::AgentEvent;

pub(super) struct JsonlWriter {
  writer: NonBlocking,
  _guard: WorkerGuard,
}

impl JsonlWriter {
  pub(super) fn open(file: &Path) -> Result<Self> {
    // Append-only so a session that respawns (not a feature today, but
    // not impossible) cannot truncate prior history.
    let (writer, _guard) = non_blocking(File::options().append(true).create(true).open(file)?);

    Ok(Self { writer, _guard })
  }

  pub(super) fn write(&mut self, event: &AgentEvent) -> Result<usize> {
    let json = serde_json::to_vec(event)?;
    let len = json.len() + 1;

    self.writer.write_all(&json)?;
    self.writer.write_all(b"\n")?;

    Ok(len)
  }
}