From 796bc390dba5ef7f78c98a6a007dfc5efebcba49 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Wed, 13 Aug 2025 16:29:07 -0400 Subject: [PATCH] fix for session stuck in "Working..." --- packages/opencode/src/session/index.ts | 6 ++++++ packages/opencode/src/util/defer.ts | 12 ++++++++++++ packages/tui/internal/app/app.go | 2 +- packages/tui/internal/components/chat/messages.go | 5 +++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 packages/opencode/src/util/defer.ts diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 68c5fad8..2e5e15dd 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -45,6 +45,7 @@ import { Agent } from "../agent/agent" import { Permission } from "../permission" import { Wildcard } from "../util/wildcard" import { ulid } from "ulid" +import { defer } from "../util/defer" export namespace Session { const log = Log.create({ service: "session" }) @@ -763,6 +764,11 @@ export namespace Session { sessionID: input.sessionID, } await updateMessage(assistantMsg) + await using _ = defer(async () => { + if (assistantMsg.time.completed) return + await Storage.remove(`session/message/${input.sessionID}/${assistantMsg.id}`) + await Bus.publish(MessageV2.Event.Removed, { sessionID: input.sessionID, messageID: assistantMsg.id }) + }) const tools: Record = {} const processor = createProcessor(assistantMsg, model.info) diff --git a/packages/opencode/src/util/defer.ts b/packages/opencode/src/util/defer.ts new file mode 100644 index 00000000..8de21528 --- /dev/null +++ b/packages/opencode/src/util/defer.ts @@ -0,0 +1,12 @@ +export function defer void | Promise>( + fn: T, +): T extends () => Promise ? { [Symbol.asyncDispose]: () => Promise } : { [Symbol.dispose]: () => void } { + return { + [Symbol.dispose]() { + fn() + }, + [Symbol.asyncDispose]() { + return Promise.resolve(fn()) + }, + } as any +} diff --git a/packages/tui/internal/app/app.go b/packages/tui/internal/app/app.go index ce3a5422..023b799d 100644 --- a/packages/tui/internal/app/app.go +++ b/packages/tui/internal/app/app.go @@ -631,7 +631,7 @@ func (a *App) IsBusy() bool { if casted, ok := lastMessage.Info.(opencode.AssistantMessage); ok { return casted.Time.Completed == 0 } - return true + return false } func (a *App) SaveState() tea.Cmd { diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go index 92259e93..ec7735d5 100644 --- a/packages/tui/internal/components/chat/messages.go +++ b/packages/tui/internal/components/chat/messages.go @@ -203,6 +203,11 @@ func (m *messagesComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if msg.Properties.Part.SessionID == m.app.Session.ID { cmds = append(cmds, m.renderView()) } + case opencode.EventListResponseEventMessageRemoved: + if msg.Properties.SessionID == m.app.Session.ID { + m.cache.Clear() + cmds = append(cmds, m.renderView()) + } case opencode.EventListResponseEventMessagePartRemoved: if msg.Properties.SessionID == m.app.Session.ID { // Clear the cache when a part is removed to ensure proper re-rendering