#[derive(Debug, Clone)]
pub(crate) struct FileEvent {
pub(crate) line_no: usize,
pub(crate) turn_index: usize,
pub(crate) timestamp_utc: Option<String>,
pub(crate) kind: EventKind,
}
#[derive(Debug, Clone)]
pub(crate) enum EventKind {
FullSnapshot {
content: String,
total_lines: usize,
source: SnapSource,
},
PartialRead {
start_line: usize,
lines: Vec<String>,
total_lines: usize,
},
Edit {
hunks: Vec<EditHunk>,
original_file: Option<String>,
structured_patch: Option<Vec<PatchHunk>>,
},
IntegrityError { kind: IntegrityKind, raw: String },
BashTouch { verb: String },
ExternalEdit { snippet: Vec<(usize, String)> },
HistorySnapshotMarker,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum SnapSource {
Write,
FullRead,
FileAttachment,
}
impl SnapSource {
pub(crate) fn label(self) -> &'static str {
match self {
SnapSource::Write => "write",
SnapSource::FullRead => "full-read",
SnapSource::FileAttachment => "file-attachment",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum IntegrityKind {
ModifiedSinceRead,
NotReadYet,
}
#[derive(Debug, Clone)]
pub(crate) struct EditHunk {
pub(crate) old_string: String,
pub(crate) new_string: String,
pub(crate) replace_all: bool,
}
#[derive(Debug, Clone)]
pub(crate) struct PatchHunk {
pub(crate) old_start: usize,
pub(crate) old_lines: usize,
pub(crate) new_lines: usize,
pub(crate) lines: Vec<String>,
}
#[derive(Debug)]
pub(crate) struct ScanResult {
pub(crate) session_id: String,
pub(crate) is_subagent: bool,
pub(crate) parent_session_id: String,
pub(crate) events: Vec<FileEvent>,
pub(crate) skipped_lines: usize,
}