autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
51 lines (50 loc) • 2.03 kB
TypeScript
/**
* EventAggregator — 信号聚类引擎(受 Continue EditAggregator 启发)
*
* 在短时间窗口内将多个同类事件聚合为一个 batch 事件,避免:
* 1. SignalCollector 对相同类型的信号重复触发 AI 分析
* 2. 高频操作(如连续文件保存)产生大量冗余事件
* 3. 多个 Guard 违规在同一编辑中重复推送
*
* 聚合策略:
* 时间窗口 — 同 key 事件在 windowMs 内合并为一个 batch
* 空间聚类 — 支持自定义 key 提取函数(如按文件路径/违规规则分组)
* 去重 —— 已处理的事件在 dedupeWindowMs 内不重复触发
*
* 用法:
* const agg = new EventAggregator({ windowMs: 5000 });
* agg.on('batch', (key, events) => { ... });
* agg.push('file_change', { filePath: 'a.js' });
* // 5 秒内的多次 push 会合并为一次 batch 回调
*/
export declare class EventAggregator {
#private;
/**
* @param [opts.windowMs=5000] 聚合时间窗口(毫秒)
* @param [opts.maxBatch=50] 单次 batch 最大事件数
* @param [opts.dedupeMs=60000] 相同事件去重窗口(毫秒)
*/
constructor({ windowMs, maxBatch, dedupeMs, }?: {
windowMs?: number | undefined;
maxBatch?: number | undefined;
dedupeMs?: number | undefined;
});
/**
* 推送一个事件到聚合器
* @param key 聚合键(如 'file_change', 'guard_violation')
* @param event 事件数据
* @param [opts.dedupeId] 去重标识(默认为 JSON hash)
*/
push(key: string, event: Record<string, unknown>, { dedupeId }?: {
dedupeId?: string;
}): void;
/** 注册 batch 事件监听器 */
on(eventName: string, fn: (key: string, events: Record<string, unknown>[]) => void): void;
/** 立即刷新所有待处理 bucket */
flushAll(): void;
/** 停止所有计时器 */
destroy(): void;
/** 获取待处理事件数 */
get pendingCount(): number;
}
export default EventAggregator;