Skip to main content

aether_core/core/
agent_deps.rs

1use crate::core::AgentRegistry;
2use crate::events::{AgentObserver, DynObserverFactory, TraceContext};
3use aether_auth::{OAuthCredentialStorage, SigV4Signers};
4use llm::CodexProvider;
5use llm::parser::ModelProviderParser;
6use std::sync::Arc;
7
8/// Cross-cutting dependencies threaded to every agent a run spawns — the root
9/// agent and any sub-agents created by in-memory MCP servers. Bundling them
10/// keeps the plumbing through builders and servers a single value.
11#[derive(Clone, Default)]
12pub struct AgentDeps {
13    oauth_credential_store: Option<Arc<dyn OAuthCredentialStorage>>,
14    codex: Option<CodexProvider>,
15    model_providers: Arc<ModelProviderParser>,
16    pub sigv4_signers: SigV4Signers,
17    pub observer_factory: Option<DynObserverFactory>,
18    /// Remote trace these agents continue, set by whoever handled the request
19    /// that spawned them.
20    pub parent_trace_context: Option<TraceContext>,
21    pub agent_registry: AgentRegistry,
22    pub session_affinity_key: Option<String>,
23}
24
25impl AgentDeps {
26    pub fn new(
27        oauth_credential_store: Arc<dyn OAuthCredentialStorage>,
28        observer_factory: Option<DynObserverFactory>,
29    ) -> Self {
30        let codex = CodexProvider::new(Arc::clone(&oauth_credential_store));
31        Self {
32            oauth_credential_store: Some(oauth_credential_store),
33            model_providers: Arc::new(ModelProviderParser::default().with_codex_provider(codex.clone())),
34            codex: Some(codex),
35            observer_factory,
36            ..Self::default()
37        }
38    }
39
40    /// Continue `parent`'s trace in every agent built from these deps.
41    pub fn with_parent_trace_context(mut self, parent: Option<TraceContext>) -> Self {
42        self.parent_trace_context = parent;
43        self
44    }
45
46    pub fn with_agent_registry(mut self, registry: AgentRegistry) -> Self {
47        self.agent_registry = registry;
48        self
49    }
50
51    pub fn with_session_affinity_key(mut self, key: impl Into<String>) -> Self {
52        self.session_affinity_key = Some(key.into());
53        self
54    }
55
56    pub fn oauth_credential_store(&self) -> Option<&Arc<dyn OAuthCredentialStorage>> {
57        self.oauth_credential_store.as_ref()
58    }
59
60    pub fn model_providers(&self) -> &ModelProviderParser {
61        &self.model_providers
62    }
63
64    pub async fn forget_cached_credentials(&self) {
65        if let Some(codex) = &self.codex {
66            codex.forget_cached_token().await;
67        }
68    }
69
70    /// A fresh observer isolated to one agent, if a factory is configured.
71    pub fn observer(&self, agent_name: &str) -> Option<Box<dyn AgentObserver>> {
72        self.observer_factory
73            .as_ref()
74            .map(|factory| factory.agent(Some(agent_name), self.parent_trace_context.as_ref()))
75    }
76}