Spaces:
Paused
Paused
| import fs from "node:fs/promises"; | |
| type SessionHeaderEntry = { type: "session"; id?: string; cwd?: string }; | |
| type SessionMessageEntry = { type: "message"; message?: { role?: string } }; | |
| /** | |
| * pi-coding-agent SessionManager persistence quirk: | |
| * - If the file exists but has no assistant message, SessionManager marks itself `flushed=true` | |
| * and will never persist the initial user message. | |
| * - If the file doesn't exist yet, SessionManager builds a new session in memory and flushes | |
| * header+user+assistant once the first assistant arrives (good). | |
| * | |
| * This normalizes the file/session state so the first user prompt is persisted before the first | |
| * assistant entry, even for pre-created session files. | |
| */ | |
| export async function prepareSessionManagerForRun(params: { | |
| sessionManager: unknown; | |
| sessionFile: string; | |
| hadSessionFile: boolean; | |
| sessionId: string; | |
| cwd: string; | |
| }): Promise<void> { | |
| const sm = params.sessionManager as { | |
| sessionId: string; | |
| flushed: boolean; | |
| fileEntries: Array<SessionHeaderEntry | SessionMessageEntry | { type: string }>; | |
| byId?: Map<string, unknown>; | |
| labelsById?: Map<string, unknown>; | |
| leafId?: string | null; | |
| }; | |
| const header = sm.fileEntries.find((e): e is SessionHeaderEntry => e.type === "session"); | |
| const hasAssistant = sm.fileEntries.some( | |
| (e) => e.type === "message" && (e as SessionMessageEntry).message?.role === "assistant", | |
| ); | |
| if (!params.hadSessionFile && header) { | |
| header.id = params.sessionId; | |
| header.cwd = params.cwd; | |
| sm.sessionId = params.sessionId; | |
| return; | |
| } | |
| if (params.hadSessionFile && header && !hasAssistant) { | |
| // Reset file so the first assistant flush includes header+user+assistant in order. | |
| await fs.writeFile(params.sessionFile, "", "utf-8"); | |
| sm.fileEntries = [header]; | |
| sm.byId?.clear?.(); | |
| sm.labelsById?.clear?.(); | |
| sm.leafId = null; | |
| sm.flushed = false; | |
| } | |
| } | |