/** * Semantic Clustering Module * * Groups identical activities into single entries with multiple instances. * Clusters by normalized fields (mediaKey, placeName/placeQuery, city, country). * * @example * ```typescript * const result = clusterActivities(classifiedActivities) * console.log(result.clusters) // Grouped activities * console.log(result.filtered) // Removed as noise * ``` */ import type { ClassifiedActivity } from '../types/classifier'; /** * A single cluster of semantically equivalent activities. */ interface ActivityCluster { /** The best representative for this cluster (highest score). */ readonly representative: ClassifiedActivity; /** All activities in this cluster, including the representative. */ readonly instances: readonly ClassifiedActivity[]; /** Number of instances in this cluster. */ readonly instanceCount: number; /** Earliest mention timestamp. */ readonly firstMentioned: Date; /** Latest mention timestamp. */ readonly lastMentioned: Date; /** All unique senders who mentioned this activity. */ readonly allSenders: readonly string[]; /** The clustering key for this cluster. */ readonly clusterKey: string; } /** * Result of clustering activities. */ interface ClusterResult { /** Clusters of related activities (sorted by instance count, descending). */ readonly clusters: readonly ActivityCluster[]; /** Activities filtered out (reserved for future use). */ readonly filtered: readonly ClassifiedActivity[]; } /** * Configuration for clustering. * Currently empty - reserved for future options. */ type ClusterConfig = Record; /** * Cluster activities by matching fields. * * Groups by normalized fields (mediaKey, placeName/placeQuery, city, country). * * @param activities - Classified activities from AI * @param config - Optional clustering configuration * @returns Clustered result with clusters and filtered items * * @example * ```typescript * const result = clusterActivities(activities) * * // Show clusters with multiple mentions * for (const cluster of result.clusters) { * if (cluster.instanceCount > 1) { * console.log(`${cluster.instanceCount}x: ${cluster.representative.activity}`) * } * } * ``` */ export declare function clusterActivities(activities: readonly ClassifiedActivity[], _config?: ClusterConfig): ClusterResult; export {}; //# sourceMappingURL=index.d.ts.map