
























@@ -5182,6 +5182,94 @@ describe("QmdMemoryManager", () => {
51825182await manager.close();
51835183});
518451845185+it("uses the configured qmd timeout for status probes", async () => {
5186+vi.useFakeTimers();
5187+cfg = {
5188+ ...cfg,
5189+memory: {
5190+backend: "qmd",
5191+qmd: {
5192+includeDefaultMemory: false,
5193+searchMode: "query",
5194+limits: { timeoutMs: 6000 },
5195+update: { interval: "0s", debounceMs: 60_000, onBoot: false },
5196+paths: [{ path: workspaceDir, pattern: "**/*.md", name: "workspace" }],
5197+},
5198+},
5199+} as OpenClawConfig;
5200+5201+let statusKill: Mock | null = null;
5202+spawnMock.mockImplementation((_cmd: string, args: string[]) => {
5203+if (args[0] === "status") {
5204+const child = createMockChild({ autoClose: false });
5205+statusKill = vi.fn();
5206+child.kill = statusKill;
5207+return child;
5208+}
5209+return createMockChild();
5210+});
5211+5212+const { manager } = await createManager();
5213+5214+const probe = manager.probeVectorAvailability();
5215+await vi.advanceTimersByTimeAsync(5000);
5216+expect(statusKill).not.toHaveBeenCalled();
5217+await vi.advanceTimersByTimeAsync(1000);
5218+await expect(probe).resolves.toBe(false);
5219+expect(manager.status().vector).toEqual({
5220+enabled: true,
5221+available: false,
5222+semanticAvailable: false,
5223+loadError: expect.stringContaining("timed out after 6000ms"),
5224+});
5225+await manager.close();
5226+});
5227+5228+it("exports valid session transcripts whose IDs contain checkpoint words", async () => {
5229+cfg = {
5230+ ...cfg,
5231+memory: {
5232+backend: "qmd",
5233+qmd: {
5234+includeDefaultMemory: false,
5235+sessions: { enabled: true },
5236+update: {
5237+interval: "0s",
5238+debounceMs: 0,
5239+onBoot: true,
5240+waitForBootSync: true,
5241+},
5242+paths: [{ path: workspaceDir, pattern: "**/*.md", name: "workspace" }],
5243+},
5244+},
5245+} as OpenClawConfig;
5246+5247+const sessionsDir = path.join(stateDir, "agents", agentId, "sessions");
5248+await fs.mkdir(sessionsDir, { recursive: true });
5249+await fs.writeFile(
5250+path.join(sessionsDir, "live-session.jsonl"),
5251+`${JSON.stringify({ type: "message", message: { role: "user", content: "live" } })}\n`,
5252+);
5253+await fs.writeFile(
5254+path.join(sessionsDir, "team.checkpoint.notes.jsonl"),
5255+`${JSON.stringify({ type: "message", message: { role: "user", content: "notes" } })}\n`,
5256+);
5257+await fs.writeFile(
5258+path.join(sessionsDir, "live-session.checkpoint.11111111-1111-4111-8111-111111111111.jsonl"),
5259+`${JSON.stringify({ type: "message", message: { role: "user", content: "checkpoint" } })}\n`,
5260+);
5261+5262+const { manager } = await createManager({ mode: "full" });
5263+const sessionExportDir = path.join(stateDir, "agents", agentId, "qmd", "sessions");
5264+const exported = (await fs.readdir(sessionExportDir)).toSorted();
5265+5266+expect(exported).toEqual(["live-session.md", "team.checkpoint.notes.md"]);
5267+await expect(
5268+fs.readFile(path.join(sessionExportDir, "team.checkpoint.notes.md"), "utf-8"),
5269+).resolves.toContain("notes");
5270+await manager.close();
5271+});
5272+51855273it("reports vector availability as unavailable when qmd status shows zero vectors", async () => {
51865274spawnMock.mockImplementation((_cmd: string, args: string[]) => {
51875275if (args[0] === "status") {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。