aboutsummaryrefslogtreecommitdiff
path: root/src/integration/assets/opencode
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/opencode
parenteeacb45b4b6ab4446c5bea1331f743fee5e5b9f8 (diff)
feat: update agent lifecycle integrations
Diffstat (limited to 'src/integration/assets/opencode')
-rw-r--r--src/integration/assets/opencode/herdr-agent-state.js82
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;
}