fix: opencode — report subagent permission prompts as blocked + handle session.status object form (#838)

refs #838
This commit is contained in:
Aleksey @soar Smyrnov 2026-06-30 16:58:40 +02:00 committed by GitHub
parent 13cb5d9ae6
commit be901fead2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 6 deletions

View File

@ -2,7 +2,7 @@
// 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=7
// HERDR_INTEGRATION_VERSION=8
import net from "node:net";
@ -27,10 +27,10 @@ function sessionIDFromProperties(properties) {
}
function stateFromSessionStatus(status) {
if (typeof status !== "string") {
return undefined;
}
switch (status.toLowerCase()) {
// session.status carries { type: "idle" | "busy" | "retry" }; older builds used a bare string.
const kind = typeof status === "string" ? status : status?.type;
if (typeof kind !== "string") return undefined;
switch (kind.toLowerCase()) {
case "idle":
return "idle";
case "active":
@ -39,6 +39,7 @@ function stateFromSessionStatus(status) {
case "running":
case "streaming":
case "working":
case "retry":
return "working";
default:
return undefined;
@ -131,6 +132,23 @@ export const HerdrAgentStatePlugin = async () => {
childSessions.add(info.id);
}
if (sessionID && childSessions.has(sessionID)) {
// Child session events are dropped so they cannot clobber the pane's
// root-agent state, but a subagent waiting on the user must still
// surface as blocked (and clear once answered). Report state only,
// without an agent_session_id, so the pane keeps the root session.
switch (type) {
case "permission.asked":
case "question.asked":
await reportState("blocked");
break;
case "permission.replied":
case "question.replied":
case "question.rejected":
await reportState("working");
break;
default:
break;
}
return;
}

View File

@ -140,7 +140,7 @@ const DROID_REMOVED_LIFECYCLE_HOOK_EVENTS: [(&str, &str); 9] = [
];
const OPENCODE_PLUGIN_INSTALL_NAME: &str = "herdr-agent-state.js";
const OPENCODE_PLUGIN_ASSET: &str = include_str!("assets/opencode/herdr-agent-state.js");
const OPENCODE_INTEGRATION_VERSION: u32 = 7;
const OPENCODE_INTEGRATION_VERSION: u32 = 8;
const KILO_PLUGIN_INSTALL_NAME: &str = "herdr-agent-state.js";
const KILO_PLUGIN_ASSET: &str = include_str!("assets/kilo/herdr-agent-state.js");
const KILO_INTEGRATION_VERSION: u32 = 2;