use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Entry {
pub timestamp: DateTime<Utc>,
pub agent: String,
#[serde(default)]
pub mode: Option<String>, pub model: String,
pub session_id: String,
pub tool: String,
pub file: String, pub abs_file: String,
#[serde(default)]
pub prompt: Option<String>,
#[serde(default = "default_acceptance")]
pub acceptance: String,
#[serde(default)]
pub lines: Vec<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub old: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub new: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_preview: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_lines: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub edit_count: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub edits: Option<Vec<EditPair>>,
#[serde(skip)]
pub committed: bool,
#[serde(skip)]
pub commit_hash: String,
#[serde(skip)]
pub batch_author: String,
}
fn default_acceptance() -> String {
"verbatim".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EditPair {
pub old: String,
pub new: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommittedBatch {
pub schema_version: String,
pub commit: String,
pub author: String,
pub committed_at: DateTime<Utc>,
pub entries: Vec<Entry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotesRecord {
pub version: String,
pub commit: String,
pub generated_at: DateTime<Utc>,
#[serde(default)]
pub contributors: Vec<NotesContributor>,
#[serde(default)]
pub files: Vec<NotesFileAttribution>,
#[serde(default)]
pub trace_ids: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotesContributor {
pub id: String,
pub agent: String,
pub model: String,
pub session_ref: String,
#[serde(default)]
pub intent: String,
#[serde(default)]
pub prompt_excerpt: String,
#[serde(default)]
pub prompt_hash: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotesFileAttribution {
pub path: String,
pub tool: String,
pub contributor_id: String,
#[serde(default)]
pub ranges: Vec<(u32, u32)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LedgerRecord {
pub sha: String,
pub ts: DateTime<Utc>,
pub agent: String,
pub model: String,
pub session_id: String,
#[serde(default)]
pub author: Option<String>,
#[serde(default)]
pub files_touched: Vec<String>,
#[serde(default)]
pub lines: HashMap<String, Vec<(u32, u32)>>,
#[serde(default)]
pub prompt_excerpt: String,
#[serde(default)]
pub prompt_hash: String,
#[serde(default)]
pub files_read: Vec<String>,
#[serde(default)]
pub intent: Option<String>,
#[serde(default)]
pub trust: Option<u8>,
#[serde(default)]
pub flags: Vec<String>,
#[serde(default)]
pub tool: Option<String>,
#[serde(default)]
pub mode: Option<String>,
}