Skip to content

Commit f8aa90b

Browse files
committed
fix(server): OpenCode keeps its cached models when a cold probe lists none
1 parent d313b2a commit f8aa90b

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

‎apps/server/src/provider/ProviderRegistry.test.ts‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -918,7 +918,7 @@ it.layer(
918918
);
919919
});
920920

921-
it("retains stale OpenCode models when a refresh fails", () => {
921+
it("retains stale OpenCode models when a refresh fails or lists none", () => {
922922
const previousProvider = {
923923
instanceId: ProviderInstanceId.make("opencode"),
924924
driver: ProviderDriverKind.make("opencode"),
@@ -968,6 +968,21 @@ it.layer(
968968
ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).skills,
969969
previousProvider.skills,
970970
);
971+
972+
const emptyCatalogProvider = {
973+
...refreshedProvider,
974+
status: "warning",
975+
message: "OpenCode 2 is running, but it did not list any models yet.",
976+
slashCommands: [],
977+
skills: [],
978+
} satisfies ServerProvider;
979+
const mergedEmptyCatalog = ProviderRegistry.mergeProviderSnapshot(
980+
previousProvider,
981+
emptyCatalogProvider,
982+
);
983+
assert.deepStrictEqual(mergedEmptyCatalog.models, [...previousProvider.models]);
984+
assert.deepStrictEqual(mergedEmptyCatalog.slashCommands, previousProvider.slashCommands);
985+
assert.deepStrictEqual(mergedEmptyCatalog.skills, previousProvider.skills);
971986
});
972987

973988
describe("Pi model inventories", () => {

‎apps/server/src/provider/ProviderRegistry.ts‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ const shouldRetainMissingProviderModels = (provider: ServerProvider): boolean =>
201201

202202
const isAntigravity = provider.driver === ProviderDriverKind.make("antigravity");
203203
const isCodex = provider.driver === ProviderDriverKind.make("codex");
204-
if (!isAntigravity && !isCodex && provider.driver !== ProviderDriverKind.make("opencode")) {
204+
const isOpenCode = provider.driver === ProviderDriverKind.make("opencode");
205+
if (!isAntigravity && !isCodex && !isOpenCode) {
205206
return true;
206207
}
207208

@@ -217,9 +218,10 @@ const shouldRetainMissingProviderModels = (provider: ServerProvider): boolean =>
217218
isAntigravity && provider.status === "warning" && provider.auth.status === "unknown";
218219
const isPendingInitialProbe =
219220
provider.enabled && !provider.installed && provider.status === "warning";
221+
// A cold OpenCode server can finish its probe as a warning before it lists any models.
220222
const isIncompleteInstalledProbe =
221223
provider.installed &&
222-
(provider.status === "error" || (isCodex && provider.status === "warning"));
224+
(provider.status === "error" || ((isCodex || isOpenCode) && provider.status === "warning"));
223225
return isPendingAntigravityAuthentication || isPendingInitialProbe || isIncompleteInstalledProbe;
224226
};
225227

0 commit comments

Comments
 (0)