diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index 4844bab4b46..fca466e6a47 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -1662,7 +1662,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper } await this.client.global.dispose().catch((e: unknown) => - console.warn("[Kilo New] KiloProvider: global.dispose() after login failed:", e), + console.warn("[Kilo New] KiloProvider: global.dispose() after org switch failed:", e), ) // Org switch succeeded — refresh profile and providers independently (best-effort) @@ -1717,6 +1717,11 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper type: "profileData", data: null, }) + + await this.client.global.dispose().catch((e: unknown) => + console.warn("[Kilo New] KiloProvider: global.dispose() after logout failed:", e), + ) + } catch (error) { console.error("[Kilo New] KiloProvider: ❌ Logout failed:", error) this.postMessage({ @@ -1725,9 +1730,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper }) } - await this.client.global.dispose().catch((e: unknown) => - console.warn("[Kilo New] KiloProvider: global.dispose() after login failed:", e), - ) + } /** diff --git a/packages/opencode/test/kilocode/model-cache-org.test.ts b/packages/opencode/test/kilocode/model-cache-org.test.ts index 7b70e0c8dfa..bf2b1adbedf 100644 --- a/packages/opencode/test/kilocode/model-cache-org.test.ts +++ b/packages/opencode/test/kilocode/model-cache-org.test.ts @@ -121,3 +121,52 @@ test("model fetch without OAuth accountId does not set kilocodeOrganizationId", }, }) }) + +test("ModelCache.clear removes cached entry so next fetch hits the network", async () => { + await using tmp = await tmpdir({ + init: async (dir) => { + await Bun.write( + path.join(dir, "opencode.json"), + JSON.stringify({ + $schema: "https://app.kilo.ai/config.json", + }), + ) + }, + }) + await Instance.provide({ + directory: tmp.path, + init: async () => { + await Auth.set("kilo", { + type: "oauth", + access: "token-clear-test", + refresh: "refresh-clear", + expires: Date.now() + 3600000, + accountId: "org-clear", + }) + }, + fn: async () => { + // Populate cache + captured = undefined + ModelCache.clear("kilo") + await ModelCache.fetch("kilo") + expect(captured).toBeDefined() + + // Verify cache is populated — second fetch should NOT call fetchKiloModels + captured = undefined + await ModelCache.fetch("kilo") + expect(captured).toBeUndefined() + expect(ModelCache.get("kilo")).toBeDefined() + + // Clear the cache + ModelCache.clear("kilo") + + // get() should return undefined after clear + expect(ModelCache.get("kilo")).toBeUndefined() + + // Next fetch should call fetchKiloModels again + captured = undefined + await ModelCache.fetch("kilo") + expect(captured).toBeDefined() + }, + }) +})