ACP Wrap up

This commit is contained in:
2026-08-05 08:10:41 -05:00
parent 2015498831
commit 993abb96df
23 changed files with 1459 additions and 1194 deletions
+6 -6
View File
@@ -74,18 +74,18 @@ pub struct AcpAgentRuntime {
}
impl AcpAgentRuntime {
#[must_use]
pub const fn capabilities() -> RuntimeCapabilities {
RuntimeCapabilities::session_runtime()
}
#[must_use]
pub fn new(manager: AcpSessionManager, config: AcpAgentRuntimeConfig) -> Self {
let descriptor = RuntimeDescriptor {
id: config.runtime_id.clone(),
display_name: config.display_name.clone(),
kind: RuntimeKind::Acp,
capabilities: RuntimeCapabilities {
model_selection: false,
session_resume: true,
steering: true,
tool_permissions: true,
},
capabilities: Self::capabilities(),
};
Self {
manager,
+42
View File
@@ -21,6 +21,48 @@ pub struct RuntimeCapabilities {
pub session_resume: bool,
pub steering: bool,
pub tool_permissions: bool,
/// Galaxy owns and persists the message history supplied to each turn.
pub host_managed_history: bool,
/// Tool proposals cross the runtime boundary for Galaxy to approve and execute.
pub host_tool_execution: bool,
/// A failed turn can be safely replayed from the same request payload.
pub request_retries: bool,
/// Galaxy can append corrective instructions and start a follow-up turn.
pub corrective_retries: bool,
/// Transcript events can be forwarded through Galaxy shared sessions.
pub shared_session_sync: bool,
}
impl RuntimeCapabilities {
#[must_use]
pub const fn provider() -> Self {
Self {
model_selection: true,
session_resume: false,
steering: false,
tool_permissions: false,
host_managed_history: true,
host_tool_execution: true,
request_retries: true,
corrective_retries: true,
shared_session_sync: true,
}
}
#[must_use]
pub const fn session_runtime() -> Self {
Self {
model_selection: false,
session_resume: true,
steering: true,
tool_permissions: true,
host_managed_history: false,
host_tool_execution: false,
request_retries: false,
corrective_retries: false,
shared_session_sync: false,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
@@ -120,3 +120,22 @@ fn turn_control_delivers_cancel_and_steering_in_order() {
assert_eq!(control.receive().await.unwrap(), TurnCommand::Cancel);
});
}
#[test]
fn runtime_shapes_publish_controller_policy_as_capabilities() {
let provider = RuntimeCapabilities::provider();
assert!(provider.host_managed_history);
assert!(provider.host_tool_execution);
assert!(provider.request_retries);
assert!(provider.corrective_retries);
assert!(provider.shared_session_sync);
assert!(!provider.steering);
let session = RuntimeCapabilities::session_runtime();
assert!(!session.host_managed_history);
assert!(!session.host_tool_execution);
assert!(!session.request_retries);
assert!(!session.corrective_retries);
assert!(!session.shared_session_sync);
assert!(session.steering);
}
+1 -6
View File
@@ -47,12 +47,7 @@ impl BedrockRuntime {
id: format!("rig-bedrock:{resolved_model}"),
display_name: format!("Rig / Bedrock / {resolved_model}"),
kind: RuntimeKind::Provider,
capabilities: RuntimeCapabilities {
model_selection: true,
session_resume: false,
steering: false,
tool_permissions: false,
},
capabilities: RuntimeCapabilities::provider(),
};
Ok(Self {
@@ -31,12 +31,7 @@ impl OpenAICompatibleRuntime {
id: format!("rig-openai-compatible:{}", config.model),
display_name: format!("Rig / {}", config.model),
kind: RuntimeKind::Provider,
capabilities: RuntimeCapabilities {
model_selection: true,
session_resume: false,
steering: false,
tool_permissions: false,
},
capabilities: RuntimeCapabilities::provider(),
};
Self { config, descriptor }
}
+11
View File
@@ -4909,6 +4909,17 @@ impl GetSingletonModelHandle for AppContext {
}
impl AppContext {
/// Returns a singleton model when it has already been registered.
///
/// This is useful for infrastructure models that can also be constructed
/// in isolation by tests before the full application singleton graph is
/// available.
pub fn try_get_singleton_model_as_ref<T: SingletonEntity>(&self) -> Option<&T> {
self.singleton_models
.get(&std::any::TypeId::of::<T>())?
.downcast_ref(self)
}
pub(super) fn get_singleton_model_as_ref<T: SingletonEntity>(&self) -> &T {
match self.singleton_models.get(&std::any::TypeId::of::<T>()) {
Some(model_handle) => model_handle