diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-25 01:04:58 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-25 01:05:14 +0300 |
| commit | 5f1957c27bd23f73b339265d3acd32f4a21878a3 (patch) | |
| tree | 3a89bcc452130df0b18becb7aa9ec4c6008262ba /src/integration | |
| parent | 38d2b0780c50e4773d6948660873386261cde71d (diff) | |
fix: harden hermes lifecycle detection
Diffstat (limited to 'src/integration')
| -rw-r--r-- | src/integration/assets/hermes/__init__.py | 63 | ||||
| -rw-r--r-- | src/integration/tests.rs | 8 |
2 files changed, 23 insertions, 48 deletions
diff --git a/src/integration/assets/hermes/__init__.py b/src/integration/assets/hermes/__init__.py index 5474e5e3..9b1d51e2 100644 --- a/src/integration/assets/hermes/__init__.py +++ b/src/integration/assets/hermes/__init__.py @@ -1,4 +1,4 @@ -"""Hermes plugin installed by Herdr to report agent lifecycle state.""" +"""Hermes plugin installed by Herdr to report resumable session identity.""" # HERDR_INTEGRATION_ID=hermes # HERDR_INTEGRATION_VERSION=4 @@ -13,6 +13,7 @@ import time _SOURCE = "herdr:hermes" _AGENT = "hermes" +_INTERACTIVE_PLATFORMS = {"cli", "tui", "desktop", "acp"} def _base_params() -> tuple[str, str] | None: @@ -56,53 +57,35 @@ def _send(method: str, params: dict) -> None: pass -def _session_id(kwargs: dict) -> str | None: - value = kwargs.get("session_id") - if isinstance(value, str) and value: - return value - return None - - -def _report(state: str, **kwargs) -> None: - params = {"state": state} - session_id = _session_id(kwargs) - if session_id: - params["agent_session_id"] = session_id - _send("pane.report_agent", params) +def _report_session(start_source: str, **kwargs) -> None: + if kwargs.get("platform") not in _INTERACTIVE_PLATFORMS: + return + session_id = kwargs.get("session_id") + if not isinstance(session_id, str) or not session_id: + return + _send( + "pane.report_agent_session", + { + "agent_session_id": session_id, + "session_start_source": start_source, + }, + ) def _session_started(**kwargs) -> None: - session_id = _session_id(kwargs) - if session_id: - _send( - "pane.report_agent_session", - { - "agent_session_id": session_id, - "session_start_source": "startup", - }, - ) - _idle(**kwargs) - - -def _working(**kwargs) -> None: - _report("working", **kwargs) + _report_session("startup", **kwargs) -def _blocked(**kwargs) -> None: - _report("blocked", **kwargs) +def _session_reset(**kwargs) -> None: + _report_session("new", **kwargs) -def _idle(**kwargs) -> None: - _report("idle", **kwargs) +def _session_observed(**kwargs) -> None: + if kwargs.get("platform") == "cli": + _report_session("resume", **kwargs) def register(ctx): ctx.register_hook("on_session_start", _session_started) - ctx.register_hook("pre_llm_call", _working) - ctx.register_hook("pre_api_request", _working) - ctx.register_hook("pre_tool_call", _working) - ctx.register_hook("post_tool_call", _working) - ctx.register_hook("pre_approval_request", _blocked) - ctx.register_hook("post_approval_response", _working) - ctx.register_hook("post_llm_call", _idle) - ctx.register_hook("on_session_end", _idle) + ctx.register_hook("on_session_reset", _session_reset) + ctx.register_hook("pre_llm_call", _session_observed) diff --git a/src/integration/tests.rs b/src/integration/tests.rs index f695bf52..6e3c756c 100644 --- a/src/integration/tests.rs +++ b/src/integration/tests.rs @@ -2747,14 +2747,6 @@ fn bundled_integration_assets_report_session_refs() { assert!(KILO_PLUGIN_ASSET.contains("session_start_source: \"startup\"")); assert!(KILO_PLUGIN_ASSET.contains("reportState")); assert!(!KILO_PLUGIN_ASSET.contains("pane.release_agent")); - assert!(HERMES_PLUGIN_INIT_ASSET.contains("session_id = _session_id(kwargs)")); - assert!(HERMES_PLUGIN_INIT_ASSET.contains("agent_session_id")); - assert!(HERMES_PLUGIN_INIT_ASSET.contains("pane.report_agent_session\",")); - assert!(HERMES_PLUGIN_INIT_ASSET.contains("\"session_start_source\": \"startup\"")); - assert!(HERMES_PLUGIN_INIT_ASSET.contains("pane.report_agent\",")); - assert!(HERMES_PLUGIN_INIT_ASSET.contains("on_session_end")); - assert!(!HERMES_PLUGIN_INIT_ASSET.contains("on_session_finalize")); - assert!(!HERMES_PLUGIN_INIT_ASSET.contains("pane.release_agent")); assert!(QODERCLI_HOOK_ASSET.contains("HERDR_PANE_ID")); assert!(QODERCLI_HOOK_ASSET.contains("session_id")); assert!(QODERCLI_HOOK_ASSET.contains("report-agent-session")); |
