Skip to main content

alice_runtime/
context.rs

1//! Alice runtime context.
2
3use std::sync::Arc;
4
5use alice_core::memory::service::MemoryService;
6use bob_adapters::skills_agent::SkillPromptComposer;
7use bob_runtime::{Agent, agent_loop::AgentLoop};
8
9use crate::agent_backend::AgentBackend;
10
11/// Fully wired Alice runtime context.
12///
13/// Fields are public for test construction. Prefer getter methods in production code.
14pub struct AliceRuntimeContext {
15    /// Agent loop with slash-command support and tape recording.
16    pub agent_loop: AgentLoop,
17    /// Bob Agent for high-level Session-based interaction.
18    pub agent: Agent,
19    /// Agent backend abstraction (bob-agent or acp-agent).
20    pub backend: Arc<dyn AgentBackend>,
21    /// Local memory service.
22    pub memory_service: Arc<MemoryService>,
23    /// Skill prompt composer (None when skills disabled).
24    pub skill_composer: Option<SkillPromptComposer>,
25    /// Token budget for skill prompt injection.
26    pub skill_token_budget: usize,
27    /// Default model id.
28    pub default_model: String,
29}
30
31impl AliceRuntimeContext {
32    /// Create a new runtime context.
33    #[must_use]
34    pub fn new(
35        agent_loop: AgentLoop,
36        agent: Agent,
37        backend: Arc<dyn AgentBackend>,
38        memory_service: Arc<MemoryService>,
39        skill_composer: Option<SkillPromptComposer>,
40        skill_token_budget: usize,
41        default_model: String,
42    ) -> Self {
43        Self {
44            agent_loop,
45            agent,
46            backend,
47            memory_service,
48            skill_composer,
49            skill_token_budget,
50            default_model,
51        }
52    }
53
54    /// Agent loop with slash-command support and tape recording.
55    #[must_use]
56    pub const fn agent_loop(&self) -> &AgentLoop {
57        &self.agent_loop
58    }
59
60    /// Bob Agent for high-level Session-based interaction.
61    #[must_use]
62    pub const fn agent(&self) -> &Agent {
63        &self.agent
64    }
65
66    /// Agent backend abstraction (bob-agent or acp-agent).
67    #[must_use]
68    pub fn backend(&self) -> &Arc<dyn AgentBackend> {
69        &self.backend
70    }
71
72    /// Local memory service.
73    #[must_use]
74    pub const fn memory_service(&self) -> &Arc<MemoryService> {
75        &self.memory_service
76    }
77
78    /// Skill prompt composer (None when skills disabled).
79    #[must_use]
80    pub const fn skill_composer(&self) -> Option<&SkillPromptComposer> {
81        self.skill_composer.as_ref()
82    }
83
84    /// Token budget for skill prompt injection.
85    #[must_use]
86    pub const fn skill_token_budget(&self) -> usize {
87        self.skill_token_budget
88    }
89
90    /// Default model id.
91    #[must_use]
92    pub fn default_model(&self) -> &str {
93        &self.default_model
94    }
95}
96
97impl std::fmt::Debug for AliceRuntimeContext {
98    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
99        f.debug_struct("AliceRuntimeContext")
100            .field("default_model", &self.default_model)
101            .field("skills_active", &self.skill_composer.is_some())
102            .finish_non_exhaustive()
103    }
104}