refactor: clarify sqlite transcript hit rows

This commit is contained in:
Peter Steinberger
2026-05-09 20:07:31 +01:00
parent 7b99b1a199
commit 01f165fb31
4 changed files with 10 additions and 10 deletions

View File

@@ -47,7 +47,7 @@ export async function filterMemorySearchHitsBySessionVisibility(params: {
continue;
}
const keys = resolveTranscriptStemToSessionKeys({
store: combinedSessionEntries,
entries: combinedSessionEntries,
stem: identity.stem,
});
if (keys.length === 0) {

View File

@@ -1252,7 +1252,7 @@ async function createSessionMemoryPathVisibilityChecker(params: {
return false;
}
const keys = resolveTranscriptStemToSessionKeys({
store: combinedSessionEntries,
entries: combinedSessionEntries,
stem,
});
return keys.some((key) => guard.check(key).allowed);

View File

@@ -38,17 +38,17 @@ describe("resolveTranscriptStemToSessionKeys", () => {
...overrides,
});
it("returns keys for every agent whose store entry matches the stem", () => {
const store: Record<string, SessionEntry> = {
it("returns keys for every agent whose session row matches the stem", () => {
const entries: Record<string, SessionEntry> = {
"agent:main:s1": baseEntry({}),
"agent:peer:s2": baseEntry({}),
};
const keys = resolveTranscriptStemToSessionKeys({ store, stem: "stem-a" }).toSorted();
const keys = resolveTranscriptStemToSessionKeys({ entries, stem: "stem-a" }).toSorted();
expect(keys).toEqual(["agent:main:s1", "agent:peer:s2"]);
});
it("does not synthesize keys when the live store has no matching transcript", () => {
const keys = resolveTranscriptStemToSessionKeys({ store: {}, stem: "deleted-stem" });
it("does not synthesize keys when live rows have no matching transcript", () => {
const keys = resolveTranscriptStemToSessionKeys({ entries: {}, stem: "deleted-stem" });
expect(keys).toEqual([]);
});

View File

@@ -26,6 +26,7 @@ function parseSessionsPath(hitPath: string): { base: string; ownerAgentId?: stri
/**
* Derive transcript stem `S` from a memory search hit path for `source === "sessions"`.
* Builtin index uses `sessions/<agent>/<session>`; QMD exports use `<stem>.md`.
* Legacy JSONL source paths are ignored; active transcript identity is SQLite.
*/
export function extractTranscriptStemFromSessionsMemoryHit(hitPath: string): string | null {
return extractTranscriptIdentityFromSessionsMemoryHit(hitPath)?.stem ?? null;
@@ -54,13 +55,12 @@ export function extractTranscriptIdentityFromSessionsMemoryHit(
* `createSessionVisibilityGuard`), including cross-agent cases.
*/
export function resolveTranscriptStemToSessionKeys(params: {
store: Record<string, SessionEntry>;
entries: Record<string, SessionEntry>;
stem: string;
}): string[] {
const { store } = params;
const matches: string[] = [];
for (const [sessionKey, entry] of Object.entries(store)) {
for (const [sessionKey, entry] of Object.entries(params.entries)) {
if (entry.sessionId === params.stem) {
matches.push(sessionKey);
}