use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::Arc;
use crate::Notification;
use crate::UndoManager;
#[derive(Clone, Debug, Default, serde::Serialize, serde::Deserialize)]
pub struct KnowledgeState {
pub thoughts: Vec<String>,
pub actions: Vec<String>,
pub context: HashMap<String, String>,
pub last_query_results: Vec<KnowledgeId>,
#[serde(alias = "items")]
pub fragments: std::collections::HashMap<KnowledgeId, KnowledgeFragment>,
pub nodes: Vec<TemporalNode>,
pub edges: Vec<TemporalEdge>,
pub realm: Realm,
pub last_pointer_pos: [f32; 2],
pub pointer_velocity: [f32; 2],
pub odin_focus: Option<String>,
pub agent_attention: HashMap<String, f32>,
#[serde(skip)]
pub component_states: HashMap<u64, Arc<std::sync::RwLock<dyn std::any::Any + Send + Sync>>>,
#[serde(skip)]
pub undo_manager: UndoManager,
#[serde(default)]
pub notifications: Vec<Notification>,
#[serde(default)]
pub notification_center_visible: bool,
#[serde(default)]
pub modifiers_shift: bool,
#[serde(default)]
pub modifiers_ctrl: bool,
#[serde(default)]
pub modifiers_alt: bool,
#[serde(default)]
pub modifiers_logo: bool,
#[serde(default)]
pub performance_overlay_visible: bool,
}
impl KnowledgeState {
pub fn apply_decay(&mut self, decay_factor: f32) {
for node in &mut self.nodes {
node.weight *= decay_factor;
}
for state in self.component_states.values() {
if let Ok(mut lock) = state.write()
&& let Some(v) = lock.downcast_mut::<f32>()
{
*v = (*v * decay_factor).max(1.0);
}
}
}
pub fn reinforce(&mut self, node_ids: &[String], boost: f32) {
for node in &mut self.nodes {
if node_ids.contains(&node.id) {
node.weight += boost;
}
}
}
pub fn update_pointer(&mut self, new_pos: [f32; 2]) {
self.pointer_velocity = [
new_pos[0] - self.last_pointer_pos[0],
new_pos[1] - self.last_pointer_pos[1],
];
self.last_pointer_pos = new_pos;
}
}
pub type KnowledgeId = String;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KnowledgeFragment {
pub id: String,
pub summary: String,
pub source: String,
pub created_at: u64,
pub accessed_count: u32,
pub content: Option<String>,
}
impl KnowledgeFragment {
pub fn new(id: String, summary: String, source: String) -> Self {
Self {
id,
summary,
source,
created_at: 0,
accessed_count: 0,
content: None,
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum MemoryLayer {
Episodic,
Semantic,
Procedural,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize, Default)]
pub enum Realm {
Midgard,
#[default]
Asgard,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AnnouncementPriority {
Polite,
Assertive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemporalNode {
pub id: String,
pub fragment_id: KnowledgeId,
pub timestamp: u64,
pub layer: MemoryLayer,
pub weight: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemporalEdge {
pub source: String,
pub target: String,
pub relation: String,
pub weight: f32,
}