diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-09 15:59:34 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-09 15:59:34 +0300 |
| commit | df7880c54b8b5d337421cb4b1dd8daea27008801 (patch) | |
| tree | 4d0cc6290ad71c413bac71cfaab4ef41ea017ecb /src/integration/assets/copilot/herdr-agent-state.ps1 | |
| parent | eeacb45b4b6ab4446c5bea1331f743fee5e5b9f8 (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.ps1 | 84 |
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 |
