@revealui/mcp 0.0.1-pre.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/dist/index.js +10990 -0
- package/dist/index.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/result-processor.ts","../src/bridge/PayloadMCPService.ts","../src/server/RevealMCPServer.ts","../src/MCPService.ts","../src/agents/coordination/LearningCoordinatorAgent.ts","../src/agents/BaseAgent.ts","../src/agents/coordination/SupervisorAgent.ts","../src/agents/coordination/TaskCoordinatorAgent.ts","../src/agents/development/CodeGenerationAgent.ts","../src/agents/BaseAgentExecutor.ts","../src/agents/development/DebugAgent.ts","../src/agents/development/DocumentationAgent.ts","../src/agents/development/PingPongAgent.ts","../src/agents/development/RefactoringAgent.ts","../src/agents/self-improvement/ExperienceLibrary.ts","../src/agents/self-improvement/ReinforcementLearning.ts","../src/agents/user-facing/ChatbotAgent.ts","../src/agents/user-facing/ContentGenerationAgent.ts","../src/utils/faq.ts","../src/agents/user-facing/FAQAgent.ts","../src/utils/launchkits.ts","../src/agents/user-facing/LaunchKitReminderAgent.ts","../src/agents/user-facing/PersonalizationAgent.ts","../src/agents/user-facing/WorkflowAutomationAgent.ts","../src/core/AgentWorkspaceService.ts","../src/core/CodeExecutionSandbox.ts","../src/core/AgentRegistry.ts","../src/core/MessageBroker.ts","../src/core/ProtocolHandler.ts","../src/core/SecurityManager.ts","../src/core/ToolDiscoveryService.ts","../src/tools/development/code-generation.ts","../src/tools/user-facing/faq.ts","../src/tools/user-facing/launchkit.ts","../src/core/MCPServer.ts","../src/core/SkillsRegistry.ts","../src/feedback/FeedbackCollector.ts","../src/monitoring/AgentOps.ts","../src/safety/ApprovalWorkflow.ts","../src/safety/AuditLogger.ts","../src/safety/RiskClassifier.ts","../src/safety/RollbackManager.ts","../src/utils/privacy-tokenization.ts","../src/workflows/MultiAgentWorkflow.ts","../src/adapters/StripeMCPAdapter.ts","../src/adapters/VercelMCPAdapter.ts","../src/index.ts","../src/utils/automation-executor.ts","../src/utils/automation-log.ts"],"sourcesContent":["/**\n * ResultProcessor - Filter, transform, and summarize results before sending to model context\n * Implements Anthropic's result filtering pattern with enhanced capabilities\n */\n\nexport interface FilterOptions {\n topN?: number;\n confidenceThreshold?: number;\n maxSize?: number; // Maximum size in bytes\n summarize?: boolean;\n pagination?: {\n page: number;\n pageSize: number;\n };\n}\n\nexport interface SummaryOptions {\n maxLength?: number;\n preserveStructure?: boolean;\n includeMetadata?: boolean;\n}\n\nexport interface ProcessedResult<T = unknown> {\n data: T;\n filtered: boolean;\n summary?: string;\n metadata?: {\n originalCount?: number;\n filteredCount?: number;\n confidenceRange?: { min: number; max: number };\n totalSize?: number;\n filteredSize?: number;\n };\n}\n\n/**\n * Filter results by confidence and limit to top N\n */\nexport function filterByConfidence<T extends { confidence?: number }>(\n results: T[],\n options: FilterOptions = {}\n): T[] {\n const { topN, confidenceThreshold = 0 } = options;\n\n let filtered = results;\n\n // Filter by confidence threshold\n if (confidenceThreshold > 0) {\n filtered = filtered.filter(result => (result.confidence || 0) >= confidenceThreshold);\n }\n\n // Sort by confidence (descending) and limit to top N\n if (topN && topN > 0) {\n filtered = filtered.sort((a, b) => (b.confidence || 0) - (a.confidence || 0)).slice(0, topN);\n }\n\n return filtered;\n}\n\n/**\n * Paginate results\n */\nexport function paginate<T>(results: T[], page: number, pageSize: number): T[] {\n const startIndex = (page - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n return results.slice(startIndex, endIndex);\n}\n\n/**\n * Summarize large results\n */\nexport function summarize<T>(results: T[], options: SummaryOptions = {}): string {\n const { maxLength = 500, preserveStructure = true, includeMetadata = true } = options;\n\n if (results.length === 0) {\n return 'No results found.';\n }\n\n const summary: string[] = [];\n\n if (includeMetadata) {\n summary.push(`Found ${results.length} result${results.length !== 1 ? 's' : ''}.`);\n }\n\n if (preserveStructure) {\n // Try to preserve key structure\n const sample = results[0];\n if (typeof sample === 'object' && sample !== null) {\n const keys = Object.keys(sample);\n summary.push(`Structure: ${keys.join(', ')}`);\n }\n }\n\n // Add first result as example (truncated)\n const firstResultStr = JSON.stringify(results[0], null, 2);\n const truncated =\n firstResultStr.length > maxLength\n ? `${firstResultStr.substring(0, maxLength)}...`\n : firstResultStr;\n\n summary.push(`First result: ${truncated}`);\n\n if (results.length > 1) {\n summary.push(\n `... and ${results.length - 1} more result${results.length - 1 !== 1 ? 's' : ''}.`\n );\n }\n\n return summary.join('\\n\\n');\n}\n\n/**\n * Filter results by date range\n */\nexport function filterByDateRange<\n T extends { targetDate?: string; createdAt?: string; updatedAt?: string },\n>(results: T[], startDate?: Date, endDate?: Date): T[] {\n if (!startDate && !endDate) {\n return results;\n }\n\n return results.filter(result => {\n const dateStr = result.targetDate || result.createdAt || result.updatedAt;\n if (!dateStr) return false;\n\n const date = new Date(dateStr);\n\n if (startDate && date < startDate) return false;\n if (endDate && date > endDate) return false;\n\n return true;\n });\n}\n\n/**\n * Filter results by status\n */\nexport function filterByStatus<T extends { status?: string }>(\n results: T[],\n allowedStatuses: string[]\n): T[] {\n if (allowedStatuses.length === 0) {\n return results;\n }\n\n return results.filter(result => {\n const status = result.status?.toLowerCase();\n return status && allowedStatuses.some(allowed => status.includes(allowed.toLowerCase()));\n });\n}\n\n/**\n * Limit result size\n */\nexport function limitSize<T>(results: T[], maxSizeBytes: number): T[] {\n let totalSize = 0;\n const filtered: T[] = [];\n\n for (const result of results) {\n const resultSize = JSON.stringify(result).length;\n if (totalSize + resultSize <= maxSizeBytes) {\n filtered.push(result);\n totalSize += resultSize;\n } else {\n break;\n }\n }\n\n return filtered;\n}\n\n/**\n * Process results with multiple filters\n */\nexport function process<T = unknown>(\n results: T[],\n options: FilterOptions = {}\n): ProcessedResult<T[]> {\n const { topN, confidenceThreshold, maxSize, summarize: shouldSummarize, pagination } = options;\n\n let filtered: T[] = results;\n const originalCount = results.length;\n let filteredCount = results.length;\n\n // Apply confidence filtering\n if (confidenceThreshold !== undefined && confidenceThreshold > 0) {\n filtered = filterByConfidence(filtered as T[], { confidenceThreshold, topN });\n filteredCount = filtered.length;\n }\n\n // Apply pagination\n if (pagination) {\n filtered = paginate(filtered, pagination.page, pagination.pageSize);\n }\n\n // Apply size limit\n if (maxSize) {\n const beforeSizeLimit = filtered.length;\n filtered = limitSize(filtered, maxSize);\n if (filtered.length < beforeSizeLimit) {\n filteredCount = filtered.length;\n }\n }\n\n // Generate summary if requested\n let summary: string | undefined;\n if (shouldSummarize && filtered.length > 0) {\n summary = summarize(filtered);\n }\n\n // Calculate metadata\n const metadata: ProcessedResult<T[]>['metadata'] = {\n originalCount,\n filteredCount,\n totalSize: JSON.stringify(results).length,\n filteredSize: JSON.stringify(filtered).length,\n };\n\n // Add confidence range if applicable\n if (confidenceThreshold !== undefined) {\n const confidences = (filtered as { confidence?: number }[])\n .map(r => r.confidence || 0)\n .filter(c => c > 0);\n if (confidences.length > 0) {\n metadata.confidenceRange = {\n min: Math.min(...confidences),\n max: Math.max(...confidences),\n };\n }\n }\n\n return {\n data: filtered,\n filtered:\n filteredCount < originalCount ||\n (summary !== undefined && summary.length < JSON.stringify(results).length),\n summary,\n metadata,\n };\n}\n\n/**\n * Get statistics about results\n */\nexport function getStatistics<T>(results: T[]): {\n count: number;\n totalSize: number;\n averageSize: number;\n hasConfidence: boolean;\n confidenceStats?: {\n min: number;\n max: number;\n average: number;\n };\n} {\n const count = results.length;\n const jsonStr = JSON.stringify(results);\n const totalSize = jsonStr.length;\n const averageSize = count > 0 ? totalSize / count : 0;\n\n // Check for confidence scores\n const confidences = (results as { confidence?: number }[])\n .map(r => r.confidence)\n .filter((c): c is number => c !== undefined && c !== null);\n\n const hasConfidence = confidences.length > 0;\n\n let confidenceStats: { min: number; max: number; average: number } | undefined;\n if (hasConfidence && confidences.length > 0) {\n confidenceStats = {\n min: Math.min(...confidences),\n max: Math.max(...confidences),\n average: confidences.reduce((sum, c) => sum + c, 0) / confidences.length,\n };\n }\n\n return {\n count,\n totalSize,\n averageSize,\n hasConfidence,\n confidenceStats,\n };\n}\n","/**\n * PayloadMCPService - Bridge between PayloadCMS MCP Plugin and existing MCP system\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { Payload } from 'payload';\nimport type { ToolDefinition } from '../tools/types';\nimport type { PayloadMCPToolDefinition } from './types';\n\n// Type import - externalized, resolved at runtime by Next.js\n// Use dynamic import for the actual implementation to avoid bundling issues\ntype MCPServerInstance = any; // Resolved at runtime\n\nconst logger = createServiceLogger('PayloadMCPService');\n\nlet bridgeInstance: PayloadMCPBridge | null = null;\n\n/**\n * PayloadMCP Bridge\n */\nexport class PayloadMCPBridge {\n private tools: Map<string, PayloadMCPToolDefinition> = new Map();\n private payload: Payload;\n private serverInstance: MCPServerInstance;\n\n constructor(payload: Payload, serverInstance: MCPServerInstance) {\n this.payload = payload;\n this.serverInstance = serverInstance;\n }\n\n /**\n * Register all PayloadCMS tools with the MCP system\n */\n // Using any for toolDiscoveryService because ToolDiscoveryService may not be fully typed yet\n async registerTools(toolDiscoveryService: {\n addTool?: (tool: ToolDefinition) => void;\n }): Promise<void> {\n const mcpTools = Array.from(this.serverInstance.tools.values());\n\n for (const mcpTool of mcpTools) {\n // Parse tool name to extract collection and operation\n const parts = mcpTool.name.split('_');\n if (parts.length < 3) continue;\n\n const operation = parts[parts.length - 1] as 'list' | 'get' | 'create' | 'update' | 'delete';\n const collectionSlug = parts.slice(1, -1).join('_').replace(/_/g, '-');\n\n // Convert MCP tool to internal tool definition\n const toolDef = {\n name: mcpTool.name,\n server: 'payloadcms',\n description: mcpTool.description,\n parameters: this.convertSchemaToParameters(mcpTool.inputSchema),\n returns: {\n type: 'object',\n description: 'Operation result',\n schema: {},\n },\n mcpTool,\n collectionSlug,\n operation,\n } as PayloadMCPToolDefinition;\n\n this.tools.set(mcpTool.name, toolDef);\n\n // Register with tool discovery service\n if (toolDiscoveryService && typeof toolDiscoveryService.addTool === 'function') {\n toolDiscoveryService.addTool(toolDef);\n logger.debug('Registered PayloadCMS tool', { name: mcpTool.name });\n }\n }\n\n logger.info('PayloadCMS tools registered', {\n count: this.tools.size,\n });\n }\n\n /**\n * Convert JSON Schema to tool parameters\n */\n private convertSchemaToParameters(schema: {\n type: string;\n // Using Record<string, unknown> because JSON Schema properties are dynamic\n properties: /* Using Record<string, unknown> because JSON Schema properties are dynamic */ Record<\n string,\n unknown\n >;\n required?: string[];\n }): ToolDefinition['parameters'] {\n const parameters: ToolDefinition['parameters'] = [];\n\n if (schema.properties) {\n for (const [name, prop] of Object.entries(schema.properties)) {\n // Using Record<string, unknown> because JSON Schema property structure varies by field type\n const propSchema =\n prop as /* Using Record<string, unknown> because JSON Schema property structure varies by field type */ Record<\n string,\n unknown\n >;\n const isRequired = schema.required?.includes(name) ?? false;\n\n parameters.push({\n name,\n type: this.getTypeFromSchema(propSchema),\n required: isRequired,\n description: (propSchema.description as string) || name,\n default: propSchema.default,\n });\n }\n }\n\n return parameters;\n }\n\n /**\n * Get TypeScript type string from JSON Schema\n */\n // Using Record<string, unknown> because JSON Schema structure is dynamic and varies by schema type\n private getTypeFromSchema(\n schema: /* Using Record<string, unknown> because JSON Schema structure is dynamic and varies by schema type */ Record<\n string,\n unknown\n >\n ): string {\n const schemaType = schema.type;\n if (schemaType === 'array') {\n // Using Record<string, unknown> because JSON Schema items structure varies\n const items =\n schema.items /* Using Record<string, unknown> because JSON Schema items structure varies */ as\n | Record<string, unknown>\n | undefined;\n const itemsType = items?.type ? String(items.type) : 'unknown';\n return `${itemsType}[]`;\n }\n if (schemaType === 'object') {\n return 'object';\n }\n return schemaType ? String(schemaType) : 'unknown';\n }\n\n /**\n * Execute a PayloadCMS tool\n */\n async executeTool(\n toolName: string,\n // Using Record<string, unknown> because tool arguments structure varies by tool type and cannot be strictly typed\n args: /* Using Record<string, unknown> because tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n userId?: string\n ): Promise<unknown> {\n const tool = this.tools.get(toolName);\n if (!tool) {\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n // Use the MCP server's executeTool method\n // Dynamic import - resolved at runtime by Next.js\n // This path is externalized and will be resolved by Next.js path aliases\n const { executeTool } = await import('@/infrastructure/cms/plugins/payload/mcp/mcp-server');\n const result = await executeTool(\n {\n name: toolName,\n arguments: args,\n },\n userId\n );\n\n if (result.isError) {\n const errorText = result.content[0]?.text || 'Unknown error';\n const errorData = JSON.parse(errorText);\n throw new Error(errorData.error || 'Tool execution failed');\n }\n\n const resultText = result.content[0]?.text || '{}';\n return JSON.parse(resultText);\n }\n\n /**\n * Get all registered tools\n */\n getTools(): PayloadMCPToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Get tool by name\n */\n getTool(name: string): PayloadMCPToolDefinition | null {\n return this.tools.get(name) || null;\n }\n}\n\n/**\n * Register PayloadCMS MCP service with the existing MCP system\n */\nexport async function registerPayloadMCPService(\n payload: Payload,\n serverInstance: MCPServerInstance\n): Promise<void> {\n if (bridgeInstance) {\n logger.warn('PayloadMCPBridge already registered');\n return;\n }\n\n bridgeInstance = new PayloadMCPBridge(payload, serverInstance);\n\n // Try to get the MCP service and register tools\n try {\n // This will be called from MCPService when it initializes\n // For now, we'll store the instance for later registration\n logger.info('PayloadMCPBridge created, waiting for MCP system initialization');\n } catch (error) {\n logger.error('Failed to register PayloadMCPBridge', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Get PayloadMCPBridge instance\n */\nexport function getPayloadMCPBridge(): PayloadMCPBridge | null {\n return bridgeInstance;\n}\n","/**\n * RevealMCPServer - Unified MCP server combining multi-agent system and PayloadCMS\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { Payload } from 'payload';\nimport { MCPService, type MCPServiceOptions } from '../MCPService';\nimport { StripeMCPAdapter } from '../adapters/StripeMCPAdapter';\nimport { VercelMCPAdapter } from '../adapters/VercelMCPAdapter';\nimport type { BaseAgent } from '../agents/BaseAgent';\nimport { getPayloadMCPBridge } from '../bridge/PayloadMCPService';\nimport type { ToolSearchOptions } from '../core/ToolDiscoveryService';\nimport type { ToolDefinition } from '../tools/types';\nimport type { AgentTask } from '../types/tasks';\nimport type { RevealMCPConfig } from './types';\n\nconst logger = createServiceLogger('RevealMCPServer');\nconst SERVER_NOT_INITIALIZED_ERROR = 'RevealMCPServer not initialized';\n\n/**\n * Reveal MCP Server\n *\n * Unified server that combines:\n * - Multi-agent communication system\n * - PayloadCMS tool integration\n * - Tool discovery and execution\n */\nexport class RevealMCPServer {\n private mcpService: MCPService | null = null;\n private payload: Payload | null = null;\n private config: RevealMCPConfig;\n private isInitialized = false;\n private vercelAdapter: VercelMCPAdapter | null = null;\n private stripeAdapter: StripeMCPAdapter | null = null;\n\n constructor(config: RevealMCPConfig) {\n this.config = config;\n this.payload = config.payload || null;\n\n // Initialize external service adapters\n if (config.enableVercel !== false) {\n this.vercelAdapter = new VercelMCPAdapter(config.vercel);\n }\n\n if (config.enableStripe !== false) {\n this.stripeAdapter = new StripeMCPAdapter(config.stripe);\n }\n }\n\n /**\n * Initialize the Reveal MCP server\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n logger.warn('RevealMCPServer already initialized');\n return;\n }\n\n try {\n // Initialize MCP service (multi-agent system)\n const mcpServiceOptions: MCPServiceOptions = {\n tursoUrl: this.config.messageBroker.url,\n ...(this.config.messageBroker.authToken && {\n tursoAuthToken: this.config.messageBroker.authToken,\n }),\n jwtSecret: this.config.security.jwtSecret,\n encryptionKey: this.config.security.encryptionKey,\n enableDevelopmentAgents: true,\n enableUserFacingAgents: true,\n };\n\n this.mcpService = new MCPService(\n this.payload || (await this.getPayload()),\n mcpServiceOptions\n );\n\n await this.mcpService.initialize();\n\n // Register PayloadCMS tools if enabled\n if (this.config.enablePayloadCMS !== false && this.payload) {\n const bridge = getPayloadMCPBridge();\n const toolDiscovery = this.mcpService.getToolDiscovery();\n if (bridge && toolDiscovery) {\n await bridge.registerTools(toolDiscovery);\n logger.info('PayloadCMS tools registered with Reveal MCP');\n }\n }\n\n // Initialize and register Vercel tools\n if (this.vercelAdapter) {\n await this.vercelAdapter.initialize();\n if (this.mcpService.getToolDiscovery()) {\n const vercelTools = this.vercelAdapter.getTools();\n for (const tool of vercelTools) {\n this.mcpService.getToolDiscovery()?.addTool(tool);\n }\n logger.info('Vercel tools registered with Reveal MCP', {\n count: vercelTools.length,\n });\n }\n }\n\n // Initialize and register Stripe tools\n if (this.stripeAdapter) {\n await this.stripeAdapter.initialize();\n if (this.mcpService.getToolDiscovery()) {\n const stripeTools = this.stripeAdapter.getTools();\n for (const tool of stripeTools) {\n this.mcpService.getToolDiscovery()?.addTool(tool);\n }\n logger.info('Stripe tools registered with Reveal MCP', {\n count: stripeTools.length,\n });\n }\n }\n\n this.isInitialized = true;\n logger.info('RevealMCPServer initialized successfully', {\n payloadCMSEnabled: this.config.enablePayloadCMS !== false,\n vercelEnabled: this.vercelAdapter !== null,\n stripeEnabled: this.stripeAdapter !== null,\n agentsEnabled: true,\n });\n } catch (error) {\n logger.error('Failed to initialize RevealMCPServer', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Get Payload instance\n */\n private async getPayload(): Promise<Payload> {\n if (this.payload) {\n return this.payload;\n }\n\n // Dynamic import to avoid circular dependencies\n try {\n // Try to import from payload.config using @/ alias (resolved at runtime)\n const payloadConfigModule = await import('@/payload.config');\n const config = await payloadConfigModule.getPayloadConfig();\n const { getPayload } = await import('payload');\n const payload = await getPayload({ config });\n if (!payload) {\n throw new Error('Failed to get Payload instance');\n }\n this.payload = payload as Payload;\n return this.payload;\n } catch (error) {\n // Fallback to @/ alias if payload.config doesn't work\n try {\n const payloadModule = await import('@/payload.config');\n const config = await payloadModule.getPayloadConfig();\n const { getPayload } = await import('payload');\n const payload = await getPayload({ config });\n if (!payload) {\n throw new Error('Failed to get Payload instance');\n }\n this.payload = payload as Payload;\n return this.payload;\n } catch (fallbackError) {\n throw new Error(\n `Failed to initialize Payload: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n /**\n * Register an agent\n * @param agent - The agent instance to register (must extend BaseAgent)\n */\n async registerAgent(agent: BaseAgent): Promise<void> {\n if (!this.mcpService) {\n throw new Error(SERVER_NOT_INITIALIZED_ERROR);\n }\n\n const server = this.mcpService.getServer();\n if (!server) {\n throw new Error('MCP Server not available');\n }\n\n await server.registerAgent(agent);\n }\n\n /**\n * Unregister an agent\n */\n async unregisterAgent(agentId: string): Promise<void> {\n if (!this.mcpService) {\n throw new Error(SERVER_NOT_INITIALIZED_ERROR);\n }\n\n const server = this.mcpService.getServer();\n if (!server) {\n throw new Error('MCP Server not available');\n }\n\n await server.unregisterAgent(agentId);\n }\n\n /**\n * List available tools\n */\n async listTools(options?: ToolSearchOptions): Promise<ToolDefinition[]> {\n if (!this.mcpService) {\n throw new Error(SERVER_NOT_INITIALIZED_ERROR);\n }\n\n const toolDiscovery = this.mcpService.getToolDiscovery();\n if (!toolDiscovery) {\n return [];\n }\n\n const result = await toolDiscovery.searchTools(options || {});\n return result.tools;\n }\n\n /**\n * Get tool by server and name\n */\n async getTool(server: string, name: string): Promise<ToolDefinition | null> {\n if (!this.mcpService) {\n throw new Error(SERVER_NOT_INITIALIZED_ERROR);\n }\n\n const toolDiscovery = this.mcpService.getToolDiscovery();\n if (!toolDiscovery) {\n return null;\n }\n\n return await toolDiscovery.getTool(server, name);\n }\n\n /**\n * Execute a tool\n */\n // Using Record<string, unknown> because tool arguments structure varies by tool type and cannot be strictly typed\n async executeTool(\n name: string,\n args: /* Using Record<string, unknown> because tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<unknown> {\n if (!this.mcpService) {\n throw new Error(SERVER_NOT_INITIALIZED_ERROR);\n }\n\n // Route to appropriate adapter based on tool name\n if (name.startsWith('payload_')) {\n // PayloadCMS tool\n const bridge = getPayloadMCPBridge();\n if (bridge) {\n return await bridge.executeTool(name, args);\n }\n } else if (name.startsWith('vercel_')) {\n // Vercel tool\n if (!this.vercelAdapter) {\n throw new Error('Vercel MCP adapter not enabled');\n }\n return await this.vercelAdapter.executeTool(name, args);\n } else if (name.startsWith('stripe_')) {\n // Stripe tool\n if (!this.stripeAdapter) {\n throw new Error('Stripe MCP adapter not enabled');\n }\n return await this.stripeAdapter.executeTool(name, args);\n }\n\n // Otherwise, execute via agent system\n const server = this.mcpService.getServer();\n if (!server) {\n throw new Error('MCP Server not available');\n }\n\n // TODO: Implement tool execution routing to appropriate agent\n // Tools should be routed based on tool name/type to the appropriate agent:\n // - Development tools -> CodeGenerationAgent, RefactoringAgent, etc.\n // - User-facing tools -> FAQAgent, ChatbotAgent, etc.\n // - Coordination tools -> SupervisorAgent, TaskCoordinatorAgent, etc.\n // For now, throw error to indicate tool execution is not yet implemented\n throw new Error(`Tool execution not yet implemented for: ${name}`);\n }\n\n /**\n * Execute a task via agent system\n */\n async executeTask(task: Partial<AgentTask>): Promise<unknown> {\n if (!this.mcpService) {\n throw new Error(SERVER_NOT_INITIALIZED_ERROR);\n }\n\n return await this.mcpService.executeTask(task);\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<{ status: string; message?: string; details?: unknown }> {\n if (!this.mcpService) {\n return {\n status: 'unhealthy',\n message: 'RevealMCPServer not initialized',\n };\n }\n\n return await this.mcpService.getHealth();\n }\n\n /**\n * Get statistics\n */\n getStatistics(): {\n agents: number;\n tools: number;\n status: string;\n payloadCMSEnabled?: boolean;\n vercelEnabled?: boolean;\n stripeEnabled?: boolean;\n [key: string]: unknown;\n } {\n if (!this.mcpService) {\n return {\n agents: 0,\n tools: 0,\n status: 'uninitialized',\n };\n }\n\n const server = this.mcpService.getServer();\n if (!server) {\n return {\n agents: 0,\n tools: 0,\n status: 'no-server',\n };\n }\n\n const stats = server.getStatistics();\n const toolDiscovery = this.mcpService.getToolDiscovery();\n const toolStats = toolDiscovery?.getStatistics() || { totalTools: 0 };\n\n return {\n ...stats,\n status: 'status' in stats && typeof stats.status === 'string' ? stats.status : 'unknown',\n tools: toolStats.totalTools,\n payloadCMSEnabled: this.config.enablePayloadCMS !== false,\n vercelEnabled: this.vercelAdapter !== null,\n stripeEnabled: this.stripeAdapter !== null,\n };\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n if (this.mcpService) {\n await this.mcpService.cleanup();\n this.mcpService = null;\n }\n\n this.isInitialized = false;\n logger.info('RevealMCPServer shut down');\n }\n}\n","/**\n * MCPService - Integration layer for MCP server with existing service architecture\n */\n\nimport { BaseService } from '@revealui/infrastructure';\nimport type { Payload } from 'payload';\nimport { LearningCoordinatorAgent } from './agents/coordination/LearningCoordinatorAgent';\nimport { SupervisorAgent } from './agents/coordination/SupervisorAgent';\nimport { TaskCoordinatorAgent } from './agents/coordination/TaskCoordinatorAgent';\nimport { CodeGenerationAgent } from './agents/development/CodeGenerationAgent';\nimport { DebugAgent } from './agents/development/DebugAgent';\nimport { DocumentationAgent } from './agents/development/DocumentationAgent';\nimport { PingPongAgent } from './agents/development/PingPongAgent';\nimport { RefactoringAgent } from './agents/development/RefactoringAgent';\nimport { ExperienceLibrary } from './agents/self-improvement/ExperienceLibrary';\nimport { ReinforcementLearning } from './agents/self-improvement/ReinforcementLearning';\nimport { ChatbotAgent } from './agents/user-facing/ChatbotAgent';\nimport { ContentGenerationAgent } from './agents/user-facing/ContentGenerationAgent';\nimport { FAQAgent } from './agents/user-facing/FAQAgent';\nimport { LaunchKitReminderAgent } from './agents/user-facing/LaunchKitReminderAgent';\nimport { PersonalizationAgent } from './agents/user-facing/PersonalizationAgent';\nimport { WorkflowAutomationAgent } from './agents/user-facing/WorkflowAutomationAgent';\nimport type { AgentRegistry } from './core/AgentRegistry';\nimport { AgentWorkspaceService } from './core/AgentWorkspaceService';\nimport { CodeExecutionSandbox } from './core/CodeExecutionSandbox';\nimport { MCPServer, type MCPServerConfig } from './core/MCPServer';\nimport type { MessageBroker } from './core/MessageBroker';\nimport type { ProtocolHandler } from './core/ProtocolHandler';\nimport { SkillsRegistry } from './core/SkillsRegistry';\nimport { ToolDiscoveryService } from './core/ToolDiscoveryService';\nimport { FeedbackCollector } from './feedback/FeedbackCollector';\nimport { AgentOps } from './monitoring/AgentOps';\nimport { ApprovalWorkflow } from './safety/ApprovalWorkflow';\nimport { AuditLogger } from './safety/AuditLogger';\nimport { RiskClassifier } from './safety/RiskClassifier';\nimport { RollbackManager } from './safety/RollbackManager';\nimport type { AgentConfig } from './types/agents';\nimport type { AgentTask, ApprovalRequest } from './types/tasks';\nimport { PrivacyTokenizationService } from './utils/privacy-tokenization';\nimport { MultiAgentWorkflow } from './workflows/MultiAgentWorkflow';\n\nexport interface MCPServiceOptions {\n tursoUrl: string;\n tursoAuthToken?: string;\n jwtSecret: string;\n encryptionKey: string;\n enableDevelopmentAgents?: boolean;\n enableUserFacingAgents?: boolean;\n enableCoordinationAgents?: boolean;\n // Code execution sandbox\n sandboxEnabled?: boolean;\n sandboxMaxExecutionTime?: number;\n sandboxMaxMemoryMB?: number;\n sandboxAllowNetwork?: boolean;\n sandboxAllowFilesystem?: boolean;\n // Workspace\n workspaceDir?: string;\n workspaceMaxSizeBytes?: number;\n workspaceMaxFiles?: number;\n // Tokenization\n tokenizationEnabled?: boolean;\n}\n\nexport class MCPService extends BaseService {\n private server: MCPServer | null = null;\n private options: MCPServiceOptions;\n private riskClassifier: RiskClassifier | null = null;\n private auditLogger: AuditLogger | null = null;\n private approvalWorkflow: ApprovalWorkflow | null = null;\n private rollbackManager: RollbackManager | null = null;\n private toolDiscovery: ToolDiscoveryService | null = null;\n private codeSandbox: CodeExecutionSandbox | null = null;\n private workspace: AgentWorkspaceService | null = null;\n private skillsRegistry: SkillsRegistry | null = null;\n private tokenizationService: PrivacyTokenizationService | null = null;\n // Phase 4: Self-Improvement System\n private experienceLibrary: ExperienceLibrary | null = null;\n private reinforcementLearning: ReinforcementLearning | null = null;\n private agentOps: AgentOps | null = null;\n private feedbackCollector: FeedbackCollector | null = null;\n // Phase 5: Advanced Coordination\n private taskCoordinator: TaskCoordinatorAgent | null = null;\n private supervisor: SupervisorAgent | null = null;\n private learningCoordinator: LearningCoordinatorAgent | null = null;\n private multiAgentWorkflow: MultiAgentWorkflow | null = null;\n\n constructor(payload: Payload, options: MCPServiceOptions) {\n super(payload, 'MCPService');\n this.options = options;\n }\n\n /**\n * Initialize the MCP service\n */\n async initialize(): Promise<void> {\n try {\n // Initialize safety components\n this.riskClassifier = new RiskClassifier();\n\n this.auditLogger = new AuditLogger(this.options.tursoUrl, this.options.tursoAuthToken);\n await this.auditLogger.initialize();\n\n this.approvalWorkflow = new ApprovalWorkflow(\n this.options.tursoUrl,\n this.options.tursoAuthToken\n );\n await this.approvalWorkflow.initialize();\n\n this.rollbackManager = new RollbackManager(\n this.options.tursoUrl,\n this.options.tursoAuthToken\n );\n await this.rollbackManager.initialize();\n\n // Initialize tool discovery\n this.toolDiscovery = new ToolDiscoveryService();\n await this.toolDiscovery.initialize();\n\n // Register PayloadCMS tools if available\n try {\n const { getPayloadMCPBridge } = await import('./bridge/PayloadMCPService');\n const bridge = getPayloadMCPBridge();\n if (bridge && this.toolDiscovery) {\n await bridge.registerTools(this.toolDiscovery);\n this.logger.info('PayloadCMS tools registered with MCP system');\n }\n } catch (error) {\n // PayloadCMS MCP plugin may not be initialized yet, that's okay\n this.logger.debug('PayloadCMS MCP bridge not available yet', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Initialize code execution sandbox\n if (this.options.sandboxEnabled !== false) {\n this.codeSandbox = new CodeExecutionSandbox({\n enabled: true,\n maxExecutionTime: this.options.sandboxMaxExecutionTime || 30000,\n maxMemoryMB: this.options.sandboxMaxMemoryMB || 512,\n allowNetwork: this.options.sandboxAllowNetwork || false,\n allowFilesystem: this.options.sandboxAllowFilesystem || false,\n timeout: this.options.sandboxMaxExecutionTime || 30000,\n });\n await this.codeSandbox.initialize();\n }\n\n // Initialize workspace service\n const workspaceConfig: {\n baseDir: string;\n maxSizeBytes?: number;\n maxFiles?: number;\n tursoUrl?: string;\n tursoAuthToken?: string;\n } = {\n baseDir: this.options.workspaceDir || './data/mcp/workspaces',\n ...(this.options.workspaceMaxSizeBytes && {\n maxSizeBytes: this.options.workspaceMaxSizeBytes,\n }),\n ...(this.options.workspaceMaxFiles && { maxFiles: this.options.workspaceMaxFiles }),\n ...(this.options.tursoUrl && { tursoUrl: this.options.tursoUrl }),\n ...(this.options.tursoAuthToken && { tursoAuthToken: this.options.tursoAuthToken }),\n };\n this.workspace = new AgentWorkspaceService(workspaceConfig);\n await this.workspace.initialize();\n\n // Initialize skills registry\n this.skillsRegistry = new SkillsRegistry();\n await this.skillsRegistry.initialize();\n\n // Initialize Phase 4: Self-Improvement System\n this.experienceLibrary = new ExperienceLibrary();\n this.reinforcementLearning = new ReinforcementLearning(this.experienceLibrary);\n this.agentOps = new AgentOps();\n this.feedbackCollector = new FeedbackCollector();\n\n this.logger.info('Self-improvement system initialized', {\n components: ['ExperienceLibrary', 'ReinforcementLearning', 'AgentOps', 'FeedbackCollector'],\n });\n\n // Initialize Phase 5: Advanced Coordination\n if (this.options.enableCoordinationAgents) {\n await this.initializeCoordinationAgents();\n }\n\n // Initialize tokenization service\n if (this.options.tokenizationEnabled !== false) {\n this.tokenizationService = new PrivacyTokenizationService({\n enabled: true,\n storageType: 'memory',\n });\n await this.tokenizationService.initialize();\n }\n\n // Create server config\n const config: MCPServerConfig = {\n messageBroker: {\n url: this.options.tursoUrl,\n ...(this.options.tursoAuthToken && { authToken: this.options.tursoAuthToken }),\n },\n security: {\n jwtSecret: this.options.jwtSecret,\n encryptionKey: this.options.encryptionKey,\n agentApiKeys: new Map(), // Will be populated from PayloadCMS\n },\n };\n\n // Initialize MCP server\n this.server = new MCPServer(config);\n await this.server.initialize();\n\n // Register agents (with workspace support)\n await this.registerDefaultAgents();\n\n this.logger.info('MCPService initialized successfully', {\n developmentAgents: this.options.enableDevelopmentAgents ?? false,\n userFacingAgents: this.options.enableUserFacingAgents ?? false,\n coordinationAgents: this.options.enableCoordinationAgents ?? false,\n toolDiscovery: this.toolDiscovery !== null,\n codeSandbox: this.codeSandbox !== null,\n workspace: this.workspace !== null,\n skillsRegistry: this.skillsRegistry !== null,\n tokenization: this.tokenizationService !== null,\n });\n } catch (error) {\n this.logger.error('Failed to initialize MCPService', { error });\n throw error;\n }\n }\n\n /**\n * Register default agents\n */\n private async registerDefaultAgents(): Promise<void> {\n if (!this.server) return;\n\n const broker = this.server.getMessageBroker();\n const registry = this.server.getAgentRegistry();\n const protocol = this.server.getProtocolHandler();\n\n // Always register PingPongAgent for testing\n const pingPongConfig: AgentConfig = {\n id: 'ping-pong-001',\n type: 'PingPongAgent',\n model: 'test',\n enabled: true,\n systemPrompt: 'Test agent for infrastructure validation',\n capabilities: ['ping', 'echo', 'simulate'],\n riskThreshold: 'safe',\n maxConcurrentTasks: 10,\n };\n\n const pingPongAgent = new PingPongAgent(pingPongConfig, broker, registry, protocol);\n await this.server.registerAgent(pingPongAgent);\n\n // Register development agents if enabled\n if (this.options.enableDevelopmentAgents) {\n await this.registerDevelopmentAgents(broker, registry, protocol);\n }\n\n // Register user-facing agents if enabled\n if (this.options.enableUserFacingAgents) {\n await this.registerUserFacingAgents(broker, registry, protocol);\n }\n\n // Coordination agents will be added in Phase 5\n }\n\n /**\n * Register development agents\n */\n private async registerDevelopmentAgents(\n broker: MessageBroker,\n registry: AgentRegistry,\n protocol: ProtocolHandler\n ): Promise<void> {\n if (!this.server) return;\n\n const DEFAULT_AGENT_IDS = {\n CODE_GEN: 'code-gen-001',\n REFACTOR: 'refactor-001',\n DOCS: 'docs-001',\n DEBUG: 'debug-001',\n };\n\n // Code Generation Agent\n const codeGenConfig: AgentConfig = {\n id: DEFAULT_AGENT_IDS.CODE_GEN,\n type: 'CodeGenerationAgent',\n model: 'claude-3-5-sonnet-20241022',\n enabled: true,\n systemPrompt: 'Code generation specialist for Next.js 15 + PayloadCMS 3',\n capabilities: ['component', 'service', 'repository', 'test', 'api-route', 'hook', 'utility'],\n riskThreshold: 'moderate',\n maxConcurrentTasks: 5,\n };\n\n const codeGenAgent = new CodeGenerationAgent(codeGenConfig, broker, registry, protocol);\n if (this.riskClassifier) codeGenAgent.setRiskClassifier(this.riskClassifier);\n if (this.auditLogger) codeGenAgent.setAuditLogger(this.auditLogger);\n if (this.codeSandbox) {\n // Note: CodeGenerationAgent would need setSandbox method if we want to integrate sandbox\n // For now, we'll add this capability later\n }\n if (this.workspace) {\n codeGenAgent.setWorkspace(this.workspace);\n }\n await this.server.registerAgent(codeGenAgent);\n\n // Refactoring Agent\n const refactorConfig: AgentConfig = {\n id: DEFAULT_AGENT_IDS.REFACTOR,\n type: 'RefactoringAgent',\n model: 'claude-3-5-sonnet-20241022',\n enabled: true,\n systemPrompt: 'Refactoring expert for TypeScript codebases',\n capabilities: ['analyze', 'refactor', 'optimize', 'clean'],\n riskThreshold: 'high',\n maxConcurrentTasks: 3,\n };\n\n const refactorAgent = new RefactoringAgent(refactorConfig, broker, registry, protocol);\n if (this.riskClassifier) refactorAgent.setRiskClassifier(this.riskClassifier);\n if (this.auditLogger) refactorAgent.setAuditLogger(this.auditLogger);\n await this.server.registerAgent(refactorAgent);\n\n // Documentation Agent\n const docsConfig: AgentConfig = {\n id: DEFAULT_AGENT_IDS.DOCS,\n type: 'DocumentationAgent',\n model: 'gpt-4o',\n enabled: true,\n systemPrompt: 'Documentation specialist',\n capabilities: ['jsdoc', 'readme', 'api-docs', 'architecture-docs', 'guide'],\n riskThreshold: 'safe',\n maxConcurrentTasks: 10,\n };\n\n const docsAgent = new DocumentationAgent(docsConfig, broker, registry, protocol);\n if (this.auditLogger) docsAgent.setAuditLogger(this.auditLogger);\n await this.server.registerAgent(docsAgent);\n\n // Debug Agent\n const debugConfig: AgentConfig = {\n id: DEFAULT_AGENT_IDS.DEBUG,\n type: 'DebugAgent',\n model: 'gpt-4o',\n enabled: true,\n systemPrompt: 'Debugging expert',\n capabilities: ['analyze-error', 'suggest-fix', 'performance-debug', 'analyze-logs'],\n riskThreshold: 'moderate',\n maxConcurrentTasks: 5,\n };\n\n const debugAgent = new DebugAgent(debugConfig, broker, registry, protocol);\n if (this.auditLogger) debugAgent.setAuditLogger(this.auditLogger);\n await this.server.registerAgent(debugAgent);\n\n this.logger.info('Development agents registered', {\n agents: Object.values(DEFAULT_AGENT_IDS),\n });\n }\n\n /**\n * Register user-facing agents\n */\n private async registerUserFacingAgents(\n broker: MessageBroker,\n registry: AgentRegistry,\n protocol: ProtocolHandler\n ): Promise<void> {\n if (!this.server) return;\n\n // Chatbot Agent\n const chatbotConfig: AgentConfig = {\n id: 'chatbot-001',\n type: 'ChatbotAgent',\n model: 'gpt-4o',\n enabled: true,\n systemPrompt: 'Customer support specialist with RAG capabilities',\n capabilities: ['customer-support', 'faq', 'troubleshooting', 'escalation'],\n riskThreshold: 'safe',\n maxConcurrentTasks: 20,\n };\n\n const chatbotAgent = new ChatbotAgent(chatbotConfig, broker, registry, protocol);\n if (this.auditLogger) chatbotAgent.setAuditLogger(this.auditLogger);\n await this.server.registerAgent(chatbotAgent);\n\n // Content Generation Agent\n const contentConfig: AgentConfig = {\n id: 'content-gen-001',\n type: 'ContentGenerationAgent',\n model: 'gpt-4o',\n enabled: true,\n systemPrompt: 'Marketing content specialist',\n capabilities: [\n 'blog-post',\n 'product-description',\n 'marketing-copy',\n 'social-media',\n 'email-template',\n 'landing-page',\n ],\n riskThreshold: 'moderate',\n maxConcurrentTasks: 10,\n };\n\n const contentAgent = new ContentGenerationAgent(contentConfig, broker, registry, protocol);\n if (this.riskClassifier) contentAgent.setRiskClassifier(this.riskClassifier);\n if (this.auditLogger) contentAgent.setAuditLogger(this.auditLogger);\n await this.server.registerAgent(contentAgent);\n\n // Workflow Automation Agent\n const workflowConfig: AgentConfig = {\n id: 'workflow-001',\n type: 'WorkflowAutomationAgent',\n model: 'gpt-4o',\n enabled: true,\n systemPrompt: 'Workflow automation specialist',\n capabilities: [\n 'data-export',\n 'report-generation',\n 'bulk-operation',\n 'scheduled-task',\n 'integration',\n ],\n riskThreshold: 'high',\n maxConcurrentTasks: 5,\n };\n\n const workflowAgent = new WorkflowAutomationAgent(workflowConfig, broker, registry, protocol);\n if (this.riskClassifier) workflowAgent.setRiskClassifier(this.riskClassifier);\n if (this.auditLogger) workflowAgent.setAuditLogger(this.auditLogger);\n await this.server.registerAgent(workflowAgent);\n\n // FAQ Agent\n const faqConfig: AgentConfig = {\n id: 'faq-001',\n type: 'FAQAgent',\n model: 'knowledge-base',\n enabled: true,\n systemPrompt: 'Retrieve answers from the self-serve FAQ knowledge base',\n capabilities: ['faq', 'documentation-lookup', 'self-serve-support'],\n riskThreshold: 'safe',\n maxConcurrentTasks: 25,\n };\n\n const faqAgent = new FAQAgent(\n faqConfig,\n broker,\n registry,\n protocol,\n this.workspace || undefined\n );\n if (this.workspace) {\n faqAgent.setWorkspace(this.workspace);\n }\n await this.server.registerAgent(faqAgent);\n\n // Launch Kit Reminder Agent\n const launchKitConfig: AgentConfig = {\n id: 'launchkit-001',\n type: 'LaunchKitReminderAgent',\n model: 'knowledge-base',\n enabled: true,\n systemPrompt:\n 'Surface launch kit tasks that need attention based on ownership tracker tables',\n capabilities: ['launch-kit-reminder', 'status-summary', 'ops-alert'],\n riskThreshold: 'safe',\n maxConcurrentTasks: 15,\n };\n\n const launchKitAgent = new LaunchKitReminderAgent(\n launchKitConfig,\n broker,\n registry,\n protocol,\n this.workspace || undefined\n );\n if (this.workspace) {\n launchKitAgent.setWorkspace(this.workspace);\n }\n await this.server.registerAgent(launchKitAgent);\n\n // Personalization Agent\n const personalizationConfig: AgentConfig = {\n id: 'personalization-001',\n type: 'PersonalizationAgent',\n model: 'gpt-4o',\n enabled: true,\n systemPrompt: 'Personalization and recommendation specialist',\n capabilities: [\n 'content-recommendations',\n 'product-suggestions',\n 'ui-customization',\n 'notifications',\n ],\n riskThreshold: 'safe',\n maxConcurrentTasks: 15,\n };\n\n const personalizationAgent = new PersonalizationAgent(\n personalizationConfig,\n broker,\n registry,\n protocol\n );\n if (this.auditLogger) personalizationAgent.setAuditLogger(this.auditLogger);\n await this.server.registerAgent(personalizationAgent);\n\n this.logger.info('User-facing agents registered', {\n agents: [\n 'chatbot-001',\n 'content-gen-001',\n 'workflow-001',\n 'faq-001',\n 'launchkit-001',\n 'personalization-001',\n ],\n });\n }\n\n /**\n * Initialize coordination agents (Phase 5)\n */\n private async initializeCoordinationAgents(): Promise<void> {\n if (!this.server) return;\n\n const broker = this.server.getMessageBroker();\n const registry = this.server.getAgentRegistry();\n const protocol = this.server.getProtocolHandler();\n\n // Initialize multi-agent workflow engine\n this.multiAgentWorkflow = new MultiAgentWorkflow();\n\n this.logger.info('Coordination agents initialized', {\n components: [\n 'TaskCoordinatorAgent',\n 'SupervisorAgent',\n 'LearningCoordinatorAgent',\n 'MultiAgentWorkflow',\n ],\n });\n }\n\n /**\n * Register coordination agents (Phase 5)\n */\n private async registerCoordinationAgents(\n broker: MessageBroker,\n registry: AgentRegistry,\n protocol: ProtocolHandler\n ): Promise<void> {\n if (!this.server) return;\n\n // Task Coordinator Agent\n const taskCoordinatorConfig: AgentConfig = {\n id: 'task-coordinator-001',\n type: 'TaskCoordinatorAgent',\n model: 'claude-3-5-sonnet-20241022',\n enabled: true,\n systemPrompt: 'Task coordination specialist for multi-agent workflows',\n capabilities: ['decompose', 'coordinate', 'execute-plan'],\n riskThreshold: 'moderate',\n maxConcurrentTasks: 3,\n };\n\n this.taskCoordinator = new TaskCoordinatorAgent(\n taskCoordinatorConfig,\n broker,\n registry,\n protocol\n );\n if (this.workspace) {\n this.taskCoordinator.setWorkspace(this.workspace);\n }\n await this.server.registerAgent(this.taskCoordinator);\n\n // Supervisor Agent\n const supervisorConfig: AgentConfig = {\n id: 'supervisor-001',\n type: 'SupervisorAgent',\n model: 'gpt-4o',\n enabled: true,\n systemPrompt: 'Safety and compliance supervisor',\n capabilities: ['supervise', 'review', 'approve', 'reject'],\n riskThreshold: 'critical',\n maxConcurrentTasks: 10,\n };\n\n this.supervisor = new SupervisorAgent(supervisorConfig, broker, registry, protocol);\n if (this.riskClassifier) {\n this.supervisor.setRiskClassifier(this.riskClassifier);\n }\n if (this.approvalWorkflow) {\n this.supervisor.setApprovalWorkflow(this.approvalWorkflow);\n }\n await this.server.registerAgent(this.supervisor);\n\n // Learning Coordinator Agent\n const learningCoordinatorConfig: AgentConfig = {\n id: 'learning-coordinator-001',\n type: 'LearningCoordinatorAgent',\n model: 'claude-3-5-sonnet-20241022',\n enabled: true,\n systemPrompt: 'Cross-agent learning coordinator',\n capabilities: ['transfer-knowledge', 'find-similar', 'share-pattern', 'optimize-all'],\n riskThreshold: 'safe',\n maxConcurrentTasks: 5,\n };\n\n this.learningCoordinator = new LearningCoordinatorAgent(\n learningCoordinatorConfig,\n broker,\n registry,\n protocol\n );\n if (this.experienceLibrary) {\n this.learningCoordinator.setExperienceLibrary(this.experienceLibrary);\n }\n if (this.reinforcementLearning) {\n this.learningCoordinator.setReinforcementLearning(this.reinforcementLearning);\n }\n await this.server.registerAgent(this.learningCoordinator);\n\n // Connect workflow engine to coordination agents\n if (this.multiAgentWorkflow) {\n this.multiAgentWorkflow.setTaskCoordinator(this.taskCoordinator);\n this.multiAgentWorkflow.setSupervisor(this.supervisor);\n }\n\n this.logger.info('Coordination agents registered', {\n agents: ['task-coordinator-001', 'supervisor-001', 'learning-coordinator-001'],\n });\n }\n\n private static readonly SERVER_NOT_INITIALIZED_ERROR = 'MCP Server not initialized';\n\n /**\n * Execute a task via MCP\n */\n async executeTask(task: Partial<AgentTask>) {\n if (!this.server) {\n throw new Error(MCPService.SERVER_NOT_INITIALIZED_ERROR);\n }\n\n const startTime = Date.now();\n const agentId = task.agentId || 'unknown';\n\n // Record task start\n if (this.agentOps) {\n this.agentOps.recordTaskStart(agentId);\n }\n\n try {\n const result = await this.server.executeTask(task);\n const executionTime = Date.now() - startTime;\n\n // Record task execution\n if (this.agentOps) {\n const agentStatus = this.server.getAgentStatus(agentId);\n this.agentOps.recordTaskExecution(\n agentId,\n agentStatus?.type || 'unknown',\n task as AgentTask,\n result,\n executionTime\n );\n }\n\n // Learn from outcome (Phase 4)\n if (this.reinforcementLearning && task.agentId && task.type) {\n await this.reinforcementLearning.learnFromOutcome(\n task.agentId,\n task.type,\n task as AgentTask,\n result,\n {\n executionTime,\n success: result.success !== false,\n }\n );\n }\n\n // Store successful experience (Phase 4)\n if (this.experienceLibrary && task.agentId && task.type && result.success !== false) {\n // Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed\n await this.experienceLibrary.addExperience(\n task.agentId,\n task.type,\n (task.payload || {}) as Record<string, unknown>,\n result,\n {\n executionTime,\n success: true,\n outcome: 'success',\n },\n []\n );\n }\n\n return result;\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n // Record failed task\n if (this.agentOps) {\n const agentStatus = this.server.getAgentStatus(agentId);\n this.agentOps.recordTaskExecution(\n agentId,\n agentStatus?.type || 'unknown',\n task as AgentTask,\n {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n executionTime\n );\n }\n\n throw error;\n }\n }\n\n /**\n * Get agent status\n */\n getAgentStatus(agentId: string) {\n if (!this.server) {\n throw new Error(MCPService.SERVER_NOT_INITIALIZED_ERROR);\n }\n\n return this.server.getAgentStatus(agentId);\n }\n\n /**\n * Get all agents status\n */\n getAllAgentsStatus() {\n if (!this.server) {\n throw new Error(MCPService.SERVER_NOT_INITIALIZED_ERROR);\n }\n\n return this.server.getAllAgentsStatus();\n }\n\n /**\n * Get server statistics\n */\n getStatistics() {\n if (!this.server) {\n throw new Error(MCPService.SERVER_NOT_INITIALIZED_ERROR);\n }\n\n return this.server.getStatistics();\n }\n\n /**\n * Get pending approval requests\n */\n async getPendingApprovals(): Promise<ApprovalRequest[]> {\n if (!this.approvalWorkflow) {\n throw new Error('Approval workflow not initialized');\n }\n\n return await this.approvalWorkflow.getPendingRequests();\n }\n\n /**\n * Approve a task\n */\n async approveTask(requestId: string, userId: string, userRole: string): Promise<ApprovalRequest> {\n if (!this.approvalWorkflow) {\n throw new Error('Approval workflow not initialized');\n }\n\n const approved = await this.approvalWorkflow.approve(requestId, userId, userRole);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n agentId: approved.agentId,\n taskId: approved.taskId,\n taskType: 'approval',\n riskLevel: approved.riskLevel,\n action: 'approved',\n userId,\n userRole,\n });\n }\n\n return approved;\n }\n\n /**\n * Reject a task\n */\n async rejectTask(\n requestId: string,\n userId: string,\n userRole: string,\n reason: string\n ): Promise<ApprovalRequest> {\n if (!this.approvalWorkflow) {\n throw new Error('Approval workflow not initialized');\n }\n\n const rejected = await this.approvalWorkflow.reject(requestId, userId, userRole, reason);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n agentId: rejected.agentId,\n taskId: rejected.taskId,\n taskType: 'approval',\n riskLevel: rejected.riskLevel,\n action: 'rejected',\n userId,\n userRole,\n metadata: { reason },\n });\n }\n\n return rejected;\n }\n\n /**\n * Get audit log\n */\n async getAuditLog(query?: Parameters<AuditLogger['query']>[0]) {\n if (!this.auditLogger) {\n throw new Error('Audit logger not initialized');\n }\n\n return await this.auditLogger.query(query || {});\n }\n\n /**\n * Rollback a task\n */\n async rollbackTask(taskId: string) {\n if (!this.rollbackManager) {\n throw new Error('Rollback manager not initialized');\n }\n\n return await this.rollbackManager.rollbackTask(taskId);\n }\n\n /**\n * Health check\n */\n async getHealth() {\n if (!this.server) {\n return {\n status: 'unhealthy' as const,\n message: 'MCP Server not initialized',\n };\n }\n\n const health = await this.server.healthCheck();\n return {\n status: health.status,\n message: `MCP Server is ${health.status}`,\n details: health,\n };\n }\n\n /**\n * Cleanup\n */\n async cleanup(): Promise<void> {\n if (this.auditLogger) {\n await this.auditLogger.shutdown();\n this.auditLogger = null;\n }\n\n if (this.approvalWorkflow) {\n await this.approvalWorkflow.shutdown();\n this.approvalWorkflow = null;\n }\n\n if (this.rollbackManager) {\n await this.rollbackManager.shutdown();\n this.rollbackManager = null;\n }\n\n if (this.toolDiscovery) {\n await this.toolDiscovery.shutdown();\n this.toolDiscovery = null;\n }\n\n if (this.codeSandbox) {\n await this.codeSandbox.shutdown();\n this.codeSandbox = null;\n }\n\n if (this.workspace) {\n await this.workspace.shutdown();\n this.workspace = null;\n }\n\n if (this.skillsRegistry) {\n await this.skillsRegistry.shutdown();\n this.skillsRegistry = null;\n }\n\n if (this.tokenizationService) {\n await this.tokenizationService.shutdown();\n this.tokenizationService = null;\n }\n\n if (this.server) {\n await this.server.shutdown();\n this.server = null;\n }\n\n this.riskClassifier = null;\n\n this.logger.info('MCPService cleaned up');\n }\n\n /**\n * Get MCP server instance (for advanced usage)\n */\n getServer(): MCPServer | null {\n return this.server;\n }\n\n /**\n * Get safety components\n */\n getSafetyComponents() {\n return {\n riskClassifier: this.riskClassifier,\n auditLogger: this.auditLogger,\n approvalWorkflow: this.approvalWorkflow,\n rollbackManager: this.rollbackManager,\n };\n }\n\n /**\n * Get tool discovery service\n */\n getToolDiscovery(): ToolDiscoveryService | null {\n return this.toolDiscovery;\n }\n\n /**\n * Get code execution sandbox\n */\n getCodeSandbox(): CodeExecutionSandbox | null {\n return this.codeSandbox;\n }\n\n /**\n * Get Phase 4: Self-Improvement components\n */\n getSelfImprovementComponents() {\n return {\n experienceLibrary: this.experienceLibrary,\n reinforcementLearning: this.reinforcementLearning,\n agentOps: this.agentOps,\n feedbackCollector: this.feedbackCollector,\n };\n }\n\n /**\n * Get agent metrics (Phase 4)\n */\n getAgentMetrics(agentId: string) {\n if (!this.agentOps) {\n throw new Error('AgentOps not initialized');\n }\n return this.agentOps.getAgentMetrics(agentId);\n }\n\n /**\n * Get system metrics (Phase 4)\n */\n getSystemMetrics() {\n if (!this.agentOps) {\n throw new Error('AgentOps not initialized');\n }\n return this.agentOps.getSystemMetrics();\n }\n\n /**\n * Get performance alerts (Phase 4)\n */\n getPerformanceAlerts(severity?: 'low' | 'medium' | 'high' | 'critical') {\n if (!this.agentOps) {\n throw new Error('AgentOps not initialized');\n }\n return this.agentOps.getActiveAlerts(severity);\n }\n\n /**\n * Get optimization recommendations (Phase 4)\n */\n getOptimizationRecommendations() {\n if (!this.agentOps) {\n throw new Error('AgentOps not initialized');\n }\n return this.agentOps.getOptimizationRecommendations();\n }\n\n /**\n * Submit feedback (Phase 4)\n */\n submitFeedback(\n agentId: string,\n agentType: string,\n taskId: string,\n taskType: string,\n type: 'rating' | 'approval' | 'comment' | 'correction',\n data: {\n rating?: number;\n approved?: boolean;\n comment?: string;\n correction?: TaskResult;\n userId?: string;\n }\n ): string {\n if (!this.feedbackCollector) {\n throw new Error('FeedbackCollector not initialized');\n }\n return this.feedbackCollector.submitFeedback(agentId, agentType, taskId, taskType, type, data);\n }\n\n /**\n * Get feedback statistics (Phase 4)\n */\n getFeedbackStats(agentType?: string) {\n if (!this.feedbackCollector) {\n throw new Error('FeedbackCollector not initialized');\n }\n return this.feedbackCollector.getStats(agentType);\n }\n\n /**\n * Get Phase 5: Coordination components\n */\n getCoordinationComponents() {\n return {\n taskCoordinator: this.taskCoordinator,\n supervisor: this.supervisor,\n learningCoordinator: this.learningCoordinator,\n multiAgentWorkflow: this.multiAgentWorkflow,\n };\n }\n\n /**\n * Create multi-agent workflow (Phase 5)\n */\n async createWorkflow(\n name: string,\n description: string,\n initialTask: AgentTask,\n mode: 'sequential' | 'parallel' | 'conditional' = 'sequential'\n ) {\n if (!this.multiAgentWorkflow) {\n throw new Error('Multi-agent workflow not initialized');\n }\n return await this.multiAgentWorkflow.createWorkflow(name, description, initialTask, mode);\n }\n\n /**\n * Execute multi-agent workflow (Phase 5)\n */\n async executeWorkflow(workflowId: string) {\n if (!this.multiAgentWorkflow) {\n throw new Error('Multi-agent workflow not initialized');\n }\n return await this.multiAgentWorkflow.executeWorkflow(workflowId);\n }\n\n /**\n * Get workflow by ID (Phase 5)\n */\n getWorkflow(workflowId: string) {\n if (!this.multiAgentWorkflow) {\n throw new Error('Multi-agent workflow not initialized');\n }\n return this.multiAgentWorkflow.getWorkflow(workflowId);\n }\n\n /**\n * Get workspace service\n */\n getWorkspace(): AgentWorkspaceService | null {\n return this.workspace;\n }\n\n /**\n * Get skills registry\n */\n getSkillsRegistry(): SkillsRegistry | null {\n return this.skillsRegistry;\n }\n\n /**\n * Get tokenization service\n */\n getTokenizationService(): PrivacyTokenizationService | null {\n return this.tokenizationService;\n }\n}\n","/**\n * LearningCoordinatorAgent - Cross-agent learning\n *\n * Coordinates learning across multiple agents to share knowledge and improve performance.\n *\n * @module agents/coordination/LearningCoordinatorAgent\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { AgentRegistry } from '../../core/AgentRegistry';\nimport type { MessageBroker } from '../../core/MessageBroker';\nimport type { ProtocolHandler } from '../../core/ProtocolHandler';\nimport type { AgentConfig } from '../../types/agents';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\nimport type { Experience, ExperienceLibrary } from '../self-improvement/ExperienceLibrary';\nimport type { ReinforcementLearning } from '../self-improvement/ReinforcementLearning';\n\nconst logger = createServiceLogger('LearningCoordinatorAgent');\n\n/**\n * Learning transfer\n */\nexport interface LearningTransfer {\n /** Source agent type */\n sourceAgentType: string;\n /** Target agent type */\n targetAgentType: string;\n /** Knowledge type */\n knowledgeType: 'pattern' | 'parameter' | 'strategy';\n /** Knowledge data */\n // Using Record<string, unknown> because knowledge transfer data structure varies by knowledge type and cannot be strictly typed\n knowledge: /* Using Record<string, unknown> because knowledge transfer data structure varies by knowledge type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n /** Transfer confidence */\n confidence: number;\n /** Timestamp */\n timestamp: Date;\n}\n\n/**\n * LearningCoordinatorAgent - Coordinates cross-agent learning\n */\nexport class LearningCoordinatorAgent extends BaseAgent {\n private experienceLibrary?: ExperienceLibrary;\n private reinforcementLearning?: ReinforcementLearning;\n private learningTransfers: LearningTransfer[] = [];\n\n /**\n * Set experience library\n */\n setExperienceLibrary(library: ExperienceLibrary): void {\n this.experienceLibrary = library;\n }\n\n /**\n * Set reinforcement learning\n */\n setReinforcementLearning(rl: ReinforcementLearning): void {\n this.reinforcementLearning = rl;\n }\n\n /**\n * Execute learning coordination task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n try {\n const payload = task.payload as {\n action: 'transfer-knowledge' | 'find-similar' | 'share-pattern' | 'optimize-all';\n sourceAgentType?: string;\n targetAgentType?: string;\n // Using Record<string, unknown> because learning pattern structure varies by pattern type and cannot be strictly typed\n pattern?: /* Using Record<string, unknown> because learning pattern structure varies by pattern type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n };\n\n switch (payload.action) {\n case 'transfer-knowledge':\n return await this.transferKnowledge(payload.sourceAgentType!, payload.targetAgentType!);\n case 'find-similar':\n return await this.findSimilarPatterns(payload.pattern!);\n case 'share-pattern':\n return await this.sharePattern(payload.pattern!);\n case 'optimize-all':\n return await this.optimizeAllAgents();\n default:\n throw new Error(`Unknown action: ${payload.action}`);\n }\n } catch (error) {\n logger.error('Learning coordination failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n taskId: task.id,\n });\n throw error;\n }\n }\n\n /**\n * Transfer knowledge from one agent type to another\n */\n private async transferKnowledge(\n sourceAgentType: string,\n targetAgentType: string\n ): Promise<TaskResult> {\n try {\n if (!this.experienceLibrary || !this.reinforcementLearning) {\n throw new Error('Experience library or reinforcement learning not initialized');\n }\n\n // Get successful experiences from source agent\n // Use findSimilar with a broad query to get all experiences for the agent type\n const sourceExperiences: Experience[] = [];\n // Try multiple task types to get all experiences\n const taskTypes = ['generate', 'refactor', 'document', 'unknown'];\n for (const taskType of taskTypes) {\n const similar = await this.experienceLibrary.findSimilar(\n sourceAgentType,\n taskType,\n {},\n 100 // Large limit to get all experiences\n );\n sourceExperiences.push(...similar.filter(exp => exp.metrics.success));\n }\n // Remove duplicates by ID\n const uniqueExperiences = Array.from(\n new Map(sourceExperiences.map(exp => [exp.id, exp])).values()\n );\n\n if (uniqueExperiences.length === 0) {\n return {\n success: false,\n error: `No successful experiences found for ${sourceAgentType}`,\n };\n }\n\n // Extract patterns from successful experiences\n const patterns = this.extractPatterns(uniqueExperiences);\n\n // Find similar experiences in target agent\n const targetPatterns: Experience[] = [];\n for (const pattern of patterns) {\n const similar = await this.experienceLibrary.findSimilar(\n targetAgentType,\n pattern.taskType,\n pattern.payload,\n 3\n );\n targetPatterns.push(...similar);\n }\n\n // Calculate transfer confidence\n const confidence = this.calculateTransferConfidence(uniqueExperiences, targetPatterns);\n\n // Create learning transfer\n const transfer: LearningTransfer = {\n sourceAgentType,\n targetAgentType,\n knowledgeType: 'pattern',\n knowledge: { patterns },\n confidence,\n timestamp: new Date(),\n };\n\n this.learningTransfers.push(transfer);\n\n logger.info('Knowledge transferred between agents', {\n sourceAgentType,\n targetAgentType,\n confidence,\n patternCount: patterns.length,\n });\n\n return {\n success: true,\n data: {\n transfer,\n patternsTransferred: patterns.length,\n confidence,\n },\n };\n } catch (error) {\n logger.error('Failed to transfer knowledge', {\n error: error instanceof Error ? error.message : 'Unknown error',\n sourceAgentType,\n targetAgentType,\n });\n throw error;\n }\n }\n\n /**\n * Find similar patterns across agents\n */\n // Using Record<string, unknown> because learning pattern structure varies by pattern type and cannot be strictly typed\n private async findSimilarPatterns(\n pattern: /* Using Record<string, unknown> because learning pattern structure varies by pattern type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<TaskResult> {\n try {\n if (!this.experienceLibrary) {\n throw new Error('Experience library not initialized');\n }\n\n // Search across all agent types\n const allSimilar: Array<Experience & { agentType: string }> = [];\n const agentTypes = ['CodeGenerationAgent', 'RefactoringAgent', 'DocumentationAgent'];\n\n for (const agentType of agentTypes) {\n const similar = await this.experienceLibrary.findSimilar(agentType, 'unknown', pattern, 5);\n allSimilar.push(...similar.map(exp => ({ ...exp, agentType })));\n }\n\n // Sort by similarity (if available) or success rate\n allSimilar.sort((a, b) => {\n const scoreA = a.metrics?.successRate || 0;\n const scoreB = b.metrics?.successRate || 0;\n return scoreB - scoreA;\n });\n\n return {\n success: true,\n data: {\n similarPatterns: allSimilar.slice(0, 10),\n totalFound: allSimilar.length,\n },\n };\n } catch (error) {\n logger.error('Failed to find similar patterns', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Share pattern across all agents\n */\n // Using Record<string, unknown> because learning pattern structure varies by pattern type and cannot be strictly typed\n private async sharePattern(\n pattern: /* Using Record<string, unknown> because learning pattern structure varies by pattern type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<TaskResult> {\n try {\n if (!this.experienceLibrary) {\n throw new Error('Experience library not initialized');\n }\n\n // Add pattern to experience library for all agent types\n const agentTypes = ['CodeGenerationAgent', 'RefactoringAgent', 'DocumentationAgent'];\n const sharedIds: string[] = [];\n\n for (const agentType of agentTypes) {\n const id = await this.experienceLibrary.addExperience(\n agentType,\n 'shared-pattern',\n pattern,\n { success: true },\n {\n executionTime: 0,\n success: true,\n outcome: 'success',\n },\n ['shared', 'cross-agent']\n );\n if (id) {\n sharedIds.push(id);\n }\n }\n\n return {\n success: true,\n data: {\n sharedIds,\n agentTypes,\n pattern,\n },\n };\n } catch (error) {\n logger.error('Failed to share pattern', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Optimize all agents using shared learning\n */\n private async optimizeAllAgents(): Promise<TaskResult> {\n try {\n if (!this.reinforcementLearning) {\n throw new Error('Reinforcement learning not initialized');\n }\n\n const policies = this.reinforcementLearning.getPolicies();\n const optimizations: Array<{\n agentType: string;\n taskType: string;\n // Using Record<string, unknown> because agent optimizations structure varies by agent type and cannot be strictly typed\n optimizations: /* Using Record<string, unknown> because agent optimizations structure varies by agent type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n }> = [];\n\n for (const policy of policies) {\n const optimizedParams = this.reinforcementLearning.getOptimizedParameters(\n policy.agentType,\n policy.taskType\n );\n\n optimizations.push({\n agentType: policy.agentType,\n taskType: policy.taskType,\n optimizations: optimizedParams,\n });\n }\n\n return {\n success: true,\n data: {\n optimizations,\n totalAgents: policies.length,\n },\n };\n } catch (error) {\n logger.error('Failed to optimize all agents', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Extract patterns from experiences\n */\n // Using Record<string, unknown> because pattern payload structure varies by pattern type and cannot be strictly typed\n private extractPatterns(experiences: Experience[]): Array<{\n taskType: string;\n payload: /* Using Record<string, unknown> because pattern payload structure varies by pattern type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n }> {\n // Extract common patterns from successful experiences\n // Using Record<string, unknown> because pattern payload structure varies by pattern type and cannot be strictly typed\n const patterns: Array<{\n taskType: string;\n payload: /* Using Record<string, unknown> because pattern payload structure varies by pattern type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n }> = [];\n\n for (const exp of experiences) {\n patterns.push({\n taskType: exp.taskType,\n payload: exp.payload,\n });\n }\n\n return patterns;\n }\n\n /**\n * Calculate transfer confidence\n */\n private calculateTransferConfidence(\n sourceExperiences: Experience[],\n targetPatterns: Experience[]\n ): number {\n // Confidence based on similarity of patterns\n if (targetPatterns.length === 0) {\n return 0.3; // Low confidence if no similar patterns\n }\n\n const similarityScore = targetPatterns.length / sourceExperiences.length;\n return Math.min(similarityScore, 1.0);\n }\n\n /**\n * Get learning transfers\n */\n getLearningTransfers(): LearningTransfer[] {\n return this.learningTransfers;\n }\n}\n","/**\n * BaseAgent - Abstract base class for all agents\n */\n\nimport type { AgentRegistry } from '../core/AgentRegistry';\nimport type { AgentWorkspaceService } from '../core/AgentWorkspaceService';\nimport type { MessageBroker } from '../core/MessageBroker';\nimport type { ProtocolHandler } from '../core/ProtocolHandler';\nimport type { AgentConfig, AgentHealth, AgentStatus } from '../types/agents';\nimport type { AgentEvent, AgentMessage, AgentResponse } from '../types/messages';\nimport type { AgentTask, TaskResult } from '../types/tasks';\n\nexport abstract class BaseAgent {\n protected config: AgentConfig;\n protected broker: MessageBroker;\n protected registry: AgentRegistry;\n protected protocol: ProtocolHandler;\n protected workspace: AgentWorkspaceService | null = null;\n protected status: AgentStatus = 'idle';\n protected tasksInProgress: Map<string, AgentTask> = new Map();\n private pollingInterval?: NodeJS.Timeout;\n private subscriptionIds: string[] = [];\n\n // Metrics\n private startTime: number = Date.now();\n private tasksCompleted: number = 0;\n private tasksFailed: number = 0;\n private totalExecutionTime: number = 0;\n\n constructor(\n config: AgentConfig,\n broker: MessageBroker,\n registry: AgentRegistry,\n protocol: ProtocolHandler,\n workspace?: AgentWorkspaceService\n ) {\n this.config = config;\n this.broker = broker;\n this.registry = registry;\n this.protocol = protocol;\n this.workspace = workspace || null;\n }\n\n /**\n * Set workspace service\n */\n setWorkspace(workspace: AgentWorkspaceService): void {\n this.workspace = workspace;\n }\n\n /**\n * Initialize the agent\n */\n async initialize(): Promise<void> {\n // Register with agent registry\n this.registry.register({\n id: this.config.id,\n type: this.config.type,\n status: 'idle',\n capabilities: this.config.capabilities,\n currentTasks: 0,\n maxConcurrentTasks: this.config.maxConcurrentTasks,\n metadata: this.config.metadata,\n });\n\n // Subscribe to relevant events\n await this.subscribeToEvents();\n\n // Start polling for messages\n this.startMessagePolling();\n\n // Start heartbeat\n this.startHeartbeat();\n\n // Agent initialization logged by registry\n }\n\n /**\n * Shutdown the agent\n */\n async shutdown(): Promise<void> {\n // Stop polling\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n // Unsubscribe from events\n for (const id of this.subscriptionIds) {\n this.broker.unsubscribe(id);\n }\n\n // Unregister from registry\n this.registry.unregister(this.config.id);\n\n // Agent shutdown logged by registry\n }\n\n /**\n * Process a message\n */\n async processMessage(message: AgentMessage): Promise<AgentResponse> {\n const startTime = Date.now();\n\n try {\n // Check if agent can accept task\n if (!this.registry.canAcceptTask(this.config.id)) {\n return this.protocol.createErrorResponse(message.id, -32000, 'Agent at capacity');\n }\n\n // Create task\n const task: AgentTask = {\n id: message.params.taskId,\n agentId: this.config.id,\n type: message.method,\n payload: message.params.payload,\n priority: message.params.priority,\n riskLevel: message.params.riskLevel,\n requiresApproval: message.params.requiresApproval,\n status: 'pending',\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n\n // Track task\n this.tasksInProgress.set(task.id, task);\n this.registry.incrementTasks(this.config.id);\n\n // Execute task\n task.status = 'processing';\n task.startedAt = Date.now();\n task.updatedAt = Date.now();\n\n const result = await this.executeTask(task);\n\n // Update task with result\n task.status = 'completed';\n task.completedAt = Date.now();\n task.result = result.data;\n task.updatedAt = Date.now();\n\n // Update metrics\n const executionTime = Date.now() - startTime;\n this.recordSuccess(executionTime);\n\n // Clean up\n this.tasksInProgress.delete(task.id);\n this.registry.decrementTasks(this.config.id);\n\n // Return success response\n return this.protocol.createSuccessResponse(message.id, result);\n } catch (error) {\n const executionTime = Date.now() - startTime;\n this.recordFailure(executionTime);\n\n // Update task as failed\n const task = this.tasksInProgress.get(message.params.taskId);\n if (task) {\n task.status = 'failed';\n task.error = error instanceof Error ? error.message : 'Unknown error';\n task.updatedAt = Date.now();\n this.tasksInProgress.delete(task.id);\n this.registry.decrementTasks(this.config.id);\n }\n\n return this.protocol.createInternalError(\n message.id,\n error instanceof Error ? error : new Error('Unknown error')\n );\n }\n }\n\n /**\n * Abstract method: Execute task (must be implemented by subclasses)\n */\n protected abstract executeTask(task: AgentTask): Promise<TaskResult>;\n\n /**\n * Abstract method: Subscribe to events (can be overridden by subclasses)\n */\n protected async subscribeToEvents(): Promise<void> {\n // Default: no subscriptions\n // Subclasses can override to subscribe to specific events\n }\n\n /**\n * Publish an event\n */\n protected async publishEvent(type: string, payload: unknown): Promise<void> {\n const event: AgentEvent = {\n type,\n agentId: this.config.id,\n payload,\n timestamp: Date.now(),\n };\n await this.broker.publish(event);\n }\n\n /**\n * Get agent health status\n */\n getHealth(): AgentHealth {\n const uptime = Date.now() - this.startTime;\n const avgResponseTime =\n this.tasksCompleted + this.tasksFailed > 0\n ? this.totalExecutionTime / (this.tasksCompleted + this.tasksFailed)\n : 0;\n\n let healthStatus: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';\n\n // Determine health based on metrics\n const errorRate = this.tasksFailed / (this.tasksCompleted + this.tasksFailed || 1);\n if (errorRate > 0.5) {\n healthStatus = 'unhealthy';\n } else if (errorRate > 0.2) {\n healthStatus = 'degraded';\n }\n\n return {\n agentId: this.config.id,\n status: healthStatus,\n uptime,\n tasksCompleted: this.tasksCompleted,\n tasksFailed: this.tasksFailed,\n averageResponseTime: avgResponseTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Start polling for messages\n */\n private startMessagePolling(): void {\n this.pollingInterval = setInterval(async () => {\n try {\n // Only poll if we can accept more tasks\n if (this.registry.canAcceptTask(this.config.id)) {\n const queuedMessage = await this.broker.dequeue(this.config.id);\n\n if (queuedMessage) {\n const response = await this.processMessage(queuedMessage.message);\n\n // Update message status\n if (response.error) {\n await this.broker.markFailed(queuedMessage.id, response.error.message);\n } else {\n await this.broker.updateMessageStatus(queuedMessage.id, 'completed', response.result);\n }\n }\n }\n } catch (error) {\n // Error polling messages - log but continue\n\n console.error(`Error polling messages for ${this.config.id}:`, error);\n }\n }, 1000); // Poll every second\n }\n\n /**\n * Start heartbeat\n */\n private startHeartbeat(): void {\n setInterval(() => {\n this.registry.heartbeat(this.config.id);\n\n // Update health in registry\n const health = this.getHealth();\n this.registry.updateHealth(this.config.id, health);\n }, 10000); // Every 10 seconds\n }\n\n /**\n * Record successful task\n */\n private recordSuccess(executionTime: number): void {\n this.tasksCompleted++;\n this.totalExecutionTime += executionTime;\n this.registry.recordTaskCompletion(this.config.id, true, executionTime);\n }\n\n /**\n * Record failed task\n */\n private recordFailure(executionTime: number): void {\n this.tasksFailed++;\n this.totalExecutionTime += executionTime;\n this.registry.recordTaskCompletion(this.config.id, false, executionTime);\n }\n\n /**\n * Get current status\n */\n getStatus(): AgentStatus {\n return this.status;\n }\n\n /**\n * Get current tasks\n */\n getCurrentTasks(): AgentTask[] {\n return Array.from(this.tasksInProgress.values());\n }\n\n private static readonly WORKSPACE_ERROR_MESSAGE = 'Workspace service not available';\n\n /**\n * Workspace API - Read file from workspace\n */\n async readFile(filePath: string): Promise<string> {\n if (!this.workspace) {\n throw new Error(BaseAgent.WORKSPACE_ERROR_MESSAGE);\n }\n return await this.workspace.readFile(this.config.id, filePath);\n }\n\n /**\n * Workspace API - Write file to workspace\n */\n async writeFile(filePath: string, content: string | Buffer): Promise<void> {\n if (!this.workspace) {\n throw new Error(BaseAgent.WORKSPACE_ERROR_MESSAGE);\n }\n return await this.workspace.writeFile(this.config.id, filePath, content);\n }\n\n /**\n * Workspace API - List files in workspace\n */\n async listFiles(\n pattern?: string\n ): Promise<Array<{ path: string; size: number; createdAt: number; modifiedAt: number }>> {\n if (!this.workspace) {\n throw new Error(BaseAgent.WORKSPACE_ERROR_MESSAGE);\n }\n return await this.workspace.listFiles(this.config.id, pattern);\n }\n\n /**\n * Workspace API - Delete file from workspace\n */\n async deleteFile(filePath: string): Promise<void> {\n if (!this.workspace) {\n throw new Error(BaseAgent.WORKSPACE_ERROR_MESSAGE);\n }\n return await this.workspace.deleteFile(this.config.id, filePath);\n }\n\n /**\n * Workspace API - Create snapshot\n */\n async createSnapshot(\n snapshotId?: string,\n // Using Record<string, unknown> because agent snapshot metadata structure varies by agent type and cannot be strictly typed\n metadata?: /* Using Record<string, unknown> because agent snapshot metadata structure varies by agent type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<{\n agentId: string;\n snapshotId: string;\n files: Array<{ path: string; size: number; createdAt: number; modifiedAt: number }>;\n // Using Record<string, unknown> because agent snapshot metadata structure varies by agent type and cannot be strictly typed\n metadata: /* Using Record<string, unknown> because agent snapshot metadata structure varies by agent type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n createdAt: number;\n }> {\n if (!this.workspace) {\n throw new Error(BaseAgent.WORKSPACE_ERROR_MESSAGE);\n }\n return await this.workspace.createSnapshot(this.config.id, snapshotId, metadata);\n }\n}\n","/**\n * SupervisorAgent - Safety enforcement\n *\n * Supervises agent operations to ensure safety and compliance.\n *\n * @module agents/coordination/SupervisorAgent\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { AgentRegistry } from '../../core/AgentRegistry';\nimport type { MessageBroker } from '../../core/MessageBroker';\nimport type { ProtocolHandler } from '../../core/ProtocolHandler';\nimport type { ApprovalWorkflow } from '../../safety/ApprovalWorkflow';\nimport type { RiskClassifier } from '../../safety/RiskClassifier';\nimport type { AgentConfig } from '../../types/agents';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nconst logger = createServiceLogger('SupervisorAgent');\n\n/**\n * Supervision result\n */\nexport interface SupervisionResult {\n /** Approved */\n approved: boolean;\n /** Risk level */\n riskLevel: 'safe' | 'moderate' | 'high' | 'critical';\n /** Reasons */\n reasons: string[];\n /** Recommendations */\n recommendations: string[];\n /** Requires approval */\n requiresApproval: boolean;\n}\n\n/**\n * SupervisorAgent - Enforces safety and compliance\n */\nexport class SupervisorAgent extends BaseAgent {\n private riskClassifier?: RiskClassifier;\n private approvalWorkflow?: ApprovalWorkflow;\n private supervisionHistory: Map<string, SupervisionResult> = new Map();\n\n /**\n * Set risk classifier\n */\n setRiskClassifier(classifier: RiskClassifier): void {\n this.riskClassifier = classifier;\n }\n\n /**\n * Set approval workflow\n */\n setApprovalWorkflow(workflow: ApprovalWorkflow): void {\n this.approvalWorkflow = workflow;\n }\n\n /**\n * Execute supervision task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n try {\n const payload = task.payload as {\n action: 'supervise' | 'review' | 'approve' | 'reject';\n taskToSupervise?: AgentTask;\n requestId?: string;\n };\n\n switch (payload.action) {\n case 'supervise':\n return await this.superviseTask(payload.taskToSupervise!);\n case 'review':\n return await this.reviewTask(payload.taskToSupervise!);\n case 'approve':\n return await this.approveRequest(payload.requestId!);\n case 'reject':\n return await this.rejectRequest(payload.requestId!);\n default:\n throw new Error(`Unknown action: ${payload.action}`);\n }\n } catch (error) {\n logger.error('Supervision failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n taskId: task.id,\n });\n throw error;\n }\n }\n\n /**\n * Supervise a task before execution\n */\n private async superviseTask(task: AgentTask): Promise<TaskResult> {\n try {\n const supervision = await this.analyzeTask(task);\n\n // Store supervision result\n this.supervisionHistory.set(task.id, supervision);\n\n // If requires approval, create approval request\n if (supervision.requiresApproval && this.approvalWorkflow) {\n const request = await this.approvalWorkflow.createRequest({\n agentId: task.agentId || 'unknown',\n taskId: task.id,\n taskType: task.type || 'unknown',\n riskLevel: supervision.riskLevel,\n payload: task.payload,\n });\n\n return {\n success: true,\n data: {\n supervision,\n approvalRequired: true,\n approvalRequestId: request.id,\n },\n };\n }\n\n return {\n success: true,\n data: {\n supervision,\n approvalRequired: false,\n canProceed: supervision.approved,\n },\n };\n } catch (error) {\n logger.error('Failed to supervise task', {\n error: error instanceof Error ? error.message : 'Unknown error',\n taskId: task.id,\n });\n throw error;\n }\n }\n\n /**\n * Review a completed task\n */\n private async reviewTask(task: AgentTask): Promise<TaskResult> {\n try {\n // Analyze task and its result\n const supervision = await this.analyzeTask(task);\n\n // Check for compliance issues\n const complianceIssues = this.checkCompliance(task, supervision);\n\n return {\n success: true,\n data: {\n supervision,\n complianceIssues,\n recommendations: supervision.recommendations,\n },\n };\n } catch (error) {\n logger.error('Failed to review task', {\n error: error instanceof Error ? error.message : 'Unknown error',\n taskId: task.id,\n });\n throw error;\n }\n }\n\n /**\n * Analyze task for risks and compliance\n */\n private async analyzeTask(task: AgentTask): Promise<SupervisionResult> {\n const reasons: string[] = [];\n const recommendations: string[] = [];\n let riskLevel: 'safe' | 'moderate' | 'high' | 'critical' = 'safe';\n let approved = true;\n let requiresApproval = false;\n\n // Use risk classifier if available\n if (this.riskClassifier) {\n const risk = await this.riskClassifier.classify(task);\n riskLevel = risk.level;\n\n if (risk.level === 'critical' || risk.level === 'high') {\n approved = false;\n requiresApproval = true;\n reasons.push(`High risk level: ${risk.level}`);\n reasons.push(...risk.reasons);\n }\n }\n\n // Check for dangerous operations\n const dangerousOps = ['delete', 'drop', 'remove', 'destroy', 'cancel'];\n const taskType = task.type?.toLowerCase() || '';\n const payloadStr = JSON.stringify(task.payload || {}).toLowerCase();\n\n for (const op of dangerousOps) {\n if (taskType.includes(op) || payloadStr.includes(op)) {\n riskLevel = riskLevel === 'safe' ? 'moderate' : riskLevel;\n reasons.push(`Potentially dangerous operation detected: ${op}`);\n recommendations.push(`Review ${op} operation carefully before execution`);\n }\n }\n\n // Check for data access patterns\n if (\n payloadStr.includes('password') ||\n payloadStr.includes('secret') ||\n payloadStr.includes('key')\n ) {\n riskLevel = riskLevel === 'safe' ? 'moderate' : riskLevel;\n reasons.push('Sensitive data access detected');\n recommendations.push('Ensure proper access controls are in place');\n }\n\n // Determine if approval required\n if (riskLevel === 'critical' || riskLevel === 'high') {\n requiresApproval = true;\n approved = false;\n } else if (riskLevel === 'moderate' && reasons.length > 2) {\n requiresApproval = true;\n }\n\n return {\n approved,\n riskLevel,\n reasons,\n recommendations,\n requiresApproval,\n };\n }\n\n /**\n * Check compliance with policies\n */\n private checkCompliance(task: AgentTask, supervision: SupervisionResult): string[] {\n const issues: string[] = [];\n\n // Check for policy violations\n if (supervision.riskLevel === 'critical' && supervision.approved) {\n issues.push('Critical risk task was approved without proper review');\n }\n\n // Check execution time (if available in task metadata)\n // Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed\n const executionTime = (\n task.payload as /* Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ).executionTime as number | undefined;\n if (executionTime && executionTime > 60000) {\n issues.push('Task execution time exceeds recommended limit');\n }\n\n return issues;\n }\n\n /**\n * Approve a request\n */\n private async approveRequest(requestId: string): Promise<TaskResult> {\n if (!this.approvalWorkflow) {\n throw new Error('Approval workflow not initialized');\n }\n\n try {\n const request = await this.approvalWorkflow.approve(requestId, 'supervisor', 'super-admin');\n\n return {\n success: true,\n data: {\n requestId: request.id,\n status: 'approved',\n },\n };\n } catch (error) {\n logger.error('Failed to approve request', {\n error: error instanceof Error ? error.message : 'Unknown error',\n requestId,\n });\n throw error;\n }\n }\n\n /**\n * Reject a request\n */\n private async rejectRequest(requestId: string): Promise<TaskResult> {\n if (!this.approvalWorkflow) {\n throw new Error('Approval workflow not initialized');\n }\n\n try {\n const request = await this.approvalWorkflow.reject(\n requestId,\n 'supervisor',\n 'super-admin',\n 'Rejected by supervisor agent'\n );\n\n return {\n success: true,\n data: {\n requestId: request.id,\n status: 'rejected',\n },\n };\n } catch (error) {\n logger.error('Failed to reject request', {\n error: error instanceof Error ? error.message : 'Unknown error',\n requestId,\n });\n throw error;\n }\n }\n\n /**\n * Get supervision history\n */\n getSupervisionHistory(\n taskId?: string\n ): Map<string, SupervisionResult> | SupervisionResult | undefined {\n if (taskId) {\n return this.supervisionHistory.get(taskId);\n }\n return this.supervisionHistory;\n }\n}\n","/**\n * TaskCoordinatorAgent - Decompose complex tasks\n *\n * Breaks down complex tasks into subtasks and coordinates multiple agents.\n *\n * @module agents/coordination/TaskCoordinatorAgent\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { AgentRegistry } from '../../core/AgentRegistry';\nimport type { MessageBroker } from '../../core/MessageBroker';\nimport type { ProtocolHandler } from '../../core/ProtocolHandler';\nimport type { AgentConfig } from '../../types/agents';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nconst logger = createServiceLogger('TaskCoordinatorAgent');\n\n/**\n * Subtask definition\n */\nexport interface Subtask {\n /** Subtask ID */\n id: string;\n /** Agent ID to handle this subtask */\n agentId: string;\n /** Task type */\n taskType: string;\n /** Task payload */\n // Using Record<string, unknown> because subtask payload structure varies by subtask type and cannot be strictly typed\n payload: /* Using Record<string, unknown> because subtask payload structure varies by subtask type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n /** Dependencies (other subtask IDs that must complete first) */\n dependencies: string[];\n /** Status */\n status: 'pending' | 'in_progress' | 'completed' | 'failed';\n /** Result */\n result?: TaskResult;\n}\n\n/**\n * Task coordination plan\n */\nexport interface CoordinationPlan {\n /** Plan ID */\n id: string;\n /** Original task */\n originalTask: AgentTask;\n /** Subtasks */\n subtasks: Subtask[];\n /** Execution order */\n executionOrder: string[];\n /** Status */\n status: 'planning' | 'executing' | 'completed' | 'failed';\n /** Results */\n results: Map<string, TaskResult>;\n}\n\n/**\n * TaskCoordinatorAgent - Coordinates multi-agent task execution\n */\nexport class TaskCoordinatorAgent extends BaseAgent {\n private activePlans: Map<string, CoordinationPlan> = new Map();\n\n /**\n * Execute coordination task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n try {\n const payload = task.payload as {\n action: 'decompose' | 'coordinate' | 'execute-plan';\n task?: AgentTask;\n planId?: string;\n };\n\n switch (payload.action) {\n case 'decompose':\n return await this.decomposeTask(payload.task!);\n case 'coordinate':\n return await this.coordinateExecution(payload.task!);\n case 'execute-plan':\n return await this.executePlan(payload.planId!);\n default:\n throw new Error(`Unknown action: ${payload.action}`);\n }\n } catch (error) {\n logger.error('Task coordination failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n taskId: task.id,\n });\n throw error;\n }\n }\n\n /**\n * Decompose complex task into subtasks\n */\n private async decomposeTask(task: AgentTask): Promise<TaskResult> {\n try {\n // Analyze task and determine required agents\n const requiredAgents = this.analyzeTaskRequirements(task);\n\n // Create subtasks\n const subtasks: Subtask[] = [];\n const executionOrder: string[] = [];\n\n for (let i = 0; i < requiredAgents.length; i++) {\n const agent = requiredAgents[i];\n const subtaskId = `subtask-${task.id}-${i}`;\n\n const subtask: Subtask = {\n id: subtaskId,\n agentId: agent.id,\n taskType: agent.taskType,\n // Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed\n payload: this.extractPayloadForAgent(\n task.payload as /* Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n agent\n ),\n dependencies: i > 0 ? [requiredAgents[i - 1].id] : [],\n status: 'pending',\n };\n\n subtasks.push(subtask);\n executionOrder.push(subtaskId);\n }\n\n // Create coordination plan\n const plan: CoordinationPlan = {\n id: `plan-${task.id}`,\n originalTask: task,\n subtasks,\n executionOrder,\n status: 'planning',\n results: new Map(),\n };\n\n this.activePlans.set(plan.id, plan);\n\n logger.info('Task decomposed into subtasks', {\n taskId: task.id,\n planId: plan.id,\n subtaskCount: subtasks.length,\n });\n\n return {\n success: true,\n data: {\n planId: plan.id,\n subtasks: subtasks.map(s => ({\n id: s.id,\n agentId: s.agentId,\n taskType: s.taskType,\n dependencies: s.dependencies,\n })),\n executionOrder,\n },\n };\n } catch (error) {\n logger.error('Failed to decompose task', {\n error: error instanceof Error ? error.message : 'Unknown error',\n taskId: task.id,\n });\n throw error;\n }\n }\n\n /**\n * Coordinate execution of decomposed task\n */\n private async coordinateExecution(task: AgentTask): Promise<TaskResult> {\n try {\n // First decompose the task\n const decomposeResult = await this.decomposeTask(task);\n const planId = (decomposeResult.data as { planId: string }).planId;\n\n // Then execute the plan\n return await this.executePlan(planId);\n } catch (error) {\n logger.error('Failed to coordinate execution', {\n error: error instanceof Error ? error.message : 'Unknown error',\n taskId: task.id,\n });\n throw error;\n }\n }\n\n /**\n * Execute coordination plan\n */\n private async executePlan(planId: string): Promise<TaskResult> {\n try {\n const plan = this.activePlans.get(planId);\n if (!plan) {\n throw new Error(`Plan not found: ${planId}`);\n }\n\n plan.status = 'executing';\n\n // Execute subtasks in order\n for (const subtaskId of plan.executionOrder) {\n const subtask = plan.subtasks.find(s => s.id === subtaskId);\n if (!subtask) continue;\n\n // Check dependencies\n const dependenciesMet = subtask.dependencies.every(depId => {\n const depSubtask = plan.subtasks.find(s => s.id === depId);\n return depSubtask?.status === 'completed';\n });\n\n if (!dependenciesMet) {\n logger.warn('Dependencies not met for subtask', {\n subtaskId,\n dependencies: subtask.dependencies,\n });\n continue;\n }\n\n // Execute subtask\n subtask.status = 'in_progress';\n\n try {\n const result = await this.executeSubtask(subtask);\n subtask.status = 'completed';\n subtask.result = result;\n plan.results.set(subtaskId, result);\n } catch (error) {\n subtask.status = 'failed';\n plan.status = 'failed';\n\n logger.error('Subtask execution failed', {\n subtaskId,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n success: false,\n error: `Subtask ${subtaskId} failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n data: {\n planId,\n failedSubtask: subtaskId,\n completedSubtasks: plan.subtasks.filter(s => s.status === 'completed').map(s => s.id),\n },\n };\n }\n }\n\n // All subtasks completed\n plan.status = 'completed';\n\n // Aggregate results\n const aggregatedResult = this.aggregateResults(plan);\n\n logger.info('Coordination plan completed', {\n planId,\n subtaskCount: plan.subtasks.length,\n });\n\n return {\n success: true,\n data: {\n planId,\n aggregatedResult,\n subtaskResults: Array.from(plan.results.entries()).map(([id, result]) => ({\n subtaskId: id,\n result,\n })),\n },\n };\n } catch (error) {\n logger.error('Failed to execute plan', {\n error: error instanceof Error ? error.message : 'Unknown error',\n planId,\n });\n throw error;\n }\n }\n\n /**\n * Analyze task requirements and determine required agents\n */\n private analyzeTaskRequirements(task: AgentTask): Array<{ id: string; taskType: string }> {\n // Simplified analysis - in production, use AI to analyze task\n const taskType = task.type || '';\n // Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed\n const payload =\n task.payload as /* Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n\n const agents: Array<{ id: string; taskType: string }> = [];\n\n // Example: If task involves code generation and documentation\n if (taskType.includes('code') || payload.type === 'component' || payload.type === 'service') {\n agents.push({ id: 'code-gen-001', taskType: 'generate' });\n }\n\n if (taskType.includes('doc') || payload.type === 'readme' || payload.type === 'jsdoc') {\n agents.push({ id: 'docs-001', taskType: 'document' });\n }\n\n if (taskType.includes('refactor') || payload.type === 'refactor') {\n agents.push({ id: 'refactor-001', taskType: 'refactor' });\n }\n\n // Default: use code generation agent\n if (agents.length === 0) {\n agents.push({ id: 'code-gen-001', taskType: 'generate' });\n }\n\n return agents;\n }\n\n /**\n * Extract payload for specific agent\n */\n // Using Record<string, unknown> because payload structure varies by task type and cannot be strictly typed\n private extractPayloadForAgent(\n payload: /* Using Record<string, unknown> because payload structure varies by task type and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n agent: { id: string; taskType: string }\n ): /* Using Record<string, unknown> because extracted payload structure varies by agent type and cannot be strictly typed */ Record<\n string,\n unknown\n > {\n // Extract relevant parts of payload for this agent\n // Simplified - in production, use AI to extract relevant parts\n return {\n ...payload,\n agentId: agent.id,\n taskType: agent.taskType,\n };\n }\n\n /**\n * Execute a subtask via the appropriate agent\n */\n private async executeSubtask(subtask: Subtask): Promise<TaskResult> {\n // This would call the MCP server to execute the task\n // For now, return a placeholder\n return {\n success: true,\n data: {\n subtaskId: subtask.id,\n agentId: subtask.agentId,\n message: 'Subtask executed (placeholder)',\n },\n };\n }\n\n /**\n * Aggregate results from all subtasks\n */\n // Using Record<string, unknown> because aggregated results structure varies by coordination plan and cannot be strictly typed\n private aggregateResults(\n plan: CoordinationPlan\n ): /* Using Record<string, unknown> because aggregated results structure varies by coordination plan and cannot be strictly typed */ Record<\n string,\n unknown\n > {\n // Using Record<string, unknown> because aggregated results structure varies by coordination plan and cannot be strictly typed\n const results: /* Using Record<string, unknown> because aggregated results structure varies by coordination plan and cannot be strictly typed */ Record<\n string,\n unknown\n > = {\n planId: plan.id,\n subtaskCount: plan.subtasks.length,\n completedCount: plan.subtasks.filter(s => s.status === 'completed').length,\n };\n\n // Aggregate data from all subtask results\n const allData: unknown[] = [];\n for (const result of plan.results.values()) {\n if (result.data) {\n allData.push(result.data);\n }\n }\n\n results.aggregatedData = allData;\n\n return results;\n }\n\n /**\n * Get active coordination plans\n */\n getActivePlans(): CoordinationPlan[] {\n return Array.from(this.activePlans.values());\n }\n\n /**\n * Get plan by ID\n */\n getPlan(planId: string): CoordinationPlan | undefined {\n return this.activePlans.get(planId);\n }\n}\n","/**\n * CodeGenerationAgent - Generate code using AI models\n */\n\nimport { openai } from '@ai-sdk/openai';\nimport { generateText } from 'ai';\nimport type { AgentRegistry } from '../../core/AgentRegistry';\nimport type { MessageBroker } from '../../core/MessageBroker';\nimport type { ProtocolHandler } from '../../core/ProtocolHandler';\nimport type { AuditLogger } from '../../safety/AuditLogger';\nimport type { RiskClassifier } from '../../safety/RiskClassifier';\nimport type { AgentConfig } from '../../types/agents';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\nimport { BaseAgentExecutor, createCommandHandler } from '../BaseAgentExecutor';\n\nexport interface CodeGenerationPayload {\n type: 'component' | 'service' | 'repository' | 'test' | 'api-route' | 'hook' | 'utility';\n name: string;\n description: string;\n requirements?: string;\n context?: {\n relatedFiles?: string[];\n existingPatterns?: string;\n dependencies?: string[];\n };\n}\n\nexport interface CodeGenerationResult {\n code: string;\n filename: string;\n language: string;\n explanation: string;\n tests?: string;\n documentation?: string;\n dependencies?: string[];\n}\n\n/**\n * Code Generation Executor - Implements command pattern for code generation\n */\nclass CodeGenerationExecutor extends BaseAgentExecutor {\n protected setupCommandHandlers(): void {\n // Register all code generation command handlers\n this.commandRegistry.register(\n createCommandHandler('component', (payload: CodeGenerationPayload) =>\n this.generateComponent(payload)\n )\n );\n this.commandRegistry.register(\n createCommandHandler('service', (payload: CodeGenerationPayload) =>\n this.generateService(payload)\n )\n );\n this.commandRegistry.register(\n createCommandHandler('repository', (payload: CodeGenerationPayload) =>\n this.generateRepository(payload)\n )\n );\n this.commandRegistry.register(\n createCommandHandler('test', (payload: CodeGenerationPayload) => this.generateTest(payload))\n );\n this.commandRegistry.register(\n createCommandHandler('api-route', (payload: CodeGenerationPayload) =>\n this.generateApiRoute(payload)\n )\n );\n this.commandRegistry.register(\n createCommandHandler('hook', (payload: CodeGenerationPayload) => this.generateHook(payload))\n );\n this.commandRegistry.register(\n createCommandHandler('utility', (payload: CodeGenerationPayload) =>\n this.generateUtility(payload)\n )\n );\n }\n\n protected validatePayload(payload: unknown): void {\n const p = payload as CodeGenerationPayload;\n if (!p.name || !p.type) {\n throw new Error('Missing required fields: name and type');\n }\n }\n\n // Using Record<string, unknown> because code generation task context structure varies by task type and cannot be strictly typed\n protected getTaskContext(\n payload: unknown\n ): /* Using Record<string, unknown> because code generation task context structure varies by task type and cannot be strictly typed */ Record<\n string,\n unknown\n > {\n const p = payload as CodeGenerationPayload;\n return {\n type: p.type,\n name: p.name,\n description: p.description,\n };\n }\n\n protected getPayloadType(payload: unknown): string {\n return (payload as CodeGenerationPayload).type;\n }\n\n /**\n * Generate React component\n */\n private async generateComponent(payload: CodeGenerationPayload): Promise<CodeGenerationResult> {\n const prompt = `Generate a React component named ${payload.name}.\n\nDescription: ${payload.description}\n${payload.requirements ? `Requirements: ${payload.requirements}` : ''}\n${payload.context?.relatedFiles ? `Related files: ${payload.context.relatedFiles.join(', ')}` : ''}\n${payload.context?.existingPatterns ? `Follow existing patterns: ${payload.context.existingPatterns}` : ''}\n\nGenerate:\n1. A complete React component with TypeScript\n2. Proper imports and exports\n3. Type definitions\n4. JSDoc comments\n5. Responsive design considerations\n6. Accessibility features\n\nReturn the code with proper formatting and structure.`;\n\n const result = await generateText({\n model: openai('gpt-4o'),\n prompt,\n temperature: 0.7,\n maxTokens: 4000,\n });\n\n return {\n code: result.text,\n filename: `${payload.name}.tsx`,\n language: 'typescript',\n explanation: `Generated React component: ${payload.name}`,\n tests: `// Add tests for ${payload.name} component`,\n documentation: `# ${payload.name} Component\\n\\n${payload.description}`,\n dependencies: ['react', 'react-dom', '@types/react'],\n };\n }\n\n /**\n * Generate service class\n */\n private async generateService(payload: CodeGenerationPayload): Promise<CodeGenerationResult> {\n const prompt = `Generate a service class named ${payload.name}.\n\nDescription: ${payload.description}\n${payload.requirements ? `Requirements: ${payload.requirements}` : ''}\n${payload.context?.relatedFiles ? `Related files: ${payload.context.relatedFiles.join(', ')}` : ''}\n\nGenerate:\n1. A complete service class with TypeScript\n2. Proper error handling\n3. Logging capabilities\n4. Type definitions\n5. JSDoc comments\n6. Follow clean architecture principles\n\nReturn the code with proper formatting and structure.`;\n\n const result = await generateText({\n model: openai('gpt-4o'),\n prompt,\n temperature: 0.7,\n maxTokens: 4000,\n });\n\n return {\n code: result.text,\n filename: `${payload.name}Service.ts`,\n language: 'typescript',\n explanation: `Generated service: ${payload.name}`,\n tests: `// Add tests for ${payload.name} service`,\n documentation: `# ${payload.name} Service\\n\\n${payload.description}`,\n dependencies: [],\n };\n }\n\n /**\n * Generate repository class\n */\n private async generateRepository(payload: CodeGenerationPayload): Promise<CodeGenerationResult> {\n const prompt = `Generate a repository class named ${payload.name}.\n\nDescription: ${payload.description}\n${payload.requirements ? `Requirements: ${payload.requirements}` : ''}\n${payload.context?.relatedFiles ? `Related files: ${payload.context.relatedFiles.join(', ')}` : ''}\n\nGenerate:\n1. A complete repository class with TypeScript\n2. CRUD operations\n3. Proper error handling\n4. Type definitions\n5. JSDoc comments\n6. Follow repository pattern\n\nReturn the code with proper formatting and structure.`;\n\n const result = await generateText({\n model: openai('gpt-4o'),\n prompt,\n temperature: 0.7,\n maxTokens: 4000,\n });\n\n return {\n code: result.text,\n filename: `${payload.name}Repository.ts`,\n language: 'typescript',\n explanation: `Generated repository: ${payload.name}`,\n tests: `// Add tests for ${payload.name} repository`,\n documentation: `# ${payload.name} Repository\\n\\n${payload.description}`,\n dependencies: [],\n };\n }\n\n /**\n * Generate test file\n */\n private async generateTest(payload: CodeGenerationPayload): Promise<CodeGenerationResult> {\n const prompt = `Generate comprehensive tests for ${payload.name}.\n\nDescription: ${payload.description}\n${payload.requirements ? `Requirements: ${payload.requirements}` : ''}\n${payload.context?.relatedFiles ? `Related files: ${payload.context.relatedFiles.join(', ')}` : ''}\n\nGenerate:\n1. Unit tests with Jest/Vitest\n2. Integration tests\n3. Mock implementations\n4. Test data fixtures\n5. Edge case coverage\n6. Performance tests if applicable\n\nReturn the code with proper formatting and structure.`;\n\n const result = await generateText({\n model: openai('gpt-4o'),\n prompt,\n temperature: 0.7,\n maxTokens: 4000,\n });\n\n return {\n code: result.text,\n filename: `${payload.name}.test.ts`,\n language: 'typescript',\n explanation: `Generated tests for: ${payload.name}`,\n tests: result.text,\n documentation: `# ${payload.name} Tests\\n\\n${payload.description}`,\n dependencies: ['jest', '@types/jest', 'vitest'],\n };\n }\n\n /**\n * Generate API route\n */\n private async generateApiRoute(payload: CodeGenerationPayload): Promise<CodeGenerationResult> {\n const prompt = `Generate a Next.js API route for ${payload.name}.\n\nDescription: ${payload.description}\n${payload.requirements ? `Requirements: ${payload.requirements}` : ''}\n${payload.context?.relatedFiles ? `Related files: ${payload.context.relatedFiles.join(', ')}` : ''}\n\nGenerate:\n1. A complete API route handler\n2. Proper HTTP methods (GET, POST, PUT, DELETE)\n3. Request/response validation\n4. Error handling\n5. Type definitions\n6. JSDoc comments\n7. Security considerations\n\nReturn the code with proper formatting and structure.`;\n\n const result = await generateText({\n model: openai('gpt-4o'),\n prompt,\n temperature: 0.7,\n maxTokens: 4000,\n });\n\n return {\n code: result.text,\n filename: 'route.ts',\n language: 'typescript',\n explanation: `Generated API route for: ${payload.name}`,\n tests: `// Add tests for ${payload.name} API route`,\n documentation: `# ${payload.name} API Route\\n\\n${payload.description}`,\n dependencies: ['next', '@types/node'],\n };\n }\n\n /**\n * Generate custom hook\n */\n private async generateHook(payload: CodeGenerationPayload): Promise<CodeGenerationResult> {\n const prompt = `Generate a React custom hook named ${payload.name}.\n\nDescription: ${payload.description}\n${payload.requirements ? `Requirements: ${payload.requirements}` : ''}\n${payload.context?.relatedFiles ? `Related files: ${payload.context.relatedFiles.join(', ')}` : ''}\n\nGenerate:\n1. A complete custom hook with TypeScript\n2. Proper state management\n3. Effect cleanup\n4. Type definitions\n5. JSDoc comments\n6. Error handling\n7. Return proper hook interface\n\nReturn the code with proper formatting and structure.`;\n\n const result = await generateText({\n model: openai('gpt-4o'),\n prompt,\n temperature: 0.7,\n maxTokens: 4000,\n });\n\n return {\n code: result.text,\n filename: `use${payload.name}.ts`,\n language: 'typescript',\n explanation: `Generated custom hook: ${payload.name}`,\n tests: `// Add tests for use${payload.name} hook`,\n documentation: `# use${payload.name} Hook\\n\\n${payload.description}`,\n dependencies: ['react', '@types/react'],\n };\n }\n\n /**\n * Generate utility function\n */\n private async generateUtility(payload: CodeGenerationPayload): Promise<CodeGenerationResult> {\n const prompt = `Generate a utility function named ${payload.name}.\n\nDescription: ${payload.description}\n${payload.requirements ? `Requirements: ${payload.requirements}` : ''}\n${payload.context?.relatedFiles ? `Related files: ${payload.context.relatedFiles.join(', ')}` : ''}\n\nGenerate:\n1. A complete utility function with TypeScript\n2. Proper type definitions\n3. JSDoc comments\n4. Error handling\n5. Input validation\n6. Pure function principles\n\nReturn the code with proper formatting and structure.`;\n\n const result = await generateText({\n model: openai('gpt-4o'),\n prompt,\n temperature: 0.7,\n maxTokens: 4000,\n });\n\n return {\n code: result.text,\n filename: `${payload.name}.ts`,\n language: 'typescript',\n explanation: `Generated utility: ${payload.name}`,\n tests: `// Add tests for ${payload.name} utility`,\n documentation: `# ${payload.name} Utility\\n\\n${payload.description}`,\n dependencies: [],\n };\n }\n}\n\nexport class CodeGenerationAgent extends BaseAgent {\n private executor: CodeGenerationExecutor;\n\n constructor(\n config: AgentConfig,\n broker: MessageBroker,\n registry: AgentRegistry,\n protocol: ProtocolHandler\n ) {\n super(config, broker, registry, protocol);\n this.executor = new CodeGenerationExecutor();\n }\n\n /**\n * Set risk classifier\n */\n setRiskClassifier(classifier: RiskClassifier): void {\n this.executor.setRiskClassifier(classifier);\n }\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.executor.setAuditLogger(logger);\n }\n\n /**\n * Execute code generation task using the new executor pattern\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n return this.executor.executeTask(task);\n }\n}\n","/**\n * Base Agent Executor - Template Method Pattern Implementation\n *\n * Eliminates code duplication across MCP agents by providing a common execution template\n * with pluggable command handlers instead of switch statements.\n */\n\nimport type { AuditLogger } from '../safety/AuditLogger';\nimport type { RiskClassifier } from '../safety/RiskClassifier';\nimport type { AgentTask, TaskResult } from '../types/tasks';\n\n/**\n * Command handler interface for agent task execution\n */\nexport interface CommandHandler<T = unknown, R = unknown> {\n readonly type: string;\n execute(payload: T): Promise<R>;\n}\n\n/**\n * Command registry for managing task handlers\n */\nexport class CommandRegistry {\n private handlers = new Map<string, CommandHandler>();\n\n /**\n * Register a command handler\n */\n register<T, R>(handler: CommandHandler<T, R>): void {\n this.handlers.set(handler.type, handler);\n }\n\n /**\n * Get a command handler by type\n */\n get<T, R>(type: string): CommandHandler<T, R> | undefined {\n return this.handlers.get(type) as CommandHandler<T, R> | undefined;\n }\n\n /**\n * Check if a handler exists for the given type\n */\n has(type: string): boolean {\n return this.handlers.has(type);\n }\n\n /**\n * Get all registered handler types\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.handlers.keys());\n }\n}\n\n/**\n * Base Agent Executor with Template Method Pattern\n *\n * Provides common execution flow:\n * 1. Risk assessment\n * 2. Audit logging\n * 3. Command execution via registry\n * 4. Error handling\n * 5. Result formatting\n */\nexport abstract class BaseAgentExecutor {\n protected riskClassifier?: RiskClassifier;\n protected auditLogger?: AuditLogger;\n protected commandRegistry: CommandRegistry;\n\n constructor() {\n this.commandRegistry = new CommandRegistry();\n this.setupCommandHandlers();\n }\n\n /**\n * Set risk classifier\n */\n setRiskClassifier(classifier: RiskClassifier): void {\n this.riskClassifier = classifier;\n }\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.auditLogger = logger;\n }\n\n /**\n * Execute task with common template method\n */\n async executeTask(task: AgentTask): Promise<TaskResult> {\n const startTime = Date.now();\n\n try {\n // 1. Validate payload\n this.validatePayload(task.payload);\n\n // 2. Risk assessment\n if (this.riskClassifier) {\n const risk = this.riskClassifier.classify(task);\n if (risk.requiresApproval) {\n return this.createRejectionResult(task.id, startTime, risk);\n }\n }\n\n // 3. Audit logging - execution start\n if (this.auditLogger) {\n await this.auditLogger.logTaskExecuted(task, this.getTaskContext(task.payload));\n }\n\n // 4. Execute command via registry\n const result = await this.executeCommand(task);\n\n // 5. Audit logging - completion\n if (this.auditLogger) {\n await this.auditLogger.logTaskCompleted(task, result);\n }\n\n // 6. Return success result\n return this.createSuccessResult(task.id, result, startTime);\n } catch (error) {\n // 7. Error handling and logging\n return this.handleExecutionError(task, error, startTime);\n }\n }\n\n /**\n * Abstract method: Setup command handlers (implemented by subclasses)\n */\n protected abstract setupCommandHandlers(): void;\n\n /**\n * Abstract method: Validate payload (implemented by subclasses)\n */\n protected abstract validatePayload(payload: unknown): void;\n\n /**\n * Abstract method: Get task context for logging (implemented by subclasses)\n */\n // Using Record<string, unknown> because task context structure varies by task type and cannot be strictly typed\n protected abstract getTaskContext(\n payload: unknown\n ): /* Using Record<string, unknown> because task context structure varies by task type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n\n /**\n * Execute command using registry\n */\n private async executeCommand(task: AgentTask): Promise<unknown> {\n const payloadType = this.getPayloadType(task.payload);\n const handler = this.commandRegistry.get(payloadType);\n\n if (!handler) {\n throw new Error(`No handler registered for type: ${payloadType}`);\n }\n\n return handler.execute(task.payload);\n }\n\n /**\n * Abstract method: Get payload type (implemented by subclasses)\n */\n protected abstract getPayloadType(payload: unknown): string;\n\n /**\n * Create rejection result for tasks requiring approval\n */\n private createRejectionResult(\n taskId: string,\n startTime: number,\n risk: { requiresApproval: boolean; [key: string]: unknown }\n ): TaskResult {\n return {\n taskId,\n success: false,\n error: 'Task requires approval before execution',\n executionTime: Date.now() - startTime,\n metadata: { riskAssessment: risk },\n };\n }\n\n /**\n * Create success result\n */\n private createSuccessResult(taskId: string, data: unknown, startTime: number): TaskResult {\n return {\n taskId,\n success: true,\n data,\n executionTime: Date.now() - startTime,\n };\n }\n\n /**\n * Handle execution errors\n */\n private async handleExecutionError(\n task: AgentTask,\n error: unknown,\n startTime: number\n ): Promise<TaskResult> {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n // Log failure\n if (this.auditLogger) {\n await this.auditLogger.logTaskFailed(task, errorMessage);\n }\n\n return {\n taskId: task.id,\n success: false,\n error: errorMessage,\n executionTime: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Concrete command handler implementation\n */\nexport class ConcreteCommandHandler<T, R> implements CommandHandler<T, R> {\n constructor(\n public readonly type: string,\n private readonly executeFn: (payload: T) => Promise<R>\n ) {}\n\n async execute(payload: T): Promise<R> {\n return this.executeFn(payload);\n }\n}\n\n/**\n * Factory function for creating command handlers\n */\nexport function createCommandHandler<T, R>(\n type: string,\n executeFn: (payload: T) => Promise<R>\n): CommandHandler<T, R> {\n return new ConcreteCommandHandler(type, executeFn);\n}\n","/**\n * DebugAgent - Analyze errors and suggest fixes\n */\n\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { openai } from '@ai-sdk/openai';\nimport { generateText } from 'ai';\nimport type { AuditLogger } from '../../safety/AuditLogger';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nexport interface DebugPayload {\n type: 'analyze-error' | 'suggest-fix' | 'performance-debug' | 'analyze-logs';\n error?: {\n message: string;\n stack?: string;\n code?: string;\n };\n logs?: string[];\n code?: string;\n filename?: string;\n context?: {\n environment?: 'development' | 'production';\n userAction?: string;\n relatedCode?: string;\n recentChanges?: string;\n };\n}\n\nexport interface DebugResult {\n analysis: {\n rootCause: string;\n category: 'syntax' | 'runtime' | 'logic' | 'performance' | 'configuration' | 'dependency';\n severity: 'low' | 'medium' | 'high' | 'critical';\n affectedAreas: string[];\n };\n suggestedFixes: Array<{\n description: string;\n code?: string;\n steps: string[];\n confidence: 'low' | 'medium' | 'high';\n }>;\n preventionTips: string[];\n relatedDocs: string[];\n explanation: string;\n}\n\nexport class DebugAgent extends BaseAgent {\n private auditLogger?: AuditLogger;\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.auditLogger = logger;\n }\n\n /**\n * Execute debug task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const startTime = Date.now();\n\n try {\n const payload = task.payload as DebugPayload;\n\n if (!payload.type) {\n throw new Error('Missing required field: type');\n }\n\n // Log execution\n if (this.auditLogger) {\n await this.auditLogger.logTaskExecuted(task);\n }\n\n // Execute based on type\n let result: DebugResult;\n\n switch (payload.type) {\n case 'analyze-error':\n result = await this.analyzeError(payload);\n break;\n case 'suggest-fix':\n result = await this.suggestFix(payload);\n break;\n case 'performance-debug':\n result = await this.debugPerformance(payload);\n break;\n case 'analyze-logs':\n result = await this.analyzeLogs(payload);\n break;\n default:\n throw new Error(`Unknown debug type: ${payload.type}`);\n }\n\n // Log completion\n if (this.auditLogger) {\n await this.auditLogger.logTaskCompleted(task, result);\n }\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.auditLogger) {\n await this.auditLogger.logTaskFailed(\n task,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Analyze error\n */\n private async analyzeError(payload: DebugPayload): Promise<DebugResult> {\n if (!payload.error) {\n throw new Error('Error information required for analysis');\n }\n\n const prompt = `Analyze this error and provide debugging guidance:\n\nError Message: ${payload.error.message}\n\n${payload.error.stack ? `Stack Trace:\\n${payload.error.stack}` : ''}\n\n${payload.code ? `Related Code:\\n\\`\\`\\`typescript\\n${payload.code}\\n\\`\\`\\`` : ''}\n\n${payload.context?.userAction ? `User Action: ${payload.context.userAction}` : ''}\n${payload.context?.environment ? `Environment: ${payload.context.environment}` : ''}\n${payload.context?.recentChanges ? `Recent Changes: ${payload.context.recentChanges}` : ''}\n\nProvide analysis in JSON format:\n{\n \"analysis\": {\n \"rootCause\": \"...\",\n \"category\": \"syntax|runtime|logic|performance|configuration|dependency\",\n \"severity\": \"low|medium|high|critical\",\n \"affectedAreas\": [\"...\"]\n },\n \"suggestedFixes\": [\n {\n \"description\": \"...\",\n \"code\": \"...\",\n \"steps\": [\"...\", \"...\"],\n \"confidence\": \"low|medium|high\"\n }\n ],\n \"preventionTips\": [\"...\", \"...\"],\n \"relatedDocs\": [\"...\"]\n}\n\nReturn ONLY valid JSON.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.4,\n maxTokens: 2000,\n });\n\n const parsed = JSON.parse(text);\n\n return {\n ...parsed,\n explanation: `Analyzed error: ${payload.error.message.substring(0, 100)}...`,\n };\n }\n\n /**\n * Suggest fix for error\n */\n private async suggestFix(payload: DebugPayload): Promise<DebugResult> {\n if (!payload.error || !payload.code) {\n throw new Error('Error and code required for fix suggestions');\n }\n\n const prompt = `Suggest fixes for this error:\n\nError: ${payload.error.message}\n\nCode causing the error:\n\\`\\`\\`typescript\n${payload.code}\n\\`\\`\\`\n\n${payload.error.stack ? `Stack Trace:\\n${payload.error.stack}` : ''}\n\nProvide detailed fix suggestions including:\n- Root cause analysis\n- Step-by-step fix instructions\n- Fixed code examples\n- Prevention strategies\n\nReturn as JSON with the structure:\n{\n \"analysis\": { \"rootCause\": \"...\", \"category\": \"...\", \"severity\": \"...\", \"affectedAreas\": [] },\n \"suggestedFixes\": [ { \"description\": \"...\", \"code\": \"...\", \"steps\": [], \"confidence\": \"...\" } ],\n \"preventionTips\": [],\n \"relatedDocs\": []\n}`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.5,\n maxTokens: 2500,\n });\n\n const parsed = JSON.parse(text);\n\n return {\n ...parsed,\n explanation: `Suggested ${parsed.suggestedFixes?.length || 0} fixes for the error`,\n };\n }\n\n /**\n * Debug performance issues\n */\n private async debugPerformance(payload: DebugPayload): Promise<DebugResult> {\n if (!payload.code) {\n throw new Error('Code required for performance debugging');\n }\n\n const prompt = `Analyze this code for performance issues:\n\n\\`\\`\\`typescript\n${payload.code}\n\\`\\`\\`\n\n${payload.filename ? `File: ${payload.filename}` : ''}\n\nIdentify:\n- Performance bottlenecks\n- Inefficient algorithms\n- Unnecessary re-renders (React)\n- Database query issues\n- Memory leaks\n- Blocking operations\n\nProvide JSON response with:\n{\n \"analysis\": {\n \"rootCause\": \"Performance issue description\",\n \"category\": \"performance\",\n \"severity\": \"...\",\n \"affectedAreas\": [\"...\"]\n },\n \"suggestedFixes\": [\n {\n \"description\": \"Optimization strategy\",\n \"code\": \"Optimized code\",\n \"steps\": [\"Implementation steps\"],\n \"confidence\": \"high|medium|low\"\n }\n ],\n \"preventionTips\": [\"Best practices\"],\n \"relatedDocs\": [\"Documentation links\"]\n}`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.3,\n maxTokens: 2000,\n });\n\n const parsed = JSON.parse(text);\n\n return {\n ...parsed,\n explanation: 'Performance analysis completed',\n };\n }\n\n /**\n * Analyze logs for patterns\n */\n private async analyzeLogs(payload: DebugPayload): Promise<DebugResult> {\n if (!payload.logs || payload.logs.length === 0) {\n throw new Error('Logs required for analysis');\n }\n\n const logsText = payload.logs.join('\\n');\n\n const prompt = `Analyze these application logs for issues:\n\n\\`\\`\\`\n${logsText.substring(0, 5000)} ${logsText.length > 5000 ? '...(truncated)' : ''}\n\\`\\`\\`\n\nIdentify:\n- Error patterns\n- Warning trends\n- Performance issues\n- Security concerns\n- Unusual behavior\n\nProvide JSON response with analysis and suggestions.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.4,\n maxTokens: 2000,\n });\n\n const parsed = JSON.parse(text);\n\n return {\n ...parsed,\n explanation: `Analyzed ${payload.logs.length} log entries`,\n };\n }\n\n /**\n * Get AI model based on config\n */\n private getModel() {\n const modelName = this.config.model;\n\n if (modelName.startsWith('claude')) {\n return anthropic(modelName);\n }\n if (modelName.startsWith('gpt')) {\n return openai(modelName);\n }\n\n return openai('gpt-4o'); // GPT-4o is good for debugging\n }\n}\n","/**\n * DocumentationAgent - Generate and update documentation\n */\n\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { openai } from '@ai-sdk/openai';\nimport { generateText } from 'ai';\nimport type { AuditLogger } from '../../safety/AuditLogger';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nexport interface DocumentationPayload {\n type: 'jsdoc' | 'readme' | 'api-docs' | 'architecture-docs' | 'guide';\n source?: string; // Source code to document\n filename?: string;\n title?: string;\n description?: string;\n sections?: string[]; // For README/guide\n context?: {\n projectName?: string;\n existingDocs?: string;\n audience?: 'developers' | 'end-users' | 'admins';\n };\n}\n\nexport interface DocumentationResult {\n documentation: string;\n format: 'jsdoc' | 'markdown' | 'html';\n filename: string;\n sections?: Array<{\n title: string;\n content: string;\n }>;\n metadata?: {\n wordCount: number;\n readingTime: string;\n };\n}\n\nexport class DocumentationAgent extends BaseAgent {\n private auditLogger?: AuditLogger;\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.auditLogger = logger;\n }\n\n /**\n * Execute documentation task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const startTime = Date.now();\n\n try {\n const payload = task.payload as DocumentationPayload;\n\n if (!payload.type) {\n throw new Error('Missing required field: type');\n }\n\n // Log execution (documentation is safe)\n if (this.auditLogger) {\n await this.auditLogger.logTaskExecuted(task);\n }\n\n // Generate documentation based on type\n let result: DocumentationResult;\n\n switch (payload.type) {\n case 'jsdoc':\n result = await this.generateJSDoc(payload);\n break;\n case 'readme':\n result = await this.generateReadme(payload);\n break;\n case 'api-docs':\n result = await this.generateApiDocs(payload);\n break;\n case 'architecture-docs':\n result = await this.generateArchitectureDocs(payload);\n break;\n case 'guide':\n result = await this.generateGuide(payload);\n break;\n default:\n throw new Error(`Unknown documentation type: ${payload.type}`);\n }\n\n // Log completion\n if (this.auditLogger) {\n await this.auditLogger.logTaskCompleted(task, result);\n }\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.auditLogger) {\n await this.auditLogger.logTaskFailed(\n task,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Generate JSDoc comments\n */\n private async generateJSDoc(payload: DocumentationPayload): Promise<DocumentationResult> {\n if (!payload.source) {\n throw new Error('Source code required for JSDoc generation');\n }\n\n const prompt = `Add comprehensive JSDoc comments to this TypeScript code:\n\n\\`\\`\\`typescript\n${payload.source}\n\\`\\`\\`\n\nGuidelines:\n- Add JSDoc to all functions, classes, interfaces\n- Include @param, @returns, @throws tags\n- Add examples for complex functions\n- Describe purpose and behavior\n- Keep comments concise and clear\n- Use proper TypeScript types in JSDoc\n\nReturn ONLY the code with JSDoc comments added, no explanations.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.3,\n maxTokens: 2500,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n documentation: text,\n format: 'jsdoc',\n filename: payload.filename || 'documented.ts',\n metadata: {\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n },\n };\n }\n\n /**\n * Generate README file\n */\n private async generateReadme(payload: DocumentationPayload): Promise<DocumentationResult> {\n const projectName = payload.context?.projectName || 'Project';\n const sections = payload.sections || [\n 'Overview',\n 'Features',\n 'Installation',\n 'Usage',\n 'API Reference',\n 'Contributing',\n 'License',\n ];\n\n const prompt = `Generate a comprehensive README.md for this project:\n\nProject Name: ${projectName}\nDescription: ${payload.description || 'Add description'}\n\n${payload.source ? `Based on this code:\\n\\`\\`\\`typescript\\n${payload.source}\\n\\`\\`\\`` : ''}\n\nInclude sections:\n${sections.map(s => `- ${s}`).join('\\n')}\n\nGuidelines:\n- Use clear, concise language\n- Include code examples\n- Add badges if relevant\n- Use proper markdown formatting\n- Include installation steps\n- Add usage examples\n- Keep it professional\n\nReturn a complete README.md file.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.5,\n maxTokens: 3000,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n documentation: text,\n format: 'markdown',\n filename: 'README.md',\n metadata: {\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n },\n };\n }\n\n /**\n * Generate API documentation\n */\n private async generateApiDocs(payload: DocumentationPayload): Promise<DocumentationResult> {\n if (!payload.source) {\n throw new Error('API route code required for API documentation');\n }\n\n const prompt = `Generate API documentation for this Next.js API route:\n\n\\`\\`\\`typescript\n${payload.source}\n\\`\\`\\`\n\nInclude:\n- Endpoint path and HTTP methods\n- Request parameters (query, body, headers)\n- Request body schema (if POST/PUT)\n- Response format and status codes\n- Error responses\n- Authentication requirements\n- Rate limiting\n- Example requests with curl/fetch\n\nUse OpenAPI/Swagger-style documentation in markdown format.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.3,\n maxTokens: 2000,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n documentation: text,\n format: 'markdown',\n filename: payload.filename?.replace('.ts', '.md') || 'api-docs.md',\n metadata: {\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n },\n };\n }\n\n /**\n * Generate architecture documentation\n */\n private async generateArchitectureDocs(\n payload: DocumentationPayload\n ): Promise<DocumentationResult> {\n const prompt = `Generate architecture documentation:\n\nTitle: ${payload.title || 'Architecture Overview'}\nDescription: ${payload.description || 'System architecture documentation'}\n\n${payload.source ? `Based on this code:\\n\\`\\`\\`typescript\\n${payload.source}\\n\\`\\`\\`` : ''}\n\nInclude:\n- System overview\n- Component architecture\n- Data flow diagrams (mermaid)\n- Layer responsibilities\n- Design patterns used\n- Key decisions and trade-offs\n- Integration points\n- Scalability considerations\n\nUse markdown with mermaid diagrams where appropriate.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.4,\n maxTokens: 3000,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n documentation: text,\n format: 'markdown',\n filename: payload.filename || 'ARCHITECTURE.md',\n metadata: {\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n },\n };\n }\n\n /**\n * Generate user guide\n */\n private async generateGuide(payload: DocumentationPayload): Promise<DocumentationResult> {\n const audience = payload.context?.audience || 'developers';\n\n const prompt = `Generate a user guide:\n\nTitle: ${payload.title || 'User Guide'}\nDescription: ${payload.description || 'How to use this feature'}\nAudience: ${audience}\n\n${payload.source ? `Based on this implementation:\\n\\`\\`\\`typescript\\n${payload.source}\\n\\`\\`\\`` : ''}\n\nInclude:\n- Introduction\n- Prerequisites\n- Step-by-step instructions\n- Code examples\n- Common scenarios\n- Troubleshooting\n- Best practices\n- FAQ\n\nWrite in clear, ${audience === 'end-users' ? 'non-technical' : 'technical'} language.\nUse markdown formatting with examples.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.5,\n maxTokens: 2500,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n documentation: text,\n format: 'markdown',\n filename: payload.filename || 'GUIDE.md',\n metadata: {\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n },\n };\n }\n\n /**\n * Get AI model based on config\n */\n private getModel() {\n const modelName = this.config.model;\n\n if (modelName.startsWith('claude')) {\n return anthropic(modelName);\n }\n if (modelName.startsWith('gpt')) {\n return openai(modelName);\n }\n\n return openai('gpt-4o'); // GPT-4o is good for documentation\n }\n}\n","/**\n * PingPongAgent - Simple test agent for validating MCP infrastructure\n */\n\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nexport class PingPongAgent extends BaseAgent {\n /**\n * Execute task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const startTime = Date.now();\n\n try {\n // Simple ping/pong logic\n if (task.type === 'agents.ping') {\n const result = {\n message: 'pong',\n agentId: this.config.id,\n timestamp: Date.now(),\n payload: task.payload,\n };\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n }\n\n // Echo back the payload\n if (task.type === 'agents.echo') {\n return {\n taskId: task.id,\n success: true,\n data: {\n echo: task.payload,\n agentId: this.config.id,\n timestamp: Date.now(),\n },\n executionTime: Date.now() - startTime,\n };\n }\n\n // Simulate work\n if (task.type === 'agents.simulate') {\n const delay = (task.payload as { delay?: number })?.delay ?? 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n\n return {\n taskId: task.id,\n success: true,\n data: {\n simulated: true,\n delay,\n agentId: this.config.id,\n timestamp: Date.now(),\n },\n executionTime: Date.now() - startTime,\n };\n }\n\n throw new Error(`Unknown task type: ${task.type}`);\n } catch (error) {\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Subscribe to events\n */\n protected async subscribeToEvents(): Promise<void> {\n // Subscribe to ping events\n const subId = this.broker.subscribe(\n this.config.id,\n ['agent.ping', 'system.test'],\n async event => {\n this.logger.info(`PingPongAgent received event: ${event.type}`, { payload: event.payload });\n }\n );\n\n this.subscriptionIds.push(subId);\n }\n}\n","/**\n * RefactoringAgent - Analyze and refactor code\n */\n\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { openai } from '@ai-sdk/openai';\nimport { generateText } from 'ai';\nimport type { AuditLogger } from '../../safety/AuditLogger';\nimport type { RiskClassifier } from '../../safety/RiskClassifier';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nexport interface RefactoringPayload {\n code: string;\n filename: string;\n type: 'analyze' | 'refactor' | 'optimize' | 'clean';\n focus?: 'performance' | 'readability' | 'maintainability' | 'type-safety' | 'all';\n context?: {\n relatedCode?: string;\n constraints?: string[];\n };\n}\n\nexport interface RefactoringResult {\n analysis?: {\n codeSmells: Array<{\n type: string;\n description: string;\n severity: 'low' | 'medium' | 'high';\n location: string;\n }>;\n suggestions: Array<{\n type: string;\n description: string;\n benefit: string;\n }>;\n metrics?: {\n complexity: number;\n maintainability: number;\n testability: number;\n };\n };\n refactoredCode?: string;\n changes?: Array<{\n type: string;\n description: string;\n before: string;\n after: string;\n }>;\n explanation: string;\n requiresApproval: boolean;\n}\n\nexport class RefactoringAgent extends BaseAgent {\n private riskClassifier?: RiskClassifier;\n private auditLogger?: AuditLogger;\n\n /**\n * Set risk classifier\n */\n setRiskClassifier(classifier: RiskClassifier): void {\n this.riskClassifier = classifier;\n }\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.auditLogger = logger;\n }\n\n /**\n * Execute refactoring task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const startTime = Date.now();\n\n try {\n const payload = task.payload as RefactoringPayload;\n\n if (!payload.code || !payload.filename) {\n throw new Error('Missing required fields: code and filename');\n }\n\n // Classify risk\n if (this.riskClassifier) {\n const risk = this.riskClassifier.classify(task);\n\n if (risk.requiresApproval) {\n return {\n taskId: task.id,\n success: false,\n error: 'Refactoring requires approval before execution',\n executionTime: Date.now() - startTime,\n metadata: { riskAssessment: risk },\n };\n }\n }\n\n // Log execution\n if (this.auditLogger) {\n await this.auditLogger.logTaskExecuted(task, { originalCode: payload.code });\n }\n\n // Execute based on type\n let result: RefactoringResult;\n\n switch (payload.type) {\n case 'analyze':\n result = await this.analyzeCode(payload);\n break;\n case 'refactor':\n result = await this.refactorCode(payload);\n break;\n case 'optimize':\n result = await this.optimizeCode(payload);\n break;\n case 'clean':\n result = await this.cleanCode(payload);\n break;\n default:\n throw new Error(`Unknown refactoring type: ${payload.type}`);\n }\n\n // Log completion\n if (this.auditLogger) {\n await this.auditLogger.logTaskCompleted(task, result, {\n refactoredCode: result.refactoredCode,\n });\n }\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.auditLogger) {\n await this.auditLogger.logTaskFailed(\n task,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Analyze code for issues\n */\n private async analyzeCode(payload: RefactoringPayload): Promise<RefactoringResult> {\n const prompt = `Analyze this ${payload.filename} code for issues and improvements:\n\n\\`\\`\\`typescript\n${payload.code}\n\\`\\`\\`\n\n${payload.focus ? `Focus on: ${payload.focus}` : 'Analyze all aspects'}\n\nProvide analysis in JSON format:\n{\n \"codeSmells\": [\n { \"type\": \"...\", \"description\": \"...\", \"severity\": \"low|medium|high\", \"location\": \"...\" }\n ],\n \"suggestions\": [\n { \"type\": \"...\", \"description\": \"...\", \"benefit\": \"...\" }\n ],\n \"metrics\": {\n \"complexity\": 1-10,\n \"maintainability\": 1-10,\n \"testability\": 1-10\n }\n}\n\nReturn ONLY valid JSON, no explanations outside the JSON.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.3,\n maxTokens: 2000,\n });\n\n // Parse JSON response\n const analysis = JSON.parse(text);\n\n return {\n analysis,\n explanation: `Analyzed ${payload.filename} - Found ${analysis.codeSmells?.length || 0} issues`,\n requiresApproval: false, // Analysis doesn't modify code\n };\n }\n\n /**\n * Refactor code\n */\n private async refactorCode(payload: RefactoringPayload): Promise<RefactoringResult> {\n const prompt = `Refactor this ${payload.filename} code to improve quality:\n\n\\`\\`\\`typescript\n${payload.code}\n\\`\\`\\`\n\n${payload.focus ? `Focus on: ${payload.focus}` : 'Improve all aspects'}\n${payload.context?.constraints ? `Constraints: ${payload.context.constraints.join(', ')}` : ''}\n\nRequirements:\n- Maintain existing functionality\n- Follow DRY, SOLID principles\n- Improve type safety\n- Add comments where helpful\n- Keep the same public API\n\nProvide response in JSON format:\n{\n \"refactoredCode\": \"...\",\n \"changes\": [\n { \"type\": \"...\", \"description\": \"...\", \"before\": \"...\", \"after\": \"...\" }\n ]\n}\n\nReturn ONLY valid JSON with the refactored code.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.4,\n maxTokens: 3000,\n });\n\n const result = JSON.parse(text);\n\n return {\n refactoredCode: result.refactoredCode,\n changes: result.changes,\n explanation: `Refactored ${payload.filename} with ${result.changes?.length || 0} improvements`,\n requiresApproval: true, // Refactoring modifies code\n };\n }\n\n /**\n * Optimize code for performance\n */\n private async optimizeCode(payload: RefactoringPayload): Promise<RefactoringResult> {\n const prompt = `Optimize this ${payload.filename} code for performance:\n\n\\`\\`\\`typescript\n${payload.code}\n\\`\\`\\`\n\nFocus on:\n- Reduce time complexity\n- Minimize memory usage\n- Optimize React rendering (if applicable)\n- Improve database queries\n- Add memoization where beneficial\n- Remove unnecessary operations\n\nProvide response in JSON format with optimized code and explanations.\n\nReturn ONLY valid JSON.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.3,\n maxTokens: 2500,\n });\n\n const result = JSON.parse(text);\n\n return {\n refactoredCode: result.optimizedCode || result.refactoredCode,\n changes: result.changes,\n explanation: result.explanation || `Optimized ${payload.filename} for performance`,\n requiresApproval: true,\n };\n }\n\n /**\n * Clean code (formatting, organization)\n */\n private async cleanCode(payload: RefactoringPayload): Promise<RefactoringResult> {\n const prompt = `Clean and organize this ${payload.filename} code:\n\n\\`\\`\\`typescript\n${payload.code}\n\\`\\`\\`\n\nApply:\n- Consistent formatting\n- Logical organization (imports, types, functions)\n- Remove unused code\n- Improve naming\n- Add missing type annotations\n- Remove console.logs (production)\n- Fix linting issues\n\nMaintain exact functionality. Return ONLY the cleaned code, no JSON wrapper.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.2,\n maxTokens: 2000,\n });\n\n return {\n refactoredCode: text,\n explanation: `Cleaned and formatted ${payload.filename}`,\n requiresApproval: false, // Formatting is safe\n };\n }\n\n /**\n * Get AI model based on config\n */\n private getModel() {\n const modelName = this.config.model;\n\n if (modelName.startsWith('claude')) {\n return anthropic(modelName);\n }\n if (modelName.startsWith('gpt')) {\n return openai(modelName);\n }\n\n return anthropic('claude-3-5-sonnet-20241022');\n }\n}\n","/**\n * Experience Library - Vector database of successful patterns\n *\n * Stores and retrieves successful agent execution patterns for learning and reuse.\n * Uses embeddings to find similar successful patterns.\n *\n * @module agents/self-improvement/ExperienceLibrary\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\n\nconst logger = createServiceLogger('ExperienceLibrary');\n\n/**\n * Experience entry\n */\nexport interface Experience {\n /** Experience ID */\n id: string;\n /** Agent type */\n agentType: string;\n /** Task type */\n taskType: string;\n /** Task payload */\n // Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed\n payload: /* Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n /** Task result */\n result: TaskResult;\n /** Success metrics */\n metrics: {\n executionTime: number;\n success: boolean;\n userRating?: number;\n outcome?: 'success' | 'partial' | 'failure';\n };\n /** Embedding vector (for similarity search) */\n embedding?: number[];\n /** Tags for categorization */\n tags: string[];\n /** Created timestamp */\n createdAt: Date;\n /** Last accessed timestamp */\n lastAccessedAt: Date;\n /** Access count */\n accessCount: number;\n}\n\n/**\n * Experience Library\n *\n * Stores successful patterns and provides similarity search\n */\nexport class ExperienceLibrary {\n private experiences: Map<string, Experience> = new Map();\n private embeddings: Map<string, number[]> = new Map();\n private maxSize: number = 10000; // Maximum number of experiences to store\n\n /**\n * Add experience to library\n */\n async addExperience(\n agentType: string,\n taskType: string,\n // Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed\n payload: /* Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n result: TaskResult,\n metrics: {\n executionTime: number;\n success: boolean;\n userRating?: number;\n outcome?: 'success' | 'partial' | 'failure';\n },\n tags: string[] = []\n ): Promise<string> {\n try {\n // Only store successful experiences\n if (!metrics.success && metrics.outcome !== 'success') {\n logger.debug('Skipping unsuccessful experience', { agentType, taskType });\n return '';\n }\n\n const id = `exp-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n\n // Generate embedding (simplified - in production, use actual embedding model)\n const embedding = await this.generateEmbedding(agentType, taskType, payload);\n\n const experience: Experience = {\n id,\n agentType,\n taskType,\n payload,\n result,\n metrics,\n embedding,\n tags,\n createdAt: new Date(),\n lastAccessedAt: new Date(),\n accessCount: 0,\n };\n\n // Store experience\n this.experiences.set(id, experience);\n if (embedding) {\n this.embeddings.set(id, embedding);\n }\n\n // Enforce size limit (remove oldest if needed)\n if (this.experiences.size > this.maxSize) {\n await this.evictOldest();\n }\n\n logger.info('Experience added to library', {\n id,\n agentType,\n taskType,\n success: metrics.success,\n });\n\n return id;\n } catch (error) {\n logger.error('Failed to add experience', {\n error: error instanceof Error ? error.message : 'Unknown error',\n agentType,\n taskType,\n });\n return '';\n }\n }\n\n /**\n * Find similar experiences\n */\n async findSimilar(\n agentType: string,\n taskType: string,\n // Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed\n payload: /* Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n limit: number = 5\n ): Promise<Experience[]> {\n try {\n // Generate embedding for query\n const queryEmbedding = await this.generateEmbedding(agentType, taskType, payload);\n\n if (!queryEmbedding) {\n // Fallback to simple matching\n return this.findByType(agentType, taskType, limit);\n }\n\n // Calculate similarities\n const similarities: Array<{ experience: Experience; similarity: number }> = [];\n\n for (const [id, experience] of this.experiences.entries()) {\n // Only consider experiences from same agent/task type\n if (experience.agentType !== agentType || experience.taskType !== taskType) {\n continue;\n }\n\n // Only consider successful experiences\n if (!experience.metrics.success && experience.metrics.outcome !== 'success') {\n continue;\n }\n\n const embedding = this.embeddings.get(id);\n if (embedding) {\n const similarity = this.cosineSimilarity(queryEmbedding, embedding);\n similarities.push({ experience, similarity });\n }\n }\n\n // Sort by similarity and return top N\n similarities.sort((a, b) => b.similarity - a.similarity);\n\n const results = similarities.slice(0, limit).map(s => {\n // Update access stats\n s.experience.lastAccessedAt = new Date();\n s.experience.accessCount++;\n return s.experience;\n });\n\n logger.debug('Found similar experiences', {\n agentType,\n taskType,\n count: results.length,\n });\n\n return results;\n } catch (error) {\n logger.error('Failed to find similar experiences', {\n error: error instanceof Error ? error.message : 'Unknown error',\n agentType,\n taskType,\n });\n return [];\n }\n }\n\n /**\n * Find experiences by type (fallback method)\n */\n private findByType(agentType: string, taskType: string, limit: number): Experience[] {\n const results: Experience[] = [];\n\n for (const experience of this.experiences.values()) {\n if (experience.agentType === agentType && experience.taskType === taskType) {\n if (experience.metrics.success || experience.metrics.outcome === 'success') {\n results.push(experience);\n }\n }\n }\n\n // Sort by access count and recency\n results.sort((a, b) => {\n const scoreA = a.accessCount + (Date.now() - a.lastAccessedAt.getTime()) / 86400000;\n const scoreB = b.accessCount + (Date.now() - b.lastAccessedAt.getTime()) / 86400000;\n return scoreB - scoreA;\n });\n\n return results.slice(0, limit);\n }\n\n /**\n * Generate embedding vector (simplified - in production use actual embedding model)\n */\n private async generateEmbedding(\n agentType: string,\n taskType: string,\n // Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed\n payload: /* Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<number[]> {\n // Simplified embedding: hash-based vector\n // In production, use OpenAI/Anthropic embeddings or local model\n const text = `${agentType}:${taskType}:${JSON.stringify(payload)}`;\n const hash = this.simpleHash(text);\n\n // Generate 128-dimensional vector from hash\n const vector: number[] = [];\n for (let i = 0; i < 128; i++) {\n const seed = hash + i;\n vector.push(Math.sin(seed) * 0.5 + 0.5); // Normalize to [0, 1]\n }\n\n return vector;\n }\n\n /**\n * Simple hash function\n */\n private simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash);\n }\n\n /**\n * Calculate cosine similarity between two vectors\n */\n private cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n return 0;\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n return denominator === 0 ? 0 : dotProduct / denominator;\n }\n\n /**\n * Evict oldest experiences when size limit reached\n */\n private async evictOldest(): Promise<void> {\n const experiences = Array.from(this.experiences.values());\n\n // Sort by last accessed time (oldest first)\n experiences.sort((a, b) => a.lastAccessedAt.getTime() - b.lastAccessedAt.getTime());\n\n // Remove oldest 10%\n const toRemove = Math.floor(this.experiences.size * 0.1);\n for (let i = 0; i < toRemove; i++) {\n const exp = experiences[i];\n this.experiences.delete(exp.id);\n this.embeddings.delete(exp.id);\n }\n\n logger.debug('Evicted oldest experiences', { count: toRemove });\n }\n\n /**\n * Get experience by ID\n */\n getExperience(id: string): Experience | undefined {\n const experience = this.experiences.get(id);\n if (experience) {\n experience.lastAccessedAt = new Date();\n experience.accessCount++;\n }\n return experience;\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n totalExperiences: number;\n byAgentType: Record<string, number>;\n byTaskType: Record<string, number>;\n averageAccessCount: number;\n } {\n const byAgentType: Record<string, number> = {};\n const byTaskType: Record<string, number> = {};\n let totalAccessCount = 0;\n\n for (const experience of this.experiences.values()) {\n byAgentType[experience.agentType] = (byAgentType[experience.agentType] || 0) + 1;\n byTaskType[experience.taskType] = (byTaskType[experience.taskType] || 0) + 1;\n totalAccessCount += experience.accessCount;\n }\n\n return {\n totalExperiences: this.experiences.size,\n byAgentType,\n byTaskType,\n averageAccessCount: this.experiences.size > 0 ? totalAccessCount / this.experiences.size : 0,\n };\n }\n}\n","/**\n * Reinforcement Learning - Learn from outcomes\n *\n * Uses reinforcement learning to improve agent performance based on outcomes.\n *\n * @module agents/self-improvement/ReinforcementLearning\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport type { ExperienceLibrary } from './ExperienceLibrary';\n\nconst logger = createServiceLogger('ReinforcementLearning');\n\n/**\n * Learning policy\n */\nexport interface LearningPolicy {\n /** Agent type */\n agentType: string;\n /** Task type */\n taskType: string;\n /** Policy parameters */\n parameters: Record<string, number>;\n /** Success rate */\n successRate: number;\n /** Average execution time */\n averageExecutionTime: number;\n /** Last updated */\n lastUpdated: Date;\n}\n\n/**\n * Reinforcement Learning System\n *\n * Learns from agent outcomes to improve policies\n */\nexport class ReinforcementLearning {\n private policies: Map<string, LearningPolicy> = new Map();\n private experienceLibrary: ExperienceLibrary;\n private learningRate: number = 0.1; // How quickly to adapt\n private discountFactor: number = 0.9; // Future reward discount\n\n constructor(experienceLibrary: ExperienceLibrary) {\n this.experienceLibrary = experienceLibrary;\n }\n\n /**\n * Learn from task outcome\n */\n async learnFromOutcome(\n agentType: string,\n taskType: string,\n task: AgentTask,\n result: TaskResult,\n metrics: {\n executionTime: number;\n success: boolean;\n userRating?: number;\n }\n ): Promise<void> {\n try {\n const policyKey = `${agentType}:${taskType}`;\n let policy = this.policies.get(policyKey);\n\n if (!policy) {\n // Initialize new policy\n policy = {\n agentType,\n taskType,\n parameters: {},\n successRate: 0.5,\n averageExecutionTime: metrics.executionTime,\n lastUpdated: new Date(),\n };\n this.policies.set(policyKey, policy);\n }\n\n // Update success rate (exponential moving average)\n const reward = metrics.success ? 1 : metrics.userRating ? metrics.userRating / 5 : 0;\n policy.successRate =\n policy.successRate * (1 - this.learningRate) + reward * this.learningRate;\n\n // Update average execution time\n policy.averageExecutionTime =\n policy.averageExecutionTime * (1 - this.learningRate) +\n metrics.executionTime * this.learningRate;\n\n // Update parameters based on outcome\n await this.updateParameters(policy, task, result, metrics);\n\n policy.lastUpdated = new Date();\n\n logger.debug('Policy updated from outcome', {\n agentType,\n taskType,\n successRate: policy.successRate,\n reward,\n });\n } catch (error) {\n logger.error('Failed to learn from outcome', {\n error: error instanceof Error ? error.message : 'Unknown error',\n agentType,\n taskType,\n });\n }\n }\n\n /**\n * Get optimized parameters for task\n */\n // Using Record<string, unknown> because optimized parameters structure varies by task type and cannot be strictly typed\n getOptimizedParameters(\n agentType: string,\n taskType: string\n ): /* Using Record<string, unknown> because optimized parameters structure varies by task type and cannot be strictly typed */ Record<\n string,\n unknown\n > {\n const policyKey = `${agentType}:${taskType}`;\n const policy = this.policies.get(policyKey);\n\n if (!policy) {\n return {}; // Return defaults if no policy exists\n }\n\n // Return optimized parameters\n return {\n ...policy.parameters,\n _meta: {\n successRate: policy.successRate,\n averageExecutionTime: policy.averageExecutionTime,\n confidence: this.calculateConfidence(policy),\n },\n };\n }\n\n /**\n * Update policy parameters based on outcome\n */\n private async updateParameters(\n policy: LearningPolicy,\n task: AgentTask,\n result: TaskResult,\n metrics: {\n executionTime: number;\n success: boolean;\n userRating?: number;\n }\n ): Promise<void> {\n // Find similar successful experiences\n const similarExperiences = await this.experienceLibrary.findSimilar(\n policy.agentType,\n policy.taskType,\n // Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed\n task.payload as /* Using Record<string, unknown> because task payload structure varies by task type and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n 3\n );\n\n if (similarExperiences.length > 0 && metrics.success) {\n // If successful, reinforce parameters from similar successful experiences\n for (const experience of similarExperiences) {\n // Extract parameters from successful experience\n // This is simplified - in production, extract actual parameters\n const experienceParams = this.extractParameters(experience);\n\n // Update policy parameters towards successful patterns\n for (const [key, value] of Object.entries(experienceParams)) {\n if (typeof value === 'number') {\n policy.parameters[key] =\n (policy.parameters[key] || value) * (1 - this.learningRate) +\n value * this.learningRate;\n }\n }\n }\n } else if (!metrics.success) {\n // If failed, adjust parameters away from current values\n // This is simplified - in production, use more sophisticated RL algorithms\n for (const key of Object.keys(policy.parameters)) {\n policy.parameters[key] = policy.parameters[key] * (1 - this.learningRate * 0.5);\n }\n }\n }\n\n /**\n * Extract parameters from experience (simplified)\n */\n // Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed\n private extractParameters(experience: {\n payload: /* Using Record<string, unknown> because experience payload structure varies by experience type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n }): Record<string, number> {\n const params: Record<string, number> = {};\n\n // Extract numeric parameters from payload\n for (const [key, value] of Object.entries(experience.payload)) {\n if (typeof value === 'number') {\n params[key] = value;\n }\n }\n\n return params;\n }\n\n /**\n * Calculate confidence in policy\n */\n private calculateConfidence(policy: LearningPolicy): number {\n // Confidence based on success rate and number of updates\n const age = Date.now() - policy.lastUpdated.getTime();\n const recencyFactor = Math.exp(-age / (30 * 24 * 60 * 60 * 1000)); // Decay over 30 days\n\n return policy.successRate * recencyFactor;\n }\n\n /**\n * Get all policies\n */\n getPolicies(): LearningPolicy[] {\n return Array.from(this.policies.values());\n }\n\n /**\n * Get policy statistics\n */\n getStats(): {\n totalPolicies: number;\n averageSuccessRate: number;\n topPerforming: Array<{ agentType: string; taskType: string; successRate: number }>;\n } {\n const policies = Array.from(this.policies.values());\n const totalSuccessRate = policies.reduce((sum, p) => sum + p.successRate, 0);\n\n const topPerforming = policies\n .map(p => ({\n agentType: p.agentType,\n taskType: p.taskType,\n successRate: p.successRate,\n }))\n .sort((a, b) => b.successRate - a.successRate)\n .slice(0, 10);\n\n return {\n totalPolicies: policies.length,\n averageSuccessRate: policies.length > 0 ? totalSuccessRate / policies.length : 0,\n topPerforming,\n };\n }\n}\n","/**\n * ChatbotAgent - Customer support chatbot with RAG\n */\n\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { openai } from '@ai-sdk/openai';\nimport { generateText } from 'ai';\nimport type { AuditLogger } from '../../safety/AuditLogger';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nexport interface ChatbotPayload {\n conversationId: string;\n userId?: string;\n message: string;\n context?: {\n userHistory?: Array<{ role: 'user' | 'assistant'; content: string }>;\n userProfile?: {\n name?: string;\n tier?: 'free' | 'pro' | 'enterprise';\n // Using Record<string, unknown> because user preferences structure varies by user type and cannot be strictly typed\n preferences?: /* Using Record<string, unknown> because user preferences structure varies by user type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n };\n relevantDocs?: string[];\n };\n options?: {\n temperature?: number;\n maxTokens?: number;\n includeContext?: boolean;\n };\n}\n\nexport interface ChatbotResult {\n response: string;\n conversationId: string;\n metadata: {\n model: string;\n tokensUsed: number;\n responseTime: number;\n sources?: string[];\n confidence?: number;\n escalationNeeded?: boolean;\n };\n}\n\nexport class ChatbotAgent extends BaseAgent {\n private auditLogger?: AuditLogger;\n private conversationHistory: Map<string, Array<{ role: string; content: string }>> = new Map();\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.auditLogger = logger;\n }\n\n /**\n * Execute chatbot task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const startTime = Date.now();\n\n try {\n const payload = task.payload as ChatbotPayload;\n\n if (!payload.message || !payload.conversationId) {\n throw new Error('Missing required fields: message and conversationId');\n }\n\n // Log execution\n if (this.auditLogger) {\n await this.auditLogger.logTaskExecuted(task, {\n conversationId: payload.conversationId,\n messageLength: payload.message.length,\n });\n }\n\n // Get conversation history\n const history = this.getConversationHistory(\n payload.conversationId,\n payload.context?.userHistory\n );\n\n // Generate response\n const result = await this.generateResponse(payload, history);\n\n // Update conversation history\n this.updateConversationHistory(payload.conversationId, payload.message, result.response);\n\n // Log completion\n if (this.auditLogger) {\n await this.auditLogger.logTaskCompleted(task, result);\n }\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.auditLogger) {\n await this.auditLogger.logTaskFailed(\n task,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Generate chatbot response\n */\n private async generateResponse(\n payload: ChatbotPayload,\n history: Array<{ role: string; content: string }>\n ): Promise<ChatbotResult> {\n const startTime = Date.now();\n\n // Build system prompt\n const systemPrompt = this.buildSystemPrompt(payload);\n\n // Build conversation messages\n const messages = [\n { role: 'system' as const, content: systemPrompt },\n ...history.map(msg => ({\n role: msg.role as 'user' | 'assistant',\n content: msg.content,\n })),\n { role: 'user' as const, content: payload.message },\n ];\n\n const model = this.getModel();\n const { text, usage } = await generateText({\n model,\n messages,\n temperature: payload.options?.temperature ?? 0.7,\n maxTokens: payload.options?.maxTokens ?? 1000,\n });\n\n // Check if escalation needed\n const escalationNeeded = this.checkEscalationNeeded(payload.message, text);\n\n return {\n response: text,\n conversationId: payload.conversationId,\n metadata: {\n model: this.config.model,\n tokensUsed: usage?.totalTokens ?? 0,\n responseTime: Date.now() - startTime,\n sources: payload.context?.relevantDocs,\n escalationNeeded,\n },\n };\n }\n\n /**\n * Build system prompt\n */\n private buildSystemPrompt(payload: ChatbotPayload): string {\n const tier = payload.context?.userProfile?.tier || 'free';\n const userName = payload.context?.userProfile?.name || 'there';\n\n let prompt = `You are a helpful customer support assistant for a SaaS platform.\n\nYour role:\n- Answer questions about the platform, features, and pricing\n- Help users troubleshoot issues\n- Provide clear, concise, and friendly responses\n- Escalate complex technical issues to human support when needed\n\nUser tier: ${tier}\nUser name: ${userName}\n\nGuidelines:\n- Be professional but friendly\n- Keep responses concise (2-3 paragraphs max)\n- If you don't know something, admit it and offer to escalate\n- Always prioritize user satisfaction\n- Respect user preferences and tier limitations`;\n\n // Add relevant documentation context\n if (payload.context?.relevantDocs && payload.context.relevantDocs.length > 0) {\n prompt += `\\n\\nRelevant documentation:\\n${payload.context.relevantDocs.join('\\n\\n')}`;\n }\n\n return prompt;\n }\n\n /**\n * Get conversation history\n */\n private getConversationHistory(\n conversationId: string,\n providedHistory?: Array<{ role: 'user' | 'assistant'; content: string }>\n ): Array<{ role: string; content: string }> {\n // Use provided history if available\n if (providedHistory && providedHistory.length > 0) {\n return providedHistory;\n }\n\n // Otherwise use stored history\n return this.conversationHistory.get(conversationId) || [];\n }\n\n /**\n * Update conversation history\n */\n private updateConversationHistory(\n conversationId: string,\n userMessage: string,\n assistantResponse: string\n ): void {\n const history = this.conversationHistory.get(conversationId) || [];\n\n history.push(\n { role: 'user', content: userMessage },\n { role: 'assistant', content: assistantResponse }\n );\n\n // Keep only last 10 messages (5 turns) to avoid context overflow\n if (history.length > 10) {\n history.splice(0, history.length - 10);\n }\n\n this.conversationHistory.set(conversationId, history);\n }\n\n /**\n * Check if escalation to human is needed\n */\n private checkEscalationNeeded(userMessage: string, response: string): boolean {\n const escalationKeywords = [\n 'speak to a person',\n 'talk to human',\n 'need help',\n 'not working',\n 'broken',\n 'urgent',\n 'emergency',\n 'refund',\n 'cancel subscription',\n 'data breach',\n 'security issue',\n ];\n\n const lowercaseMessage = userMessage.toLowerCase();\n const lowercaseResponse = response.toLowerCase();\n\n // Check if user explicitly asks for human\n for (const keyword of escalationKeywords) {\n if (lowercaseMessage.includes(keyword)) {\n return true;\n }\n }\n\n // Check if assistant admits uncertainty\n if (\n lowercaseResponse.includes(\"i don't know\") ||\n lowercaseResponse.includes('not sure') ||\n lowercaseResponse.includes('unable to help')\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Clear conversation history (for cleanup)\n */\n clearConversationHistory(conversationId?: string): void {\n if (conversationId) {\n this.conversationHistory.delete(conversationId);\n } else {\n this.conversationHistory.clear();\n }\n }\n\n /**\n * Get AI model based on config\n */\n private getModel() {\n const modelName = this.config.model;\n\n if (modelName.startsWith('claude')) {\n return anthropic(modelName);\n }\n if (modelName.startsWith('gpt')) {\n return openai(modelName);\n }\n\n return openai('gpt-4o'); // GPT-4o is good for conversations\n }\n}\n","/**\n * ContentGenerationAgent - Generate marketing and product content\n */\n\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { openai } from '@ai-sdk/openai';\nimport { generateText } from 'ai';\nimport type { AuditLogger } from '../../safety/AuditLogger';\nimport type { RiskClassifier } from '../../safety/RiskClassifier';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nexport interface ContentGenerationPayload {\n type:\n | 'blog-post'\n | 'product-description'\n | 'marketing-copy'\n | 'social-media'\n | 'email-template'\n | 'landing-page';\n topic?: string;\n title?: string;\n keywords?: string[];\n tone?: 'professional' | 'casual' | 'technical' | 'friendly' | 'persuasive';\n length?: 'short' | 'medium' | 'long';\n audience?: 'developers' | 'business' | 'general' | 'technical';\n context?: {\n brandVoice?: string;\n targetMarket?: string;\n productFeatures?: string[];\n competitors?: string[];\n callToAction?: string;\n };\n seo?: {\n metaTitle?: string;\n metaDescription?: string;\n targetKeywords?: string[];\n };\n}\n\nexport interface ContentGenerationResult {\n content: string;\n format: 'markdown' | 'html' | 'plain';\n metadata: {\n title?: string;\n wordCount: number;\n readingTime: string;\n keywords?: string[];\n seo?: {\n metaTitle: string;\n metaDescription: string;\n suggestions: string[];\n };\n };\n variations?: string[];\n}\n\nexport class ContentGenerationAgent extends BaseAgent {\n private riskClassifier?: RiskClassifier;\n private auditLogger?: AuditLogger;\n\n /**\n * Set risk classifier\n */\n setRiskClassifier(classifier: RiskClassifier): void {\n this.riskClassifier = classifier;\n }\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.auditLogger = logger;\n }\n\n /**\n * Execute content generation task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const startTime = Date.now();\n\n try {\n const payload = task.payload as ContentGenerationPayload;\n\n if (!payload.type) {\n throw new Error('Missing required field: type');\n }\n\n // Classify risk\n if (this.riskClassifier) {\n const risk = this.riskClassifier.classify(task);\n if (risk.requiresApproval) {\n return {\n taskId: task.id,\n success: false,\n error: 'Content generation requires approval before execution',\n executionTime: Date.now() - startTime,\n metadata: { riskAssessment: risk },\n };\n }\n }\n\n // Log execution\n if (this.auditLogger) {\n await this.auditLogger.logTaskExecuted(task);\n }\n\n // Generate content based on type\n let result: ContentGenerationResult;\n\n switch (payload.type) {\n case 'blog-post':\n result = await this.generateBlogPost(payload);\n break;\n case 'product-description':\n result = await this.generateProductDescription(payload);\n break;\n case 'marketing-copy':\n result = await this.generateMarketingCopy(payload);\n break;\n case 'social-media':\n result = await this.generateSocialMedia(payload);\n break;\n case 'email-template':\n result = await this.generateEmailTemplate(payload);\n break;\n case 'landing-page':\n result = await this.generateLandingPage(payload);\n break;\n default:\n throw new Error(`Unknown content type: ${payload.type}`);\n }\n\n // Log completion\n if (this.auditLogger) {\n await this.auditLogger.logTaskCompleted(task, result);\n }\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.auditLogger) {\n await this.auditLogger.logTaskFailed(\n task,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Generate blog post\n */\n private async generateBlogPost(\n payload: ContentGenerationPayload\n ): Promise<ContentGenerationResult> {\n const wordTarget = this.getWordTarget(payload.length);\n const tone = payload.tone || 'professional';\n const audience = payload.audience || 'general';\n\n const prompt = `Write a blog post about: ${payload.topic || payload.title}\n\nRequirements:\n- Target length: ${wordTarget} words\n- Tone: ${tone}\n- Audience: ${audience}\n${payload.keywords ? `- Include keywords: ${payload.keywords.join(', ')}` : ''}\n${payload.context?.brandVoice ? `- Brand voice: ${payload.context.brandVoice}` : ''}\n\nStructure:\n1. Engaging introduction with hook\n2. 3-5 main sections with subheadings\n3. Key takeaways or summary\n4. Call to action\n\n${payload.context?.callToAction ? `CTA: ${payload.context.callToAction}` : ''}\n\nWrite in markdown format. Make it engaging, informative, and actionable.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.8,\n maxTokens: wordTarget * 2,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n content: text,\n format: 'markdown',\n metadata: {\n title: payload.title,\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n keywords: payload.keywords,\n seo: payload.seo\n ? {\n metaTitle: payload.seo.metaTitle || payload.title || 'Blog Post',\n metaDescription:\n payload.seo.metaDescription || text.substring(0, 160).replace(/\\n/g, ' '),\n suggestions: this.generateSEOSuggestions(text, payload.keywords || []),\n }\n : undefined,\n },\n };\n }\n\n /**\n * Generate product description\n */\n private async generateProductDescription(\n payload: ContentGenerationPayload\n ): Promise<ContentGenerationResult> {\n const tone = payload.tone || 'persuasive';\n\n const prompt = `Write a compelling product description for: ${payload.title}\n\n${payload.context?.productFeatures ? `Features:\\n${payload.context.productFeatures.map(f => `- ${f}`).join('\\n')}` : ''}\n\n${payload.context?.targetMarket ? `Target market: ${payload.context.targetMarket}` : ''}\n\nRequirements:\n- Tone: ${tone}\n- Length: ${this.getWordTarget(payload.length)} words\n- Highlight benefits, not just features\n- Address customer pain points\n- Include social proof or testimonials (if relevant)\n${payload.context?.callToAction ? `- CTA: ${payload.context.callToAction}` : ''}\n\nMake it persuasive and conversion-focused.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.7,\n maxTokens: 800,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n content: text,\n format: 'plain',\n metadata: {\n title: payload.title,\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n keywords: payload.keywords,\n },\n };\n }\n\n /**\n * Generate marketing copy\n */\n private async generateMarketingCopy(\n payload: ContentGenerationPayload\n ): Promise<ContentGenerationResult> {\n const tone = payload.tone || 'persuasive';\n\n const prompt = `Write marketing copy for: ${payload.title || payload.topic}\n\n${payload.context?.productFeatures ? `Product features:\\n${payload.context.productFeatures.map(f => `- ${f}`).join('\\n')}` : ''}\n\nRequirements:\n- Tone: ${tone}\n- Length: ${this.getWordTarget(payload.length)} words\n- Focus on benefits and outcomes\n- Use power words and emotional triggers\n- Include strong call to action\n${payload.keywords ? `- Incorporate: ${payload.keywords.join(', ')}` : ''}\n\n${payload.context?.callToAction ? `CTA: ${payload.context.callToAction}` : 'Include a compelling CTA'}\n\nMake it compelling and conversion-optimized.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.8,\n maxTokens: 600,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n content: text,\n format: 'plain',\n metadata: {\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n keywords: payload.keywords,\n },\n };\n }\n\n /**\n * Generate social media content\n */\n private async generateSocialMedia(\n payload: ContentGenerationPayload\n ): Promise<ContentGenerationResult> {\n const tone = payload.tone || 'casual';\n\n const prompt = `Create social media posts about: ${payload.topic || payload.title}\n\nRequirements:\n- Tone: ${tone}\n- Create 3 variations\n- Include hashtags\n- Keep under 280 characters each\n- Make them engaging and shareable\n${payload.keywords ? `- Use: ${payload.keywords.join(', ')}` : ''}\n\nFormat: Return 3 variations separated by ---`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.9,\n maxTokens: 500,\n });\n\n const variations = text.split('---').map(v => v.trim());\n\n return {\n content: variations[0],\n format: 'plain',\n metadata: {\n wordCount: variations[0].split(/\\s+/).length,\n readingTime: '<1 min',\n },\n variations: variations.slice(1),\n };\n }\n\n /**\n * Generate email template\n */\n private async generateEmailTemplate(\n payload: ContentGenerationPayload\n ): Promise<ContentGenerationResult> {\n const tone = payload.tone || 'professional';\n\n const prompt = `Create an email template for: ${payload.title || payload.topic}\n\nRequirements:\n- Tone: ${tone}\n- Include subject line\n- Clear structure (greeting, body, CTA, signature)\n- Personalization placeholders ({{name}}, {{product}}, etc.)\n- Mobile-friendly format\n${payload.context?.callToAction ? `- CTA: ${payload.context.callToAction}` : ''}\n\nMake it effective for ${payload.audience || 'general'} audience.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.7,\n maxTokens: 800,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n content: text,\n format: 'plain',\n metadata: {\n title: payload.title,\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n },\n };\n }\n\n /**\n * Generate landing page copy\n */\n private async generateLandingPage(\n payload: ContentGenerationPayload\n ): Promise<ContentGenerationResult> {\n const prompt = `Create landing page copy for: ${payload.title || payload.topic}\n\n${payload.context?.productFeatures ? `Features:\\n${payload.context.productFeatures.map(f => `- ${f}`).join('\\n')}` : ''}\n\nInclude:\n- Attention-grabbing headline\n- Compelling subheadline\n- Hero section copy\n- 3-4 benefit sections\n- Social proof section\n- FAQ section (3-5 questions)\n- Strong closing CTA\n\nTone: ${payload.tone || 'persuasive'}\nAudience: ${payload.audience || 'business'}\n${payload.context?.callToAction ? `Primary CTA: ${payload.context.callToAction}` : ''}\n\nWrite in markdown format. Focus on conversion optimization.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.7,\n maxTokens: 2000,\n });\n\n const wordCount = text.split(/\\s+/).length;\n\n return {\n content: text,\n format: 'markdown',\n metadata: {\n title: payload.title,\n wordCount,\n readingTime: `${Math.ceil(wordCount / 200)} min`,\n keywords: payload.keywords,\n },\n };\n }\n\n /**\n * Get word target based on length\n */\n private getWordTarget(length?: 'short' | 'medium' | 'long'): number {\n switch (length) {\n case 'short':\n return 300;\n case 'long':\n return 1500;\n default:\n return 800;\n }\n }\n\n /**\n * Generate SEO suggestions\n */\n private generateSEOSuggestions(content: string, keywords: string[]): string[] {\n const suggestions: string[] = [];\n\n // Check keyword usage\n for (const keyword of keywords) {\n const count = (content.match(new RegExp(keyword, 'gi')) || []).length;\n if (count === 0) {\n suggestions.push(`Add keyword: \"${keyword}\"`);\n } else if (count > 10) {\n suggestions.push(`Reduce \"${keyword}\" usage (appears ${count} times)`);\n }\n }\n\n // Check content length\n const wordCount = content.split(/\\s+/).length;\n if (wordCount < 300) {\n suggestions.push('Content is short - consider expanding for better SEO');\n }\n\n return suggestions;\n }\n\n /**\n * Get AI model based on config\n */\n private getModel() {\n const modelName = this.config.model;\n\n if (modelName.startsWith('claude')) {\n return anthropic(modelName);\n }\n if (modelName.startsWith('gpt')) {\n return openai(modelName);\n }\n\n return openai('gpt-4o'); // GPT-4o is good for content\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type FAQFormat = 'markdown' | 'text';\n\nexport interface FAQMatch {\n section: string;\n question: string;\n answer: string;\n confidence: number;\n}\n\nexport interface FAQResolveOptions {\n question: string;\n format?: FAQFormat;\n maxAnswers?: number;\n faqPath?: string;\n}\n\nexport interface FAQResolveResult {\n matches: FAQMatch[];\n source: string;\n generatedAt: string;\n}\n\ninterface FAQEntry {\n section: string;\n question: string;\n answer: string;\n}\n\ninterface FAQCache {\n entries: FAQEntry[];\n mtime: number;\n}\n\nconst defaultFaqPath = path.resolve(process.cwd(), 'docs/meta/SELF_SERVE_FAQ.md');\nlet cache: FAQCache | null = null;\n\nexport async function resolveFAQ(options: FAQResolveOptions): Promise<FAQResolveResult> {\n const { question, format = 'markdown', maxAnswers = 1, faqPath = defaultFaqPath } = options;\n\n if (!question?.trim()) {\n throw new Error('FAQ question is required.');\n }\n\n const entries = loadFAQEntries(faqPath);\n const allMatches = findMatches(entries, question, maxAnswers * 2); // Get more matches for filtering\n\n // Filter and process matches using ResultProcessor\n const { process: processResults } = await import('./result-processor');\n const processed = processResults(\n allMatches.map(match => ({\n section: match.section,\n question: match.entry.question,\n answer: format === 'text' ? toPlainText(match.entry.answer) : match.entry.answer,\n confidence: match.score,\n })),\n {\n topN: maxAnswers,\n confidenceThreshold: 0.1, // Minimum confidence threshold\n summarize: allMatches.length > maxAnswers * 2, // Summarize if we have many results\n }\n );\n\n let matches = processed.data as FAQMatch[];\n\n // If no matches after filtering, add fallback\n if (matches.length === 0 || matches.every(m => m.confidence === 0)) {\n matches = [\n {\n section: 'general',\n question: 'No direct answer found',\n answer:\n 'I could not find a matching FAQ entry. Please escalate to the founding team or update docs/meta/SELF_SERVE_FAQ.md with this question.',\n confidence: 0,\n },\n ];\n }\n\n return {\n matches,\n source: faqPath,\n generatedAt: new Date().toISOString(),\n };\n}\n\nfunction loadFAQEntries(faqPath: string): FAQEntry[] {\n try {\n const stats = fs.statSync(faqPath);\n if (cache && cache.mtime === stats.mtimeMs) {\n return cache.entries;\n }\n\n const content = fs.readFileSync(faqPath, 'utf8');\n const entries = parseFAQ(content);\n cache = { entries, mtime: stats.mtimeMs };\n return entries;\n } catch (error) {\n throw new Error(\n `Unable to read FAQ source (${faqPath}): ${error instanceof Error ? error.message : 'unknown error'}`\n );\n }\n}\n\nfunction parseFAQ(markdown: string): FAQEntry[] {\n const lines = markdown.split(/\\r?\\n/);\n const entries: FAQEntry[] = [];\n let currentSection = '';\n let currentQuestion: string | null = null;\n let buffer: string[] = [];\n\n const pushEntry = () => {\n if (currentQuestion && buffer.length > 0) {\n entries.push({\n section: currentSection || 'General',\n question: currentQuestion.trim(),\n answer: buffer.join('\\n').trim(),\n });\n }\n };\n\n for (const line of lines) {\n if (line.startsWith('## ') && !line.startsWith('###')) {\n pushEntry();\n currentSection = line.replace(/^##\\s+/, '').trim();\n currentQuestion = null;\n buffer = [];\n continue;\n }\n\n if (line.startsWith('### ')) {\n pushEntry();\n currentQuestion = line.replace(/^###\\s+/, '').trim();\n buffer = [];\n continue;\n }\n\n if (currentQuestion) {\n buffer.push(line);\n }\n }\n\n pushEntry();\n return entries.filter(entry => entry.question && entry.answer);\n}\n\nfunction findMatches(entries: FAQEntry[], question: string, maxAnswers: number) {\n const normalizedQuestion = question.toLowerCase();\n const questionTokens = new Set(normalizedQuestion.split(/[^a-z0-9]+/).filter(Boolean));\n\n return entries\n .map(entry => {\n const tokens = new Set(\n entry.question\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean)\n );\n let score = 0;\n\n for (const token of questionTokens) {\n if (tokens.has(token)) score += 2;\n }\n\n if (!score && entry.answer.toLowerCase().includes(normalizedQuestion)) {\n score = 1;\n }\n\n return { entry, score, section: entry.section };\n })\n .filter(item => item.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, Math.max(1, maxAnswers));\n}\n\nfunction toPlainText(markdown: string): string {\n return markdown\n .replace(/`([^`]+)`/g, '$1')\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1')\n .replace(/^\\s*-\\s+/gm, '')\n .replace(/\\[([^\\]]+)]\\(([^)]+)\\)/g, '$1')\n .replace(/#+\\s*/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n","import type { AgentTask, TaskResult } from '../../types/tasks';\nimport { resolveFAQ } from '../../utils/faq';\nimport { BaseAgent } from '../BaseAgent';\n\ntype FAQFormat = 'markdown' | 'text';\n\nexport interface FAQPayload {\n question: string;\n maxAnswers?: number;\n format?: FAQFormat;\n}\n\n/**\n * FAQAgent - lightweight knowledge-base responder sourced from SELF_SERVE_FAQ.md\n *\n * Delegates the heavy lifting to the shared `resolveFAQ` utility so MCP tasks\n * and HTTP endpoints stay in sync.\n */\nexport class FAQAgent extends BaseAgent {\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const start = Date.now();\n\n try {\n const payload = task.payload as FAQPayload;\n\n if (!payload?.question?.trim()) {\n throw new Error('FAQ question is required.');\n }\n\n const data = await resolveFAQ({\n question: payload.question,\n format: payload.format,\n maxAnswers: payload.maxAnswers,\n });\n\n return {\n taskId: task.id,\n success: true,\n data,\n executionTime: Date.now() - start,\n };\n } catch (error) {\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - start,\n };\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type LaunchKitReminderScope = 'overdue' | 'upcoming' | 'pending' | 'all';\n\nexport interface LaunchKitReminderOptions {\n scope?: LaunchKitReminderScope;\n upcomingDays?: number;\n kitsDir?: string;\n}\n\nexport interface LaunchKitTaskReminder {\n kit: string;\n file: string;\n workstream: string;\n task: string;\n owner: string;\n targetDate?: string;\n status: string;\n}\n\nexport interface LaunchKitReminderResult {\n tasks: LaunchKitTaskReminder[];\n metadata: {\n scope: LaunchKitReminderScope;\n upcomingDays: number;\n generatedAt: string;\n };\n}\n\nconst defaultKitsDir = path.resolve(process.cwd(), 'docs/meta/launch-kits');\n\nexport async function resolveLaunchKitReminders(\n options: LaunchKitReminderOptions = {}\n): Promise<LaunchKitReminderResult> {\n const { scope = 'upcoming', upcomingDays = 7, kitsDir = defaultKitsDir } = options;\n\n const tasks = collectTasks(kitsDir);\n let filtered = filterTasks(tasks, scope, upcomingDays);\n\n // Apply result processing for large result sets\n if (filtered.length > 50) {\n const { process: processResults } = await import('./result-processor');\n const processed = processResults(filtered, {\n maxSize: 100000, // Limit to ~100KB\n pagination: filtered.length > 100 ? { page: 1, pageSize: 100 } : undefined,\n });\n filtered = processed.data;\n }\n\n return {\n tasks: filtered,\n metadata: {\n scope,\n upcomingDays,\n generatedAt: new Date().toISOString(),\n },\n };\n}\n\nfunction collectTasks(kitsDir: string): LaunchKitTaskReminder[] {\n if (!fs.existsSync(kitsDir)) {\n return [];\n }\n\n const files = fs.readdirSync(kitsDir).filter(file => file.endsWith('.md'));\n const tasks: LaunchKitTaskReminder[] = [];\n\n for (const file of files) {\n const filePath = path.join(kitsDir, file);\n const content = fs.readFileSync(filePath, 'utf8');\n const kitName = extractKitName(content, file);\n const trackerRows = extractTrackerRows(content);\n\n for (const row of trackerRows) {\n tasks.push({\n kit: kitName,\n file: path.relative(process.cwd(), filePath),\n workstream: row.workstream,\n task: row.task,\n owner: row.owner,\n targetDate: row.targetDate,\n status: row.status,\n });\n }\n }\n\n return tasks;\n}\n\nfunction extractKitName(content: string, filename: string): string {\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n return headingMatch[1].trim();\n }\n return filename.replace(/_/g, ' ').replace(/\\.md$/, '');\n}\n\nfunction extractTrackerRows(content: string): Array<{\n workstream: string;\n task: string;\n owner: string;\n targetDate?: string;\n status: string;\n}> {\n const lines = content.split(/\\r?\\n/);\n const rows: Array<{\n workstream: string;\n task: string;\n owner: string;\n targetDate?: string;\n status: string;\n }> = [];\n\n const trackerIndex = lines.findIndex(line =>\n line.trim().toLowerCase().startsWith('## ownership & timeline tracker')\n );\n if (trackerIndex === -1) {\n return rows;\n }\n\n for (let i = trackerIndex + 2; i < lines.length; i++) {\n const line = lines[i];\n if (!line || !line.includes('|')) {\n if (line.trim().startsWith('---') || line.startsWith('## ')) {\n break;\n }\n continue;\n }\n\n if (line.trim().startsWith('| ---')) {\n continue;\n }\n\n const cells = line\n .split('|')\n .map(cell => cell.trim())\n .filter(Boolean);\n\n if (cells.length < 5) {\n continue;\n }\n\n rows.push({\n workstream: cells[0],\n task: cells[1],\n owner: cells[2],\n targetDate: cells[3] || undefined,\n status: cells[4],\n });\n }\n\n return rows;\n}\n\nfunction filterTasks(\n tasks: LaunchKitTaskReminder[],\n scope: LaunchKitReminderScope,\n upcomingDays: number\n): LaunchKitTaskReminder[] {\n const now = new Date();\n const upcomingThreshold = new Date(now.getTime() + upcomingDays * 24 * 60 * 60 * 1000);\n\n return tasks.filter(task => {\n const targetDate = task.targetDate ? new Date(task.targetDate) : null;\n const statusLower = task.status.toLowerCase();\n\n switch (scope) {\n case 'overdue':\n return !!targetDate && targetDate < now && !statusLower.includes('complete');\n case 'upcoming':\n return (\n !!targetDate &&\n targetDate >= now &&\n targetDate <= upcomingThreshold &&\n !statusLower.includes('complete')\n );\n case 'pending':\n return statusLower.includes('pending');\n default:\n return true;\n }\n });\n}\n","import type { AgentTask, TaskResult } from '../../types/tasks';\nimport { type LaunchKitReminderScope, resolveLaunchKitReminders } from '../../utils/launchkits';\nimport { BaseAgent } from '../BaseAgent';\n\nexport interface LaunchKitReminderPayload {\n scope?: LaunchKitReminderScope;\n upcomingDays?: number;\n}\n\n/**\n * LaunchKitReminderAgent - surfaces launch-kit tasks that require attention\n */\nexport class LaunchKitReminderAgent extends BaseAgent {\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const start = Date.now();\n\n try {\n const payload = task.payload as LaunchKitReminderPayload | undefined;\n const result = resolveLaunchKitReminders({\n scope: payload?.scope,\n upcomingDays: payload?.upcomingDays,\n });\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - start,\n };\n } catch (error) {\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - start,\n };\n }\n }\n}\n","/**\n * PersonalizationAgent - Content and product recommendations\n */\n\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { openai } from '@ai-sdk/openai';\nimport { generateText } from 'ai';\nimport type { AuditLogger } from '../../safety/AuditLogger';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\n\nexport interface PersonalizationPayload {\n type: 'content-recommendations' | 'product-suggestions' | 'ui-customization' | 'notifications';\n userId: string;\n userProfile?: {\n // Using Record<string, unknown> because user preferences structure varies by user type and cannot be strictly typed\n preferences?: /* Using Record<string, unknown> because user preferences structure varies by user type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n behavior?: {\n viewedItems?: string[];\n purchasedItems?: string[];\n searchHistory?: string[];\n interactions?: Array<{\n type: string;\n item: string;\n timestamp: number;\n }>;\n };\n demographics?: {\n location?: string;\n language?: string;\n timezone?: string;\n };\n };\n availableItems?: Array<{\n id: string;\n title: string;\n category: string;\n tags?: string[];\n // Using Record<string, unknown> because content metadata structure varies by content type and cannot be strictly typed\n metadata?: /* Using Record<string, unknown> because content metadata structure varies by content type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n }>;\n limit?: number;\n}\n\nexport interface PersonalizationResult {\n recommendations: Array<{\n itemId: string;\n title?: string;\n score: number;\n reason: string;\n category?: string;\n }>;\n metadata: {\n algorithm: string;\n confidence: number;\n diversity: number;\n totalCandidates: number;\n };\n}\n\nexport class PersonalizationAgent extends BaseAgent {\n private auditLogger?: AuditLogger;\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.auditLogger = logger;\n }\n\n /**\n * Execute personalization task\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n const startTime = Date.now();\n\n try {\n const payload = task.payload as PersonalizationPayload;\n\n if (!payload.type || !payload.userId) {\n throw new Error('Missing required fields: type and userId');\n }\n\n // Log execution\n if (this.auditLogger) {\n await this.auditLogger.logTaskExecuted(task, {\n userId: payload.userId,\n type: payload.type,\n });\n }\n\n // Execute based on type\n let result: PersonalizationResult;\n\n switch (payload.type) {\n case 'content-recommendations':\n result = await this.recommendContent(payload);\n break;\n case 'product-suggestions':\n result = await this.suggestProducts(payload);\n break;\n case 'ui-customization':\n result = await this.customizeUI(payload);\n break;\n case 'notifications':\n result = await this.personalizeNotifications(payload);\n break;\n default:\n throw new Error(`Unknown personalization type: ${payload.type}`);\n }\n\n // Log completion\n if (this.auditLogger) {\n await this.auditLogger.logTaskCompleted(task, result);\n }\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.auditLogger) {\n await this.auditLogger.logTaskFailed(\n task,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n executionTime: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Recommend content\n */\n private async recommendContent(payload: PersonalizationPayload): Promise<PersonalizationResult> {\n const limit = payload.limit || 5;\n\n // Build user profile summary\n const profileSummary = this.buildProfileSummary(payload);\n\n const prompt = `Based on this user profile, recommend ${limit} content items:\n\nUser Profile:\n${profileSummary}\n\n${payload.availableItems ? `Available content:\\n${JSON.stringify(payload.availableItems.slice(0, 20), null, 2)}` : ''}\n\nProvide recommendations in JSON format:\n{\n \"recommendations\": [\n {\n \"itemId\": \"...\",\n \"score\": 0.0-1.0,\n \"reason\": \"Why this is recommended\",\n \"category\": \"...\"\n }\n ]\n}\n\nReturn ONLY valid JSON. Prioritize relevance and diversity.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.6,\n maxTokens: 1500,\n });\n\n const parsed = JSON.parse(text);\n\n return {\n recommendations: parsed.recommendations.slice(0, limit),\n metadata: {\n algorithm: 'ai-collaborative-filtering',\n confidence: 0.85,\n diversity: 0.7,\n totalCandidates: payload.availableItems?.length || 0,\n },\n };\n }\n\n /**\n * Suggest products\n */\n private async suggestProducts(payload: PersonalizationPayload): Promise<PersonalizationResult> {\n const limit = payload.limit || 5;\n const profileSummary = this.buildProfileSummary(payload);\n\n const prompt = `Suggest ${limit} products for this user:\n\nUser Profile:\n${profileSummary}\n\n${payload.availableItems ? `Available products:\\n${JSON.stringify(payload.availableItems.slice(0, 20), null, 2)}` : ''}\n\nConsider:\n- Purchase history\n- Viewing behavior\n- Similar users' preferences\n- Trending items\n- Seasonal relevance\n\nProvide JSON response with product suggestions, scores, and reasons.\nReturn ONLY valid JSON.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.5,\n maxTokens: 1500,\n });\n\n const parsed = JSON.parse(text);\n\n return {\n recommendations: parsed.recommendations.slice(0, limit),\n metadata: {\n algorithm: 'ai-product-recommendations',\n confidence: 0.8,\n diversity: 0.6,\n totalCandidates: payload.availableItems?.length || 0,\n },\n };\n }\n\n /**\n * Customize UI\n */\n private async customizeUI(payload: PersonalizationPayload): Promise<PersonalizationResult> {\n const profileSummary = this.buildProfileSummary(payload);\n\n const prompt = `Suggest UI customizations for this user:\n\nUser Profile:\n${profileSummary}\n\nSuggest:\n- Theme preferences (light/dark/auto)\n- Layout preferences (compact/comfortable/spacious)\n- Feature shortcuts (top 5 most useful features for this user)\n- Widget recommendations\n- Notification settings\n\nProvide JSON with customization recommendations.\nReturn ONLY valid JSON.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.6,\n maxTokens: 1000,\n });\n\n const parsed = JSON.parse(text);\n\n return {\n recommendations: parsed.recommendations || [],\n metadata: {\n algorithm: 'ai-ui-personalization',\n confidence: 0.75,\n diversity: 0.5,\n totalCandidates: 10,\n },\n };\n }\n\n /**\n * Personalize notifications\n */\n private async personalizeNotifications(\n payload: PersonalizationPayload\n ): Promise<PersonalizationResult> {\n const profileSummary = this.buildProfileSummary(payload);\n\n const prompt = `Suggest notification personalization for this user:\n\nUser Profile:\n${profileSummary}\n\nRecommend:\n- Notification frequency (real-time, hourly, daily, weekly)\n- Channels (email, push, SMS, in-app)\n- Content types to notify about\n- Quiet hours\n- Priority settings\n\nProvide JSON with notification preferences.\nReturn ONLY valid JSON.`;\n\n const model = this.getModel();\n const { text } = await generateText({\n model,\n prompt,\n temperature: 0.5,\n maxTokens: 800,\n });\n\n const parsed = JSON.parse(text);\n\n return {\n recommendations: parsed.recommendations || [],\n metadata: {\n algorithm: 'ai-notification-personalization',\n confidence: 0.8,\n diversity: 0.4,\n totalCandidates: 5,\n },\n };\n }\n\n /**\n * Build user profile summary\n */\n private buildProfileSummary(payload: PersonalizationPayload): string {\n const parts: string[] = [];\n\n if (payload.userProfile?.preferences) {\n parts.push(\n `Preferences: ${JSON.stringify(payload.userProfile.preferences, null, 2).substring(0, 200)}`\n );\n }\n\n if (payload.userProfile?.behavior?.viewedItems) {\n parts.push(\n `Recently viewed: ${payload.userProfile.behavior.viewedItems.slice(0, 5).join(', ')}`\n );\n }\n\n if (payload.userProfile?.behavior?.purchasedItems) {\n parts.push(\n `Previously purchased: ${payload.userProfile.behavior.purchasedItems.slice(0, 3).join(', ')}`\n );\n }\n\n if (payload.userProfile?.behavior?.searchHistory) {\n parts.push(\n `Search history: ${payload.userProfile.behavior.searchHistory.slice(0, 5).join(', ')}`\n );\n }\n\n if (payload.userProfile?.demographics) {\n parts.push(`Demographics: ${JSON.stringify(payload.userProfile.demographics)}`);\n }\n\n return parts.join('\\n') || 'No profile data available';\n }\n\n /**\n * Get AI model based on config\n */\n private getModel() {\n const modelName = this.config.model;\n\n if (modelName.startsWith('claude')) {\n return anthropic(modelName);\n }\n if (modelName.startsWith('gpt')) {\n return openai(modelName);\n }\n\n return openai('gpt-4o');\n }\n}\n","/**\n * WorkflowAutomationAgent - Automate workflows and tasks\n */\n\nimport type { AgentRegistry } from '../../core/AgentRegistry';\nimport type { MessageBroker } from '../../core/MessageBroker';\nimport type { ProtocolHandler } from '../../core/ProtocolHandler';\nimport type { AuditLogger } from '../../safety/AuditLogger';\nimport type { RiskClassifier } from '../../safety/RiskClassifier';\nimport type { AgentConfig } from '../../types/agents';\nimport type { AgentTask, TaskResult } from '../../types/tasks';\nimport { BaseAgent } from '../BaseAgent';\nimport { BaseAgentExecutor, createCommandHandler } from '../BaseAgentExecutor';\n\nexport interface WorkflowPayload {\n type: 'data-export' | 'report-generation' | 'bulk-operation' | 'scheduled-task' | 'integration';\n workflowName: string;\n description: string;\n data?: unknown;\n // Using Record<string, unknown> because workflow parameters structure varies by workflow type and cannot be strictly typed\n parameters?: /* Using Record<string, unknown> because workflow parameters structure varies by workflow type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n schedule?: {\n frequency: 'once' | 'daily' | 'weekly' | 'monthly';\n time?: string;\n timezone?: string;\n };\n output?: {\n format: 'json' | 'csv' | 'pdf' | 'xlsx';\n destination?: string;\n };\n}\n\nexport interface WorkflowResult {\n workflowId: string;\n status: 'completed' | 'scheduled' | 'failed';\n output?: unknown;\n metadata: {\n recordsProcessed?: number;\n executionTime: number;\n nextRun?: number;\n errors?: string[];\n };\n}\n\n/**\n * Workflow Automation Executor - Implements command pattern for workflow execution\n */\nclass WorkflowExecutor extends BaseAgentExecutor {\n protected setupCommandHandlers(): void {\n // Register all workflow command handlers\n this.commandRegistry.register(\n createCommandHandler('data-export', (payload: WorkflowPayload) =>\n this.executeDataExport(payload)\n )\n );\n this.commandRegistry.register(\n createCommandHandler('report-generation', (payload: WorkflowPayload) =>\n this.generateReport(payload)\n )\n );\n this.commandRegistry.register(\n createCommandHandler('bulk-operation', (payload: WorkflowPayload) =>\n this.executeBulkOperation(payload)\n )\n );\n this.commandRegistry.register(\n createCommandHandler('scheduled-task', (payload: WorkflowPayload) =>\n this.scheduleTask(payload)\n )\n );\n this.commandRegistry.register(\n createCommandHandler('integration', (payload: WorkflowPayload) =>\n this.executeIntegration(payload)\n )\n );\n }\n\n protected validatePayload(payload: unknown): void {\n const p = payload as WorkflowPayload;\n if (!p.type || !p.workflowName) {\n throw new Error('Missing required fields: type and workflowName');\n }\n }\n\n // Using Record<string, unknown> because workflow task context structure varies by workflow type and cannot be strictly typed\n protected getTaskContext(\n payload: unknown\n ): /* Using Record<string, unknown> because workflow task context structure varies by workflow type and cannot be strictly typed */ Record<\n string,\n unknown\n > {\n const p = payload as WorkflowPayload;\n return {\n workflow: p.workflowName,\n type: p.type,\n description: p.description,\n };\n }\n\n protected getPayloadType(payload: unknown): string {\n return (payload as WorkflowPayload).type;\n }\n\n /**\n * Execute data export workflow\n */\n private async executeDataExport(payload: WorkflowPayload): Promise<WorkflowResult> {\n const workflowId = `export_${Date.now()}`;\n const startTime = Date.now();\n\n // Simulate data export process\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n return {\n workflowId,\n status: 'completed',\n output: { exportedRecords: 150, format: payload.output?.format || 'json' },\n metadata: {\n recordsProcessed: 150,\n executionTime: Date.now() - startTime,\n },\n };\n }\n\n /**\n * Generate report workflow\n */\n private async generateReport(payload: WorkflowPayload): Promise<WorkflowResult> {\n const workflowId = `report_${Date.now()}`;\n const startTime = Date.now();\n\n // Simulate report generation\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n return {\n workflowId,\n status: 'completed',\n output: { reportUrl: '/reports/generated-report.pdf' },\n metadata: {\n executionTime: Date.now() - startTime,\n },\n };\n }\n\n /**\n * Execute bulk operation workflow\n */\n private async executeBulkOperation(payload: WorkflowPayload): Promise<WorkflowResult> {\n const workflowId = `bulk_${Date.now()}`;\n const startTime = Date.now();\n\n // Simulate bulk operation\n await new Promise(resolve => setTimeout(resolve, 3000));\n\n return {\n workflowId,\n status: 'completed',\n output: { processedItems: 500 },\n metadata: {\n recordsProcessed: 500,\n executionTime: Date.now() - startTime,\n },\n };\n }\n\n /**\n * Schedule task workflow\n */\n private async scheduleTask(payload: WorkflowPayload): Promise<WorkflowResult> {\n const workflowId = `scheduled_${Date.now()}`;\n const nextRun = payload.schedule ? Date.now() + 3600000 : undefined; // 1 hour from now\n\n return {\n workflowId,\n status: 'scheduled',\n metadata: {\n executionTime: 0,\n nextRun,\n },\n };\n }\n\n /**\n * Execute integration workflow\n */\n private async executeIntegration(payload: WorkflowPayload): Promise<WorkflowResult> {\n const workflowId = `integration_${Date.now()}`;\n const startTime = Date.now();\n\n // Simulate integration process\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n return {\n workflowId,\n status: 'completed',\n output: { integrationStatus: 'success', syncedRecords: 75 },\n metadata: {\n recordsProcessed: 75,\n executionTime: Date.now() - startTime,\n },\n };\n }\n}\n\nexport class WorkflowAutomationAgent extends BaseAgent {\n private executor: WorkflowExecutor;\n\n constructor(\n config: AgentConfig,\n broker: MessageBroker,\n registry: AgentRegistry,\n protocol: ProtocolHandler\n ) {\n super(config, broker, registry, protocol);\n this.executor = new WorkflowExecutor();\n }\n\n /**\n * Set risk classifier\n */\n setRiskClassifier(classifier: RiskClassifier): void {\n this.executor.setRiskClassifier(classifier);\n }\n\n /**\n * Set audit logger\n */\n setAuditLogger(logger: AuditLogger): void {\n this.executor.setAuditLogger(logger);\n }\n\n /**\n * Execute workflow task using the new executor pattern\n */\n protected async executeTask(task: AgentTask): Promise<TaskResult> {\n return this.executor.executeTask(task);\n }\n}\n","/**\n * AgentWorkspaceService - Per-agent filesystem workspaces for state persistence\n * Implements Anthropic's state persistence pattern with enhanced capabilities\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { type Client, createClient } from '@libsql/client';\n\nexport interface WorkspaceConfig {\n baseDir: string;\n maxSizeBytes?: number;\n maxFiles?: number;\n cleanupAfterDays?: number;\n tursoUrl?: string;\n tursoAuthToken?: string;\n}\n\nexport interface WorkspaceFile {\n path: string;\n size: number;\n createdAt: number;\n modifiedAt: number;\n}\n\nexport interface WorkspaceMetadata {\n agentId: string;\n workspacePath: string;\n files: WorkspaceFile[];\n totalSize: number;\n fileCount: number;\n createdAt: number;\n lastAccessed: number;\n}\n\nexport interface WorkspaceSnapshot {\n agentId: string;\n snapshotId: string;\n files: WorkspaceFile[];\n // Using Record<string, unknown> because workspace snapshot metadata structure varies by snapshot type and cannot be strictly typed\n metadata: /* Using Record<string, unknown> because workspace snapshot metadata structure varies by snapshot type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n createdAt: number;\n}\n\nexport class AgentWorkspaceService {\n private baseDir: string;\n private maxSizeBytes: number;\n private maxFiles: number;\n private cleanupAfterDays: number;\n private client: Client | null = null;\n private workspaces: Map<string, WorkspaceMetadata> = new Map();\n private isInitialized = false;\n\n constructor(config: WorkspaceConfig) {\n this.baseDir = path.resolve(config.baseDir || './data/mcp/workspaces');\n this.maxSizeBytes = config.maxSizeBytes || 100 * 1024 * 1024; // 100MB default\n this.maxFiles = config.maxFiles || 1000;\n this.cleanupAfterDays = config.cleanupAfterDays || 30;\n\n if (config.tursoUrl) {\n this.client = createClient({\n url: config.tursoUrl,\n authToken: config.tursoAuthToken,\n });\n }\n }\n\n /**\n * Initialize workspace service\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Create base directory\n if (!fs.existsSync(this.baseDir)) {\n fs.mkdirSync(this.baseDir, { recursive: true });\n }\n\n // Initialize Turso database if configured\n if (this.client) {\n await this.initializeTurso();\n }\n\n this.isInitialized = true;\n }\n\n /**\n * Initialize Turso database for workspace metadata\n */\n private async initializeTurso(): Promise<void> {\n if (!this.client) return;\n\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS mcp_workspaces (\n agent_id TEXT PRIMARY KEY,\n workspace_path TEXT NOT NULL,\n metadata TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n last_accessed INTEGER NOT NULL\n )\n `);\n\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS mcp_workspace_files (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n file_path TEXT NOT NULL,\n size INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n modified_at INTEGER NOT NULL,\n UNIQUE(agent_id, file_path)\n )\n `);\n\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS mcp_workspace_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n snapshot_id TEXT NOT NULL,\n files TEXT NOT NULL,\n metadata TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n UNIQUE(agent_id, snapshot_id)\n )\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_workspace_agent ON mcp_workspace_files(agent_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_snapshot_agent ON mcp_workspace_snapshots(agent_id, created_at DESC)\n `);\n }\n\n /**\n * Get or create workspace for an agent\n */\n async getWorkspace(agentId: string): Promise<string> {\n const workspacePath = path.join(this.baseDir, agentId);\n\n if (!fs.existsSync(workspacePath)) {\n fs.mkdirSync(workspacePath, { recursive: true });\n }\n\n // Load or create metadata\n let metadata = this.workspaces.get(agentId);\n if (!metadata) {\n metadata = await this.loadWorkspaceMetadata(agentId, workspacePath);\n if (!metadata) {\n metadata = await this.createWorkspaceMetadata(agentId, workspacePath);\n }\n this.workspaces.set(agentId, metadata);\n }\n\n // Update last accessed\n metadata.lastAccessed = Date.now();\n await this.saveWorkspaceMetadata(metadata);\n\n return workspacePath;\n }\n\n /**\n * Load workspace metadata\n */\n private async loadWorkspaceMetadata(\n agentId: string,\n workspacePath: string\n ): Promise<WorkspaceMetadata | null> {\n if (this.client) {\n const result = await this.client.execute({\n sql: 'SELECT * FROM mcp_workspaces WHERE agent_id = ?',\n args: [agentId],\n });\n\n if (result.rows.length > 0) {\n const row = result.rows[0];\n const files = await this.loadWorkspaceFiles(agentId);\n return {\n agentId,\n workspacePath,\n files,\n totalSize: files.reduce((sum, f) => sum + f.size, 0),\n fileCount: files.length,\n createdAt: row.created_at as number,\n lastAccessed: row.last_accessed as number,\n };\n }\n }\n\n // Try to load from filesystem\n if (fs.existsSync(workspacePath)) {\n const files = this.scanWorkspaceFiles(workspacePath);\n return {\n agentId,\n workspacePath,\n files,\n totalSize: files.reduce((sum, f) => sum + f.size, 0),\n fileCount: files.length,\n createdAt: Date.now(),\n lastAccessed: Date.now(),\n };\n }\n\n return null;\n }\n\n /**\n * Create workspace metadata\n */\n private async createWorkspaceMetadata(\n agentId: string,\n workspacePath: string\n ): Promise<WorkspaceMetadata> {\n const metadata: WorkspaceMetadata = {\n agentId,\n workspacePath,\n files: [],\n totalSize: 0,\n fileCount: 0,\n createdAt: Date.now(),\n lastAccessed: Date.now(),\n };\n\n await this.saveWorkspaceMetadata(metadata);\n return metadata;\n }\n\n /**\n * Save workspace metadata\n */\n private async saveWorkspaceMetadata(metadata: WorkspaceMetadata): Promise<void> {\n if (this.client) {\n await this.client.execute({\n sql: `\n INSERT OR REPLACE INTO mcp_workspaces (agent_id, workspace_path, metadata, created_at, last_accessed)\n VALUES (?, ?, ?, ?, ?)\n `,\n args: [\n metadata.agentId,\n metadata.workspacePath,\n JSON.stringify(metadata),\n metadata.createdAt,\n metadata.lastAccessed,\n ],\n });\n\n // Save file metadata\n for (const file of metadata.files) {\n await this.client.execute({\n sql: `\n INSERT OR REPLACE INTO mcp_workspace_files (agent_id, file_path, size, created_at, modified_at)\n VALUES (?, ?, ?, ?, ?)\n `,\n args: [metadata.agentId, file.path, file.size, file.createdAt, file.modifiedAt],\n });\n }\n }\n }\n\n /**\n * Load workspace files from Turso\n */\n private async loadWorkspaceFiles(agentId: string): Promise<WorkspaceFile[]> {\n if (!this.client) return [];\n\n const result = await this.client.execute({\n sql: 'SELECT * FROM mcp_workspace_files WHERE agent_id = ?',\n args: [agentId],\n });\n\n return result.rows.map(row => ({\n path: row.file_path as string,\n size: row.size as number,\n createdAt: row.created_at as number,\n modifiedAt: row.modified_at as number,\n }));\n }\n\n /**\n * Scan workspace files from filesystem\n */\n private scanWorkspaceFiles(workspacePath: string): WorkspaceFile[] {\n const files: WorkspaceFile[] = [];\n\n function scanDir(dir: string, basePath: string): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(basePath, fullPath);\n\n if (entry.isDirectory()) {\n scanDir(fullPath, basePath);\n } else if (entry.isFile()) {\n const stats = fs.statSync(fullPath);\n files.push({\n path: relativePath,\n size: stats.size,\n createdAt: stats.birthtimeMs,\n modifiedAt: stats.mtimeMs,\n });\n }\n }\n }\n\n if (fs.existsSync(workspacePath)) {\n scanDir(workspacePath, workspacePath);\n }\n\n return files;\n }\n\n /**\n * Write file to workspace\n */\n async writeFile(agentId: string, filePath: string, content: string | Buffer): Promise<void> {\n const workspacePath = await this.getWorkspace(agentId);\n const fullPath = path.join(workspacePath, filePath);\n\n // Check quota\n const metadata = this.workspaces.get(agentId);\n if (metadata) {\n const newSize = Buffer.isBuffer(content)\n ? content.length\n : Buffer.byteLength(content, 'utf8');\n const existingFile = metadata.files.find(f => f.path === filePath);\n const existingSize = existingFile?.size || 0;\n const sizeDelta = newSize - existingSize;\n\n if (metadata.totalSize + sizeDelta > this.maxSizeBytes) {\n throw new Error(`Workspace quota exceeded for agent ${agentId}`);\n }\n\n if (!existingFile && metadata.fileCount >= this.maxFiles) {\n throw new Error(`Workspace file limit exceeded for agent ${agentId}`);\n }\n }\n\n // Create directory if needed\n const dir = path.dirname(fullPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Write file\n fs.writeFileSync(fullPath, content);\n\n // Update metadata\n await this.updateWorkspaceMetadata(agentId);\n }\n\n /**\n * Read file from workspace\n */\n async readFile(agentId: string, filePath: string): Promise<string> {\n const workspacePath = await this.getWorkspace(agentId);\n const fullPath = path.join(workspacePath, filePath);\n\n if (!fs.existsSync(fullPath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n return fs.readFileSync(fullPath, 'utf8');\n }\n\n /**\n * List files in workspace\n */\n async listFiles(agentId: string, pattern?: string): Promise<WorkspaceFile[]> {\n const workspacePath = await this.getWorkspace(agentId);\n const metadata = this.workspaces.get(agentId);\n\n if (!metadata) {\n return this.scanWorkspaceFiles(workspacePath);\n }\n\n let files = metadata.files;\n\n if (pattern) {\n const regex = new RegExp(pattern);\n files = files.filter(f => regex.test(f.path));\n }\n\n return files;\n }\n\n /**\n * Delete file from workspace\n */\n async deleteFile(agentId: string, filePath: string): Promise<void> {\n const workspacePath = await this.getWorkspace(agentId);\n const fullPath = path.join(workspacePath, filePath);\n\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath);\n await this.updateWorkspaceMetadata(agentId);\n }\n }\n\n /**\n * Update workspace metadata after file changes\n */\n private async updateWorkspaceMetadata(agentId: string): Promise<void> {\n const workspacePath = await this.getWorkspace(agentId);\n const files = this.scanWorkspaceFiles(workspacePath);\n\n const metadata: WorkspaceMetadata = {\n agentId,\n workspacePath,\n files,\n totalSize: files.reduce((sum, f) => sum + f.size, 0),\n fileCount: files.length,\n createdAt: this.workspaces.get(agentId)?.createdAt || Date.now(),\n lastAccessed: Date.now(),\n };\n\n this.workspaces.set(agentId, metadata);\n await this.saveWorkspaceMetadata(metadata);\n }\n\n /**\n * Create workspace snapshot\n */\n async createSnapshot(\n agentId: string,\n snapshotId?: string,\n // Using Record<string, unknown> because workspace snapshot metadata structure varies by snapshot type and cannot be strictly typed\n metadata?: /* Using Record<string, unknown> because workspace snapshot metadata structure varies by snapshot type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<WorkspaceSnapshot> {\n const workspacePath = await this.getWorkspace(agentId);\n const files = this.scanWorkspaceFiles(workspacePath);\n const id = snapshotId || `snapshot-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n\n const snapshot: WorkspaceSnapshot = {\n agentId,\n snapshotId: id,\n files,\n metadata: metadata || {},\n createdAt: Date.now(),\n };\n\n if (this.client) {\n await this.client.execute({\n sql: `\n INSERT INTO mcp_workspace_snapshots (agent_id, snapshot_id, files, metadata, created_at)\n VALUES (?, ?, ?, ?, ?)\n `,\n args: [\n agentId,\n id,\n JSON.stringify(files),\n JSON.stringify(metadata || {}),\n snapshot.createdAt,\n ],\n });\n }\n\n return snapshot;\n }\n\n /**\n * Restore workspace from snapshot\n */\n async restoreSnapshot(agentId: string, snapshotId: string): Promise<void> {\n if (!this.client) {\n throw new Error('Snapshot restore requires Turso database');\n }\n\n const result = await this.client.execute({\n sql: 'SELECT * FROM mcp_workspace_snapshots WHERE agent_id = ? AND snapshot_id = ?',\n args: [agentId, snapshotId],\n });\n\n if (result.rows.length === 0) {\n throw new Error(`Snapshot not found: ${snapshotId}`);\n }\n\n // const row = result.rows[0];\n // Note: Snapshot restore is currently a placeholder\n // Files would need to be restored from snapshot metadata\n // For now, we just clear and update metadata\n\n // Clear existing files\n const existingFiles = await this.listFiles(agentId);\n for (const file of existingFiles) {\n await this.deleteFile(agentId, file.path);\n }\n\n // Restore files (note: we only restore metadata, actual file content would need separate storage)\n await this.updateWorkspaceMetadata(agentId);\n }\n\n /**\n * Clean up old workspaces\n */\n async cleanup(olderThanDays?: number): Promise<number> {\n const cutoff = Date.now() - (olderThanDays || this.cleanupAfterDays) * 24 * 60 * 60 * 1000;\n let cleaned = 0;\n\n for (const [agentId, metadata] of this.workspaces.entries()) {\n if (metadata.lastAccessed < cutoff) {\n // Archive workspace\n const archivePath = path.join(this.baseDir, 'archive', agentId);\n if (fs.existsSync(metadata.workspacePath)) {\n if (!fs.existsSync(path.dirname(archivePath))) {\n fs.mkdirSync(path.dirname(archivePath), { recursive: true });\n }\n fs.renameSync(metadata.workspacePath, archivePath);\n }\n\n this.workspaces.delete(agentId);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n\n /**\n * Get workspace statistics\n */\n getStatistics(agentId?: string): {\n totalWorkspaces: number;\n totalSize: number;\n totalFiles: number;\n byAgent?: Record<string, { size: number; files: number }>;\n } {\n if (agentId) {\n const metadata = this.workspaces.get(agentId);\n if (!metadata) {\n return {\n totalWorkspaces: 0,\n totalSize: 0,\n totalFiles: 0,\n };\n }\n\n return {\n totalWorkspaces: 1,\n totalSize: metadata.totalSize,\n totalFiles: metadata.fileCount,\n byAgent: {\n [agentId]: {\n size: metadata.totalSize,\n files: metadata.fileCount,\n },\n },\n };\n }\n\n const byAgent: Record<string, { size: number; files: number }> = {};\n let totalSize = 0;\n let totalFiles = 0;\n\n for (const metadata of this.workspaces.values()) {\n byAgent[metadata.agentId] = {\n size: metadata.totalSize,\n files: metadata.fileCount,\n };\n totalSize += metadata.totalSize;\n totalFiles += metadata.fileCount;\n }\n\n return {\n totalWorkspaces: this.workspaces.size,\n totalSize,\n totalFiles,\n byAgent,\n };\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n if (this.client) {\n this.client.close();\n }\n this.workspaces.clear();\n this.isInitialized = false;\n }\n}\n","/**\n * CodeExecutionSandbox - Isolated code execution environment with resource limits\n * Implements Anthropic's code execution pattern with enhanced security\n */\n\nimport path from 'node:path';\nimport { Worker } from 'node:worker_threads';\n\nexport interface SandboxConfig {\n enabled: boolean;\n maxExecutionTime: number; // milliseconds\n maxMemoryMB: number;\n allowNetwork: boolean;\n allowFilesystem: boolean;\n allowedPaths?: string[];\n timeout: number;\n}\n\nexport interface ExecutionResult {\n success: boolean;\n output?: string;\n error?: string;\n executionTime: number;\n memoryUsed?: number;\n}\n\nexport interface CodeExecutionOptions {\n code: string;\n language: 'javascript' | 'typescript';\n // Using Record<string, unknown> because code execution context structure varies by execution type and cannot be strictly typed\n context?: /* Using Record<string, unknown> because code execution context structure varies by execution type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n timeout?: number;\n}\n\nexport class CodeExecutionSandbox {\n private config: SandboxConfig;\n private workerScript: string;\n private isInitialized = false;\n\n constructor(config?: Partial<SandboxConfig>) {\n this.config = {\n enabled: true,\n maxExecutionTime: 30000, // 30 seconds\n maxMemoryMB: 512,\n allowNetwork: false,\n allowFilesystem: false,\n timeout: 30000,\n ...config,\n };\n\n // Create worker script for sandboxed execution\n this.workerScript = this.createWorkerScript();\n }\n\n /**\n * Initialize sandbox\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Write worker script to temp file if needed\n // For now, we'll use inline worker creation\n this.isInitialized = true;\n }\n\n /**\n * Create worker script for sandboxed execution\n */\n private createWorkerScript(): string {\n // Use the compiled worker file\n return path.resolve(__dirname, 'CodeExecutionSandbox.worker.js');\n }\n\n /**\n * Execute code in sandbox\n */\n async execute(options: CodeExecutionOptions): Promise<ExecutionResult> {\n if (!this.config.enabled) {\n throw new Error('Code execution sandbox is disabled');\n }\n\n const { code, context = {}, timeout = this.config.maxExecutionTime } = options;\n\n // Validate code\n const validation = this.validateCode(code);\n if (!validation.valid) {\n return {\n success: false,\n error: `Code validation failed: ${validation.errors.join(', ')}`,\n executionTime: 0,\n };\n }\n\n const startTime = Date.now();\n const output: string[] = [];\n const errors: string[] = [];\n\n return new Promise<ExecutionResult>(resolve => {\n // Use the worker script path\n const scriptPath = this.workerScript;\n\n // Create worker with sandbox script\n const worker = new Worker(scriptPath, {\n workerData: {\n code,\n context,\n timeout,\n },\n });\n\n let resolved = false;\n\n // Set overall timeout\n const overallTimeout = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n worker.terminate();\n resolve({\n success: false,\n error: 'Execution timeout exceeded',\n executionTime: Date.now() - startTime,\n });\n }\n }, timeout + 1000); // Add 1 second buffer\n\n worker.on(\n 'message',\n (message: {\n type: string;\n data?: string;\n success?: boolean;\n result?: unknown;\n error?: string;\n executionTime?: number;\n }) => {\n if (message.type === 'output') {\n output.push(message.data || '');\n } else if (message.type === 'error') {\n errors.push(message.data || '');\n } else if (message.type === 'result') {\n if (!resolved) {\n resolved = true;\n clearTimeout(overallTimeout);\n worker.terminate();\n\n const filteredOutput =\n output.length > 0 ? this.filterOutput(output.join('\\n')) : undefined;\n\n resolve({\n success: message.success || false,\n output: filteredOutput,\n error: message.error || (errors.length > 0 ? errors.join('\\n') : undefined),\n executionTime: message.executionTime || Date.now() - startTime,\n });\n }\n }\n }\n );\n\n worker.on('error', error => {\n if (!resolved) {\n resolved = true;\n clearTimeout(overallTimeout);\n worker.terminate();\n\n resolve({\n success: false,\n error: error.message,\n executionTime: Date.now() - startTime,\n });\n }\n });\n\n worker.on('exit', code => {\n if (code !== 0 && !resolved) {\n resolved = true;\n clearTimeout(overallTimeout);\n resolve({\n success: false,\n error: `Worker exited with code ${code}`,\n executionTime: Date.now() - startTime,\n });\n }\n });\n });\n }\n\n /**\n * Validate code before execution\n */\n validateCode(code: string): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Check for dangerous patterns\n const dangerousPatterns = [\n /require\\s*\\(\\s*['\"]fs['\"]/i,\n /require\\s*\\(\\s*['\"]child_process['\"]/i,\n /require\\s*\\(\\s*['\"]worker_threads['\"]/i,\n /eval\\s*\\(/i,\n /Function\\s*\\(/i,\n /process\\./i,\n /__dirname/i,\n /__filename/i,\n ];\n\n for (const pattern of dangerousPatterns) {\n if (pattern.test(code)) {\n errors.push(`Dangerous pattern detected: ${pattern}`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Filter execution output\n */\n filterOutput(output: string, maxLength: number = 10000): string {\n if (output.length <= maxLength) {\n return output;\n }\n\n // Return first and last parts if too long\n const half = Math.floor(maxLength / 2);\n return `${output.substring(0, half)}\\n\\n... (truncated ${output.length - maxLength} characters) ...\\n\\n${output.substring(output.length - half)}`;\n }\n\n /**\n * Get statistics\n */\n getStatistics(): {\n enabled: boolean;\n config: SandboxConfig;\n } {\n return {\n enabled: this.config.enabled,\n config: this.config,\n };\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n this.isInitialized = false;\n }\n}\n","/**\n * AgentRegistry - Service discovery and health tracking for agents\n */\n\nimport type { AgentHealth, AgentMetrics, AgentRegistration, AgentStatus } from '../types/agents';\n\nexport class AgentRegistry {\n private agents: Map<string, AgentRegistration> = new Map();\n private healthData: Map<string, AgentHealth> = new Map();\n private metricsData: Map<string, AgentMetrics> = new Map();\n private heartbeatInterval?: NodeJS.Timeout;\n private readonly heartbeatTimeout = 30000; // 30 seconds\n\n constructor() {\n this.startHeartbeatMonitoring();\n }\n\n /**\n * Register an agent\n */\n register(registration: Omit<AgentRegistration, 'registeredAt' | 'lastHeartbeat'>): void {\n const fullRegistration: AgentRegistration = {\n ...registration,\n registeredAt: Date.now(),\n lastHeartbeat: Date.now(),\n };\n\n this.agents.set(registration.id, fullRegistration);\n\n // Initialize metrics\n this.metricsData.set(registration.id, {\n agentId: registration.id,\n totalTasks: 0,\n successfulTasks: 0,\n failedTasks: 0,\n averageExecutionTime: 0,\n errorRate: 0,\n });\n\n this.logger.info(`Agent registered: ${registration.id} (${registration.type})`);\n }\n\n /**\n * Unregister an agent\n */\n unregister(agentId: string): void {\n this.agents.delete(agentId);\n this.healthData.delete(agentId);\n this.metricsData.delete(agentId);\n this.logger.info(`Agent unregistered: ${agentId}`);\n }\n\n /**\n * Update agent heartbeat\n */\n heartbeat(agentId: string): void {\n const agent = this.agents.get(agentId);\n if (agent) {\n agent.lastHeartbeat = Date.now();\n if (agent.status === 'offline') {\n agent.status = 'idle';\n }\n }\n }\n\n /**\n * Update agent status\n */\n updateStatus(agentId: string, status: AgentStatus): void {\n const agent = this.agents.get(agentId);\n if (agent) {\n agent.status = status;\n agent.lastHeartbeat = Date.now();\n }\n }\n\n /**\n * Increment current tasks\n */\n incrementTasks(agentId: string): void {\n const agent = this.agents.get(agentId);\n if (agent) {\n agent.currentTasks++;\n if (agent.currentTasks > 0) {\n agent.status = 'busy';\n }\n }\n }\n\n /**\n * Decrement current tasks\n */\n decrementTasks(agentId: string): void {\n const agent = this.agents.get(agentId);\n if (agent) {\n agent.currentTasks = Math.max(0, agent.currentTasks - 1);\n if (agent.currentTasks === 0) {\n agent.status = 'idle';\n }\n }\n }\n\n /**\n * Check if agent can accept more tasks\n */\n canAcceptTask(agentId: string): boolean {\n const agent = this.agents.get(agentId);\n if (!agent) return false;\n if (agent.status === 'offline' || agent.status === 'error') return false;\n return agent.currentTasks < agent.maxConcurrentTasks;\n }\n\n /**\n * Find available agent by type\n */\n findAvailableAgent(type: string, capabilities?: string[]): string | null {\n const availableAgents = Array.from(this.agents.values()).filter(agent => {\n if (agent.type !== type) return false;\n if (agent.status === 'offline' || agent.status === 'error') return false;\n if (agent.currentTasks >= agent.maxConcurrentTasks) return false;\n if (capabilities) {\n return capabilities.every(cap => agent.capabilities.includes(cap));\n }\n return true;\n });\n\n if (availableAgents.length === 0) return null;\n\n // Return agent with least current tasks (load balancing)\n availableAgents.sort((a, b) => a.currentTasks - b.currentTasks);\n return availableAgents[0].id;\n }\n\n /**\n * Get agent info\n */\n getAgent(agentId: string): AgentRegistration | null {\n return this.agents.get(agentId) ?? null;\n }\n\n /**\n * Get all agents\n */\n getAllAgents(): AgentRegistration[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Get agents by type\n */\n getAgentsByType(type: string): AgentRegistration[] {\n return Array.from(this.agents.values()).filter(agent => agent.type === type);\n }\n\n /**\n * Update agent health\n */\n updateHealth(agentId: string, health: Omit<AgentHealth, 'agentId' | 'timestamp'>): void {\n this.healthData.set(agentId, {\n ...health,\n agentId,\n timestamp: Date.now(),\n });\n\n // Update agent status based on health\n const agent = this.agents.get(agentId);\n if (agent) {\n if (health.status === 'unhealthy') {\n agent.status = 'error';\n } else if (health.status === 'degraded' && agent.status !== 'busy') {\n agent.status = 'idle';\n }\n }\n }\n\n /**\n * Get agent health\n */\n getHealth(agentId: string): AgentHealth | null {\n return this.healthData.get(agentId) ?? null;\n }\n\n /**\n * Get all health data\n */\n getAllHealth(): AgentHealth[] {\n return Array.from(this.healthData.values());\n }\n\n /**\n * Update agent metrics\n */\n updateMetrics(agentId: string, update: Partial<AgentMetrics>): void {\n const metrics = this.metricsData.get(agentId);\n if (metrics) {\n Object.assign(metrics, update);\n\n // Recalculate error rate\n if (metrics.totalTasks > 0) {\n metrics.errorRate = metrics.failedTasks / metrics.totalTasks;\n }\n }\n }\n\n /**\n * Record task completion\n */\n recordTaskCompletion(agentId: string, success: boolean, executionTime: number): void {\n const metrics = this.metricsData.get(agentId);\n if (metrics) {\n metrics.totalTasks++;\n if (success) {\n metrics.successfulTasks++;\n } else {\n metrics.failedTasks++;\n }\n metrics.lastTaskTimestamp = Date.now();\n\n // Update average execution time\n const prevAvg = metrics.averageExecutionTime;\n const prevCount = metrics.totalTasks - 1;\n metrics.averageExecutionTime = (prevAvg * prevCount + executionTime) / metrics.totalTasks;\n\n // Update error rate\n metrics.errorRate = metrics.failedTasks / metrics.totalTasks;\n }\n }\n\n /**\n * Get agent metrics\n */\n getMetrics(agentId: string): AgentMetrics | null {\n return this.metricsData.get(agentId) ?? null;\n }\n\n /**\n * Get all metrics\n */\n getAllMetrics(): AgentMetrics[] {\n return Array.from(this.metricsData.values());\n }\n\n /**\n * Get registry statistics\n */\n getStatistics(): {\n totalAgents: number;\n activeAgents: number;\n busyAgents: number;\n offlineAgents: number;\n errorAgents: number;\n totalCapacity: number;\n usedCapacity: number;\n } {\n const agents = Array.from(this.agents.values());\n return {\n totalAgents: agents.length,\n activeAgents: agents.filter(a => a.status !== 'offline' && a.status !== 'error').length,\n busyAgents: agents.filter(a => a.status === 'busy').length,\n offlineAgents: agents.filter(a => a.status === 'offline').length,\n errorAgents: agents.filter(a => a.status === 'error').length,\n totalCapacity: agents.reduce((sum, a) => sum + a.maxConcurrentTasks, 0),\n usedCapacity: agents.reduce((sum, a) => sum + a.currentTasks, 0),\n };\n }\n\n /**\n * Start heartbeat monitoring\n * Marks agents as offline if they haven't sent a heartbeat recently\n */\n private startHeartbeatMonitoring(): void {\n this.heartbeatInterval = setInterval(() => {\n const now = Date.now();\n for (const agent of this.agents.values()) {\n if (now - agent.lastHeartbeat > this.heartbeatTimeout) {\n if (agent.status !== 'offline') {\n agent.status = 'offline';\n console.warn(`⚠ Agent went offline: ${agent.id} (${agent.type})`);\n }\n }\n }\n }, 10000); // Check every 10 seconds\n }\n\n /**\n * Shutdown the registry\n */\n shutdown(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.agents.clear();\n this.healthData.clear();\n this.metricsData.clear();\n this.logger.info('AgentRegistry shut down');\n }\n}\n","/**\n * MessageBroker - Turso-based async message broker for agent communication\n * Handles message queuing, pub/sub, and delivery guarantees\n */\n\nimport { type Client, createClient } from '@libsql/client';\nimport type {\n AgentEvent,\n AgentMessage,\n MessageStatus,\n MessageSubscription,\n QueuedMessage,\n} from '../types/messages';\n\nexport interface MessageBrokerConfig {\n url: string;\n authToken?: string;\n pollInterval?: number; // milliseconds\n maxRetries?: number;\n}\n\nexport class MessageBroker {\n private client: Client;\n private subscriptions: Map<string, MessageSubscription> = new Map();\n private pollingInterval?: NodeJS.Timeout;\n private readonly pollInterval: number;\n private readonly maxRetries: number;\n private isInitialized = false;\n\n constructor(config: MessageBrokerConfig) {\n this.client = createClient({\n url: config.url,\n authToken: config.authToken,\n });\n this.pollInterval = config.pollInterval ?? 1000; // Default 1 second\n this.maxRetries = config.maxRetries ?? 3;\n }\n\n /**\n * Initialize the message broker\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Create message queue table\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS mcp_messages (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n method TEXT NOT NULL,\n params TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n attempts INTEGER NOT NULL DEFAULT 0,\n max_attempts INTEGER NOT NULL DEFAULT 3,\n next_retry INTEGER,\n error TEXT,\n result TEXT\n )\n `);\n\n // Create events table for pub/sub\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS mcp_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n type TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n payload TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n processed INTEGER NOT NULL DEFAULT 0\n )\n `);\n\n // Create indices for performance\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_messages_status\n ON mcp_messages(status, next_retry)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_events_processed\n ON mcp_events(processed, timestamp)\n `);\n\n this.isInitialized = true;\n // MessageBroker initialized successfully with Turso\n }\n\n /**\n * Enqueue a message for delivery\n */\n async enqueue(message: AgentMessage): Promise<void> {\n const queuedMessage: QueuedMessage = {\n id: message.id,\n message,\n status: 'pending',\n createdAt: Date.now(),\n updatedAt: Date.now(),\n attempts: 0,\n maxAttempts: this.maxRetries,\n };\n\n await this.client.execute({\n sql: `\n INSERT INTO mcp_messages (\n id, agent_id, method, params, status, created_at, updated_at, attempts, max_attempts\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n args: [\n queuedMessage.id,\n message.params.agentId,\n message.method,\n JSON.stringify(message.params),\n queuedMessage.status,\n queuedMessage.createdAt,\n queuedMessage.updatedAt,\n queuedMessage.attempts,\n queuedMessage.maxAttempts,\n ],\n });\n }\n\n /**\n * Dequeue the next pending message for an agent\n */\n async dequeue(agentId: string): Promise<QueuedMessage | null> {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM mcp_messages\n WHERE agent_id = ?\n AND status = 'pending'\n AND (next_retry IS NULL OR next_retry <= ?)\n ORDER BY created_at ASC\n LIMIT 1\n `,\n args: [agentId, Date.now()],\n });\n\n if (result.rows.length === 0) return null;\n\n const row = result.rows[0];\n const message: QueuedMessage = {\n id: row.id as string,\n message: {\n jsonrpc: '2.0',\n id: row.id as string,\n method: row.method as string,\n params: JSON.parse(row.params as string),\n },\n status: row.status as MessageStatus,\n createdAt: row.created_at as number,\n updatedAt: row.updated_at as number,\n attempts: row.attempts as number,\n maxAttempts: row.max_attempts as number,\n nextRetry: row.next_retry as number | undefined,\n error: row.error as string | undefined,\n };\n\n // Mark as processing\n await this.updateMessageStatus(message.id, 'processing');\n\n return message;\n }\n\n /**\n * Update message status\n */\n async updateMessageStatus(\n messageId: string,\n status: MessageStatus,\n result?: unknown,\n error?: string\n ): Promise<void> {\n await this.client.execute({\n sql: `\n UPDATE mcp_messages\n SET status = ?, updated_at = ?, result = ?, error = ?\n WHERE id = ?\n `,\n args: [status, Date.now(), result ? JSON.stringify(result) : null, error ?? null, messageId],\n });\n }\n\n /**\n * Mark message as failed and schedule retry if attempts remaining\n */\n async markFailed(messageId: string, error: string): Promise<void> {\n const result = await this.client.execute({\n sql: 'SELECT attempts, max_attempts FROM mcp_messages WHERE id = ?',\n args: [messageId],\n });\n\n if (result.rows.length === 0) return;\n\n const attempts = (result.rows[0].attempts as number) + 1;\n const maxAttempts = result.rows[0].max_attempts as number;\n\n if (attempts < maxAttempts) {\n // Schedule retry with exponential backoff\n const nextRetry = Date.now() + Math.pow(2, attempts) * 1000;\n await this.client.execute({\n sql: `\n UPDATE mcp_messages\n SET status = 'pending', attempts = ?, next_retry = ?, error = ?, updated_at = ?\n WHERE id = ?\n `,\n args: [attempts, nextRetry, error, Date.now(), messageId],\n });\n } else {\n // Max retries reached, mark as failed\n await this.updateMessageStatus(messageId, 'failed', undefined, error);\n }\n }\n\n /**\n * Publish an event to all subscribers\n */\n async publish(event: AgentEvent): Promise<void> {\n await this.client.execute({\n sql: `\n INSERT INTO mcp_events (type, agent_id, payload, timestamp, processed)\n VALUES (?, ?, ?, ?, 0)\n `,\n args: [event.type, event.agentId, JSON.stringify(event.payload), event.timestamp],\n });\n\n // Notify in-memory subscribers immediately\n for (const subscription of this.subscriptions.values()) {\n if (subscription.eventTypes.includes(event.type)) {\n try {\n await subscription.callback(event);\n } catch (error) {\n // Swallow callback errors to prevent event processing failures\n // Consider implementing proper error tracking in production\n }\n }\n }\n }\n\n /**\n * Subscribe to events\n */\n subscribe(\n agentId: string,\n eventTypes: string[],\n callback: (event: AgentEvent) => void | Promise<void>\n ): string {\n const subscriptionId = `${agentId}-${Date.now()}`;\n this.subscriptions.set(subscriptionId, {\n id: subscriptionId,\n agentId,\n eventTypes,\n callback,\n });\n return subscriptionId;\n }\n\n /**\n * Unsubscribe from events\n */\n unsubscribe(subscriptionId: string): void {\n this.subscriptions.delete(subscriptionId);\n }\n\n /**\n * Poll for unprocessed events (for agents that weren't in memory when event was published)\n */\n async pollEvents(agentId: string, eventTypes: string[]): Promise<AgentEvent[]> {\n const placeholders = eventTypes.map(() => '?').join(',');\n const result = await this.client.execute({\n sql: `\n SELECT * FROM mcp_events\n WHERE type IN (${placeholders})\n AND processed = 0\n ORDER BY timestamp ASC\n LIMIT 100\n `,\n args: eventTypes,\n });\n\n const events: AgentEvent[] = result.rows.map(row => ({\n type: row.type as string,\n agentId: row.agent_id as string,\n payload: JSON.parse(row.payload as string),\n timestamp: row.timestamp as number,\n }));\n\n // Mark events as processed\n if (events.length > 0) {\n const ids = result.rows.map(row => row.id);\n const placeholdersIds = ids.map(() => '?').join(',');\n await this.client.execute({\n sql: `UPDATE mcp_events SET processed = 1 WHERE id IN (${placeholdersIds})`,\n args: ids,\n });\n }\n\n return events;\n }\n\n /**\n * Get queue depth for an agent\n */\n async getQueueDepth(agentId: string): Promise<number> {\n const result = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM mcp_messages WHERE agent_id = ? AND status = 'pending'`,\n args: [agentId],\n });\n return (result.rows[0]?.count as number) ?? 0;\n }\n\n /**\n * Clean up old messages and events\n */\n async cleanup(olderThanMs: number = 7 * 24 * 60 * 60 * 1000): Promise<void> {\n const cutoff = Date.now() - olderThanMs;\n\n await this.client.execute({\n sql: `DELETE FROM mcp_messages WHERE updated_at < ? AND status IN ('completed', 'failed', 'cancelled')`,\n args: [cutoff],\n });\n\n await this.client.execute({\n sql: 'DELETE FROM mcp_events WHERE timestamp < ? AND processed = 1',\n args: [cutoff],\n });\n }\n\n /**\n * Shutdown the message broker\n */\n async shutdown(): Promise<void> {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n this.subscriptions.clear();\n this.client.close();\n this.isInitialized = false;\n // MessageBroker shut down successfully\n }\n}\n","/**\n * ProtocolHandler - JSON-RPC 2.0 message parsing and validation\n */\n\nimport { z } from 'zod';\nimport type { AgentMessage, AgentResponse } from '../types/messages';\n\n// JSON-RPC 2.0 Error Codes\nexport const JSON_RPC_ERRORS = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n// Zod schemas for validation\nconst MessageParamsSchema = z.object({\n agentId: z.string(),\n taskId: z.string(),\n payload: z.unknown(),\n priority: z.enum(['low', 'medium', 'high', 'critical']),\n requiresApproval: z.boolean(),\n riskLevel: z.enum(['safe', 'moderate', 'high', 'critical']),\n metadata: z.record(z.unknown()).optional(),\n});\n\nconst AgentMessageSchema = z.object({\n jsonrpc: z.literal('2.0'),\n id: z.string(),\n method: z.string(),\n params: MessageParamsSchema,\n});\n\nconst AgentResponseSchema = z.object({\n jsonrpc: z.literal('2.0'),\n id: z.string(),\n result: z.unknown().optional(),\n error: z\n .object({\n code: z.number(),\n message: z.string(),\n data: z.unknown().optional(),\n })\n .optional(),\n});\n\nexport class ProtocolHandler {\n /**\n * Parse and validate an incoming message\n */\n parseMessage(\n raw: string\n ): { success: true; message: AgentMessage } | { success: false; error: string } {\n try {\n const parsed = JSON.parse(raw);\n const validation = AgentMessageSchema.safeParse(parsed);\n\n if (!validation.success) {\n return {\n success: false,\n error: `Invalid message format: ${validation.error.message}`,\n };\n }\n\n return {\n success: true,\n message: validation.data,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse JSON: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n }\n\n /**\n * Parse and validate a response\n */\n parseResponse(\n raw: string\n ): { success: true; response: AgentResponse } | { success: false; error: string } {\n try {\n const parsed = JSON.parse(raw);\n const validation = AgentResponseSchema.safeParse(parsed);\n\n if (!validation.success) {\n return {\n success: false,\n error: `Invalid response format: ${validation.error.message}`,\n };\n }\n\n return {\n success: true,\n response: validation.data,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse JSON: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n }\n\n /**\n * Create a success response\n */\n createSuccessResponse(messageId: string, result: unknown): AgentResponse {\n return {\n jsonrpc: '2.0',\n id: messageId,\n result,\n };\n }\n\n /**\n * Create an error response\n */\n createErrorResponse(\n messageId: string,\n code: number,\n message: string,\n data?: unknown\n ): AgentResponse {\n return {\n jsonrpc: '2.0',\n id: messageId,\n error: {\n code,\n message,\n data,\n },\n };\n }\n\n /**\n * Create a parse error response\n */\n createParseError(): AgentResponse {\n return {\n jsonrpc: '2.0',\n id: 'null',\n error: {\n code: JSON_RPC_ERRORS.PARSE_ERROR,\n message: 'Parse error',\n },\n };\n }\n\n /**\n * Create an invalid request response\n */\n createInvalidRequestError(messageId: string): AgentResponse {\n return {\n jsonrpc: '2.0',\n id: messageId,\n error: {\n code: JSON_RPC_ERRORS.INVALID_REQUEST,\n message: 'Invalid Request',\n },\n };\n }\n\n /**\n * Create a method not found response\n */\n createMethodNotFoundError(messageId: string, method: string): AgentResponse {\n return {\n jsonrpc: '2.0',\n id: messageId,\n error: {\n code: JSON_RPC_ERRORS.METHOD_NOT_FOUND,\n message: 'Method not found',\n data: { method },\n },\n };\n }\n\n /**\n * Create an invalid params response\n */\n createInvalidParamsError(messageId: string, details: string): AgentResponse {\n return {\n jsonrpc: '2.0',\n id: messageId,\n error: {\n code: JSON_RPC_ERRORS.INVALID_PARAMS,\n message: 'Invalid params',\n data: { details },\n },\n };\n }\n\n /**\n * Create an internal error response\n */\n createInternalError(messageId: string, error: Error): AgentResponse {\n return {\n jsonrpc: '2.0',\n id: messageId,\n error: {\n code: JSON_RPC_ERRORS.INTERNAL_ERROR,\n message: 'Internal error',\n data: {\n message: error.message,\n stack: error.stack,\n },\n },\n };\n }\n\n /**\n * Serialize message to JSON string\n */\n serializeMessage(message: AgentMessage): string {\n return JSON.stringify(message);\n }\n\n /**\n * Serialize response to JSON string\n */\n serializeResponse(response: AgentResponse): string {\n return JSON.stringify(response);\n }\n\n /**\n * Validate message params against a schema\n */\n validateParams<T>(\n params: unknown,\n schema: z.ZodSchema<T>\n ): { success: true; data: T } | { success: false; error: string } {\n const validation = schema.safeParse(params);\n if (!validation.success) {\n return {\n success: false,\n error: validation.error.message,\n };\n }\n return {\n success: true,\n data: validation.data,\n };\n }\n\n /**\n * Create a message ID\n */\n createMessageId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Create a task ID\n */\n createTaskId(): string {\n return `task-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n}\n","/**\n * SecurityManager - Authentication, authorization, and encryption for agents\n */\n\nimport { createCipheriv, createDecipheriv, createHash, randomBytes } from 'crypto';\nimport type { RiskLevel } from '../types/messages';\n\nexport interface SecurityConfig {\n jwtSecret: string;\n encryptionKey: string; // 32 bytes for AES-256\n agentApiKeys: Map<string, string>; // agentId -> apiKey\n}\n\nexport interface SecurityContext {\n userId?: string;\n role?: string;\n permissions: string[];\n}\n\nexport class SecurityManager {\n private config: SecurityConfig;\n private readonly algorithm = 'aes-256-gcm';\n\n constructor(config: SecurityConfig) {\n this.config = config;\n }\n\n /**\n * Verify agent API key\n */\n verifyApiKey(agentId: string, apiKey: string): boolean {\n const storedKey = this.config.agentApiKeys.get(agentId);\n if (!storedKey) return false;\n\n // Use constant-time comparison to prevent timing attacks\n const storedHash = createHash('sha256').update(storedKey).digest();\n const providedHash = createHash('sha256').update(apiKey).digest();\n\n if (storedHash.length !== providedHash.length) return false;\n\n let result = 0;\n for (let i = 0; i < storedHash.length; i++) {\n result |= storedHash[i] ^ providedHash[i];\n }\n\n return result === 0;\n }\n\n /**\n * Generate agent API key\n */\n generateApiKey(): string {\n return randomBytes(32).toString('hex');\n }\n\n /**\n * Register agent API key\n */\n registerAgentApiKey(agentId: string, apiKey: string): void {\n this.config.agentApiKeys.set(agentId, apiKey);\n }\n\n /**\n * Revoke agent API key\n */\n revokeAgentApiKey(agentId: string): void {\n this.config.agentApiKeys.delete(agentId);\n }\n\n /**\n * Check if user has permission\n */\n hasPermission(context: SecurityContext, permission: string): boolean {\n return context.permissions.includes(permission) || context.permissions.includes('*');\n }\n\n /**\n * Check if user can approve operation at risk level\n */\n canApprove(context: SecurityContext, riskLevel: RiskLevel): boolean {\n switch (riskLevel) {\n case 'safe':\n case 'moderate':\n return true; // Auto-approved\n case 'high':\n return context.role === 'admin' || context.role === 'super-admin';\n case 'critical':\n return context.role === 'super-admin';\n default:\n return false;\n }\n }\n\n /**\n * Encrypt data\n */\n encrypt(data: string): string {\n const iv = randomBytes(16);\n const cipher = createCipheriv(\n this.algorithm,\n Buffer.from(this.config.encryptionKey, 'hex'),\n iv\n );\n\n let encrypted = cipher.update(data, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n const authTag = cipher.getAuthTag();\n\n // Return IV + AuthTag + Encrypted data\n return iv.toString('hex') + authTag.toString('hex') + encrypted;\n }\n\n /**\n * Decrypt data\n */\n decrypt(encryptedData: string): string {\n // Extract IV (32 chars), AuthTag (32 chars), and data\n const iv = Buffer.from(encryptedData.substring(0, 32), 'hex');\n const authTag = Buffer.from(encryptedData.substring(32, 64), 'hex');\n const encrypted = encryptedData.substring(64);\n\n const decipher = createDecipheriv(\n this.algorithm,\n Buffer.from(this.config.encryptionKey, 'hex'),\n iv\n );\n decipher.setAuthTag(authTag);\n\n let decrypted = decipher.update(encrypted, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n\n return decrypted;\n }\n\n /**\n * Hash sensitive data (one-way)\n */\n hash(data: string): string {\n return createHash('sha256').update(data).digest('hex');\n }\n\n /**\n * Verify hash\n */\n verifyHash(data: string, hash: string): boolean {\n return this.hash(data) === hash;\n }\n\n /**\n * Get required approval level for risk\n */\n getApprovalLevel(riskLevel: RiskLevel): 'none' | 'admin' | 'super-admin' {\n switch (riskLevel) {\n case 'safe':\n case 'moderate':\n return 'none';\n case 'high':\n return 'admin';\n case 'critical':\n return 'super-admin';\n default:\n return 'super-admin';\n }\n }\n\n /**\n * Sanitize log data (remove sensitive information)\n */\n sanitizeForLog(data: unknown): unknown {\n if (typeof data !== 'object' || data === null) return data;\n\n const sensitiveKeys = ['password', 'apiKey', 'secret', 'token', 'authorization'];\n\n if (Array.isArray(data)) {\n return data.map(item => this.sanitizeForLog(item));\n }\n\n // Using Record<string, unknown> because sanitized data structure varies by input type and cannot be strictly typed\n const sanitized: /* Using Record<string, unknown> because sanitized data structure varies by input type and cannot be strictly typed */ Record<\n string,\n unknown\n > = {};\n for (const [key, value] of Object.entries(data)) {\n if (sensitiveKeys.some(k => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]';\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = this.sanitizeForLog(value);\n } else {\n sanitized[key] = value;\n }\n }\n return sanitized;\n }\n\n /**\n * Generate request signature for verification\n */\n generateSignature(payload: string, timestamp: number): string {\n const data = `${timestamp}:${payload}`;\n return createHash('sha256')\n .update(data + this.config.jwtSecret)\n .digest('hex');\n }\n\n /**\n * Verify request signature\n */\n verifySignature(payload: string, timestamp: number, signature: string): boolean {\n // Check if timestamp is recent (within 5 minutes)\n const now = Date.now();\n const timeDiff = Math.abs(now - timestamp);\n if (timeDiff > 5 * 60 * 1000) {\n return false; // Expired\n }\n\n const expectedSignature = this.generateSignature(payload, timestamp);\n return expectedSignature === signature;\n }\n}\n","/**\n * ToolDiscoveryService - Filesystem-based tool discovery with progressive disclosure\n * Implements the Anthropic code execution pattern with enhanced features\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport { codeGenerationTool } from '../tools/development';\nimport type { ToolDefinition, ToolDetailLevel, ToolDiscoveryResult } from '../tools/types';\nimport { faqTool, launchkitTool } from '../tools/user-facing';\n\nconst logger = createServiceLogger('ToolDiscoveryService');\n\nexport interface ToolIndexEntry {\n name: string;\n server: string;\n filePath: string;\n lastModified: number;\n definition: ToolDefinition | null;\n}\n\nexport interface ToolSearchOptions {\n server?: string;\n query?: string;\n detailLevel?: ToolDetailLevel;\n limit?: number;\n}\n\nexport class ToolDiscoveryService {\n private toolsDir: string;\n private index: Map<string, ToolIndexEntry> = new Map();\n private indexCache: Map<string, ToolDiscoveryResult> = new Map();\n private isInitialized = false;\n private payloadTools: Map<string, ToolDefinition> = new Map();\n\n constructor(toolsDir?: string) {\n this.toolsDir = toolsDir || path.resolve(__dirname, '../tools');\n }\n\n /**\n * Initialize the tool discovery service\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Build tool index from filesystem\n await this.buildIndex();\n\n this.isInitialized = true;\n }\n\n /**\n * Build tool index from filesystem\n */\n private async buildIndex(): Promise<void> {\n // Load all tools from the tools directory\n const tools: Record<string, ToolDefinition> = {\n 'user-facing/faq': faqTool,\n 'user-facing/launchkit': launchkitTool,\n 'development/code-generation': codeGenerationTool,\n };\n\n for (const [toolPath] of Object.entries(tools)) {\n const parts = toolPath.split('/');\n const server = parts[0];\n const toolName = parts[1];\n if (!server || !toolName) continue;\n\n const key = `${server}:${toolName}`;\n const filePath = path.join(this.toolsDir, `${toolPath}.ts`);\n\n this.index.set(key, {\n name: toolName,\n server,\n filePath,\n lastModified: this.getFileLastModified(filePath),\n definition: null, // Lazy load\n });\n }\n\n // Add PayloadCMS tools if available\n for (const [toolName, toolDef] of this.payloadTools.entries()) {\n const key = `${toolDef.server}:${toolName}`;\n this.index.set(key, {\n name: toolName,\n server: toolDef.server,\n filePath: `payloadcms:${toolName}`,\n lastModified: Date.now(),\n definition: toolDef,\n });\n }\n }\n\n /**\n * Get file last modified time\n */\n private getFileLastModified(filePath: string): number {\n try {\n const stats = fs.statSync(filePath);\n return stats.mtimeMs;\n } catch {\n return 0;\n }\n }\n\n /**\n * Load tool definition\n */\n private async loadToolDefinition(entry: ToolIndexEntry): Promise<ToolDefinition | null> {\n if (entry.definition) {\n return entry.definition;\n }\n\n // Check if it's a PayloadCMS tool\n if (entry.server === 'payloadcms') {\n return this.payloadTools.get(entry.name) || null;\n }\n\n // Lazy load from the tools module\n try {\n const tools: Record<string, ToolDefinition> = {\n 'user-facing/faq': faqTool,\n 'user-facing/launchkit': launchkitTool,\n 'development/code-generation': codeGenerationTool,\n };\n\n const toolPath = `${entry.server}/${entry.name}`;\n const definition = tools[toolPath];\n\n if (definition) {\n entry.definition = definition;\n return definition;\n }\n } catch (error) {\n // Error loading tool definition - return null\n logger.error(`Failed to load tool definition for ${entry.server}:${entry.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n return null;\n }\n\n /**\n * Add PayloadCMS tool to the discovery service\n */\n addTool(tool: ToolDefinition): void {\n this.payloadTools.set(tool.name, tool);\n // Rebuild index to include new tool\n this.buildIndex().catch(error => {\n logger.error('Failed to rebuild index after adding PayloadCMS tool', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n\n /**\n * Remove PayloadCMS tool from the discovery service\n */\n removeTool(toolName: string): void {\n this.payloadTools.delete(toolName);\n // Rebuild index\n this.buildIndex().catch(error => {\n logger.error('Failed to rebuild index after removing PayloadCMS tool', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n\n /**\n * Search for tools with semantic/filename matching\n */\n async searchTools(options: ToolSearchOptions = {}): Promise<ToolDiscoveryResult> {\n const { server, query, detailLevel = 'full', limit = 50 } = options;\n\n // Check cache\n const cacheKey = `${server || 'all'}:${query || ''}:${detailLevel}`;\n const cached = this.indexCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n // Filter tools by server\n let matchingEntries = Array.from(this.index.values());\n if (server) {\n matchingEntries = matchingEntries.filter(entry => entry.server === server);\n }\n\n // Filter by query (semantic search on name/description)\n if (query) {\n const queryLower = query.toLowerCase();\n matchingEntries = matchingEntries.filter(entry => {\n const definition = entry.definition;\n if (!definition) return false;\n\n return (\n entry.name.toLowerCase().includes(queryLower) ||\n definition.description.toLowerCase().includes(queryLower)\n );\n });\n }\n\n // Load definitions based on detail level\n const tools: ToolDefinition[] = [];\n for (const entry of matchingEntries.slice(0, limit)) {\n const definition = await this.loadToolDefinition(entry);\n if (!definition) continue;\n\n const filteredDefinition = this.filterDefinitionByDetailLevel(definition, detailLevel);\n tools.push(filteredDefinition);\n }\n\n const result: ToolDiscoveryResult = {\n tools,\n total: tools.length,\n detailLevel,\n };\n\n // Cache result\n this.indexCache.set(cacheKey, result);\n\n return result;\n }\n\n /**\n * Filter tool definition by detail level\n */\n private filterDefinitionByDetailLevel(\n definition: ToolDefinition,\n detailLevel: ToolDetailLevel\n ): ToolDefinition {\n switch (detailLevel) {\n case 'name-only':\n return {\n name: definition.name,\n server: definition.server,\n description: '',\n parameters: [],\n returns: { type: '', description: '' },\n };\n case 'name-description':\n return {\n name: definition.name,\n server: definition.server,\n description: definition.description,\n parameters: definition.parameters.map(p => ({\n name: p.name,\n type: p.type,\n required: p.required,\n description: p.description,\n })),\n returns: {\n type: definition.returns.type,\n description: definition.returns.description,\n },\n };\n default:\n return definition;\n }\n }\n\n /**\n * Get tool by name and server\n */\n async getTool(\n server: string,\n toolName: string,\n detailLevel: ToolDetailLevel = 'full'\n ): Promise<ToolDefinition | null> {\n const key = `${server}:${toolName}`;\n const entry = this.index.get(key);\n\n if (!entry) {\n return null;\n }\n\n const definition = await this.loadToolDefinition(entry);\n if (!definition) {\n return null;\n }\n\n return this.filterDefinitionByDetailLevel(definition, detailLevel);\n }\n\n /**\n * List all servers\n */\n async listServers(): Promise<string[]> {\n const servers = new Set<string>();\n for (const entry of this.index.values()) {\n servers.add(entry.server);\n }\n return Array.from(servers).sort();\n }\n\n /**\n * List tools for a server\n */\n async listTools(\n server: string,\n detailLevel: ToolDetailLevel = 'name-only'\n ): Promise<ToolDefinition[]> {\n const entries = Array.from(this.index.values()).filter(entry => entry.server === server);\n const tools: ToolDefinition[] = [];\n\n for (const entry of entries) {\n const definition = await this.loadToolDefinition(entry);\n if (!definition) continue;\n\n const filteredDefinition = this.filterDefinitionByDetailLevel(definition, detailLevel);\n tools.push(filteredDefinition);\n }\n\n return tools;\n }\n\n /**\n * Clear index cache\n */\n clearCache(): void {\n this.indexCache.clear();\n }\n\n /**\n * Rebuild index (useful for hot-reloading)\n */\n async rebuildIndex(): Promise<void> {\n this.index.clear();\n this.indexCache.clear();\n await this.buildIndex();\n }\n\n /**\n * Get statistics\n */\n getStatistics(): {\n totalTools: number;\n servers: string[];\n indexedTools: number;\n cachedResults: number;\n } {\n const servers = new Set<string>();\n for (const entry of this.index.values()) {\n servers.add(entry.server);\n }\n\n return {\n totalTools: this.index.size,\n servers: Array.from(servers).sort(),\n indexedTools: this.index.size,\n cachedResults: this.indexCache.size,\n };\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n this.index.clear();\n this.indexCache.clear();\n this.isInitialized = false;\n }\n}\n","/**\n * Code Generation Tool Definition\n * Server: development\n * Tool: code-generation\n */\n\nimport type { ToolDefinition } from '../types';\n\nexport const codeGenerationTool: ToolDefinition = {\n name: 'code-generation',\n server: 'development',\n description:\n 'Generate code using AI models for components, services, tests, API routes, hooks, and utilities',\n parameters: [\n {\n name: 'type',\n type: \"'component' | 'service' | 'repository' | 'test' | 'api-route' | 'hook' | 'utility'\",\n required: true,\n description: 'Type of code to generate',\n },\n {\n name: 'name',\n type: 'string',\n required: true,\n description: 'Name of the code artifact to generate',\n },\n {\n name: 'description',\n type: 'string',\n required: true,\n description: 'Description of what the code should do',\n },\n {\n name: 'requirements',\n type: 'string',\n required: false,\n description: 'Additional requirements or specifications',\n },\n {\n name: 'context',\n type: 'object',\n required: false,\n description: 'Context including related files, existing patterns, and dependencies',\n },\n ],\n returns: {\n type: 'object',\n description: 'Generated code with filename, language, explanation, tests, and documentation',\n schema: {\n code: 'string',\n filename: 'string',\n language: 'string',\n explanation: 'string',\n tests: 'string | undefined',\n documentation: 'string | undefined',\n dependencies: 'string[] | undefined',\n },\n },\n examples: [\n {\n input: {\n type: 'component',\n name: 'UserAvatar',\n description: 'Display user avatar with online status',\n requirements: 'Circular avatar, green dot for online, gray for offline',\n },\n output: {\n code: 'export function UserAvatar({ user, online }) { ... }',\n filename: 'UserAvatar.tsx',\n language: 'typescript',\n explanation: 'Generated React component: UserAvatar',\n tests: '// Add tests for UserAvatar component',\n documentation: '# UserAvatar Component\\n\\nDisplay user avatar with online status',\n dependencies: ['react', 'react-dom', '@types/react'],\n },\n description: 'Generate a React component for user avatars',\n },\n ],\n};\n\n/**\n * Call the Code Generation tool\n */\nexport async function callCodeGenerationTool(input: {\n type: string;\n name: string;\n description: string;\n requirements?: string;\n // Using Record<string, unknown> because code generation context structure varies by use case and cannot be strictly typed\n context?: /* Using Record<string, unknown> because code generation context structure varies by use case and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n}): Promise<unknown> {\n // Validate input\n if (!input.type?.trim()) {\n throw new Error('Code generation type is required');\n }\n if (!input.name?.trim()) {\n throw new Error('Code generation name is required');\n }\n if (!input.description?.trim()) {\n throw new Error('Code generation description is required');\n }\n\n const validTypes = ['component', 'service', 'repository', 'test', 'api-route', 'hook', 'utility'];\n if (!validTypes.includes(input.type.toLowerCase())) {\n throw new Error(`Invalid code type: ${input.type}. Must be one of: ${validTypes.join(', ')}`);\n }\n\n // NOTE: This tool is intentionally deferred. Code generation should be performed via CodeGenerationAgent\n // which uses ToolDiscoveryService. This function exists for tool registration but should not be called directly.\n throw new Error(\n `Code Generation tool should be called via CodeGenerationAgent/ToolDiscoveryService. Type: ${input.type}, Name: ${input.name}`\n );\n}\n","/**\n * FAQ Tool Definition\n * Server: user-facing\n * Tool: faq\n */\n\nimport type { ToolDefinition } from '../types';\n\nexport const faqTool: ToolDefinition = {\n name: 'faq',\n server: 'user-facing',\n description:\n 'Retrieve answers from the self-serve FAQ knowledge base by searching for matching questions',\n parameters: [\n {\n name: 'question',\n type: 'string',\n required: true,\n description: 'The question to search for in the FAQ',\n },\n {\n name: 'maxAnswers',\n type: 'number',\n required: false,\n description: 'Maximum number of answers to return (default: 1)',\n default: 1,\n },\n {\n name: 'format',\n type: \"'markdown' | 'text'\",\n required: false,\n description: 'Response format (default: markdown)',\n default: 'markdown',\n },\n ],\n returns: {\n type: 'object',\n description: 'FAQ search results with matches, source, and metadata',\n schema: {\n matches: {\n type: 'array',\n items: {\n section: 'string',\n question: 'string',\n answer: 'string',\n confidence: 'number',\n },\n },\n source: 'string',\n generatedAt: 'string',\n },\n },\n examples: [\n {\n input: {\n question: 'How do I bootstrap the workspace quickly?',\n maxAnswers: 1,\n format: 'markdown',\n },\n output: {\n matches: [\n {\n section: 'Getting Started',\n question: 'How do I bootstrap the workspace quickly?',\n answer: 'Run `pnpm install && pnpm dev` to quickly start development...',\n confidence: 0.95,\n },\n ],\n source: 'docs/meta/SELF_SERVE_FAQ.md',\n generatedAt: '2025-01-20T12:00:00Z',\n },\n description: 'Search FAQ for workspace bootstrap instructions',\n },\n ],\n};\n\n/**\n * Call the FAQ tool\n */\nexport async function callFAQTool(input: {\n question: string;\n maxAnswers?: number;\n format?: 'markdown' | 'text';\n}): Promise<unknown> {\n // Validate input\n if (!input.question?.trim()) {\n throw new Error('FAQ question is required');\n }\n\n // This will be implemented by ToolDiscoveryService\n // Agents will use this function via code execution\n throw new Error(\n `FAQ tool should be called via ToolDiscoveryService. Question: \"${input.question.substring(0, 50)}${input.question.length > 50 ? '...' : ''}\"`\n );\n}\n","/**\n * LaunchKit Reminder Tool Definition\n * Server: user-facing\n * Tool: launchkit\n */\n\nimport type { ToolDefinition } from '../types';\n\nexport const launchkitTool: ToolDefinition = {\n name: 'launchkit',\n server: 'user-facing',\n description: 'Surface launch kit tasks that need attention based on ownership tracker tables',\n parameters: [\n {\n name: 'scope',\n type: \"'overdue' | 'upcoming' | 'pending' | 'all'\",\n required: false,\n description: 'Scope of reminders to retrieve (default: upcoming)',\n default: 'upcoming',\n },\n {\n name: 'upcomingDays',\n type: 'number',\n required: false,\n description: 'Number of days for upcoming reminders (default: 7)',\n default: 7,\n },\n ],\n returns: {\n type: 'object',\n description: 'Launch kit reminder results with tasks and metadata',\n schema: {\n tasks: {\n type: 'array',\n items: {\n kit: 'string',\n file: 'string',\n workstream: 'string',\n task: 'string',\n owner: 'string',\n targetDate: 'string | undefined',\n status: 'string',\n },\n },\n metadata: {\n scope: 'string',\n upcomingDays: 'number',\n generatedAt: 'string',\n },\n },\n },\n examples: [\n {\n input: { scope: 'upcoming', upcomingDays: 7 },\n output: {\n tasks: [\n {\n kit: 'Production Launch',\n file: 'docs/meta/launch-kits/production-launch.md',\n workstream: 'Infrastructure',\n task: 'Set up monitoring',\n owner: 'ops-team',\n targetDate: '2025-01-27',\n status: 'pending',\n },\n ],\n metadata: {\n scope: 'upcoming',\n upcomingDays: 7,\n generatedAt: '2025-01-20T12:00:00Z',\n },\n },\n description: 'Get upcoming launch kit tasks for the next 7 days',\n },\n ],\n};\n\n/**\n * Call the LaunchKit tool\n */\nexport async function callLaunchKitTool(input: {\n scope?: 'overdue' | 'upcoming' | 'pending' | 'all';\n upcomingDays?: number;\n}): Promise<unknown> {\n // Validate input\n const scope = input.scope || 'upcoming';\n const upcomingDays = input.upcomingDays || 7;\n\n if (upcomingDays !== undefined && (upcomingDays < 1 || upcomingDays > 365)) {\n throw new Error('upcomingDays must be between 1 and 365');\n }\n\n // NOTE: This tool is intentionally deferred. LaunchKit functionality should be performed via LaunchKitReminderAgent\n // which uses ToolDiscoveryService. This function exists for tool registration but should not be called directly.\n throw new Error(\n `LaunchKit tool should be called via LaunchKitReminderAgent/ToolDiscoveryService. Scope: ${scope}, UpcomingDays: ${upcomingDays}`\n );\n}\n","/**\n * MCPServer - Central coordination hub for multi-agent communication\n */\n\nimport type { BaseAgent } from '../agents/BaseAgent';\nimport type { AgentMessage, AgentResponse } from '../types/messages';\nimport type { AgentTask } from '../types/tasks';\nimport { AgentRegistry } from './AgentRegistry';\nimport { MessageBroker, type MessageBrokerConfig } from './MessageBroker';\nimport { ProtocolHandler } from './ProtocolHandler';\nimport { type SecurityConfig, SecurityManager } from './SecurityManager';\nimport { ToolDiscoveryService, type ToolSearchOptions } from './ToolDiscoveryService';\n\nexport interface MCPServerConfig {\n messageBroker: MessageBrokerConfig;\n security: SecurityConfig;\n}\n\nexport class MCPServer {\n private broker: MessageBroker;\n private registry: AgentRegistry;\n private protocol: ProtocolHandler;\n private security: SecurityManager;\n private toolDiscovery: ToolDiscoveryService;\n private agents: Map<string, BaseAgent> = new Map();\n private isInitialized = false;\n\n constructor(config: MCPServerConfig) {\n this.broker = new MessageBroker(config.messageBroker);\n this.registry = new AgentRegistry();\n this.protocol = new ProtocolHandler();\n this.security = new SecurityManager(config.security);\n this.toolDiscovery = new ToolDiscoveryService();\n }\n\n /**\n * Initialize the MCP server\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n this.logger.info('Initializing MCP Server...');\n\n // Initialize message broker\n await this.broker.initialize();\n\n // Initialize tool discovery service\n await this.toolDiscovery.initialize();\n\n this.logger.info('MCP Server initialized successfully');\n this.isInitialized = true;\n }\n\n /**\n * Register an agent with the server\n */\n async registerAgent(agent: BaseAgent): Promise<void> {\n const agentId = agent.config.id;\n\n if (this.agents.has(agentId)) {\n throw new Error(`Agent already registered: ${agentId}`);\n }\n\n // Initialize the agent\n await agent.initialize();\n\n // Store agent\n this.agents.set(agentId, agent);\n\n this.logger.info(`Agent registered with MCP Server: ${agentId}`);\n }\n\n /**\n * Unregister an agent\n */\n async unregisterAgent(agentId: string): Promise<void> {\n const agent = this.agents.get(agentId);\n if (!agent) return;\n\n await agent.shutdown();\n this.agents.delete(agentId);\n\n this.logger.info(`Agent unregistered from MCP Server: ${agentId}`);\n }\n\n /**\n * Send a message to an agent\n */\n async sendMessage(message: AgentMessage): Promise<void> {\n // Validate message format\n const parseResult = this.protocol.parseMessage(this.protocol.serializeMessage(message));\n if (!parseResult.success) {\n throw new Error(`Invalid message format: ${parseResult.error}`);\n }\n\n // Enqueue message\n await this.broker.enqueue(message);\n }\n\n /**\n * Execute a task (convenience method)\n */\n async executeTask(task: Partial<AgentTask>): Promise<AgentResponse> {\n // Find available agent\n const agentId = task.agentId ?? this.registry.findAvailableAgent(task.type ?? '', undefined);\n\n if (!agentId) {\n return this.protocol.createErrorResponse('', -32001, 'No available agent found for task');\n }\n\n // Create message\n const message: AgentMessage = {\n jsonrpc: '2.0',\n id: this.protocol.createMessageId(),\n method: task.type ?? '',\n params: {\n agentId,\n taskId: task.id ?? this.protocol.createTaskId(),\n payload: task.payload ?? {},\n priority: task.priority ?? 'medium',\n requiresApproval: task.requiresApproval ?? false,\n riskLevel: task.riskLevel ?? 'safe',\n },\n };\n\n // Send message\n await this.sendMessage(message);\n\n // For synchronous response, we'd need to wait for completion\n // For now, return a pending response\n return this.protocol.createSuccessResponse(message.id, {\n status: 'queued',\n taskId: message.params.taskId,\n agentId,\n });\n }\n\n /**\n * Get agent status\n */\n getAgentStatus(agentId: string) {\n const registration = this.registry.getAgent(agentId);\n const health = this.registry.getHealth(agentId);\n const metrics = this.registry.getMetrics(agentId);\n\n return {\n registration,\n health,\n metrics,\n };\n }\n\n /**\n * Get all agents status\n */\n getAllAgentsStatus() {\n return {\n agents: this.registry.getAllAgents(),\n health: this.registry.getAllHealth(),\n metrics: this.registry.getAllMetrics(),\n statistics: this.registry.getStatistics(),\n };\n }\n\n /**\n * Get server statistics\n */\n getStatistics() {\n return {\n registry: this.registry.getStatistics(),\n agents: this.agents.size,\n uptime: process.uptime(),\n };\n }\n\n /**\n * Get message broker\n */\n getMessageBroker(): MessageBroker {\n return this.broker;\n }\n\n /**\n * Get agent registry\n */\n getAgentRegistry(): AgentRegistry {\n return this.registry;\n }\n\n /**\n * Get protocol handler\n */\n getProtocolHandler(): ProtocolHandler {\n return this.protocol;\n }\n\n /**\n * Get security manager\n */\n getSecurityManager(): SecurityManager {\n return this.security;\n }\n\n /**\n * Search tools (progressive disclosure)\n */\n async searchTools(options: ToolSearchOptions = {}) {\n return await this.toolDiscovery.searchTools(options);\n }\n\n /**\n * Get tool by server and name\n */\n async getTool(\n server: string,\n toolName: string,\n detailLevel: 'name-only' | 'name-description' | 'full' = 'full'\n ) {\n return await this.toolDiscovery.getTool(server, toolName, detailLevel);\n }\n\n /**\n * List all tool servers\n */\n async listToolServers() {\n return await this.toolDiscovery.listServers();\n }\n\n /**\n * List tools for a server\n */\n async listTools(\n server: string,\n detailLevel: 'name-only' | 'name-description' | 'full' = 'name-only'\n ) {\n return await this.toolDiscovery.listTools(server, detailLevel);\n }\n\n /**\n * Get tool discovery service\n */\n getToolDiscoveryService(): ToolDiscoveryService {\n return this.toolDiscovery;\n }\n\n /**\n * Shutdown the server\n */\n async shutdown(): Promise<void> {\n this.logger.info('Shutting down MCP Server...');\n\n // Shutdown all agents\n for (const [_agentId, agent] of this.agents.entries()) {\n await agent.shutdown();\n }\n\n // Shutdown components\n await this.broker.shutdown();\n await this.toolDiscovery.shutdown();\n this.registry.shutdown();\n\n this.agents.clear();\n this.isInitialized = false;\n\n this.logger.info('MCP Server shut down successfully');\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<{\n status: 'healthy' | 'degraded' | 'unhealthy';\n components: Record<string, boolean>;\n statistics: ReturnType<typeof this.getStatistics>;\n }> {\n const stats = this.registry.getStatistics();\n\n const components = {\n broker: this.isInitialized,\n registry: this.isInitialized,\n agents: stats.activeAgents > 0,\n };\n\n let status: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';\n\n if (!components.broker || !components.registry) {\n status = 'unhealthy';\n } else if (stats.errorAgents > stats.activeAgents * 0.5) {\n status = 'degraded';\n }\n\n return {\n status,\n components,\n statistics: this.getStatistics(),\n };\n }\n}\n","/**\n * SkillsRegistry - Reusable agent functions storage with SKILL.md format support\n * Implements Anthropic's skills pattern for agent capability building\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface Skill {\n id: string;\n name: string;\n description: string;\n code: string;\n metadata?: {\n version?: string;\n author?: string;\n tags?: string[];\n examples?: SkillExample[];\n dependencies?: string[];\n };\n filePath?: string;\n createdAt: number;\n modifiedAt: number;\n}\n\nexport interface SkillExample {\n // Using Record<string, unknown> because skill input structure varies by skill type and cannot be strictly typed\n input: /* Using Record<string, unknown> because skill input structure varies by skill type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n output: unknown;\n description?: string;\n}\n\nexport interface SkillSearchOptions {\n query?: string;\n tags?: string[];\n limit?: number;\n}\n\nexport class SkillsRegistry {\n private skillsDir: string;\n private skills: Map<string, Skill> = new Map();\n private isInitialized = false;\n\n constructor(skillsDir?: string) {\n this.skillsDir = skillsDir || path.resolve(process.cwd(), 'data/mcp/skills');\n }\n\n /**\n * Initialize skills registry\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Create skills directory if it doesn't exist\n if (!fs.existsSync(this.skillsDir)) {\n fs.mkdirSync(this.skillsDir, { recursive: true });\n }\n\n // Load existing skills\n await this.loadSkills();\n\n this.isInitialized = true;\n }\n\n /**\n * Load skills from filesystem\n */\n private async loadSkills(): Promise<void> {\n if (!fs.existsSync(this.skillsDir)) {\n return;\n }\n\n const entries = fs.readdirSync(this.skillsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n await this.loadSkillFromDirectory(path.join(this.skillsDir, entry.name));\n } else if (entry.isFile() && entry.name.endsWith('.ts')) {\n await this.loadSkillFromFile(path.join(this.skillsDir, entry.name));\n }\n }\n }\n\n /**\n * Load skill from directory (with SKILL.md)\n */\n private async loadSkillFromDirectory(dirPath: string): Promise<void> {\n const skillId = path.basename(dirPath);\n const skillMdPath = path.join(dirPath, 'SKILL.md');\n const codePath = path.join(dirPath, 'index.ts');\n\n if (!fs.existsSync(skillMdPath) || !fs.existsSync(codePath)) {\n return;\n }\n\n try {\n const skillMd = fs.readFileSync(skillMdPath, 'utf8');\n const code = fs.readFileSync(codePath, 'utf8');\n const metadata = this.parseSkillMd(skillMd);\n\n const stats = fs.statSync(codePath);\n\n const skill: Skill = {\n id: skillId,\n name: metadata.name || skillId,\n description: metadata.description || '',\n code,\n metadata: {\n ...metadata,\n version: metadata.version || '1.0.0',\n },\n filePath: dirPath,\n createdAt: stats.birthtimeMs,\n modifiedAt: stats.mtimeMs,\n };\n\n this.skills.set(skillId, skill);\n } catch (error) {\n // Error loading skill - skip it\n\n console.error(`Failed to load skill from ${dirPath}:`, error);\n }\n }\n\n /**\n * Load skill from single file\n */\n private async loadSkillFromFile(filePath: string): Promise<void> {\n const skillId = path.basename(filePath, '.ts');\n\n try {\n const code = fs.readFileSync(filePath, 'utf8');\n const metadata = this.extractMetadataFromCode(code);\n const stats = fs.statSync(filePath);\n\n const skill: Skill = {\n id: skillId,\n name: metadata.name || skillId,\n description: metadata.description || '',\n code,\n metadata,\n filePath,\n createdAt: stats.birthtimeMs,\n modifiedAt: stats.mtimeMs,\n };\n\n this.skills.set(skillId, skill);\n } catch (error) {\n // Error loading skill - skip it\n\n console.error(`Failed to load skill from ${filePath}:`, error);\n }\n }\n\n /**\n * Parse SKILL.md file\n */\n private parseSkillMd(content: string): Partial<Skill['metadata']> {\n const metadata: Partial<Skill['metadata']> = {};\n\n // Extract name\n const nameMatch = content.match(/^#\\s+(.+)$/m);\n if (nameMatch) {\n metadata.name = nameMatch[1].trim();\n }\n\n // Extract description\n const descMatch = content.match(/##\\s+Description\\s*\\n\\n(.+?)(?=\\n##|\\n*$)/s);\n if (descMatch) {\n metadata.description = descMatch[1].trim();\n }\n\n // Extract version\n const versionMatch = content.match(/Version:\\s*([^\\n]+)/i);\n if (versionMatch) {\n metadata.version = versionMatch[1].trim();\n }\n\n // Extract author\n const authorMatch = content.match(/Author:\\s*([^\\n]+)/i);\n if (authorMatch) {\n metadata.author = authorMatch[1].trim();\n }\n\n // Extract tags\n const tagsMatch = content.match(/Tags?:\\s*([^\\n]+)/i);\n if (tagsMatch) {\n metadata.tags = tagsMatch[1].split(',').map(t => t.trim());\n }\n\n // Extract dependencies\n const depsMatch = content.match(/Dependencies?:\\s*([^\\n]+)/i);\n if (depsMatch) {\n metadata.dependencies = depsMatch[1].split(',').map(d => d.trim());\n }\n\n return metadata;\n }\n\n /**\n * Extract metadata from code comments\n */\n private extractMetadataFromCode(code: string): Partial<Skill['metadata']> {\n const metadata: Partial<Skill['metadata']> = {};\n\n // Extract name from function/class name\n const nameMatch = code.match(/(?:export\\s+(?:function|class|const)\\s+)(\\w+)/);\n if (nameMatch) {\n metadata.name = nameMatch[1];\n }\n\n // Extract description from JSDoc\n const descMatch =\n code.match(/\\*\\s*@description\\s+(.+?)(?:\\n|$)/i) ||\n code.match(/\\*\\*\\s*\\n\\s*\\*\\s*(.+?)(?:\\n|$)/);\n if (descMatch) {\n metadata.description = descMatch[1].trim();\n }\n\n // Extract tags from JSDoc\n const tagsMatch = code.match(/\\*\\s*@tags?\\s+(.+?)(?:\\n|$)/i);\n if (tagsMatch) {\n metadata.tags = tagsMatch[1].split(',').map(t => t.trim());\n }\n\n return metadata;\n }\n\n /**\n * Register a skill\n */\n async registerSkill(skill: Omit<Skill, 'createdAt' | 'modifiedAt'>): Promise<Skill> {\n const now = Date.now();\n const fullSkill: Skill = {\n ...skill,\n createdAt: now,\n modifiedAt: now,\n };\n\n // Save to filesystem\n await this.saveSkill(fullSkill);\n\n this.skills.set(skill.id, fullSkill);\n return fullSkill;\n }\n\n /**\n * Save skill to filesystem\n */\n private async saveSkill(skill: Skill): Promise<void> {\n const skillDir = path.join(this.skillsDir, skill.id);\n if (!fs.existsSync(skillDir)) {\n fs.mkdirSync(skillDir, { recursive: true });\n }\n\n // Save code\n const codePath = path.join(skillDir, 'index.ts');\n fs.writeFileSync(codePath, skill.code);\n\n // Save SKILL.md\n const skillMdPath = path.join(skillDir, 'SKILL.md');\n const skillMd = this.generateSkillMd(skill);\n fs.writeFileSync(skillMdPath, skillMd);\n }\n\n /**\n * Generate SKILL.md content\n */\n private generateSkillMd(skill: Skill): string {\n const md: string[] = [];\n\n md.push(`# ${skill.name}\\n`);\n md.push(skill.description || 'No description provided.\\n');\n\n if (skill.metadata) {\n md.push('\\n## Metadata\\n');\n if (skill.metadata.version) {\n md.push(`Version: ${skill.metadata.version}\\n`);\n }\n if (skill.metadata.author) {\n md.push(`Author: ${skill.metadata.author}\\n`);\n }\n if (skill.metadata.tags && skill.metadata.tags.length > 0) {\n md.push(`Tags: ${skill.metadata.tags.join(', ')}\\n`);\n }\n if (skill.metadata.dependencies && skill.metadata.dependencies.length > 0) {\n md.push(`Dependencies: ${skill.metadata.dependencies.join(', ')}\\n`);\n }\n }\n\n if (skill.metadata?.examples && skill.metadata.examples.length > 0) {\n md.push('\\n## Examples\\n');\n for (const example of skill.metadata.examples) {\n md.push(`### ${example.description || 'Example'}\\n`);\n md.push('```typescript\\n');\n md.push(`// Input:\\n${JSON.stringify(example.input, null, 2)}\\n`);\n md.push(`// Output:\\n${JSON.stringify(example.output, null, 2)}\\n`);\n md.push('```\\n');\n }\n }\n\n return md.join('\\n');\n }\n\n /**\n * Get skill by ID\n */\n getSkill(skillId: string): Skill | null {\n return this.skills.get(skillId) || null;\n }\n\n /**\n * Search skills\n */\n searchSkills(options: SkillSearchOptions = {}): Skill[] {\n const { query, tags, limit = 50 } = options;\n\n let skills = Array.from(this.skills.values());\n\n // Filter by query\n if (query) {\n const queryLower = query.toLowerCase();\n skills = skills.filter(\n skill =>\n skill.name.toLowerCase().includes(queryLower) ||\n skill.description.toLowerCase().includes(queryLower) ||\n skill.id.toLowerCase().includes(queryLower)\n );\n }\n\n // Filter by tags\n if (tags && tags.length > 0) {\n skills = skills.filter(skill => skill.metadata?.tags?.some(tag => tags.includes(tag)));\n }\n\n // Limit results\n return skills.slice(0, limit);\n }\n\n /**\n * List all skills\n */\n listSkills(): Skill[] {\n return Array.from(this.skills.values());\n }\n\n /**\n * Delete skill\n */\n async deleteSkill(skillId: string): Promise<boolean> {\n const skill = this.skills.get(skillId);\n if (!skill) {\n return false;\n }\n\n // Delete from filesystem\n if (skill.filePath && fs.existsSync(skill.filePath)) {\n if (fs.statSync(skill.filePath).isDirectory()) {\n fs.rmSync(skill.filePath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(skill.filePath);\n }\n }\n\n this.skills.delete(skillId);\n return true;\n }\n\n /**\n * Get statistics\n */\n getStatistics(): {\n totalSkills: number;\n byTag: Record<string, number>;\n totalSize: number;\n } {\n const byTag: Record<string, number> = {};\n let totalSize = 0;\n\n for (const skill of this.skills.values()) {\n totalSize += skill.code.length;\n\n if (skill.metadata?.tags) {\n for (const tag of skill.metadata.tags) {\n byTag[tag] = (byTag[tag] || 0) + 1;\n }\n }\n }\n\n return {\n totalSkills: this.skills.size,\n byTag,\n totalSize,\n };\n }\n\n /**\n * Reload skills from filesystem\n */\n async reload(): Promise<void> {\n this.skills.clear();\n await this.loadSkills();\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n this.skills.clear();\n this.isInitialized = false;\n }\n}\n","/**\n * Feedback Collector - Collect user ratings and approvals\n *\n * Collects feedback from users to improve agent performance.\n *\n * @module feedback/FeedbackCollector\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { AgentTask, TaskResult } from '../types/tasks';\n\nconst logger = createServiceLogger('FeedbackCollector');\n\n/**\n * Feedback type\n */\nexport type FeedbackType = 'rating' | 'approval' | 'comment' | 'correction';\n\n/**\n * Feedback entry\n */\nexport interface Feedback {\n /** Feedback ID */\n id: string;\n /** Agent ID */\n agentId: string;\n /** Agent type */\n agentType: string;\n /** Task ID */\n taskId: string;\n /** Task type */\n taskType: string;\n /** Feedback type */\n type: FeedbackType;\n /** Rating (1-5) */\n rating?: number;\n /** Approved */\n approved?: boolean;\n /** Comment */\n comment?: string;\n /** Correction (if user provided corrected result) */\n correction?: TaskResult;\n /** User ID */\n userId?: string;\n /** Timestamp */\n timestamp: Date;\n}\n\n/**\n * Feedback statistics\n */\nexport interface FeedbackStats {\n /** Total feedback entries */\n totalFeedback: number;\n /** Average rating */\n averageRating: number;\n /** Approval rate */\n approvalRate: number;\n /** By agent type */\n byAgentType: Record<\n string,\n {\n totalFeedback: number;\n averageRating: number;\n approvalRate: number;\n }\n >;\n /** Recent feedback */\n recentFeedback: Feedback[];\n}\n\n/**\n * Feedback Collector\n *\n * Collects and analyzes user feedback\n */\nexport class FeedbackCollector {\n private feedback: Map<string, Feedback> = new Map();\n private maxFeedback: number = 50000; // Maximum feedback entries to store\n\n /**\n * Submit feedback\n */\n submitFeedback(\n agentId: string,\n agentType: string,\n taskId: string,\n taskType: string,\n type: FeedbackType,\n data: {\n rating?: number;\n approved?: boolean;\n comment?: string;\n correction?: TaskResult;\n userId?: string;\n }\n ): string {\n try {\n const id = `feedback-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n\n const feedback: Feedback = {\n id,\n agentId,\n agentType,\n taskId,\n taskType,\n type,\n rating: data.rating,\n approved: data.approved,\n comment: data.comment,\n correction: data.correction,\n userId: data.userId,\n timestamp: new Date(),\n };\n\n this.feedback.set(id, feedback);\n\n // Enforce size limit\n if (this.feedback.size > this.maxFeedback) {\n this.evictOldest();\n }\n\n logger.info('Feedback submitted', {\n id,\n agentId,\n agentType,\n taskId,\n type,\n rating: data.rating,\n approved: data.approved,\n });\n\n return id;\n } catch (error) {\n logger.error('Failed to submit feedback', {\n error: error instanceof Error ? error.message : 'Unknown error',\n agentId,\n taskId,\n });\n throw error;\n }\n }\n\n /**\n * Get feedback for agent\n */\n getFeedbackForAgent(agentId: string, limit: number = 100): Feedback[] {\n const feedbacks: Feedback[] = [];\n\n for (const feedback of this.feedback.values()) {\n if (feedback.agentId === agentId) {\n feedbacks.push(feedback);\n }\n }\n\n return feedbacks.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()).slice(0, limit);\n }\n\n /**\n * Get feedback for task\n */\n getFeedbackForTask(taskId: string): Feedback | undefined {\n for (const feedback of this.feedback.values()) {\n if (feedback.taskId === taskId) {\n return feedback;\n }\n }\n return undefined;\n }\n\n /**\n * Get feedback statistics\n */\n getStats(agentType?: string): FeedbackStats {\n let feedbacks = Array.from(this.feedback.values());\n\n if (agentType) {\n feedbacks = feedbacks.filter(f => f.agentType === agentType);\n }\n\n // Calculate average rating\n const ratings = feedbacks.filter(f => f.rating !== undefined).map(f => f.rating!);\n const averageRating =\n ratings.length > 0 ? ratings.reduce((sum, r) => sum + r, 0) / ratings.length : 0;\n\n // Calculate approval rate\n const approvals = feedbacks.filter(f => f.approved !== undefined);\n const approvalRate =\n approvals.length > 0\n ? approvals.filter(f => f.approved === true).length / approvals.length\n : 0;\n\n // Group by agent type\n const byAgentType: Record<\n string,\n {\n totalFeedback: number;\n averageRating: number;\n approvalRate: number;\n }\n > = {};\n\n for (const feedback of feedbacks) {\n if (!byAgentType[feedback.agentType]) {\n byAgentType[feedback.agentType] = {\n totalFeedback: 0,\n averageRating: 0,\n approvalRate: 0,\n };\n }\n\n byAgentType[feedback.agentType].totalFeedback++;\n\n if (feedback.rating !== undefined) {\n const currentAvg = byAgentType[feedback.agentType].averageRating;\n const count = byAgentType[feedback.agentType].totalFeedback;\n byAgentType[feedback.agentType].averageRating =\n (currentAvg * (count - 1) + feedback.rating) / count;\n }\n\n if (feedback.approved !== undefined) {\n const approvals = feedbacks.filter(\n f => f.agentType === feedback.agentType && f.approved !== undefined\n );\n const approved = approvals.filter(f => f.approved === true).length;\n byAgentType[feedback.agentType].approvalRate =\n approvals.length > 0 ? approved / approvals.length : 0;\n }\n }\n\n // Get recent feedback\n const recentFeedback = feedbacks\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, 50);\n\n return {\n totalFeedback: feedbacks.length,\n averageRating,\n approvalRate,\n byAgentType,\n recentFeedback,\n };\n }\n\n /**\n * Evict oldest feedback when size limit reached\n */\n private evictOldest(): void {\n const feedbacks = Array.from(this.feedback.values());\n\n // Sort by timestamp (oldest first)\n feedbacks.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n // Remove oldest 10%\n const toRemove = Math.floor(this.feedback.size * 0.1);\n for (let i = 0; i < toRemove; i++) {\n this.feedback.delete(feedbacks[i].id);\n }\n\n logger.debug('Evicted oldest feedback', { count: toRemove });\n }\n\n /**\n * Get feedback by ID\n */\n getFeedback(id: string): Feedback | undefined {\n return this.feedback.get(id);\n }\n\n /**\n * Get all feedback\n */\n getAllFeedback(limit?: number): Feedback[] {\n const feedbacks = Array.from(this.feedback.values());\n const sorted = feedbacks.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n return limit ? sorted.slice(0, limit) : sorted;\n }\n}\n","/**\n * AgentOps - Real-time monitoring and optimization\n *\n * Monitors agent performance in real-time and provides optimization insights.\n *\n * @module monitoring/AgentOps\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { AgentHealth, AgentStatus } from '../types/agents';\nimport type { AgentTask, TaskResult } from '../types/tasks';\n\nconst logger = createServiceLogger('AgentOps');\n\n/**\n * Agent metrics\n */\nexport interface AgentMetrics {\n /** Agent ID */\n agentId: string;\n /** Agent type */\n agentType: string;\n /** Current status */\n status: AgentStatus;\n /** Health status */\n health: AgentHealth;\n /** Tasks completed */\n tasksCompleted: number;\n /** Tasks failed */\n tasksFailed: number;\n /** Average execution time (ms) */\n averageExecutionTime: number;\n /** Success rate */\n successRate: number;\n /** Current load */\n currentLoad: number;\n /** Peak load */\n peakLoad: number;\n /** Last activity */\n lastActivity: Date;\n /** Error rate */\n errorRate: number;\n}\n\n/**\n * System metrics\n */\nexport interface SystemMetrics {\n /** Total agents */\n totalAgents: number;\n /** Active agents */\n activeAgents: number;\n /** Total tasks processed */\n totalTasksProcessed: number;\n /** System success rate */\n systemSuccessRate: number;\n /** Average response time */\n averageResponseTime: number;\n /** Peak concurrent tasks */\n peakConcurrentTasks: number;\n /** Agent metrics */\n agentMetrics: AgentMetrics[];\n}\n\n/**\n * Performance alert\n */\nexport interface PerformanceAlert {\n /** Alert ID */\n id: string;\n /** Alert type */\n type: 'performance' | 'error' | 'capacity' | 'health';\n /** Severity */\n severity: 'low' | 'medium' | 'high' | 'critical';\n /** Agent ID */\n agentId?: string;\n /** Message */\n message: string;\n /** Timestamp */\n timestamp: Date;\n /** Resolved */\n resolved: boolean;\n}\n\n/**\n * AgentOps - Real-time monitoring and optimization\n */\nexport class AgentOps {\n private metrics: Map<string, AgentMetrics> = new Map();\n private alerts: PerformanceAlert[] = [];\n private maxAlerts: number = 1000;\n private systemStartTime: number = Date.now();\n private totalTasksProcessed: number = 0;\n private totalTasksSucceeded: number = 0;\n private peakConcurrentTasks: number = 0;\n private currentConcurrentTasks: number = 0;\n\n /**\n * Record task execution\n */\n recordTaskExecution(\n agentId: string,\n agentType: string,\n task: AgentTask,\n result: TaskResult,\n executionTime: number\n ): void {\n try {\n let metrics = this.metrics.get(agentId);\n\n if (!metrics) {\n metrics = {\n agentId,\n agentType,\n status: 'idle',\n health: 'healthy',\n tasksCompleted: 0,\n tasksFailed: 0,\n averageExecutionTime: 0,\n successRate: 0,\n currentLoad: 0,\n peakLoad: 0,\n lastActivity: new Date(),\n errorRate: 0,\n };\n this.metrics.set(agentId, metrics);\n }\n\n // Update metrics\n const success = result.success !== false;\n if (success) {\n metrics.tasksCompleted++;\n this.totalTasksSucceeded++;\n } else {\n metrics.tasksFailed++;\n }\n\n this.totalTasksProcessed++;\n this.currentConcurrentTasks--;\n\n // Update execution time (exponential moving average)\n metrics.averageExecutionTime = metrics.averageExecutionTime * 0.9 + executionTime * 0.1;\n\n // Update success rate\n const totalTasks = metrics.tasksCompleted + metrics.tasksFailed;\n metrics.successRate = totalTasks > 0 ? metrics.tasksCompleted / totalTasks : 0;\n\n // Update error rate\n metrics.errorRate = totalTasks > 0 ? metrics.tasksFailed / totalTasks : 0;\n\n // Update load\n metrics.currentLoad = Math.max(0, metrics.currentLoad - 1);\n if (metrics.currentLoad > metrics.peakLoad) {\n metrics.peakLoad = metrics.currentLoad;\n }\n\n metrics.lastActivity = new Date();\n\n // Check for alerts\n this.checkAlerts(metrics);\n\n // Update peak concurrent tasks\n if (this.currentConcurrentTasks > this.peakConcurrentTasks) {\n this.peakConcurrentTasks = this.currentConcurrentTasks;\n }\n } catch (error) {\n logger.error('Failed to record task execution', {\n error: error instanceof Error ? error.message : 'Unknown error',\n agentId,\n });\n }\n }\n\n /**\n * Record task start\n */\n recordTaskStart(agentId: string): void {\n this.currentConcurrentTasks++;\n\n const metrics = this.metrics.get(agentId);\n if (metrics) {\n metrics.currentLoad++;\n metrics.status = 'busy';\n metrics.lastActivity = new Date();\n }\n }\n\n /**\n * Update agent status\n */\n updateAgentStatus(agentId: string, status: AgentStatus, health: AgentHealth): void {\n const metrics = this.metrics.get(agentId);\n if (metrics) {\n metrics.status = status;\n metrics.health = health;\n metrics.lastActivity = new Date();\n\n // Check for health alerts\n if (health !== 'healthy') {\n this.addAlert({\n type: 'health',\n severity: health === 'critical' ? 'critical' : 'high',\n agentId,\n message: `Agent ${agentId} health status: ${health}`,\n timestamp: new Date(),\n resolved: false,\n });\n }\n }\n }\n\n /**\n * Check for performance alerts\n */\n private checkAlerts(metrics: AgentMetrics): void {\n // Check success rate\n if (metrics.successRate < 0.5 && metrics.tasksCompleted + metrics.tasksFailed > 10) {\n this.addAlert({\n type: 'performance',\n severity: metrics.successRate < 0.3 ? 'critical' : 'high',\n agentId: metrics.agentId,\n message: `Low success rate: ${(metrics.successRate * 100).toFixed(1)}%`,\n timestamp: new Date(),\n resolved: false,\n });\n }\n\n // Check error rate\n if (metrics.errorRate > 0.3 && metrics.tasksCompleted + metrics.tasksFailed > 10) {\n this.addAlert({\n type: 'error',\n severity: metrics.errorRate > 0.5 ? 'critical' : 'high',\n agentId: metrics.agentId,\n message: `High error rate: ${(metrics.errorRate * 100).toFixed(1)}%`,\n timestamp: new Date(),\n resolved: false,\n });\n }\n\n // Check execution time\n if (metrics.averageExecutionTime > 30000) {\n // More than 30 seconds average\n this.addAlert({\n type: 'performance',\n severity: metrics.averageExecutionTime > 60000 ? 'critical' : 'medium',\n agentId: metrics.agentId,\n message: `High average execution time: ${(metrics.averageExecutionTime / 1000).toFixed(1)}s`,\n timestamp: new Date(),\n resolved: false,\n });\n }\n\n // Check capacity\n if (metrics.currentLoad > metrics.peakLoad * 0.9) {\n this.addAlert({\n type: 'capacity',\n severity: 'medium',\n agentId: metrics.agentId,\n message: `High load: ${metrics.currentLoad}/${metrics.peakLoad}`,\n timestamp: new Date(),\n resolved: false,\n });\n }\n }\n\n /**\n * Add alert\n */\n private addAlert(alert: Omit<PerformanceAlert, 'id'>): void {\n const id = `alert-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n const fullAlert: PerformanceAlert = { ...alert, id };\n\n this.alerts.push(fullAlert);\n\n // Enforce size limit\n if (this.alerts.length > this.maxAlerts) {\n this.alerts = this.alerts.slice(-this.maxAlerts);\n }\n\n logger.warn('Performance alert', {\n id: fullAlert.id,\n type: fullAlert.type,\n severity: fullAlert.severity,\n agentId: fullAlert.agentId,\n message: fullAlert.message,\n });\n }\n\n /**\n * Get agent metrics\n */\n getAgentMetrics(agentId: string): AgentMetrics | undefined {\n return this.metrics.get(agentId);\n }\n\n /**\n * Get system metrics\n */\n getSystemMetrics(): SystemMetrics {\n const agentMetrics = Array.from(this.metrics.values());\n const activeAgents = agentMetrics.filter(m => m.status !== 'offline').length;\n\n const totalSuccessRate =\n this.totalTasksProcessed > 0 ? this.totalTasksSucceeded / this.totalTasksProcessed : 0;\n\n const totalExecutionTime = agentMetrics.reduce((sum, m) => sum + m.averageExecutionTime, 0);\n const averageResponseTime =\n agentMetrics.length > 0 ? totalExecutionTime / agentMetrics.length : 0;\n\n return {\n totalAgents: agentMetrics.length,\n activeAgents,\n totalTasksProcessed: this.totalTasksProcessed,\n systemSuccessRate: totalSuccessRate,\n averageResponseTime,\n peakConcurrentTasks: this.peakConcurrentTasks,\n agentMetrics,\n };\n }\n\n /**\n * Get active alerts\n */\n getActiveAlerts(severity?: PerformanceAlert['severity']): PerformanceAlert[] {\n let alerts = this.alerts.filter(a => !a.resolved);\n\n if (severity) {\n alerts = alerts.filter(a => a.severity === severity);\n }\n\n return alerts.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n }\n\n /**\n * Resolve alert\n */\n resolveAlert(alertId: string): void {\n const alert = this.alerts.find(a => a.id === alertId);\n if (alert) {\n alert.resolved = true;\n logger.info('Alert resolved', { alertId });\n }\n }\n\n /**\n * Get optimization recommendations\n */\n getOptimizationRecommendations(): Array<{\n agentId: string;\n agentType: string;\n recommendation: string;\n priority: 'low' | 'medium' | 'high';\n }> {\n const recommendations: Array<{\n agentId: string;\n agentType: string;\n recommendation: string;\n priority: 'low' | 'medium' | 'high';\n }> = [];\n\n for (const metrics of this.metrics.values()) {\n // Low success rate\n if (metrics.successRate < 0.5 && metrics.tasksCompleted + metrics.tasksFailed > 10) {\n recommendations.push({\n agentId: metrics.agentId,\n agentType: metrics.agentType,\n recommendation: `Consider reviewing and improving task handling logic. Success rate is ${(metrics.successRate * 100).toFixed(1)}%`,\n priority: metrics.successRate < 0.3 ? 'high' : 'medium',\n });\n }\n\n // High execution time\n if (metrics.averageExecutionTime > 30000) {\n recommendations.push({\n agentId: metrics.agentId,\n agentType: metrics.agentType,\n recommendation: `Optimize execution time. Average is ${(metrics.averageExecutionTime / 1000).toFixed(1)}s`,\n priority: metrics.averageExecutionTime > 60000 ? 'high' : 'medium',\n });\n }\n\n // High load\n if (metrics.currentLoad > metrics.peakLoad * 0.8) {\n recommendations.push({\n agentId: metrics.agentId,\n agentType: metrics.agentType,\n recommendation: `Consider scaling or optimizing. Current load is ${metrics.currentLoad}`,\n priority: 'medium',\n });\n }\n }\n\n return recommendations.sort((a, b) => {\n const priorityOrder = { high: 3, medium: 2, low: 1 };\n return priorityOrder[b.priority] - priorityOrder[a.priority];\n });\n }\n}\n","/**\n * ApprovalWorkflow - Handle approval requests for risky operations\n */\n\nimport { type Client, createClient } from '@libsql/client';\nimport type { RiskLevel } from '../types/messages';\nimport type { ApprovalRequest } from '../types/tasks';\n\nexport interface ApprovalNotification {\n requestId: string;\n taskId: string;\n agentId: string;\n riskLevel: RiskLevel;\n description: string;\n requestedAt: number;\n notifyUsers: string[]; // User IDs to notify\n notifyRoles: string[]; // Roles that can approve\n}\n\nexport class ApprovalWorkflow {\n private client: Client;\n private isInitialized = false;\n private notifications: Map<string, (request: ApprovalRequest) => void> = new Map();\n\n constructor(tursoUrl: string, authToken?: string) {\n this.client = createClient({\n url: tursoUrl,\n authToken,\n });\n }\n\n /**\n * Initialize approval workflow\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Create approval requests table\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS mcp_approval_requests (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n risk_level TEXT NOT NULL,\n description TEXT NOT NULL,\n details TEXT NOT NULL,\n requested_by TEXT NOT NULL,\n requested_at INTEGER NOT NULL,\n approved_by TEXT,\n approved_at INTEGER,\n rejected_by TEXT,\n rejected_at INTEGER,\n rejection_reason TEXT,\n status TEXT NOT NULL DEFAULT 'pending'\n )\n `);\n\n // Create indices\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_approval_status ON mcp_approval_requests(status, requested_at DESC)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_approval_task ON mcp_approval_requests(task_id)\n `);\n\n this.isInitialized = true;\n // ApprovalWorkflow initialized successfully\n }\n\n /**\n * Create approval request\n */\n async createRequest(\n taskId: string,\n agentId: string,\n riskLevel: RiskLevel,\n description: string,\n details: unknown,\n requestedBy: string\n ): Promise<ApprovalRequest> {\n const request: ApprovalRequest = {\n id: `approval-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n taskId,\n agentId,\n riskLevel,\n description,\n details,\n requestedBy,\n requestedAt: Date.now(),\n status: 'pending',\n };\n\n await this.client.execute({\n sql: `\n INSERT INTO mcp_approval_requests (\n id, task_id, agent_id, risk_level, description, details,\n requested_by, requested_at, status\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n args: [\n request.id,\n request.taskId,\n request.agentId,\n request.riskLevel,\n request.description,\n JSON.stringify(request.details),\n request.requestedBy,\n request.requestedAt,\n request.status,\n ],\n });\n\n // Notify subscribers\n this.notifySubscribers(request);\n\n return request;\n }\n\n /**\n * Approve request\n */\n async approve(requestId: string, userId: string, userRole: string): Promise<ApprovalRequest> {\n const request = await this.getRequest(requestId);\n if (!request) {\n throw new Error(`Approval request not found: ${requestId}`);\n }\n\n if (request.status !== 'pending') {\n throw new Error(`Request already ${request.status}`);\n }\n\n // Verify user has permission\n if (!this.canApprove(userRole, request.riskLevel)) {\n throw new Error(\n `User role '${userRole}' cannot approve ${request.riskLevel} risk operations`\n );\n }\n\n await this.client.execute({\n sql: `\n UPDATE mcp_approval_requests\n SET status = 'approved', approved_by = ?, approved_at = ?\n WHERE id = ?\n `,\n args: [userId, Date.now(), requestId],\n });\n\n request.status = 'approved';\n request.approvedBy = userId;\n request.approvedAt = Date.now();\n\n return request;\n }\n\n /**\n * Reject request\n */\n async reject(\n requestId: string,\n userId: string,\n userRole: string,\n reason: string\n ): Promise<ApprovalRequest> {\n const request = await this.getRequest(requestId);\n if (!request) {\n throw new Error(`Approval request not found: ${requestId}`);\n }\n\n if (request.status !== 'pending') {\n throw new Error(`Request already ${request.status}`);\n }\n\n await this.client.execute({\n sql: `\n UPDATE mcp_approval_requests\n SET status = 'rejected', rejected_by = ?, rejected_at = ?, rejection_reason = ?\n WHERE id = ?\n `,\n args: [userId, Date.now(), reason, requestId],\n });\n\n request.status = 'rejected';\n request.rejectedBy = userId;\n request.rejectedAt = Date.now();\n request.rejectionReason = reason;\n\n return request;\n }\n\n /**\n * Get approval request\n */\n async getRequest(requestId: string): Promise<ApprovalRequest | null> {\n const result = await this.client.execute({\n sql: 'SELECT * FROM mcp_approval_requests WHERE id = ?',\n args: [requestId],\n });\n\n if (result.rows.length === 0) return null;\n\n return this.rowToRequest(result.rows[0]);\n }\n\n /**\n * Get pending requests\n */\n async getPendingRequests(limit: number = 50): Promise<ApprovalRequest[]> {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM mcp_approval_requests\n WHERE status = 'pending'\n ORDER BY requested_at DESC\n LIMIT ?\n `,\n args: [limit],\n });\n\n return result.rows.map(row => this.rowToRequest(row));\n }\n\n /**\n * Get requests for task\n */\n async getRequestsForTask(taskId: string): Promise<ApprovalRequest[]> {\n const result = await this.client.execute({\n sql: 'SELECT * FROM mcp_approval_requests WHERE task_id = ? ORDER BY requested_at DESC',\n args: [taskId],\n });\n\n return result.rows.map(row => this.rowToRequest(row));\n }\n\n /**\n * Check if user can approve based on role\n */\n canApprove(userRole: string, riskLevel: RiskLevel): boolean {\n switch (riskLevel) {\n case 'safe':\n case 'moderate':\n return true; // No approval needed\n case 'high':\n return userRole === 'admin' || userRole === 'super-admin';\n case 'critical':\n return userRole === 'super-admin';\n default:\n return false;\n }\n }\n\n /**\n * Subscribe to approval requests\n */\n subscribe(callback: (request: ApprovalRequest) => void): string {\n const subscriptionId = `approval-sub-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n this.notifications.set(subscriptionId, callback);\n return subscriptionId;\n }\n\n /**\n * Unsubscribe from notifications\n */\n unsubscribe(subscriptionId: string): void {\n this.notifications.delete(subscriptionId);\n }\n\n /**\n * Notify subscribers of new request\n */\n private notifySubscribers(request: ApprovalRequest): void {\n for (const callback of this.notifications.values()) {\n try {\n callback(request);\n } catch (error) {\n // Swallow callback errors to prevent notification failures from affecting workflow\n // Consider implementing proper error tracking in production\n }\n }\n }\n\n /**\n * Convert database row to approval request\n */\n // Using Record<string, unknown> because database row structure varies by database schema and cannot be strictly typed\n private rowToRequest(\n row: /* Using Record<string, unknown> because database row structure varies by database schema and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): ApprovalRequest {\n return {\n id: row.id as string,\n taskId: row.task_id as string,\n agentId: row.agent_id as string,\n riskLevel: row.risk_level as RiskLevel,\n description: row.description as string,\n details: JSON.parse(row.details as string),\n requestedBy: row.requested_by as string,\n requestedAt: row.requested_at as number,\n approvedBy: row.approved_by as string | undefined,\n approvedAt: row.approved_at as number | undefined,\n rejectedBy: row.rejected_by as string | undefined,\n rejectedAt: row.rejected_at as number | undefined,\n rejectionReason: row.rejection_reason as string | undefined,\n status: row.status as ApprovalRequest['status'],\n };\n }\n\n /**\n * Cleanup old requests\n */\n async cleanup(olderThanMs: number = 30 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - olderThanMs;\n\n const result = await this.client.execute({\n sql: `DELETE FROM mcp_approval_requests WHERE requested_at < ? AND status != 'pending'`,\n args: [cutoff],\n });\n\n return result.rowsAffected;\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n this.notifications.clear();\n this.client.close();\n this.isInitialized = false;\n // ApprovalWorkflow shut down successfully\n }\n}\n","/**\n * AuditLogger - Comprehensive audit trail for all agent operations\n */\n\nimport { type Client, createClient } from '@libsql/client';\nimport type { AgentTask } from '../types/tasks';\nimport type { RiskAssessment } from './RiskClassifier';\n\nexport interface AuditEntry {\n id: string;\n timestamp: number;\n agentId: string;\n taskId: string;\n taskType: string;\n riskLevel: string;\n action: 'created' | 'approved' | 'rejected' | 'executed' | 'completed' | 'failed' | 'rolled_back';\n userId?: string;\n userRole?: string;\n beforeState?: unknown;\n afterState?: unknown;\n changes?: unknown;\n result?: unknown;\n error?: string;\n // Using Record<string, unknown> because audit entry metadata structure varies by operation type and cannot be strictly typed\n metadata?: /* Using Record<string, unknown> because audit entry metadata structure varies by operation type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n}\n\nexport interface AuditQuery {\n agentId?: string;\n taskId?: string;\n userId?: string;\n action?: AuditEntry['action'];\n riskLevel?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}\n\nexport class AuditLogger {\n private client: Client;\n private isInitialized = false;\n\n constructor(tursoUrl: string, authToken?: string) {\n this.client = createClient({\n url: tursoUrl,\n authToken,\n });\n }\n\n /**\n * Initialize audit logging\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Create audit log table\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS mcp_audit_log (\n id TEXT PRIMARY KEY,\n timestamp INTEGER NOT NULL,\n agent_id TEXT NOT NULL,\n task_id TEXT NOT NULL,\n task_type TEXT NOT NULL,\n risk_level TEXT NOT NULL,\n action TEXT NOT NULL,\n user_id TEXT,\n user_role TEXT,\n before_state TEXT,\n after_state TEXT,\n changes TEXT,\n result TEXT,\n error TEXT,\n metadata TEXT\n )\n `);\n\n // Create indices for querying\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON mcp_audit_log(timestamp DESC)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_audit_agent ON mcp_audit_log(agent_id, timestamp DESC)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_audit_task ON mcp_audit_log(task_id, timestamp)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_audit_user ON mcp_audit_log(user_id, timestamp DESC)\n `);\n\n this.isInitialized = true;\n // AuditLogger initialized successfully\n }\n\n /**\n * Log an audit entry\n */\n async log(entry: Omit<AuditEntry, 'id' | 'timestamp'>): Promise<void> {\n const auditEntry: AuditEntry = {\n id: `audit-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n timestamp: Date.now(),\n ...entry,\n };\n\n await this.client.execute({\n sql: `\n INSERT INTO mcp_audit_log (\n id, timestamp, agent_id, task_id, task_type, risk_level, action,\n user_id, user_role, before_state, after_state, changes, result, error, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n args: [\n auditEntry.id,\n auditEntry.timestamp,\n auditEntry.agentId,\n auditEntry.taskId,\n auditEntry.taskType,\n auditEntry.riskLevel,\n auditEntry.action,\n auditEntry.userId ?? null,\n auditEntry.userRole ?? null,\n auditEntry.beforeState ? JSON.stringify(auditEntry.beforeState) : null,\n auditEntry.afterState ? JSON.stringify(auditEntry.afterState) : null,\n auditEntry.changes ? JSON.stringify(auditEntry.changes) : null,\n auditEntry.result ? JSON.stringify(auditEntry.result) : null,\n auditEntry.error ?? null,\n auditEntry.metadata ? JSON.stringify(auditEntry.metadata) : null,\n ],\n });\n }\n\n /**\n * Log task creation\n */\n async logTaskCreated(\n task: AgentTask,\n riskAssessment: RiskAssessment,\n userId?: string,\n userRole?: string\n ): Promise<void> {\n await this.log({\n agentId: task.agentId,\n taskId: task.id,\n taskType: task.type,\n riskLevel: riskAssessment.level,\n action: 'created',\n userId,\n userRole,\n metadata: {\n priority: task.priority,\n requiresApproval: task.requiresApproval,\n riskReason: riskAssessment.reason,\n },\n });\n }\n\n /**\n * Log task approval\n */\n async logTaskApproved(\n task: AgentTask,\n userId: string,\n userRole: string,\n comment?: string\n ): Promise<void> {\n await this.log({\n agentId: task.agentId,\n taskId: task.id,\n taskType: task.type,\n riskLevel: task.riskLevel,\n action: 'approved',\n userId,\n userRole,\n metadata: { comment },\n });\n }\n\n /**\n * Log task rejection\n */\n async logTaskRejected(\n task: AgentTask,\n userId: string,\n userRole: string,\n reason: string\n ): Promise<void> {\n await this.log({\n agentId: task.agentId,\n taskId: task.id,\n taskType: task.type,\n riskLevel: task.riskLevel,\n action: 'rejected',\n userId,\n userRole,\n metadata: { reason },\n });\n }\n\n /**\n * Log task execution start\n */\n async logTaskExecuted(task: AgentTask, beforeState?: unknown): Promise<void> {\n await this.log({\n agentId: task.agentId,\n taskId: task.id,\n taskType: task.type,\n riskLevel: task.riskLevel,\n action: 'executed',\n beforeState,\n });\n }\n\n /**\n * Log task completion\n */\n async logTaskCompleted(\n task: AgentTask,\n result: unknown,\n afterState?: unknown,\n changes?: unknown\n ): Promise<void> {\n await this.log({\n agentId: task.agentId,\n taskId: task.id,\n taskType: task.type,\n riskLevel: task.riskLevel,\n action: 'completed',\n result,\n afterState,\n changes,\n metadata: {\n executionTime:\n task.completedAt && task.startedAt ? task.completedAt - task.startedAt : undefined,\n },\n });\n }\n\n /**\n * Log task failure\n */\n async logTaskFailed(task: AgentTask, error: string): Promise<void> {\n await this.log({\n agentId: task.agentId,\n taskId: task.id,\n taskType: task.type,\n riskLevel: task.riskLevel,\n action: 'failed',\n error,\n });\n }\n\n /**\n * Log rollback\n */\n async logRollback(\n task: AgentTask,\n userId: string,\n userRole: string,\n beforeState: unknown,\n afterState: unknown\n ): Promise<void> {\n await this.log({\n agentId: task.agentId,\n taskId: task.id,\n taskType: task.type,\n riskLevel: task.riskLevel,\n action: 'rolled_back',\n userId,\n userRole,\n beforeState,\n afterState,\n });\n }\n\n /**\n * Query audit log\n */\n async query(query: AuditQuery): Promise<AuditEntry[]> {\n const conditions: string[] = [];\n const args: unknown[] = [];\n\n if (query.agentId) {\n conditions.push('agent_id = ?');\n args.push(query.agentId);\n }\n\n if (query.taskId) {\n conditions.push('task_id = ?');\n args.push(query.taskId);\n }\n\n if (query.userId) {\n conditions.push('user_id = ?');\n args.push(query.userId);\n }\n\n if (query.action) {\n conditions.push('action = ?');\n args.push(query.action);\n }\n\n if (query.riskLevel) {\n conditions.push('risk_level = ?');\n args.push(query.riskLevel);\n }\n\n if (query.startTime) {\n conditions.push('timestamp >= ?');\n args.push(query.startTime);\n }\n\n if (query.endTime) {\n conditions.push('timestamp <= ?');\n args.push(query.endTime);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const limit = query.limit ?? 100;\n\n const result = await this.client.execute({\n sql: `\n SELECT * FROM mcp_audit_log\n ${whereClause}\n ORDER BY timestamp DESC\n LIMIT ?\n `,\n args: [...args, limit],\n });\n\n return result.rows.map(row => this.rowToEntry(row));\n }\n\n /**\n * Get audit trail for a task\n */\n async getTaskAuditTrail(taskId: string): Promise<AuditEntry[]> {\n return this.query({ taskId, limit: 1000 });\n }\n\n /**\n * Get recent activity\n */\n async getRecentActivity(limit: number = 50): Promise<AuditEntry[]> {\n return this.query({ limit });\n }\n\n /**\n * Get statistics\n */\n async getStatistics(\n startTime?: number,\n endTime?: number\n ): Promise<{\n totalOperations: number;\n byAction: Record<string, number>;\n byRiskLevel: Record<string, number>;\n byAgent: Record<string, number>;\n }> {\n const conditions: string[] = [];\n const args: unknown[] = [];\n\n if (startTime) {\n conditions.push('timestamp >= ?');\n args.push(startTime);\n }\n\n if (endTime) {\n conditions.push('timestamp <= ?');\n args.push(endTime);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Total operations\n const totalResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM mcp_audit_log ${whereClause}`,\n args,\n });\n const totalOperations = (totalResult.rows[0]?.count as number) ?? 0;\n\n // By action\n const actionResult = await this.client.execute({\n sql: `SELECT action, COUNT(*) as count FROM mcp_audit_log ${whereClause} GROUP BY action`,\n args,\n });\n const byAction: Record<string, number> = {};\n for (const row of actionResult.rows) {\n byAction[row.action as string] = row.count as number;\n }\n\n // By risk level\n const riskResult = await this.client.execute({\n sql: `SELECT risk_level, COUNT(*) as count FROM mcp_audit_log ${whereClause} GROUP BY risk_level`,\n args,\n });\n const byRiskLevel: Record<string, number> = {};\n for (const row of riskResult.rows) {\n byRiskLevel[row.risk_level as string] = row.count as number;\n }\n\n // By agent\n const agentResult = await this.client.execute({\n sql: `SELECT agent_id, COUNT(*) as count FROM mcp_audit_log ${whereClause} GROUP BY agent_id`,\n args,\n });\n const byAgent: Record<string, number> = {};\n for (const row of agentResult.rows) {\n byAgent[row.agent_id as string] = row.count as number;\n }\n\n return {\n totalOperations,\n byAction,\n byRiskLevel,\n byAgent,\n };\n }\n\n /**\n * Cleanup old audit entries\n */\n async cleanup(olderThanMs: number = 90 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - olderThanMs;\n\n const result = await this.client.execute({\n sql: 'DELETE FROM mcp_audit_log WHERE timestamp < ?',\n args: [cutoff],\n });\n\n return result.rowsAffected;\n }\n\n /**\n * Convert database row to audit entry\n */\n // Using Record<string, unknown> because database row structure varies by database schema and cannot be strictly typed\n private rowToEntry(\n row: /* Using Record<string, unknown> because database row structure varies by database schema and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): AuditEntry {\n return {\n id: row.id as string,\n timestamp: row.timestamp as number,\n agentId: row.agent_id as string,\n taskId: row.task_id as string,\n taskType: row.task_type as string,\n riskLevel: row.risk_level as string,\n action: row.action as AuditEntry['action'],\n userId: row.user_id as string | undefined,\n userRole: row.user_role as string | undefined,\n beforeState: row.before_state ? JSON.parse(row.before_state as string) : undefined,\n afterState: row.after_state ? JSON.parse(row.after_state as string) : undefined,\n changes: row.changes ? JSON.parse(row.changes as string) : undefined,\n result: row.result ? JSON.parse(row.result as string) : undefined,\n error: row.error as string | undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n };\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n this.client.close();\n this.isInitialized = false;\n // AuditLogger shut down successfully\n }\n}\n","/**\n * RiskClassifier - Classify operation safety levels\n */\n\nimport type { RiskLevel } from '../types/messages';\nimport type { AgentTask } from '../types/tasks';\n\nexport interface RiskAssessment {\n level: RiskLevel;\n reason: string;\n requiresApproval: boolean;\n approvalLevel: 'none' | 'admin' | 'super-admin';\n warnings: string[];\n mitigations: string[];\n}\n\nexport interface RiskRule {\n pattern: RegExp | ((task: AgentTask) => boolean);\n level: RiskLevel;\n reason: string;\n warnings?: string[];\n mitigations?: string[];\n}\n\nexport class RiskClassifier {\n private rules: RiskRule[] = [];\n\n constructor() {\n this.initializeDefaultRules();\n }\n\n /**\n * Classify risk level of a task\n */\n classify(task: AgentTask): RiskAssessment {\n // Check explicit risk level first\n if (task.riskLevel) {\n return this.createAssessment(task.riskLevel, 'Explicitly set by caller', []);\n }\n\n // Apply rules\n for (const rule of this.rules) {\n if (this.matchesRule(task, rule)) {\n return this.createAssessment(\n rule.level,\n rule.reason,\n rule.warnings || [],\n rule.mitigations\n );\n }\n }\n\n // Default to safe\n return this.createAssessment('safe', 'No risky patterns detected', []);\n }\n\n /**\n * Add custom risk rule\n */\n addRule(rule: RiskRule): void {\n this.rules.unshift(rule); // Add to beginning for priority\n }\n\n /**\n * Check if task matches a rule\n */\n private matchesRule(task: AgentTask, rule: RiskRule): boolean {\n if (typeof rule.pattern === 'function') {\n return rule.pattern(task);\n }\n return rule.pattern.test(JSON.stringify(task));\n }\n\n /**\n * Create risk assessment\n */\n private createAssessment(\n level: RiskLevel,\n reason: string,\n warnings: string[],\n mitigations: string[] = []\n ): RiskAssessment {\n return {\n level,\n reason,\n requiresApproval: level === 'high' || level === 'critical',\n approvalLevel: this.getApprovalLevel(level),\n warnings,\n mitigations,\n };\n }\n\n /**\n * Get approval level for risk\n */\n private getApprovalLevel(level: RiskLevel): 'none' | 'admin' | 'super-admin' {\n switch (level) {\n case 'safe':\n case 'moderate':\n return 'none';\n case 'high':\n return 'admin';\n case 'critical':\n return 'super-admin';\n default:\n return 'super-admin';\n }\n }\n\n /**\n * Initialize default risk rules\n */\n private initializeDefaultRules(): void {\n // CRITICAL: Database operations\n this.rules.push({\n pattern: /database|db\\.execute|DROP TABLE|DELETE FROM|TRUNCATE/i,\n level: 'critical',\n reason: 'Database modification detected',\n warnings: ['This operation may affect production data'],\n mitigations: ['Backup database before execution', 'Test in development environment first'],\n });\n\n // CRITICAL: Deployments\n this.rules.push({\n pattern: /deploy|push --force|reset --hard|production/i,\n level: 'critical',\n reason: 'Deployment or destructive git operation',\n warnings: ['This may affect production systems'],\n mitigations: ['Review changes carefully', 'Have rollback plan ready'],\n });\n\n // CRITICAL: Security changes\n this.rules.push({\n pattern: /auth|security|password|token|secret|api[_-]?key/i,\n level: 'critical',\n reason: 'Security-related operation detected',\n warnings: ['This may affect authentication or security'],\n mitigations: ['Audit security implications', 'Test authentication flow'],\n });\n\n // HIGH: Code modifications\n this.rules.push({\n pattern: task => {\n return (\n task.type.includes('refactor') ||\n task.type.includes('modify') ||\n task.type.includes('update')\n );\n },\n level: 'high',\n reason: 'Code modification operation',\n warnings: ['This will change existing code'],\n mitigations: ['Review changes', 'Run tests', 'Create backup'],\n });\n\n // HIGH: Bulk operations\n this.rules.push({\n pattern: /bulk|batch|mass|all users|delete all/i,\n level: 'high',\n reason: 'Bulk operation detected',\n warnings: ['This affects multiple records'],\n mitigations: ['Verify scope', 'Test with small subset first'],\n });\n\n // MODERATE: Code generation\n this.rules.push({\n pattern: task => {\n return task.type.includes('generate') || task.type.includes('create');\n },\n level: 'moderate',\n reason: 'Code generation operation',\n warnings: ['Review generated code before committing'],\n mitigations: ['Validate generated code', 'Run linter and tests'],\n });\n\n // MODERATE: File system operations\n this.rules.push({\n pattern: /file|write|delete|remove|unlink/i,\n level: 'moderate',\n reason: 'File system operation',\n warnings: ['This may create or modify files'],\n mitigations: ['Review file paths', 'Ensure proper permissions'],\n });\n\n // SAFE: Documentation\n this.rules.push({\n pattern: task => {\n return (\n task.type.includes('doc') || task.type.includes('comment') || task.type.includes('readme')\n );\n },\n level: 'safe',\n reason: 'Documentation operation',\n });\n\n // SAFE: Read-only operations\n this.rules.push({\n pattern: /read|get|fetch|list|view|show/i,\n level: 'safe',\n reason: 'Read-only operation',\n });\n\n // SAFE: Analysis\n this.rules.push({\n pattern: /analyze|check|inspect|review|suggest/i,\n level: 'safe',\n reason: 'Analysis operation',\n });\n }\n\n /**\n * Get all rules\n */\n getRules(): RiskRule[] {\n return [...this.rules];\n }\n\n /**\n * Clear custom rules\n */\n clearCustomRules(): void {\n this.rules = [];\n this.initializeDefaultRules();\n }\n}\n","/**\n * RollbackManager - Undo operations and restore previous state\n */\n\nimport { type Client, createClient } from '@libsql/client';\nimport type { AgentTask } from '../types/tasks';\n\nexport interface RollbackSnapshot {\n id: string;\n taskId: string;\n agentId: string;\n timestamp: number;\n state: unknown;\n type: 'file' | 'database' | 'config' | 'other';\n // Using Record<string, unknown> because rollback snapshot metadata structure varies by operation type and cannot be strictly typed\n metadata?: /* Using Record<string, unknown> because rollback snapshot metadata structure varies by operation type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n}\n\nexport interface RollbackResult {\n success: boolean;\n snapshotId: string;\n restoredState?: unknown;\n error?: string;\n}\n\nexport class RollbackManager {\n private client: Client;\n private isInitialized = false;\n\n constructor(tursoUrl: string, authToken?: string) {\n this.client = createClient({\n url: tursoUrl,\n authToken,\n });\n }\n\n /**\n * Initialize rollback manager\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Create snapshots table\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS mcp_rollback_snapshots (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n state TEXT NOT NULL,\n type TEXT NOT NULL,\n metadata TEXT\n )\n `);\n\n // Create index\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_snapshots_task ON mcp_rollback_snapshots(task_id, timestamp DESC)\n `);\n\n this.isInitialized = true;\n // RollbackManager initialized successfully\n }\n\n /**\n * Create snapshot before operation\n */\n async createSnapshot(\n task: AgentTask,\n state: unknown,\n type: RollbackSnapshot['type'],\n // Using Record<string, unknown> because rollback snapshot metadata structure varies by operation type and cannot be strictly typed\n metadata?: /* Using Record<string, unknown> because rollback snapshot metadata structure varies by operation type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<RollbackSnapshot> {\n const snapshot: RollbackSnapshot = {\n id: `snapshot-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n taskId: task.id,\n agentId: task.agentId,\n timestamp: Date.now(),\n state,\n type,\n metadata,\n };\n\n await this.client.execute({\n sql: `\n INSERT INTO mcp_rollback_snapshots (\n id, task_id, agent_id, timestamp, state, type, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `,\n args: [\n snapshot.id,\n snapshot.taskId,\n snapshot.agentId,\n snapshot.timestamp,\n JSON.stringify(snapshot.state),\n snapshot.type,\n snapshot.metadata ? JSON.stringify(snapshot.metadata) : null,\n ],\n });\n\n // Snapshot created successfully\n return snapshot;\n }\n\n /**\n * Rollback to snapshot\n */\n async rollback(snapshotId: string): Promise<RollbackResult> {\n try {\n const snapshot = await this.getSnapshot(snapshotId);\n if (!snapshot) {\n return {\n success: false,\n snapshotId,\n error: 'Snapshot not found',\n };\n }\n\n // The actual rollback logic would be implemented by the agent\n // This just returns the snapshot data for restoration\n return {\n success: true,\n snapshotId,\n restoredState: snapshot.state,\n };\n } catch (error) {\n return {\n success: false,\n snapshotId,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Rollback task (restore to state before task execution)\n */\n async rollbackTask(taskId: string): Promise<RollbackResult> {\n // Get latest snapshot for task\n const result = await this.client.execute({\n sql: `\n SELECT * FROM mcp_rollback_snapshots\n WHERE task_id = ?\n ORDER BY timestamp DESC\n LIMIT 1\n `,\n args: [taskId],\n });\n\n if (result.rows.length === 0) {\n return {\n success: false,\n snapshotId: '',\n error: 'No snapshot found for task',\n };\n }\n\n const snapshot = this.rowToSnapshot(result.rows[0]);\n return this.rollback(snapshot.id);\n }\n\n /**\n * Get snapshot\n */\n async getSnapshot(snapshotId: string): Promise<RollbackSnapshot | null> {\n const result = await this.client.execute({\n sql: 'SELECT * FROM mcp_rollback_snapshots WHERE id = ?',\n args: [snapshotId],\n });\n\n if (result.rows.length === 0) return null;\n\n return this.rowToSnapshot(result.rows[0]);\n }\n\n /**\n * Get snapshots for task\n */\n async getSnapshotsForTask(taskId: string): Promise<RollbackSnapshot[]> {\n const result = await this.client.execute({\n sql: 'SELECT * FROM mcp_rollback_snapshots WHERE task_id = ? ORDER BY timestamp DESC',\n args: [taskId],\n });\n\n return result.rows.map(row => this.rowToSnapshot(row));\n }\n\n /**\n * Delete snapshot\n */\n async deleteSnapshot(snapshotId: string): Promise<void> {\n await this.client.execute({\n sql: 'DELETE FROM mcp_rollback_snapshots WHERE id = ?',\n args: [snapshotId],\n });\n }\n\n /**\n * Cleanup old snapshots\n */\n async cleanup(olderThanMs: number = 7 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - olderThanMs;\n\n const result = await this.client.execute({\n sql: 'DELETE FROM mcp_rollback_snapshots WHERE timestamp < ?',\n args: [cutoff],\n });\n\n return result.rowsAffected;\n }\n\n /**\n * Convert database row to snapshot\n */\n // Using Record<string, unknown> because database row structure varies by database schema and cannot be strictly typed\n private rowToSnapshot(\n row: /* Using Record<string, unknown> because database row structure varies by database schema and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): RollbackSnapshot {\n return {\n id: row.id as string,\n taskId: row.task_id as string,\n agentId: row.agent_id as string,\n timestamp: row.timestamp as number,\n state: JSON.parse(row.state as string),\n type: row.type as RollbackSnapshot['type'],\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n };\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n this.notifications.clear();\n this.client.close();\n this.isInitialized = false;\n // RollbackManager shut down successfully\n }\n}\n","/**\n * PrivacyTokenizationService - PII detection and tokenization for privacy-preserving operations\n * Implements Anthropic's privacy tokenization pattern with enhanced capabilities\n */\n\nimport crypto from 'node:crypto';\n\nexport interface PIIToken {\n token: string;\n type: PIIType;\n original: string;\n createdAt: number;\n expiresAt?: number;\n}\n\nexport type PIIType =\n | 'email'\n | 'phone'\n | 'ssn'\n | 'api-key'\n | 'password'\n | 'credit-card'\n | 'ip-address'\n | 'custom';\n\nexport interface TokenizationConfig {\n enabled: boolean;\n patterns: PIIDetectionPattern[];\n tokenExpiry?: number; // milliseconds\n storageType: 'memory' | 'turso' | 'encrypted';\n encryptionKey?: string;\n}\n\nexport interface PIIDetectionPattern {\n type: PIIType;\n regex: RegExp;\n priority: number; // Higher priority patterns are checked first\n customName?: string;\n}\n\nexport interface TokenizationResult {\n tokenized: unknown;\n tokens: PIIToken[];\n detected: number;\n}\n\nexport interface TokenizationOptions {\n preserveStructure?: boolean;\n tokenExpiry?: number;\n types?: PIIType[]; // Only tokenize specific types\n}\n\nexport class PrivacyTokenizationService {\n private config: TokenizationConfig;\n private tokenStore: Map<string, PIIToken> = new Map();\n private reverseLookup: Map<string, string> = new Map(); // token -> original\n private isInitialized = false;\n\n constructor(config?: Partial<TokenizationConfig>) {\n this.config = {\n enabled: true,\n patterns: this.getDefaultPatterns(),\n storageType: 'memory',\n ...config,\n };\n }\n\n /**\n * Initialize tokenization service\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n // Validate encryption key if using encrypted storage\n if (this.config.storageType === 'encrypted' && !this.config.encryptionKey) {\n throw new Error('Encryption key required for encrypted storage');\n }\n\n this.isInitialized = true;\n }\n\n /**\n * Get default PII detection patterns\n */\n private getDefaultPatterns(): PIIDetectionPattern[] {\n return [\n {\n type: 'email',\n regex: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n priority: 10,\n },\n {\n type: 'phone',\n regex: /(\\+?1[-.\\s]?)?\\(?[0-9]{3}\\)?[-.\\s]?[0-9]{3}[-.\\s]?[0-9]{4}/g,\n priority: 9,\n },\n {\n type: 'ssn',\n regex: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n priority: 10,\n },\n {\n type: 'api-key',\n regex:\n /(api[_-]?key|apikey|secret[_-]?key|access[_-]?token)\\s*[:=]\\s*[\"']?([a-zA-Z0-9_-]{20,})[\"']?/gi,\n priority: 10,\n },\n {\n type: 'password',\n regex: /(password|passwd|pwd)\\s*[:=]\\s*[\"']?([^\\s\"']{8,})[\"']?/gi,\n priority: 10,\n },\n {\n type: 'credit-card',\n regex: /\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b/g,\n priority: 10,\n },\n {\n type: 'ip-address',\n regex: /\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g,\n priority: 5,\n },\n ];\n }\n\n /**\n * Detect PII in a string\n */\n detectPII(\n text: string,\n types?: PIIType[]\n ): Array<{ type: PIIType; value: string; index: number }> {\n if (!this.config.enabled) return [];\n\n const detected: Array<{ type: PIIType; value: string; index: number }> = [];\n const patterns = this.config.patterns\n .filter(p => !types || types.includes(p.type))\n .sort((a, b) => b.priority - a.priority);\n\n for (const pattern of patterns) {\n const matches = text.matchAll(pattern.regex);\n for (const match of matches) {\n if (match.index !== undefined && match[0]) {\n detected.push({\n type: pattern.type,\n value: match[0],\n index: match.index,\n });\n }\n }\n }\n\n // Remove duplicates (same value, same position)\n const unique = new Map<string, { type: PIIType; value: string; index: number }>();\n for (const item of detected) {\n const key = `${item.index}:${item.value}`;\n if (!unique.has(key)) {\n unique.set(key, item);\n }\n }\n\n return Array.from(unique.values());\n }\n\n /**\n * Generate token for PII value\n */\n private generateToken(type: PIIType, original: string): string {\n // Generate deterministic token based on type and hash of original\n const hash = crypto.createHash('sha256').update(original).digest('hex').substring(0, 16);\n const typePrefix = type.toUpperCase().replace('-', '_').substring(0, 8);\n return `[${typePrefix}_${hash}]`;\n }\n\n /**\n * Tokenize PII value\n */\n private tokenizeValue(value: string, type: PIIType, expiry?: number): PIIToken {\n const token = this.generateToken(type, value);\n const now = Date.now();\n const expiresAt = expiry ? now + expiry : undefined;\n\n const piiToken: PIIToken = {\n token,\n type,\n original: value,\n createdAt: now,\n expiresAt,\n };\n\n // Store token mapping\n this.tokenStore.set(token, piiToken);\n this.reverseLookup.set(token, value);\n\n return piiToken;\n }\n\n /**\n * Tokenize a string value (helper method to reduce complexity)\n */\n private tokenizeString(\n value: string,\n types: PIIType[] | undefined,\n tokenExpiry: number | undefined,\n tokens: PIIToken[],\n detectedRef: { count: number }\n ): string {\n const piiDetected = this.detectPII(value, types);\n if (piiDetected.length === 0) {\n return value;\n }\n\n let tokenizedStr = value;\n let offset = 0;\n\n // Sort by index descending to replace from end to start\n const sorted = [...piiDetected].sort((a, b) => b.index - a.index);\n\n for (const pii of sorted) {\n const token = this.tokenizeValue(pii.value, pii.type, tokenExpiry);\n tokens.push(token);\n detectedRef.count++;\n\n // Replace value with token\n const before = tokenizedStr.substring(0, pii.index + offset);\n const after = tokenizedStr.substring(pii.index + offset + pii.value.length);\n tokenizedStr = before + token.token + after;\n\n // Adjust offset for next replacement\n offset += token.token.length - pii.value.length;\n }\n\n return tokenizedStr;\n }\n\n /**\n * Tokenize an object value (helper method to reduce complexity)\n */\n // Using Record<string, unknown> because object structure varies by input data and cannot be strictly typed\n private tokenizeObject(\n value: /* Using Record<string, unknown> because object structure varies by input data and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n types: PIIType[] | undefined,\n tokenExpiry: number | undefined,\n preserveStructure: boolean,\n tokens: PIIToken[],\n detectedRef: { count: number },\n tokenizeValue: (val: unknown) => unknown\n ): /* Using Record<string, unknown> because tokenized object structure varies by input data and cannot be strictly typed */ Record<\n string,\n unknown\n > {\n // Using Record<string, unknown> because tokenized object structure varies by input data and cannot be strictly typed\n const tokenized: /* Using Record<string, unknown> because tokenized object structure varies by input data and cannot be strictly typed */ Record<\n string,\n unknown\n > = {};\n for (const [key, val] of Object.entries(value)) {\n // Check if key itself contains PII\n const keyPII = this.detectPII(key, types);\n if (keyPII.length > 0) {\n // Tokenize key name\n const tokenizedKey = keyPII.reduce((acc, pii) => {\n const token = this.tokenizeValue(pii.value, pii.type, tokenExpiry);\n tokens.push(token);\n detectedRef.count++;\n return acc.replace(pii.value, token.token);\n }, key);\n tokenized[tokenizedKey] = preserveStructure ? tokenizeValue(val) : val;\n } else {\n tokenized[key] = preserveStructure ? tokenizeValue(val) : val;\n }\n }\n return tokenized;\n }\n\n /**\n * Tokenize data structure\n */\n tokenize(data: unknown, options: TokenizationOptions = {}): TokenizationResult {\n if (!this.config.enabled) {\n return {\n tokenized: data,\n tokens: [],\n detected: 0,\n };\n }\n\n const { preserveStructure = true, tokenExpiry = this.config.tokenExpiry, types } = options;\n\n const tokens: PIIToken[] = [];\n const detectedRef = { count: 0 };\n\n const tokenizeValue = (value: unknown): unknown => {\n if (typeof value === 'string') {\n return this.tokenizeString(value, types, tokenExpiry, tokens, detectedRef);\n }\n\n if (Array.isArray(value)) {\n // Preserve array structure\n if (preserveStructure) {\n return value.map(item => tokenizeValue(item));\n }\n // If not preserving structure, return as-is (though this is unusual)\n return value;\n }\n\n if (value && typeof value === 'object') {\n // Using Record<string, unknown> because object structure varies by input data and cannot be strictly typed\n return this.tokenizeObject(\n value as /* Using Record<string, unknown> because object structure varies by input data and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n types,\n tokenExpiry,\n preserveStructure,\n tokens,\n detectedRef,\n tokenizeValue\n );\n }\n\n return value;\n };\n\n const tokenized = tokenizeValue(data);\n\n return {\n tokenized,\n tokens,\n detected: detectedRef.count,\n };\n }\n\n /**\n * Untokenize data structure\n */\n untokenize(data: unknown): unknown {\n if (!this.config.enabled) {\n return data;\n }\n\n const untokenizeValue = (value: unknown): unknown => {\n if (typeof value === 'string') {\n let untokenized = value;\n for (const [token, original] of this.reverseLookup.entries()) {\n untokenized = untokenized.replace(new RegExp(this.escapeRegex(token), 'g'), original);\n }\n return untokenized;\n }\n\n if (Array.isArray(value)) {\n return value.map(item => untokenizeValue(item));\n }\n\n if (value && typeof value === 'object') {\n // Using Record<string, unknown> because untokenized object structure varies by input data and cannot be strictly typed\n const untokenized: /* Using Record<string, unknown> because untokenized object structure varies by input data and cannot be strictly typed */ Record<\n string,\n unknown\n > = {};\n for (const [key, val] of Object.entries(value)) {\n // Untokenize key name\n let untokenizedKey = key;\n for (const [token, original] of this.reverseLookup.entries()) {\n untokenizedKey = untokenizedKey.replace(\n new RegExp(this.escapeRegex(token), 'g'),\n original\n );\n }\n untokenized[untokenizedKey] = untokenizeValue(val);\n }\n return untokenized;\n }\n\n return value;\n };\n\n return untokenizeValue(data);\n }\n\n /**\n * Escape regex special characters\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Get token by value\n */\n getToken(value: string): PIIToken | null {\n for (const token of this.tokenStore.values()) {\n if (token.original === value) {\n return token;\n }\n }\n return null;\n }\n\n /**\n * Get original value by token\n */\n getOriginal(token: string): string | null {\n return this.reverseLookup.get(token) || null;\n }\n\n /**\n * Clean up expired tokens\n */\n cleanupExpiredTokens(): number {\n const now = Date.now();\n let cleaned = 0;\n\n for (const [token, piiToken] of this.tokenStore.entries()) {\n if (piiToken.expiresAt && piiToken.expiresAt < now) {\n this.tokenStore.delete(token);\n this.reverseLookup.delete(token);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n\n /**\n * Clear all tokens\n */\n clearAllTokens(): void {\n this.tokenStore.clear();\n this.reverseLookup.clear();\n }\n\n /**\n * Get statistics\n */\n getStatistics(): {\n totalTokens: number;\n byType: Record<PIIType, number>;\n expiredTokens: number;\n } {\n const now = Date.now();\n const byType: Record<string, number> = {};\n let expiredTokens = 0;\n\n for (const token of this.tokenStore.values()) {\n byType[token.type] = (byType[token.type] || 0) + 1;\n if (token.expiresAt && token.expiresAt < now) {\n expiredTokens++;\n }\n }\n\n return {\n totalTokens: this.tokenStore.size,\n byType: byType as Record<PIIType, number>,\n expiredTokens,\n };\n }\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n this.clearAllTokens();\n this.isInitialized = false;\n }\n}\n","/**\n * Multi-Agent Workflow - Collaborative task solving\n *\n * Orchestrates multi-agent workflows for complex tasks.\n *\n * @module workflows/MultiAgentWorkflow\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { SupervisorAgent } from '../agents/coordination/SupervisorAgent';\nimport type { TaskCoordinatorAgent } from '../agents/coordination/TaskCoordinatorAgent';\nimport type { AgentTask, TaskResult } from '../types/tasks';\n\nconst logger = createServiceLogger('MultiAgentWorkflow');\n\n/**\n * Workflow step\n */\nexport interface WorkflowStep {\n /** Step ID */\n id: string;\n /** Step name */\n name: string;\n /** Agent ID */\n agentId: string;\n /** Task */\n task: AgentTask;\n /** Dependencies */\n dependencies: string[];\n /** Status */\n status: 'pending' | 'in_progress' | 'completed' | 'failed' | 'skipped';\n /** Result */\n result?: TaskResult;\n /** Retry count */\n retryCount: number;\n /** Max retries */\n maxRetries: number;\n}\n\n/**\n * Workflow definition\n */\nexport interface WorkflowDefinition {\n /** Workflow ID */\n id: string;\n /** Workflow name */\n name: string;\n /** Description */\n description: string;\n /** Steps */\n steps: WorkflowStep[];\n /** Execution mode */\n mode: 'sequential' | 'parallel' | 'conditional';\n /** Status */\n status: 'pending' | 'running' | 'completed' | 'failed' | 'paused';\n /** Created timestamp */\n createdAt: Date;\n /** Started timestamp */\n startedAt?: Date;\n /** Completed timestamp */\n completedAt?: Date;\n}\n\n/**\n * Multi-Agent Workflow Engine\n *\n * Orchestrates complex multi-agent workflows\n */\nexport class MultiAgentWorkflow {\n private workflows: Map<string, WorkflowDefinition> = new Map();\n private taskCoordinator?: TaskCoordinatorAgent;\n private supervisor?: SupervisorAgent;\n\n /**\n * Set task coordinator\n */\n setTaskCoordinator(coordinator: TaskCoordinatorAgent): void {\n this.taskCoordinator = coordinator;\n }\n\n /**\n * Set supervisor\n */\n setSupervisor(supervisor: SupervisorAgent): void {\n this.supervisor = supervisor;\n }\n\n /**\n * Create workflow from task decomposition\n */\n async createWorkflow(\n name: string,\n description: string,\n initialTask: AgentTask,\n mode: 'sequential' | 'parallel' | 'conditional' = 'sequential'\n ): Promise<WorkflowDefinition> {\n try {\n if (!this.taskCoordinator) {\n throw new Error('Task coordinator not initialized');\n }\n\n // Decompose task into subtasks\n const decomposeResult = await this.taskCoordinator.executeTask({\n ...initialTask,\n payload: {\n action: 'decompose',\n task: initialTask,\n },\n });\n\n if (!decomposeResult.success) {\n throw new Error('Failed to decompose task');\n }\n\n const decomposition = decomposeResult.data as {\n planId: string;\n subtasks: Array<{\n id: string;\n agentId: string;\n taskType: string;\n dependencies: string[];\n }>;\n executionOrder: string[];\n };\n\n // Create workflow steps\n const steps: WorkflowStep[] = decomposition.subtasks.map(subtask => ({\n id: subtask.id,\n name: `Step: ${subtask.taskType}`,\n agentId: subtask.agentId,\n task: {\n id: subtask.id,\n agentId: subtask.agentId,\n type: subtask.taskType,\n payload: {},\n },\n dependencies: subtask.dependencies,\n status: 'pending',\n retryCount: 0,\n maxRetries: 3,\n }));\n\n const workflow: WorkflowDefinition = {\n id: `workflow-${Date.now()}-${Math.random().toString(36).substring(7)}`,\n name,\n description,\n steps,\n mode,\n status: 'pending',\n createdAt: new Date(),\n };\n\n this.workflows.set(workflow.id, workflow);\n\n logger.info('Workflow created', {\n workflowId: workflow.id,\n name,\n stepCount: steps.length,\n });\n\n return workflow;\n } catch (error) {\n logger.error('Failed to create workflow', {\n error: error instanceof Error ? error.message : 'Unknown error',\n name,\n });\n throw error;\n }\n }\n\n /**\n * Execute workflow\n */\n async executeWorkflow(workflowId: string): Promise<TaskResult> {\n try {\n const workflow = this.workflows.get(workflowId);\n if (!workflow) {\n throw new Error(`Workflow not found: ${workflowId}`);\n }\n\n workflow.status = 'running';\n workflow.startedAt = new Date();\n\n // Supervise workflow if supervisor available\n if (this.supervisor) {\n const supervision = await this.supervisor.executeTask({\n id: `supervision-${workflowId}`,\n agentId: 'supervisor-001',\n type: 'supervise',\n payload: {\n action: 'supervise',\n taskToSupervise: {\n id: workflowId,\n agentId: 'workflow',\n type: 'workflow',\n payload: { workflow },\n },\n },\n });\n\n if (!supervision.success) {\n workflow.status = 'failed';\n return {\n success: false,\n error: 'Workflow failed supervision check',\n data: supervision.data,\n };\n }\n }\n\n // Execute steps based on mode\n let result: TaskResult;\n\n switch (workflow.mode) {\n case 'sequential':\n result = await this.executeSequential(workflow);\n break;\n case 'parallel':\n result = await this.executeParallel(workflow);\n break;\n case 'conditional':\n result = await this.executeConditional(workflow);\n break;\n default:\n throw new Error(`Unknown workflow mode: ${workflow.mode}`);\n }\n\n workflow.status = result.success ? 'completed' : 'failed';\n workflow.completedAt = new Date();\n\n logger.info('Workflow execution completed', {\n workflowId,\n status: workflow.status,\n stepCount: workflow.steps.length,\n });\n\n return result;\n } catch (error) {\n logger.error('Failed to execute workflow', {\n error: error instanceof Error ? error.message : 'Unknown error',\n workflowId,\n });\n throw error;\n }\n }\n\n /**\n * Execute steps sequentially\n */\n private async executeSequential(workflow: WorkflowDefinition): Promise<TaskResult> {\n const results: TaskResult[] = [];\n\n for (const step of workflow.steps) {\n // Check dependencies\n const dependenciesMet = step.dependencies.every(depId => {\n const depStep = workflow.steps.find(s => s.id === depId);\n return depStep?.status === 'completed';\n });\n\n if (!dependenciesMet) {\n step.status = 'skipped';\n continue;\n }\n\n // Execute step\n step.status = 'in_progress';\n\n try {\n const result = await this.executeStep(step);\n step.status = result.success ? 'completed' : 'failed';\n step.result = result;\n results.push(result);\n\n if (!result.success) {\n // Retry logic\n if (step.retryCount < step.maxRetries) {\n step.retryCount++;\n step.status = 'pending';\n // Retry the step\n const retryResult = await this.executeStep(step);\n step.status = retryResult.success ? 'completed' : 'failed';\n step.result = retryResult;\n results.push(retryResult);\n } else {\n return {\n success: false,\n error: `Step ${step.id} failed after ${step.maxRetries} retries`,\n data: {\n failedStep: step.id,\n completedSteps: workflow.steps.filter(s => s.status === 'completed').map(s => s.id),\n },\n };\n }\n }\n } catch (error) {\n step.status = 'failed';\n return {\n success: false,\n error: `Step ${step.id} failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n data: {\n failedStep: step.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n };\n }\n }\n\n // Aggregate results\n return {\n success: true,\n data: {\n workflowId: workflow.id,\n stepResults: results,\n allStepsCompleted: workflow.steps.every(\n s => s.status === 'completed' || s.status === 'skipped'\n ),\n },\n };\n }\n\n /**\n * Execute steps in parallel\n */\n private async executeParallel(workflow: WorkflowDefinition): Promise<TaskResult> {\n // Execute all steps that have dependencies met in parallel\n const readySteps = workflow.steps.filter(step => {\n const dependenciesMet = step.dependencies.every(depId => {\n const depStep = workflow.steps.find(s => s.id === depId);\n return depStep?.status === 'completed';\n });\n return dependenciesMet && step.status === 'pending';\n });\n\n const promises = readySteps.map(step => this.executeStep(step));\n const results = await Promise.allSettled(promises);\n\n // Update step statuses\n for (let i = 0; i < readySteps.length; i++) {\n const step = readySteps[i];\n const result = results[i];\n\n if (result.status === 'fulfilled') {\n step.status = result.value.success ? 'completed' : 'failed';\n step.result = result.value;\n } else {\n step.status = 'failed';\n step.result = {\n success: false,\n error: result.reason instanceof Error ? result.reason.message : 'Unknown error',\n };\n }\n }\n\n // Check if all steps completed\n const allCompleted = workflow.steps.every(\n s => s.status === 'completed' || s.status === 'skipped'\n );\n\n if (!allCompleted) {\n // Continue with next batch of steps\n return await this.executeParallel(workflow);\n }\n\n return {\n success: true,\n data: {\n workflowId: workflow.id,\n allStepsCompleted: true,\n },\n };\n }\n\n /**\n * Execute steps conditionally\n */\n private async executeConditional(workflow: WorkflowDefinition): Promise<TaskResult> {\n // Simplified conditional execution\n // In production, use AI to determine which steps to execute based on conditions\n return await this.executeSequential(workflow);\n }\n\n /**\n * Execute a workflow step\n */\n private async executeStep(step: WorkflowStep): Promise<TaskResult> {\n // This would call the appropriate agent via MCP server\n // For now, return a placeholder\n return {\n success: true,\n data: {\n stepId: step.id,\n agentId: step.agentId,\n message: 'Step executed (placeholder)',\n },\n };\n }\n\n /**\n * Get workflow by ID\n */\n getWorkflow(workflowId: string): WorkflowDefinition | undefined {\n return this.workflows.get(workflowId);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): WorkflowDefinition[] {\n return Array.from(this.workflows.values());\n }\n\n /**\n * Pause workflow\n */\n pauseWorkflow(workflowId: string): void {\n const workflow = this.workflows.get(workflowId);\n if (workflow && workflow.status === 'running') {\n workflow.status = 'paused';\n logger.info('Workflow paused', { workflowId });\n }\n }\n\n /**\n * Resume workflow\n */\n resumeWorkflow(workflowId: string): Promise<TaskResult> {\n const workflow = this.workflows.get(workflowId);\n if (workflow && workflow.status === 'paused') {\n workflow.status = 'running';\n return this.executeWorkflow(workflowId);\n }\n throw new Error(`Workflow ${workflowId} is not paused`);\n }\n}\n","/**\n * Stripe MCP Adapter\n *\n * Bridges external Stripe MCP server with Reveal MCP system\n * Allows internal agents and tools to use Stripe operations\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { ToolDefinition } from '../tools/types';\n\nconst logger = createServiceLogger('StripeMCPAdapter');\n\n/**\n * MCP tools interface for Stripe\n */\ninterface StripeMCPTools {\n // Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed\n create_customer?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_customers?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n create_product?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_products?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n create_price?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_prices?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_subscriptions?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n cancel_subscription?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n update_subscription?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_payment_intents?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n create_invoice?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_invoices?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n create_coupon?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_coupons?: (\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n // Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed\n [key: string]:\n | ((\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>)\n | undefined;\n}\n\n/**\n * Global MCP interface\n */\ninterface GlobalMCP {\n stripe?: StripeMCPTools;\n}\n\ndeclare global {\n var mcp: GlobalMCP | undefined;\n}\n\nexport interface StripeMCPAdapterConfig {\n apiKey?: string;\n enabled?: boolean;\n}\n\n/**\n * Stripe MCP Adapter\n *\n * Connects to external Stripe MCP server and exposes tools\n * through Reveal MCP unified interface\n */\nexport class StripeMCPAdapter {\n private config: StripeMCPAdapterConfig;\n private tools: Map<string, ToolDefinition> = new Map();\n private isInitialized = false;\n\n constructor(config: StripeMCPAdapterConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n apiKey: config.apiKey || process.env.STRIPE_API_KEY,\n ...config,\n };\n }\n\n /**\n * Initialize the adapter\n */\n async initialize(): Promise<void> {\n if (!this.config.enabled) {\n logger.info('Stripe MCP adapter disabled');\n return;\n }\n\n if (!this.config.apiKey) {\n logger.warn('Stripe MCP adapter disabled: STRIPE_API_KEY not set');\n return;\n }\n\n try {\n // Register Stripe tools\n await this.registerTools();\n this.isInitialized = true;\n logger.info('Stripe MCP adapter initialized', {\n toolsCount: this.tools.size,\n });\n } catch (error) {\n logger.error('Failed to initialize Stripe MCP adapter', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Register Stripe tools\n */\n private async registerTools(): Promise<void> {\n // Customer management\n this.tools.set('stripe_create_customer', {\n name: 'stripe_create_customer',\n server: 'stripe',\n description: 'Create a new Stripe customer',\n parameters: [\n {\n name: 'name',\n type: 'string',\n required: true,\n description: 'Customer name',\n },\n {\n name: 'email',\n type: 'string',\n required: false,\n description: 'Customer email',\n },\n ],\n returns: {\n type: 'object',\n description: 'Created customer object',\n },\n });\n\n this.tools.set('stripe_list_customers', {\n name: 'stripe_list_customers',\n server: 'stripe',\n description: 'List Stripe customers',\n parameters: [\n {\n name: 'limit',\n type: 'number',\n required: false,\n description: 'Maximum number of customers to return',\n default: 10,\n },\n {\n name: 'email',\n type: 'string',\n required: false,\n description: 'Filter by email address',\n },\n ],\n returns: {\n type: 'array',\n description: 'List of customers',\n },\n });\n\n // Product management\n this.tools.set('stripe_create_product', {\n name: 'stripe_create_product',\n server: 'stripe',\n description: 'Create a new Stripe product',\n parameters: [\n {\n name: 'name',\n type: 'string',\n required: true,\n description: 'Product name',\n },\n {\n name: 'description',\n type: 'string',\n required: false,\n description: 'Product description',\n },\n ],\n returns: {\n type: 'object',\n description: 'Created product object',\n },\n });\n\n this.tools.set('stripe_list_products', {\n name: 'stripe_list_products',\n server: 'stripe',\n description: 'List Stripe products',\n parameters: [\n {\n name: 'limit',\n type: 'number',\n required: false,\n description: 'Maximum number of products to return',\n default: 10,\n },\n ],\n returns: {\n type: 'array',\n description: 'List of products',\n },\n });\n\n // Price management\n this.tools.set('stripe_create_price', {\n name: 'stripe_create_price',\n server: 'stripe',\n description: 'Create a price for a product',\n parameters: [\n {\n name: 'product',\n type: 'string',\n required: true,\n description: 'Product ID',\n },\n {\n name: 'unit_amount',\n type: 'number',\n required: true,\n description: 'Price in cents (e.g., 2000 for $20.00)',\n },\n {\n name: 'currency',\n type: 'string',\n required: true,\n description: 'Currency code (e.g., usd)',\n },\n {\n name: 'recurring',\n type: 'object',\n required: false,\n description: 'Recurring billing configuration',\n },\n ],\n returns: {\n type: 'object',\n description: 'Created price object',\n },\n });\n\n this.tools.set('stripe_list_prices', {\n name: 'stripe_list_prices',\n server: 'stripe',\n description: 'List prices for a product',\n parameters: [\n {\n name: 'product',\n type: 'string',\n required: false,\n description: 'Product ID to filter by',\n },\n {\n name: 'limit',\n type: 'number',\n required: false,\n description: 'Maximum number of prices to return',\n default: 10,\n },\n ],\n returns: {\n type: 'array',\n description: 'List of prices',\n },\n });\n\n // Subscription management\n this.tools.set('stripe_list_subscriptions', {\n name: 'stripe_list_subscriptions',\n server: 'stripe',\n description: 'List Stripe subscriptions',\n parameters: [\n {\n name: 'customer',\n type: 'string',\n required: false,\n description: 'Customer ID to filter by',\n },\n {\n name: 'status',\n type: 'string',\n required: false,\n description: 'Subscription status (active, canceled, etc.)',\n },\n {\n name: 'limit',\n type: 'number',\n required: false,\n description: 'Maximum number of subscriptions to return',\n default: 10,\n },\n ],\n returns: {\n type: 'array',\n description: 'List of subscriptions',\n },\n });\n\n this.tools.set('stripe_cancel_subscription', {\n name: 'stripe_cancel_subscription',\n server: 'stripe',\n description: 'Cancel a Stripe subscription',\n parameters: [\n {\n name: 'subscription',\n type: 'string',\n required: true,\n description: 'Subscription ID',\n },\n ],\n returns: {\n type: 'object',\n description: 'Canceled subscription object',\n },\n });\n\n this.tools.set('stripe_update_subscription', {\n name: 'stripe_update_subscription',\n server: 'stripe',\n description: 'Update a Stripe subscription',\n parameters: [\n {\n name: 'subscription',\n type: 'string',\n required: true,\n description: 'Subscription ID',\n },\n {\n name: 'items',\n type: 'array',\n required: false,\n description: 'Subscription items to update',\n },\n {\n name: 'proration_behavior',\n type: 'string',\n required: false,\n description: 'How to handle prorations',\n },\n ],\n returns: {\n type: 'object',\n description: 'Updated subscription object',\n },\n });\n\n // Payment intents\n this.tools.set('stripe_list_payment_intents', {\n name: 'stripe_list_payment_intents',\n server: 'stripe',\n description: 'List payment intents',\n parameters: [\n {\n name: 'customer',\n type: 'string',\n required: false,\n description: 'Customer ID to filter by',\n },\n {\n name: 'limit',\n type: 'number',\n required: false,\n description: 'Maximum number of payment intents to return',\n default: 10,\n },\n ],\n returns: {\n type: 'array',\n description: 'List of payment intents',\n },\n });\n\n // Invoices\n this.tools.set('stripe_create_invoice', {\n name: 'stripe_create_invoice',\n server: 'stripe',\n description: 'Create an invoice for a customer',\n parameters: [\n {\n name: 'customer',\n type: 'string',\n required: true,\n description: 'Customer ID',\n },\n {\n name: 'days_until_due',\n type: 'number',\n required: false,\n description: 'Days until invoice is due',\n },\n ],\n returns: {\n type: 'object',\n description: 'Created invoice object',\n },\n });\n\n this.tools.set('stripe_list_invoices', {\n name: 'stripe_list_invoices',\n server: 'stripe',\n description: 'List invoices',\n parameters: [\n {\n name: 'customer',\n type: 'string',\n required: false,\n description: 'Customer ID to filter by',\n },\n {\n name: 'limit',\n type: 'number',\n required: false,\n description: 'Maximum number of invoices to return',\n default: 10,\n },\n ],\n returns: {\n type: 'array',\n description: 'List of invoices',\n },\n });\n\n // Coupons\n this.tools.set('stripe_create_coupon', {\n name: 'stripe_create_coupon',\n server: 'stripe',\n description: 'Create a discount coupon',\n parameters: [\n {\n name: 'name',\n type: 'string',\n required: true,\n description: 'Coupon name',\n },\n {\n name: 'percent_off',\n type: 'number',\n required: false,\n description: 'Percentage discount (0-100)',\n },\n {\n name: 'amount_off',\n type: 'number',\n required: false,\n description: 'Fixed amount discount in cents',\n },\n {\n name: 'currency',\n type: 'string',\n required: false,\n description: 'Currency for amount_off',\n },\n {\n name: 'duration',\n type: 'string',\n required: false,\n description: 'Duration (once, repeating, forever)',\n default: 'once',\n },\n ],\n returns: {\n type: 'object',\n description: 'Created coupon object',\n },\n });\n\n this.tools.set('stripe_list_coupons', {\n name: 'stripe_list_coupons',\n server: 'stripe',\n description: 'List available coupons',\n parameters: [\n {\n name: 'limit',\n type: 'number',\n required: false,\n description: 'Maximum number of coupons to return',\n default: 10,\n },\n ],\n returns: {\n type: 'array',\n description: 'List of coupons',\n },\n });\n }\n\n /**\n * Execute a Stripe tool\n *\n * Routes to appropriate Stripe MCP tool or falls back to direct API calls\n */\n // Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed\n async executeTool(\n name: string,\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<unknown> {\n if (!this.isInitialized) {\n throw new Error('Stripe MCP adapter not initialized');\n }\n\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Stripe tool not found: ${name}`);\n }\n\n try {\n // Try to use MCP tools if available in the runtime\n // These are available when running in Cursor IDE or MCP-enabled environments\n const mcpTools = globalThis.mcp;\n\n if (mcpTools?.stripe) {\n // Use MCP tools directly\n return await this.executeViaMCP(name, args, mcpTools.stripe);\n }\n\n // Fallback: Use direct Stripe API calls\n return await this.executeViaAPI(name, args);\n } catch (error) {\n logger.error('Failed to execute Stripe tool', {\n name,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Execute via MCP tools (when available)\n */\n // Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed\n private async executeViaMCP(\n name: string,\n args: /* Using Record<string, unknown> because Stripe tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n stripeMCP: StripeMCPTools\n ): Promise<unknown> {\n // Map tool names to MCP tool calls\n const toolMap: Record<string, string> = {\n stripe_create_customer: 'create_customer',\n stripe_list_customers: 'list_customers',\n stripe_create_product: 'create_product',\n stripe_list_products: 'list_products',\n stripe_create_price: 'create_price',\n stripe_list_prices: 'list_prices',\n stripe_list_subscriptions: 'list_subscriptions',\n stripe_cancel_subscription: 'cancel_subscription',\n stripe_update_subscription: 'update_subscription',\n stripe_list_payment_intents: 'list_payment_intents',\n stripe_create_invoice: 'create_invoice',\n stripe_list_invoices: 'list_invoices',\n stripe_create_coupon: 'create_coupon',\n stripe_list_coupons: 'list_coupons',\n };\n\n const mcpToolName = toolMap[name];\n if (!mcpToolName) {\n throw new Error(`No MCP tool mapping for: ${name}`);\n }\n\n // Call MCP tool\n if (typeof stripeMCP[mcpToolName] === 'function') {\n return await stripeMCP[mcpToolName](args);\n }\n\n throw new Error(`MCP tool ${mcpToolName} not available`);\n }\n\n /**\n * Execute via direct Stripe API (fallback)\n */\n // Using Record<string, unknown> because Stripe API arguments structure varies by API endpoint and cannot be strictly typed\n private async executeViaAPI(\n name: string,\n args: /* Using Record<string, unknown> because Stripe API arguments structure varies by API endpoint and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<unknown> {\n if (!this.config.apiKey) {\n throw new Error('STRIPE_API_KEY required for direct API calls');\n }\n\n // Use existing Stripe service if available\n try {\n const { getStripeClient } = await import('@/infrastructure/services/billing/StripeService');\n const stripe = getStripeClient();\n\n // Map tool names to Stripe API calls\n // Using Record<string, unknown> because Stripe API map structure varies by API endpoint and cannot be strictly typed\n const apiMap: Record<\n string,\n (\n args: /* Using Record<string, unknown> because Stripe API arguments structure varies by API endpoint and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>\n > = {\n stripe_create_customer: a => stripe.customers.create(a),\n stripe_list_customers: a => stripe.customers.list(a),\n stripe_create_product: a => stripe.products.create(a),\n stripe_list_products: a => stripe.products.list(a),\n stripe_create_price: a => stripe.prices.create(a),\n stripe_list_prices: a => stripe.prices.list(a),\n stripe_list_subscriptions: a => stripe.subscriptions.list(a),\n stripe_cancel_subscription: a => stripe.subscriptions.cancel(a.subscription),\n stripe_update_subscription: a => stripe.subscriptions.update(a.subscription, a),\n stripe_list_payment_intents: a => stripe.paymentIntents.list(a),\n stripe_create_invoice: a => stripe.invoices.create(a),\n stripe_list_invoices: a => stripe.invoices.list(a),\n stripe_create_coupon: a => stripe.coupons.create(a),\n stripe_list_coupons: a => stripe.coupons.list(a),\n };\n\n const apiCall = apiMap[name];\n if (apiCall) {\n return await apiCall(args);\n }\n\n throw new Error(`No API mapping for: ${name}`);\n } catch (error) {\n logger.error('Failed to execute Stripe tool via API', {\n name,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Get all registered tools\n */\n getTools(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Get tool by name\n */\n getTool(name: string): ToolDefinition | null {\n return this.tools.get(name) || null;\n }\n}\n","/**\n * Vercel MCP Adapter\n *\n * Bridges external Vercel MCP server with Reveal MCP system\n * Allows internal agents and tools to use Vercel operations\n */\n\nimport { createServiceLogger } from '@revealui/infrastructure';\nimport type { ToolDefinition } from '../tools/types';\n\nconst logger = createServiceLogger('VercelMCPAdapter');\n\n/**\n * MCP tools interface for Vercel\n */\ninterface VercelMCPTools {\n // Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed\n deploy_to_vercel?: (\n args: /* Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_projects?: (\n args: /* Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n get_project?: (\n args: /* Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n list_deployments?: (\n args: /* Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n get_deployment?: (\n args: /* Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n get_deployment_build_logs?: (\n args: /* Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>;\n // Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed\n [key: string]:\n | ((\n args: /* Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ) => Promise<unknown>)\n | undefined;\n}\n\n/**\n * Global MCP interface\n */\ninterface GlobalMCP {\n vercel?: VercelMCPTools;\n}\n\ndeclare global {\n var mcp: GlobalMCP | undefined;\n}\n\nexport interface VercelMCPAdapterConfig {\n apiToken?: string;\n enabled?: boolean;\n}\n\n/**\n * Vercel MCP Adapter\n *\n * Connects to external Vercel MCP server and exposes tools\n * through Reveal MCP unified interface\n */\nexport class VercelMCPAdapter {\n private config: VercelMCPAdapterConfig;\n private tools: Map<string, ToolDefinition> = new Map();\n private isInitialized = false;\n\n constructor(config: VercelMCPAdapterConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n apiToken: config.apiToken || process.env.VERCEL_TOKEN,\n ...config,\n };\n }\n\n /**\n * Initialize the adapter\n */\n async initialize(): Promise<void> {\n if (!this.config.enabled) {\n logger.info('Vercel MCP adapter disabled');\n return;\n }\n\n if (!this.config.apiToken) {\n logger.warn('Vercel MCP adapter disabled: VERCEL_TOKEN not set');\n return;\n }\n\n try {\n // Register Vercel tools\n await this.registerTools();\n this.isInitialized = true;\n logger.info('Vercel MCP adapter initialized', {\n toolsCount: this.tools.size,\n });\n } catch (error) {\n logger.error('Failed to initialize Vercel MCP adapter', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Register Vercel tools\n */\n private async registerTools(): Promise<void> {\n // Vercel deployment tools\n this.tools.set('vercel_deploy', {\n name: 'vercel_deploy',\n server: 'vercel',\n description: 'Deploy an application to Vercel',\n parameters: [\n {\n name: 'projectId',\n type: 'string',\n required: true,\n description: 'Vercel project ID',\n },\n {\n name: 'branch',\n type: 'string',\n required: false,\n description: 'Git branch to deploy (default: main)',\n default: 'main',\n },\n {\n name: 'environment',\n type: 'string',\n required: false,\n description: 'Deployment environment (production, preview)',\n default: 'production',\n },\n ],\n returns: {\n type: 'object',\n description: 'Deployment information',\n },\n });\n\n // Vercel project management\n this.tools.set('vercel_list_projects', {\n name: 'vercel_list_projects',\n server: 'vercel',\n description: 'List all Vercel projects',\n parameters: [\n {\n name: 'teamId',\n type: 'string',\n required: false,\n description: 'Team ID to filter projects',\n },\n ],\n returns: {\n type: 'array',\n description: 'List of projects',\n },\n });\n\n this.tools.set('vercel_get_project', {\n name: 'vercel_get_project',\n server: 'vercel',\n description: 'Get details of a Vercel project',\n parameters: [\n {\n name: 'projectId',\n type: 'string',\n required: true,\n description: 'Project ID',\n },\n ],\n returns: {\n type: 'object',\n description: 'Project details',\n },\n });\n\n // Environment variables\n this.tools.set('vercel_list_env_vars', {\n name: 'vercel_list_env_vars',\n server: 'vercel',\n description: 'List environment variables for a project',\n parameters: [\n {\n name: 'projectId',\n type: 'string',\n required: true,\n description: 'Project ID',\n },\n {\n name: 'environment',\n type: 'string',\n required: false,\n description: 'Environment (production, preview, development)',\n },\n ],\n returns: {\n type: 'array',\n description: 'List of environment variables',\n },\n });\n\n this.tools.set('vercel_set_env_var', {\n name: 'vercel_set_env_var',\n server: 'vercel',\n description: 'Set an environment variable for a project',\n parameters: [\n {\n name: 'projectId',\n type: 'string',\n required: true,\n description: 'Project ID',\n },\n {\n name: 'key',\n type: 'string',\n required: true,\n description: 'Environment variable key',\n },\n {\n name: 'value',\n type: 'string',\n required: true,\n description: 'Environment variable value',\n },\n {\n name: 'environment',\n type: 'string',\n required: false,\n description: 'Environment (production, preview, development, all)',\n default: 'all',\n },\n ],\n returns: {\n type: 'object',\n description: 'Updated environment variable',\n },\n });\n\n // Deployments\n this.tools.set('vercel_list_deployments', {\n name: 'vercel_list_deployments',\n server: 'vercel',\n description: 'List deployments for a project',\n parameters: [\n {\n name: 'projectId',\n type: 'string',\n required: true,\n description: 'Project ID',\n },\n {\n name: 'limit',\n type: 'number',\n required: false,\n description: 'Maximum number of deployments to return',\n default: 10,\n },\n ],\n returns: {\n type: 'array',\n description: 'List of deployments',\n },\n });\n\n this.tools.set('vercel_get_deployment', {\n name: 'vercel_get_deployment',\n server: 'vercel',\n description: 'Get details of a specific deployment',\n parameters: [\n {\n name: 'deploymentId',\n type: 'string',\n required: true,\n description: 'Deployment ID or URL',\n },\n ],\n returns: {\n type: 'object',\n description: 'Deployment details',\n },\n });\n\n // Analytics\n this.tools.set('vercel_get_analytics', {\n name: 'vercel_get_analytics',\n server: 'vercel',\n description: 'Get analytics data for a project',\n parameters: [\n {\n name: 'projectId',\n type: 'string',\n required: true,\n description: 'Project ID',\n },\n {\n name: 'period',\n type: 'string',\n required: false,\n description: 'Time period (7d, 30d, 90d)',\n default: '30d',\n },\n ],\n returns: {\n type: 'object',\n description: 'Analytics data',\n },\n });\n }\n\n /**\n * Execute a Vercel tool\n *\n * Routes to appropriate Vercel MCP tool or falls back to direct API calls\n */\n async executeTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n if (!this.isInitialized) {\n throw new Error('Vercel MCP adapter not initialized');\n }\n\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Vercel tool not found: ${name}`);\n }\n\n try {\n // Try to use MCP tools if available in the runtime\n // These are available when running in Cursor IDE or MCP-enabled environments\n const mcpTools = globalThis.mcp;\n\n if (mcpTools?.vercel) {\n // Use MCP tools directly\n return await this.executeViaMCP(name, args, mcpTools.vercel);\n }\n\n // Fallback: Use direct Vercel API calls\n return await this.executeViaAPI(name, args);\n } catch (error) {\n logger.error('Failed to execute Vercel tool', {\n name,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Execute via MCP tools (when available)\n */\n // Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed\n private async executeViaMCP(\n name: string,\n args: /* Using Record<string, unknown> because Vercel tool arguments structure varies by tool type and cannot be strictly typed */ Record<\n string,\n unknown\n >,\n vercelMCP: VercelMCPTools\n ): Promise<unknown> {\n // Map tool names to MCP tool calls\n const toolMap: Record<string, string> = {\n vercel_deploy: 'deploy_to_vercel',\n vercel_list_projects: 'list_projects',\n vercel_get_project: 'get_project',\n vercel_list_deployments: 'list_deployments',\n vercel_get_deployment: 'get_deployment',\n vercel_get_analytics: 'get_analytics',\n };\n\n const mcpToolName = toolMap[name];\n if (!mcpToolName) {\n throw new Error(`No MCP tool mapping for: ${name}`);\n }\n\n // Call MCP tool\n if (typeof vercelMCP[mcpToolName] === 'function') {\n return await vercelMCP[mcpToolName](args);\n }\n\n throw new Error(`MCP tool ${mcpToolName} not available`);\n }\n\n /**\n * Execute via direct Vercel API (fallback)\n */\n // Using Record<string, unknown> because Vercel API arguments structure varies by API endpoint and cannot be strictly typed\n private async executeViaAPI(\n name: string,\n args: /* Using Record<string, unknown> because Vercel API arguments structure varies by API endpoint and cannot be strictly typed */ Record<\n string,\n unknown\n >\n ): Promise<unknown> {\n if (!this.config.apiToken) {\n throw new Error('VERCEL_TOKEN required for direct API calls');\n }\n\n // For now, return a structured response indicating API call would happen\n // In production, you'd use @vercel/node or vercel API client\n logger.info('Executing Vercel tool via API', { name, args });\n\n return {\n success: true,\n message: `Vercel tool ${name} - would execute via Vercel API`,\n tool: name,\n args,\n note: 'Direct API implementation can be added using @vercel/node or vercel API client',\n };\n }\n\n /**\n * Get all registered tools\n */\n getTools(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Get tool by name\n */\n getTool(name: string): ToolDefinition | null {\n return this.tools.get(name) || null;\n }\n}\n","/**\n * Reveal MCP - Unified Model Context Protocol Implementation\n *\n * Combines multi-agent communication with PayloadCMS integration\n * to provide a complete AI agent orchestration platform.\n */\n\n// Re-export main server\nexport { RevealMCPServer } from './server/RevealMCPServer';\nexport type { RevealMCPConfig } from './server/types';\n\n// Re-export core MCP service\nexport { MCPService } from './MCPService';\nexport type { MCPServiceOptions } from './MCPService';\n\n// Re-export core components\nexport { AgentRegistry } from './core/AgentRegistry';\nexport { AgentWorkspaceService } from './core/AgentWorkspaceService';\nexport { CodeExecutionSandbox } from './core/CodeExecutionSandbox';\nexport { MCPServer } from './core/MCPServer';\nexport type { MCPServerConfig } from './core/MCPServer';\nexport { MessageBroker } from './core/MessageBroker';\nexport type { MessageBrokerConfig } from './core/MessageBroker';\nexport { ProtocolHandler } from './core/ProtocolHandler';\nexport { SecurityManager } from './core/SecurityManager';\nexport { SkillsRegistry } from './core/SkillsRegistry';\nexport { ToolDiscoveryService } from './core/ToolDiscoveryService';\nexport type { ToolSearchOptions } from './core/ToolDiscoveryService';\n\n// Re-export agents\nexport { BaseAgent } from './agents/BaseAgent';\nexport { BaseAgentExecutor } from './agents/BaseAgentExecutor';\nexport * from './agents/development';\nexport * from './agents/user-facing';\nexport type { AgentConfig } from './types/agents';\n\n// Re-export safety components\nexport { ApprovalWorkflow } from './safety/ApprovalWorkflow';\nexport { AuditLogger } from './safety/AuditLogger';\nexport { RiskClassifier } from './safety/RiskClassifier';\nexport { RollbackManager } from './safety/RollbackManager';\n\n// Re-export tools\nexport * from './tools';\nexport type { ToolDefinition, ToolDetailLevel, ToolDiscoveryResult } from './tools/types';\n\n// Re-export types\nexport type * from './types/agent-metadata';\nexport type * from './types/agents';\nexport type * from './types/messages';\nexport type * from './types/tasks';\n\n// Re-export bridge\nexport { getPayloadMCPBridge } from './bridge/PayloadMCPService';\nexport type * from './bridge/types';\n\n// PayloadCMS integration - exported separately to avoid bundling issues\n// Import at runtime: import { mcpPlugin } from '@revealui/mcp/payload';\n// Note: This is a re-export that references files outside the package\n// and should be imported directly from the source in the main app\n\n// Re-export external service adapters\nexport { StripeMCPAdapter } from './adapters/StripeMCPAdapter';\nexport type { StripeMCPAdapterConfig } from './adapters/StripeMCPAdapter';\nexport { VercelMCPAdapter } from './adapters/VercelMCPAdapter';\nexport type { VercelMCPAdapterConfig } from './adapters/VercelMCPAdapter';\n\n// Analytics exports are available via @revealui/mcp/analytics\n// Server-only ComparisonService: @revealui/mcp/analytics/server\n// Client-safe types/components: @revealui/mcp/analytics\n\n// Utils - server-only exports\nexport { executeAutomationTrigger } from './utils/automation-executor';\nexport { logAutomationEvent } from './utils/automation-log';\n// Note: These reference @/ paths but are server-only, so they can be exported\n// Other utils reference @/ paths and should be imported directly from source\n// export * from './utils/faq';\n// export * from './utils/launchkits';\n// export * from './utils/privacy-tokenization';\n// export * from './utils/result-processor';\n","import { cleanPayload } from '@/app/actions/automation';\nimport { logAutomationEvent } from './automation-log';\nimport { resolveFAQ } from './faq';\nimport { resolveLaunchKitReminders } from './launchkits';\nimport { process as processResults } from './result-processor';\n\ntype AutomationAgent = 'faq' | 'launchkit';\n\ninterface ExecuteOptions {\n agent: AutomationAgent;\n // Using Record<string, unknown> because automation payload structure varies by agent type and cannot be strictly typed\n payload: /* Using Record<string, unknown> because automation payload structure varies by agent type and cannot be strictly typed */ Record<\n string,\n unknown\n >;\n request?: Request;\n source: 'portal' | 'cli' | 'api' | 'other';\n user?: { id?: string | number | null; email?: string | null } | null;\n}\n\nexport async function executeAutomationTrigger<T = unknown>({\n agent,\n payload,\n request,\n source,\n user,\n}: ExecuteOptions): Promise<{ data: T }> {\n switch (agent) {\n case 'faq': {\n const question = typeof payload.question === 'string' ? payload.question : '';\n const format = payload.format === 'text' ? 'text' : 'markdown';\n const maxAnswers = typeof payload.maxAnswers === 'number' ? payload.maxAnswers : undefined;\n\n const data = await resolveFAQ({ format, maxAnswers, question });\n\n // Process results through ResultProcessor pipeline\n const processed = processResults(data.matches, {\n topN: maxAnswers,\n confidenceThreshold: 0.1,\n maxSize: 50000, // Limit to ~50KB\n });\n\n const processedData = {\n ...data,\n matches: processed.data,\n summary: processed.summary,\n metadata: {\n ...data,\n ...processed.metadata,\n },\n };\n\n await logAutomationEvent({\n action: 'faq-lookup',\n agent: 'FAQAgent',\n payload: cleanPayload({\n format,\n matchConfidence: processedData.matches[0]?.confidence ?? 0,\n matchedQuestion: processedData.matches[0]?.question,\n maxAnswers: maxAnswers ?? 1,\n question,\n filtered: processed.filtered,\n }),\n req: request,\n source,\n status: 'success',\n user,\n });\n\n return { data: processedData as T };\n }\n case 'launchkit': {\n const scope = typeof payload.scope === 'string' ? payload.scope : undefined;\n const upcomingDays =\n typeof payload.upcomingDays === 'number' ? payload.upcomingDays : undefined;\n\n const data = await resolveLaunchKitReminders({ scope, upcomingDays });\n\n // Process results through ResultProcessor pipeline\n const processed = processResults(data.tasks, {\n maxSize: 100000, // Limit to ~100KB\n pagination: data.tasks.length > 100 ? { page: 1, pageSize: 100 } : undefined,\n });\n\n const processedData = {\n ...data,\n tasks: processed.data,\n summary: processed.summary,\n metadata: {\n ...data.metadata,\n ...processed.metadata,\n },\n };\n\n await logAutomationEvent({\n action: 'launchkit-reminder',\n agent: 'LaunchKitReminderAgent',\n payload: cleanPayload({\n scope: scope ?? 'upcoming',\n tasksReturned: processedData.tasks.length,\n upcomingDays: upcomingDays ?? 7,\n filtered: processed.filtered,\n }),\n req: request,\n source,\n status: 'success',\n user,\n });\n\n return { data: processedData as T };\n }\n default:\n throw new Error(`Unsupported automation agent: ${agent}`);\n }\n}\n","import {createLogger} from '@revealui/core';\nimport {getPayload} from 'payload';\nimport {PrivacyTokenizationService} from './privacy-tokenization';\n\nconst logger = createLogger('automation-log');\n\n// Note: getPayloadConfig should be provided by the consuming application\n// This is a placeholder - replace with actual implementation\nasync function getPayloadConfig() {\n throw new Error('getPayloadConfig must be provided by the consuming application');\n}\n\n// Singleton instance for tokenization service\nlet tokenizationService: PrivacyTokenizationService | null = null;\n\nfunction getTokenizationService(): PrivacyTokenizationService {\n if (!tokenizationService) {\n tokenizationService = new PrivacyTokenizationService({\n enabled: process.env.MCP_ENABLE_TOKENIZATION !== 'false',\n storageType: 'memory',\n });\n tokenizationService.initialize().catch(err => {\n logger.error('Failed to initialize tokenization service', { error: err });\n });\n }\n return tokenizationService;\n}\n\ninterface LogOptions {\n agent: string;\n action: string;\n source?: 'portal' | 'cli' | 'api' | 'other';\n payload?: unknown;\n status?: 'success' | 'error';\n errorMessage?: string;\n req?: Request;\n user?: { id?: string | number | null; email?: string | null } | null;\n}\n\nexport async function logAutomationEvent(options: LogOptions) {\n const {\n agent,\n action,\n source = 'portal',\n payload,\n status = 'success',\n errorMessage,\n req,\n user,\n } = options;\n\n try {\n // Note: Payload instance should be provided by the consuming application\n // This is a placeholder - replace with actual implementation\n const payloadInstance = await getPayload({ config: await getPayloadConfig() });\n\n const actor = user ?? (await payloadInstance.auth());\n const userId = actor?.user ? String(actor.user.id) : undefined;\n const userEmail = actor?.user?.email ?? undefined;\n\n // Tokenize sensitive data in payload before logging\n let tokenizedPayload = payload;\n let detectedPII = 0;\n\n if (payload) {\n const tokenizer = getTokenizationService();\n const result = tokenizer.tokenize(payload, {\n preserveStructure: true,\n types: ['email', 'phone', 'ssn', 'api-key', 'password', 'credit-card'],\n });\n tokenizedPayload = result.tokenized;\n detectedPII = result.detected;\n }\n\n await payloadInstance.create({\n collection: 'mcp-automation-logs',\n data: {\n agent,\n action,\n source,\n status,\n errorMessage,\n payload: tokenizedPayload, // Store tokenized payload\n userId,\n userEmail,\n ipAddress: req\n ? (req.headers.get('x-forwarded-for') ?? req.headers.get('cf-connecting-ip') ?? undefined)\n : undefined,\n },\n });\n\n // Log tokenization stats if PII was detected\n if (detectedPII > 0) {\n logger.debug('Tokenized PII fields in automation log', {\n detectedPII,\n agent,\n action,\n });\n }\n } catch (error) {\n logger.error('Failed to log automation event', {\n error: error instanceof Error ? error.message : String(error),\n agent,\n action,\n });\n }\n}\n\n/**\n * Get tokenization service instance (for untokenization during tool execution)\n */\nexport function getTokenizationServiceInstance(): PrivacyTokenizationService {\n return getTokenizationService();\n}\n"],"mappings":"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","names":["process","createServiceLogger","logger","createServiceLogger","createServiceLogger","logger","createServiceLogger","createServiceLogger","logger","createServiceLogger","logger","logger","openai","generateText","logger","generateText","openai","anthropic","openai","generateText","logger","generateText","anthropic","openai","anthropic","openai","generateText","logger","generateText","anthropic","openai","createServiceLogger","logger","createServiceLogger","logger","anthropic","openai","generateText","logger","generateText","anthropic","openai","anthropic","openai","generateText","logger","generateText","anthropic","openai","fs","path","anthropic","openai","generateText","logger","generateText","anthropic","openai","logger","fs","path","path","code","createClient","fs","path","createServiceLogger","logger","createServiceLogger","path","fs","fs","path","createServiceLogger","logger","approvals","createServiceLogger","logger","createClient","createClient","createClient","createServiceLogger","logger","getPayloadMCPBridge","createServiceLogger","logger","createServiceLogger","logger","logger","createServiceLogger","getPayload","logger","process"]}
|