Skip to main content

meerkat_mob/runtime/
turn_executor.rs

1use crate::error::MobError;
2use crate::ids::{MeerkatId, RunId, StepId};
3#[cfg(target_arch = "wasm32")]
4use crate::tokio;
5use async_trait::async_trait;
6use meerkat_core::service::TurnToolOverlay;
7use meerkat_core::types::ContentInput;
8use std::fmt;
9use std::sync::Arc;
10use std::time::Duration;
11use tokio::sync::{Mutex, oneshot};
12use tokio::task::JoinHandle;
13
14pub struct ActorTurnTicket {
15    pub(crate) run_id: RunId,
16    pub(crate) completion_rx: Mutex<Option<oneshot::Receiver<FlowTurnOutcome>>>,
17    pub(crate) bridge_handle: Mutex<Option<JoinHandle<()>>>,
18}
19
20#[derive(Clone)]
21pub enum FlowTurnTicket {
22    Actor(Arc<ActorTurnTicket>),
23}
24
25impl fmt::Debug for FlowTurnTicket {
26    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27        match self {
28            Self::Actor(_) => f.write_str("FlowTurnTicket::Actor(..)"),
29        }
30    }
31}
32
33#[derive(Debug)]
34pub enum FlowTurnOutcome {
35    Completed { output: String },
36    Failed { reason: String },
37    Canceled,
38}
39
40#[derive(Debug)]
41pub enum TimeoutDisposition {
42    Detached,
43    Canceled,
44}
45
46#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
47#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
48pub trait FlowTurnExecutor: Send + Sync {
49    async fn dispatch(
50        &self,
51        run_id: &RunId,
52        step_id: &StepId,
53        target: &MeerkatId,
54        message: ContentInput,
55        flow_tool_overlay: Option<TurnToolOverlay>,
56    ) -> Result<FlowTurnTicket, MobError>;
57
58    async fn await_terminal(
59        &self,
60        ticket: FlowTurnTicket,
61        timeout: Duration,
62    ) -> Result<FlowTurnOutcome, MobError>;
63
64    async fn on_timeout(&self, ticket: FlowTurnTicket) -> Result<TimeoutDisposition, MobError>;
65}