/** * Thread Suggestions Service (Phase 5: Implicit Thread Detection) * * Detects recurring session topics not captured by existing threads. * Core detection is pure (no I/O). File persistence and Supabase * queries are separate functions called by the session lifecycle. * * Algorithm: * 1. Compare current session embedding against recent sessions * 2. If 3+ sessions are similar AND no matching open thread exists * → create a thread suggestion * 3. Suggestions surfaced at session_start, managed via promote/dismiss */ import type { ThreadWithEmbedding } from "./thread-dedup.js"; import type { ThreadSuggestion, Project } from "../types/index.js"; export declare const SESSION_SIMILARITY_THRESHOLD = 0.7; export declare const THREAD_MATCH_THRESHOLD = 0.8; export declare const SUGGESTION_MATCH_THRESHOLD = 0.8; export declare const MIN_EVIDENCE_SESSIONS = 3; export interface SessionEmbeddingRecord { session_id: string; session_title: string; embedding: number[]; } /** * Detect suggested threads from session embedding clustering. * Pure function — no I/O, no side effects. * * Returns the full updated suggestions list (existing + any new/updated). */ export declare function detectSuggestedThreads(currentSession: { session_id: string; title: string; embedding: number[]; }, recentSessions: SessionEmbeddingRecord[], openThreadEmbeddings: ThreadWithEmbedding[], existingSuggestions: ThreadSuggestion[]): ThreadSuggestion[]; /** * Promote a suggestion to an open thread. * Mutates the suggestion in-place and returns it, or null if not found. */ export declare function promoteSuggestionById(id: string, threadId: string, suggestions: ThreadSuggestion[]): ThreadSuggestion | null; /** * Dismiss a suggestion. Increments dismissed_count. * Mutates the suggestion in-place and returns it, or null if not found. */ export declare function dismissSuggestionById(id: string, suggestions: ThreadSuggestion[]): ThreadSuggestion | null; /** * Filter to only pending suggestions (not promoted/dismissed). * Excludes suggestions dismissed 3+ times (permanently suppressed). */ export declare function getPendingSuggestions(suggestions: ThreadSuggestion[]): ThreadSuggestion[]; /** * Load suggestions from .gitmem/suggested-threads.json. * Returns empty array if file doesn't exist or is corrupted. */ export declare function loadSuggestions(): ThreadSuggestion[]; /** * Save suggestions to .gitmem/suggested-threads.json. */ export declare function saveSuggestions(suggestions: ThreadSuggestion[]): void; /** * Fetch recent session embeddings from Supabase for clustering comparison. * Returns null if Supabase is unavailable. */ export declare function loadRecentSessionEmbeddings(project?: Project, days?: number, limit?: number): Promise; export declare function generateSuggestionId(): string; //# sourceMappingURL=thread-suggestions.d.ts.map