UNPKG

@iqai/mcp-near-agent

Version:
115 lines (114 loc) 3.71 kB
import { EventEmitter } from "node:events"; import type { Server } from "@modelcontextprotocol/sdk/server/index.js"; import type { Account } from "near-api-js"; import type { AgentEvent } from "../types.js"; import type { EventSubscription } from "./subscription-manager.js"; export interface ProcessingResult { success: boolean; response?: string; error?: string; requestId: string; subscription: EventSubscription; event: AgentEvent; processingTime: number; } export interface EventContext { subscription: EventSubscription; event: AgentEvent; account: Account; } export interface EventProcessorEvents { "event:processed": [result: ProcessingResult]; "event:processing-error": [result: ProcessingResult]; "event:mcp-request": [context: EventContext]; "event:mcp-response": [context: EventContext, response: any]; "event:blockchain-response": [context: EventContext, txHash: string]; "queue:added": [requestId: string, context: EventContext]; "queue:removed": [requestId: string]; "stats:updated": [stats: ProcessingStats]; } export interface ProcessingStats { totalProcessed: number; successful: number; failed: number; averageProcessingTime: number; successRate: number; currentQueueSize: number; } export declare class EventProcessor extends EventEmitter<EventProcessorEvents> { private static readonly DEFAULT_MAX_TOKENS; private static readonly DEFAULT_TIMEOUT; private account; private server; private processingQueue; private processingStats; constructor(account?: Account, server?: Server); /** * Set the NEAR account for blockchain interactions */ setAccount(account: Account): void; /** * Set the MCP server for creating messages */ setServer(server: Server): void; /** * Process an event by requesting sampling from MCP client and sending response to blockchain */ processEvent(context: EventContext): Promise<ProcessingResult>; /** * Request sampling from MCP client using server.createMessage */ private requestMCPSampling; /** * Format event data for MCP sampling */ private formatEventForSampling; /** * Send response back to the NEAR blockchain */ private sendBlockchainResponse; /** * Update processing statistics */ private updateStats; /** * Get current processing queue status */ getQueueStatus(): { queueSize: number; processingItems: { requestId: string; eventType: string; contractId: string; timestamp: number; }[]; }; /** * Get processing statistics */ getStats(): ProcessingStats; /** * Check if a request is currently being processed */ isProcessing(requestId: string): boolean; /** * Get all currently processing request IDs */ getProcessingRequestIds(): string[]; /** * Cancel processing for a specific request (if still in queue) */ cancelProcessing(requestId: string): boolean; /** * Reset statistics */ resetStats(): void; /** * Cleanup resources */ cleanup(): void; on<K extends keyof EventProcessorEvents>(event: K, listener: (...args: EventProcessorEvents[K]) => void): this; emit<K extends keyof EventProcessorEvents>(event: K, ...args: EventProcessorEvents[K]): boolean; off<K extends keyof EventProcessorEvents>(event: K, listener: (...args: EventProcessorEvents[K]) => void): this; once<K extends keyof EventProcessorEvents>(event: K, listener: (...args: EventProcessorEvents[K]) => void): this; }