
























@@ -11,7 +11,13 @@ import {
1111} from "../plugin-state/plugin-state-store.js";
1212import { createRuntimeHealthRecordEnvelope } from "../plugin-state/runtime-health-store.js";
1313import { createEmptyPluginRegistry } from "../plugins/registry-empty.js";
14-import { resetPluginRuntimeStateForTest, setActivePluginRegistry } from "../plugins/runtime.js";
14+import {
15+pinActivePluginChannelRegistry,
16+pinActivePluginHttpRouteRegistry,
17+pinActivePluginSessionExtensionRegistry,
18+resetPluginRuntimeStateForTest,
19+setActivePluginRegistry,
20+} from "../plugins/runtime.js";
1521import { withStateDirEnv } from "../test-helpers/state-dir-env.js";
1622import { collectRuntimePluginHealthSnapshot } from "./status-plugin-health.runtime.js";
1723@@ -245,4 +251,83 @@ describe("runtime plugin health snapshot", () => {
245251]);
246252expect(resolveReadOnlyChannelPluginsForConfigMock).not.toHaveBeenCalled();
247253});
254+255+it("records only runtime status:loaded plugins as runtime-loaded", () => {
256+const registry = createEmptyPluginRegistry();
257+registry.plugins.push(
258+{ id: "runtime-ok", status: "loaded", enabled: true } as never,
259+{ id: "runtime-broken", status: "error", enabled: true } as never,
260+{ id: "runtime-off", status: "disabled", enabled: false } as never,
261+);
262+setActivePluginRegistry(registry, "runtime-loaded-ids", "default", "/tmp/ws");
263+264+expect(collectRuntimePluginHealthSnapshot().runtimeLoadedPluginIds).toEqual(["runtime-ok"]);
265+});
266+267+it("includes loaded plugins from a pinned channel registry diverged from active", () => {
268+const active = createEmptyPluginRegistry();
269+active.plugins.push({ id: "active-ok", status: "loaded", enabled: true } as never);
270+setActivePluginRegistry(active, "active", "default", "/tmp/ws");
271+272+const channel = createEmptyPluginRegistry();
273+channel.plugins.push({ id: "channel-only", status: "loaded", enabled: true } as never);
274+pinActivePluginChannelRegistry(channel);
275+276+expect(collectRuntimePluginHealthSnapshot().runtimeLoadedPluginIds).toEqual([
277+"active-ok",
278+"channel-only",
279+]);
280+});
281+282+it("includes loaded plugins from a pinned http-route registry diverged from active", () => {
283+const active = createEmptyPluginRegistry();
284+active.plugins.push({ id: "active-ok", status: "loaded", enabled: true } as never);
285+setActivePluginRegistry(active, "active", "default", "/tmp/ws");
286+287+const httpRoute = createEmptyPluginRegistry();
288+httpRoute.plugins.push({ id: "route-only", status: "loaded", enabled: true } as never);
289+pinActivePluginHttpRouteRegistry(httpRoute);
290+291+expect(collectRuntimePluginHealthSnapshot().runtimeLoadedPluginIds).toEqual([
292+"active-ok",
293+"route-only",
294+]);
295+});
296+297+it("includes loaded plugins from a pinned session-extension registry diverged from active", () => {
298+const active = createEmptyPluginRegistry();
299+active.plugins.push({ id: "active-ok", status: "loaded", enabled: true } as never);
300+setActivePluginRegistry(active, "active", "default", "/tmp/ws");
301+302+const sessionExtension = createEmptyPluginRegistry();
303+sessionExtension.plugins.push({
304+id: "session-only",
305+status: "loaded",
306+enabled: true,
307+} as never);
308+pinActivePluginSessionExtensionRegistry(sessionExtension);
309+310+expect(collectRuntimePluginHealthSnapshot().runtimeLoadedPluginIds).toEqual([
311+"active-ok",
312+"session-only",
313+]);
314+});
315+316+it("dedupes runtime-loaded ids shared across registry surfaces", () => {
317+const active = createEmptyPluginRegistry();
318+active.plugins.push({ id: "shared", status: "loaded", enabled: true } as never);
319+setActivePluginRegistry(active, "active", "default", "/tmp/ws");
320+321+const channel = createEmptyPluginRegistry();
322+channel.plugins.push(
323+{ id: "shared", status: "loaded", enabled: true } as never,
324+{ id: "channel-only", status: "loaded", enabled: true } as never,
325+);
326+pinActivePluginChannelRegistry(channel);
327+328+expect(collectRuntimePluginHealthSnapshot().runtimeLoadedPluginIds).toEqual([
329+"channel-only",
330+"shared",
331+]);
332+});
248333});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。