mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-07 06:00:44 +00:00
* [EV-001] memory-core: filter memory_search session hits by visibility - Move session visibility + listSpawnedSessionKeys to plugin-sdk; sync test hook with sessions-resolution __testing.setDepsForTest - Extract loadCombinedSessionStoreForGateway to config/sessions; re-export from gateway session-utils - Add session-transcript-hit stem resolver for builtin + QMD paths - Post-filter memory_search results before citations/recall; fail closed when requester session key missing; optional corpus=sessions - Tests: stem extraction, visibility filter smoke, existing suites green * chore: sync plugin-sdk exports for session-transcript-hit and session-visibility Run pnpm plugin-sdk:sync-exports so package.json exports match scripts/lib/plugin-sdk-entrypoints.json. Fixes contract tests and lint:plugins:plugin-sdk-subpaths-exported for memory-core imports. * fix(EV-001): cross-agent session memory hits + hoist combined store load - resolveTranscriptStemToSessionKeys: stop filtering by requester agentId so keys from other agents reach createSessionVisibilityGuard (a2a + visibility=all). - Re-export loadCombinedSessionStoreForGateway from session-transcript-hit; filterMemorySearchHitsBySessionVisibility loads the combined store once per pass. - Drop unused agentId from filter params; extend tests (Greptile/Codex review). * fix(memory_search): honor corpus=sessions before maxResults cap Pass sources into MemoryIndexManager.search so FTS/vector queries add source IN (...) before ranking and top-N slice (Codex: non-session hits could fill the window). QMD path: oversample fetch limit for single-source recall, filter by source, then diversify/clamp to the requested maxResults. Wire corpus=sessions from tools; extend MemorySearchManager opts and wrappers. * fix(memory_search): apply corpus=memory source filter like sessions Pass sources: ["memory"] into manager.search so maxResults applies only within the memory index; post-filter for defense in depth. Document corpus=memory in the tool description. * fix: scope qmd session memory search * fix: enforce memory search session visibility (#70761) (thanks @nefainl) --------- Co-authored-by: NefAI <info@nefai.nl> Co-authored-by: Ayaan Zaidi <hi@obviy.us>
44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { SessionEntry } from "../config/sessions/types.js";
|
|
import {
|
|
extractTranscriptStemFromSessionsMemoryHit,
|
|
resolveTranscriptStemToSessionKeys,
|
|
} from "./session-transcript-hit.js";
|
|
|
|
describe("extractTranscriptStemFromSessionsMemoryHit", () => {
|
|
it("strips sessions/ and .jsonl for builtin paths", () => {
|
|
expect(extractTranscriptStemFromSessionsMemoryHit("sessions/abc-uuid.jsonl")).toBe("abc-uuid");
|
|
});
|
|
|
|
it("handles plain basename jsonl", () => {
|
|
expect(extractTranscriptStemFromSessionsMemoryHit("def-topic-thread.jsonl")).toBe(
|
|
"def-topic-thread",
|
|
);
|
|
});
|
|
|
|
it("uses .md basename for QMD exports", () => {
|
|
expect(extractTranscriptStemFromSessionsMemoryHit("qmd/sessions/x/y/z.md")).toBe("z");
|
|
});
|
|
});
|
|
|
|
describe("resolveTranscriptStemToSessionKeys", () => {
|
|
const baseEntry = (overrides: Partial<SessionEntry> = {}): SessionEntry => ({
|
|
sessionId: "stem-a",
|
|
updatedAt: 1,
|
|
...overrides,
|
|
});
|
|
|
|
it("returns keys for every agent whose store entry matches the stem", () => {
|
|
const store: Record<string, SessionEntry> = {
|
|
"agent:main:s1": baseEntry({
|
|
sessionFile: "/data/sessions/stem-a.jsonl",
|
|
}),
|
|
"agent:peer:s2": baseEntry({
|
|
sessionFile: "/other/volume/stem-a.jsonl",
|
|
}),
|
|
};
|
|
const keys = resolveTranscriptStemToSessionKeys({ store, stem: "stem-a" }).toSorted();
|
|
expect(keys).toEqual(["agent:main:s1", "agent:peer:s2"]);
|
|
});
|
|
});
|