magi-code 0.64.0

Repository-aware CLI coding agent for terminal work
Documentation
use super::*;
use crate::tui::transcript_cards::{
    project_cards, project_entry_count_for_test, reset_project_entry_count_for_test,
};

fn cached_render_line_text(lines: &[Line<'static>]) -> String {
    lines
        .iter()
        .map(|line| {
            line.spans
                .iter()
                .map(|span| span.content.as_ref())
                .collect::<String>()
        })
        .collect::<Vec<_>>()
        .join("\n")
}

fn session_row(id: &str) -> SessionPickerRow {
    SessionPickerRow {
        id: id.to_string(),
        label: id.to_string(),
        is_current: false,
        preview: None,
    }
}

fn skill_row(name: &str) -> SkillToggleRow {
    SkillToggleRow {
        name: name.to_string(),
        source: "test".to_string(),
        enabled: true,
    }
}

fn assert_all_picker_clamps(
    selected: usize,
    _scroll: usize,
    _visible_rows: usize,
    expected: (usize, usize),
) {
    let mut session = SessionPickerState {
        rows: vec![session_row("a"), session_row("b"), session_row("c")],
        selected,
        focus: SessionPickerFocus::List,
    };
    session.clamp();
    assert_eq!(session.selected, expected.0.min(2));

    let mut skills = SkillsModalState {
        rows: vec![skill_row("a"), skill_row("b"), skill_row("c")],
        selected,
        settings_scope: crate::config::SettingsScope::Global,
        scope_label: "Global".to_string(),
    };
    skills.clamp();
    assert_eq!(skills.selected, expected.0.min(2));
}
fn test_tool_call(
    id: &str,
    name: &str,
    arguments: serde_json::Value,
) -> crate::providers::ToolCall {
    crate::providers::ToolCall {
        id: id.to_string(),
        name: name.to_string(),
        arguments,
    }
}

fn test_tool_result(
    name: &str,
    success: bool,
    content: &str,
    metadata: serde_json::Value,
) -> crate::tools::ToolResult {
    crate::tools::ToolResult {
        tool_name: name.to_string(),
        success,
        content: content.to_string(),
        metadata,
        display: crate::tools::ToolResultDisplay::default(),
    }
}

fn apply_tool_result(
    state: &mut MissionControlState,
    call: crate::providers::ToolCall,
    result: crate::tools::ToolResult,
) {
    let summary = crate::output::tool_display_summary(&call, &result);
    state.apply_output_event(&OutputEvent::ToolResult {
        call: Box::new(call),
        result: Box::new(result),
        summary: Box::new(summary),
    });
}

fn apply_tool_started(
    state: &mut MissionControlState,
    call: crate::providers::ToolCall,
    label: &str,
) {
    state.apply_output_event(&OutputEvent::ToolStarted {
        call: Box::new(call),
        label: label.to_string(),
    });
}

fn subagents_call() -> crate::providers::ToolCall {
    test_tool_call(
        "call_subagents",
        "subagents",
        serde_json::json!({
            "tasks": [
                {"identity":"frontend-dev"},
                {"agent":"reviewer"}
            ]
        }),
    )
}

fn autocomplete_candidates() -> Vec<AutocompleteCandidate> {
    vec![
        AutocompleteCandidate::slash_command("new", "start a new session"),
        AutocompleteCandidate::slash_command("quit", "exit magi-code"),
    ]
}

fn file_autocomplete_candidates() -> Vec<AutocompleteCandidate> {
    vec![
        AutocompleteCandidate::slash_command("new", "start a new session"),
        AutocompleteCandidate::file_tag("README.md"),
        AutocompleteCandidate::file_tag("src/tui/input/autocomplete.rs"),
        AutocompleteCandidate::file_tag("src/main.rs"),
    ]
}

mod activity;
mod git_context;
mod layout_focus;
mod misc;
mod modals;
mod pickers;
mod provider_context_injection;
mod transcript;