diff --git a/packages/opencode/src/session/session.ts b/packages/opencode/src/session/session.ts index 5c938ff69383..ab1102955ec8 100644 --- a/packages/opencode/src/session/session.ts +++ b/packages/opencode/src/session/session.ts @@ -42,6 +42,19 @@ import { NonNegativeInt, optionalOmitUndefined, withStatics } from "@/util/schem const log = Log.create({ service: "session" }) +function windowsDirectoryVariants(directory: string) { + if (!/^[a-zA-Z]:[\\/]/.test(directory) && !directory.startsWith("\\\\") && !directory.startsWith("//")) { + return [directory] + } + return Array.from(new Set([directory, directory.replaceAll("/", "\\"), directory.replaceAll("\\", "/")])) +} + +function directoryCondition(directory: string) { + const variants = windowsDirectoryVariants(directory) + if (variants.length === 1) return eq(SessionTable.directory, directory) + return or(...variants.map((item) => eq(SessionTable.directory, item)))! +} + const parentTitlePrefix = "New session - " const childTitlePrefix = "Child session - " @@ -829,13 +842,13 @@ function* listByProject( conditions.push( input.directory - ? or(...conds, and(isNull(SessionTable.path), eq(SessionTable.directory, input.directory))!)! + ? or(...conds, and(isNull(SessionTable.path), directoryCondition(input.directory))!)! : or(...conds)!, ) } } else if (input.scope !== "project" && !Flag.OPENCODE_EXPERIMENTAL_WORKSPACES) { if (input.directory) { - conditions.push(eq(SessionTable.directory, input.directory)) + conditions.push(directoryCondition(input.directory)) } } if (input.roots) { @@ -876,7 +889,7 @@ export function* listGlobal(input?: { const conditions: SQL[] = [] if (input?.directory) { - conditions.push(eq(SessionTable.directory, input.directory)) + conditions.push(directoryCondition(input.directory)) } if (input?.roots) { conditions.push(isNull(SessionTable.parent_id)) diff --git a/packages/opencode/src/v2/session.ts b/packages/opencode/src/v2/session.ts index bb86f039b230..5f8cbd05bda6 100644 --- a/packages/opencode/src/v2/session.ts +++ b/packages/opencode/src/v2/session.ts @@ -20,6 +20,19 @@ export type Delivery = Schema.Schema.Type export const DefaultDelivery = "immediate" satisfies Delivery +function windowsDirectoryVariants(directory: string) { + if (!/^[a-zA-Z]:[\\/]/.test(directory) && !directory.startsWith("\\\\") && !directory.startsWith("//")) { + return [directory] + } + return Array.from(new Set([directory, directory.replaceAll("/", "\\"), directory.replaceAll("\\", "/")])) +} + +function directoryCondition(directory: string) { + const variants = windowsDirectoryVariants(directory) + if (variants.length === 1) return eq(SessionTable.directory, directory) + return or(...variants.map((item) => eq(SessionTable.directory, item)))! +} + export class Info extends Schema.Class("Session.Info")({ id: SessionID, parentID: optionalOmitUndefined(SessionID), @@ -158,7 +171,7 @@ export const layer = Layer.effect( if (direction === "previous" && order === "asc") order = "desc" if (direction === "previous" && order === "desc") order = "asc" const conditions: SQL[] = [] - if (input.directory) conditions.push(eq(SessionTable.directory, input.directory)) + if (input.directory) conditions.push(directoryCondition(input.directory)) if (input.path) conditions.push(or(eq(SessionTable.path, input.path), like(SessionTable.path, `${input.path}/%`))!) if (input.workspaceID) conditions.push(eq(SessionTable.workspace_id, input.workspaceID))