Complete agent monitoring and Galaxy Control integration
- expose command-monitor conversations and preserve visible agent transcripts - add bounded polling and a dedicated shell interrupt tool - improve direct-provider images, skills, tool history, and usage handling - package and brand Galaxy Control across releases, installers, persistence, and docs
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
use std::time::Duration;
|
||||
|
||||
use galaxy_terminal::model::escape_sequences;
|
||||
|
||||
use super::{get_action_icon, get_action_loading_text, should_retain_task_output_message};
|
||||
use crate::ai::agent::task::TaskId;
|
||||
use crate::ai::agent::{
|
||||
AIAgentAction, AIAgentActionId, AIAgentActionType, AIAgentOutputMessageType,
|
||||
AIAgentPtyWriteMode, AIAgentText, ShellCommandDelay,
|
||||
};
|
||||
use crate::terminal::model::block::BlockId;
|
||||
use crate::ui_components::icons::Icon;
|
||||
|
||||
#[test]
|
||||
fn command_output_poll_has_visible_monitor_status() {
|
||||
let action = AIAgentActionType::ReadShellCommandOutput {
|
||||
block_id: BlockId::new(),
|
||||
delay: Some(ShellCommandDelay::Duration(Duration::from_secs(2))),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
get_action_loading_text(action.clone()).as_deref(),
|
||||
Some("Checking the running command output…")
|
||||
);
|
||||
assert_eq!(get_action_icon(action), Some(Icon::ClockRefresh));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn typed_interrupt_has_distinct_visible_status() {
|
||||
let action = AIAgentActionType::WriteToLongRunningShellCommand {
|
||||
block_id: BlockId::new(),
|
||||
input: vec![escape_sequences::C0::ETX].into(),
|
||||
mode: AIAgentPtyWriteMode::Raw,
|
||||
};
|
||||
|
||||
assert!(action.is_shell_command_interrupt());
|
||||
assert_eq!(
|
||||
get_action_loading_text(action.clone()).as_deref(),
|
||||
Some("Interrupting the running command with Ctrl+C…")
|
||||
);
|
||||
assert_eq!(get_action_icon(action), Some(Icon::Stop));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn transcript_retains_prior_text_but_only_latest_tool_activity() {
|
||||
let text = AIAgentOutputMessageType::Text(AIAgentText { sections: vec![] });
|
||||
assert!(should_retain_task_output_message(&text, false));
|
||||
|
||||
let poll = AIAgentOutputMessageType::Action(AIAgentAction {
|
||||
id: AIAgentActionId::from("poll".to_string()),
|
||||
task_id: TaskId::new("cli-task".to_string()),
|
||||
action: AIAgentActionType::ReadShellCommandOutput {
|
||||
block_id: BlockId::new(),
|
||||
delay: None,
|
||||
},
|
||||
requires_result: true,
|
||||
tool_name: Some("read_shell_command_output".to_string()),
|
||||
});
|
||||
assert!(!should_retain_task_output_message(&poll, false));
|
||||
assert!(should_retain_task_output_message(&poll, true));
|
||||
}
|
||||
Reference in New Issue
Block a user