"""Concrete CLI sinks own filtering; generic agent callbacks remain observable.""" from types import SimpleNamespace import pytest import hermes_yaml as yaml from agent.status_output import StatusOutputMixin from hermes_cli.cli_stream_mixin import CLIStreamMixin class Agent(StatusOutputMixin): suppress_status_output = True platform = "cli" def _touch_activity(self, *args): pass class CLI(CLIStreamMixin): _spinner_text = "" def _invalidate(self): pass @pytest.mark.parametrize("setting", [None, False, True]) def test_cli_notice_and_wait_callbacks_keep_default_output(tmp_path, monkeypatch, setting): import cli monkeypatch.setenv("HERMES_HOME", str(tmp_path)) (tmp_path / "config.yaml").write_text(yaml.safe_dump( {} if setting is None else {"display": {"suppress_warning_notifications": setting}})) printed = [] monkeypatch.setattr(cli, "_cprint", printed.append) surface = CLI() agent = Agent() surface.agent = agent agent.notice_callback = surface._on_notice agent.thinking_callback = surface._on_thinking agent._emit_notice(SimpleNamespace(level="warn", text="arbitrary warning wording")) agent._emit_diagnostic_wait("arbitrary retry wording") surface._flush_credit_notices() assert bool(printed) is not (setting is True) assert surface._spinner_text == ("" if setting is True else "arbitrary retry wording") agent._emit_notice(SimpleNamespace(level="info", text="ordinary progress")) agent._emit_wait_notice("⚠ requested progress") surface._flush_credit_notices() assert "ordinary progress" in printed[-1] assert surface._spinner_text == "⚠ requested progress"