From 2ae7ccd10b64ba184db658397e8ccdc6b813c62e Mon Sep 17 00:00:00 2001 From: izumi0uu Date: Tue, 9 Jun 2026 18:04:27 +0800 Subject: [PATCH] fix(acp): preserve session MCP toolsets across model switches --- acp_adapter/server.py | 4 ++++ acp_adapter/session.py | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/acp_adapter/server.py b/acp_adapter/server.py index 505989d07d..d9a5f0beaa 100644 --- a/acp_adapter/server.py +++ b/acp_adapter/server.py @@ -341,9 +341,13 @@ class HermesACPAgent(SlashCommandsMixin, acp.Agent): endpoint = { "base_url": getattr(state.agent, "base_url", None), "api_mode": getattr(state.agent, "api_mode", None) } + # ACP-provided MCP servers live only on the running agent's toolsets (``_register_session_mcp_servers``); + # a rebuild that re-derived them from config would silently drop every session MCP tool (#42719). state.agent = self.session_manager._make_agent( session_id=state.session_id, cwd=state.cwd, model=new_model, requested_provider=target_provider, **endpoint, + enabled_toolsets=getattr(state.agent, "enabled_toolsets", None), + disabled_toolsets=getattr(state.agent, "disabled_toolsets", None), ) self.session_manager.save_session(state.session_id) return current_provider, target_provider, new_model diff --git a/acp_adapter/session.py b/acp_adapter/session.py index dbee83263a..30863edfef 100644 --- a/acp_adapter/session.py +++ b/acp_adapter/session.py @@ -373,7 +373,10 @@ class SessionManager: # ---- internal ----------------------------------------------------------- def _make_agent(self, *, session_id: str, cwd: str, model: str | None = None, - requested_provider: str | None = None, base_url: str | None = None, api_mode: str | None = None): + requested_provider: str | None = None, base_url: str | None = None, api_mode: str | None = None, + enabled_toolsets: list[str] | None = None, disabled_toolsets: list[str] | None = None): + """``enabled_toolsets``/``disabled_toolsets`` carry a live session's toolsets into a rebuild; ``None`` derives + them from the config-declared MCP servers (fresh session).""" if self._agent_factory is not None: return self._agent_factory() @@ -395,7 +398,9 @@ class SessionManager: ] kwargs = { "platform": "acp", "quiet_mode": True, "session_id": session_id, "session_db": self._get_db(), - "enabled_toolsets": _expand_acp_enabled_toolsets(["hermes-acp"], mcp_server_names=configured_mcp_servers), + "enabled_toolsets": (list(enabled_toolsets) if enabled_toolsets is not None + else _expand_acp_enabled_toolsets(["hermes-acp"], mcp_server_names=configured_mcp_servers)), + "disabled_toolsets": list(disabled_toolsets) if disabled_toolsets is not None else None, "model": model or default_model, "cwd": cwd, }