use std::sync::Arc;
use systemprompt_identifiers::InstanceId;
use systemprompt_manifest::services::ServicesView;
use systemprompt_manifest::{Config, Profile};
use systemprompt_models::auth::TokenAuthority;
use systemprompt_models::authz::SubjectAttributeSource;
use systemprompt_provider_contracts::{ConfigPlaneError, ConfigPlaneResult, ConfigPlaneSet};
use systemprompt_traits::{
BackgroundTasks, ConfigProvider, DatabaseHandle, DynAdvisoryLocks, DynInstanceRegistry,
DynLeaseRepository, FileStorage, ProviderTokenCache, SecretStore, UnavailableCoordination,
};
pub trait ExtensionContext: Send + Sync {
fn system_owner_id(&self) -> systemprompt_identifiers::UserId;
fn config(&self) -> Arc<dyn ConfigProvider>;
fn profile(&self) -> Arc<Profile>;
fn app_config(&self) -> Arc<Config>;
fn services_root(&self) -> systemprompt_manifest::services::root::ActiveServicesRoot;
fn token_authority(&self) -> Arc<dyn TokenAuthority>;
fn database(&self) -> Arc<dyn DatabaseHandle>;
fn file_storage(&self) -> Arc<dyn FileStorage>;
fn instance_id(&self) -> InstanceId;
fn background_tasks(&self) -> BackgroundTasks;
fn instances(&self) -> DynInstanceRegistry {
Arc::new(UnavailableCoordination)
}
fn leases(&self) -> DynLeaseRepository {
Arc::new(UnavailableCoordination)
}
fn advisory_locks(&self) -> DynAdvisoryLocks {
Arc::new(UnavailableCoordination)
}
fn secrets(&self) -> Arc<dyn SecretStore>;
fn dependencies(&self) -> systemprompt_provider_contracts::Dependencies;
fn get_extension(&self, id: &str) -> Option<Arc<dyn crate::Extension>>;
fn has_extension(&self, id: &str) -> bool {
self.get_extension(id).is_some()
}
fn services(&self) -> ServicesView;
fn subject_attributes(&self) -> Arc<dyn SubjectAttributeSource>;
fn provider_tokens(&self) -> Arc<dyn ProviderTokenCache>;
fn config_planes(&self) -> ConfigPlaneResult<ConfigPlaneSet> {
Err(ConfigPlaneError::PlanesUnavailable)
}
}
pub type DynExtensionContext = Arc<dyn ExtensionContext>;