




















@@ -4,6 +4,11 @@ const resolveRuntimePluginRegistryMock =
44vi.fn<typeof import("./loader.js").resolveRuntimePluginRegistry>();
55const getLoadedRuntimePluginRegistryMock =
66vi.fn<typeof import("./active-runtime-registry.js").getLoadedRuntimePluginRegistry>();
7+const ensureStandaloneRuntimePluginRegistryLoadedMock = vi.hoisted(() =>
8+vi.fn<
9+typeof import("./runtime/standalone-runtime-registry-loader.js").ensureStandaloneRuntimePluginRegistryLoaded
10+>(),
11+);
712const applyPluginAutoEnableMock =
813vi.fn<typeof import("../config/plugin-auto-enable.js").applyPluginAutoEnable>();
914const getMemoryRuntimeMock = vi.fn<typeof import("./memory-state.js").getMemoryRuntime>();
@@ -30,6 +35,10 @@ vi.mock("./active-runtime-registry.js", () => ({
3035getLoadedRuntimePluginRegistry: getLoadedRuntimePluginRegistryMock,
3136}));
323738+vi.mock("./runtime/standalone-runtime-registry-loader.js", () => ({
39+ensureStandaloneRuntimePluginRegistryLoaded: ensureStandaloneRuntimePluginRegistryLoadedMock,
40+}));
41+3342vi.mock("./memory-state.js", () => ({
3443getMemoryRuntime: () => getMemoryRuntimeMock(),
3544}));
@@ -61,12 +70,25 @@ function createMemoryRuntimeFixture() {
6170};
6271}
637264-function expectMemoryRuntimeLoaded(rawConfig: unknown, autoEnabledConfig: unknown) {
73+function expectMemoryRuntimeLoaded(
74+rawConfig: unknown,
75+autoEnabledConfig: unknown,
76+pluginIds: readonly string[] = ["memory-core"],
77+) {
6578void rawConfig;
6679void autoEnabledConfig;
6780expect(getLoadedRuntimePluginRegistryMock).toHaveBeenCalledWith(
6881expect.objectContaining({
69-requiredPluginIds: ["memory-core"],
82+requiredPluginIds: pluginIds,
83+}),
84+);
85+expect(ensureStandaloneRuntimePluginRegistryLoadedMock).toHaveBeenCalledWith(
86+expect.objectContaining({
87+requiredPluginIds: pluginIds,
88+loadOptions: expect.objectContaining({
89+onlyPluginIds: pluginIds,
90+workspaceDir: "/resolved-workspace",
91+}),
7092}),
7193);
7294}
@@ -84,14 +106,18 @@ function setAutoEnabledMemoryRuntime() {
84106changes: [],
85107autoEnabledReasons: {},
86108});
87-getMemoryRuntimeMock.mockReturnValueOnce(undefined).mockReturnValue(runtime);
109+getMemoryRuntimeMock
110+.mockReturnValueOnce(undefined)
111+.mockReturnValueOnce(undefined)
112+.mockReturnValue(runtime);
88113return { rawConfig, autoEnabledConfig, runtime };
89114}
9011591116function expectNoMemoryRuntimeBootstrap() {
92117expect(applyPluginAutoEnableMock).not.toHaveBeenCalled();
93118expect(resolveRuntimePluginRegistryMock).not.toHaveBeenCalled();
94119expect(getLoadedRuntimePluginRegistryMock).not.toHaveBeenCalled();
120+expect(ensureStandaloneRuntimePluginRegistryLoadedMock).not.toHaveBeenCalled();
95121}
9612297123async function expectAutoEnabledMemoryRuntimeCase(params: {
@@ -130,6 +156,7 @@ describe("memory runtime auto-enable loading", () => {
130156} = await import("./memory-runtime.js"));
131157resolveRuntimePluginRegistryMock.mockReset();
132158getLoadedRuntimePluginRegistryMock.mockReset();
159+ensureStandaloneRuntimePluginRegistryLoadedMock.mockReset();
133160applyPluginAutoEnableMock.mockReset();
134161getMemoryRuntimeMock.mockReset();
135162resolveAgentWorkspaceDirMock.mockReset();
@@ -179,18 +206,17 @@ describe("memory runtime auto-enable loading", () => {
179206changes: [],
180207autoEnabledReasons: {},
181208});
182-getMemoryRuntimeMock.mockReturnValueOnce(undefined).mockReturnValue(runtime);
209+getMemoryRuntimeMock
210+.mockReturnValueOnce(undefined)
211+.mockReturnValueOnce(undefined)
212+.mockReturnValue(runtime);
183213184214await getActiveMemorySearchManager({
185215cfg: rawConfig as never,
186216agentId: "main",
187217});
188218189-expect(getLoadedRuntimePluginRegistryMock).toHaveBeenCalledWith(
190-expect.objectContaining({
191-requiredPluginIds: ["memory-lancedb"],
192-}),
193-);
219+expectMemoryRuntimeLoaded(rawConfig, rawConfig, ["memory-lancedb"]);
194220});
195221196222it("does not fall back to broad plugin loading when the memory slot is disabled", async () => {
@@ -218,6 +244,80 @@ describe("memory runtime auto-enable loading", () => {
218244expect(applyPluginAutoEnableMock).not.toHaveBeenCalled();
219245expect(resolveRuntimePluginRegistryMock).not.toHaveBeenCalled();
220246expect(getLoadedRuntimePluginRegistryMock).not.toHaveBeenCalled();
247+expect(ensureStandaloneRuntimePluginRegistryLoadedMock).not.toHaveBeenCalled();
248+});
249+250+it("does not standalone-load the memory plugin when plugins are globally disabled", async () => {
251+const rawConfig = {
252+plugins: {
253+enabled: false,
254+},
255+};
256+getMemoryRuntimeMock.mockReturnValue(undefined);
257+258+await expect(
259+getActiveMemorySearchManager({
260+cfg: rawConfig as never,
261+agentId: "main",
262+}),
263+).resolves.toEqual({ manager: null, error: "memory plugin unavailable" });
264+265+expectNoMemoryRuntimeBootstrap();
266+});
267+268+it.each([
269+{
270+name: "denied",
271+plugins: {
272+deny: ["memory-core"],
273+slots: {
274+memory: "memory-core",
275+},
276+},
277+},
278+{
279+name: "entry-disabled",
280+plugins: {
281+entries: {
282+"memory-core": { enabled: false },
283+},
284+slots: {
285+memory: "memory-core",
286+},
287+},
288+},
289+] as const)("does not standalone-load a $name memory slot plugin", async ({ plugins }) => {
290+getMemoryRuntimeMock.mockReturnValue(undefined);
291+292+await expect(
293+getActiveMemorySearchManager({
294+cfg: { plugins } as never,
295+agentId: "main",
296+}),
297+).resolves.toEqual({ manager: null, error: "memory plugin unavailable" });
298+299+expectNoMemoryRuntimeBootstrap();
300+});
301+302+it("does not standalone-load plugins when the memory runtime is already registered", () => {
303+const rawConfig = {
304+plugins: {
305+slots: {
306+memory: "memory-core",
307+},
308+},
309+};
310+const runtime = createMemoryRuntimeFixture();
311+getLoadedRuntimePluginRegistryMock.mockReturnValue({} as never);
312+getMemoryRuntimeMock.mockReturnValueOnce(undefined).mockReturnValue(runtime);
313+314+resolveActiveMemoryBackendConfig({
315+cfg: rawConfig as never,
316+agentId: "main",
317+});
318+319+expect(getLoadedRuntimePluginRegistryMock).toHaveBeenCalled();
320+expect(ensureStandaloneRuntimePluginRegistryLoadedMock).not.toHaveBeenCalled();
221321});
222322223323it.each([
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。