From c0e30f48c6cc497d849626026699f71503a6074d Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 12 Dec 2025 09:44:46 +0000 Subject: chore: format code --- packages/ui/src/components/icon.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'packages/ui/src/components') diff --git a/packages/ui/src/components/icon.tsx b/packages/ui/src/components/icon.tsx index 79cd85532..ad3988030 100644 --- a/packages/ui/src/components/icon.tsx +++ b/packages/ui/src/components/icon.tsx @@ -23,7 +23,7 @@ const icons = { folder: ``, "magnifying-glass": ``, "plus-small": ``, - "plus": ``, + plus: ``, "pencil-line": ``, mcp: ``, glasses: ``, -- cgit v1.2.3 From feb8c4f3c60e1ada28bd24abd09d534375a6bc08 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 12 Dec 2025 07:07:54 -0600 Subject: feat(desktop): archive sessions --- packages/desktop/src/context/global-sync.tsx | 31 +++++--- packages/desktop/src/context/layout.tsx | 15 +--- packages/desktop/src/context/sync.tsx | 9 +++ packages/desktop/src/pages/layout.tsx | 106 +++++++++++++++++++-------- packages/ui/src/components/icon.tsx | 1 + 5 files changed, 108 insertions(+), 54 deletions(-) (limited to 'packages/ui/src/components') diff --git a/packages/desktop/src/context/global-sync.tsx b/packages/desktop/src/context/global-sync.tsx index 39e0fd34a..4c461a4e9 100644 --- a/packages/desktop/src/context/global-sync.tsx +++ b/packages/desktop/src/context/global-sync.tsx @@ -69,8 +69,19 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple children: {}, }) + async function loadSessions(directory: string) { + globalSDK.client.session.list({ directory }).then((x) => { + const sessions = (x.data ?? []) + .slice() + .filter((s) => !s.time.archived) + .sort((a, b) => a.id.localeCompare(b.id)) + .slice(0, 5) + setGlobalStore("children", directory, "session", sessions) + }) + } + async function bootstrapInstance(directory: string) { - const [store, setStore] = child(directory) + const [, setStore] = child(directory) const sdk = createOpencodeClient({ baseUrl: globalSDK.url, directory, @@ -80,14 +91,7 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple provider: () => sdk.provider.list().then((x) => setStore("provider", x.data!)), path: () => sdk.path.get().then((x) => setStore("path", x.data!)), agent: () => sdk.app.agents().then((x) => setStore("agent", x.data ?? [])), - session: () => - sdk.session.list().then((x) => { - const sessions = (x.data ?? []) - .slice() - .sort((a, b) => a.id.localeCompare(b.id)) - .slice(0, store.limit) - setStore("session", sessions) - }), + session: () => loadSessions(directory), status: () => sdk.session.status().then((x) => setStore("session_status", x.data!)), config: () => sdk.config.get().then((x) => setStore("config", x.data!)), changes: () => sdk.file.status().then((x) => setStore("changes", x.data!)), @@ -158,6 +162,12 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple } case "session.updated": { const result = Binary.search(store.session, event.properties.info.id, (s) => s.id) + if (event.properties.info.time.archived) { + if (result.found) { + setStore("session", (s) => s.filter((x) => x.id !== event.properties.info.id)) + } + break + } if (result.found) { setStore("session", result.index, reconcile(event.properties.info)) break @@ -257,6 +267,9 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple }, child, bootstrap, + project: { + loadSessions, + }, } }, }) diff --git a/packages/desktop/src/context/layout.tsx b/packages/desktop/src/context/layout.tsx index 4ec0af601..3d5cad761 100644 --- a/packages/desktop/src/context/layout.tsx +++ b/packages/desktop/src/context/layout.tsx @@ -92,21 +92,10 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( const enriched = createMemo(() => store.projects.flatMap(enrich)) const list = createMemo(() => enriched().flatMap(colorize)) - async function loadProjectSessions(directory: string) { - const [, setStore] = globalSync.child(directory) - globalSdk.client.session.list({ directory }).then((x) => { - const sessions = (x.data ?? []) - .slice() - .sort((a, b) => a.id.localeCompare(b.id)) - .slice(0, 5) - setStore("session", sessions) - }) - } - onMount(() => { Promise.all( store.projects.map((project) => { - return loadProjectSessions(project.worktree) + return globalSync.project.loadSessions(project.worktree) }), ) }) @@ -116,7 +105,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( list, open(directory: string) { if (store.projects.find((x) => x.worktree === directory)) return - loadProjectSessions(directory) + globalSync.project.loadSessions(directory) setStore("projects", (x) => [{ worktree: directory, expanded: true }, ...x]) }, close(directory: string) { diff --git a/packages/desktop/src/context/sync.tsx b/packages/desktop/src/context/sync.tsx index 85758c5b6..2ab54b3ae 100644 --- a/packages/desktop/src/context/sync.tsx +++ b/packages/desktop/src/context/sync.tsx @@ -65,6 +65,15 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ }) }, more: createMemo(() => store.session.length >= store.limit), + archive: async (sessionID: string) => { + await sdk.client.session.update({ sessionID, time: { archived: Date.now() } }) + setStore( + produce((draft) => { + const match = Binary.search(draft.session, sessionID, (s) => s.id) + if (match.found) draft.session.splice(match.index, 1) + }), + ) + }, }, absolute, get directory() { diff --git a/packages/desktop/src/pages/layout.tsx b/packages/desktop/src/pages/layout.tsx index e7ae83162..c34904e11 100644 --- a/packages/desktop/src/pages/layout.tsx +++ b/packages/desktop/src/pages/layout.tsx @@ -55,6 +55,7 @@ import { showToast, Toast } from "@opencode-ai/ui/toast" import { useGlobalSDK } from "@/context/global-sdk" import { Spinner } from "@opencode-ai/ui/spinner" import { useNotification } from "@/context/notification" +import { Binary } from "@opencode-ai/util/binary" export default function Layout(props: ParentProps) { const [store, setStore] = createStore({ @@ -258,7 +259,8 @@ export default function Layout(props: ParentProps) { const SortableProject = (props: { project: Project & { expanded: boolean } }): JSX.Element => { const notification = useNotification() const sortable = createSortable(props.project.worktree) - const [projectStore] = globalSync.child(props.project.worktree) + const [projectStore, setProjectStore] = globalSync.child(props.project.worktree) + const sessions = createMemo(() => projectStore.session.filter((s) => !s.time.archived)) const slug = createMemo(() => base64Encode(props.project.worktree)) const name = createMemo(() => getFilename(props.project.worktree)) const [expanded, setExpanded] = createSignal(true) @@ -300,21 +302,33 @@ export default function Layout(props: ParentProps) { diff --git a/packages/ui/src/components/icon.tsx b/packages/ui/src/components/icon.tsx index ad3988030..0dbd7a650 100644 --- a/packages/ui/src/components/icon.tsx +++ b/packages/ui/src/components/icon.tsx @@ -4,6 +4,7 @@ const icons = { "align-right": ``, "arrow-up": ``, "arrow-left": ``, + archive: ``, "bubble-5": ``, "bullet-list": ``, "check-small": ``, -- cgit v1.2.3 From 3f4a792c8ac45ea616fd19d65478cdcf6afa69c1 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 12 Dec 2025 10:56:30 -0600 Subject: fix: tweak missing colors --- packages/ui/src/components/toast.css | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'packages/ui/src/components') diff --git a/packages/ui/src/components/toast.css b/packages/ui/src/components/toast.css index fbc84f13c..374dd6523 100644 --- a/packages/ui/src/components/toast.css +++ b/packages/ui/src/components/toast.css @@ -31,7 +31,7 @@ border-radius: var(--radius-lg); border: 1px solid var(--border-weak-base); background: var(--surface-float-base); - color: var(--text-inverted-base); + color: var(--text-invert-base); box-shadow: var(--shadow-md); [data-slot="toast-inner"] { @@ -80,7 +80,8 @@ justify-content: center; [data-component="icon"] { - color: rgba(253, 252, 252, 0.94); + color: var(--text-invert-stronger); + /* color: var(--icon-invert-base); */ } } @@ -93,7 +94,7 @@ } [data-slot="toast-title"] { - color: var(--text-inverted-strong); + color: var(--text-invert-strong); /* text-14-medium */ font-family: var(--font-family-sans); @@ -107,7 +108,8 @@ } [data-slot="toast-description"] { - color: var(--text-inverted-base); + color: var(--text-invert-base); + text-wrap-style: pretty; /* text-14-regular */ font-family: var(--font-family-sans); @@ -132,7 +134,7 @@ padding: 0; cursor: pointer; - color: var(--text-inverted-strong); + color: var(--text-invert-strong); font-family: var(--font-family-sans); font-size: var(--font-size-base); font-weight: var(--font-weight-medium); @@ -144,7 +146,7 @@ } &:last-child { - color: var(--text-inverted-weak); + color: var(--text-invert-weak); } } -- cgit v1.2.3