mod ast_grep;
mod bash;
mod common;
mod find;
mod grep;
mod hash_edit;
mod list_files;
mod magi_control;
mod read;
mod view_image;
mod web;
mod write;
use common::attempted_change_preview;
use common::bash_jev_metadata;
pub(super) use common::bounded_error_line;
use common::bounded_preview_lines;
use common::generic_tool_card;
use common::humanize_protection_metadata;
use common::plural;
use common::prompt_injection_protection_metadata;
use common::split_role_line;
use common::tool_display_line;
use common::tool_was_canceled;
use view_image::view_image_card;
use write::write_card;
use hash_edit::hash_edit_card;
use read::read_card;
use bash::bash_card;
use grep::grep_card;
use grep::grep_bool;
use grep::grep_usize;
use ast_grep::ast_grep_card;
use list_files::list_files_card;
use find::find_card;
use super::subagent_aggregation;
use super::*;
use crate::rendering::{DisplayRole, DisplaySpan, highlight::highlight_code};
use magi_control::magi_control_card;
use web::web_card;
pub(super) fn project_tool_card(
state: &MissionControlState,
id: TranscriptCardId,
link: Option<TranscriptActivityLink>,
body: &str,
) -> TranscriptCard {
let tool_capability = link
.as_ref()
.and_then(|link| ToolCapability::from_dispatch_name(&link.tool_name));
let mut card = match tool_capability {
Some(ToolCapability::ViewImage) => view_image_card(state, id, link.clone(), body),
Some(ToolCapability::Write) => write_card(state, id, link.clone(), body),
Some(ToolCapability::HashEdit) => hash_edit_card(state, id, link.clone()),
Some(ToolCapability::Read) => read_card(state, id, link.clone()),
Some(ToolCapability::Bash) => {
if is_bash_mode_response_card(state, id.entry_index, tool_capability) {
generic_tool_card(state, id, link.clone(), body)
} else {
bash_card(state, id, link.clone())
}
}
Some(ToolCapability::AstGrep) => ast_grep_card(state, id, link.clone(), body),
Some(ToolCapability::Grep) => grep_card(state, id, link.clone()),
Some(ToolCapability::ListFiles) => list_files_card(state, id, link.clone(), body),
Some(ToolCapability::Find) => find_card(state, id, link.clone()),
Some(ToolCapability::Web) => web_card(state, id, link.clone()),
Some(ToolCapability::MagiControl) => magi_control_card(state, id, link.as_ref(), body),
None if link
.as_ref()
.is_some_and(|link| link.tool_name == crate::code_mode::TOOL_NAME) =>
{
super::code_mode::project_code_mode_card(state, id, link.as_ref())
}
Some(ToolCapability::Subagents) | None => generic_tool_card(state, id, link.clone(), body),
};
let detail = link
.as_ref()
.and_then(|link| state.nodes.get(&link.activity_id))
.and_then(|node| node.tool_detail.as_ref());
if let Some(metadata) = prompt_injection_protection_metadata(detail) {
card.metadata.push(metadata);
}
card
}