use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum MilestoneId {
IntelligenceReady,
FirstMemory,
FirstRecall,
#[serde(rename = "first-concept")]
FirstPage,
GraphAlive,
SecondAgent,
}
impl MilestoneId {
pub fn as_str(&self) -> &'static str {
match self {
MilestoneId::IntelligenceReady => "intelligence-ready",
MilestoneId::FirstMemory => "first-memory",
MilestoneId::FirstRecall => "first-recall",
MilestoneId::FirstPage => "first-concept",
MilestoneId::GraphAlive => "graph-alive",
MilestoneId::SecondAgent => "second-agent",
}
}
}
impl FromStr for MilestoneId {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"intelligence-ready" => Ok(MilestoneId::IntelligenceReady),
"first-memory" => Ok(MilestoneId::FirstMemory),
"first-recall" => Ok(MilestoneId::FirstRecall),
"first-concept" => Ok(MilestoneId::FirstPage),
"graph-alive" => Ok(MilestoneId::GraphAlive),
"second-agent" => Ok(MilestoneId::SecondAgent),
_ => Err(format!("unknown milestone id: {}", s)),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MilestoneRecord {
pub id: MilestoneId,
pub first_triggered_at: i64,
pub acknowledged_at: Option<i64>,
pub payload: Option<serde_json::Value>,
}