fix: keep internal completion wakes out of chat memory

This commit is contained in:
Peter Steinberger
2026-04-26 04:01:05 +01:00
parent d0d93d0fde
commit 6df120fb39
7 changed files with 92 additions and 4 deletions

View File

@@ -185,4 +185,32 @@ describe("buildSessionEntry", () => {
expect(entry).not.toBeNull();
expect(entry!.content).toBe("User: Actual user text");
});
it("skips inter-session user messages", async () => {
const jsonlLines = [
JSON.stringify({
type: "message",
message: {
role: "user",
content: "A background task completed. Internal relay text.",
provenance: { kind: "inter_session", sourceTool: "subagent_announce" },
},
}),
JSON.stringify({
type: "message",
message: { role: "assistant", content: "User-facing summary." },
}),
JSON.stringify({
type: "message",
message: { role: "user", content: "Actual user follow-up." },
}),
];
const filePath = path.join(tmpDir, "inter-session-session.jsonl");
fsSync.writeFileSync(filePath, jsonlLines.join("\n"));
const entry = await buildSessionEntry(filePath);
expect(entry).not.toBeNull();
expect(entry!.content).toBe("Assistant: User-facing summary.\nUser: Actual user follow-up.");
expect(entry!.lineMap).toEqual([2, 3]);
});
});

View File

@@ -8,6 +8,7 @@ import {
} from "../../../../src/config/sessions/artifacts.js";
import { resolveSessionTranscriptsDirForAgent } from "../../../../src/config/sessions/paths.js";
import { redactSensitiveText } from "../../../../src/logging/redact.js";
import { hasInterSessionUserProvenance } from "../../../../src/sessions/input-provenance.js";
import { hashText } from "./hash.js";
export type SessionFileEntry = {
@@ -170,7 +171,7 @@ export async function buildSessionEntry(absPath: string): Promise<SessionFileEnt
continue;
}
const message = (record as { message?: unknown }).message as
| { role?: unknown; content?: unknown }
| { role?: unknown; content?: unknown; provenance?: unknown }
| undefined;
if (!message || typeof message.role !== "string") {
continue;
@@ -178,6 +179,9 @@ export async function buildSessionEntry(absPath: string): Promise<SessionFileEnt
if (message.role !== "user" && message.role !== "assistant") {
continue;
}
if (message.role === "user" && hasInterSessionUserProvenance(message)) {
continue;
}
const text = extractSessionText(message.content, message.role);
if (!text) {
continue;