diff options
Diffstat (limited to 'src/integration/assets')
| -rw-r--r-- | src/integration/assets/cursor/herdr-agent-state.ps1 | 48 | ||||
| -rw-r--r-- | src/integration/assets/devin/herdr-agent-state.ps1 | 51 | ||||
| -rw-r--r-- | src/integration/assets/grok/herdr-agent-state.ps1 | 41 | ||||
| -rw-r--r-- | src/integration/assets/hermes/__init__.py | 70 | ||||
| -rw-r--r-- | src/integration/assets/mastracode/herdr-agent-state.ps1 | 35 |
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 { +} |
