Files
hermes-agent/tests/gateway/test_memory_trim_housekeeping.py
Ryder Freeman da43a8527b feat(mem): config-driven allocator trim with telemetry and lifecycle coverage
Add config-driven glibc malloc_trim for long-lived Hermes processes:
- hermes_cli/mem_trim.py: trim_memory() with configurable cooldown,
  RSS snapshot telemetry, and forced-trim INFO logging
- gateway/run.py: periodic trim in gateway housekeeping loop
- tui_gateway/server.py: trim in idle reaper (~every 5 min)
- tui_gateway/slash_worker.py: trim on turn boundary
- run_agent.py: force trim on agent close
- hermes_cli/config.py: context.memory_trim config section
  (enabled, cooldown_seconds, log_every_n, info_log_min_delta_mb)

CSA tier-4 reviewed (4 rounds, 0 HIGH/MEDIUM/CRITICAL remaining).

Supersedes PR #63708 + #64591 with enhanced telemetry and gateway/slash_worker coverage.
2026-08-02 22:44:38 +05:30

33 lines
803 B
Python

"""Memory-trim coverage for the long-lived messaging gateway housekeeper."""
import gateway.run as gateway_run
class _OneTickStopEvent:
"""Run one housekeeping tick without a sleep or background thread."""
def __init__(self):
self.waited = False
def is_set(self):
return self.waited
def wait(self, timeout=None):
self.waited = True
return True
def test_gateway_housekeeping_calls_periodic_memory_trim(monkeypatch):
import hermes_cli.mem_trim as mem_trim
calls = []
monkeypatch.setattr(
mem_trim,
"trim_memory",
lambda **kwargs: calls.append(kwargs) or True,
)
gateway_run._start_gateway_housekeeping(_OneTickStopEvent(), interval=0)
assert calls == [{"reason": "messaging gateway housekeeping"}]