use std::time::SystemTime;
pub use pctx_registry::events::*;
use serde::Deserialize;
use crate::{Diagnostic, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum TypecheckOutcome {
#[serde(rename = "passed")]
Passed,
#[serde(rename = "failed")]
Failed { diagnostics: Vec<Diagnostic> },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TypeCheckEvent {
pub started_at: SystemTime,
pub ended_at: SystemTime,
pub outcome: TypecheckOutcome,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ExecutionEvent {
#[serde(rename = "type_check")]
TypeCheck(TypeCheckEvent),
#[serde(rename = "mcp_tool_call")]
McpToolCall(McpToolCallEvent),
#[serde(rename = "callback_invocation")]
CallbackInvocation(CallbackInvocationEvent),
}
impl ExecutionEvent {
pub fn started_at(&self) -> SystemTime {
match self {
ExecutionEvent::TypeCheck(e) => e.started_at,
ExecutionEvent::McpToolCall(e) => e.started_at,
ExecutionEvent::CallbackInvocation(e) => e.started_at,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionTrace {
pub code: String,
pub started_at: SystemTime,
pub ended_at: SystemTime,
pub events: Vec<ExecutionEvent>,
}
impl Default for ExecutionTrace {
fn default() -> Self {
Self {
code: String::new(),
started_at: SystemTime::UNIX_EPOCH,
ended_at: SystemTime::UNIX_EPOCH,
events: Vec::new(),
}
}
}