fix(opencode): filter session list by resolved instance directory (#34842)
This commit is contained in:
@@ -137,8 +137,9 @@ export const experimentalHandlers = HttpApiBuilder.group(InstanceHttpApi, "exper
|
|||||||
|
|
||||||
const session = Effect.fn("ExperimentalHttpApi.session")(function* (ctx: { query: typeof SessionListQuery.Type }) {
|
const session = Effect.fn("ExperimentalHttpApi.session")(function* (ctx: { query: typeof SessionListQuery.Type }) {
|
||||||
const limit = ctx.query.limit ?? 100
|
const limit = ctx.query.limit ?? 100
|
||||||
|
const directory = ctx.query.directory ? yield* InstanceState.directory : undefined
|
||||||
const all = yield* sessions.listGlobal({
|
const all = yield* sessions.listGlobal({
|
||||||
directory: ctx.query.directory,
|
directory,
|
||||||
roots: ctx.query.roots,
|
roots: ctx.query.roots,
|
||||||
start: ctx.query.start,
|
start: ctx.query.start,
|
||||||
cursor: ctx.query.cursor,
|
cursor: ctx.query.cursor,
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import { MessageID, PartID, SessionID } from "@/session/schema"
|
|||||||
import { NamedError } from "@opencode-ai/core/util/error"
|
import { NamedError } from "@opencode-ai/core/util/error"
|
||||||
import { Cause, Effect, Option, Schema, Scope } from "effect"
|
import { Cause, Effect, Option, Schema, Scope } from "effect"
|
||||||
import * as Stream from "effect/Stream"
|
import * as Stream from "effect/Stream"
|
||||||
|
import { InstanceState } from "@/effect/instance-state"
|
||||||
import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
|
import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
|
||||||
import { HttpApiBuilder, HttpApiError, HttpApiSchema } from "effect/unstable/httpapi"
|
import { HttpApiBuilder, HttpApiError, HttpApiSchema } from "effect/unstable/httpapi"
|
||||||
import { InstanceHttpApi } from "../api"
|
import { InstanceHttpApi } from "../api"
|
||||||
@@ -61,8 +62,9 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|||||||
const scope = yield* Scope.Scope
|
const scope = yield* Scope.Scope
|
||||||
|
|
||||||
const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) {
|
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({
|
return yield* session.list({
|
||||||
directory: ctx.query.scope === "project" ? undefined : ctx.query.directory,
|
directory: ctx.query.scope === "project" ? undefined : directory,
|
||||||
scope: ctx.query.scope,
|
scope: ctx.query.scope,
|
||||||
path: ctx.query.path,
|
path: ctx.query.path,
|
||||||
roots: ctx.query.roots,
|
roots: ctx.query.roots,
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import { InstanceStore } from "../../src/project/instance-store"
|
|||||||
import { Project } from "../../src/project/project"
|
import { Project } from "../../src/project/project"
|
||||||
import { HttpApiApp } from "../../src/server/routes/instance/httpapi/server"
|
import { HttpApiApp } from "../../src/server/routes/instance/httpapi/server"
|
||||||
import * as HttpSessionError from "../../src/server/routes/instance/httpapi/handlers/session-errors"
|
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 { SessionPaths } from "../../src/server/routes/instance/httpapi/groups/session"
|
||||||
import { Session } from "@/session/session"
|
import { Session } from "@/session/session"
|
||||||
import { MessageID, PartID, SessionID, type SessionID as SessionIDType } from "../../src/session/schema"
|
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 } },
|
{ 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(
|
it.instance(
|
||||||
"serves paginated message link headers",
|
"serves paginated message link headers",
|
||||||
() =>
|
() =>
|
||||||
|
|||||||
Reference in New Issue
Block a user