aboutsummaryrefslogtreecommitdiff
path: root/src/integration/assets
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-13 18:36:47 +0300
committerGitHub <noreply@github.com>2026-09-13 17:36:47 +0200
commitfc1cb77f0572948552377b23f7754a3016ac7dfa (patch)
tree5412b796aaaa00894fe628b2ffed8d747e6f452d /src/integration/assets
parent3be35231497f33f38aeffd84df02642479995bc6 (diff)
feat: add Letta Code detection and restore (#3107)
refs #3106 Co-authored-by: Cameron <cameron@pfiffer.org>
Diffstat (limited to 'src/integration/assets')
-rw-r--r--src/integration/assets/letta/herdr-agent-session.ps151
-rw-r--r--src/integration/assets/letta/herdr-agent-session.sh56
2 files changed, 107 insertions, 0 deletions
diff --git a/src/integration/assets/letta/herdr-agent-session.ps1 b/src/integration/assets/letta/herdr-agent-session.ps1
new file mode 100644
index 00000000..27f40e9b
--- /dev/null
+++ b/src/integration/assets/letta/herdr-agent-session.ps1
@@ -0,0 +1,51 @@
+# managed by herdr; reinstalling the integration replaces this file.
+# HERDR_INTEGRATION_ID=letta
+# 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 }
+if ([string]::IsNullOrWhiteSpace($env:HERDR_SOCKET_PATH)) { exit 0 }
+
+$inputText = [Console]::In.ReadToEnd()
+try {
+ $payload = if ([string]::IsNullOrWhiteSpace($inputText)) { $null } else { $inputText | ConvertFrom-Json }
+} catch {
+ $payload = $null
+}
+if ($null -eq $payload -or [string]::IsNullOrWhiteSpace($payload.conversation_id)) { exit 0 }
+
+$sessionId = [string]$payload.conversation_id
+if ($sessionId -eq "default") {
+ if ([string]::IsNullOrWhiteSpace($payload.agent_id)) { exit 0 }
+ $sessionId = "default:" + [string]$payload.agent_id
+}
+
+$herdr = if ([string]::IsNullOrWhiteSpace($env:HERDR_BIN_PATH)) { "herdr" } else { $env:HERDR_BIN_PATH }
+$source = if ($payload.is_new_session -eq $true) { "new" } else { "resume" }
+$commandArgs = @(
+ "pane", "report-agent-session", $env:HERDR_PANE_ID,
+ "--source", "herdr:letta", "--agent", "letta",
+ "--agent-session-id", $sessionId,
+ "--seq", [string][DateTime]::UtcNow.Ticks,
+ "--session-start-source", $source
+)
+$job = $null
+try {
+ $job = Start-Job -ScriptBlock {
+ param($Executable, [object[]]$Arguments)
+ & $Executable @Arguments *> $null
+ } -ArgumentList $herdr, (,$commandArgs)
+ if ($null -eq (Wait-Job -Job $job -Timeout 1)) {
+ Stop-Job -Job $job
+ }
+} catch {
+ # Hook failures must stay silent because Letta injects output into the next prompt.
+ $null = $_
+} finally {
+ if ($null -ne $job) {
+ Remove-Job -Job $job -Force -ErrorAction SilentlyContinue
+ }
+}
diff --git a/src/integration/assets/letta/herdr-agent-session.sh b/src/integration/assets/letta/herdr-agent-session.sh
new file mode 100644
index 00000000..d6e052d6
--- /dev/null
+++ b/src/integration/assets/letta/herdr-agent-session.sh
@@ -0,0 +1,56 @@
+#!/bin/sh
+# managed by herdr; reinstalling the integration replaces this file.
+# HERDR_INTEGRATION_ID=letta
+# HERDR_INTEGRATION_VERSION=1
+
+[ "${1:-}" = "session" ] || exit 0
+[ "${HERDR_ENV:-}" = "1" ] || exit 0
+[ -n "${HERDR_PANE_ID:-}" ] || exit 0
+[ -n "${HERDR_SOCKET_PATH:-}" ] || exit 0
+if [ -n "${HERDR_BIN_PATH:-}" ]; then
+ [ -x "$HERDR_BIN_PATH" ] || exit 0
+else
+ command -v herdr >/dev/null 2>&1 || exit 0
+fi
+command -v python3 >/dev/null 2>&1 || exit 0
+
+# SessionStart stdout is injected into Letta's next user message. Keep every
+# path silent, including successful reports and malformed hook input.
+python3 -c '
+import json
+import os
+import subprocess
+import sys
+import time
+
+try:
+ payload = json.load(sys.stdin)
+ conversation_id = payload.get("conversation_id")
+ agent_id = payload.get("agent_id")
+ if not isinstance(conversation_id, str) or not conversation_id:
+ raise ValueError
+ if conversation_id == "default":
+ if not isinstance(agent_id, str) or not agent_id:
+ raise ValueError
+ session_id = "default:" + agent_id
+ else:
+ session_id = conversation_id
+
+ command = os.environ.get("HERDR_BIN_PATH") or "herdr"
+ args = [
+ command, "pane", "report-agent-session", os.environ["HERDR_PANE_ID"],
+ "--source", "herdr:letta", "--agent", "letta",
+ "--agent-session-id", session_id, "--seq", str(time.time_ns()),
+ "--session-start-source", "new" if payload.get("is_new_session") else "resume",
+ ]
+ subprocess.run(
+ args,
+ stdin=subprocess.DEVNULL,
+ stdout=subprocess.DEVNULL,
+ stderr=subprocess.DEVNULL,
+ timeout=1,
+ check=False,
+ )
+except Exception:
+ pass
+' 2>/dev/null || true