From a0d64b12c9901324f3b9c7a9d15b25a35318b914 Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Thu, 2 Jul 2026 14:39:49 +1000 Subject: [PATCH] fix(opencode): filter session list by resolved instance directory (#34842) --- .../instance/httpapi/handlers/experimental.ts | 3 ++- .../instance/httpapi/handlers/session.ts | 4 ++- .../test/server/httpapi-session.test.ts | 25 +++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/experimental.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/experimental.ts index caed544005..b218c6040d 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/experimental.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/experimental.ts @@ -137,8 +137,9 @@ export const experimentalHandlers = HttpApiBuilder.group(InstanceHttpApi, "exper const session = Effect.fn("ExperimentalHttpApi.session")(function* (ctx: { query: typeof SessionListQuery.Type }) { const limit = ctx.query.limit ?? 100 + const directory = ctx.query.directory ? yield* InstanceState.directory : undefined const all = yield* sessions.listGlobal({ - directory: ctx.query.directory, + directory, roots: ctx.query.roots, start: ctx.query.start, cursor: ctx.query.cursor, diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts index 2ebf0cf16f..662585020a 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -18,6 +18,7 @@ import { MessageID, PartID, SessionID } from "@/session/schema" import { NamedError } from "@opencode-ai/core/util/error" import { Cause, Effect, Option, Schema, Scope } from "effect" import * as Stream from "effect/Stream" +import { InstanceState } from "@/effect/instance-state" import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http" import { HttpApiBuilder, HttpApiError, HttpApiSchema } from "effect/unstable/httpapi" import { InstanceHttpApi } from "../api" @@ -61,8 +62,9 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", const scope = yield* Scope.Scope const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) { + const directory = ctx.query.directory ? yield* InstanceState.directory : undefined return yield* session.list({ - directory: ctx.query.scope === "project" ? undefined : ctx.query.directory, + directory: ctx.query.scope === "project" ? undefined : directory, scope: ctx.query.scope, path: ctx.query.path, roots: ctx.query.roots, diff --git a/packages/opencode/test/server/httpapi-session.test.ts b/packages/opencode/test/server/httpapi-session.test.ts index 187d4de366..37f6af6208 100644 --- a/packages/opencode/test/server/httpapi-session.test.ts +++ b/packages/opencode/test/server/httpapi-session.test.ts @@ -21,6 +21,7 @@ import { InstanceStore } from "../../src/project/instance-store" import { Project } from "../../src/project/project" import { HttpApiApp } from "../../src/server/routes/instance/httpapi/server" import * as HttpSessionError from "../../src/server/routes/instance/httpapi/handlers/session-errors" +import { ExperimentalPaths } from "../../src/server/routes/instance/httpapi/groups/experimental" import { SessionPaths } from "../../src/server/routes/instance/httpapi/groups/session" import { Session } from "@/session/session" import { MessageID, PartID, SessionID, type SessionID as SessionIDType } from "../../src/session/schema" @@ -879,6 +880,30 @@ describe("session HttpApi", () => { { git: true, config: { formatter: false, lsp: false } }, ) + it.instance( + "lists sessions created through an equivalent directory hint", + () => + Effect.gen(function* () { + const test = yield* TestInstance + const hint = test.directory + path.sep + const headers = { "x-opencode-directory": hint, "content-type": "application/json" } + const created = yield* requestJson(SessionPaths.create, { + method: "POST", + headers, + body: JSON.stringify({ title: "hinted" }), + }) + + const query = new URLSearchParams({ directory: hint, roots: "true" }) + const listed = yield* requestJson(`${SessionPaths.list}?${query}`, { headers }) + expect(listed.map((item) => item.id)).toContain(created.id) + + const globalQuery = new URLSearchParams({ directory: hint }) + const global = yield* requestJson(`${ExperimentalPaths.session}?${globalQuery}`, { headers }) + expect(global.map((item) => item.id)).toContain(created.id) + }), + { git: true, config: { formatter: false, lsp: false, share: "disabled" } }, + ) + it.instance( "serves paginated message link headers", () =>