use std::time::Duration;
use tmai_core::agents::{AgentStatus, AgentType, ApprovalType};
pub struct DemoAgent {
pub target: String,
pub agent_type: AgentType,
pub session: String,
pub window_index: u32,
pub pane_index: u32,
pub git_branch: Option<String>,
pub cwd: String,
}
pub struct TimelineEvent {
pub at: Duration,
pub agent_idx: usize,
pub status: AgentStatus,
pub wait_for_action: bool,
pub content_key: &'static str,
}
pub struct DemoScenario {
pub agents: Vec<DemoAgent>,
pub timeline: Vec<TimelineEvent>,
}
pub fn default_scenario() -> DemoScenario {
let agents = vec![
DemoAgent {
target: "main:0.0".to_string(),
agent_type: AgentType::ClaudeCode,
session: "main".to_string(),
window_index: 0,
pane_index: 0,
git_branch: Some("feat/auth".to_string()),
cwd: "/home/user/projects/webapp".to_string(),
},
DemoAgent {
target: "main:0.1".to_string(),
agent_type: AgentType::ClaudeCode,
session: "main".to_string(),
window_index: 0,
pane_index: 1,
git_branch: Some("fix/tests".to_string()),
cwd: "/home/user/projects/webapp".to_string(),
},
DemoAgent {
target: "dev:0.0".to_string(),
agent_type: AgentType::GeminiCli,
session: "dev".to_string(),
window_index: 0,
pane_index: 0,
git_branch: None,
cwd: "/home/user/projects/api-server".to_string(),
},
];
let timeline = vec![
TimelineEvent {
at: Duration::from_secs(0),
agent_idx: 0,
status: AgentStatus::Processing {
activity: String::new(),
},
wait_for_action: false,
content_key: "processing_read",
},
TimelineEvent {
at: Duration::from_secs(0),
agent_idx: 1,
status: AgentStatus::Idle,
wait_for_action: false,
content_key: "idle",
},
TimelineEvent {
at: Duration::from_secs(0),
agent_idx: 2,
status: AgentStatus::Processing {
activity: String::new(),
},
wait_for_action: false,
content_key: "processing_gemini",
},
TimelineEvent {
at: Duration::from_secs(3),
agent_idx: 0,
status: AgentStatus::AwaitingApproval {
approval_type: ApprovalType::FileEdit,
details: "src/auth/middleware.rs".to_string(),
},
wait_for_action: true,
content_key: "approval_file_edit",
},
TimelineEvent {
at: Duration::from_secs(3),
agent_idx: 1,
status: AgentStatus::Processing {
activity: String::new(),
},
wait_for_action: false,
content_key: "processing_test",
},
TimelineEvent {
at: Duration::from_secs(6),
agent_idx: 1,
status: AgentStatus::AwaitingApproval {
approval_type: ApprovalType::ShellCommand,
details: "cargo test --lib".to_string(),
},
wait_for_action: true,
content_key: "approval_shell_command",
},
TimelineEvent {
at: Duration::from_secs(6),
agent_idx: 2,
status: AgentStatus::Idle,
wait_for_action: false,
content_key: "idle_gemini",
},
TimelineEvent {
at: Duration::from_secs(10),
agent_idx: 0,
status: AgentStatus::AwaitingApproval {
approval_type: ApprovalType::UserQuestion {
choices: vec![
"JWT with refresh tokens".to_string(),
"Session-based auth".to_string(),
"OAuth 2.0 integration".to_string(),
],
multi_select: false,
cursor_position: 1,
},
details: "Which authentication strategy should I use?".to_string(),
},
wait_for_action: true,
content_key: "approval_user_question",
},
TimelineEvent {
at: Duration::from_secs(10),
agent_idx: 2,
status: AgentStatus::Processing {
activity: String::new(),
},
wait_for_action: false,
content_key: "processing_gemini_2",
},
TimelineEvent {
at: Duration::from_secs(14),
agent_idx: 1,
status: AgentStatus::Idle,
wait_for_action: false,
content_key: "idle_tests_pass",
},
TimelineEvent {
at: Duration::from_secs(16),
agent_idx: 0,
status: AgentStatus::Idle,
wait_for_action: false,
content_key: "idle_auth_done",
},
TimelineEvent {
at: Duration::from_secs(16),
agent_idx: 2,
status: AgentStatus::Idle,
wait_for_action: false,
content_key: "idle_gemini",
},
TimelineEvent {
at: Duration::from_secs(20),
agent_idx: 0,
status: AgentStatus::Idle, wait_for_action: false,
content_key: "quit",
},
];
DemoScenario { agents, timeline }
}