#![allow(dead_code)]
use serde::{Deserialize, Serialize};
use crate::task::TaskStateBase;
use crate::types::ids::AgentId;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BashTaskKind {
Bash,
Monitor,
}
pub struct LocalShellTaskState {
pub id: String,
pub task_type: String,
pub status: crate::task::TaskStatus,
pub description: String,
pub tool_use_id: Option<String>,
pub start_time: u64,
pub end_time: Option<u64>,
pub total_paused_ms: Option<u64>,
pub output_file: String,
pub output_offset: u64,
pub notified: bool,
pub r#type: String,
pub command: String,
pub result: Option<ShellCommandResult>,
pub completion_status_sent_in_attachment: bool,
pub shell_command: Option<Box<dyn ShellCommandTrait>>,
pub unregister_cleanup: Option<Box<dyn FnOnce()>>,
pub cleanup_timeout_id: Option<u64>,
pub last_reported_total_lines: usize,
pub is_backgrounded: Option<bool>,
pub agent_id: Option<AgentId>,
pub kind: Option<BashTaskKind>,
}
impl std::fmt::Debug for LocalShellTaskState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LocalShellTaskState")
.field("id", &self.id)
.field("task_type", &self.task_type)
.field("status", &self.status)
.field("description", &self.description)
.field("tool_use_id", &self.tool_use_id)
.field("start_time", &self.start_time)
.field("end_time", &self.end_time)
.field("total_paused_ms", &self.total_paused_ms)
.field("output_file", &self.output_file)
.field("output_offset", &self.output_offset)
.field("notified", &self.notified)
.field("r#type", &self.r#type)
.field("command", &self.command)
.field("result", &self.result)
.field(
"completion_status_sent_in_attachment",
&self.completion_status_sent_in_attachment,
)
.field(
"shell_command",
&self
.shell_command
.as_ref()
.map(|_| "<dyn ShellCommandTrait>"),
)
.field(
"unregister_cleanup",
&self.unregister_cleanup.as_ref().map(|_| "<dyn FnOnce()>"),
)
.field("cleanup_timeout_id", &self.cleanup_timeout_id)
.field("last_reported_total_lines", &self.last_reported_total_lines)
.field("is_backgrounded", &self.is_backgrounded)
.field("agent_id", &self.agent_id)
.field("kind", &self.kind)
.finish()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShellCommandResult {
pub code: i32,
pub interrupted: bool,
}
pub trait ShellCommandTrait: Send + Sync {
fn kill(&self);
fn cleanup(&self);
}
pub fn is_local_shell_task(task: &dyn std::any::Any) -> bool {
task.downcast_ref::<LocalShellTaskState>().is_some()
}
pub fn is_local_shell_task_from_value(task: &serde_json::Value) -> bool {
task.get("type").and_then(|v| v.as_str()) == Some("local_bash")
}