use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::{Metadata, RunId, TaskId};
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct SubagentSpec {
pub name: String,
pub description: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instruction: Option<String>,
pub system_prompt: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tools: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub optional_tools: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model_settings: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model_config: Option<Value>,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
pub metadata: Metadata,
}
impl SubagentSpec {
#[must_use]
pub fn new(
name: impl Into<String>,
description: impl Into<String>,
system_prompt: impl Into<String>,
) -> Self {
Self {
name: name.into(),
description: description.into(),
system_prompt: system_prompt.into(),
..Self::default()
}
}
#[must_use]
pub fn with_tools(mut self, tools: Vec<String>) -> Self {
self.tools = tools;
self
}
#[must_use]
pub fn with_optional_tools(mut self, optional_tools: Vec<String>) -> Self {
self.optional_tools = optional_tools;
self
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SubagentLifecycleKind {
Started,
Completed,
Failed,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct SubagentLifecycleEvent {
pub kind: SubagentLifecycleKind,
pub name: String,
pub task_id: TaskId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub run_id: Option<RunId>,
#[serde(default, skip_serializing_if = "Value::is_null")]
pub metadata: Value,
}
impl SubagentLifecycleEvent {
#[must_use]
pub fn new(kind: SubagentLifecycleKind, name: impl Into<String>, task_id: TaskId) -> Self {
Self {
kind,
name: name.into(),
task_id,
run_id: None,
metadata: Value::Null,
}
}
#[must_use]
pub fn with_run_id(mut self, run_id: RunId) -> Self {
self.run_id = Some(run_id);
self
}
#[must_use]
pub fn with_metadata(mut self, metadata: Value) -> Self {
self.metadata = metadata;
self
}
}