1use mimirs_core::{AgentId, BlockId, IdentityManifold, MemoryBlock, MimirError};
8use serde::{Deserialize, Serialize};
9
10pub mod identity;
11pub mod manifold;
12pub mod tree;
13pub use identity::Identity;
14pub use manifold::{KnotRegion, ManifoldIndex};
15pub use tree::ClusterNode;
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct Yggdrasil {
20 pub identity: IdentityManifold,
22 pub strategic_horizon: Vec<mimirs_core::GoalId>,
24 pub epoch: u64,
26}
27
28impl Yggdrasil {
29 pub fn new(agent_id: AgentId) -> Self {
31 Self {
32 identity: IdentityManifold {
33 id: agent_id,
34 beliefs: Vec::new(),
35 values: Vec::new(),
36 personality_manifold: vec![0.0; 128],
37 strategy: "Persistent autonomous exploration.".to_string(),
38 blocks: std::collections::HashMap::new(),
39 },
40 strategic_horizon: Vec::new(),
41 epoch: 0,
42 }
43 }
44
45 pub fn attach_block(&mut self, block: MemoryBlock) -> Result<BlockId, MimirError> {
47 let block_id = block.id;
48 self.identity.blocks.insert(block.id, block);
49 self.epoch += 1;
50
51 Ok(block_id)
52 }
53
54 pub fn list_blocks(&self) -> Vec<MemoryBlock> {
56 self.identity.blocks.values().cloned().collect()
57 }
58
59 pub fn detach_block(&mut self, block_id: BlockId) -> Result<MemoryBlock, MimirError> {
61 self.identity
62 .blocks
63 .remove(&block_id)
64 .ok_or_else(|| MimirError::NotFound(format!("Block {} not found", block_id)))
65 }
66
67 pub fn vaxa(&mut self, manifold_drift: &[f32]) {
72 for (i, &drift) in manifold_drift.iter().enumerate() {
74 if i < self.identity.personality_manifold.len() {
75 self.identity.personality_manifold[i] += drift;
76 }
77 }
78 self.epoch += 1;
79 }
80
81 pub fn skoda(&self) -> &IdentityManifold {
83 &self.identity
84 }
85}