use super::*;
#[allow(dead_code)]
#[derive(Debug, Clone, Deserialize)]
pub struct Record {
#[serde(default)]
pub r#type: Option<String>,
#[serde(default)]
pub uuid: Option<String>,
#[serde(default, rename = "parentUuid")]
pub parent_uuid: Option<String>,
#[serde(default)]
pub timestamp: Option<String>,
#[serde(default, rename = "sessionId")]
pub session_id: Option<String>,
#[serde(default)]
pub cwd: Option<String>,
#[serde(default)]
pub version: Option<String>,
#[serde(default, rename = "gitBranch")]
pub git_branch: Option<String>,
#[serde(default)]
pub slug: Option<String>,
#[serde(default, rename = "parentLastUuid")]
pub parent_last_uuid: Option<String>,
#[serde(default, rename = "contextLength")]
pub context_length: Option<u64>,
#[serde(default, rename = "isSidechain")]
pub is_sidechain: Option<bool>,
#[serde(default, rename = "isCompactSummary")]
pub is_compact_summary: Option<bool>,
#[serde(default, rename = "isMeta")]
pub is_meta: Option<bool>,
#[serde(default, rename = "isVisibleInTranscriptOnly")]
pub is_visible_in_transcript_only: Option<bool>,
#[serde(default)]
pub subtype: Option<String>,
#[serde(default)]
pub content: Option<serde_json::Value>,
#[serde(default, rename = "compactMetadata")]
pub compact_metadata: Option<serde_json::Value>,
#[serde(default, rename = "logicalParentUuid")]
pub logical_parent_uuid: Option<String>,
#[serde(default)]
pub message: Option<Message>,
#[serde(default, rename = "toolUseResult")]
pub tool_use_result: Option<Box<serde_json::value::RawValue>>,
#[serde(default)]
pub attachment: Option<Box<serde_json::value::RawValue>>,
#[serde(default)]
pub snapshot: Option<serde_json::Value>,
#[serde(default)]
pub csift: Option<String>,
#[serde(default, rename = "csiftPhase")]
pub csift_phase: Option<String>,
#[serde(default, rename = "csiftKind")]
pub csift_kind: Option<String>,
#[serde(default, rename = "csiftKey")]
pub csift_key: Option<String>,
#[serde(default, rename = "csiftMcpServer")]
pub csift_mcp_server: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Message {
#[serde(default)]
pub role: Option<String>,
#[serde(default)]
pub content: Option<Content>,
#[serde(default)]
pub model: Option<serde_json::Value>,
#[serde(default)]
pub usage: Option<Box<serde_json::value::RawValue>>,
}
#[derive(Debug, Clone, Copy, Default, Deserialize)]
#[serde(default)]
pub struct TokenUsage {
pub input_tokens: Option<u64>,
pub output_tokens: Option<u64>,
pub cache_read_input_tokens: Option<u64>,
pub cache_creation_input_tokens: Option<u64>,
}
impl Message {
#[must_use]
pub fn token_usage(&self) -> Option<TokenUsage> {
let raw = self.usage.as_ref()?;
serde_json::from_str(raw.get()).ok()
}
#[must_use]
pub fn model_id(&self) -> Option<&str> {
self.model.as_ref().and_then(serde_json::Value::as_str)
}
}
#[derive(Debug, Default, Deserialize)]
#[serde(default)]
pub(crate) struct TurProbe {
pub(crate) r#type: Option<serde_json::Value>,
#[serde(rename = "filePath")]
pub(crate) file_path: Option<serde_json::Value>,
#[serde(rename = "persistedOutputPath")]
pub(crate) persisted_output_path: Option<serde_json::Value>,
pub(crate) status: Option<serde_json::Value>,
#[serde(rename = "isAsync")]
pub(crate) is_async: Option<serde_json::Value>,
pub(crate) answers: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(untagged)]
pub enum Content {
Text(String),
Blocks(Vec<Block>),
}
#[allow(dead_code)]
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Block {
Text {
#[serde(default)]
text: String,
},
Thinking {
#[serde(default)]
thinking: String,
#[serde(default)]
signature: Option<String>,
},
RedactedThinking {
#[serde(default)]
data: String,
},
ToolUse {
#[serde(default)]
id: Option<String>,
#[serde(default)]
name: Option<String>,
#[serde(default)]
input: Option<serde_json::Value>,
},
ToolResult {
#[serde(default, rename = "tool_use_id")]
tool_use_id: Option<String>,
#[serde(default)]
content: Option<serde_json::Value>,
#[serde(default)]
is_error: Option<bool>,
},
Image {
#[serde(default)]
source: Option<serde_json::Value>,
},
#[serde(other)]
Unknown,
}
pub const ELICITATION_MARKER: &str = "elicitation-marker-v1";