Skip to content

Commit 8d469a2

Browse files
authored
fix(tui): handle events across workspaces (anomalyco#30281)
1 parent 5c06956 commit 8d469a2

4 files changed

Lines changed: 12 additions & 21 deletions

File tree

packages/opencode/src/cli/cmd/tui/app.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -958,11 +958,13 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
958958
bindings: tuiConfig.keybinds.gather("app_exit", ["app.exit"]),
959959
}))
960960

961-
event.on(TuiEvent.CommandExecute.type, (evt) => {
961+
event.on(TuiEvent.CommandExecute.type, (evt, { workspace }) => {
962+
if (workspace !== project.workspace.current()) return
962963
keymap.dispatchCommand(evt.properties.command)
963964
})
964965

965-
event.on(TuiEvent.ToastShow.type, (evt) => {
966+
event.on(TuiEvent.ToastShow.type, (evt, { workspace }) => {
967+
if (workspace !== project.workspace.current()) return
966968
toast.show({
967969
title: evt.properties.title,
968970
message: evt.properties.message,
@@ -971,7 +973,8 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
971973
})
972974
})
973975

974-
event.on(TuiEvent.SessionSelect.type, (evt) => {
976+
event.on(TuiEvent.SessionSelect.type, (evt, { workspace }) => {
977+
if (workspace !== project.workspace.current()) return
975978
route.navigate({
976979
type: "session",
977980
sessionID: evt.properties.sessionID,
@@ -988,7 +991,8 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
988991
}
989992
})
990993

991-
event.on("session.error", (evt) => {
994+
event.on("session.error", (evt, { workspace }) => {
995+
if (workspace !== project.workspace.current()) return
992996
const error = evt.properties.error
993997
if (error && typeof error === "object" && error.name === "MessageAbortedError") return
994998
const message = errorMessage(error)

packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,8 @@ export function Prompt(props: PromptProps) {
319319
let promptPartTypeId = 0
320320
const event = useEvent()
321321

322-
event.on(TuiEvent.PromptAppend.type, (evt) => {
322+
event.on(TuiEvent.PromptAppend.type, (evt, { workspace }) => {
323+
if (workspace !== project.workspace.current()) return
323324
if (!input || input.isDestroyed) return
324325
input.insertText(evt.properties.text)
325326
setTimeout(() => {

packages/opencode/src/cli/cmd/tui/context/event.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Event } from "@opencode-ai/sdk/v2"
2+
import * as Log from "@opencode-ai/core/util/log"
23
import { useProject } from "./project"
34
import { useSDK } from "./sdk"
45

@@ -16,9 +17,7 @@ export function useEvent() {
1617
return
1718
}
1819

19-
if (event.directory === "global" || event.project === project.project()) {
20-
handler(event.payload, { workspace: event.workspace })
21-
}
20+
handler(event.payload, { workspace: event.workspace })
2221
})
2322
}
2423

packages/opencode/test/cli/tui/use-event.test.tsx

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -113,19 +113,6 @@ describe("useEvent", () => {
113113
}
114114
})
115115

116-
test("ignores events for other projects", async () => {
117-
const { app, emit, seen } = await mount()
118-
119-
try {
120-
emit(event(vcs("other"), { directory, project: "proj_other" }))
121-
await Bun.sleep(30)
122-
123-
expect(seen).toHaveLength(0)
124-
} finally {
125-
app.renderer.destroy()
126-
}
127-
})
128-
129116
test("delivers current project events regardless of active workspace", async () => {
130117
const { app, emit, project, seen } = await mount()
131118

0 commit comments

Comments
 (0)