



















@@ -501,6 +501,74 @@ describe("readSessionMessages", () => {
501501expect(typeof marker.timestamp).toBe("number");
502502});
503503504+test("reads only the active branch when transcript rewrites abandon older entries", () => {
505+const sessionId = "test-session-active-branch";
506+const sessionFile = path.join(tmpDir, `${sessionId}.jsonl`);
507+const lines = [
508+{
509+type: "session",
510+version: 3,
511+id: sessionId,
512+cwd: tmpDir,
513+timestamp: "2026-04-27T00:00:00.000Z",
514+},
515+{
516+type: "message",
517+id: "original",
518+parentId: null,
519+timestamp: "2026-04-27T00:00:01.000Z",
520+message: {
521+role: "user",
522+content: "Sender (untrusted metadata): webchat\n\noriginal wrapped prompt",
523+timestamp: 1,
524+},
525+},
526+{
527+type: "message",
528+id: "clean",
529+parentId: null,
530+timestamp: "2026-04-27T00:00:02.000Z",
531+message: { role: "user", content: "clean prompt", timestamp: 2 },
532+},
533+{
534+type: "message",
535+id: "answer",
536+parentId: "clean",
537+timestamp: "2026-04-27T00:00:03.000Z",
538+message: {
539+role: "assistant",
540+content: [{ type: "text", text: "clean answer" }],
541+api: "chat",
542+provider: "openclaw",
543+model: "test",
544+usage: {},
545+stopReason: "stop",
546+timestamp: 3,
547+},
548+},
549+];
550+fs.writeFileSync(sessionFile, lines.map((line) => JSON.stringify(line)).join("\n"), "utf-8");
551+const rawTranscript = fs.readFileSync(sessionFile, "utf-8");
552+expect(rawTranscript).toContain("original wrapped prompt");
553+expect(rawTranscript).toContain("clean prompt");
554+555+const out = readSessionMessages(sessionId, storePath, sessionFile);
556+expect(out).toHaveLength(2);
557+expect(out).toEqual([
558+expect.objectContaining({
559+role: "user",
560+content: "clean prompt",
561+__openclaw: expect.objectContaining({ seq: 1 }),
562+}),
563+expect.objectContaining({
564+role: "assistant",
565+content: [{ type: "text", text: "clean answer" }],
566+__openclaw: expect.objectContaining({ seq: 2 }),
567+}),
568+]);
569+expect(JSON.stringify(out)).not.toContain("original wrapped prompt");
570+});
571+504572test.each([
505573{
506574sessionId: "cross-agent-default-root",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。