From 30dd3a4d2b2ef490a1b2d5cdf925d973eea3da75 Mon Sep 17 00:00:00 2001 From: john Date: Tue, 8 Sep 2026 22:03:52 +0800 Subject: [PATCH] Add PUT /sessions/{id} for legacy conversation updates in tkmind compat. Portal direct-chat mirror and tool-history repair expect this route. Co-authored-by: Cursor --- crates/goose/src/acp/tkmind/compat.rs | 35 ++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/crates/goose/src/acp/tkmind/compat.rs b/crates/goose/src/acp/tkmind/compat.rs index 85443df1a..a80b4b5f8 100644 --- a/crates/goose/src/acp/tkmind/compat.rs +++ b/crates/goose/src/acp/tkmind/compat.rs @@ -3,12 +3,14 @@ use std::sync::Arc; use axum::{ extract::{Path, State}, http::StatusCode, - routing::{delete, get}, + routing::{delete, get, put}, Json, Router, }; use crate::agents::ExtensionConfig; use crate::config::Config; +use crate::conversation::message::Message; +use crate::conversation::Conversation; use crate::session::{EnabledExtensionsState, Session}; use super::state::AppState; @@ -92,11 +94,42 @@ async fn get_session( .map_err(|_| StatusCode::NOT_FOUND) } +#[derive(serde::Deserialize)] +struct UpdateLegacySessionRequest { + conversation: Option>, +} + +async fn update_session( + State(state): State>, + Path(session_id): Path, + Json(payload): Json, +) -> Result { + state + .session_manager() + .get_session(&session_id, false) + .await + .map_err(|_| StatusCode::NOT_FOUND)?; + + let Some(messages) = payload.conversation else { + return Ok(StatusCode::OK); + }; + + let conversation = Conversation::new_unvalidated(messages); + state + .session_manager() + .replace_conversation(&session_id, &conversation) + .await + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; + + Ok(StatusCode::OK) +} + pub fn routes(state: Arc) -> Router { Router::new() .route("/sessions", get(list_sessions)) .route("/sessions/{session_id}", get(get_session)) .route("/sessions/{session_id}/extensions", get(get_session_extensions)) + .route("/sessions/{session_id}", put(update_session)) .route("/sessions/{session_id}", delete(delete_session)) .with_state(state) }