feat(session): default JSONL writes to packed rows

This commit is contained in:
Tianyi Cui
2026-07-26 23:44:52 +08:00
parent cad2af4741
commit 4ff496c65c
47 changed files with 521 additions and 251 deletions
+52
View File
@@ -0,0 +1,52 @@
import { describe, expect, it } from 'vitest'
import { decodeStorageRecord, type SessionEvent } from '@deepseek-ai/dsh-session'
import { canonicalSessionFixture } from './session-fixture-layout.ts'
const HEADER = ' {"type":"session","version":0,"id":"fixture","createdAt":1,"delegationDepth":0} '
function chunkRun(): SessionEvent[] {
return Array.from({ length: 4 }, (_, index) => ({
type: 'assistant/chunk',
seq: index,
time: 10 + index,
data: {
turn: 1,
step: 1,
chunk: { type: 'text-delta', index: 0, text: `part-${index}` },
},
}))
}
function unpackedFixture(): string {
return [HEADER, ...chunkRun().map(event => JSON.stringify(event)), ''].join('\n')
}
function decodedBody(content: string): SessionEvent[] {
return content.trimEnd().split('\n').slice(1)
.flatMap(line => decodeStorageRecord(JSON.parse(line) as unknown))
}
describe('canonicalSessionFixture', () => {
it('preserves the header line and packs an unpacked event run losslessly', () => {
const canonical = canonicalSessionFixture(unpackedFixture(), 'fixture.jsonl')
expect(canonical).toBeDefined()
expect(canonical?.split('\n')[0]).toBe(HEADER)
expect(JSON.parse(canonical?.split('\n')[1] ?? '{}')).toMatchObject({ type: 'text-chunks' })
expect(decodedBody(canonical ?? '')).toStrictEqual(chunkRun())
})
it('ignores JSONL whose first record is not a session header', () => {
expect(canonicalSessionFixture('{"type":"session_event"}\n{"value":1}\n')).toBeUndefined()
})
it('is idempotent for an already packed fixture', () => {
const packed = canonicalSessionFixture(unpackedFixture())
expect(packed).toBeDefined()
expect(canonicalSessionFixture(packed ?? '')).toBe(packed)
})
it('fails loud on malformed records after a session header', () => {
expect(() => canonicalSessionFixture(`${HEADER}\n{not-json}\n`, 'broken.jsonl'))
.toThrow(/broken\.jsonl:2: invalid JSON/)
})
})