ab388b4f8c
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
42 lines
1.7 KiB
TypeScript
42 lines
1.7 KiB
TypeScript
/**
|
|
* Bounded Trace-head reads (shared by the Session index's session_meta backfill and the
|
|
* Trace listing's first-prompt title fallback): parse only the head window of a shard
|
|
* instead of pulling a whole multi-MB file into memory.
|
|
*/
|
|
import { open } from "node:fs/promises";
|
|
import { parseTraceLines, readTraceTolerant } from "@prismshadow/penguin-core";
|
|
import type { OmniMessage } from "@prismshadow/penguin-core";
|
|
|
|
/** Head window for Trace head reads: generous for a long system prompt, far below a whole multi-MB shard. */
|
|
export const TRACE_HEAD_BYTES = 256 * 1024;
|
|
|
|
/**
|
|
* Parse a Trace file's head window only. session_meta is the first line core writes to
|
|
* every shard (and the first user prompt follows right behind it in the earliest shard),
|
|
* so a bounded read finds them without pulling the whole file into memory.
|
|
* The window is cut at its last newline (the tail fragment is incomplete); a first line
|
|
* larger than the whole window falls back to the full tolerant read.
|
|
*/
|
|
export async function readTraceHead(filePath: string): Promise<OmniMessage[]> {
|
|
const fh = await open(filePath, "r");
|
|
let text: string;
|
|
let truncated: boolean;
|
|
try {
|
|
// allocUnsafe: only subarray(0, bytesRead) is ever read, so the uninitialized tail never leaks.
|
|
const { buffer, bytesRead } = await fh.read(
|
|
Buffer.allocUnsafe(TRACE_HEAD_BYTES),
|
|
0,
|
|
TRACE_HEAD_BYTES,
|
|
0,
|
|
);
|
|
text = buffer.subarray(0, bytesRead).toString("utf8");
|
|
truncated = bytesRead === TRACE_HEAD_BYTES;
|
|
} finally {
|
|
await fh.close();
|
|
}
|
|
if (!truncated) return parseTraceLines(text);
|
|
const nl = text.lastIndexOf("\n");
|
|
if (nl === -1) return readTraceTolerant(filePath);
|
|
return parseTraceLines(text.slice(0, nl + 1));
|
|
}
|