From 42940db9150f51065be8dc010f7b8522ea024d96 Mon Sep 17 00:00:00 2001 From: OpeOginni Date: Sat, 22 Aug 2026 01:35:55 +0200 Subject: [PATCH 1/2] fix(app): load workspace sessions by directory --- .../src/settings/workspaces/workspaces.tsx | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/app/src/settings/workspaces/workspaces.tsx b/packages/app/src/settings/workspaces/workspaces.tsx index e8dd21008c09..1c1f6c2d4396 100644 --- a/packages/app/src/settings/workspaces/workspaces.tsx +++ b/packages/app/src/settings/workspaces/workspaces.tsx @@ -1,5 +1,5 @@ import type { Component } from "solid-js" -import { For, Show, createMemo } from "solid-js" +import { For, Show, batch, createMemo } from "solid-js" import { createStore } from "solid-js/store" import type { SessionInfo } from "@opencode-ai/client/promise" import { useQuery } from "@tanstack/solid-query" @@ -93,14 +93,27 @@ export const SettingsWorkspaces: Component<{ activeDirectory?: string }> = (prop activeDirectory: props.activeDirectory, } } - const loadSessions = async (context = captureDeleteContext()) => { - const fetched = await listAllSessions(context.sdk.api.session, { order: "desc" }) - fetched.forEach(context.data.session.remember) - return mergeWorkspaceSessionInventory(fetched, context.data.session.list()) + // Fetch sessions per workspace directory instead of paging through every + // session on the server; batch the store writes so thousands of remember + // calls don't each re-run the store's sorted-session memo and block the UI. + const loadSessions = async (directories: readonly string[], context = captureDeleteContext()) => { + const fetched = await Promise.all( + directories.map((directory) => listAllSessions(context.sdk.api.session, { order: "desc", directory })), + ) + const sessions = fetched.flat() + batch(() => sessions.forEach(context.data.session.remember)) + return mergeWorkspaceSessionInventory(sessions, context.data.session.list()) } + const workspaceDirectories = createMemo(() => workspaces().map((workspace) => workspace.directory)) const sessionQuery = useQuery(() => ({ - queryKey: [serverSDK.scope, null, "settings-workspace-sessions"] as const, - queryFn: () => loadSessions().then(() => Date.now()), + queryKey: [ + serverSDK.scope, + null, + "settings-workspace-sessions", + workspaceDirectories().map((directory) => String(pathKey(directory))), + ] as const, + queryFn: () => loadSessions(workspaceDirectories()).then(() => Date.now()), + enabled: workspaceDirectories().length > 0, refetchOnMount: "always", })) const sessionsByWorkspace = createMemo( @@ -136,7 +149,7 @@ export const SettingsWorkspaces: Component<{ activeDirectory?: string }> = (prop const [working, branch, sessions] = await Promise.all([ context.sdk.api.vcs.status({ location: { directory: workspace.directory } }), context.sdk.api.vcs.diff({ location: { directory: workspace.directory }, mode: "branch" }), - loadSessions(context), + loadSessions([workspace.directory], context), ]) const result = inspectWorkspaceDeletion({ workspace: workspace.directory, From 89073577dedfd92c596c9380852aac2ae7cd25e6 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 22 Aug 2026 15:39:33 +0800 Subject: [PATCH 2/2] fix(app): avoid caching workspace sessions --- packages/app/src/settings/workspaces/workspaces.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/app/src/settings/workspaces/workspaces.tsx b/packages/app/src/settings/workspaces/workspaces.tsx index 1c1f6c2d4396..ae125334976e 100644 --- a/packages/app/src/settings/workspaces/workspaces.tsx +++ b/packages/app/src/settings/workspaces/workspaces.tsx @@ -1,5 +1,5 @@ import type { Component } from "solid-js" -import { For, Show, batch, createMemo } from "solid-js" +import { For, Show, createMemo } from "solid-js" import { createStore } from "solid-js/store" import type { SessionInfo } from "@opencode-ai/client/promise" import { useQuery } from "@tanstack/solid-query" @@ -93,15 +93,12 @@ export const SettingsWorkspaces: Component<{ activeDirectory?: string }> = (prop activeDirectory: props.activeDirectory, } } - // Fetch sessions per workspace directory instead of paging through every - // session on the server; batch the store writes so thousands of remember - // calls don't each re-run the store's sorted-session memo and block the UI. + // Fetch sessions per workspace directory instead of paging through every session on the server. const loadSessions = async (directories: readonly string[], context = captureDeleteContext()) => { const fetched = await Promise.all( directories.map((directory) => listAllSessions(context.sdk.api.session, { order: "desc", directory })), ) const sessions = fetched.flat() - batch(() => sessions.forEach(context.data.session.remember)) return mergeWorkspaceSessionInventory(sessions, context.data.session.list()) } const workspaceDirectories = createMemo(() => workspaces().map((workspace) => workspace.directory)) @@ -112,7 +109,7 @@ export const SettingsWorkspaces: Component<{ activeDirectory?: string }> = (prop "settings-workspace-sessions", workspaceDirectories().map((directory) => String(pathKey(directory))), ] as const, - queryFn: () => loadSessions(workspaceDirectories()).then(() => Date.now()), + queryFn: () => loadSessions(workspaceDirectories()), enabled: workspaceDirectories().length > 0, refetchOnMount: "always", })) @@ -121,7 +118,7 @@ export const SettingsWorkspaces: Component<{ activeDirectory?: string }> = (prop new Map( workspaces().map((workspace) => [ pathKey(workspace.directory), - sessionQuery.isSuccess ? sessionsForWorkspace(data.session.list(), workspace.directory) : [], + sessionQuery.data ? sessionsForWorkspace(sessionQuery.data, workspace.directory) : [], ]), ), )