use super::DemoScenario;
use crate::demo::runner::DemoRunner;
use crate::tui::animation::agent_avatar::{ActivityLevel, AgentRole};
use crate::tui::animation::message_flow::MessageType;
pub struct CodebaseArchaeologyScenario {
phase: ArchaeologyPhase,
discovered_files: usize,
patterns_found: usize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
enum ArchaeologyPhase {
Setup,
InitialScan,
DeepAnalysis,
PatternRecognition,
Documentation,
Report,
}
impl CodebaseArchaeologyScenario {
pub fn new() -> Self {
Self {
phase: ArchaeologyPhase::Setup,
discovered_files: 0,
patterns_found: 0,
}
}
}
impl Default for CodebaseArchaeologyScenario {
fn default() -> Self {
Self::new()
}
}
impl DemoScenario for CodebaseArchaeologyScenario {
fn name(&self) -> &str {
"Codebase Archaeology"
}
fn description(&self) -> &str {
"Watch agents explore and document a legacy codebase, discovering patterns and creating comprehensive documentation."
}
fn total_stages(&self) -> usize {
6
}
fn initialize(&mut self, runner: &mut DemoRunner) {
runner.add_agent("architect", AgentRole::Architect);
runner.add_agent("documenter", AgentRole::Documenter);
runner.add_agent("reviewer", AgentRole::Reviewer);
runner.set_token_rate(1000.0);
runner.set_total_tokens(0);
self.phase = ArchaeologyPhase::Setup;
}
fn execute_stage(&mut self, stage: usize, runner: &mut DemoRunner) -> bool {
match stage {
0 => {
self.phase = ArchaeologyPhase::InitialScan;
runner.set_agent_activity("architect", ActivityLevel::High);
runner.set_agent_activity("documenter", ActivityLevel::Idle);
runner.set_agent_activity("reviewer", ActivityLevel::Idle);
runner.set_token_rate(2500.0);
runner.add_agent_tokens("architect", 5000);
runner.sparkle(20.0, 10.0, 15);
true
}
1 => {
self.phase = ArchaeologyPhase::DeepAnalysis;
self.discovered_files = 127;
runner.set_agent_activity("architect", ActivityLevel::Max);
runner.set_token_rate(5000.0);
runner.add_agent_tokens("architect", 15000);
runner.send_message(
"architect",
"documenter",
MessageType::Request,
(10.0, 5.0),
(30.0, 5.0),
);
true
}
2 => {
self.phase = ArchaeologyPhase::PatternRecognition;
self.patterns_found = 12;
runner.set_agent_activity("architect", ActivityLevel::Medium);
runner.set_agent_activity("reviewer", ActivityLevel::High);
runner.set_token_rate(3500.0);
runner.add_agent_tokens("reviewer", 8000);
runner.send_message(
"architect",
"reviewer",
MessageType::Broadcast,
(10.0, 5.0),
(50.0, 5.0),
);
runner.sparkle(50.0, 8.0, 10);
true
}
3 => {
self.phase = ArchaeologyPhase::Documentation;
runner.set_agent_activity("architect", ActivityLevel::Low);
runner.set_agent_activity("documenter", ActivityLevel::Max);
runner.set_agent_activity("reviewer", ActivityLevel::Medium);
runner.set_token_rate(4000.0);
runner.add_agent_tokens("documenter", 20000);
runner.send_message(
"documenter",
"architect",
MessageType::Response,
(30.0, 5.0),
(10.0, 5.0),
);
true
}
4 => {
runner.send_message(
"reviewer",
"architect",
MessageType::Consensus,
(50.0, 5.0),
(10.0, 5.0),
);
runner.send_message(
"reviewer",
"documenter",
MessageType::Consensus,
(50.0, 5.0),
(30.0, 5.0),
);
runner.add_agent_tokens("reviewer", 5000);
true
}
5 => {
self.phase = ArchaeologyPhase::Report;
runner.set_agent_activity("architect", ActivityLevel::Complete);
runner.set_agent_activity("documenter", ActivityLevel::Complete);
runner.set_agent_activity("reviewer", ActivityLevel::Complete);
runner.set_token_rate(0.0);
runner.celebrate(30.0, 10.0);
runner.sparkle(10.0, 10.0, 20);
runner.sparkle(50.0, 10.0, 20);
true
}
_ => false,
}
}
fn cleanup(&mut self, runner: &mut DemoRunner) {
runner.set_total_tokens(53000);
runner.set_token_rate(0.0);
}
}
#[cfg(test)]
#[path = "../../../../tests/unit/ui/demo/scenarios/archaeology/archaeology_test.rs"]
mod tests;