use katra_core::{CaptureOptions, fnv1a};
use serde::{Deserialize, Serialize};
pub const TRACE_MAGIC: [u8; 8] = *b"KATRATRC";
pub const FORMAT_VERSION: u32 = 1;
pub const SCHEMA_STRING: &str = "\
katra-trace-v1\n\
header: magic[8] u32 version u32 header_len bincode(TraceHeader)\n\
records: repeated u32 len + bincode(TraceRecord)\n\
TraceHeader: format_version u32, schema_hash u64, tool_version string,\n\
capture_options CaptureOptions, start_wall_ns u64, start_mono_ns u64,\n\
process_id u64, workload string, host HostInfo, notes Vec<string>\n\
TraceRecord: Event(TraceEvent) | EpochMarker{label, ts_mono_ns, ts_wall_ns}\n\
| Counter{name, value, ts_mono_ns} | SessionSummary(TraceSummary)\n\
TraceEvent: seq, ts_mono_ns, ts_wall_ns, thread_id, process_id, scope, kind,\n\
phase, span_id, request_id, causes Vec<u64>, resource, payload,\n\
cost_estimate_ns, confidence\n\
Enums serialized by variant index; append-only evolution.\n";
pub const SCHEMA_HASH: u64 = fnv1a(SCHEMA_STRING.as_bytes());
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct HostInfo {
pub kernel: Option<String>,
pub os: Option<String>,
pub cpu_model: Option<String>,
pub cpu_cores: Option<u32>,
pub ram_bytes: Option<u64>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TraceHeader {
pub format_version: u32,
pub schema_hash: u64,
pub tool_version: String,
pub capture_options: CaptureOptions,
pub start_wall_ns: u64,
pub start_mono_ns: u64,
pub process_id: u64,
pub workload: String,
pub host: HostInfo,
pub notes: Vec<String>,
}