use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct SummaryRecord {
pub id: String,
pub session_id: String,
pub created_at: DateTime<Utc>,
pub title: String,
pub body: String,
pub files: Vec<String>,
pub decisions: Vec<String>,
pub next_steps: Vec<String>,
pub tool_calls: u64,
}
impl SummaryRecord {
pub(crate) fn searchable_text(&self) -> String {
let mut t = String::with_capacity(self.title.len() + self.body.len() + 16);
t.push_str(&self.title);
t.push('\n');
t.push_str(&self.body);
t
}
}
#[derive(Debug, Clone)]
pub(crate) struct SummaryCandidate {
pub session_id: String,
pub created_at: DateTime<Utc>,
pub title: String,
pub body: String,
pub files: Vec<String>,
pub decisions: Vec<String>,
pub next_steps: Vec<String>,
pub tool_calls: u64,
pub has_content: bool,
}
impl SummaryCandidate {
pub(crate) fn into_record(self, seq: u32) -> SummaryRecord {
let short = self
.session_id
.split('-')
.next()
.unwrap_or(&self.session_id);
SummaryRecord {
id: format!("{short}-{seq:04}"),
session_id: self.session_id,
created_at: self.created_at,
title: self.title,
body: self.body,
files: self.files,
decisions: self.decisions,
next_steps: self.next_steps,
tool_calls: self.tool_calls,
}
}
}