From 19153c13a1c8a877516ca6496eafe7f6c809db00 Mon Sep 17 00:00:00 2001
From: ops
Date: Tue, 20 Jan 2026 02:19:58 +0100
Subject: [PATCH] fix: show sandbox sessions with different directory in web ui
---
packages/app/src/pages/layout.tsx | 18 +++---------------
packages/opencode/src/server/routes/session.ts | 8 +++++++-
2 files changed, 10 insertions(+), 16 deletions(-)
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index e803681801d..ea7f11e4166 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -518,7 +518,6 @@ export default function Layout(props: ParentProps) {
for (const dir of dirs) {
const [dirStore] = globalSync.child(dir)
const dirSessions = dirStore.session
- .filter((session) => session.directory === dirStore.path.directory)
.filter((session) => !session.parentID && !session.time?.archived)
.toSorted(sortSessions)
result.push(...dirSessions)
@@ -526,10 +525,7 @@ export default function Layout(props: ParentProps) {
return result
}
const [projectStore] = globalSync.child(project.worktree)
- return projectStore.session
- .filter((session) => session.directory === projectStore.path.directory)
- .filter((session) => !session.parentID && !session.time?.archived)
- .toSorted(sortSessions)
+ return projectStore.session.filter((session) => !session.parentID && !session.time?.archived).toSorted(sortSessions)
})
type PrefetchQueue = {
@@ -1454,10 +1450,7 @@ export default function Layout(props: ParentProps) {
const [menuOpen, setMenuOpen] = createSignal(false)
const slug = createMemo(() => base64Encode(props.directory))
const sessions = createMemo(() =>
- workspaceStore.session
- .filter((session) => session.directory === workspaceStore.path.directory)
- .filter((session) => !session.parentID && !session.time?.archived)
- .toSorted(sortSessions),
+ workspaceStore.session.filter((session) => !session.parentID && !session.time?.archived).toSorted(sortSessions),
)
const local = createMemo(() => props.directory === props.project.worktree)
const workspaceValue = createMemo(() => {
@@ -1632,7 +1625,6 @@ export default function Layout(props: ParentProps) {
const sessions = (directory: string) => {
const [data] = globalSync.child(directory)
return data.session
- .filter((session) => session.directory === data.path.directory)
.filter((session) => !session.parentID && !session.time?.archived)
.toSorted(sortSessions)
.slice(0, 2)
@@ -1641,7 +1633,6 @@ export default function Layout(props: ParentProps) {
const projectSessions = () => {
const [data] = globalSync.child(props.project.worktree)
return data.session
- .filter((session) => session.directory === data.path.directory)
.filter((session) => !session.parentID && !session.time?.archived)
.toSorted(sortSessions)
.slice(0, 2)
@@ -1736,10 +1727,7 @@ export default function Layout(props: ParentProps) {
const [workspaceStore, setWorkspaceStore] = globalSync.child(props.project.worktree)
const slug = createMemo(() => base64Encode(props.project.worktree))
const sessions = createMemo(() =>
- workspaceStore.session
- .filter((session) => session.directory === workspaceStore.path.directory)
- .filter((session) => !session.parentID && !session.time?.archived)
- .toSorted(sortSessions),
+ workspaceStore.session.filter((session) => !session.parentID && !session.time?.archived).toSorted(sortSessions),
)
const loading = createMemo(() => workspaceStore.status !== "complete" && sessions().length === 0)
const hasMore = createMemo(() => workspaceStore.sessionTotal > workspaceStore.session.length)
diff --git a/packages/opencode/src/server/routes/session.ts b/packages/opencode/src/server/routes/session.ts
index a98624dfae2..515e1c8ae4f 100644
--- a/packages/opencode/src/server/routes/session.ts
+++ b/packages/opencode/src/server/routes/session.ts
@@ -56,7 +56,13 @@ export const SessionRoutes = lazy(() =>
const term = query.search?.toLowerCase()
const sessions: Session.Info[] = []
for await (const session of Session.list()) {
- if (query.directory !== undefined && session.directory !== query.directory) continue
+ const normalizedSessionDir = Filesystem.normalize(session.directory)
+ if (
+ normalizedQueryDir !== undefined &&
+ normalizedSessionDir !== normalizedQueryDir &&
+ !Filesystem.contains(normalizedQueryDir, normalizedSessionDir)
+ )
+ continue
if (query.roots && session.parentID) continue
if (query.start !== undefined && session.time.updated < query.start) continue
if (term !== undefined && !session.title.toLowerCase().includes(term)) continue