From b9fa7d91630fdaddf1744ba73b6dfcc8821e0b28 Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Tue, 9 Dec 2025 14:49:00 -0600
Subject: [PATCH] wip(desktop): progress
---
packages/desktop/src/context/layout.tsx | 33 +++++++++-----
packages/desktop/src/pages/layout.tsx | 43 +++++++++++--------
packages/enterprise/src/core/share.ts | 2 +-
.../enterprise/src/routes/share/[shareID].tsx | 2 +-
packages/ui/src/components/message-nav.tsx | 2 +-
packages/ui/src/components/message-part.tsx | 2 +-
.../ui/src/components/message-progress.tsx | 2 +-
.../src/components/session-message-rail.tsx | 2 +-
packages/ui/src/components/session-review.tsx | 2 +-
packages/ui/src/components/session-turn.tsx | 2 +-
packages/ui/src/context/data.tsx | 2 +-
packages/util/src/sanitize.ts | 2 +-
12 files changed, 57 insertions(+), 39 deletions(-)
diff --git a/packages/desktop/src/context/layout.tsx b/packages/desktop/src/context/layout.tsx
index 58d947af4..b7d1fabb5 100644
--- a/packages/desktop/src/context/layout.tsx
+++ b/packages/desktop/src/context/layout.tsx
@@ -12,7 +12,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const globalSync = useGlobalSync()
const [store, setStore] = makePersisted(
createStore({
- projects: [] as { directory: string; expanded: boolean }[],
+ projects: [] as { worktree: string; expanded: boolean }[],
sidebar: {
opened: false,
width: 280,
@@ -26,7 +26,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
}),
{
- name: "default-layout.v4",
+ name: "default-layout.v6",
},
)
@@ -43,32 +43,43 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
onMount(() => {
Promise.all(
- store.projects.map(({ directory }) => {
- return loadProjectSessions(directory)
+ store.projects.map(({ worktree }) => {
+ return loadProjectSessions(worktree)
}),
)
})
+ function enrich(project: { worktree: string; expanded: boolean }) {
+ const metadata = globalSync.data.projects.find((x) => x.worktree === project.worktree)
+ if (!metadata) return []
+ return [
+ {
+ ...project,
+ ...metadata,
+ },
+ ]
+ }
+
return {
projects: {
- list: createMemo(() => store.projects),
+ list: createMemo(() => store.projects.flatMap(enrich)),
open(directory: string) {
- if (store.projects.find((x) => x.directory === directory)) return
+ if (store.projects.find((x) => x.worktree === directory)) return
loadProjectSessions(directory)
- setStore("projects", (x) => [...x, { directory, expanded: true }])
+ setStore("projects", (x) => [...x, { worktree: directory, expanded: true }])
},
close(directory: string) {
- setStore("projects", (x) => x.filter((x) => x.directory !== directory))
+ setStore("projects", (x) => x.filter((x) => x.worktree !== directory))
},
expand(directory: string) {
- setStore("projects", (x) => x.map((x) => (x.directory === directory ? { ...x, expanded: true } : x)))
+ setStore("projects", (x) => x.map((x) => (x.worktree === directory ? { ...x, expanded: true } : x)))
},
collapse(directory: string) {
- setStore("projects", (x) => x.map((x) => (x.directory === directory ? { ...x, expanded: false } : x)))
+ setStore("projects", (x) => x.map((x) => (x.worktree === directory ? { ...x, expanded: false } : x)))
},
move(directory: string, toIndex: number) {
setStore("projects", (projects) => {
- const fromIndex = projects.findIndex((x) => x.directory === directory)
+ const fromIndex = projects.findIndex((x) => x.worktree === directory)
if (fromIndex === -1 || fromIndex === toIndex) return projects
const result = [...projects]
const [item] = result.splice(fromIndex, 1)
diff --git a/packages/desktop/src/pages/layout.tsx b/packages/desktop/src/pages/layout.tsx
index 4d3f6a268..c2755b9dc 100644
--- a/packages/desktop/src/pages/layout.tsx
+++ b/packages/desktop/src/pages/layout.tsx
@@ -16,7 +16,7 @@ import { DiffChanges } from "@opencode-ai/ui/diff-changes"
import { getFilename } from "@opencode-ai/util/path"
import { Select } from "@opencode-ai/ui/select"
import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu"
-import { Session } from "@opencode-ai/sdk/v2/client"
+import { Session, Project } from "@opencode-ai/sdk/v2/client"
import { usePlatform } from "@/context/platform"
import { createStore } from "solid-js/store"
import {
@@ -106,8 +106,8 @@ export default function Layout(props: ParentProps) {
const { draggable, droppable } = event
if (draggable && droppable) {
const projects = layout.projects.list()
- const fromIndex = projects.findIndex((p) => p.directory === draggable.id.toString())
- const toIndex = projects.findIndex((p) => p.directory === droppable.id.toString())
+ const fromIndex = projects.findIndex((p) => p.worktree === draggable.id.toString())
+ const toIndex = projects.findIndex((p) => p.worktree === droppable.id.toString())
if (fromIndex !== toIndex && toIndex !== -1) {
layout.projects.move(draggable.id.toString(), toIndex)
}
@@ -176,11 +176,11 @@ export default function Layout(props: ParentProps) {
)
}
- const SortableProject = (props: { project: { directory: string; expanded: boolean } }): JSX.Element => {
- const sortable = createSortable(props.project.directory)
- const [projectStore] = globalSync.child(props.project.directory)
- const slug = createMemo(() => base64Encode(props.project.directory))
- const name = createMemo(() => getFilename(props.project.directory))
+ const SortableProject = (props: { project: Project & { expanded: boolean } }): JSX.Element => {
+ const sortable = createSortable(props.project.worktree)
+ const [projectStore] = globalSync.child(props.project.worktree)
+ const slug = createMemo(() => base64Encode(props.project.worktree))
+ const name = createMemo(() => getFilename(props.project.worktree))
return (
// @ts-ignore
@@ -194,11 +194,18 @@ export default function Layout(props: ParentProps) {
>
-
+
+
+ {(url) =>
}
+
+
+
+
+
- closeProject(props.project.directory)}>
+ closeProject(props.project.worktree)}>
Close Project
@@ -274,8 +281,8 @@ export default function Layout(props: ParentProps) {
-
-
+
+
@@ -315,7 +322,7 @@ export default function Layout(props: ParentProps) {