1use 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
11pub struct AliceRuntimeContext {
15 pub agent_loop: AgentLoop,
17 pub agent: Agent,
19 pub backend: Arc<dyn AgentBackend>,
21 pub memory_service: Arc<MemoryService>,
23 pub skill_composer: Option<SkillPromptComposer>,
25 pub skill_token_budget: usize,
27 pub default_model: String,
29}
30
31impl AliceRuntimeContext {
32 #[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 #[must_use]
56 pub const fn agent_loop(&self) -> &AgentLoop {
57 &self.agent_loop
58 }
59
60 #[must_use]
62 pub const fn agent(&self) -> &Agent {
63 &self.agent
64 }
65
66 #[must_use]
68 pub fn backend(&self) -> &Arc<dyn AgentBackend> {
69 &self.backend
70 }
71
72 #[must_use]
74 pub const fn memory_service(&self) -> &Arc<MemoryService> {
75 &self.memory_service
76 }
77
78 #[must_use]
80 pub const fn skill_composer(&self) -> Option<&SkillPromptComposer> {
81 self.skill_composer.as_ref()
82 }
83
84 #[must_use]
86 pub const fn skill_token_budget(&self) -> usize {
87 self.skill_token_budget
88 }
89
90 #[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}