mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-09-14 04:01:35 +00:00
The persistence seam is now create/open/stat/list returning per-session SessionHandles (read/append/flush/close); every log read and write flows through the owning handle. The seam package exports only the service and handle contracts, consumer-visible errors, and pure durable-data validation helpers; each backend owns its complete storage runtime, and the shared contract suites pin equivalent observable behavior. The backend routes published sessions' live events by id into the active write handle; agent-loop only acquires, seeds, and closes the handle. Resume appends interruptedTurnClosers through its write handle; session-query owns the revision-keyed cold cache. Legacy-only surfaces are removed in the same swap: locate/readRaw/supportsRawArtifacts, the legacy event-shape read migration, zstd torn-frame salvage, DSH_SESSION_JSONL, and hook transcript_path population; a torn final zstd frame is discarded whole; the session-list cold blank probe returns on stat metadata (eventCount derived from the last physical row, sizeBytes). The WebUI ZIP export serializes the logical log from a read handle, so both backends export identically. Refs #3245
39 lines
1.8 KiB
TypeScript
39 lines
1.8 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
compressZstdFrame, createZstdFrameDecoder, decompressZstdFrame, scanZstdFrames,
|
|
} from '../src/zstd.ts'
|
|
import { NodePrivateZstdFrameDecoder } from '../src/zstd-private-decoder.ts'
|
|
import { PublicZstdFrameDecoder } from '../src/zstd-public-decoder.ts'
|
|
|
|
describe('JSONL Zstandard compatibility', () => {
|
|
it('round-trips concatenated checksummed frames through the built-in Node API', async () => {
|
|
const encoded = Buffer.concat([
|
|
await compressZstdFrame('{"type":"session","version":0,"id":"compat","createdAt":1}\n'),
|
|
await compressZstdFrame('{"type":"turn/start","seq":0,"turn":1}\n'),
|
|
])
|
|
const { frames, tornStart } = scanZstdFrames(encoded)
|
|
|
|
expect(tornStart).toBeUndefined()
|
|
expect(frames).toHaveLength(2)
|
|
expect(frames.map(frame => encoded.subarray(frame.start, frame.start + 4).toString('hex')))
|
|
.toEqual(['28b52ffd', '28b52ffd'])
|
|
const decoded = await Promise.all(frames.map(frame => decompressZstdFrame(encoded.subarray(frame.start, frame.end))))
|
|
expect(Buffer.concat(decoded).toString()).toContain('"type":"turn/start"')
|
|
|
|
const preferred = createZstdFrameDecoder()
|
|
expect(preferred).toBeInstanceOf(NodePrivateZstdFrameDecoder)
|
|
for (const decoder of [preferred, new PublicZstdFrameDecoder()]) {
|
|
try {
|
|
const plaintext = Array.from(decoder.decode(encoded, frames), chunk => Buffer.from(chunk))
|
|
expect(Buffer.concat(plaintext).toString()).toContain('"type":"turn/start"')
|
|
} finally {
|
|
decoder.close()
|
|
}
|
|
}
|
|
|
|
const eventFrame = encoded.subarray(frames[1]!.start, frames[1]!.end)
|
|
const missingChecksumByte = eventFrame.subarray(0, -1)
|
|
expect(scanZstdFrames(missingChecksumByte)).toEqual({ frames: [], tornStart: 0 })
|
|
})
|
|
})
|