Add SessionStop hook and session-events.tsv duration tracking

- session-audit.json: add SessionStop entry pointing to new end-of-session scripts
- report-hook-event-end.sh/.ps1: log payload to hook-events.log and write TSV row to session-events.tsv
- report-hook-event.sh/.ps1: also write SessionStart TSV row to session-events.tsv so start/end pairs are queryable for duration
This commit is contained in:
2026-06-30 17:30:20 -04:00
parent 92218d528c
commit addbf37fc5
5 changed files with 40 additions and 0 deletions
+8
View File
@@ -7,6 +7,14 @@
"linux": "bash ~/.copilot-resources/resources/scripts/report-hook-event.sh", "linux": "bash ~/.copilot-resources/resources/scripts/report-hook-event.sh",
"windows": "powershell -NoProfile -File \"$HOME/.copilot-resources/resources/scripts/report-hook-event.ps1\"" "windows": "powershell -NoProfile -File \"$HOME/.copilot-resources/resources/scripts/report-hook-event.ps1\""
} }
],
"SessionStop": [
{
"type": "command",
"osx": "bash ~/.copilot-resources/resources/scripts/report-hook-event-end.sh",
"linux": "bash ~/.copilot-resources/resources/scripts/report-hook-event-end.sh",
"windows": "powershell -NoProfile -File \"$HOME/.copilot-resources/resources/scripts/report-hook-event-end.ps1\""
}
] ]
} }
} }
@@ -0,0 +1,12 @@
$ErrorActionPreference = 'Stop'
$StateDir = if ($env:COPILOT_RESOURCES_STATE_DIR) { $env:COPILOT_RESOURCES_STATE_DIR } else { Join-Path $HOME '.copilot-resources-state' }
New-Item -ItemType Directory -Path $StateDir -Force | Out-Null
$Payload = [Console]::In.ReadToEnd()
$Payload | Add-Content -LiteralPath (Join-Path $StateDir 'hook-events.log')
# Append a TSV row to session-events.tsv for duration tracking.
"$(Get-Date -AsUTC -Format o)`tSessionEnd" | Add-Content -LiteralPath (Join-Path $StateDir 'session-events.tsv')
'{"continue": true}'
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -euo pipefail
state_dir="${COPILOT_RESOURCES_STATE_DIR:-$HOME/.copilot-resources-state}"
mkdir -p -- "$state_dir"
event_payload="$(cat)"
printf '%s\n' "$event_payload" >> "$state_dir/hook-events.log"
# Append a TSV row to session-events.tsv for duration tracking.
printf '%s\tSessionEnd\n' "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> "$state_dir/session-events.tsv"
printf '{"continue": true}\n'
+3
View File
@@ -6,6 +6,9 @@ New-Item -ItemType Directory -Path $StateDir -Force | Out-Null
$Payload = [Console]::In.ReadToEnd() $Payload = [Console]::In.ReadToEnd()
$Payload | Add-Content -LiteralPath (Join-Path $StateDir 'hook-events.log') $Payload | Add-Content -LiteralPath (Join-Path $StateDir 'hook-events.log')
# Append a TSV row to session-events.tsv for duration tracking.
"$(Get-Date -AsUTC -Format o)`tSessionStart" | Add-Content -LiteralPath (Join-Path $StateDir 'session-events.tsv')
$PortRegistryScript = Join-Path $PSScriptRoot 'update-port-registry.mjs' $PortRegistryScript = Join-Path $PSScriptRoot 'update-port-registry.mjs'
$NodeCommand = Get-Command node -ErrorAction SilentlyContinue $NodeCommand = Get-Command node -ErrorAction SilentlyContinue
if ($NodeCommand -and (Test-Path -LiteralPath $PortRegistryScript)) { if ($NodeCommand -and (Test-Path -LiteralPath $PortRegistryScript)) {
+3
View File
@@ -10,6 +10,9 @@ mkdir -p -- "$state_dir"
event_payload="$(cat)" event_payload="$(cat)"
printf '%s\n' "$event_payload" >> "$state_dir/hook-events.log" printf '%s\n' "$event_payload" >> "$state_dir/hook-events.log"
# Append a TSV row to session-events.tsv for duration tracking.
printf '%s\tSessionStart\n' "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> "$state_dir/session-events.tsv"
if command -v node >/dev/null 2>&1 && [[ -f "$port_registry_script" ]]; then if command -v node >/dev/null 2>&1 && [[ -f "$port_registry_script" ]]; then
if ! printf '%s' "$event_payload" | node "$port_registry_script"; then if ! printf '%s' "$event_payload" | node "$port_registry_script"; then
printf '%s update-port-registry failed\n' "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> "$state_dir/project-ports-errors.log" printf '%s update-port-registry failed\n' "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> "$state_dir/project-ports-errors.log"