fix(opencode): filter session list by resolved instance directory (#34842)

This commit is contained in:
Luke Parker 2026-07-02 14:39:49 +10:00 committed by GitHub
commit a0d64b12c9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 30 additions and 2 deletions

View file

@ -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,

View file

@ -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,

View file

@ -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<Session.Info>(SessionPaths.create, {
method: "POST",
headers,
body: JSON.stringify({ title: "hinted" }),
})
const query = new URLSearchParams({ directory: hint, roots: "true" })
const listed = yield* requestJson<Session.Info[]>(`${SessionPaths.list}?${query}`, { headers })
expect(listed.map((item) => item.id)).toContain(created.id)
const globalQuery = new URLSearchParams({ directory: hint })
const global = yield* requestJson<Session.Info[]>(`${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",
() =>