fix(goose): propagate session_id across providers and MCP (#6584)
Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
@@ -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" }
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user