use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum HarnessSource {
Agents,
Mpm,
Code,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum LifecycleEvent {
SessionStarted {
session_id: String,
project: String,
},
SessionDone {
session_id: String,
status: String,
},
SessionCancelled {
session_id: String,
},
PmThinking {
session_id: String,
text: String,
},
PmDelegating {
session_id: String,
agent: String,
task_preview: String,
},
AgentSpawned {
session_id: String,
agent: String,
},
AgentMessage {
session_id: String,
agent: String,
text: String,
},
AgentDone {
session_id: String,
agent: String,
status: String,
},
AgentFailed {
session_id: String,
agent: String,
error: String,
},
ToolCalled {
session_id: String,
tool: String,
preview: String,
},
ToolResult {
session_id: String,
tool: String,
preview: String,
},
AstOperation {
session_id: String,
op: String,
detail: String,
},
PhaseStarted {
session_id: String,
phase: String,
},
PhaseDone {
session_id: String,
phase: String,
status: String,
},
PhaseSkipped {
session_id: String,
phase: String,
persona: String,
},
PersonaDetected {
session_id: String,
persona: String,
},
LlmRequested {
session_id: String,
agent_name: String,
model: String,
prompt_tokens: Option<u32>,
},
LlmResponded {
session_id: String,
agent_name: String,
model: String,
completion_tokens: Option<u32>,
latency_ms: u64,
},
AgentStarted {
session_id: String,
agent_name: String,
runner_type: String,
},
ReportGenerated {
session_id: String,
agent_name: String,
word_count: usize,
status: String,
},
RecapGenerated {
session_id: String,
summary: String,
table_rows: Vec<(String, String)>,
},
}
impl LifecycleEvent {
pub fn session_id(&self) -> Option<&str> {
match self {
LifecycleEvent::SessionStarted { session_id, .. }
| LifecycleEvent::SessionDone { session_id, .. }
| LifecycleEvent::SessionCancelled { session_id }
| LifecycleEvent::PmThinking { session_id, .. }
| LifecycleEvent::PmDelegating { session_id, .. }
| LifecycleEvent::AgentSpawned { session_id, .. }
| LifecycleEvent::AgentMessage { session_id, .. }
| LifecycleEvent::AgentDone { session_id, .. }
| LifecycleEvent::AgentFailed { session_id, .. }
| LifecycleEvent::ToolCalled { session_id, .. }
| LifecycleEvent::ToolResult { session_id, .. }
| LifecycleEvent::AstOperation { session_id, .. }
| LifecycleEvent::PhaseStarted { session_id, .. }
| LifecycleEvent::PhaseDone { session_id, .. }
| LifecycleEvent::PhaseSkipped { session_id, .. }
| LifecycleEvent::PersonaDetected { session_id, .. }
| LifecycleEvent::LlmRequested { session_id, .. }
| LifecycleEvent::LlmResponded { session_id, .. }
| LifecycleEvent::AgentStarted { session_id, .. }
| LifecycleEvent::ReportGenerated { session_id, .. }
| LifecycleEvent::RecapGenerated { session_id, .. } => Some(session_id),
}
}
}