From f964fd8bb92d55921414895954b68d12050069c6 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 | 16 +++-------------
packages/opencode/src/server/routes/session.ts | 8 +++++++-
2 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index f049dc3bcc1..2e0cc99727b 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -663,7 +663,6 @@ export default function Layout(props: ParentProps) {
if (!expanded && !active) continue
const [dirStore] = globalSync.child(dir, { bootstrap: true })
const dirSessions = dirStore.session
- .filter((session) => session.directory === dirStore.path.directory)
.filter((session) => !session.parentID && !session.time?.archived)
.toSorted(compare)
result.push(...dirSessions)
@@ -671,10 +670,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(compare)
+ return projectStore.session.filter((session) => !session.parentID && !session.time?.archived).toSorted(compare)
})
type PrefetchQueue = {
@@ -2009,10 +2005,7 @@ export default function Layout(props: ParentProps) {
})
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(Date.now())),
+ workspaceStore.session.filter((session) => !session.parentID && !session.time?.archived).toSorted(sortSessions(Date.now())),
)
const children = createMemo(() => {
const map = new Map()
@@ -2418,10 +2411,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(Date.now())),
+ workspaceStore.session.filter((session) => !session.parentID && !session.time?.archived).toSorted(sortSessions(Date.now())),
)
const children = createMemo(() => {
const map = new Map()
diff --git a/packages/opencode/src/server/routes/session.ts b/packages/opencode/src/server/routes/session.ts
index 3850376bdb4..016cca032eb 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