Skip to main content

vv_agent/runtime/engine/
controls.rs

1use std::collections::{BTreeMap, VecDeque};
2use std::path::PathBuf;
3use std::sync::{Arc, Mutex};
4
5use serde_json::Value;
6
7use crate::runtime::cancellation::CancellationToken;
8use crate::runtime::context::{ExecutionContext, StreamCallback};
9use crate::runtime::sub_task_manager::SubTaskManager;
10use crate::types::Message;
11use crate::workspace::WorkspaceBackend;
12
13pub type RuntimeLogCallback = dyn FnMut(&str, &BTreeMap<String, Value>) + Send + Sync + 'static;
14pub type RuntimeLogHandler = Arc<Mutex<Box<RuntimeLogCallback>>>;
15pub type RuntimeEventHandler = Arc<dyn Fn(&str, &BTreeMap<String, Value>) + Send + Sync + 'static>;
16pub type BeforeCycleMessageProvider =
17    Arc<dyn Fn(u32, &[Message], &BTreeMap<String, Value>) -> Vec<Message> + Send + Sync + 'static>;
18pub type InterruptionMessageProvider = Arc<dyn Fn() -> Vec<Message> + Send + Sync + 'static>;
19
20#[derive(Clone, Default)]
21pub struct RuntimeRunControls {
22    pub log_handler: Option<RuntimeEventHandler>,
23    pub before_cycle_messages: Option<BeforeCycleMessageProvider>,
24    pub interruption_messages: Option<InterruptionMessageProvider>,
25    pub steering_queue: Option<Arc<Mutex<VecDeque<String>>>>,
26    pub cancellation_token: Option<CancellationToken>,
27    pub execution_context: Option<ExecutionContext>,
28    pub workspace: Option<PathBuf>,
29    pub workspace_backend: Option<Arc<dyn WorkspaceBackend>>,
30    pub sub_task_manager: Option<SubTaskManager>,
31}
32
33impl RuntimeRunControls {
34    pub(in crate::runtime::engine) fn effective_cancellation_token(
35        &self,
36    ) -> Option<CancellationToken> {
37        self.cancellation_token.clone().or_else(|| {
38            self.execution_context
39                .as_ref()
40                .and_then(|context| context.cancellation_token.clone())
41        })
42    }
43
44    pub(in crate::runtime::engine) fn effective_stream_callback(&self) -> Option<StreamCallback> {
45        self.execution_context
46            .as_ref()
47            .and_then(|context| context.stream_callback.clone())
48    }
49}