
























@@ -384,6 +384,129 @@ describe("memory plugin e2e", () => {
384384}
385385});
386386387+test("uses live runtime config to skip auto-recall after registration", async () => {
388+const embeddingsCreate = vi.fn(async () => ({
389+data: [{ embedding: [0.1, 0.2, 0.3] }],
390+}));
391+const ensureGlobalUndiciEnvProxyDispatcher = vi.fn();
392+const loadLanceDbModule = vi.fn(async () => ({
393+connect: vi.fn(async () => ({
394+tableNames: vi.fn(async () => ["memories"]),
395+openTable: vi.fn(async () => ({
396+vectorSearch: vi.fn(() => ({ limit: vi.fn(() => ({ toArray: vi.fn(async () => []) })) })),
397+countRows: vi.fn(async () => 0),
398+add: vi.fn(async () => undefined),
399+delete: vi.fn(async () => undefined),
400+})),
401+})),
402+}));
403+let configFile: Record<string, unknown> = {
404+plugins: {
405+entries: {
406+"memory-lancedb": {
407+config: {
408+embedding: {
409+apiKey: OPENAI_API_KEY,
410+model: "text-embedding-3-small",
411+},
412+dbPath: getDbPath(),
413+autoCapture: false,
414+autoRecall: true,
415+},
416+},
417+},
418+},
419+};
420+421+vi.resetModules();
422+vi.doMock("openclaw/plugin-sdk/runtime-env", () => ({
423+ ensureGlobalUndiciEnvProxyDispatcher,
424+}));
425+vi.doMock("openai", () => ({
426+default: class MockOpenAI {
427+embeddings = { create: embeddingsCreate };
428+},
429+}));
430+vi.doMock("./lancedb-runtime.js", () => ({
431+ loadLanceDbModule,
432+}));
433+434+try {
435+const { default: dynamicMemoryPlugin } = await import("./index.js");
436+const on = vi.fn();
437+const mockApi = {
438+id: "memory-lancedb",
439+name: "Memory (LanceDB)",
440+source: "test",
441+config: {},
442+pluginConfig: {
443+embedding: {
444+apiKey: OPENAI_API_KEY,
445+model: "text-embedding-3-small",
446+},
447+dbPath: getDbPath(),
448+autoCapture: false,
449+autoRecall: true,
450+},
451+runtime: {
452+config: {
453+loadConfig: () => configFile,
454+},
455+},
456+logger: {
457+info: vi.fn(),
458+warn: vi.fn(),
459+error: vi.fn(),
460+debug: vi.fn(),
461+},
462+registerTool: vi.fn(),
463+registerCli: vi.fn(),
464+registerService: vi.fn(),
465+ on,
466+resolvePath: (p: string) => p,
467+};
468+469+dynamicMemoryPlugin.register(mockApi as any);
470+471+configFile = {
472+plugins: {
473+entries: {
474+"memory-lancedb": {
475+config: {
476+embedding: {
477+apiKey: OPENAI_API_KEY,
478+model: "text-embedding-3-small",
479+},
480+dbPath: getDbPath(),
481+autoCapture: false,
482+autoRecall: false,
483+},
484+},
485+},
486+},
487+};
488+489+const beforePromptBuild = on.mock.calls.find(
490+([hookName]) => hookName === "before_prompt_build",
491+)?.[1];
492+expect(beforePromptBuild).toBeTypeOf("function");
493+494+const result = await beforePromptBuild?.(
495+{ prompt: "what editor should i use?", messages: [] },
496+{},
497+);
498+499+expect(result).toBeUndefined();
500+expect(embeddingsCreate).not.toHaveBeenCalled();
501+expect(loadLanceDbModule).not.toHaveBeenCalled();
502+} finally {
503+vi.doUnmock("openclaw/plugin-sdk/runtime-env");
504+vi.doUnmock("openai");
505+vi.doUnmock("./lancedb-runtime.js");
506+vi.resetModules();
507+}
508+});
509+387510test("runs auto-capture through the registered agent_end hook", async () => {
388511const embeddingsCreate = vi.fn(async () => ({
389512data: [{ embedding: [0.1, 0.2, 0.3] }],
@@ -492,6 +615,131 @@ describe("memory plugin e2e", () => {
492615}
493616});
494617618+test("uses live runtime config to skip auto-capture after registration", async () => {
619+const embeddingsCreate = vi.fn(async () => ({
620+data: [{ embedding: [0.1, 0.2, 0.3] }],
621+}));
622+const ensureGlobalUndiciEnvProxyDispatcher = vi.fn();
623+const add = vi.fn(async () => undefined);
624+const loadLanceDbModule = vi.fn(async () => ({
625+connect: vi.fn(async () => ({
626+tableNames: vi.fn(async () => ["memories"]),
627+openTable: vi.fn(async () => ({
628+vectorSearch: vi.fn(() => ({ limit: vi.fn(() => ({ toArray: vi.fn(async () => []) })) })),
629+countRows: vi.fn(async () => 0),
630+ add,
631+delete: vi.fn(async () => undefined),
632+})),
633+})),
634+}));
635+let configFile: Record<string, unknown> = {
636+plugins: {
637+entries: {
638+"memory-lancedb": {
639+config: {
640+embedding: {
641+apiKey: OPENAI_API_KEY,
642+model: "text-embedding-3-small",
643+},
644+dbPath: getDbPath(),
645+autoCapture: true,
646+autoRecall: false,
647+},
648+},
649+},
650+},
651+};
652+653+vi.resetModules();
654+vi.doMock("openclaw/plugin-sdk/runtime-env", () => ({
655+ ensureGlobalUndiciEnvProxyDispatcher,
656+}));
657+vi.doMock("openai", () => ({
658+default: class MockOpenAI {
659+embeddings = { create: embeddingsCreate };
660+},
661+}));
662+vi.doMock("./lancedb-runtime.js", () => ({
663+ loadLanceDbModule,
664+}));
665+666+try {
667+const { default: dynamicMemoryPlugin } = await import("./index.js");
668+const on = vi.fn();
669+const mockApi = {
670+id: "memory-lancedb",
671+name: "Memory (LanceDB)",
672+source: "test",
673+config: {},
674+pluginConfig: {
675+embedding: {
676+apiKey: OPENAI_API_KEY,
677+model: "text-embedding-3-small",
678+},
679+dbPath: getDbPath(),
680+autoCapture: true,
681+autoRecall: false,
682+},
683+runtime: {
684+config: {
685+loadConfig: () => configFile,
686+},
687+},
688+logger: {
689+info: vi.fn(),
690+warn: vi.fn(),
691+error: vi.fn(),
692+debug: vi.fn(),
693+},
694+registerTool: vi.fn(),
695+registerCli: vi.fn(),
696+registerService: vi.fn(),
697+ on,
698+resolvePath: (p: string) => p,
699+};
700+701+dynamicMemoryPlugin.register(mockApi as any);
702+703+configFile = {
704+plugins: {
705+entries: {
706+"memory-lancedb": {
707+config: {
708+embedding: {
709+apiKey: OPENAI_API_KEY,
710+model: "text-embedding-3-small",
711+},
712+dbPath: getDbPath(),
713+autoCapture: false,
714+autoRecall: false,
715+},
716+},
717+},
718+},
719+};
720+721+const agentEnd = on.mock.calls.find(([hookName]) => hookName === "agent_end")?.[1];
722+expect(agentEnd).toBeTypeOf("function");
723+724+await agentEnd?.(
725+{
726+success: true,
727+messages: [{ role: "user", content: "I prefer Helix for editing code every day." }],
728+},
729+{},
730+);
731+732+expect(embeddingsCreate).not.toHaveBeenCalled();
733+expect(loadLanceDbModule).not.toHaveBeenCalled();
734+expect(add).not.toHaveBeenCalled();
735+} finally {
736+vi.doUnmock("openclaw/plugin-sdk/runtime-env");
737+vi.doUnmock("openai");
738+vi.doUnmock("./lancedb-runtime.js");
739+vi.resetModules();
740+}
741+});
742+495743test("passes configured dimensions to OpenAI embeddings API", async () => {
496744const embeddingsCreate = vi.fn(async () => ({
497745data: [{ embedding: [0.1, 0.2, 0.3] }],
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。