( session: ISessionStore, summarize: (prompt: string) => Promise<string>, )
| 283 | * Returns token count before compaction, or null if session was empty. |
| 284 | */ |
| 285 | export async function forceCompact( |
| 286 | session: ISessionStore, |
| 287 | summarize: (prompt: string) => Promise<string>, |
| 288 | ): Promise<{ preTokens: number } | null> { |
| 289 | const allEntries = await session.readAll() |
| 290 | const activeEntries = getActiveEntries(allEntries) |
| 291 | if (activeEntries.length === 0) return null |
| 292 | |
| 293 | const currentTokens = estimateSessionTokens(activeEntries) |
| 294 | console.log(`compaction: manual compact for session ${session.id} (~${currentTokens} tokens, ${activeEntries.length} entries)`) |
| 295 | |
| 296 | const prompt = buildSummarizationPrompt(activeEntries) |
| 297 | const summaryText = await summarize(prompt) |
| 298 | |
| 299 | const lastEntry = allEntries[allEntries.length - 1] |
| 300 | const boundary = createCompactBoundary('manual', currentTokens, session.id, lastEntry?.uuid ?? null) |
| 301 | const summary = createSummaryEntry(summaryText, session.id, boundary.uuid) |
| 302 | |
| 303 | await session.appendRaw(boundary) |
| 304 | await session.appendRaw(summary) |
| 305 | |
| 306 | console.log(`compaction: manual compact done. ${activeEntries.length} entries → summary`) |
| 307 | return { preTokens: currentTokens } |
| 308 | } |
no test coverage detected