use serde::{Deserialize, Serialize};
use crate::execution::{InvocationContext, Message, MessageId, ModelMode, RunId, UseCase};
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AccessMode {
NoAccess,
#[default]
Interactive,
FullAccess,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct RunOptions {
pub use_case: UseCase,
pub model_mode: ModelMode,
pub access_mode: AccessMode,
pub allow_tools: bool,
pub max_steps: u32,
pub credit_budget: Option<u64>,
pub debug: bool,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct InteractionDecision {
pub action_id: crate::execution::ActionId,
pub proceed: bool,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct Interaction {
pub batch_id: MessageId,
pub decisions: Vec<InteractionDecision>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct QueuedRun {
pub context: InvocationContext,
pub message: Message,
pub options: RunOptions,
}
impl QueuedRun {
#[must_use]
pub fn run_id(&self) -> &RunId {
&self.context.run_id
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AgentCommand {
Enqueue {
context: InvocationContext,
message: Message,
options: RunOptions,
},
SubmitInteraction {
context: InvocationContext,
interaction: Interaction,
},
Cancel {
context: InvocationContext,
},
}