Add ACP agent backend and terminal controls
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
use std::collections::HashMap;
|
||||
use std::sync::Arc;
|
||||
|
||||
use super::{galaxy_mcp_args, request_user_query, GalaxyMcpTarget};
|
||||
use crate::ai::agent::api::RequestParams;
|
||||
use crate::ai::agent::{AIAgentInput, EntrypointType, RequestMetadata, UserQueryMode};
|
||||
|
||||
#[test]
|
||||
fn galaxy_mcp_is_pinned_to_the_app_process_and_full_terminal_hierarchy() {
|
||||
let target = GalaxyMcpTarget {
|
||||
window_id: "WindowId(7)".to_owned(),
|
||||
tab_id: "EntityId(21)".to_owned(),
|
||||
pane_id: "Pane Terminal (42)".to_owned(),
|
||||
};
|
||||
let args = galaxy_mcp_args(&target, true, true);
|
||||
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
"--galaxyctrl",
|
||||
"mcp",
|
||||
"--pid",
|
||||
&std::process::id().to_string(),
|
||||
"--window",
|
||||
"WindowId(7)",
|
||||
"--tab",
|
||||
"EntityId(21)",
|
||||
"--pane",
|
||||
"Pane Terminal (42)",
|
||||
"--agent-safe",
|
||||
"--allow-terminal-execute",
|
||||
"--allow-terminal-interrupt",
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn galaxy_mcp_omits_terminal_mutations_without_profile_permission() {
|
||||
let target = GalaxyMcpTarget {
|
||||
window_id: "WindowId(7)".to_owned(),
|
||||
tab_id: "EntityId(21)".to_owned(),
|
||||
pane_id: "Pane Terminal (42)".to_owned(),
|
||||
};
|
||||
let args = galaxy_mcp_args(&target, false, false);
|
||||
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
"--galaxyctrl",
|
||||
"mcp",
|
||||
"--pid",
|
||||
&std::process::id().to_string(),
|
||||
"--window",
|
||||
"WindowId(7)",
|
||||
"--tab",
|
||||
"EntityId(21)",
|
||||
"--pane",
|
||||
"Pane Terminal (42)",
|
||||
"--agent-safe",
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
fn request_with_entrypoint(entrypoint: EntrypointType) -> RequestParams {
|
||||
let mut params = RequestParams::new_for_test();
|
||||
params.input.push(AIAgentInput::UserQuery {
|
||||
query: "visible request".to_owned(),
|
||||
context: Arc::from([]),
|
||||
static_query_type: None,
|
||||
referenced_attachments: HashMap::new(),
|
||||
user_query_mode: UserQueryMode::Normal,
|
||||
running_command: None,
|
||||
intended_agent: None,
|
||||
});
|
||||
params.metadata = Some(RequestMetadata {
|
||||
is_autodetected_user_query: false,
|
||||
entrypoint,
|
||||
is_auto_resume_after_error: false,
|
||||
});
|
||||
params
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn explicit_user_entrypoints_keep_the_initial_query_bubble() {
|
||||
let params = request_with_entrypoint(EntrypointType::UserInitiated);
|
||||
|
||||
assert_eq!(
|
||||
request_user_query(¶ms).as_deref(),
|
||||
Some("visible request")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn automatic_and_system_entrypoints_hide_the_synthetic_query_bubble() {
|
||||
for entrypoint in [
|
||||
EntrypointType::InitProjectRules,
|
||||
EntrypointType::TriggerPassiveSuggestion { trigger: None },
|
||||
EntrypointType::AgentInitiated,
|
||||
EntrypointType::ResumeConversation,
|
||||
] {
|
||||
assert_eq!(
|
||||
request_user_query(&request_with_entrypoint(entrypoint)),
|
||||
None
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn automatic_error_resume_does_not_duplicate_the_original_user_query() {
|
||||
let mut params = request_with_entrypoint(EntrypointType::UserInitiated);
|
||||
params.metadata.as_mut().unwrap().is_auto_resume_after_error = true;
|
||||
|
||||
assert_eq!(request_user_query(¶ms), None);
|
||||
}
|
||||
Reference in New Issue
Block a user