fix(acp): preserve session MCP toolsets across model switches

This commit is contained in:
izumi0uu
2026-06-09 18:04:27 +08:00
committed by kshitij
parent 0571c4e887
commit 2ae7ccd10b
2 changed files with 11 additions and 2 deletions

View File

@@ -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

View File

@@ -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,
}