autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
138 lines (137 loc) • 3.56 kB
JavaScript
/**
* BootstrapEventEmitter.js — 统一的 Bootstrap 进度事件推送
*
* 两端(内部 Agent / 外部 Agent)使用相同的事件名和数据格式,
* 同时兼容 EventBus 和 BootstrapTaskManager。
*
* @module shared/BootstrapEventEmitter
*/
export class BootstrapEventEmitter {
/** EventBus 实例 */
#eventBus;
/** BootstrapTaskManager 实例 */
#taskManager;
/** @param container DI Container */
constructor(container) {
this.#eventBus = null;
this.#taskManager = null;
try {
this.#eventBus = (container.get?.('eventBus') ?? null);
}
catch {
/* eventBus not registered */
}
try {
this.#taskManager = (container.get?.('bootstrapTaskManager') ?? null);
}
catch {
/* taskManager not registered */
}
}
/**
* 推送维度完成事件
*
* @param dimId 维度 ID
* @param data 事件数据
* @param [data.type] 'skill' | 'candidate' | 'dual'
* @param [data.extracted] 提取的候选数量
* @param [data.source] 'internal-agent' | 'external-agent'
* @param [data.skillCreated] 是否生成了 Skill
* @param [data.recipesBound] 关联的 recipe 数量
*/
emitDimensionComplete(dimId, data) {
// TaskManager 标记
try {
this.#taskManager?.markTaskCompleted?.(dimId, data);
}
catch {
/* non-blocking */
}
// EventBus 推送
try {
this.#eventBus?.emit?.('bootstrap:task-completed', {
dimensionId: dimId,
...data,
});
}
catch {
/* non-blocking */
}
}
/**
* 推送全部维度完成事件
*
* @param sessionId 会话 ID
* @param totalDimensions 总维度数
* @param [source] 来源标识
*/
emitAllComplete(sessionId, totalDimensions, source = 'unknown') {
try {
this.#eventBus?.emit?.('bootstrap:all-completed', {
sessionId,
totalDimensions,
source,
});
}
catch {
/* non-blocking */
}
}
/**
* 推送维度开始填充事件
*
* @param dimId 维度 ID
*/
emitDimensionStart(dimId) {
try {
this.#taskManager?.markTaskFilling?.(dimId);
}
catch {
/* non-blocking */
}
}
/**
* 推送维度失败事件
*
* @param dimId 维度 ID
* @param error 错误对象
*/
emitDimensionFailed(dimId, error) {
try {
this.#taskManager?.markTaskFailed?.(dimId, error);
}
catch {
/* non-blocking */
}
try {
this.#eventBus?.emit?.('bootstrap:task-failed', {
dimensionId: dimId,
error: typeof error === 'string' ? error : error?.message,
});
}
catch {
/* non-blocking */
}
}
/**
* 推送进度事件
*
* @param event 事件名
* @param data 事件数据
*/
emitProgress(event, data = {}) {
try {
this.#eventBus?.emit?.(event, data);
}
catch {
/* non-blocking */
}
try {
this.#taskManager?.emitProgress?.(event, data);
}
catch {
/* non-blocking */
}
}
}
export default BootstrapEventEmitter;