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;