From a91cac7131db44e91268302b5d184a4c69c69ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D1=80=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=A0=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD?= Date: Sat, 26 Sep 2026 10:27:37 +0300 Subject: [PATCH] fix: check done flag at top of event loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit state.done = true → все последующие события пропускаются на уровне цикла, до любых handlers. Включая text.ended, step.started, reasoning.*, tool.*. --- index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/index.ts b/index.ts index c7c1a2e..cf27dbc 100644 --- a/index.ts +++ b/index.ts @@ -147,6 +147,10 @@ async function runPlugin(ctx: any, options: any, dataDir: string) { const sessionId = eventData?.data?.sessionID || "" const assistantMsgID = eventData?.data?.assistantMessageID || "" + // Skip all events after session is done + const state = sessionsBySessionID.get(sessionId) + if (state?.done) continue + // ── Step lifecycle ────────────────────────────────────────────── if (eventType === "session.step.started") { @@ -242,6 +246,8 @@ async function runPlugin(ctx: any, options: any, dataDir: string) { if (eventType === "session.text.ended" && assistantMsgID) { const state = sessionsBySessionID.get(sessionId) + // Skip text events after final step + if (state?.done) continue const step = state?.steps.get(assistantMsgID) if (step) { step.text = eventData?.data?.text || ""