mirror of
https://github.com/badlogic/pi-mono.git
synced 2026-11-05 23:37:25 +00:00
45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
import { dirname } from "node:path";
|
|
import { resolvePath } from "../utils/paths.ts";
|
|
import { CURRENT_SESSION_VERSION, type SessionHeader, type SessionManager } from "./session-manager.ts";
|
|
|
|
type TrailingEntries = (parentId: string | null, timestamp: string) => readonly object[];
|
|
|
|
/** Serialize the current branch and optional export-only entries as JSONL. */
|
|
export function serializeSessionBranch(
|
|
sessionManager: SessionManager,
|
|
createTrailingEntries?: TrailingEntries,
|
|
): string {
|
|
const timestamp = new Date().toISOString();
|
|
const header: SessionHeader = {
|
|
type: "session",
|
|
version: CURRENT_SESSION_VERSION,
|
|
id: sessionManager.getSessionId(),
|
|
timestamp,
|
|
cwd: sessionManager.getCwd(),
|
|
};
|
|
const entries: object[] = [header];
|
|
let parentId: string | null = null;
|
|
for (const entry of sessionManager.getBranch()) {
|
|
entries.push({ ...entry, parentId });
|
|
parentId = entry.id;
|
|
}
|
|
entries.push(...(createTrailingEntries?.(parentId, timestamp) ?? []));
|
|
return `${entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`;
|
|
}
|
|
|
|
/** Write the current session branch and optional export-only entries as JSONL. */
|
|
export function exportSessionToJsonl(
|
|
sessionManager: SessionManager,
|
|
outputPath?: string,
|
|
createTrailingEntries?: TrailingEntries,
|
|
): string {
|
|
const filePath = resolvePath(
|
|
outputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, "-")}.jsonl`,
|
|
process.cwd(),
|
|
);
|
|
const dir = dirname(filePath);
|
|
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
writeFileSync(filePath, serializeSessionBranch(sessionManager, createTrailingEntries));
|
|
return filePath;
|
|
}
|