#![allow(dead_code)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Event {
#[serde(rename = "pipe.started")]
PipeStarted(PipeStarted),
#[serde(rename = "pipe.completed")]
PipeCompleted(PipeCompleted),
#[serde(rename = "pipe.aborted")]
PipeAborted(PipeAborted),
#[serde(rename = "node.started")]
NodeStarted(NodeStarted),
#[serde(rename = "node.completed")]
NodeCompleted(NodeCompleted),
#[serde(rename = "node.failed")]
NodeFailed(NodeFailed),
#[serde(rename = "gate.passed")]
GatePassed(GatePassed),
#[serde(rename = "iteration.started")]
IterationStarted(IterationStarted),
}
impl Event {
pub fn event_type(&self) -> &'static str {
match self {
Event::PipeStarted(_) => "pipe.started",
Event::PipeCompleted(_) => "pipe.completed",
Event::PipeAborted(_) => "pipe.aborted",
Event::NodeStarted(_) => "node.started",
Event::NodeCompleted(_) => "node.completed",
Event::NodeFailed(_) => "node.failed",
Event::GatePassed(_) => "gate.passed",
Event::IterationStarted(_) => "iteration.started",
}
}
pub fn run_id(&self) -> &str {
match self {
Event::PipeStarted(e) => &e.run_id,
Event::PipeCompleted(e) => &e.run_id,
Event::PipeAborted(e) => &e.run_id,
Event::NodeStarted(e) => &e.run_id,
Event::NodeCompleted(e) => &e.run_id,
Event::NodeFailed(e) => &e.run_id,
Event::GatePassed(e) => &e.run_id,
Event::IterationStarted(e) => &e.run_id,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum NodeKind {
Command,
Prompt,
Bash,
Loop,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum GateMethod {
Hook,
HumanCli,
McpTool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ErrorKind {
HostMissing,
Timeout,
Blocked,
GateFailed,
GateTimeout,
Crash,
MaxIterationsExceeded,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeError {
pub kind: ErrorKind,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Input {
pub key: String,
pub value: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipeStarted {
pub id: String,
pub ts: String,
pub run_id: String,
pub pipe: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub inputs: Vec<Input>,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub distro_version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipeCompleted {
pub id: String,
pub ts: String,
pub run_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipeAborted {
pub id: String,
pub ts: String,
pub run_id: String,
pub reason: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeStarted {
pub id: String,
pub ts: String,
pub run_id: String,
pub node_id: String,
pub kind: NodeKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeCompleted {
pub id: String,
pub ts: String,
pub run_id: String,
pub node_id: String,
pub output_path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeFailed {
pub id: String,
pub ts: String,
pub run_id: String,
pub node_id: String,
pub error: NodeError,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GatePassed {
pub id: String,
pub ts: String,
pub run_id: String,
pub node_id: String,
pub gate: String,
pub method: GateMethod,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stdout: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IterationStarted {
pub id: String,
pub ts: String,
pub run_id: String,
pub node_id: String,
pub iteration: u32,
pub byte_offset: u64,
}