use super::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum Role {
User,
Assistant,
}
impl Role {
pub(crate) fn label(self) -> &'static str {
match self {
Role::User => "user",
Role::Assistant => "assistant",
}
}
pub(crate) fn cap(self) -> usize {
match self {
Role::User => USER_CAP,
Role::Assistant => ASST_CAP,
}
}
pub(crate) fn head_frac(self) -> f64 {
match self {
Role::User => USER_HEAD_FRAC,
Role::Assistant => ASST_HEAD_FRAC,
}
}
}
#[derive(Debug, Clone)]
pub(crate) struct TurnUnit {
pub(crate) line_no: usize,
pub(crate) role: Role,
pub(crate) full_chars: usize,
pub(crate) text: String,
pub(crate) newline_positions: Vec<u32>,
pub(crate) ts_utc: Option<String>,
pub(crate) also_in_summary: bool,
pub(crate) from_sidecar: bool,
pub(crate) inbound: Option<crate::model::InboundComm>,
pub(crate) survival: &'static str,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum AgentPos {
First,
Middle,
Last,
}
#[derive(Debug, Clone)]
pub(crate) struct AgentMsg {
pub(crate) unit: TurnUnit,
pub(crate) pos: AgentPos,
pub(crate) preceding_tool_calls: usize,
pub(crate) preceding_failed: usize,
}
#[derive(Debug, Clone)]
pub(crate) struct TurnSlice {
pub(crate) turn_index: usize,
pub(crate) user: Option<TurnUnit>,
pub(crate) tool_calls: usize,
pub(crate) image_ids: Vec<String>,
pub(crate) agents: Vec<AgentMsg>,
pub(crate) compactions_before: usize,
pub(crate) is_automation: bool,
pub(crate) automation: Option<crate::model::AutomationTrigger>,
}
impl TurnSlice {
pub(crate) fn is_round_trip(&self) -> bool {
self.user.is_some() && !self.agents.is_empty()
}
pub(crate) fn is_human_round_trip(&self) -> bool {
self.is_round_trip() && !self.is_automation
}
pub(crate) fn assistant_eot(&self) -> Option<&TurnUnit> {
self.agents.last().map(|a| &a.unit)
}
pub(crate) fn assistant_eot_mut(&mut self) -> Option<&mut TurnUnit> {
self.agents.last_mut().map(|a| &mut a.unit)
}
}
#[derive(Debug, Clone)]
pub(crate) struct SummaryInfo {
pub(crate) line_no: usize,
pub(crate) fingerprints: Vec<String>,
pub(crate) body_chars: usize,
pub(crate) mode: Option<crate::model::SummarizeMode>,
}
#[derive(Debug)]
pub(crate) struct ScanResult {
pub(crate) session_id: String,
pub(crate) is_subagent: bool,
pub(crate) parent_session_id: String,
pub(crate) turns: Vec<TurnSlice>,
pub(crate) summaries: Vec<SummaryInfo>,
pub(crate) abandoned_openers: Vec<usize>,
pub(crate) skipped_lines: usize,
}