summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/pages/layout
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-02-26 08:53:36 -0600
committeradamelmore <[email protected]>2026-02-26 08:53:40 -0600
commitb4d0090e005e7355b3e8f2594c0ad8538fffe75b (patch)
tree56fb22785afde2bc0d18a0ef391e93649b90da19 /packages/app/src/pages/layout
parent05ac0a73e15d7a6d230e0a76230104bbe3f5df22 (diff)
downloadopencode-b4d0090e005e7355b3e8f2594c0ad8538fffe75b.tar.gz
opencode-b4d0090e005e7355b3e8f2594c0ad8538fffe75b.zip
chore: fix flaky test
Diffstat (limited to 'packages/app/src/pages/layout')
-rw-r--r--packages/app/src/pages/layout/helpers.test.ts76
-rw-r--r--packages/app/src/pages/layout/helpers.ts5
2 files changed, 80 insertions, 1 deletions
diff --git a/packages/app/src/pages/layout/helpers.test.ts b/packages/app/src/pages/layout/helpers.test.ts
index 83d8f4748..7627d9ba1 100644
--- a/packages/app/src/pages/layout/helpers.test.ts
+++ b/packages/app/src/pages/layout/helpers.test.ts
@@ -1,6 +1,25 @@
import { describe, expect, test } from "bun:test"
+import { type Session } from "@opencode-ai/sdk/v2/client"
import { collectOpenProjectDeepLinks, drainPendingDeepLinks, parseDeepLink } from "./deep-links"
-import { displayName, errorMessage, getDraggableId, syncWorkspaceOrder, workspaceKey } from "./helpers"
+import {
+ displayName,
+ errorMessage,
+ getDraggableId,
+ latestRootSession,
+ syncWorkspaceOrder,
+ workspaceKey,
+} from "./helpers"
+
+const session = (input: Partial<Session> & Pick<Session, "id" | "directory">) =>
+ ({
+ title: "",
+ version: "v2",
+ parentID: undefined,
+ messageCount: 0,
+ permissions: { session: {}, share: {} },
+ time: { created: 0, updated: 0, archived: undefined },
+ ...input,
+ }) as Session
describe("layout deep links", () => {
test("parses open-project deep links", () => {
@@ -73,6 +92,61 @@ describe("layout workspace helpers", () => {
expect(result).toEqual(["/root", "/c", "/b"])
})
+ test("finds the latest root session across workspaces", () => {
+ const result = latestRootSession(
+ [
+ {
+ path: { directory: "/root" },
+ session: [session({ id: "root", directory: "/root", time: { created: 1, updated: 1, archived: undefined } })],
+ },
+ {
+ path: { directory: "/workspace" },
+ session: [
+ session({
+ id: "workspace",
+ directory: "/workspace",
+ time: { created: 2, updated: 2, archived: undefined },
+ }),
+ ],
+ },
+ ],
+ 120_000,
+ )
+
+ expect(result?.id).toBe("workspace")
+ })
+
+ test("ignores archived and child sessions when finding latest root session", () => {
+ const result = latestRootSession(
+ [
+ {
+ path: { directory: "/workspace" },
+ session: [
+ session({
+ id: "archived",
+ directory: "/workspace",
+ time: { created: 10, updated: 10, archived: 10 },
+ }),
+ session({
+ id: "child",
+ directory: "/workspace",
+ parentID: "parent",
+ time: { created: 20, updated: 20, archived: undefined },
+ }),
+ session({
+ id: "root",
+ directory: "/workspace",
+ time: { created: 30, updated: 30, archived: undefined },
+ }),
+ ],
+ },
+ ],
+ 120_000,
+ )
+
+ expect(result?.id).toBe("root")
+ })
+
test("extracts draggable id safely", () => {
expect(getDraggableId({ draggable: { id: "x" } })).toBe("x")
expect(getDraggableId({ draggable: { id: 42 } })).toBeUndefined()
diff --git a/packages/app/src/pages/layout/helpers.ts b/packages/app/src/pages/layout/helpers.ts
index 6a1e7c012..be4297fbe 100644
--- a/packages/app/src/pages/layout/helpers.ts
+++ b/packages/app/src/pages/layout/helpers.ts
@@ -28,6 +28,11 @@ export const isRootVisibleSession = (session: Session, directory: string) =>
export const sortedRootSessions = (store: { session: Session[]; path: { directory: string } }, now: number) =>
store.session.filter((session) => isRootVisibleSession(session, store.path.directory)).sort(sortSessions(now))
+export const latestRootSession = (stores: { session: Session[]; path: { directory: string } }[], now: number) =>
+ stores
+ .flatMap((store) => store.session.filter((session) => isRootVisibleSession(session, store.path.directory)))
+ .sort(sortSessions(now))[0]
+
export const childMapByParent = (sessions: Session[]) => {
const map = new Map<string, string[]>()
for (const session of sessions) {