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/opencode | |
| parent | eeacb45b4b6ab4446c5bea1331f743fee5e5b9f8 (diff) | |
feat: update agent lifecycle integrations
Diffstat (limited to 'src/integration/assets/opencode')
| -rw-r--r-- | src/integration/assets/opencode/herdr-agent-state.js | 82 |
1 files changed, 74 insertions, 8 deletions
diff --git a/src/integration/assets/opencode/herdr-agent-state.js b/src/integration/assets/opencode/herdr-agent-state.js index c2fd79a6..1e9fff51 100644 --- a/src/integration/assets/opencode/herdr-agent-state.js +++ b/src/integration/assets/opencode/herdr-agent-state.js @@ -2,11 +2,12 @@ // managed by herdr; reinstalling or updating the integration overwrites this file. // add custom hooks/plugins beside this file instead of editing it. // HERDR_INTEGRATION_ID=opencode -// HERDR_INTEGRATION_VERSION=4 +// HERDR_INTEGRATION_VERSION=5 import net from "node:net"; const SOURCE = "herdr:opencode"; +const AGENT = "opencode"; let reportSeq = Date.now() * 1000; function nextReportSeq() { @@ -20,10 +21,26 @@ function sessionIDFromProperties(properties) { : undefined; } -function reportSession(sessionID) { - if (!sessionID) { - return Promise.resolve(); +function stateFromSessionStatus(status) { + if (typeof status !== "string") { + return undefined; } + switch (status.toLowerCase()) { + case "idle": + return "idle"; + case "active": + case "busy": + case "pending": + case "running": + case "streaming": + case "working": + return "working"; + default: + return undefined; + } +} + +function request(method, params) { const paneId = process.env.HERDR_PANE_ID; const socketPath = process.env.HERDR_SOCKET_PATH; @@ -36,13 +53,13 @@ function reportSession(sessionID) { .padStart(6, "0")}`; const request = { id: requestId, - method: "pane.report_agent_session", + method, params: { pane_id: paneId, source: SOURCE, - agent: "opencode", + agent: AGENT, seq: nextReportSeq(), - agent_session_id: sessionID, + ...params, }, }; @@ -64,6 +81,25 @@ function reportSession(sessionID) { }); } +function reportSession(sessionID) { + if (!sessionID) { + return Promise.resolve(); + } + return request("pane.report_agent_session", { agent_session_id: sessionID }); +} + +function reportState(state, sessionID) { + const params = { state }; + if (sessionID) { + params.agent_session_id = sessionID; + } + return request("pane.report_agent", params); +} + +function releaseAgent() { + return request("pane.release_agent", {}); +} + export const HerdrAgentStatePlugin = async () => { if ( process.env.HERDR_ENV !== "1" || @@ -74,6 +110,9 @@ export const HerdrAgentStatePlugin = async () => { } return { + "chat.message": async ({ sessionID }) => { + await reportState("working", sessionID); + }, event: async ({ event }) => { const type = event?.type; const properties = event?.properties ?? {}; @@ -82,9 +121,36 @@ export const HerdrAgentStatePlugin = async () => { switch (type) { case "session.created": case "session.updated": - case "session.status": await reportSession(sessionID); break; + case "session.status": { + const state = stateFromSessionStatus(properties.status); + if (state) { + await reportState(state, sessionID); + } else { + await reportSession(sessionID); + } + break; + } + case "tool.execute.before": + case "tool.execute.after": + case "permission.replied": + case "question.replied": + case "question.rejected": + case "session.compacted": + await reportState("working", sessionID); + break; + case "permission.asked": + case "question.asked": + case "session.error": + await reportState("blocked", sessionID); + break; + case "session.idle": + await reportState("idle", sessionID); + break; + case "session.deleted": + await releaseAgent(); + break; default: break; } |
