use anyhow::Result;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::{
runtime::RuntimeHandle,
tool::spec::typed_spec,
types::{TaskStatusResult, ToolCapabilityFamily, TrustLevel},
};
use super::{serialize_success, BuiltinToolDefinition};
use crate::tool::helpers::{parse_tool_args, validate_non_empty};
pub(crate) const NAME: &str = "TaskStatus";
#[derive(Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub(crate) struct TaskStatusArgs {
pub(crate) task_id: String,
}
pub(crate) fn definition() -> Result<BuiltinToolDefinition> {
Ok(BuiltinToolDefinition {
family: ToolCapabilityFamily::CoreAgent,
spec: typed_spec::<TaskStatusArgs>(NAME, "Read a specific task lifecycle snapshot by id.")?,
})
}
pub(crate) async fn execute(
runtime: &RuntimeHandle,
_agent_id: &str,
_trust: &TrustLevel,
input: &Value,
) -> Result<crate::tool::ToolResult> {
let args: TaskStatusArgs = parse_tool_args(NAME, input)?;
let task_id = validate_non_empty(args.task_id, NAME, "task_id")?;
let snapshot = runtime
.managed_tasks()
.task_status_snapshot(&task_id)
.await?;
serialize_success(
NAME,
&TaskStatusResult {
summary_text: snapshot
.summary
.clone()
.or_else(|| Some(format!("task {} status retrieved", snapshot.task_id))),
task: snapshot,
},
)
}