( projectRoot: string, sessionId: string, )
| 21 | } |
| 22 | |
| 23 | export async function readTranscriptEvents( |
| 24 | projectRoot: string, |
| 25 | sessionId: string, |
| 26 | ): Promise<TranscriptEvent[]> { |
| 27 | let raw: string; |
| 28 | try { |
| 29 | raw = await readFile(transcriptPath(projectRoot, sessionId), "utf-8"); |
| 30 | } catch { |
| 31 | return []; |
| 32 | } |
| 33 | |
| 34 | const events: TranscriptEvent[] = []; |
| 35 | for (const line of raw.split(/\r?\n/)) { |
| 36 | if (!line.trim()) continue; |
| 37 | try { |
| 38 | const parsed = TranscriptEventSchema.safeParse(JSON.parse(line)); |
| 39 | if (parsed.success) events.push(parsed.data); |
| 40 | } catch { |
| 41 | continue; |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | return events.sort((a, b) => a.seq - b.seq); |
| 46 | } |
| 47 | |
| 48 | export async function nextTranscriptSeq(projectRoot: string, sessionId: string): Promise<number> { |
| 49 | const events = await readTranscriptEvents(projectRoot, sessionId); |
no test coverage detected