Skip to main content

roboticus_pipeline/
personality.rs

1//! Runtime personality state for prompt assembly.
2//!
3//! Loaded from workspace OS/firmware files at startup. The pipeline
4//! reads `os_text` and `firmware_text` during inference input build.
5
6use roboticus_core::personality::{self, OsIdentity, OsVoice};
7
8/// Assembled personality state derived from workspace personality files.
9pub struct PersonalityState {
10    pub os_text: String,
11    pub firmware_text: String,
12    pub identity: OsIdentity,
13    pub voice: OsVoice,
14}
15
16impl PersonalityState {
17    pub fn from_workspace(workspace: &std::path::Path) -> Self {
18        let os = personality::load_os(workspace);
19        let fw = personality::load_firmware(workspace);
20        let operator = personality::load_operator(workspace);
21        let directives = personality::load_directives(workspace);
22
23        let os_text =
24            personality::compose_identity_text(os.as_ref(), operator.as_ref(), directives.as_ref());
25        let firmware_text = personality::compose_firmware_text(fw.as_ref());
26
27        let (identity, voice) = match os {
28            Some(os) => (os.identity, os.voice),
29            None => (
30                OsIdentity {
31                    name: String::new(),
32                    version: "1.0".into(),
33                    generated_by: "none".into(),
34                },
35                OsVoice::default(),
36            ),
37        };
38
39        Self {
40            os_text,
41            firmware_text,
42            identity,
43            voice,
44        }
45    }
46
47    pub fn empty() -> Self {
48        Self {
49            os_text: String::new(),
50            firmware_text: String::new(),
51            identity: OsIdentity {
52                name: String::new(),
53                version: "1.0".into(),
54                generated_by: "none".into(),
55            },
56            voice: OsVoice::default(),
57        }
58    }
59}