use crate::connection_services::{ProviderCredentialStore, UserConnectionResolver};
use crate::delegation_services::{
SessionCreationAuthority, SubagentNestingPolicy, SubagentSpawnStore,
};
use crate::event_emitter::EventEmitter;
use crate::events::EventRequest;
use crate::execution_loading::{AgentStore, SessionStore};
use crate::image_services::ImageArtifactStore;
use crate::session_files::SessionFileSystem;
use crate::session_services::{
LeasedResourceStore, SessionResourceRegistry, SessionScheduleStore, SessionStorageStore,
};
use crate::tool_execution::{BudgetChecker, PaymentAuthority};
use crate::typed_id::{SessionId, WorkspaceId};
use std::any::{Any, TypeId};
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
#[derive(Clone, Default)]
pub struct ReasoningEffortHandle {
inner: Arc<std::sync::RwLock<Option<everruns_provider::model::ReasoningEffort>>>,
}
impl ReasoningEffortHandle {
pub fn new() -> Self {
Self::default()
}
pub fn with_effort(effort: everruns_provider::model::ReasoningEffort) -> Self {
Self {
inner: Arc::new(std::sync::RwLock::new(Some(effort))),
}
}
pub fn set(&self, effort: Option<everruns_provider::model::ReasoningEffort>) {
let mut guard = self.inner.write().unwrap_or_else(|e| e.into_inner());
*guard = effort;
}
pub fn get(&self) -> Option<everruns_provider::model::ReasoningEffort> {
let guard = self.inner.read().unwrap_or_else(|e| e.into_inner());
*guard
}
}
impl std::fmt::Debug for ReasoningEffortHandle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ReasoningEffortHandle")
.field("effort", &self.get())
.finish()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ToolContextService {
SessionFileSystem,
SessionStorageStore,
ImageArtifactStore,
ProviderCredentialStore,
UtilityLlmService,
McpInvoker,
EgressService,
MessageRetriever,
SessionStore,
AgentStore,
ConnectionResolver,
ScheduleStore,
SubagentSessionDelegate,
LeasedResourceStore,
SessionResourceRegistry,
SessionTaskRegistry,
EventEmitter,
CapabilityRegistry,
ToolRegistry,
OrgId,
BudgetChecker,
PaymentAuthority,
SessionCreationAuthority,
SubagentSpawnStore,
ReasoningEffortHandle,
}
impl ToolContextService {
pub const fn name(self) -> &'static str {
match self {
Self::SessionFileSystem => "SessionFileSystem",
Self::SessionStorageStore => "SessionStorageStore",
Self::ImageArtifactStore => "ImageArtifactStore",
Self::ProviderCredentialStore => "ProviderCredentialStore",
Self::UtilityLlmService => "UtilityLlmService",
Self::McpInvoker => "McpInvoker",
Self::EgressService => "EgressService",
Self::MessageRetriever => "MessageRetriever",
Self::SessionStore => "SessionStore",
Self::AgentStore => "AgentStore",
Self::ConnectionResolver => "ConnectionResolver",
Self::ScheduleStore => "SessionScheduleStore",
Self::SubagentSessionDelegate => "SubagentSessionDelegate",
Self::LeasedResourceStore => "LeasedResourceStore",
Self::SessionResourceRegistry => "SessionResourceRegistry",
Self::SessionTaskRegistry => "SessionTaskRegistry",
Self::EventEmitter => "EventEmitter",
Self::CapabilityRegistry => "CapabilityRegistry",
Self::ToolRegistry => "ToolRegistry",
Self::OrgId => "OrgId",
Self::BudgetChecker => "BudgetChecker",
Self::PaymentAuthority => "PaymentAuthority",
Self::SessionCreationAuthority => "SessionCreationAuthority",
Self::SubagentSpawnStore => "SubagentSpawnStore",
Self::ReasoningEffortHandle => "ReasoningEffortHandle",
}
}
}
#[derive(Clone, Default)]
pub struct ToolContextServices {
pub file_store: Option<Arc<dyn SessionFileSystem>>,
pub storage_store: Option<Arc<dyn SessionStorageStore>>,
pub image_store: Option<Arc<dyn ImageArtifactStore>>,
pub provider_credential_store: Option<Arc<dyn ProviderCredentialStore>>,
pub utility_llm_service: Option<Arc<dyn crate::UtilityLlmService>>,
pub mcp_invoker: Option<Arc<dyn crate::McpToolInvoker>>,
pub egress_service: Option<Arc<dyn crate::EgressService>>,
pub message_retriever: Option<Arc<dyn crate::message_retriever::MessageRetriever>>,
pub session_store: Option<Arc<dyn SessionStore>>,
pub agent_store: Option<Arc<dyn AgentStore>>,
pub connection_resolver: Option<Arc<dyn UserConnectionResolver>>,
pub schedule_store: Option<Arc<dyn SessionScheduleStore>>,
pub subagent_delegate: Option<Arc<dyn crate::subagent_delegation::SubagentSessionDelegate>>,
pub extensions: ToolContextExtensions,
pub leased_resource_store: Option<Arc<dyn LeasedResourceStore>>,
pub session_resource_registry: Option<Arc<dyn SessionResourceRegistry>>,
pub session_task_registry: Option<Arc<dyn crate::session_task::SessionTaskRegistry>>,
pub event_emitter: Option<Arc<dyn EventEmitter>>,
pub capability_registry: Option<crate::capabilities::CapabilityRegistry>,
pub tool_registry: Option<Arc<crate::tools::ToolRegistry>>,
pub org_id: Option<crate::typed_id::OrgId>,
pub network_access: Option<crate::network_access::NetworkAccessList>,
pub budget_checker: Option<Arc<dyn BudgetChecker>>,
pub payment_authority: Option<Arc<dyn PaymentAuthority>>,
pub session_creation_authority: Option<Arc<dyn SessionCreationAuthority>>,
pub subagent_spawn_store: Option<Arc<dyn SubagentSpawnStore>>,
pub subagent_nesting_policy: SubagentNestingPolicy,
pub reasoning_effort_handle: Option<ReasoningEffortHandle>,
}
impl ToolContextServices {
pub fn provides(&self, service: ToolContextService) -> bool {
match service {
ToolContextService::SessionFileSystem => self.file_store.is_some(),
ToolContextService::SessionStorageStore => self.storage_store.is_some(),
ToolContextService::ImageArtifactStore => self.image_store.is_some(),
ToolContextService::ProviderCredentialStore => self.provider_credential_store.is_some(),
ToolContextService::UtilityLlmService => self.utility_llm_service.is_some(),
ToolContextService::McpInvoker => self.mcp_invoker.is_some(),
ToolContextService::EgressService => self.egress_service.is_some(),
ToolContextService::MessageRetriever => self.message_retriever.is_some(),
ToolContextService::SessionStore => self.session_store.is_some(),
ToolContextService::AgentStore => self.agent_store.is_some(),
ToolContextService::ConnectionResolver => self.connection_resolver.is_some(),
ToolContextService::ScheduleStore => self.schedule_store.is_some(),
ToolContextService::SubagentSessionDelegate => self.subagent_delegate.is_some(),
ToolContextService::LeasedResourceStore => self.leased_resource_store.is_some(),
ToolContextService::SessionResourceRegistry => self.session_resource_registry.is_some(),
ToolContextService::SessionTaskRegistry => self.session_task_registry.is_some(),
ToolContextService::EventEmitter => self.event_emitter.is_some(),
ToolContextService::CapabilityRegistry => self.capability_registry.is_some(),
ToolContextService::ToolRegistry => self.tool_registry.is_some(),
ToolContextService::OrgId => self.org_id.is_some(),
ToolContextService::BudgetChecker => self.budget_checker.is_some(),
ToolContextService::PaymentAuthority => self.payment_authority.is_some(),
ToolContextService::SessionCreationAuthority => {
self.session_creation_authority.is_some()
}
ToolContextService::SubagentSpawnStore => self.subagent_spawn_store.is_some(),
ToolContextService::ReasoningEffortHandle => self.reasoning_effort_handle.is_some(),
}
}
}
#[derive(Clone, Default)]
pub struct ToolContextExtensions {
values: Arc<HashMap<TypeId, Arc<dyn Any + Send + Sync>>>,
}
impl ToolContextExtensions {
pub fn insert<T: Any + Send + Sync>(&mut self, value: Arc<T>) {
Arc::make_mut(&mut self.values).insert(TypeId::of::<T>(), value);
}
pub fn get<T: Any + Send + Sync>(&self) -> Option<Arc<T>> {
self.values
.get(&TypeId::of::<T>())
.and_then(|value| value.clone().downcast::<T>().ok())
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
}
impl std::fmt::Debug for ToolContextExtensions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ToolContextExtensions")
.field("len", &self.values.len())
.finish()
}
}
#[derive(Clone)]
pub struct ToolContext {
pub session_id: SessionId,
pub workspace_id: WorkspaceId,
pub file_store: Option<Arc<dyn SessionFileSystem>>,
pub storage_store: Option<Arc<dyn SessionStorageStore>>,
pub image_store: Option<Arc<dyn ImageArtifactStore>>,
pub provider_credential_store: Option<Arc<dyn ProviderCredentialStore>>,
pub utility_llm_service: Option<Arc<dyn crate::UtilityLlmService>>,
pub mcp_invoker: Option<Arc<dyn crate::McpToolInvoker>>,
pub egress_service: Option<Arc<dyn crate::EgressService>>,
pub message_retriever: Option<Arc<dyn crate::message_retriever::MessageRetriever>>,
pub session_store: Option<Arc<dyn SessionStore>>,
pub agent_store: Option<Arc<dyn AgentStore>>,
pub connection_resolver: Option<Arc<dyn UserConnectionResolver>>,
pub schedule_store: Option<Arc<dyn SessionScheduleStore>>,
pub subagent_delegate: Option<Arc<dyn crate::subagent_delegation::SubagentSessionDelegate>>,
pub extensions: ToolContextExtensions,
pub leased_resource_store: Option<Arc<dyn LeasedResourceStore>>,
pub session_resource_registry: Option<Arc<dyn SessionResourceRegistry>>,
pub session_task_registry: Option<Arc<dyn crate::session_task::SessionTaskRegistry>>,
pub event_emitter: Option<Arc<dyn EventEmitter>>,
pub event_context: Option<crate::events::EventContext>,
pub tool_call_id: Option<String>,
pub capability_registry: Option<crate::capabilities::CapabilityRegistry>,
pub tool_registry: Option<Arc<crate::tools::ToolRegistry>>,
pub visible_tool_names: Option<Arc<HashSet<String>>>,
pub org_id: Option<crate::typed_id::OrgId>,
pub network_access: Option<crate::network_access::NetworkAccessList>,
pub locale: Option<String>,
pub budget_checker: Option<Arc<dyn BudgetChecker>>,
pub payment_authority: Option<Arc<dyn PaymentAuthority>>,
pub session_creation_authority: Option<Arc<dyn SessionCreationAuthority>>,
pub subagent_spawn_store: Option<Arc<dyn SubagentSpawnStore>>,
pub subagent_nesting_policy: SubagentNestingPolicy,
pub reasoning_effort_handle: Option<ReasoningEffortHandle>,
pub cancellation: Option<tokio_util::sync::CancellationToken>,
}
impl ToolContext {
pub fn workspace_fs_key(&self) -> SessionId {
SessionId::from_uuid(self.workspace_id.uuid())
}
pub fn with_workspace_id(mut self, workspace_id: WorkspaceId) -> Self {
self.workspace_id = workspace_id;
self
}
pub fn new(session_id: SessionId) -> Self {
Self {
session_id,
workspace_id: WorkspaceId::from_uuid(session_id.uuid()),
file_store: None,
storage_store: None,
image_store: None,
provider_credential_store: None,
utility_llm_service: None,
mcp_invoker: None,
egress_service: None,
message_retriever: None,
session_store: None,
agent_store: None,
connection_resolver: None,
schedule_store: None,
subagent_delegate: None,
extensions: ToolContextExtensions::default(),
leased_resource_store: None,
session_resource_registry: None,
session_task_registry: None,
event_emitter: None,
event_context: None,
tool_call_id: None,
capability_registry: None,
tool_registry: None,
visible_tool_names: None,
org_id: None,
network_access: None,
locale: None,
budget_checker: None,
payment_authority: None,
session_creation_authority: None,
subagent_spawn_store: None,
subagent_nesting_policy: SubagentNestingPolicy::default(),
reasoning_effort_handle: None,
cancellation: None,
}
}
pub fn from_services(session_id: SessionId, services: &ToolContextServices) -> Self {
Self {
session_id,
workspace_id: WorkspaceId::from_uuid(session_id.uuid()),
file_store: services.file_store.clone(),
storage_store: services.storage_store.clone(),
image_store: services.image_store.clone(),
provider_credential_store: services.provider_credential_store.clone(),
utility_llm_service: services.utility_llm_service.clone(),
mcp_invoker: services.mcp_invoker.clone(),
egress_service: services.egress_service.clone(),
message_retriever: services.message_retriever.clone(),
session_store: services.session_store.clone(),
agent_store: services.agent_store.clone(),
connection_resolver: services.connection_resolver.clone(),
schedule_store: services.schedule_store.clone(),
subagent_delegate: services.subagent_delegate.clone(),
extensions: services.extensions.clone(),
leased_resource_store: services.leased_resource_store.clone(),
session_resource_registry: services.session_resource_registry.clone(),
session_task_registry: services.session_task_registry.clone(),
event_emitter: services.event_emitter.clone(),
event_context: None,
tool_call_id: None,
capability_registry: services.capability_registry.clone(),
tool_registry: services.tool_registry.clone(),
visible_tool_names: None,
org_id: services.org_id,
network_access: services.network_access.clone(),
locale: None,
budget_checker: services.budget_checker.clone(),
payment_authority: services.payment_authority.clone(),
session_creation_authority: services.session_creation_authority.clone(),
subagent_spawn_store: services.subagent_spawn_store.clone(),
subagent_nesting_policy: services.subagent_nesting_policy,
reasoning_effort_handle: services.reasoning_effort_handle.clone(),
cancellation: None,
}
}
pub fn with_file_store(session_id: SessionId, file_store: Arc<dyn SessionFileSystem>) -> Self {
Self {
session_id,
workspace_id: WorkspaceId::from_uuid(session_id.uuid()),
file_store: Some(file_store),
storage_store: None,
image_store: None,
provider_credential_store: None,
utility_llm_service: None,
mcp_invoker: None,
egress_service: None,
message_retriever: None,
session_store: None,
agent_store: None,
connection_resolver: None,
schedule_store: None,
subagent_delegate: None,
extensions: ToolContextExtensions::default(),
leased_resource_store: None,
session_resource_registry: None,
session_task_registry: None,
event_emitter: None,
event_context: None,
tool_call_id: None,
capability_registry: None,
tool_registry: None,
visible_tool_names: None,
org_id: None,
network_access: None,
locale: None,
budget_checker: None,
payment_authority: None,
session_creation_authority: None,
subagent_spawn_store: None,
subagent_nesting_policy: SubagentNestingPolicy::default(),
reasoning_effort_handle: None,
cancellation: None,
}
}
pub fn with_storage_store(
session_id: SessionId,
storage_store: Arc<dyn SessionStorageStore>,
) -> Self {
Self {
session_id,
workspace_id: WorkspaceId::from_uuid(session_id.uuid()),
file_store: None,
storage_store: Some(storage_store),
image_store: None,
provider_credential_store: None,
utility_llm_service: None,
mcp_invoker: None,
egress_service: None,
message_retriever: None,
session_store: None,
agent_store: None,
connection_resolver: None,
schedule_store: None,
subagent_delegate: None,
extensions: ToolContextExtensions::default(),
leased_resource_store: None,
session_resource_registry: None,
session_task_registry: None,
event_emitter: None,
event_context: None,
tool_call_id: None,
capability_registry: None,
tool_registry: None,
visible_tool_names: None,
org_id: None,
network_access: None,
locale: None,
budget_checker: None,
payment_authority: None,
session_creation_authority: None,
subagent_spawn_store: None,
subagent_nesting_policy: SubagentNestingPolicy::default(),
reasoning_effort_handle: None,
cancellation: None,
}
}
pub fn with_stores(
session_id: SessionId,
file_store: Arc<dyn SessionFileSystem>,
storage_store: Arc<dyn SessionStorageStore>,
) -> Self {
Self {
session_id,
workspace_id: WorkspaceId::from_uuid(session_id.uuid()),
file_store: Some(file_store),
storage_store: Some(storage_store),
image_store: None,
provider_credential_store: None,
utility_llm_service: None,
mcp_invoker: None,
egress_service: None,
message_retriever: None,
session_store: None,
agent_store: None,
connection_resolver: None,
schedule_store: None,
subagent_delegate: None,
extensions: ToolContextExtensions::default(),
leased_resource_store: None,
session_resource_registry: None,
session_task_registry: None,
event_emitter: None,
event_context: None,
tool_call_id: None,
capability_registry: None,
tool_registry: None,
visible_tool_names: None,
org_id: None,
network_access: None,
locale: None,
budget_checker: None,
payment_authority: None,
session_creation_authority: None,
subagent_spawn_store: None,
subagent_nesting_policy: SubagentNestingPolicy::default(),
reasoning_effort_handle: None,
cancellation: None,
}
}
pub fn with_message_retriever(
mut self,
retriever: Arc<dyn crate::message_retriever::MessageRetriever>,
) -> Self {
self.message_retriever = Some(retriever);
self
}
pub fn with_session_store(mut self, store: Arc<dyn SessionStore>) -> Self {
self.session_store = Some(store);
self
}
pub fn with_cancellation(mut self, token: tokio_util::sync::CancellationToken) -> Self {
self.cancellation = Some(token);
self
}
pub fn is_cancelled(&self) -> bool {
self.cancellation
.as_ref()
.is_some_and(|token| token.is_cancelled())
}
pub fn with_reasoning_effort_handle(mut self, handle: ReasoningEffortHandle) -> Self {
self.reasoning_effort_handle = Some(handle);
self
}
pub fn with_agent_store(mut self, store: Arc<dyn AgentStore>) -> Self {
self.agent_store = Some(store);
self
}
pub fn with_connection_resolver(mut self, resolver: Arc<dyn UserConnectionResolver>) -> Self {
self.connection_resolver = Some(resolver);
self
}
pub fn with_image_store(
session_id: SessionId,
image_store: Arc<dyn ImageArtifactStore>,
) -> Self {
Self {
session_id,
workspace_id: WorkspaceId::from_uuid(session_id.uuid()),
file_store: None,
storage_store: None,
image_store: Some(image_store),
provider_credential_store: None,
utility_llm_service: None,
mcp_invoker: None,
egress_service: None,
message_retriever: None,
session_store: None,
agent_store: None,
connection_resolver: None,
schedule_store: None,
subagent_delegate: None,
extensions: ToolContextExtensions::default(),
leased_resource_store: None,
session_resource_registry: None,
session_task_registry: None,
event_emitter: None,
event_context: None,
tool_call_id: None,
capability_registry: None,
tool_registry: None,
visible_tool_names: None,
org_id: None,
network_access: None,
locale: None,
budget_checker: None,
payment_authority: None,
session_creation_authority: None,
subagent_spawn_store: None,
subagent_nesting_policy: SubagentNestingPolicy::default(),
reasoning_effort_handle: None,
cancellation: None,
}
}
pub fn with_provider_credential_store(
mut self,
store: Arc<dyn ProviderCredentialStore>,
) -> Self {
self.provider_credential_store = Some(store);
self
}
pub fn with_utility_llm_service(mut self, service: Arc<dyn crate::UtilityLlmService>) -> Self {
self.utility_llm_service = Some(service);
self
}
pub fn with_mcp_invoker(mut self, invoker: Arc<dyn crate::McpToolInvoker>) -> Self {
self.mcp_invoker = Some(invoker);
self
}
pub fn with_egress_service(mut self, service: Arc<dyn crate::EgressService>) -> Self {
self.egress_service = Some(service);
self
}
pub fn with_egress_service_opt(
mut self,
service: Option<Arc<dyn crate::EgressService>>,
) -> Self {
if let Some(service) = service {
self.egress_service = Some(service);
}
self
}
pub fn with_storage_store_arc(mut self, store: Arc<dyn SessionStorageStore>) -> Self {
self.storage_store = Some(store);
self
}
pub fn with_schedule_store(mut self, store: Arc<dyn SessionScheduleStore>) -> Self {
self.schedule_store = Some(store);
self
}
pub fn with_subagent_delegate(
mut self,
delegate: Arc<dyn crate::subagent_delegation::SubagentSessionDelegate>,
) -> Self {
self.subagent_delegate = Some(delegate);
self
}
pub fn with_extension<T: std::any::Any + Send + Sync>(mut self, value: Arc<T>) -> Self {
self.extensions.insert(value);
self
}
pub fn extension<T: std::any::Any + Send + Sync>(&self) -> Option<Arc<T>> {
self.extensions.get::<T>()
}
pub fn with_leased_resource_store(mut self, store: Arc<dyn LeasedResourceStore>) -> Self {
self.leased_resource_store = Some(store);
self
}
pub fn with_session_resource_registry(
mut self,
registry: Arc<dyn SessionResourceRegistry>,
) -> Self {
self.session_resource_registry = Some(registry);
self
}
pub fn with_session_task_registry(
mut self,
registry: Arc<dyn crate::session_task::SessionTaskRegistry>,
) -> Self {
self.session_task_registry = Some(registry);
self
}
pub fn with_org_id(mut self, org_id: crate::typed_id::OrgId) -> Self {
self.org_id = Some(org_id);
self
}
pub fn with_tool_registry(mut self, registry: Arc<crate::tools::ToolRegistry>) -> Self {
self.tool_registry = Some(registry);
self
}
pub fn with_visible_tool_names(mut self, names: Arc<HashSet<String>>) -> Self {
self.visible_tool_names = Some(names);
self
}
pub fn with_network_access(
mut self,
network_access: Option<crate::network_access::NetworkAccessList>,
) -> Self {
self.network_access = network_access;
self
}
pub fn with_payment_authority(mut self, authority: Arc<dyn PaymentAuthority>) -> Self {
self.payment_authority = Some(authority);
self
}
pub fn with_subagent_spawn_store(mut self, store: Arc<dyn SubagentSpawnStore>) -> Self {
self.subagent_spawn_store = Some(store);
self
}
pub fn with_subagent_nesting_policy(mut self, policy: SubagentNestingPolicy) -> Self {
self.subagent_nesting_policy = policy;
self
}
pub async fn emit_progress(&self, tool_name: &str, message: &str) {
let (Some(emitter), Some(ctx), Some(call_id)) =
(&self.event_emitter, &self.event_context, &self.tool_call_id)
else {
return;
};
if let Err(e) = emitter
.emit(EventRequest::new(
self.session_id,
ctx.clone(),
crate::events::ToolProgressData {
tool_call_id: call_id.clone(),
tool_name: tool_name.to_string(),
message: message.to_string(),
display_name: None,
},
))
.await
{
tracing::debug!(
tool_call_id = call_id,
tool_name,
error = %e,
"Failed to emit tool.progress event"
);
}
}
pub async fn emit_tool_output(&self, tool_name: &str, delta: &str, stream: &str) {
let (Some(emitter), Some(ctx), Some(call_id)) =
(&self.event_emitter, &self.event_context, &self.tool_call_id)
else {
return;
};
if let Err(e) = emitter
.emit(EventRequest::new(
self.session_id,
ctx.clone(),
crate::events::ToolOutputDeltaData {
tool_call_id: call_id.clone(),
tool_name: tool_name.to_string(),
delta: delta.to_string(),
stream: stream.to_string(),
},
))
.await
{
tracing::debug!(
tool_call_id = call_id,
tool_name,
error = %e,
"Failed to emit tool.output.delta event"
);
}
}
}
impl std::fmt::Debug for ToolContext {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ToolContext")
.field("session_id", &self.session_id)
.field("file_store", &self.file_store.is_some())
.field("storage_store", &self.storage_store.is_some())
.field("image_store", &self.image_store.is_some())
.field(
"provider_credential_store",
&self.provider_credential_store.is_some(),
)
.field("utility_llm_service", &self.utility_llm_service.is_some())
.field("egress_service", &self.egress_service.is_some())
.field("message_retriever", &self.message_retriever.is_some())
.field("session_store", &self.session_store.is_some())
.field("agent_store", &self.agent_store.is_some())
.field("connection_resolver", &self.connection_resolver.is_some())
.field("schedule_store", &self.schedule_store.is_some())
.field("subagent_delegate", &self.subagent_delegate.is_some())
.field(
"leased_resource_store",
&self.leased_resource_store.is_some(),
)
.field("event_emitter", &self.event_emitter.is_some())
.field("tool_registry", &self.tool_registry.is_some())
.field("payment_authority", &self.payment_authority.is_some())
.field("subagent_spawn_store", &self.subagent_spawn_store.is_some())
.field("subagent_nesting_policy", &self.subagent_nesting_policy)
.field("org_id", &self.org_id)
.finish()
}
}