magi-code 0.96.1

Repository-aware CLI coding agent for terminal work
Documentation
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
}