aboutsummaryrefslogtreecommitdiff
path: root/src/integration
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-25 01:04:58 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-25 01:05:14 +0300
commit5f1957c27bd23f73b339265d3acd32f4a21878a3 (patch)
tree3a89bcc452130df0b18becb7aa9ec4c6008262ba /src/integration
parent38d2b0780c50e4773d6948660873386261cde71d (diff)
fix: harden hermes lifecycle detection
Diffstat (limited to 'src/integration')
-rw-r--r--src/integration/assets/hermes/__init__.py63
-rw-r--r--src/integration/tests.rs8
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"));