فهرست منبع

fix(tui): show background task progress

Shoubhit Dash 3 ماه پیش
والد
کامیت
a84edc224f
1فایلهای تغییر یافته به همراه22 افزوده شده و 10 حذف شده
  1. 22 10
      packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

+ 22 - 10
packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

@@ -1960,12 +1960,15 @@ function Task(props: ToolProps<typeof TaskTool>) {
   const { navigate } = useRoute()
   const sync = useSync()
 
-  onMount(() => {
-    if (props.metadata.sessionId && !sync.data.message[props.metadata.sessionId]?.length)
-      void sync.session.sync(props.metadata.sessionId)
+  createEffect(() => {
+    const sessionID = props.metadata.sessionId
+    if (!sessionID) return
+    if (sync.data.message[sessionID]?.length) return
+    void sync.session.sync(sessionID)
   })
 
-  const messages = createMemo(() => sync.data.message[props.metadata.sessionId ?? ""] ?? [])
+  const childSessionID = createMemo(() => props.metadata.sessionId)
+  const messages = createMemo(() => sync.data.message[childSessionID() ?? ""] ?? [])
 
   const tools = createMemo(() => {
     return messages().flatMap((msg) =>
@@ -1979,7 +1982,16 @@ function Task(props: ToolProps<typeof TaskTool>) {
     tools().findLast((x) => (x.state.status === "running" || x.state.status === "completed") && x.state.title),
   )
 
-  const isRunning = createMemo(() => props.part.state.status === "running")
+  const isBackground = createMemo(() => props.metadata.background === true)
+  const isBackgroundRunning = createMemo(() => {
+    const sessionID = childSessionID()
+    if (!isBackground() || !sessionID) return false
+    const status = sync.data.session_status[sessionID]?.type
+    if (status === "busy" || status === "retry") return true
+    if (status === "idle") return false
+    return !messages().some((x) => x.role === "assistant" && x.time.completed)
+  })
+  const isRunning = createMemo(() => props.part.state.status === "running" || isBackgroundRunning())
 
   const duration = createMemo(() => {
     const first = messages().find((x) => x.role === "user")?.time.created
@@ -1990,8 +2002,7 @@ function Task(props: ToolProps<typeof TaskTool>) {
 
   const content = createMemo(() => {
     if (!props.input.description) return ""
-    const description =
-      props.metadata.background === true ? `${props.input.description} (background)` : props.input.description
+    const description = isBackground() ? `${props.input.description} (background)` : props.input.description
     let content = [`${Locale.titlecase(props.input.subagent_type ?? "General")} Task — ${description}`]
 
     if (isRunning() && tools().length > 0) {
@@ -2003,7 +2014,7 @@ function Task(props: ToolProps<typeof TaskTool>) {
       } else content.push(`↳ ${tools().length} toolcalls`)
     }
 
-    if (props.part.state.status === "completed") {
+    if (!isRunning() && props.part.state.status === "completed") {
       content.push(`└ ${tools().length} toolcalls · ${Locale.duration(duration())}`)
     }
 
@@ -2018,8 +2029,9 @@ function Task(props: ToolProps<typeof TaskTool>) {
       pending="Delegating..."
       part={props.part}
       onClick={() => {
-        if (props.metadata.sessionId) {
-          navigate({ type: "session", sessionID: props.metadata.sessionId })
+        const sessionID = childSessionID()
+        if (sessionID) {
+          navigate({ type: "session", sessionID })
         }
       }}
     >