From b654d7755cfc6660f7898815b6fe4901600c27d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Oct 2026 06:06:19 +0000 Subject: [PATCH 1/2] Update OpenCode client to 2.0.27 --- packages/opencode-adapter/package.json | 2 +- packages/opencode-adapter/src/index.ts | 2 +- pnpm-lock.yaml | 45 ++++++++++++-------------- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/packages/opencode-adapter/package.json b/packages/opencode-adapter/package.json index 6d36a0a..92488b2 100644 --- a/packages/opencode-adapter/package.json +++ b/packages/opencode-adapter/package.json @@ -18,7 +18,7 @@ "typecheck": "tsc -p tsconfig.json" }, "dependencies": { - "@opencode/client": "2.0.26" + "@opencode/client": "2.0.27" }, "devDependencies": { "@opencode2-mobile/test-fixtures": "workspace:*", diff --git a/packages/opencode-adapter/src/index.ts b/packages/opencode-adapter/src/index.ts index f853609..e5fde42 100644 --- a/packages/opencode-adapter/src/index.ts +++ b/packages/opencode-adapter/src/index.ts @@ -23,7 +23,7 @@ import { import { ensurePromiseWithResolvers } from "./promise-with-resolvers"; -export const openCodeClientContractVersion = "2.0.26"; +export const openCodeClientContractVersion = "2.0.27"; export type OpenCodeClientOptions = { authorization?: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 149d4f9..e1a4c5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -203,8 +203,8 @@ importers: packages/opencode-adapter: dependencies: '@opencode/client': - specifier: 2.0.26 - version: 2.0.26(effect@4.0.0-rc.112) + specifier: 2.0.27 + version: 2.0.27(effect@4.0.1) devDependencies: '@opencode2-mobile/test-fixtures': specifier: workspace:* @@ -1370,10 +1370,10 @@ packages: '@opencode-ai/schema@0.0.0-beta-18387': resolution: {integrity: sha512-of3chc9a4eQ24z9gTct10kBlhycZ+cI3JeIl51ideHVySY5aQLbGBo5SL7NLiuC7pu2kUY5OdmLjPDnLXAskzg==} - '@opencode/client@2.0.26': - resolution: {integrity: sha512-0uqhXq6DJYjas3mc4roTyWAmhJpyO2gJaMcenoiA22RXJSOSIwPFho5K4qGmYDJGd5Fvvswh++Nr/wfjaHAYyg==} + '@opencode/client@2.0.27': + resolution: {integrity: sha512-RqJodg+QsUgqqJVo+b2PGk2w96l7424nM4BijUSb49Iep9IyUfjDH3zfii4OGfCsmZkNCYK83Mgk9e9EeRA1iQ==} peerDependencies: - effect: 4.0.0-rc.112 + effect: 4.0.1 solid-js: '>=1.9.0' peerDependenciesMeta: effect: @@ -1381,11 +1381,11 @@ packages: solid-js: optional: true - '@opencode/protocol@2.0.26': - resolution: {integrity: sha512-Q+kbu0zTneh0RC4jhiuB19WeP8et9dWXGJVjb5EbUdJ8E1j5Eh0lAyqLXlM2tzTxfMfK3gos9ss6mxMVsvDFIg==} + '@opencode/protocol@2.0.27': + resolution: {integrity: sha512-t1j+m5T3TBusHaL58t6gSSQQEFoi+qjVyQ0Eta/4mLeZLJDqSV8BNN6N93GFpV2MJ1iBpGmrH0C02n2Q+nDHfw==} - '@opencode/schema@2.0.26': - resolution: {integrity: sha512-DZ09xXCTkTI3Y9VzuQHsm5AMGh67EqkUM13lC0LGKvD12RAYaVmRX5lDv5AnD3OkmUmPPWLYWjicT18CDloy6Q==} + '@opencode/schema@2.0.27': + resolution: {integrity: sha512-BxGuiIFo503tW6UYxoBrrgjyczEvPiU3fDn45FxUHtmZgBC8kFE+ldI56ab8kV0Lu5C94ZKOniRb2bWqDu4tAg==} '@oxc-project/types@0.143.0': resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} @@ -2517,8 +2517,8 @@ packages: effect@4.0.0-rc.111: resolution: {integrity: sha512-ASd5L58EIR0CUNueZNKKjSsyOCd+2alxOAIaTcHaqkJkPsaYSsw5Cg/cfANk5K4Jr2YsX756xvX11shzqsreWA==} - effect@4.0.0-rc.112: - resolution: {integrity: sha512-wXxwuh1Ywnv4cPRM3Wfa0vDwuOHnZ1TsTgHJkG9XgzND6inhBH9n1vBxhg3iIXOia/OrpmvVmd3lrD4vq6bF3A==} + effect@4.0.1: + resolution: {integrity: sha512-b1VlQG9g8fwxE5QnIZuPoOP/0MsqHJSRKxUijjoM80E5q95FXrX5yWtY5XI8G+GJsBQAVSDbLS458z9a++uVvw==} electron-to-chromium@1.5.412: resolution: {integrity: sha512-z4rMe3esBzlzovKHj4gxJnsCGZRK5l4baUvm+gCGJBPE+gsyUMKsuU9tnEUtI1dOebXz1ytAPGjvXhmQ7rIPwA==} @@ -6445,22 +6445,22 @@ snapshots: '@standard-schema/spec': 1.1.0 effect: 4.0.0-rc.111 - '@opencode/client@2.0.26(effect@4.0.0-rc.112)': + '@opencode/client@2.0.27(effect@4.0.1)': dependencies: - '@opencode/protocol': 2.0.26 - '@opencode/schema': 2.0.26 + '@opencode/protocol': 2.0.27 + '@opencode/schema': 2.0.27 optionalDependencies: - effect: 4.0.0-rc.112 + effect: 4.0.1 - '@opencode/protocol@2.0.26': + '@opencode/protocol@2.0.27': dependencies: - '@opencode/schema': 2.0.26 - effect: 4.0.0-rc.112 + '@opencode/schema': 2.0.27 + effect: 4.0.1 - '@opencode/schema@2.0.26': + '@opencode/schema@2.0.27': dependencies: '@standard-schema/spec': 1.1.0 - effect: 4.0.0-rc.112 + effect: 4.0.1 '@oxc-project/types@0.143.0': {} @@ -7681,10 +7681,7 @@ snapshots: fast-check: 4.9.0 msgpackr: 2.0.5 - effect@4.0.0-rc.112: - dependencies: - fast-check: 4.9.0 - msgpackr: 2.0.5 + effect@4.0.1: {} electron-to-chromium@1.5.412: {} From 23684125f9507c54a5455f5f5698652f6522255d Mon Sep 17 00:00:00 2001 From: Eivind Jonassen Date: Mon, 12 Oct 2026 08:22:39 +0200 Subject: [PATCH 2/2] Fix project list request options for OpenCode 2.0.27 --- .../connection-transport-coordinator.test.ts | 22 +++++++++++++++++++ .../state/connection-transport-coordinator.ts | 2 +- packages/opencode-adapter/src/index.test.ts | 15 +++++++++++++ packages/opencode-adapter/src/index.ts | 2 +- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/apps/mobile/src/state/connection-transport-coordinator.test.ts b/apps/mobile/src/state/connection-transport-coordinator.test.ts index a418b7a..17ed26b 100644 --- a/apps/mobile/src/state/connection-transport-coordinator.test.ts +++ b/apps/mobile/src/state/connection-transport-coordinator.test.ts @@ -14,6 +14,28 @@ jest.mock("@opencode2-mobile/opencode-adapter", () => ({ typeof error === "object" && error !== null && "_tag" in error ? "UNAUTHORIZED" : "UNREACHABLE", })); +test("passes project snapshot cancellation in the request-options argument", async () => { + const stream = createEventStream(); + const snapshots = createSnapshotClient(true); + const coordinator = createCoordinator({ + eventClient: { event: { subscribe: stream.subscribe } } as never, + restClient: snapshots.client, + }); + + coordinator.start(); + await flush(); + + expect(snapshots.client.project.list).toHaveBeenCalledWith(undefined, { + signal: expect.any(AbortSignal), + }); + expect(snapshots.client.project.list).toHaveBeenCalledWith( + undefined, + stream.subscribe.mock.calls[0]?.[0], + ); + coordinator.stop(); + expect(stream.subscribe.mock.calls[0]?.[0]?.signal?.aborted).toBe(true); +}); + test("buffers events until authoritative snapshots are installed", async () => { const stream = createEventStream(); const snapshots = createSnapshotClient(); diff --git a/apps/mobile/src/state/connection-transport-coordinator.ts b/apps/mobile/src/state/connection-transport-coordinator.ts index 0aa542d..e0cb4bb 100644 --- a/apps/mobile/src/state/connection-transport-coordinator.ts +++ b/apps/mobile/src/state/connection-transport-coordinator.ts @@ -146,7 +146,7 @@ export class ConnectionTransportCoordinator { const requestOptions = { signal: controller.signal }; void Promise.all([ this.options.restClient.server.status(requestOptions), - this.options.restClient.project.list(requestOptions), + this.options.restClient.project.list(undefined, requestOptions), this.options.restClient.session.active(requestOptions), ]) .then(([health, projects, activeSessions]) => { diff --git a/packages/opencode-adapter/src/index.test.ts b/packages/opencode-adapter/src/index.test.ts index 7df9a4e..a7c5ddb 100644 --- a/packages/opencode-adapter/src/index.test.ts +++ b/packages/opencode-adapter/src/index.test.ts @@ -37,6 +37,7 @@ import { listOpenCodeModels, listOpenCodePermissionRequests, listOpenCodeProjectSessions, + listOpenCodeProjects, listOpenCodeSessionInbox, listOpenCodeSessions, listOpenCodeSkills, @@ -61,6 +62,20 @@ import { waitForOpenCodeSession, } from "./index"; +describe("project listing", () => { + it("forwards cancellation as request options without adding project filters", async () => { + const fixture = createFakeOpenCodeApi(); + const fetch = vi.fn(fixture.fetch); + const client = createOpenCodeClient({ baseUrl: "http://fake.invalid", fetch }); + const signal = new AbortController().signal; + + await expect(listOpenCodeProjects(client, { signal })).resolves.toEqual([]); + + expect(fetch.mock.calls[0]?.[1]?.signal).toBe(signal); + expect(fixture.requests).toEqual([{ method: "GET", path: "/api/project", query: {} }]); + }); +}); + describe("location MCP controls", () => { it("lists and connects/disconnects at the exact location without changing other locations", async () => { const fixture = createFakeOpenCodeApi({ diff --git a/packages/opencode-adapter/src/index.ts b/packages/opencode-adapter/src/index.ts index e5fde42..d84939c 100644 --- a/packages/opencode-adapter/src/index.ts +++ b/packages/opencode-adapter/src/index.ts @@ -354,7 +354,7 @@ export async function listOpenCodeProjects( client: OpenCodeClient, options?: OpenCodeRequestOptions, ) { - const projects = await client.project.list(options); + const projects = await client.project.list(undefined, options); if (!Array.isArray(projects) || !projects.every(isValidProject)) { throw new Error("MALFORMED_PROJECT_LIST"); }