commands to acp+ migration: extensions management (#8733)

This commit is contained in:
Alex Hancock
2026-04-22 15:23:02 -04:00
committed by GitHub
parent ee46794b18
commit e7e50320a1
13 changed files with 303 additions and 204 deletions
+68 -1
View File
@@ -2870,7 +2870,17 @@ impl GooseAcpAgent {
let warnings = crate::config::extensions::get_warnings();
let extensions_json = extensions
.into_iter()
.map(|e| serde_json::to_value(&e))
.map(|e| {
let config_key = e.config.key();
let mut value = serde_json::to_value(&e)?;
if let Some(obj) = value.as_object_mut() {
obj.insert(
"config_key".to_string(),
serde_json::Value::String(config_key),
);
}
Ok::<_, serde_json::Error>(value)
})
.collect::<Result<Vec<_>, _>>()
.map_err(|e| sacp::Error::internal_error().data(e.to_string()))?;
Ok(GetExtensionsResponse {
@@ -2879,6 +2889,63 @@ impl GooseAcpAgent {
})
}
#[custom_method(AddConfigExtensionRequest)]
async fn on_add_config_extension(
&self,
req: AddConfigExtensionRequest,
) -> Result<EmptyResponse, sacp::Error> {
let mut obj = match req.extension_config {
serde_json::Value::Object(obj) => obj,
_ => {
return Err(
sacp::Error::invalid_params().data("extensionConfig must be a JSON object")
);
}
};
obj.insert(
"name".to_string(),
serde_json::Value::String(req.name.clone()),
);
let config: crate::agents::ExtensionConfig =
serde_json::from_value(serde_json::Value::Object(obj))
.map_err(|e| sacp::Error::invalid_params().data(format!("bad config: {e}")))?;
crate::config::extensions::set_extension(crate::config::extensions::ExtensionEntry {
enabled: req.enabled,
config,
});
Ok(EmptyResponse {})
}
#[custom_method(RemoveConfigExtensionRequest)]
async fn on_remove_config_extension(
&self,
req: RemoveConfigExtensionRequest,
) -> Result<EmptyResponse, sacp::Error> {
let keys = crate::config::extensions::get_all_extension_names();
if !keys.iter().any(|k| k == &req.config_key) {
return Err(sacp::Error::invalid_params()
.data(format!("Extension '{}' not found", req.config_key)));
}
crate::config::extensions::remove_extension(&req.config_key);
Ok(EmptyResponse {})
}
#[custom_method(ToggleConfigExtensionRequest)]
async fn on_toggle_config_extension(
&self,
req: ToggleConfigExtensionRequest,
) -> Result<EmptyResponse, sacp::Error> {
let keys = crate::config::extensions::get_all_extension_names();
if !keys.iter().any(|k| k == &req.config_key) {
return Err(sacp::Error::invalid_params()
.data(format!("Extension '{}' not found", req.config_key)));
}
crate::config::extensions::set_extension_enabled(&req.config_key, req.enabled);
Ok(EmptyResponse {})
}
#[custom_method(GetSessionExtensionsRequest)]
async fn on_get_session_extensions(
&self,