fix(goose): propagate session_id across providers and MCP (#6584)

Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
Adrian Cole
2026-01-22 09:28:56 +09:00
committed by GitHub
parent f3bae7ea7a
commit 67de49abbb
61 changed files with 1457 additions and 616 deletions
+1
View File
@@ -44,6 +44,7 @@ hex = "0.4.3"
socket2 = "0.6.1"
fs2 = "0.4.3"
rustls = { version = "0.23", features = ["ring"] }
uuid = { version = "1.19.0", features = ["v4"] }
[target.'cfg(windows)'.dependencies]
winreg = { version = "0.55.0" }
+3 -2
View File
@@ -846,6 +846,7 @@ async fn read_resource(
let read_result = agent
.extension_manager
.read_resource(
&payload.session_id,
&payload.uri,
&payload.extension_name,
CancellationToken::default(),
@@ -984,14 +985,14 @@ async fn list_apps(
};
let agent = state
.get_agent_for_route(session_id)
.get_agent_for_route(session_id.clone())
.await
.map_err(|status| ErrorResponse {
message: "Failed to get agent".to_string(),
status,
})?;
let apps = fetch_mcp_apps(&agent.extension_manager)
let apps = fetch_mcp_apps(&agent.extension_manager, &session_id)
.await
.map_err(|e| ErrorResponse {
message: format!("Failed to list apps: {}", e.message),
@@ -28,6 +28,7 @@ use serde_json::Value;
use serde_yaml;
use std::{collections::HashMap, sync::Arc};
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Serialize, ToSchema)]
pub struct ExtensionResponse {
@@ -401,8 +402,10 @@ pub async fn get_provider_models(
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
// Config endpoints have no user session; use an ephemeral id for the probe.
let session_id = Uuid::new_v4().to_string();
let models_result = retry_operation(&RetryConfig::default(), || async {
provider.fetch_recommended_models().await
provider.fetch_recommended_models(&session_id).await
})
.await;
@@ -582,8 +585,10 @@ pub async fn detect_provider(
Json(detect_request): Json<DetectProviderRequest>,
) -> Result<Json<DetectProviderResponse>, StatusCode> {
let api_key = detect_request.api_key.trim();
// Provider detection runs without a user session; use an ephemeral id.
let session_id = Uuid::new_v4().to_string();
match detect_provider_from_api_key(api_key).await {
match detect_provider_from_api_key(&session_id, api_key).await {
Some((provider_name, models)) => Ok(Json(DetectProviderResponse {
provider_name,
models,
+2 -2
View File
@@ -179,7 +179,7 @@ async fn create_recipe(
}
};
let conversation = match session.conversation {
let conversation = match session.conversation.clone() {
Some(conversation) => conversation,
None => {
let error_message = "Session has no conversation".to_string();
@@ -193,7 +193,7 @@ async fn create_recipe(
let agent = state.get_agent_for_route(request.session_id).await?;
let recipe_result = agent.create_recipe(conversation).await;
let recipe_result = agent.create_recipe(&session.id, conversation).await;
match recipe_result {
Ok(mut recipe) => {