import { describe, expect, it } from "vitest"; import { appendSessionEntryStructure, packSessionEntryStructure, readSessionEntryStructure, SESSION_ENTRY_STRUCTURE_RECORD_BYTES, type SessionEntryStructure, } from "../src/core/session-entry-structure.js"; function record(overrides: Partial = {}): SessionEntryStructure { return { id: "24ba855c", parentId: null, type: "message", role: "user", timestampMs: 1_769_000_000_123, offset: 100, length: 250, ...overrides, }; } describe("packed session entry structure", () => { it("round-trips every field", () => { const records = [ record(), record({ id: "01a09d7f", parentId: "24ba855c", type: "custom_message", role: "toolResult", timestampMs: null, offset: 351, length: 1_100_000, }), record({ id: "ffffffff", parentId: "01a09d7f", type: "compaction", role: null, timestampMs: 1.5 }), ]; const blob = packSessionEntryStructure(records); expect(blob).toBeDefined(); expect(blob!.length).toBe(8 + records.length * SESSION_ENTRY_STRUCTURE_RECORD_BYTES); expect(readSessionEntryStructure(blob)).toEqual(records); }); it("keeps an unknown role but refuses an unknown entry type", () => { const packed = packSessionEntryStructure([record({ role: "future-role" })]); expect(readSessionEntryStructure(packed)[0]!.role).toBe("other"); expect(packSessionEntryStructure([record({ type: "future-type" })])).toBeUndefined(); }); it("refuses ids that are not 16 hex characters", () => { expect(packSessionEntryStructure([record({ id: "not-a-hex-id" })])).toBeUndefined(); expect(packSessionEntryStructure([record({ parentId: "01a09d7f-8494" })])).toBeUndefined(); expect(packSessionEntryStructure([record({ parentId: "24ba855c" })])).toBeDefined(); }); it("appends records without rewriting the earlier ones", () => { const first = packSessionEntryStructure([record()])!; const appended = appendSessionEntryStructure(first, 351, [record({ id: "aaaaaaaa", offset: 351 })])!; expect(readSessionEntryStructure(appended).map((entry) => entry.id)).toEqual(["24ba855c", "aaaaaaaa"]); expect( readSessionEntryStructure(appendSessionEntryStructure(first, 0, [record({ id: "bbbbbbbb" })])!).map( (e) => e.id, ), ).toEqual(["bbbbbbbb"]); expect(appendSessionEntryStructure(undefined, 0, [record({ id: "no" })])).toBeUndefined(); }); it("reads nothing from a truncated or unknown blob", () => { expect(readSessionEntryStructure(null)).toEqual([]); expect(readSessionEntryStructure(Buffer.alloc(4))).toEqual([]); const blob = packSessionEntryStructure([record(), record({ id: "aaaaaaaa" })])!; expect(readSessionEntryStructure(blob.subarray(0, blob.length - 1))).toHaveLength(1); const future = Buffer.from(blob); future[0] = 99; expect(readSessionEntryStructure(future)).toEqual([]); }); });