From 4957fca7180fdbd296de981a1d7de5a8b7ae9271 Mon Sep 17 00:00:00 2001 From: Timo Clasen Date: Tue, 5 Aug 2025 12:16:43 +0200 Subject: [PATCH] fix(plugins): improve session idle event (#1615) --- packages/opencode/src/session/index.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index efd9ee5a..e8ccc920 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -122,6 +122,7 @@ export namespace Session { const sessions = new Map() const messages = new Map() const pending = new Map() + const autoCompacting = new Map() const queued = new Map< string, { @@ -137,6 +138,7 @@ export namespace Session { sessions, messages, pending, + autoCompacting, queued, } }, @@ -615,6 +617,8 @@ export namespace Session { const tokens = previous.tokens.input + previous.tokens.cache.read + previous.tokens.cache.write + previous.tokens.output if (model.info.limit.context && tokens > Math.max((model.info.limit.context - outputLimit) * 0.9, 0)) { + state().autoCompacting.set(input.sessionID, true) + await summarize({ sessionID: input.sessionID, providerID: input.providerID, @@ -623,7 +627,6 @@ export namespace Session { return chat(input) } } - using abort = lock(input.sessionID) const lastSummary = msgs.findLast((msg) => msg.info.role === "assistant" && msg.info.summary === true) @@ -1319,9 +1322,19 @@ export namespace Session { state().pending.set(sessionID, controller) return { signal: controller.signal, - [Symbol.dispose]() { + async [Symbol.dispose]() { log.info("unlocking", { sessionID }) state().pending.delete(sessionID) + + const isAutoCompacting = state().autoCompacting.get(sessionID) ?? false + if (isAutoCompacting) { + state().autoCompacting.delete(sessionID) + return + } + + const session = await get(sessionID) + if (session.parentID) return + Bus.publish(Event.Idle, { sessionID, }) @@ -1344,8 +1357,8 @@ export namespace Session { } return { cost: new Decimal(0) - .add(new Decimal(tokens.input).mul(model.cost?.input?? 0).div(1_000_000)) - .add(new Decimal(tokens.output).mul(model.cost?.output?? 0).div(1_000_000)) + .add(new Decimal(tokens.input).mul(model.cost?.input ?? 0).div(1_000_000)) + .add(new Decimal(tokens.output).mul(model.cost?.output ?? 0).div(1_000_000)) .add(new Decimal(tokens.cache.read).mul(model.cost?.cache_read ?? 0).div(1_000_000)) .add(new Decimal(tokens.cache.write).mul(model.cost?.cache_write ?? 0).div(1_000_000)) .toNumber(),