| ... | @@ -1,12 +1,30 @@ | ... | @@ -1,12 +1,30 @@ |
| 1 | import * as Schema from "effect/Schema"; | 1 | import * as Schema from "effect/Schema"; |
| 2 | import { describe, expect, it } from "vite-plus/test"; | 2 | import { describe, expect, it } from "vite-plus/test"; |
| 3 | | 3 | |
| 4 | import { ServerConfig, ServerProvider, ServerUpsertKeybindingResult } from "./server.ts"; | 4 | import { |
| | 5 | ServerConfig, |
| | 6 | ServerProvider, |
| | 7 | ServerProviders, |
| | 8 | ServerUpsertKeybindingResult, |
| | 9 | } from "./server.ts"; |
| 5 | | 10 | |
| 6 | const decodeServerProvider = Schema.decodeUnknownSync(ServerProvider); | 11 | const decodeServerProvider = Schema.decodeUnknownSync(ServerProvider); |
| | 12 | const decodeServerProviders = Schema.decodeUnknownSync(ServerProviders); |
| 7 | const decodeUpsertKeybindingResult = Schema.decodeUnknownSync(ServerUpsertKeybindingResult); | 13 | const decodeUpsertKeybindingResult = Schema.decodeUnknownSync(ServerUpsertKeybindingResult); |
| 8 | const decodeAvailableEditors = Schema.decodeUnknownSync(ServerConfig.fields.availableEditors); | 14 | const decodeAvailableEditors = Schema.decodeUnknownSync(ServerConfig.fields.availableEditors); |
| 9 | | 15 | |
| | 16 | const baseProviderSnapshot = { |
| | 17 | instanceId: "codex", |
| | 18 | driver: "codex", |
| | 19 | enabled: true, |
| | 20 | installed: true, |
| | 21 | version: "1.0.0", |
| | 22 | status: "ready", |
| | 23 | auth: { status: "authenticated" }, |
| | 24 | checkedAt: "2026-04-10T00:00:00.000Z", |
| | 25 | models: [], |
| | 26 | }; |
| | 27 | |
| 10 | describe("ServerProvider", () => { | 28 | describe("ServerProvider", () => { |
| 11 | it("defaults capability arrays when decoding provider snapshots", () => { | 29 | it("defaults capability arrays when decoding provider snapshots", () => { |
| 12 | const parsed = decodeServerProvider({ | 30 | const parsed = decodeServerProvider({ |
| ... | @@ -119,4 +137,21 @@ describe("server config forward compatibility", () => { | ... | @@ -119,4 +137,21 @@ describe("server config forward compatibility", () => { |
| 119 | | 137 | |
| 120 | expect(parsed).toEqual(["zed", "vscode"]); | 138 | expect(parsed).toEqual(["zed", "vscode"]); |
| 121 | }); | 139 | }); |
| | 140 | |
| | 141 | // A provider status this build has never seen (a new ServerProviderState, |
| | 142 | // ServerProviderAuthStatus, etc. member) previously failed the whole |
| | 143 | // `providers` array, taking every other provider down with it and, since |
| | 144 | // `providers` sits inside `ServerConfig`, failing the whole config decode — |
| | 145 | // an older client would drop its connection over one provider it can't |
| | 146 | // render. Dropping just that element keeps every other provider working. |
| | 147 | it("drops providers this build cannot decode instead of failing the whole array", () => { |
| | 148 | const decodedBase = decodeServerProvider(baseProviderSnapshot); |
| | 149 | |
| | 150 | const parsed = decodeServerProviders([ |
| | 151 | baseProviderSnapshot, |
| | 152 | { ...baseProviderSnapshot, instanceId: "future", status: "some-future-status" }, |
| | 153 | ]); |
| | 154 | |
| | 155 | expect(parsed).toEqual([decodedBase]); |
| | 156 | }); |
| 122 | }); | 157 | }); |