fix(plugin): normalize event session ids

Handle OpenCode session events that carry the session ID under properties.info.id or properties.info.sessionID so background tasks and continuation hooks do not miss idle/error/delete events.

Add regression coverage for nested session.idle events completing background tasks and waking continuation hooks.
This commit is contained in:
YeonGyu-Kim
2026-05-12 11:48:18 +09:00
parent 67f90a819e
commit 4da48555ee
51 changed files with 740 additions and 254 deletions
+50
View File
@@ -802,6 +802,56 @@ describe("createEventHandler - event forwarding", () => {
expect(forwardedEvents[0]?.event.type).toBe("message.part.delta")
})
it("forwards legacy message.part.updated activity with part-only session id to tmux session manager", async () => {
const forwardedEvents: EventInput[] = []
const eventHandler = createEventHandler({
ctx: asEventHandlerContext({}),
pluginConfig: asPluginConfig({
tmux: {
enabled: true,
layout: "main-vertical",
main_pane_size: 60,
main_pane_min_width: 120,
agent_pane_min_width: 40,
isolation: "inline",
},
}),
firstMessageVariantGate: {
markSessionCreated: () => {},
clear: () => {},
},
managers: createEventHandlerManagers({
skillMcpManager: {
disconnectSession: async () => {},
},
tmuxSessionManager: {
onEvent: (event: EventInput["event"]) => {
forwardedEvents.push({ event })
},
onSessionCreated: async () => {},
onSessionDeleted: async () => {},
},
}),
hooks: createEventHandlerHooks({}),
})
await eventHandler(asEventHandlerInput({
event: {
type: "message.part.updated",
properties: {
part: {
id: "part-1",
messageID: "msg-1",
sessionID: "ses_tmux_part_only",
type: "text",
text: "x",
},
},
},
}))
expect(forwardedEvents.length).toBe(1)
expect(forwardedEvents[0]?.event.type).toBe("message.part.updated")
})
it("does not forward tmux activity events when tmux integration is disabled", async () => {
const forwardedEvents: EventInput[] = []
const eventHandler = createEventHandler({