mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-31 06:51:29 +00:00
Remove unused imports (F401) and duplicate/shadowed import redefinitions (F811) across the codebase using ruff's safe autofixes. No behavioral changes -- imports only. - ~1400 safe autofixes applied across 644 files (net -1072 lines) - __init__.py re-exports preserved (excluded from F401 removal so public re-export surfaces stay intact) - Re-exports that are imported or monkeypatched by tests but look unused in their defining module are kept with explicit # noqa: F401 (gateway/run.py load_dotenv; run_agent re-exports from agent.message_sanitization, agent.context_compressor, agent.retry_utils, agent.prompt_builder, agent.process_bootstrap, agent.codex_responses_adapter) - Unsafe F841 (unused-variable) fixes deliberately skipped -- those can change behavior when the RHS has side effects - ruff lints remain disabled in pyproject.toml (only PLW1514 is selected); this is a one-time cleanup, not a config change Verification: - python -m compileall: clean - pytest --collect-only: all 27161 tests collect (zero import errors) - core entry points import clean (run_agent, model_tools, cli, toolsets, hermes_state, batch_runner, gateway) - static scan: every name any test imports directly from an edited module still resolves
53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
"""Regression tests for MCP server availability in cron jobs.
|
|
|
|
Background
|
|
==========
|
|
``cron/scheduler.py:run_job()`` constructs ``AIAgent(...)`` directly without
|
|
calling ``discover_mcp_tools()`` — the initialization that CLI and gateway
|
|
paths do at startup. Cron jobs therefore never saw any MCP tools from
|
|
``mcp_servers`` in config.yaml. See #4219.
|
|
|
|
The fix inserts ``discover_mcp_tools()`` before the ``AIAgent(...)`` call,
|
|
wrapped in try/except so a broken MCP server can't kill an otherwise
|
|
working cron job. ``discover_mcp_tools`` is idempotent — subsequent ticks
|
|
short-circuit on already-connected servers.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest.mock import patch
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_no_agent_cron_job_does_not_initialize_mcp():
|
|
"""Cron jobs with no_agent=True are script-only — no AIAgent, no MCP
|
|
tools needed. We must NOT pay the MCP init cost for those."""
|
|
from cron import scheduler
|
|
|
|
job = {
|
|
"id": "noagent-job",
|
|
"name": "noagent-job",
|
|
"no_agent": True,
|
|
"script": "/nonexistent/script.sh",
|
|
}
|
|
|
|
discover_called = []
|
|
|
|
def fake_discover():
|
|
discover_called.append(True)
|
|
return []
|
|
|
|
# _run_job_script returns (ok, output); make it fail cleanly so we
|
|
# don't need a real script file.
|
|
with patch("tools.mcp_tool.discover_mcp_tools", side_effect=fake_discover), \
|
|
patch("cron.scheduler._run_job_script", return_value=(False, "no such file")):
|
|
scheduler.run_job(job)
|
|
|
|
assert not discover_called, (
|
|
"discover_mcp_tools was called for a no_agent job — wasted MCP init "
|
|
"for a script-only cron tick"
|
|
)
|