import { EventEmitter } from "events";
const eventBus = new EventEmitter();
// Типы событий для employee plugin
export interface EmployeeEvent {
event: string;
payload: {
timestamp: string;
[key: string]: unknown;
};
}
export interface EmployeeCreatedEvent extends EmployeeEvent {
event: "assistant.employee.created";
payload: {
employee: {
companyId: string;
lastName: string;
firstName: string;
middleName?: string;
email: string;
phones?: string[];
};
result: unknown;
timestamp: string;
};
}
export interface EmployeeErrorEvent extends EmployeeEvent {
event: "mcp.logs.error";
payload: {
error: string;
context?: unknown;
timestamp: string;
};
}
export interface EmployeeProcessingEvent extends EmployeeEvent {
event: "assistant.employee.processing";
payload: {
action: "add_one" | "add_list" | "import_xlsx" | "telegram_handler" | "resolve_conflict" | "force_create";
companyId: string;
sessionId?: string;
userId?: string;
timestamp: string;
};
}
export interface EmployeeValidationEvent extends EmployeeEvent {
event: "assistant.employee.validation";
payload: {
action: "validation_start" | "validation_success" | "validation_failed";
employeeData: unknown;
qualityScore?: number;
errors?: string[];
timestamp: string;
};
}
export interface EmployeeConflictEvent extends EmployeeEvent {
event: "assistant.employee.conflict";
payload: {
conflictType: "exact" | "similar" | "email" | "none";
action: "create" | "update" | "skip" | "manual";
employeeData: unknown;
existingEmployees?: unknown[];
timestamp: string;
};
}
// Улучшенная система логирования
class EmployeeEventLogger {
private logToStdout(event: EmployeeEvent): void {
const logEntry = {
timestamp: event.payload.timestamp,
level: this.getLogLevel(event.event),
event: event.event,
data: event.payload,
};
console.log(JSON.stringify(logEntry));
}
private getLogLevel(eventType: string): string {
switch (eventType) {
case "assistant.employee.created":
return "INFO";
case "assistant.employee.processing":
return "DEBUG";
case "assistant.employee.validation":
return "DEBUG";
case "assistant.employee.conflict":
return "WARN";
case "mcp.logs.error":
return "ERROR";
default:
return "INFO";
}
}
public logEvent(event: EmployeeEvent): void {
this.logToStdout(event);
}
}
const eventLogger = new EmployeeEventLogger();
// Расширенный event-bus с логированием
class EmployeeEventBus extends EventEmitter {
public emitEmployeeCreated(event: EmployeeCreatedEvent): void {
eventLogger.logEvent(event);
this.emit("broadcast", event);
this.emit("employee.created", event);
}
public emitEmployeeError(event: EmployeeErrorEvent): void {
eventLogger.logEvent(event);
this.emit("broadcast", event);
this.emit("employee.error", event);
}
public emitEmployeeProcessing(event: EmployeeProcessingEvent): void {
eventLogger.logEvent(event);
this.emit("broadcast", event);
this.emit("employee.processing", event);
}
public emitEmployeeValidation(event: EmployeeValidationEvent): void {
eventLogger.logEvent(event);
this.emit("broadcast", event);
this.emit("employee.validation", event);
}
public emitEmployeeConflict(event: EmployeeConflictEvent): void {
eventLogger.logEvent(event);
this.emit("broadcast", event);
this.emit("employee.conflict", event);
}
// Обратная совместимость
public emit(event: string, ...args: unknown[]): boolean {
if (event === "broadcast" && args[0]) {
eventLogger.logEvent(args[0] as EmployeeEvent);
}
return super.emit(event, ...args);
}
}
const employeeEventBus = new EmployeeEventBus();
export default employeeEventBus;