From e1aed0cd01d23e433519621f8d21c0a8ffa3977d Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 31 Oct 2025 13:40:20 -0500 Subject: wip: desktop work --- .../desktop/src/components/message-progress.tsx | 86 ++++++++++++++-------- 1 file changed, 56 insertions(+), 30 deletions(-) (limited to 'packages/desktop/src/components') diff --git a/packages/desktop/src/components/message-progress.tsx b/packages/desktop/src/components/message-progress.tsx index f77e196b5..fd66c5caf 100644 --- a/packages/desktop/src/components/message-progress.tsx +++ b/packages/desktop/src/components/message-progress.tsx @@ -1,23 +1,47 @@ -import { For, Match, Switch, createEffect, createMemo, createSignal, onCleanup } from "solid-js" +import { For, JSXElement, Match, Switch, createEffect, createMemo, createSignal, onCleanup } from "solid-js" import { Part } from "@opencode-ai/ui" import { useSync } from "@/context/sync" -import type { AssistantMessage as AssistantMessageType } from "@opencode-ai/sdk" +import type { AssistantMessage as AssistantMessageType, Part as PartType, ToolPart } from "@opencode-ai/sdk" -export function MessageProgress(props: { assistantMessages: () => AssistantMessageType[] }) { +export function MessageProgress(props: { assistantMessages: () => AssistantMessageType[]; done?: boolean }) { const sync = useSync() - const items = createMemo(() => props.assistantMessages().flatMap((m) => sync.data.part[m.id])) + const parts = createMemo(() => props.assistantMessages().flatMap((m) => sync.data.part[m.id])) + const done = createMemo(() => props.done ?? false) + const currentTask = createMemo( + () => + parts().findLast( + (p) => + p && + p.type === "tool" && + p.tool === "task" && + p.state && + "metadata" in p.state && + p.state.metadata && + p.state.metadata.sessionId && + p.state.status === "running", + ) as ToolPart, + ) - const finishedItems = createMemo(() => [ - "", - "", - "Loading...", - ...items().filter( + const eligibleItems = createMemo(() => { + let allParts = parts() + const task = currentTask() + if (task && task.state && "metadata" in task.state && task.state.metadata?.sessionId) { + const messages = sync.data.message[task.state.metadata.sessionId as string]?.filter((m) => m.role === "assistant") + allParts = messages?.flatMap((m) => sync.data.part[m.id]) ?? parts() + } + return allParts.filter( (p) => p?.type === "text" || (p?.type === "reasoning" && p.time?.end) || (p?.type === "tool" && p.state.status === "completed"), - ), + ) + }) + const finishedItems = createMemo<(JSXElement | PartType)[]>(() => [ + "", "", +
Loading...
, + ...eligibleItems(), + ...(done() ? ["", "", ""] : []), ]) const MINIMUM_DELAY = 400 @@ -54,26 +78,28 @@ export function MessageProgress(props: { assistantMessages: () => AssistantMessa > {(part) => { - if (typeof part === "string") return
{part}
- const message = createMemo(() => sync.data.message[part.sessionID].find((m) => m.id === part.messageID)) - return ( -
- - - {(p) => ( -
- )} - - - {(p) => } - - {(p) => } - -
- ) + if (part && typeof part === "object" && "type" in part) { + const message = createMemo(() => sync.data.message[part.sessionID].find((m) => m.id === part.messageID)) + return ( +
+ + + {(p) => ( +
+ )} + + + {(p) => } + + {(p) => } + +
+ ) + } + return
{part}
}}
-- cgit v1.2.3