























@@ -359,4 +359,127 @@ describe("filterMemorySearchHitsBySessionVisibility", () => {
359359360360expect(filtered).toStrictEqual([]);
361361});
362+363+it("keeps same-agent QMD-normalized archived reset .md hits when the store has a matching entry", async () => {
364+combinedSessionStore = {
365+"agent:main:abc-uuid": {
366+sessionId: "abc-uuid",
367+updatedAt: 1,
368+sessionFile: "/tmp/sessions/abc-uuid.jsonl",
369+},
370+};
371+const hit: MemorySearchResult = {
372+path: "qmd/sessions-main/abc-uuid-jsonl-reset-2026-02-16t22-26-33-000z.md",
373+source: "sessions",
374+score: 1,
375+snippet: "x",
376+startLine: 1,
377+endLine: 2,
378+};
379+const cfg = asOpenClawConfig({
380+tools: {
381+sessions: { visibility: "agent" },
382+},
383+});
384+385+const filtered = await filterMemorySearchHitsBySessionVisibility({
386+ cfg,
387+requesterSessionKey: "agent:main:main",
388+sandboxed: false,
389+hits: [hit],
390+});
391+392+expect(filtered).toEqual([hit]);
393+});
394+395+it("keeps QMD .md hits whose live session id looks like an archive name", async () => {
396+const sessionId = "foo.jsonl.deleted.2026-02-16T22-27-33.000Z";
397+combinedSessionStore = {
398+"agent:main:archive-looking": {
399+ sessionId,
400+updatedAt: 1,
401+sessionFile: `/tmp/sessions/${sessionId}.jsonl`,
402+},
403+};
404+const hit: MemorySearchResult = {
405+path: `qmd/sessions-main/${sessionId}.md`,
406+source: "sessions",
407+score: 1,
408+snippet: "x",
409+startLine: 1,
410+endLine: 2,
411+};
412+const cfg = asOpenClawConfig({
413+tools: {
414+sessions: { visibility: "self" },
415+},
416+});
417+418+const filtered = await filterMemorySearchHitsBySessionVisibility({
419+ cfg,
420+requesterSessionKey: "agent:main:archive-looking",
421+sandboxed: false,
422+hits: [hit],
423+});
424+425+expect(filtered).toEqual([hit]);
426+});
427+428+it("does not authorize QMD archived .md hits through lossy slug fallback", async () => {
429+combinedSessionStore = {
430+"agent:main:foo_bar": {
431+sessionId: "foo_bar",
432+updatedAt: 1,
433+sessionFile: "/tmp/sessions/foo_bar.jsonl",
434+},
435+};
436+const hit: MemorySearchResult = {
437+path: "qmd/sessions-main/foo-bar-jsonl-deleted-2026-02-16t22-26-33-000z.md",
438+source: "sessions",
439+score: 1,
440+snippet: "x",
441+startLine: 1,
442+endLine: 2,
443+};
444+const cfg = asOpenClawConfig({
445+tools: {
446+sessions: { visibility: "self" },
447+},
448+});
449+450+const filtered = await filterMemorySearchHitsBySessionVisibility({
451+ cfg,
452+requesterSessionKey: "agent:main:foo_bar",
453+sandboxed: false,
454+hits: [hit],
455+});
456+457+expect(filtered).toStrictEqual([]);
458+});
459+460+it("keeps same-agent QMD archived deleted .md hits when no store entry remains", async () => {
461+combinedSessionStore = {};
462+const hit: MemorySearchResult = {
463+path: "qmd/sessions-main/abc-uuid-jsonl-deleted-2026-02-16t22-26-33-000z.md",
464+source: "sessions",
465+score: 1,
466+snippet: "x",
467+startLine: 1,
468+endLine: 2,
469+};
470+const cfg = asOpenClawConfig({
471+tools: {
472+sessions: { visibility: "all" },
473+},
474+});
475+476+const filtered = await filterMemorySearchHitsBySessionVisibility({
477+ cfg,
478+requesterSessionKey: "agent:main:main",
479+sandboxed: false,
480+hits: [hit],
481+});
482+483+expect(filtered).toEqual([hit]);
484+});
362485});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。