use crate::message::Message;
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use std::collections::HashMap;
pub trait State: Clone + Send + Sync + Serialize + DeserializeOwned + 'static {
type Update: StateUpdate;
fn apply(&mut self, update: Self::Update);
}
pub trait StateUpdate:
Clone + Send + Sync + Serialize + DeserializeOwned + std::fmt::Debug + Default + 'static
{
}
pub trait CoreStateUpdate: StateUpdate {
fn from_messages(messages: Vec<Message>) -> Self;
}
pub trait CoreState: State {
fn messages(&self) -> &[Message];
fn messages_mut(&mut self) -> &mut Vec<Message>;
fn iterations(&self) -> u32;
fn set_iterations(&mut self, n: u32);
fn thread_id(&self) -> &str;
fn context(&self) -> &ExecutionContext;
fn context_mut(&mut self) -> &mut ExecutionContext;
fn runtime_result_metadata(&self) -> HashMap<String, serde_json::Value> {
HashMap::new()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionContext {
pub agent_id: String,
#[serde(default)]
pub matrix_c_value: Option<f64>,
#[serde(default)]
pub matrix_completion: Option<f64>,
#[serde(default)]
pub awareness_summary: Option<String>,
#[serde(default)]
pub metadata: HashMap<String, serde_json::Value>,
}
impl ExecutionContext {
pub fn new(agent_id: impl Into<String>) -> Self {
Self {
agent_id: agent_id.into(),
matrix_c_value: None,
matrix_completion: None,
awareness_summary: None,
metadata: HashMap::new(),
}
}
}