diff --git a/extensions/llama-cpp/src/inference-provider.test.ts b/extensions/llama-cpp/src/inference-provider.test.ts index 300dad2e1f62..fa29691c1e42 100644 --- a/extensions/llama-cpp/src/inference-provider.test.ts +++ b/extensions/llama-cpp/src/inference-provider.test.ts @@ -937,7 +937,7 @@ describe("llama.cpp inference provider", () => { expect(mocks.llamaDispose).toHaveBeenCalledOnce(); }); - it("keeps a failed best-effort cleanup as one disposal attempt", async () => { + it("keeps a failed cleanup terminal", async () => { await collectTestEvents(); mocks.contextDispose.mockRejectedValueOnce(new Error("context cleanup failed")); diff --git a/extensions/llama-cpp/src/inference-provider.ts b/extensions/llama-cpp/src/inference-provider.ts index d719782ff7f2..b8e85ede0688 100644 --- a/extensions/llama-cpp/src/inference-provider.ts +++ b/extensions/llama-cpp/src/inference-provider.ts @@ -307,8 +307,9 @@ function disposeLlamaCppInferenceRuntime(state: LlamaCppInferenceRuntimeState): return state.disposePromise; } state.lifecycle = "closing"; - // Plugin services stop once, and node-llama-cpp disposers mark themselves - // disposed before awaiting cleanup. The first disposal attempt is authoritative. + // node-llama-cpp disposers are one-shot and child cleanup releases the + // parent's disposal guard. Do not force parent cleanup after a child rejects: + // the retained guard can make that parent disposer wait forever. state.disposePromise = serialize(state, async () => { await disposeLoadedModel(state); if (state.llamaInstance) {