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