Skip to content

Commit a84edc2

Browse files
committed
fix(tui): show background task progress
1 parent 2f919b8 commit a84edc2

1 file changed

Lines changed: 22 additions & 10 deletions

File tree

  • packages/opencode/src/cli/cmd/tui/routes/session

packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,12 +1960,15 @@ function Task(props: ToolProps<typeof TaskTool>) {
19601960
const { navigate } = useRoute()
19611961
const sync = useSync()
19621962

1963-
onMount(() => {
1964-
if (props.metadata.sessionId && !sync.data.message[props.metadata.sessionId]?.length)
1965-
void sync.session.sync(props.metadata.sessionId)
1963+
createEffect(() => {
1964+
const sessionID = props.metadata.sessionId
1965+
if (!sessionID) return
1966+
if (sync.data.message[sessionID]?.length) return
1967+
void sync.session.sync(sessionID)
19661968
})
19671969

1968-
const messages = createMemo(() => sync.data.message[props.metadata.sessionId ?? ""] ?? [])
1970+
const childSessionID = createMemo(() => props.metadata.sessionId)
1971+
const messages = createMemo(() => sync.data.message[childSessionID() ?? ""] ?? [])
19691972

19701973
const tools = createMemo(() => {
19711974
return messages().flatMap((msg) =>
@@ -1979,7 +1982,16 @@ function Task(props: ToolProps<typeof TaskTool>) {
19791982
tools().findLast((x) => (x.state.status === "running" || x.state.status === "completed") && x.state.title),
19801983
)
19811984

1982-
const isRunning = createMemo(() => props.part.state.status === "running")
1985+
const isBackground = createMemo(() => props.metadata.background === true)
1986+
const isBackgroundRunning = createMemo(() => {
1987+
const sessionID = childSessionID()
1988+
if (!isBackground() || !sessionID) return false
1989+
const status = sync.data.session_status[sessionID]?.type
1990+
if (status === "busy" || status === "retry") return true
1991+
if (status === "idle") return false
1992+
return !messages().some((x) => x.role === "assistant" && x.time.completed)
1993+
})
1994+
const isRunning = createMemo(() => props.part.state.status === "running" || isBackgroundRunning())
19831995

19841996
const duration = createMemo(() => {
19851997
const first = messages().find((x) => x.role === "user")?.time.created
@@ -1990,8 +2002,7 @@ function Task(props: ToolProps<typeof TaskTool>) {
19902002

19912003
const content = createMemo(() => {
19922004
if (!props.input.description) return ""
1993-
const description =
1994-
props.metadata.background === true ? `${props.input.description} (background)` : props.input.description
2005+
const description = isBackground() ? `${props.input.description} (background)` : props.input.description
19952006
let content = [`${Locale.titlecase(props.input.subagent_type ?? "General")} Task — ${description}`]
19962007

19972008
if (isRunning() && tools().length > 0) {
@@ -2003,7 +2014,7 @@ function Task(props: ToolProps<typeof TaskTool>) {
20032014
} else content.push(`↳ ${tools().length} toolcalls`)
20042015
}
20052016

2006-
if (props.part.state.status === "completed") {
2017+
if (!isRunning() && props.part.state.status === "completed") {
20072018
content.push(`└ ${tools().length} toolcalls · ${Locale.duration(duration())}`)
20082019
}
20092020

@@ -2018,8 +2029,9 @@ function Task(props: ToolProps<typeof TaskTool>) {
20182029
pending="Delegating..."
20192030
part={props.part}
20202031
onClick={() => {
2021-
if (props.metadata.sessionId) {
2022-
navigate({ type: "session", sessionID: props.metadata.sessionId })
2032+
const sessionID = childSessionID()
2033+
if (sessionID) {
2034+
navigate({ type: "session", sessionID })
20232035
}
20242036
}}
20252037
>

0 commit comments

Comments
 (0)