aboutsummaryrefslogtreecommitdiff
path: root/src/integration/assets
diff options
context:
space:
mode:
Diffstat (limited to 'src/integration/assets')
-rw-r--r--src/integration/assets/cursor/herdr-agent-state.ps148
-rw-r--r--src/integration/assets/devin/herdr-agent-state.ps151
-rw-r--r--src/integration/assets/grok/herdr-agent-state.ps141
-rw-r--r--src/integration/assets/hermes/__init__.py70
-rw-r--r--src/integration/assets/mastracode/herdr-agent-state.ps135
5 files changed, 203 insertions, 42 deletions
diff --git a/src/integration/assets/cursor/herdr-agent-state.ps1 b/src/integration/assets/cursor/herdr-agent-state.ps1
new file mode 100644
index 00000000..ebfdb393
--- /dev/null
+++ b/src/integration/assets/cursor/herdr-agent-state.ps1
@@ -0,0 +1,48 @@
+# managed by herdr; reinstalling the integration replaces this file.
+# HERDR_INTEGRATION_ID=cursor
+# HERDR_INTEGRATION_VERSION=1
+
+param([string]$Action = "")
+
+function Exit-Hook {
+ Write-Output "{}"
+ exit 0
+}
+
+if ($Action -ne "session") { Exit-Hook }
+if ($env:HERDR_ENV -ne "1") { Exit-Hook }
+if ([string]::IsNullOrWhiteSpace($env:HERDR_PANE_ID)) { Exit-Hook }
+
+$inputText = [Console]::In.ReadToEnd()
+$jsonStart = $inputText.IndexOf("{")
+if ($jsonStart -gt 0) {
+ $inputText = $inputText.Substring($jsonStart)
+}
+try {
+ $payload = if ([string]::IsNullOrWhiteSpace($inputText)) { $null } else { $inputText | ConvertFrom-Json }
+} catch {
+ Exit-Hook
+}
+
+if ($null -eq $payload) { Exit-Hook }
+$event = if ($payload.hook_event_name -is [string]) { $payload.hook_event_name } else { $payload.hookEventName }
+if (-not [string]::IsNullOrWhiteSpace($event) -and $event -ne "sessionStart") { Exit-Hook }
+
+$sessionId = $null
+foreach ($name in @("session_id", "sessionId", "conversation_id", "conversationId")) {
+ $value = $payload.$name
+ if ($value -is [string] -and -not [string]::IsNullOrWhiteSpace($value)) {
+ $sessionId = $value
+ break
+ }
+}
+if ([string]::IsNullOrWhiteSpace($sessionId)) { Exit-Hook }
+
+$seq = [DateTime]::UtcNow.Ticks
+$herdr = if ([string]::IsNullOrWhiteSpace($env:HERDR_BIN_PATH)) { "herdr" } else { $env:HERDR_BIN_PATH }
+try {
+ & $herdr pane report-agent-session $env:HERDR_PANE_ID --source herdr:cursor --agent cursor --seq $seq --agent-session-id $sessionId 2>$null | Out-Null
+} catch {
+}
+
+Exit-Hook
diff --git a/src/integration/assets/devin/herdr-agent-state.ps1 b/src/integration/assets/devin/herdr-agent-state.ps1
new file mode 100644
index 00000000..7d14ad75
--- /dev/null
+++ b/src/integration/assets/devin/herdr-agent-state.ps1
@@ -0,0 +1,51 @@
+# installed by herdr
+# managed by herdr; reinstalling or updating the integration overwrites this file.
+# add custom hooks beside this file instead of editing it.
+# HERDR_INTEGRATION_ID=devin
+# HERDR_INTEGRATION_VERSION=2
+
+param([string]$Action = "")
+
+if ($Action -ne "session") { exit 0 }
+if ($env:HERDR_ENV -ne "1") { exit 0 }
+if ([string]::IsNullOrWhiteSpace($env:HERDR_PANE_ID)) { exit 0 }
+
+$inputText = [Console]::In.ReadToEnd()
+try {
+ $payload = if ([string]::IsNullOrWhiteSpace($inputText)) { $null } else { $inputText | ConvertFrom-Json }
+} catch {
+ $payload = $null
+}
+
+$sessionId = $null
+if ($null -ne $payload) {
+ if ($payload.session_id -is [string]) { $sessionId = $payload.session_id }
+ elseif ($payload.sessionId -is [string]) { $sessionId = $payload.sessionId }
+}
+
+$event = if ($null -ne $payload -and $payload.hook_event_name -is [string]) { $payload.hook_event_name } else { "" }
+$allowFallback = $event -ne "UserPromptSubmit" -and -not ($event -eq "SessionStart" -and $payload.source -eq "startup")
+if ([string]::IsNullOrWhiteSpace($sessionId) -and $allowFallback) {
+ $projectDir = if ([string]::IsNullOrWhiteSpace($env:DEVIN_PROJECT_DIR)) { (Get-Location).Path } else { $env:DEVIN_PROJECT_DIR }
+ try {
+ $sessions = & devin list --format json 2>$null | ConvertFrom-Json
+ $normalizedProject = [IO.Path]::GetFullPath($projectDir).TrimEnd('\')
+ foreach ($session in @($sessions)) {
+ if ($session.id -isnot [string] -or $session.working_directory -isnot [string]) { continue }
+ $workingDirectory = [IO.Path]::GetFullPath($session.working_directory).TrimEnd('\')
+ if ($workingDirectory -ieq $normalizedProject) {
+ $sessionId = $session.id
+ break
+ }
+ }
+ } catch {
+ }
+}
+if ([string]::IsNullOrWhiteSpace($sessionId)) { exit 0 }
+
+$seq = [DateTime]::UtcNow.Ticks
+$herdr = if ([string]::IsNullOrWhiteSpace($env:HERDR_BIN_PATH)) { "herdr" } else { $env:HERDR_BIN_PATH }
+try {
+ & $herdr pane report-agent-session $env:HERDR_PANE_ID --source herdr:devin --agent devin --seq $seq --agent-session-id $sessionId 2>$null | Out-Null
+} catch {
+}
diff --git a/src/integration/assets/grok/herdr-agent-state.ps1 b/src/integration/assets/grok/herdr-agent-state.ps1
new file mode 100644
index 00000000..69c4f515
--- /dev/null
+++ b/src/integration/assets/grok/herdr-agent-state.ps1
@@ -0,0 +1,41 @@
+# installed by herdr
+# managed by herdr; reinstalling or updating the integration overwrites this file.
+# add custom hooks beside this file instead of editing it.
+# HERDR_INTEGRATION_ID=grok
+# HERDR_INTEGRATION_VERSION=1
+
+param([string]$Action = "")
+
+if ($Action -ne "session") { exit 0 }
+if ($env:HERDR_ENV -ne "1") { exit 0 }
+if ([string]::IsNullOrWhiteSpace($env:HERDR_PANE_ID)) { exit 0 }
+
+$inputText = [Console]::In.ReadToEnd()
+try {
+ $payload = if ([string]::IsNullOrWhiteSpace($inputText)) { $null } else { $inputText | ConvertFrom-Json }
+} catch {
+ $payload = $null
+}
+
+$event = if ($null -ne $payload -and $payload.hook_event_name -is [string]) {
+ $payload.hook_event_name
+} elseif ($null -ne $payload -and $payload.hookEventName -is [string]) {
+ $payload.hookEventName
+} else {
+ $null
+}
+if ($null -ne $event -and $event -notin @("session_start", "SessionStart", "sessionStart")) { exit 0 }
+
+$sessionId = $env:GROK_SESSION_ID
+if ([string]::IsNullOrWhiteSpace($sessionId) -and $null -ne $payload) {
+ if ($payload.session_id -is [string]) { $sessionId = $payload.session_id }
+ elseif ($payload.sessionId -is [string]) { $sessionId = $payload.sessionId }
+}
+if ([string]::IsNullOrWhiteSpace($sessionId)) { exit 0 }
+
+$seq = [DateTime]::UtcNow.Ticks
+$herdr = if ([string]::IsNullOrWhiteSpace($env:HERDR_BIN_PATH)) { "herdr" } else { $env:HERDR_BIN_PATH }
+try {
+ & $herdr pane report-agent-session $env:HERDR_PANE_ID --source herdr:grok --agent grok --seq $seq --agent-session-id $sessionId 2>$null | Out-Null
+} catch {
+}
diff --git a/src/integration/assets/hermes/__init__.py b/src/integration/assets/hermes/__init__.py
index 9b1d51e2..e99fc29e 100644
--- a/src/integration/assets/hermes/__init__.py
+++ b/src/integration/assets/hermes/__init__.py
@@ -1,14 +1,12 @@
"""Hermes plugin installed by Herdr to report resumable session identity."""
# HERDR_INTEGRATION_ID=hermes
-# HERDR_INTEGRATION_VERSION=4
+# HERDR_INTEGRATION_VERSION=5
from __future__ import annotations
-import json
import os
-import random
-import socket
+import subprocess
import time
_SOURCE = "herdr:hermes"
@@ -16,43 +14,37 @@ _AGENT = "hermes"
_INTERACTIVE_PLATFORMS = {"cli", "tui", "desktop", "acp"}
-def _base_params() -> tuple[str, str] | None:
+def _pane_id() -> str | None:
if os.environ.get("HERDR_ENV") != "1":
return None
- pane_id = os.environ.get("HERDR_PANE_ID", "").strip()
- socket_path = os.environ.get("HERDR_SOCKET_PATH", "").strip()
- if not pane_id or not socket_path:
- return None
- return pane_id, socket_path
+ return os.environ.get("HERDR_PANE_ID", "").strip() or None
-def _send(method: str, params: dict) -> None:
- base = _base_params()
- if base is None:
+def _send_session(session_id: str, start_source: str) -> None:
+ pane_id = _pane_id()
+ if pane_id is None:
return
- pane_id, socket_path = base
- params = {
- "pane_id": pane_id,
- "source": _SOURCE,
- "agent": _AGENT,
- "seq": time.time_ns(),
- **params,
- }
- request = {
- "id": f"{_SOURCE}:{int(time.time() * 1000)}:{random.randrange(1_000_000):06d}",
- "method": method,
- "params": params,
- }
+ command = [
+ os.environ.get("HERDR_BIN_PATH") or "herdr",
+ "pane",
+ "report-agent-session",
+ pane_id,
+ "--source",
+ _SOURCE,
+ "--agent",
+ _AGENT,
+ "--seq",
+ str(time.time_ns()),
+ "--agent-session-id",
+ session_id,
+ "--session-start-source",
+ start_source,
+ ]
try:
- client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- client.settimeout(0.5)
- client.connect(socket_path)
- client.sendall((json.dumps(request) + "\n").encode("utf-8"))
- try:
- client.recv(4096)
- except Exception:
- pass
- client.close()
+ kwargs = {"timeout": 1, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL}
+ if os.name == "nt":
+ kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
+ subprocess.run(command, check=False, **kwargs)
except Exception:
pass
@@ -63,13 +55,7 @@ def _report_session(start_source: str, **kwargs) -> None:
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,
- },
- )
+ _send_session(session_id, start_source)
def _session_started(**kwargs) -> None:
diff --git a/src/integration/assets/mastracode/herdr-agent-state.ps1 b/src/integration/assets/mastracode/herdr-agent-state.ps1
new file mode 100644
index 00000000..b0cca059
--- /dev/null
+++ b/src/integration/assets/mastracode/herdr-agent-state.ps1
@@ -0,0 +1,35 @@
+# installed by herdr
+# managed by herdr; reinstalling or updating the integration overwrites this file.
+# add custom hooks beside this file instead of editing it.
+# HERDR_INTEGRATION_ID=mastracode
+# HERDR_INTEGRATION_VERSION=2
+
+param([string]$Action = "")
+
+if ($Action -notin @("session", "working", "idle", "blocked")) { exit 0 }
+if ($env:HERDR_ENV -ne "1") { exit 0 }
+if ([string]::IsNullOrWhiteSpace($env:HERDR_PANE_ID)) { exit 0 }
+
+$inputText = [Console]::In.ReadToEnd()
+try {
+ $payload = if ([string]::IsNullOrWhiteSpace($inputText)) { $null } else { $inputText | ConvertFrom-Json }
+} catch {
+ $payload = $null
+}
+
+$sessionId = if ($null -ne $payload -and $payload.session_id -is [string]) { $payload.session_id } else { $null }
+$seq = [DateTime]::UtcNow.Ticks
+$herdr = if ([string]::IsNullOrWhiteSpace($env:HERDR_BIN_PATH)) { "herdr" } else { $env:HERDR_BIN_PATH }
+try {
+ if ($Action -eq "session") {
+ if ([string]::IsNullOrWhiteSpace($sessionId)) { exit 0 }
+ & $herdr pane report-agent-session $env:HERDR_PANE_ID --source herdr:mastracode --agent mastracode --seq $seq --session-start-source startup --agent-session-id $sessionId 2>$null | Out-Null
+ } else {
+ $args = @("pane", "report-agent", $env:HERDR_PANE_ID, "--source", "herdr:mastracode", "--agent", "mastracode", "--state", $Action, "--seq", "$seq")
+ if (-not [string]::IsNullOrWhiteSpace($sessionId)) {
+ $args += @("--agent-session-id", $sessionId)
+ }
+ & $herdr @args 2>$null | Out-Null
+ }
+} catch {
+}