aboutsummaryrefslogtreecommitdiff
path: root/src/integration/assets/copilot/herdr-agent-state.ps1
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-09 15:59:34 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-09 15:59:34 +0300
commitdf7880c54b8b5d337421cb4b1dd8daea27008801 (patch)
tree4d0cc6290ad71c413bac71cfaab4ef41ea017ecb /src/integration/assets/copilot/herdr-agent-state.ps1
parenteeacb45b4b6ab4446c5bea1331f743fee5e5b9f8 (diff)
feat: update agent lifecycle integrations
Diffstat (limited to 'src/integration/assets/copilot/herdr-agent-state.ps1')
-rw-r--r--src/integration/assets/copilot/herdr-agent-state.ps184
1 files changed, 16 insertions, 68 deletions
diff --git a/src/integration/assets/copilot/herdr-agent-state.ps1 b/src/integration/assets/copilot/herdr-agent-state.ps1
index 61cec0c9..8951eacb 100644
--- a/src/integration/assets/copilot/herdr-agent-state.ps1
+++ b/src/integration/assets/copilot/herdr-agent-state.ps1
@@ -2,10 +2,11 @@
# managed by herdr; reinstalling or updating the integration overwrites this file.
# add custom hooks beside this file instead of editing it.
# HERDR_INTEGRATION_ID=copilot
-# HERDR_INTEGRATION_VERSION=1
+# HERDR_INTEGRATION_VERSION=2
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 {
@@ -31,74 +32,21 @@ function Normalize-Event {
return $Event.Replace("_", "").Replace("-", "").ToLowerInvariant()
}
-function Infer-Event {
- $explicit = First-Text @("hook_event_name", "hookEventName")
- if ($explicit) { return $explicit }
- if (First-Text @("notification_type", "notificationType")) { return "notification" }
- if ($payload.PSObject.Properties.Name -contains "toolResult" -or $payload.PSObject.Properties.Name -contains "tool_result") { return "postToolUse" }
- if (($payload.PSObject.Properties.Name -contains "error") -and (First-Text @("tool_name", "toolName"))) { return "postToolUseFailure" }
- if (First-Text @("tool_name", "toolName")) { return "preToolUse" }
- if (First-Text @("stop_reason", "stopReason")) { return "agentStop" }
- if (First-Text @("reason")) { return "sessionEnd" }
- if ($payload.PSObject.Properties.Name -contains "prompt") { return "userPromptSubmitted" }
- if (
- $payload.PSObject.Properties.Name -contains "initial_prompt" -or
- $payload.PSObject.Properties.Name -contains "initialPrompt" -or
- $payload.PSObject.Properties.Name -contains "source" -or
- (First-Text @("session_id", "sessionId"))
- ) { return "sessionStart" }
- return ""
+$eventName = First-Text @("hook_event_name", "hookEventName")
+if ($eventName) {
+ if ((Normalize-Event $eventName) -ne "sessionstart") { exit 0 }
+} elseif (
+ ($payload.PSObject.Properties.Name -contains "prompt") -or
+ (First-Text @("tool_name", "toolName", "notification_type", "notificationType", "stop_reason", "stopReason", "reason"))
+) {
+ exit 0
}
-function Has-Initial-Prompt {
- $value = $payload.initial_prompt
- if ($null -eq $value) { $value = $payload.initialPrompt }
- return ($value -is [string] -and -not [string]::IsNullOrWhiteSpace($value))
+$sessionId = $payload.session_id
+if ([string]::IsNullOrWhiteSpace($sessionId)) {
+ $sessionId = $payload.sessionId
}
+if ([string]::IsNullOrWhiteSpace($sessionId)) { exit 0 }
-function Report-State {
- param([string]$State, [string]$SessionId)
- $seq = [DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds()
- $args = @("pane", "report-agent", $env:HERDR_PANE_ID, "--source", "herdr:copilot", "--agent", "copilot", "--state", $State, "--seq", "$seq")
- if (-not [string]::IsNullOrWhiteSpace($SessionId)) {
- $args += @("--agent-session-id", $SessionId)
- }
- & herdr @args 2>$null | Out-Null
-}
-
-function Release-Agent {
- $seq = [DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds()
- & herdr pane release-agent $env:HERDR_PANE_ID --source herdr:copilot --agent copilot --seq $seq 2>$null | Out-Null
-}
-
-try {
- $eventKey = Normalize-Event (Infer-Event)
- $sessionId = First-Text @("session_id", "sessionId")
- $toolName = First-Text @("tool_name", "toolName")
- $notificationType = First-Text @("notification_type", "notificationType")
- $stopReason = First-Text @("stop_reason", "stopReason")
- $reason = First-Text @("reason")
-
- if ($eventKey -eq "sessionstart") {
- Report-State ($(if (Has-Initial-Prompt) { "working" } else { "idle" })) $sessionId
- } elseif ($eventKey -in @("userpromptsubmit", "userpromptsubmitted")) {
- Report-State "working" $sessionId
- } elseif ($eventKey -eq "pretooluse") {
- Report-State ($(if ($toolName -in @("ask_user", "exit_plan_mode")) { "blocked" } else { "working" })) $sessionId
- } elseif ($eventKey -in @("posttooluse", "posttoolusefailure")) {
- if ($toolName -ne "report_intent") { Report-State "working" $sessionId }
- } elseif ($eventKey -eq "notification") {
- if ($notificationType -in @("permission_prompt", "elicitation_dialog")) {
- Report-State "blocked" $sessionId
- } elseif ($notificationType -eq "agent_idle") {
- Report-State "idle" $sessionId
- }
- } elseif ($eventKey -in @("stop", "agentstop", "sessionstop")) {
- if ([string]::IsNullOrWhiteSpace($stopReason) -or $stopReason -eq "end_turn") {
- Report-State "idle" $sessionId
- }
- } elseif ($eventKey -eq "sessionend") {
- if ($reason -in @("user_exit", "abort")) { Release-Agent }
- }
-} catch {
-}
+$seq = [DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds()
+& herdr pane report-agent-session $env:HERDR_PANE_ID --source herdr:copilot --agent copilot --agent-session-id $sessionId --seq $seq 2>$null | Out-Null