systemprompt-agent 0.2.2

Agent-to-Agent (A2A) protocol for systemprompt.io AI governance: streaming, JSON-RPC models, task lifecycle, .well-known discovery, and governed agent orchestration.
Documentation
use std::sync::Arc;
use systemprompt_database::DbPool;
use systemprompt_models::Config;
use systemprompt_traits::{
    AnalyticsProvider, DynFileUploadProvider, DynJwtValidationProvider, DynMcpServiceProvider,
    DynProcessCleanupProvider, DynSessionAnalyticsProvider, DynUserProvider,
};

#[derive(Clone)]
pub struct AgentState {
    db_pool: DbPool,
    config: Arc<Config>,
    jwt_provider: DynJwtValidationProvider,
    user_provider: Option<DynUserProvider>,
    analytics_provider: Option<Arc<dyn AnalyticsProvider>>,
    session_analytics_provider: Option<DynSessionAnalyticsProvider>,
    file_upload_provider: Option<DynFileUploadProvider>,
    mcp_service_provider: Option<DynMcpServiceProvider>,
    process_cleanup_provider: Option<DynProcessCleanupProvider>,
}

impl AgentState {
    #[must_use]
    pub fn new(
        db_pool: DbPool,
        config: Arc<Config>,
        jwt_provider: DynJwtValidationProvider,
    ) -> Self {
        Self {
            db_pool,
            config,
            jwt_provider,
            user_provider: None,
            analytics_provider: None,
            session_analytics_provider: None,
            file_upload_provider: None,
            mcp_service_provider: None,
            process_cleanup_provider: None,
        }
    }

    #[must_use]
    pub fn with_user_provider(mut self, provider: DynUserProvider) -> Self {
        self.user_provider = Some(provider);
        self
    }

    #[must_use]
    pub fn with_analytics_provider(mut self, provider: Arc<dyn AnalyticsProvider>) -> Self {
        self.analytics_provider = Some(provider);
        self
    }

    #[must_use]
    pub fn with_session_analytics_provider(
        mut self,
        provider: DynSessionAnalyticsProvider,
    ) -> Self {
        self.session_analytics_provider = Some(provider);
        self
    }

    #[must_use]
    pub fn with_file_upload_provider(mut self, provider: DynFileUploadProvider) -> Self {
        self.file_upload_provider = Some(provider);
        self
    }

    #[must_use]
    pub fn with_mcp_service_provider(mut self, provider: DynMcpServiceProvider) -> Self {
        self.mcp_service_provider = Some(provider);
        self
    }

    #[must_use]
    pub fn with_process_cleanup_provider(mut self, provider: DynProcessCleanupProvider) -> Self {
        self.process_cleanup_provider = Some(provider);
        self
    }

    #[must_use]
    pub const fn db_pool(&self) -> &DbPool {
        &self.db_pool
    }

    #[must_use]
    pub fn config(&self) -> &Config {
        &self.config
    }

    #[must_use]
    pub fn jwt_provider(&self) -> &DynJwtValidationProvider {
        &self.jwt_provider
    }

    #[must_use]
    pub fn user_provider(&self) -> Option<&DynUserProvider> {
        self.user_provider.as_ref()
    }

    #[must_use]
    pub fn analytics_provider(&self) -> Option<&Arc<dyn AnalyticsProvider>> {
        self.analytics_provider.as_ref()
    }

    #[must_use]
    pub fn session_analytics_provider(&self) -> Option<&DynSessionAnalyticsProvider> {
        self.session_analytics_provider.as_ref()
    }

    #[must_use]
    pub fn file_upload_provider(&self) -> Option<&DynFileUploadProvider> {
        self.file_upload_provider.as_ref()
    }

    #[must_use]
    pub fn mcp_service_provider(&self) -> Option<&DynMcpServiceProvider> {
        self.mcp_service_provider.as_ref()
    }

    #[must_use]
    pub fn process_cleanup_provider(&self) -> Option<&DynProcessCleanupProvider> {
        self.process_cleanup_provider.as_ref()
    }
}

impl std::fmt::Debug for AgentState {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("AgentState")
            .field("db_pool", &"<DbPool>")
            .field("config", &"<Arc<Config>>")
            .field("jwt_provider", &"<DynJwtValidationProvider>")
            .field("user_provider", &self.user_provider.is_some())
            .field("analytics_provider", &self.analytics_provider.is_some())
            .field(
                "session_analytics_provider",
                &self.session_analytics_provider.is_some(),
            )
            .field("file_upload_provider", &self.file_upload_provider.is_some())
            .field("mcp_service_provider", &self.mcp_service_provider.is_some())
            .field(
                "process_cleanup_provider",
                &self.process_cleanup_provider.is_some(),
            )
            .finish()
    }
}