128 lines
3.5 KiB
Rust
128 lines
3.5 KiB
Rust
use agent_client_protocol::schema::v1::{
|
|
AgentCapabilities, ContentBlock, SessionId, TextContent, ToolCallId, ToolCallStatus,
|
|
};
|
|
use galaxy_agent_core::{
|
|
AgentEvent, ContentPart, MessageContent, RuntimeActivity, RuntimeActivityStatus,
|
|
};
|
|
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn shared_prompt_converts_once_to_official_acp_content() {
|
|
let prompt = MessageContent::MultiPart(vec![
|
|
ContentPart::Text("describe this".to_owned()),
|
|
ContentPart::Image {
|
|
data: b"image".to_vec(),
|
|
mime_type: "image/png".to_owned(),
|
|
},
|
|
]);
|
|
|
|
let content = prompt_content(prompt).expect("prompt conversion");
|
|
|
|
assert!(matches!(
|
|
&content[0],
|
|
ContentBlock::Text(text) if text.text == "describe this"
|
|
));
|
|
assert!(matches!(
|
|
&content[1],
|
|
ContentBlock::Image(image)
|
|
if image.data == "aW1hZ2U="
|
|
&& image.mime_type == "image/png"
|
|
&& image.uri.is_none()
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn provider_tool_history_is_rejected_as_an_acp_prompt() {
|
|
let error = prompt_content(MessageContent::ToolUse {
|
|
tool_use_id: "tool-1".to_owned(),
|
|
name: "shell".to_owned(),
|
|
input: serde_json::json!({}),
|
|
})
|
|
.expect_err("tool history must be rejected");
|
|
|
|
assert_eq!(error.kind, AgentErrorKind::InvalidRequest);
|
|
}
|
|
|
|
#[test]
|
|
fn session_start_updates_state_before_emitting_turn_started() {
|
|
let state = Arc::new(Mutex::new(AcpRuntimeState::default()));
|
|
let mut tool_titles = HashMap::new();
|
|
|
|
let event = map_event(
|
|
AcpEvent::SessionStarted {
|
|
session_id: SessionId::new("session-42"),
|
|
agent_info: None,
|
|
capabilities: AgentCapabilities::default(),
|
|
can_load: true,
|
|
can_steer: true,
|
|
},
|
|
&state,
|
|
&mut tool_titles,
|
|
)
|
|
.expect("event mapping");
|
|
|
|
assert_eq!(
|
|
event,
|
|
Some(AgentEvent::TurnStarted {
|
|
runtime_request_id: "session-42".to_owned(),
|
|
})
|
|
);
|
|
assert_eq!(
|
|
*state.lock().expect("state"),
|
|
AcpRuntimeState {
|
|
session_id: Some("session-42".to_owned()),
|
|
can_load: true,
|
|
can_steer: true,
|
|
config_options: Vec::new(),
|
|
}
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn acp_tool_progress_is_runtime_activity_not_a_host_tool_proposal() {
|
|
let state = Arc::new(Mutex::new(AcpRuntimeState::default()));
|
|
let mut tool_titles = HashMap::new();
|
|
|
|
let event = map_event(
|
|
AcpEvent::ToolCall {
|
|
id: ToolCallId::new("tool-1"),
|
|
title: "Run tests".to_owned(),
|
|
status: ToolCallStatus::InProgress,
|
|
output: Some("test_a ... ok".to_owned()),
|
|
},
|
|
&state,
|
|
&mut tool_titles,
|
|
)
|
|
.expect("event mapping");
|
|
|
|
assert_eq!(
|
|
event,
|
|
Some(AgentEvent::RuntimeActivityUpdated {
|
|
activity: RuntimeActivity {
|
|
id: "tool-1".to_owned(),
|
|
title: "Run tests".to_owned(),
|
|
status: Some(RuntimeActivityStatus::InProgress),
|
|
output: Some("test_a ... ok".to_owned()),
|
|
},
|
|
})
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn unsolicited_user_echo_is_not_exposed_as_visible_input() {
|
|
let state = Arc::new(Mutex::new(AcpRuntimeState::default()));
|
|
let mut tool_titles = HashMap::new();
|
|
|
|
let event = map_event(
|
|
AcpEvent::UserContent {
|
|
content: ContentBlock::Text(TextContent::new("hidden Galaxy context")),
|
|
},
|
|
&state,
|
|
&mut tool_titles,
|
|
)
|
|
.expect("event mapping");
|
|
|
|
assert_eq!(event, None);
|
|
}
|