/** * Segment-level summaries — generates LLM summaries for conversation segments, * creating a new retrieval layer that captures topics, decisions, and conclusions * in normalized vocabulary. * * Summaries are separately embedded and searchable, bridging vocabulary gaps * between informal discussion terms and formal query terms. */ import { HistoryStore } from './history.js'; import { Segment } from './segments.js'; /** * A generated summary for a conversation segment. */ export interface SegmentSummary { /** First message index (inclusive) */ segmentStart: number; /** Last message index (inclusive) */ segmentEnd: number; /** Normalized topic labels */ topics: string[]; /** 2-4 sentence summary */ summary: string; /** Conclusions reached, if any */ decisions: string[]; /** Embedding of the summary text (384-dim) */ embedding: number[]; /** ISO timestamp of generation */ generatedAt: string; } /** * A summary search result with relevance score. */ export interface ScoredSummaryResult { summary: SegmentSummary; score: number; } /** * Get the summaries file path for a thread. */ export declare function getSummariesPath(threadPath: string): string; /** * Load summaries from disk. */ export declare function loadSummaries(threadPath: string): Promise; /** * Save summaries to disk (atomic write). */ export declare function saveSummaries(threadPath: string, summaries: SegmentSummary[]): Promise; /** * Find segments that don't have summaries yet. * A segment is "unsummarized" if no SegmentSummary covers its start/end range, * AND it's a "closed" segment (i.e., a newer segment exists after it). */ export declare function findUnsummarizedSegments(segments: Segment[], summaries: SegmentSummary[]): Segment[]; /** * Build the summarization prompt for a segment's messages. */ export declare function buildSummarizationPrompt(messages: Array<{ role: string; content: string; }>): string; /** * Parse the LLM's JSON response into structured fields. * Handles common LLM quirks (markdown fences, extra text around JSON). */ export declare function parseSummaryResponse(response: string): { summary: string; topics: string[]; decisions: string[]; } | null; /** * Generate a summary for a single segment by calling Claude via subprocess. * Uses `claude --print` with a minimal prompt — no MCP tools needed. */ export declare function summarizeSegment(messages: Array<{ role: string; content: string; }>, claudePath?: string): Promise<{ summary: string; topics: string[]; decisions: string[]; } | null>; /** * Generate summaries for all unsummarized closed segments in a thread. * This is the main entry point — called by Janus on idle or at startup. * * @returns Number of new summaries generated */ export declare function generatePendingSummaries(threadPath: string, historyStore: HistoryStore, claudePath?: string): Promise; /** * Search summaries by cosine similarity to a query embedding. * Returns summaries sorted by relevance score (descending). */ export declare function searchSummaries(threadPath: string, queryEmbedding: number[], limit?: number, threshold?: number): Promise; //# sourceMappingURL=summaries.d.ts.map