diff --git a/packages/opencode/src/acp/service.ts b/packages/opencode/src/acp/service.ts index 36e8375f5cc4..0ebe79ca7a1c 100644 --- a/packages/opencode/src/acp/service.ts +++ b/packages/opencode/src/acp/service.ts @@ -243,9 +243,12 @@ export function make(input: { const listSessions = Effect.fn("ACP.listSessions")(function* (params: ListSessionsRequest) { const cursor = params.cursor ? Number(params.cursor) : undefined const limit = 100 + // Route through the cross-project session listing so an omitted cwd + // returns every known session, per the ACP session/list spec, instead of + // being scoped to the ACP process's own project. const sessions = yield* request( () => - input.sdk.session.list( + input.sdk.experimental.session.list( { ...(params.cwd ? { directory: params.cwd } : {}), roots: true, diff --git a/packages/opencode/test/acp/service-session.test.ts b/packages/opencode/test/acp/service-session.test.ts index 890719072abf..acd28a6e24e2 100644 --- a/packages/opencode/test/acp/service-session.test.ts +++ b/packages/opencode/test/acp/service-session.test.ts @@ -160,6 +160,10 @@ describe("ACP service sessions", () => { title: `Session ${index + 1}`, time: { created: index + 1, updated: index + 1 }, })) + const list = (input: { directory?: string }) => + Promise.resolve({ + data: input.directory ? sessions.filter((session) => session.directory === input.directory) : sessions, + }) const sdk = { config: { providers: () => Promise.resolve({ data: { providers: [provider], default: { test: modelID } } }), @@ -188,10 +192,7 @@ describe("ACP service sessions", () => { session: { create: () => Promise.resolve({ data: { id: "ses_new" } }), get: () => Promise.resolve({ data: { id: "ses_loaded" } }), - list: (input: { directory?: string }) => - Promise.resolve({ - data: input.directory ? sessions.filter((session) => session.directory === input.directory) : sessions, - }), + list, messages: () => Promise.resolve({ data: messages }), prompt: (input: unknown) => { prompts.push(input) @@ -234,6 +235,11 @@ describe("ACP service sessions", () => { return Promise.resolve({ data: { id: `fork_${input.sessionID}` } }) }, }, + experimental: { + session: { + list, + }, + }, mcp: { add: (input: { name?: string }) => { if (input.name) mcpAdds.push(input.name)