diff options
| author | Adam <[email protected]> | 2025-11-03 08:29:08 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-11-03 08:29:13 -0600 |
| commit | 34f11c699ebf5837f10b260ec08a57b696172da7 (patch) | |
| tree | 7bd3dff954e102b2033444751bc69da37a84fee5 | |
| parent | 7a32fec008fdfb5bc034ba3ce1bca365c1d342f5 (diff) | |
| download | opencode-34f11c699ebf5837f10b260ec08a57b696172da7.tar.gz opencode-34f11c699ebf5837f10b260ec08a57b696172da7.zip | |
wip: desktop work
| -rw-r--r-- | packages/desktop/src/components/message-progress.tsx | 2 | ||||
| -rw-r--r-- | packages/desktop/src/pages/index.tsx | 38 |
2 files changed, 29 insertions, 11 deletions
diff --git a/packages/desktop/src/components/message-progress.tsx b/packages/desktop/src/components/message-progress.tsx index 4633a953a..c0037f57c 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)[]>(() => [ <div class="h-8 w-full" />, diff --git a/packages/desktop/src/pages/index.tsx b/packages/desktop/src/pages/index.tsx index eebfc4362..dc3436720 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() { <For each={local.session.userMessages()}> {(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 ( <li class="group/li flex items-center self-stretch"> @@ -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() { </Accordion> </div> </Show> + <Show when={error() && !expanded()}> + <Card variant="error" class="text-text-on-critical-base"> + {error()?.data?.message as string} + </Card> + </Show> {/* Response */} <div class="w-full"> <Switch> @@ -736,6 +749,11 @@ export default function Page() { return <Message message={assistantMessage} parts={parts()} /> }} </For> + <Show when={error()}> + <Card variant="error" class="text-text-on-critical-base"> + {error()?.data?.message as string} + </Card> + </Show> </div> </Collapsible.Content> </Collapsible> |
