feat(tui): add extension management screen (#8536)

This commit is contained in:
Alex Hancock
2026-04-15 13:39:01 -04:00
committed by GitHub
parent c9507ba672
commit ea236ab664
13 changed files with 753 additions and 141 deletions
+5
View File
@@ -35,6 +35,11 @@
"requestType": "GetExtensionsRequest",
"responseType": "GetExtensionsResponse"
},
{
"method": "_goose/session/extensions",
"requestType": "GetSessionExtensionsRequest",
"responseType": "GetSessionExtensionsResponse"
},
{
"method": "_goose/session/provider/update",
"requestType": "UpdateProviderRequest",
+44
View File
@@ -168,6 +168,33 @@
"x-side": "agent",
"x-method": "_goose/config/extensions"
},
"GetSessionExtensionsRequest": {
"type": "object",
"properties": {
"sessionId": {
"type": "string"
}
},
"required": [
"sessionId"
],
"x-side": "agent",
"x-method": "_goose/session/extensions"
},
"GetSessionExtensionsResponse": {
"type": "object",
"properties": {
"extensions": {
"type": "array",
"items": {}
}
},
"required": [
"extensions"
],
"x-side": "agent",
"x-method": "_goose/session/extensions"
},
"UpdateProviderRequest": {
"type": "object",
"properties": {
@@ -710,6 +737,15 @@
"description": "Params for _goose/config/extensions",
"title": "GetExtensionsRequest"
},
{
"allOf": [
{
"$ref": "#/$defs/GetSessionExtensionsRequest"
}
],
"description": "Params for _goose/session/extensions",
"title": "GetSessionExtensionsRequest"
},
{
"allOf": [
{
@@ -898,6 +934,14 @@
],
"title": "GetExtensionsResponse"
},
{
"allOf": [
{
"$ref": "#/$defs/GetSessionExtensionsResponse"
}
],
"title": "GetSessionExtensionsResponse"
},
{
"allOf": [
{
+28
View File
@@ -2291,6 +2291,34 @@ impl GooseAcpAgent {
})
}
#[custom_method(GetSessionExtensionsRequest)]
async fn on_get_session_extensions(
&self,
req: GetSessionExtensionsRequest,
) -> Result<GetSessionExtensionsResponse, sacp::Error> {
let internal_id = self.internal_session_id(&req.session_id).await?;
let session = self
.session_manager
.get_session(&internal_id, false)
.await
.map_err(|e| sacp::Error::internal_error().data(e.to_string()))?;
let extensions = EnabledExtensionsState::extensions_or_default(
Some(&session.extension_data),
goose::config::Config::global(),
);
let extensions_json = extensions
.into_iter()
.map(|e| serde_json::to_value(&e))
.collect::<Result<Vec<_>, _>>()
.map_err(|e| sacp::Error::internal_error().data(e.to_string()))?;
Ok(GetSessionExtensionsResponse {
extensions: extensions_json,
})
}
#[custom_method(UpdateProviderRequest)]
async fn on_update_provider(
&self,
+12
View File
@@ -104,6 +104,18 @@ pub struct GetExtensionsResponse {
pub warnings: Vec<String>,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)]
#[request(method = "_goose/session/extensions", response = GetSessionExtensionsResponse)]
#[serde(rename_all = "camelCase")]
pub struct GetSessionExtensionsRequest {
pub session_id: String,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcResponse)]
pub struct GetSessionExtensionsResponse {
pub extensions: Vec<serde_json::Value>,
}
/// Atomically update the provider for a live session.
#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)]
#[request(method = "_goose/session/provider/update", response = UpdateProviderResponse)]