diff --git a/packages/desktop/src/components/message-progress.tsx b/packages/desktop/src/components/message-progress.tsx
index 4633a953..c0037f57 100644
--- a/packages/desktop/src/components/message-progress.tsx
+++ b/packages/desktop/src/components/message-progress.tsx
@@ -37,7 +37,7 @@ export function MessageProgress(props: { assistantMessages: () => AssistantMessa
// resolvedParts().findLast((p) => p?.type === "reasoning")?.text,
// )
const eligibleItems = createMemo(() => {
- return resolvedParts().filter((p) => p?.type === "tool" && p.state.status === "completed") as ToolPart[]
+ return resolvedParts().filter((p) => p?.type === "tool" && p?.state.status === "completed") as ToolPart[]
})
const finishedItems = createMemo<(JSXElement | ToolPart)[]>(() => [
,
diff --git a/packages/desktop/src/pages/index.tsx b/packages/desktop/src/pages/index.tsx
index eebfc436..dc343672 100644
--- a/packages/desktop/src/pages/index.tsx
+++ b/packages/desktop/src/pages/index.tsx
@@ -13,6 +13,7 @@ import {
ProgressCircle,
Message,
Typewriter,
+ Card,
} from "@opencode-ai/ui"
import { FileIcon } from "@/ui"
import FileTree from "@/components/file-tree"
@@ -547,7 +548,13 @@ export default function Page() {
{(message) => {
const diffs = createMemo(() => message.summary?.diffs ?? [])
- const working = createMemo(() => !message.summary?.body)
+ const assistantMessages = createMemo(() => {
+ return sync.data.message[activeSession().id]?.filter(
+ (m) => m.role === "assistant" && m.parentID == message.id,
+ ) as AssistantMessageType[]
+ })
+ const error = createMemo(() => assistantMessages().find((m) => m?.error)?.error)
+ const working = createMemo(() => !message.summary?.body && !error())
return (
@@ -586,23 +593,24 @@ export default function Page() {
{(message) => {
const isActive = createMemo(() => local.session.activeMessage()?.id === message.id)
const [titled, setTitled] = createSignal(!!message.summary?.title)
- const [completed, setCompleted] = createSignal(!!message.summary?.body)
- const [expanded, setExpanded] = createSignal(false)
- const parts = createMemo(() => sync.data.part[message.id])
- const title = createMemo(() => message.summary?.title)
- const summary = createMemo(() => message.summary?.body)
- const diffs = createMemo(() => message.summary?.diffs ?? [])
const assistantMessages = createMemo(() => {
return sync.data.message[activeSession().id]?.filter(
(m) => m.role === "assistant" && m.parentID == message.id,
) as AssistantMessageType[]
})
+ const error = createMemo(() => assistantMessages().find((m) => m?.error)?.error)
+ const [completed, setCompleted] = createSignal(!!message.summary?.body || !!error())
+ const [expanded, setExpanded] = createSignal(false)
+ const parts = createMemo(() => sync.data.part[message.id])
+ const title = createMemo(() => message.summary?.title)
+ const summary = createMemo(() => message.summary?.body)
+ const diffs = createMemo(() => message.summary?.diffs ?? [])
const hasToolPart = createMemo(() =>
assistantMessages()
?.flatMap((m) => sync.data.part[m.id])
.some((p) => p?.type === "tool"),
)
- const working = createMemo(() => !summary())
+ const working = createMemo(() => !summary() && !error())
// allowing time for the animations to finish
createEffect(() => {
@@ -610,8 +618,8 @@ export default function Page() {
setTimeout(() => setTitled(!!title()), 10_000)
})
createEffect(() => {
- summary()
- setTimeout(() => setCompleted(!!summary()), 1200)
+ const complete = !!summary() || !!error()
+ setTimeout(() => setCompleted(complete), 1200)
})
return (
@@ -707,6 +715,11 @@ export default function Page() {
+
+
+ {error()?.data?.message as string}
+
+
{/* Response */}
@@ -736,6 +749,11 @@ export default function Page() {
return
}}
+
+
+ {error()?.data?.message as string}
+
+