38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import fs from "node:fs";
|
|
import { describe, expect, it } from "vitest";
|
|
import { appendInjectedAssistantMessageToTranscript } from "./chat-transcript-inject.js";
|
|
import { createTranscriptFixtureSync } from "./chat.test-helpers.js";
|
|
|
|
// Guardrail: Ensure gateway "injected" assistant transcript messages are appended via SessionManager,
|
|
// so they are attached to the current leaf with a `parentId` and do not sever compaction history.
|
|
describe("gateway chat.inject transcript writes", () => {
|
|
it("appends a Pi session entry that includes parentId", async () => {
|
|
const { dir, transcriptPath } = createTranscriptFixtureSync({
|
|
prefix: "openclaw-chat-inject-",
|
|
sessionId: "sess-1",
|
|
});
|
|
|
|
try {
|
|
const appended = appendInjectedAssistantMessageToTranscript({
|
|
transcriptPath,
|
|
message: "hello",
|
|
});
|
|
expect(appended.ok).toBe(true);
|
|
expect(appended.messageId).toBeTruthy();
|
|
|
|
const lines = fs.readFileSync(transcriptPath, "utf-8").split(/\r?\n/).filter(Boolean);
|
|
expect(lines.length).toBeGreaterThanOrEqual(2);
|
|
|
|
const last = JSON.parse(lines.at(-1) as string) as Record<string, unknown>;
|
|
expect(last.type).toBe("message");
|
|
|
|
// The regression we saw: raw jsonl appends omitted this field entirely.
|
|
expect(Object.prototype.hasOwnProperty.call(last, "parentId")).toBe(true);
|
|
expect(last).toHaveProperty("id");
|
|
expect(last).toHaveProperty("message");
|
|
} finally {
|
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
});
|