diff --git a/src/integration/assets/omp/herdr-agent-state.ts b/src/integration/assets/omp/herdr-agent-state.ts index a933e867..ba97b1c7 100644 --- a/src/integration/assets/omp/herdr-agent-state.ts +++ b/src/integration/assets/omp/herdr-agent-state.ts @@ -144,6 +144,19 @@ function sendState(state: AgentState, message?: string, seq = nextReportSeq()): }); } +function releaseAgent(): Promise { + return sendRequest({ + id: `${source}:release:${Date.now()}:${Math.random().toString(36).slice(2)}`, + method: "pane.release_agent", + params: { + pane_id: paneId, + source, + agent: "omp", + seq: nextReportSeq(), + }, + }); +} + let sendInFlight = false; let queuedState: QueuedState | undefined; @@ -343,4 +356,12 @@ export default function (pi) { scheduleIdle(); }); + + pi.on("session_shutdown", async () => { + if (!rootSession) { + return; + } + clearPendingTimers(); + await releaseAgent(); + }); } diff --git a/src/integration/assets/pi/herdr-agent-state.ts b/src/integration/assets/pi/herdr-agent-state.ts index 9af12cfd..6c9e1cae 100644 --- a/src/integration/assets/pi/herdr-agent-state.ts +++ b/src/integration/assets/pi/herdr-agent-state.ts @@ -144,6 +144,19 @@ function sendState(state: AgentState, message?: string, seq = nextReportSeq()): }); } +function releaseAgent(): Promise { + return sendRequest({ + id: `${source}:release:${Date.now()}:${Math.random().toString(36).slice(2)}`, + method: "pane.release_agent", + params: { + pane_id: paneId, + source, + agent: "pi", + seq: nextReportSeq(), + }, + }); +} + let sendInFlight = false; let queuedState: QueuedState | undefined; @@ -343,4 +356,12 @@ export default function (pi) { scheduleIdle(); }); + + pi.on("session_shutdown", async () => { + if (!rootSession) { + return; + } + clearPendingTimers(); + await releaseAgent(); + }); } diff --git a/src/integration/mod.rs b/src/integration/mod.rs index 0a00240b..14d88e19 100644 --- a/src/integration/mod.rs +++ b/src/integration/mod.rs @@ -5972,8 +5972,8 @@ mod tests { assert!(PI_EXTENSION_ASSET.contains("pane.report_agent\"")); assert!(PI_EXTENSION_ASSET.contains("pi.on(\"agent_start\"")); assert!(PI_EXTENSION_ASSET.contains("pi.on(\"agent_end\"")); - assert!(!PI_EXTENSION_ASSET.contains("pane.release_agent")); - assert!(!PI_EXTENSION_ASSET.contains("session_shutdown")); + assert!(PI_EXTENSION_ASSET.contains("pane.release_agent")); + assert!(PI_EXTENSION_ASSET.contains("pi.on(\"session_shutdown\"")); assert!(OMP_EXTENSION_ASSET.contains("agent_session_path")); assert!(OMP_EXTENSION_ASSET.contains("agent_session_id")); assert!(OMP_EXTENSION_ASSET.contains("ctx?.hasUI !== true")); @@ -5981,8 +5981,8 @@ mod tests { assert!(OMP_EXTENSION_ASSET.contains("pane.report_agent\"")); assert!(OMP_EXTENSION_ASSET.contains("pi.on(\"agent_start\"")); assert!(OMP_EXTENSION_ASSET.contains("pi.on(\"agent_end\"")); - assert!(!OMP_EXTENSION_ASSET.contains("pane.release_agent")); - assert!(!OMP_EXTENSION_ASSET.contains("session_shutdown")); + assert!(OMP_EXTENSION_ASSET.contains("pane.release_agent")); + assert!(OMP_EXTENSION_ASSET.contains("pi.on(\"session_shutdown\"")); assert!( CLAUDE_HOOK_ASSET.contains("agent_session_id") || CLAUDE_HOOK_ASSET.contains("--agent-session-id")