meerkat_mob/runtime/
turn_executor.rs1use 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}