wip: desktop work

This commit is contained in:
Adam
2025-11-03 08:29:08 -06:00
parent 7a32fec008
commit 34f11c699e
2 changed files with 29 additions and 11 deletions

View File

@@ -37,7 +37,7 @@ export function MessageProgress(props: { assistantMessages: () => AssistantMessa
// resolvedParts().findLast((p) => p?.type === "reasoning")?.text, // resolvedParts().findLast((p) => p?.type === "reasoning")?.text,
// ) // )
const eligibleItems = createMemo(() => { 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)[]>(() => [ const finishedItems = createMemo<(JSXElement | ToolPart)[]>(() => [
<div class="h-8 w-full" />, <div class="h-8 w-full" />,

View File

@@ -13,6 +13,7 @@ import {
ProgressCircle, ProgressCircle,
Message, Message,
Typewriter, Typewriter,
Card,
} from "@opencode-ai/ui" } from "@opencode-ai/ui"
import { FileIcon } from "@/ui" import { FileIcon } from "@/ui"
import FileTree from "@/components/file-tree" import FileTree from "@/components/file-tree"
@@ -547,7 +548,13 @@ export default function Page() {
<For each={local.session.userMessages()}> <For each={local.session.userMessages()}>
{(message) => { {(message) => {
const diffs = createMemo(() => message.summary?.diffs ?? []) 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 ( return (
<li class="group/li flex items-center self-stretch"> <li class="group/li flex items-center self-stretch">
@@ -586,23 +593,24 @@ export default function Page() {
{(message) => { {(message) => {
const isActive = createMemo(() => local.session.activeMessage()?.id === message.id) const isActive = createMemo(() => local.session.activeMessage()?.id === message.id)
const [titled, setTitled] = createSignal(!!message.summary?.title) 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(() => { const assistantMessages = createMemo(() => {
return sync.data.message[activeSession().id]?.filter( return sync.data.message[activeSession().id]?.filter(
(m) => m.role === "assistant" && m.parentID == message.id, (m) => m.role === "assistant" && m.parentID == message.id,
) as AssistantMessageType[] ) 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(() => const hasToolPart = createMemo(() =>
assistantMessages() assistantMessages()
?.flatMap((m) => sync.data.part[m.id]) ?.flatMap((m) => sync.data.part[m.id])
.some((p) => p?.type === "tool"), .some((p) => p?.type === "tool"),
) )
const working = createMemo(() => !summary()) const working = createMemo(() => !summary() && !error())
// allowing time for the animations to finish // allowing time for the animations to finish
createEffect(() => { createEffect(() => {
@@ -610,8 +618,8 @@ export default function Page() {
setTimeout(() => setTitled(!!title()), 10_000) setTimeout(() => setTitled(!!title()), 10_000)
}) })
createEffect(() => { createEffect(() => {
summary() const complete = !!summary() || !!error()
setTimeout(() => setCompleted(!!summary()), 1200) setTimeout(() => setCompleted(complete), 1200)
}) })
return ( return (
@@ -707,6 +715,11 @@ export default function Page() {
</Accordion> </Accordion>
</div> </div>
</Show> </Show>
<Show when={error() && !expanded()}>
<Card variant="error" class="text-text-on-critical-base">
{error()?.data?.message as string}
</Card>
</Show>
{/* Response */} {/* Response */}
<div class="w-full"> <div class="w-full">
<Switch> <Switch>
@@ -736,6 +749,11 @@ export default function Page() {
return <Message message={assistantMessage} parts={parts()} /> return <Message message={assistantMessage} parts={parts()} />
}} }}
</For> </For>
<Show when={error()}>
<Card variant="error" class="text-text-on-critical-base">
{error()?.data?.message as string}
</Card>
</Show>
</div> </div>
</Collapsible.Content> </Collapsible.Content>
</Collapsible> </Collapsible>