/** * MCP LogTransport Integration * * DNA-008 로깅 시스템과 MCP ActivityMonitor 통합 */ import { attachLogTransport, detachLogTransport, type LogTransport, type LogTransportRecord, } from "@mandujs/core"; import { monitorEventToRecord, type MonitorEvent } from "../adapters/monitor-adapter.js"; /** * MCP 로깅 Transport ID */ export const MCP_TRANSPORT_ID = "mcp-activity"; /** * MCP Activity Transport 옵션 */ export interface McpTransportOptions { /** 로그 파일 경로 (선택) */ logFile?: string; /** 콘솔 출력 여부 */ consoleOutput?: boolean; /** 커스텀 핸들러 */ onRecord?: (record: LogTransportRecord) => void; } /** * MCP Activity Transport 생성 * * ActivityMonitor의 이벤트를 DNA-008 TransportRegistry로 전달 */ export function createMcpActivityTransport( options: McpTransportOptions = {} ): LogTransport { const { consoleOutput = false, onRecord } = options; return (record: LogTransportRecord) => { // MCP 관련 로그만 처리 const source = record.meta?.source; if (source !== "mcp" && source !== "tool" && source !== "watch") { return; } // 커스텀 핸들러 if (onRecord) { onRecord(record); } // 콘솔 출력 if (consoleOutput) { const prefix = `[MCP:${source}]`; const msg = record.error?.message || (record.meta?.message as string) || ""; switch (record.level) { case "error": console.error(prefix, msg, record.meta); break; case "warn": console.warn(prefix, msg, record.meta); break; default: console.log(prefix, msg, record.meta); } } }; } /** * MCP 로깅 설정 * * @example * ```ts * setupMcpLogging({ * consoleOutput: true, * onRecord: (record) => { * // 커스텀 처리 * }, * }); * ``` */ export function setupMcpLogging(options: McpTransportOptions = {}): void { const transport = createMcpActivityTransport(options); attachLogTransport(MCP_TRANSPORT_ID, transport, { minLevel: "info" }); } /** * MCP 로깅 해제 */ export function teardownMcpLogging(): void { detachLogTransport(MCP_TRANSPORT_ID); } /** * MonitorEvent를 DNA-008 시스템으로 전송 * * ActivityMonitor에서 이 함수를 호출하여 로그 통합 */ export function dispatchMonitorEvent(event: MonitorEvent): void { const _record = monitorEventToRecord(event); // 직접 transport로 전달하지 않고, // 다른 transport들도 받을 수 있도록 registry를 통해 dispatch // (transportRegistry.dispatch는 core에서 export 필요) // 임시: 콘솔 출력 if (event.severity === "error") { console.error(`[MCP:${event.source}] ${event.message || event.type}`, event.data); } } /** * MCP 로그 레코드 생성 헬퍼 */ export function createMcpLogRecord( level: "debug" | "info" | "warn" | "error", source: "mcp" | "tool" | "watch", message: string, data?: Record ): LogTransportRecord { return { timestamp: new Date().toISOString(), level, meta: { source, message, ...data, }, }; }