use super::*;
use crate::PluginError;

impl<'run> RuntimeTurnDriver<'run> {
    pub(super) fn effect_controller_handle(&self) -> RuntimeEffectControllerHandle<'run> {
        RuntimeEffectControllerHandle::borrowed(self.scoped_effect_controller.clone())
    }

    pub(super) fn execution_context(
        &self,
        event_tx: mpsc::Sender<SessionEvent>,
        chronological_projection: Arc<crate::ChronologicalProjection>,
    ) -> Result<crate::RuntimeExecutionContext<'run>, PluginError> {
        let manager = self.session_services.clone();
        let effect_controller = self.effect_controller_handle();
        let direct_completions = manager
            .direct_completion_client(effect_controller.clone_scoped(), Some(self.turn_id.clone()));
        let execution_env_spec = self
            .turn_pipeline
            .state()
            .process_execution_env_spec(&self.policy.policy);
        self.session.code_execution_context(
            &self.session_id,
            &self.turn_pipeline.state().current_agent_frame_id,
            manager.state_service(),
            manager.lifecycle_service(),
            manager.graph_service(),
            manager.process_service(),
            manager.process_cancel_ability(),
            effect_controller,
            direct_completions,
            manager.host_event_router(),
            event_tx,
            chronological_projection,
            self.protocol_extension.clone(),
            self.turn_context.clone(),
            execution_env_spec,
            self.checkpoint_messages.clone(),
        )
    }
}
