lash-core 0.1.0-alpha.33

Sans-IO turn machine and runtime kernel for the lash agent runtime.
Documentation
use super::*;

#[async_trait::async_trait]
impl crate::plugin::SessionStateService for RuntimeSessionStateService {
    async fn snapshot_current(&self) -> Result<SessionSnapshot, crate::PluginError> {
        self.services.current.snapshot_current().await
    }

    async fn snapshot_session(
        &self,
        session_id: &str,
    ) -> Result<SessionSnapshot, crate::PluginError> {
        self.services
            .current
            .snapshot_session(&self.services.managed, session_id)
            .await
    }

    async fn tool_catalog(
        &self,
        session_id: &str,
    ) -> Result<Vec<serde_json::Value>, crate::PluginError> {
        self.services
            .current
            .tool_catalog(&self.services.managed, session_id)
            .await
    }

    async fn shared_tool_catalog(
        &self,
        session_id: &str,
    ) -> Result<Arc<Vec<serde_json::Value>>, crate::PluginError> {
        self.services
            .current
            .shared_tool_catalog(&self.services.managed, session_id)
            .await
    }

    async fn tool_state(&self, session_id: &str) -> Result<crate::ToolState, crate::PluginError> {
        self.services
            .current
            .tool_state(&self.services.managed, session_id)
            .await
    }

    async fn apply_tool_state(
        &self,
        session_id: &str,
        snapshot: crate::ToolState,
    ) -> Result<u64, crate::PluginError> {
        self.services
            .current
            .apply_tool_state(&self.services.managed, session_id, snapshot)
            .await
    }
}

#[async_trait::async_trait]
impl crate::plugin::SessionLifecycleService for RuntimeSessionLifecycleService {
    async fn create_session(
        &self,
        request: SessionCreateRequest,
    ) -> Result<SessionHandle, crate::PluginError> {
        self.services
            .managed
            .create_session(&self.services.current, &self.services.usage, request)
            .await
    }

    async fn close_session(&self, session_id: &str) -> Result<(), crate::PluginError> {
        self.services
            .managed
            .close_session(&self.services.current, &self.services.usage, session_id)
            .await
    }

    async fn start_turn(
        &self,
        request: crate::SessionTurnRequest<'_>,
    ) -> Result<AssembledTurn, crate::PluginError> {
        self.services
            .managed
            .start_turn(&self.services.current, &self.services.usage, request)
            .await
    }
}

#[async_trait::async_trait]
impl crate::plugin::SessionGraphService for RuntimeSessionGraphService {
    async fn append_session_nodes(
        &self,
        session_id: &str,
        request: crate::AppendSessionNodesRequest,
    ) -> Result<crate::AppendSessionNodesResult, crate::PluginError> {
        self.services
            .current
            .append_session_nodes(
                &self.services.managed,
                &self.services.usage,
                &self.services.processes,
                session_id,
                request,
            )
            .await
    }
    async fn emit_trace_event(
        &self,
        context: lash_trace::TraceContext,
        event: lash_trace::TraceEvent,
    ) -> Result<(), crate::PluginError> {
        self.services.current.emit_trace_event(context, event).await
    }
}

#[async_trait::async_trait]
impl crate::ProcessService for RuntimeSessionProcessService {
    async fn start(
        &self,
        session_id: &str,
        registration: crate::ProcessRegistration,
        options: crate::ProcessStartOptions,
        scope: crate::ProcessOpScope<'_>,
    ) -> Result<crate::ProcessRecord, crate::PluginError> {
        self.services
            .processes
            .start_process(
                &self.services.current,
                &self.services.managed,
                session_id,
                registration,
                options,
                scope,
            )
            .await
    }

    async fn await_process(
        &self,
        process_id: &str,
        scope: crate::ProcessOpScope<'_>,
    ) -> Result<crate::ProcessAwaitOutput, crate::PluginError> {
        self.services
            .processes
            .await_process(&self.services.current, process_id, scope)
            .await
    }

    async fn list_visible(
        &self,
        session_id: &str,
        mode: crate::ProcessListMode,
        scope: crate::ProcessOpScope<'_>,
    ) -> Result<Vec<crate::runtime::ProcessHandleGrantEntry>, crate::PluginError> {
        self.services
            .processes
            .list_process_handles(&self.services.current, session_id, mode, scope)
            .await
    }

    async fn validate_visible(
        &self,
        session_id: &str,
        handle_ids: &[String],
        scope: crate::ProcessOpScope<'_>,
    ) -> Result<(), crate::PluginError> {
        self.services
            .processes
            .validate_process_handles_visible(
                &self.services.current,
                &self.services.managed,
                session_id,
                handle_ids,
                scope,
            )
            .await
    }

    async fn cancel(
        &self,
        session_id: &str,
        process_id: &str,
        scope: crate::ProcessOpScope<'_>,
    ) -> Result<crate::ProcessRecord, crate::PluginError> {
        self.services
            .processes
            .cancel_process(
                &self.services.current,
                &self.services.managed,
                session_id,
                process_id,
                scope,
            )
            .await
    }

    async fn signal(
        &self,
        session_id: &str,
        process_id: &str,
        signal_id: String,
        payload: serde_json::Value,
        scope: crate::ProcessOpScope<'_>,
    ) -> Result<crate::ProcessEvent, crate::PluginError> {
        self.services
            .processes
            .signal_process(
                &self.services.current,
                session_id,
                process_id,
                signal_id,
                payload,
                scope,
            )
            .await
    }

    async fn transfer(
        &self,
        from_session_id: &str,
        to_session_id: &str,
        process_ids: Vec<String>,
        scope: crate::ProcessOpScope<'_>,
    ) -> Result<(), crate::PluginError> {
        self.services
            .processes
            .transfer_process_handles(
                &self.services.current,
                &self.services.managed,
                from_session_id,
                to_session_id,
                process_ids,
                scope,
            )
            .await
    }

    async fn cancel_unreferenced(
        &self,
        session_id: &str,
        keep_process_ids: Vec<String>,
        scope: crate::ProcessOpScope<'_>,
    ) -> Result<Vec<crate::ProcessRecord>, crate::PluginError> {
        self.services
            .processes
            .cancel_unreferenced_process_handles(
                &self.services.current,
                &self.services.managed,
                session_id,
                keep_process_ids,
                scope,
            )
            .await
    }
}