openclaw/src/gateway/server-methods/chat.inject.parentid.test.ts
2026-02-22 14:44:19 +00:00

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 });
}
});
});