From ffc889b99e61c6f21ce68985ee398c3031a5b19b Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Fri, 31 Oct 2025 11:54:27 -0500
Subject: wip: desktop work
---
.../desktop/src/components/message-progress.tsx | 82 +++++++++++++
packages/desktop/src/components/spinner.tsx | 39 +++++++
packages/desktop/src/pages/index.tsx | 130 +++++----------------
3 files changed, 151 insertions(+), 100 deletions(-)
create mode 100644 packages/desktop/src/components/message-progress.tsx
create mode 100644 packages/desktop/src/components/spinner.tsx
(limited to 'packages/desktop/src')
diff --git a/packages/desktop/src/components/message-progress.tsx b/packages/desktop/src/components/message-progress.tsx
new file mode 100644
index 000000000..f77e196b5
--- /dev/null
+++ b/packages/desktop/src/components/message-progress.tsx
@@ -0,0 +1,82 @@
+import { For, 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"
+
+export function MessageProgress(props: { assistantMessages: () => AssistantMessageType[] }) {
+ const sync = useSync()
+ const items = createMemo(() => props.assistantMessages().flatMap((m) => sync.data.part[m.id]))
+
+ const finishedItems = createMemo(() => [
+ "",
+ "",
+ "Loading...",
+ ...items().filter(
+ (p) =>
+ p?.type === "text" ||
+ (p?.type === "reasoning" && p.time?.end) ||
+ (p?.type === "tool" && p.state.status === "completed"),
+ ),
+ "",
+ ])
+
+ const MINIMUM_DELAY = 400
+ const [visibleCount, setVisibleCount] = createSignal(1)
+
+ createEffect(() => {
+ const total = finishedItems().length
+ if (total > visibleCount()) {
+ const timer = setTimeout(() => {
+ setVisibleCount((prev) => prev + 1)
+ }, MINIMUM_DELAY)
+ onCleanup(() => clearTimeout(timer))
+ } else if (total < visibleCount()) {
+ setVisibleCount(total)
+ }
+ })
+
+ const translateY = createMemo(() => {
+ const total = visibleCount()
+ if (total < 2) return "0px"
+ return `-${(total - 2) * 40 - 8}px`
+ })
+
+ return (
+
+ )
+}
diff --git a/packages/desktop/src/components/spinner.tsx b/packages/desktop/src/components/spinner.tsx
new file mode 100644
index 000000000..5fc4cda64
--- /dev/null
+++ b/packages/desktop/src/components/spinner.tsx
@@ -0,0 +1,39 @@
+import { ComponentProps, For } from "solid-js"
+
+export function Spinner(props: { class?: string; classList?: ComponentProps<"div">["classList"] }) {
+ const squares = Array.from({ length: 16 }, (_, i) => ({
+ id: i,
+ x: (i % 4) * 4,
+ y: Math.floor(i / 4) * 4,
+ delay: Math.random() * 3,
+ duration: 2 + Math.random() * 2,
+ }))
+
+ return (
+
+ )
+}
diff --git a/packages/desktop/src/pages/index.tsx b/packages/desktop/src/pages/index.tsx
index 5b2f4ecc1..3eea97b6c 100644
--- a/packages/desktop/src/pages/index.tsx
+++ b/packages/desktop/src/pages/index.tsx
@@ -17,6 +17,7 @@ import {
} from "@opencode-ai/ui"
import { FileIcon } from "@/ui"
import FileTree from "@/components/file-tree"
+import { MessageProgress } from "@/components/message-progress"
import { For, onCleanup, onMount, Show, Match, Switch, createSignal, createEffect, createMemo } from "solid-js"
import { useLocal, type LocalFile } from "@/context/local"
import { createStore } from "solid-js/store"
@@ -39,6 +40,7 @@ import { useSync } from "@/context/sync"
import { useSDK } from "@/context/sdk"
import { type AssistantMessage as AssistantMessageType } from "@opencode-ai/sdk"
import { Markdown } from "@opencode-ai/ui"
+import { Spinner } from "@/components/spinner"
export default function Page() {
const local = useLocal()
@@ -546,21 +548,31 @@ export default function Page() {
{(message) => {
const diffs = createMemo(() => message.summary?.diffs ?? [])
+ const working = createMemo(() => !message.summary?.title)
return (
- local.session.setActiveMessage(message.id)}
- >
-
-
+
+
+
+
+
+
+
+
+
+
+ {message.summary?.title ?? local.session.getMessageText(message)}
+
+
)
}}
@@ -600,19 +612,15 @@ export default function Page() {
-
-
-
-
-
+
+
+
{/* Summary */}
Summary
-
-
-
+ {(summary) => }
@@ -666,85 +674,7 @@ export default function Page() {
- {(_) => {
- const items = createMemo(() =>
- assistantMessages().flatMap((m) => sync.data.part[m.id]),
- )
- const finishedItems = createMemo(() =>
- items().filter(
- (p) =>
- (p?.type === "text" && p.time?.end) ||
- (p?.type === "reasoning" && p.time?.end) ||
- (p?.type === "tool" && p.state.status === "completed"),
- ),
- )
-
- const MINIMUM_DELAY = 800
- const [visibleCount, setVisibleCount] = createSignal(1)
-
- createEffect(() => {
- const total = finishedItems().length
- if (total > visibleCount()) {
- const timer = setTimeout(() => {
- setVisibleCount((prev) => prev + 1)
- }, MINIMUM_DELAY)
- onCleanup(() => clearTimeout(timer))
- } else if (total < visibleCount()) {
- setVisibleCount(total)
- }
- })
-
- const translateY = createMemo(() => {
- const total = visibleCount()
- if (total < 2) return "0px"
- return `-${(total - 2) * 48 - 8}px`
- })
-
- return (
-
- )
- }}
+
--
cgit v1.2.3