mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-23 05:31:23 +00:00
fix: stop retrying initial MCP auth failures
This commit is contained in:
parent
1dd33988e2
commit
1247ff2dca
2 changed files with 44 additions and 0 deletions
|
|
@ -1592,6 +1592,40 @@ class TestReconnection:
|
||||||
|
|
||||||
asyncio.run(_test())
|
asyncio.run(_test())
|
||||||
|
|
||||||
|
def test_initial_oauth_failure_does_not_retry(self):
|
||||||
|
"""Initial OAuth failures stop immediately to avoid repeated browser prompts."""
|
||||||
|
from tools.mcp_tool import MCPServerTask
|
||||||
|
|
||||||
|
run_count = 0
|
||||||
|
target_server = None
|
||||||
|
oauth_error = RuntimeError("Token exchange failed (400): Unknown client_id")
|
||||||
|
|
||||||
|
original_run_stdio = MCPServerTask._run_stdio
|
||||||
|
|
||||||
|
async def patched_run_stdio(self_srv, config):
|
||||||
|
nonlocal run_count, target_server
|
||||||
|
run_count += 1
|
||||||
|
if target_server is not self_srv:
|
||||||
|
return await original_run_stdio(self_srv, config)
|
||||||
|
raise oauth_error
|
||||||
|
|
||||||
|
async def _test():
|
||||||
|
nonlocal target_server
|
||||||
|
server = MCPServerTask("oauth_srv")
|
||||||
|
target_server = server
|
||||||
|
|
||||||
|
with patch.object(MCPServerTask, "_run_stdio", patched_run_stdio), \
|
||||||
|
patch("tools.mcp_tool._is_auth_error", return_value=True), \
|
||||||
|
patch("asyncio.sleep", new_callable=AsyncMock) as mock_sleep:
|
||||||
|
await server.run({"command": "test"})
|
||||||
|
|
||||||
|
assert run_count == 1
|
||||||
|
assert server._error is oauth_error
|
||||||
|
assert server._ready.is_set()
|
||||||
|
assert mock_sleep.await_count == 0
|
||||||
|
|
||||||
|
asyncio.run(_test())
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Configurable timeouts
|
# Configurable timeouts
|
||||||
|
|
|
||||||
|
|
@ -1499,6 +1499,16 @@ class MCPServerTask:
|
||||||
# should not permanently kill the server.
|
# should not permanently kill the server.
|
||||||
# (Ported from Kilo Code's MCP resilience fix.)
|
# (Ported from Kilo Code's MCP resilience fix.)
|
||||||
if not self._ready.is_set():
|
if not self._ready.is_set():
|
||||||
|
if _is_auth_error(exc):
|
||||||
|
logger.warning(
|
||||||
|
"MCP server '%s' failed initial OAuth authentication, "
|
||||||
|
"not retrying automatically: %s",
|
||||||
|
self.name, exc,
|
||||||
|
)
|
||||||
|
self._error = exc
|
||||||
|
self._ready.set()
|
||||||
|
return
|
||||||
|
|
||||||
initial_retries += 1
|
initial_retries += 1
|
||||||
if initial_retries > _MAX_INITIAL_CONNECT_RETRIES:
|
if initial_retries > _MAX_INITIAL_CONNECT_RETRIES:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue