/** * [WHO]: extractFreeRecap(), formatFreeRecap(), FreeRecap — zero-LLM deterministic recap from session entries * [FROM]: Depends on core/session/session-manager (SessionEntry types), @catui/ai (UserMessage, AssistantMessage) * [TO]: Consumed by extensions/builtin/recap/index.ts (Free path), recap-synthesizer (shared walker for activity counts) * [HERE]: extensions/builtin/recap/recap-extractor.ts - heuristic Free recap: longest user message as goal, tool/file frequency as facts, question detection as next-step */ import type { SessionEntry } from "../../../core/session/session-manager.js"; export interface FreeRecap { goal: string; facts: string; next: string; } export interface ExtractedActivity { userTexts: string[]; tools: string[]; files: string[]; } /** * Walk session entries once and collect everything the Free extractor and the * activity guard need. Exported so the Smart synthesizer can reuse the same * walk (avoids two passes + drift between Free and Smart context views). */ export declare function walkSessionActivity(entries: SessionEntry[]): ExtractedActivity; /** * Extract a deterministic recap from session entries. No LLM calls. Returns * structured FreeRecap; pair with formatFreeRecap() to get a renderable string. */ export declare function extractFreeRecap(entries: SessionEntry[]): FreeRecap; /** * Render FreeRecap as a three-clause string that matches the shape of Smart's * output, so the same renderer + side-by-side comparison work without * special-casing. */ export declare function formatFreeRecap(recap: FreeRecap): string;