feat: persist GooseMode per-session via session DB (#7854)

Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
Adrian Cole
2026-03-16 19:37:21 +08:00
committed by GitHub
parent 2631095f20
commit 94fdcdd07a
42 changed files with 953 additions and 147 deletions
+15 -3
View File
@@ -128,14 +128,19 @@ impl GatewayHandler {
user.display_name.as_deref().unwrap_or(&user.user_id)
);
let config = Config::global();
let session = self
.agent_manager
.session_manager()
.create_session(working_dir, session_name, SessionType::Gateway)
.create_session(
working_dir,
session_name,
SessionType::Gateway,
config.get_goose_mode().unwrap_or_default(),
)
.await?;
let manager = self.agent_manager.session_manager();
let config = Config::global();
// Store the current provider and model config on the session so the agent
// can be restored after LRU eviction, matching the start_agent flow.
@@ -197,6 +202,7 @@ impl GatewayHandler {
let current_provider = config.get_goose_provider().ok();
let current_model_name = config.get_goose_model().ok();
let current_extensions = get_enabled_extensions();
let current_mode = config.get_goose_mode().unwrap_or_default();
// --- what the session has ---
let session_extensions: Vec<ExtensionConfig> =
@@ -208,8 +214,9 @@ impl GatewayHandler {
let model_changed = current_model_name.as_deref()
!= session.model_config.as_ref().map(|m| m.model_name.as_str());
let extensions_changed = current_extensions != session_extensions;
let mode_changed = current_mode != session.goose_mode;
if !provider_changed && !model_changed && !extensions_changed {
if !provider_changed && !model_changed && !extensions_changed && !mode_changed {
return Ok(false);
}
@@ -218,6 +225,7 @@ impl GatewayHandler {
provider_changed,
model_changed,
extensions_changed,
mode_changed,
"syncing gateway session with current config"
);
@@ -242,6 +250,10 @@ impl GatewayHandler {
}
}
if mode_changed {
update = update.goose_mode(current_mode);
}
update.apply().await?;
Ok(extensions_changed)
}