@mxf-dev/core 2.0.5 → 3.0.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/dist/config/ModelContextLimits.d.ts.map +1 -1
- package/dist/config/ModelContextLimits.js +7 -1
- package/dist/config/ModelContextLimits.js.map +1 -1
- package/dist/constants/CoreTools.d.ts +6 -5
- package/dist/constants/CoreTools.d.ts.map +1 -1
- package/dist/constants/CoreTools.js +6 -5
- package/dist/constants/CoreTools.js.map +1 -1
- package/dist/constants/DefaultPhaseProfiles.d.ts.map +1 -1
- package/dist/constants/DefaultPhaseProfiles.js +29 -0
- package/dist/constants/DefaultPhaseProfiles.js.map +1 -1
- package/dist/constants/ReservedIdentities.d.ts +14 -0
- package/dist/constants/ReservedIdentities.d.ts.map +1 -0
- package/dist/constants/ReservedIdentities.js +42 -0
- package/dist/constants/ReservedIdentities.js.map +1 -0
- package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.d.ts +16 -16
- package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.d.ts.map +1 -1
- package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.js +98 -36
- package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.js.map +1 -1
- package/dist/events/ClientEventBus.d.ts +28 -0
- package/dist/events/ClientEventBus.d.ts.map +1 -1
- package/dist/events/ClientEventBus.js +87 -40
- package/dist/events/ClientEventBus.js.map +1 -1
- package/dist/events/EventBus.d.ts +19 -1
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/events/EventBus.js +23 -0
- package/dist/events/EventBus.js.map +1 -1
- package/dist/events/EventBusBase.d.ts +37 -6
- package/dist/events/EventBusBase.d.ts.map +1 -1
- package/dist/events/EventBusBase.js +75 -27
- package/dist/events/EventBusBase.js.map +1 -1
- package/dist/events/EventNames.d.ts +49 -36
- package/dist/events/EventNames.d.ts.map +1 -1
- package/dist/events/EventNames.js +38 -36
- package/dist/events/EventNames.js.map +1 -1
- package/dist/events/PublicEvents.d.ts +5 -1
- package/dist/events/PublicEvents.d.ts.map +1 -1
- package/dist/events/PublicEvents.js +7 -0
- package/dist/events/PublicEvents.js.map +1 -1
- package/dist/events/ServerEventBus.d.ts +7 -54
- package/dist/events/ServerEventBus.d.ts.map +1 -1
- package/dist/events/ServerEventBus.js +10 -96
- package/dist/events/ServerEventBus.js.map +1 -1
- package/dist/events/event-definitions/ControlLoopEvents.d.ts +35 -0
- package/dist/events/event-definitions/ControlLoopEvents.d.ts.map +1 -1
- package/dist/events/event-definitions/ControlLoopEvents.js +6 -0
- package/dist/events/event-definitions/ControlLoopEvents.js.map +1 -1
- package/dist/events/event-definitions/SdkEvents.d.ts +55 -0
- package/dist/events/event-definitions/SdkEvents.d.ts.map +1 -0
- package/dist/events/event-definitions/SdkEvents.js +36 -0
- package/dist/events/event-definitions/SdkEvents.js.map +1 -0
- package/dist/events/event-definitions/TaskEvents.d.ts +2 -7
- package/dist/events/event-definitions/TaskEvents.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/AgentInterfaces.d.ts +5 -0
- package/dist/interfaces/AgentInterfaces.d.ts.map +1 -1
- package/dist/interfaces/ChannelConfig.d.ts +2 -2
- package/dist/interfaces/ChannelConfig.d.ts.map +1 -1
- package/dist/interfaces/ConversationMessage.d.ts +1 -1
- package/dist/interfaces/ConversationMessage.d.ts.map +1 -1
- package/dist/interfaces/IMemoryPersistence.d.ts +47 -1
- package/dist/interfaces/IMemoryPersistence.d.ts.map +1 -1
- package/dist/interfaces/SocketServiceInterface.d.ts +3 -2
- package/dist/interfaces/SocketServiceInterface.d.ts.map +1 -1
- package/dist/interfaces/TaskInterfaces.d.ts +14 -1
- package/dist/interfaces/TaskInterfaces.d.ts.map +1 -1
- package/dist/models/agent.d.ts +0 -1
- package/dist/models/agent.d.ts.map +1 -1
- package/dist/models/agent.js +0 -5
- package/dist/models/agent.js.map +1 -1
- package/dist/models/agentIdentityReservation.d.ts +42 -0
- package/dist/models/agentIdentityReservation.d.ts.map +1 -0
- package/dist/models/agentIdentityReservation.js +52 -0
- package/dist/models/agentIdentityReservation.js.map +1 -0
- package/dist/models/channel.d.ts +2 -0
- package/dist/models/channel.d.ts.map +1 -1
- package/dist/models/channel.js.map +1 -1
- package/dist/models/channelKey.d.ts +1 -0
- package/dist/models/channelKey.d.ts.map +1 -1
- package/dist/models/channelKey.js +5 -0
- package/dist/models/channelKey.js.map +1 -1
- package/dist/models/memory.d.ts +1 -1
- package/dist/models/memory.d.ts.map +1 -1
- package/dist/models/memory.js +9 -12
- package/dist/models/memory.js.map +1 -1
- package/dist/models/memoryStrata.d.ts +3 -16
- package/dist/models/memoryStrata.d.ts.map +1 -1
- package/dist/models/memoryStrata.js +3 -5
- package/dist/models/memoryStrata.js.map +1 -1
- package/dist/models/plan.d.ts +2 -2
- package/dist/models/plan.d.ts.map +1 -1
- package/dist/models/plan.js +1 -1
- package/dist/models/plan.js.map +1 -1
- package/dist/models/taskEffectiveness.d.ts +1 -0
- package/dist/models/taskEffectiveness.d.ts.map +1 -1
- package/dist/models/taskEffectiveness.js +7 -1
- package/dist/models/taskEffectiveness.js.map +1 -1
- package/dist/models/user.d.ts +4 -0
- package/dist/models/user.d.ts.map +1 -1
- package/dist/models/user.js +8 -0
- package/dist/models/user.js.map +1 -1
- package/dist/protocols/mcp/LlmTestEnvironmentGuard.d.ts +16 -0
- package/dist/protocols/mcp/LlmTestEnvironmentGuard.d.ts.map +1 -0
- package/dist/protocols/mcp/LlmTestEnvironmentGuard.js +25 -0
- package/dist/protocols/mcp/LlmTestEnvironmentGuard.js.map +1 -0
- package/dist/protocols/mcp/McpServerTypes.d.ts +9 -0
- package/dist/protocols/mcp/McpServerTypes.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/AnthropicMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/AnthropicMcpClient.js +1 -0
- package/dist/protocols/mcp/providers/AnthropicMcpClient.js.map +1 -1
- package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.js +1 -0
- package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.js.map +1 -1
- package/dist/protocols/mcp/providers/BaseMcpClient.d.ts +4 -0
- package/dist/protocols/mcp/providers/BaseMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/BaseMcpClient.js +10 -0
- package/dist/protocols/mcp/providers/BaseMcpClient.js.map +1 -1
- package/dist/protocols/mcp/providers/CustomMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/CustomMcpClient.js +7 -0
- package/dist/protocols/mcp/providers/CustomMcpClient.js.map +1 -1
- package/dist/protocols/mcp/providers/GeminiMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/GeminiMcpClient.js +1 -0
- package/dist/protocols/mcp/providers/GeminiMcpClient.js.map +1 -1
- package/dist/protocols/mcp/providers/OllamaMcpClient.d.ts +1 -0
- package/dist/protocols/mcp/providers/OllamaMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/OllamaMcpClient.js +1 -0
- package/dist/protocols/mcp/providers/OllamaMcpClient.js.map +1 -1
- package/dist/protocols/mcp/providers/OpenAiMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/OpenAiMcpClient.js +1 -0
- package/dist/protocols/mcp/providers/OpenAiMcpClient.js.map +1 -1
- package/dist/protocols/mcp/providers/OpenRouterMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/OpenRouterMcpClient.js +2 -0
- package/dist/protocols/mcp/providers/OpenRouterMcpClient.js.map +1 -1
- package/dist/protocols/mcp/providers/XaiMcpClient.d.ts.map +1 -1
- package/dist/protocols/mcp/providers/XaiMcpClient.js +1 -0
- package/dist/protocols/mcp/providers/XaiMcpClient.js.map +1 -1
- package/dist/protocols/mcp/security/BrowserTargetGuard.d.ts +14 -0
- package/dist/protocols/mcp/security/BrowserTargetGuard.d.ts.map +1 -0
- package/dist/protocols/mcp/security/BrowserTargetGuard.js +55 -0
- package/dist/protocols/mcp/security/BrowserTargetGuard.js.map +1 -0
- package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.d.ts +24 -0
- package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.d.ts.map +1 -0
- package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.js +33 -0
- package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.js.map +1 -0
- package/dist/protocols/mcp/security/HttpTargetGuard.d.ts.map +1 -1
- package/dist/protocols/mcp/security/HttpTargetGuard.js +68 -6
- package/dist/protocols/mcp/security/HttpTargetGuard.js.map +1 -1
- package/dist/protocols/mcp/security/McpSecurityGuard.d.ts.map +1 -1
- package/dist/protocols/mcp/security/McpSecurityGuard.js +7 -5
- package/dist/protocols/mcp/security/McpSecurityGuard.js.map +1 -1
- package/dist/protocols/mcp/security/McpToolPolicy.d.ts +18 -0
- package/dist/protocols/mcp/security/McpToolPolicy.d.ts.map +1 -1
- package/dist/protocols/mcp/security/McpToolPolicy.js +60 -0
- package/dist/protocols/mcp/security/McpToolPolicy.js.map +1 -1
- package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts +25 -0
- package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts.map +1 -1
- package/dist/protocols/mcp/services/ExternalMcpServerManager.js +93 -17
- package/dist/protocols/mcp/services/ExternalMcpServerManager.js.map +1 -1
- package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts +2 -2
- package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts.map +1 -1
- package/dist/protocols/mcp/services/ExternalServerConfigs.js +25 -8
- package/dist/protocols/mcp/services/ExternalServerConfigs.js.map +1 -1
- package/dist/protocols/mcp/tools/AnalyticsTools.d.ts +3 -37
- package/dist/protocols/mcp/tools/AnalyticsTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/AnalyticsTools.js +134 -614
- package/dist/protocols/mcp/tools/AnalyticsTools.js.map +1 -1
- package/dist/protocols/mcp/tools/CodeAnalysisTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/CodeAnalysisTools.js +16 -13
- package/dist/protocols/mcp/tools/CodeAnalysisTools.js.map +1 -1
- package/dist/protocols/mcp/tools/EffectivenessTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/EffectivenessTools.js +94 -30
- package/dist/protocols/mcp/tools/EffectivenessTools.js.map +1 -1
- package/dist/protocols/mcp/tools/GitTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/GitTools.js +9 -5
- package/dist/protocols/mcp/tools/GitTools.js.map +1 -1
- package/dist/protocols/mcp/tools/InfrastructureTools.d.ts +10 -40
- package/dist/protocols/mcp/tools/InfrastructureTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/InfrastructureTools.js +29 -70
- package/dist/protocols/mcp/tools/InfrastructureTools.js.map +1 -1
- package/dist/protocols/mcp/tools/JsonTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/JsonTools.js +4 -4
- package/dist/protocols/mcp/tools/JsonTools.js.map +1 -1
- package/dist/protocols/mcp/tools/KnowledgeGraphTools.d.ts +55 -592
- package/dist/protocols/mcp/tools/KnowledgeGraphTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/KnowledgeGraphTools.js +169 -119
- package/dist/protocols/mcp/tools/KnowledgeGraphTools.js.map +1 -1
- package/dist/protocols/mcp/tools/MemorySearchTools.d.ts +6 -6
- package/dist/protocols/mcp/tools/MemorySearchTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/MemorySearchTools.js +107 -39
- package/dist/protocols/mcp/tools/MemorySearchTools.js.map +1 -1
- package/dist/protocols/mcp/tools/MemoryUtilityTools.d.ts +4 -5
- package/dist/protocols/mcp/tools/MemoryUtilityTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/MemoryUtilityTools.js +59 -208
- package/dist/protocols/mcp/tools/MemoryUtilityTools.js.map +1 -1
- package/dist/protocols/mcp/tools/PlanningTools.d.ts +2 -1
- package/dist/protocols/mcp/tools/PlanningTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/PlanningTools.js +111 -49
- package/dist/protocols/mcp/tools/PlanningTools.js.map +1 -1
- package/dist/protocols/mcp/tools/ProjectContextTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/ProjectContextTools.js +18 -12
- package/dist/protocols/mcp/tools/ProjectContextTools.js.map +1 -1
- package/dist/protocols/mcp/tools/SafetyTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/SafetyTools.js +16 -13
- package/dist/protocols/mcp/tools/SafetyTools.js.map +1 -1
- package/dist/protocols/mcp/tools/SearchProjectTools.d.ts +24 -7
- package/dist/protocols/mcp/tools/SearchProjectTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/SearchProjectTools.js +226 -126
- package/dist/protocols/mcp/tools/SearchProjectTools.js.map +1 -1
- package/dist/protocols/mcp/tools/TaskPlanningTools.d.ts +0 -32
- package/dist/protocols/mcp/tools/TaskPlanningTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/TaskPlanningTools.js +363 -450
- package/dist/protocols/mcp/tools/TaskPlanningTools.js.map +1 -1
- package/dist/protocols/mcp/tools/TestTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/TestTools.js +18 -11
- package/dist/protocols/mcp/tools/TestTools.js.map +1 -1
- package/dist/protocols/mcp/tools/TypeScriptTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/TypeScriptTools.js +22 -12
- package/dist/protocols/mcp/tools/TypeScriptTools.js.map +1 -1
- package/dist/protocols/mcp/tools/UserInputTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/UserInputTools.js +14 -1
- package/dist/protocols/mcp/tools/UserInputTools.js.map +1 -1
- package/dist/protocols/mcp/tools/UserMemoryTools.d.ts +3 -1
- package/dist/protocols/mcp/tools/UserMemoryTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/UserMemoryTools.js +27 -62
- package/dist/protocols/mcp/tools/UserMemoryTools.js.map +1 -1
- package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js +14 -60
- package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js.map +1 -1
- package/dist/protocols/mcp/tools/shell/ShellSandbox.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/shell/ShellSandbox.js +9 -27
- package/dist/protocols/mcp/tools/shell/ShellSandbox.js.map +1 -1
- package/dist/repositories/interfaces/IKnowledgeGraphRepository.d.ts +40 -30
- package/dist/repositories/interfaces/IKnowledgeGraphRepository.d.ts.map +1 -1
- package/dist/schemas/EventPayloadSchema.d.ts +28 -0
- package/dist/schemas/EventPayloadSchema.d.ts.map +1 -1
- package/dist/schemas/EventPayloadSchema.js +30 -1
- package/dist/schemas/EventPayloadSchema.js.map +1 -1
- package/dist/schemas/MxpProtocolSchemas.d.ts +6 -6
- package/dist/services/AgentPerformanceService.d.ts +11 -0
- package/dist/services/AgentPerformanceService.d.ts.map +1 -1
- package/dist/services/AgentPerformanceService.js +59 -33
- package/dist/services/AgentPerformanceService.js.map +1 -1
- package/dist/services/AutoCorrectionService.d.ts +3 -0
- package/dist/services/AutoCorrectionService.d.ts.map +1 -1
- package/dist/services/AutoCorrectionService.js +19 -2
- package/dist/services/AutoCorrectionService.js.map +1 -1
- package/dist/services/BackgroundTaskManager.d.ts +23 -7
- package/dist/services/BackgroundTaskManager.d.ts.map +1 -1
- package/dist/services/BackgroundTaskManager.js +137 -57
- package/dist/services/BackgroundTaskManager.js.map +1 -1
- package/dist/services/BrowserManager.d.ts +2 -0
- package/dist/services/BrowserManager.d.ts.map +1 -1
- package/dist/services/BrowserManager.js +18 -15
- package/dist/services/BrowserManager.js.map +1 -1
- package/dist/services/ChannelContextMemoryOperations.d.ts +8 -1
- package/dist/services/ChannelContextMemoryOperations.d.ts.map +1 -1
- package/dist/services/ChannelContextMemoryOperations.js +89 -165
- package/dist/services/ChannelContextMemoryOperations.js.map +1 -1
- package/dist/services/ChannelContextMessageOperations.d.ts +4 -3
- package/dist/services/ChannelContextMessageOperations.d.ts.map +1 -1
- package/dist/services/ChannelContextMessageOperations.js +72 -212
- package/dist/services/ChannelContextMessageOperations.js.map +1 -1
- package/dist/services/MemoryService.d.ts +52 -21
- package/dist/services/MemoryService.d.ts.map +1 -1
- package/dist/services/MemoryService.js +775 -548
- package/dist/services/MemoryService.js.map +1 -1
- package/dist/services/PatternLearningService.d.ts +5 -0
- package/dist/services/PatternLearningService.d.ts.map +1 -1
- package/dist/services/PatternLearningService.js +26 -3
- package/dist/services/PatternLearningService.js.map +1 -1
- package/dist/services/PerformanceOptimizationService.d.ts +2 -1
- package/dist/services/PerformanceOptimizationService.d.ts.map +1 -1
- package/dist/services/PerformanceOptimizationService.js +21 -6
- package/dist/services/PerformanceOptimizationService.js.map +1 -1
- package/dist/services/PredictiveAnalyticsService.d.ts +1 -0
- package/dist/services/PredictiveAnalyticsService.d.ts.map +1 -1
- package/dist/services/PredictiveAnalyticsService.js +18 -6
- package/dist/services/PredictiveAnalyticsService.js.map +1 -1
- package/dist/services/ProactiveValidationService.d.ts +6 -0
- package/dist/services/ProactiveValidationService.d.ts.map +1 -1
- package/dist/services/ProactiveValidationService.js +58 -39
- package/dist/services/ProactiveValidationService.js.map +1 -1
- package/dist/services/TaskEffectivenessService.d.ts +55 -31
- package/dist/services/TaskEffectivenessService.d.ts.map +1 -1
- package/dist/services/TaskEffectivenessService.js +243 -125
- package/dist/services/TaskEffectivenessService.js.map +1 -1
- package/dist/services/ToolExecutionInterceptor.d.ts +4 -0
- package/dist/services/ToolExecutionInterceptor.d.ts.map +1 -1
- package/dist/services/ToolExecutionInterceptor.js +31 -5
- package/dist/services/ToolExecutionInterceptor.js.map +1 -1
- package/dist/services/UserInputRequestManager.d.ts +13 -3
- package/dist/services/UserInputRequestManager.d.ts.map +1 -1
- package/dist/services/UserInputRequestManager.js +42 -6
- package/dist/services/UserInputRequestManager.js.map +1 -1
- package/dist/services/UserMemoryService.d.ts +2 -0
- package/dist/services/UserMemoryService.d.ts.map +1 -1
- package/dist/services/UserMemoryService.js +9 -4
- package/dist/services/UserMemoryService.js.map +1 -1
- package/dist/services/ValidationAnalyticsService.d.ts +4 -0
- package/dist/services/ValidationAnalyticsService.d.ts.map +1 -1
- package/dist/services/ValidationAnalyticsService.js +30 -8
- package/dist/services/ValidationAnalyticsService.js.map +1 -1
- package/dist/services/ValidationCacheService.d.ts +3 -1
- package/dist/services/ValidationCacheService.d.ts.map +1 -1
- package/dist/services/ValidationCacheService.js +25 -4
- package/dist/services/ValidationCacheService.js.map +1 -1
- package/dist/services/ValidationMiddleware.d.ts +7 -0
- package/dist/services/ValidationMiddleware.d.ts.map +1 -1
- package/dist/services/ValidationMiddleware.js +53 -10
- package/dist/services/ValidationMiddleware.js.map +1 -1
- package/dist/services/ValidationPerformanceService.d.ts +3 -0
- package/dist/services/ValidationPerformanceService.d.ts.map +1 -1
- package/dist/services/ValidationPerformanceService.js +28 -11
- package/dist/services/ValidationPerformanceService.js.map +1 -1
- package/dist/services/WebSearchService.d.ts.map +1 -1
- package/dist/services/WebSearchService.js +9 -0
- package/dist/services/WebSearchService.js.map +1 -1
- package/dist/services/dag/TaskDagService.d.ts +3 -0
- package/dist/services/dag/TaskDagService.d.ts.map +1 -1
- package/dist/services/dag/TaskDagService.js +18 -0
- package/dist/services/dag/TaskDagService.js.map +1 -1
- package/dist/services/kg/EntityQValueManager.d.ts +3 -1
- package/dist/services/kg/EntityQValueManager.d.ts.map +1 -1
- package/dist/services/kg/EntityQValueManager.js +10 -10
- package/dist/services/kg/EntityQValueManager.js.map +1 -1
- package/dist/services/kg/GraphSurpriseCalculator.d.ts +0 -4
- package/dist/services/kg/GraphSurpriseCalculator.d.ts.map +1 -1
- package/dist/services/kg/GraphSurpriseCalculator.js +0 -9
- package/dist/services/kg/GraphSurpriseCalculator.js.map +1 -1
- package/dist/services/kg/KnowledgeGraphService.d.ts +12 -12
- package/dist/services/kg/KnowledgeGraphService.d.ts.map +1 -1
- package/dist/services/kg/KnowledgeGraphService.js +43 -51
- package/dist/services/kg/KnowledgeGraphService.js.map +1 -1
- package/dist/services/kg/OrparGraphIntegration.d.ts.map +1 -1
- package/dist/services/kg/OrparGraphIntegration.js +6 -5
- package/dist/services/kg/OrparGraphIntegration.js.map +1 -1
- package/dist/services/orpar-memory/CycleConsolidationTrigger.d.ts +1 -0
- package/dist/services/orpar-memory/CycleConsolidationTrigger.d.ts.map +1 -1
- package/dist/services/orpar-memory/CycleConsolidationTrigger.js +8 -1
- package/dist/services/orpar-memory/CycleConsolidationTrigger.js.map +1 -1
- package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts +8 -1
- package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts.map +1 -1
- package/dist/services/orpar-memory/OrparMemoryCoordinator.js +93 -45
- package/dist/services/orpar-memory/OrparMemoryCoordinator.js.map +1 -1
- package/dist/services/orpar-memory/SurpriseOrparAdapter.d.ts +1 -0
- package/dist/services/orpar-memory/SurpriseOrparAdapter.d.ts.map +1 -1
- package/dist/services/orpar-memory/SurpriseOrparAdapter.js +8 -1
- package/dist/services/orpar-memory/SurpriseOrparAdapter.js.map +1 -1
- package/dist/types/ChannelContext.d.ts +2 -1
- package/dist/types/ChannelContext.d.ts.map +1 -1
- package/dist/types/EffectivenessTypes.d.ts +4 -1
- package/dist/types/EffectivenessTypes.d.ts.map +1 -1
- package/dist/types/TaskCompletionTypes.d.ts +7 -5
- package/dist/types/TaskCompletionTypes.d.ts.map +1 -1
- package/dist/types/TaskTypes.d.ts +8 -1
- package/dist/types/TaskTypes.d.ts.map +1 -1
- package/dist/utils/GlobMatcher.d.ts +37 -0
- package/dist/utils/GlobMatcher.d.ts.map +1 -0
- package/dist/utils/GlobMatcher.js +131 -0
- package/dist/utils/GlobMatcher.js.map +1 -0
- package/package.json +1 -1
- package/src/config/ModelContextLimits.ts +7 -1
- package/src/constants/CoreTools.ts +6 -5
- package/src/constants/DefaultPhaseProfiles.ts +29 -0
- package/src/constants/ReservedIdentities.ts +51 -0
- package/src/database/adapters/mongodb/MongoKnowledgeGraphRepository.ts +115 -36
- package/src/events/ClientEventBus.ts +117 -48
- package/src/events/EventBus.ts +32 -2
- package/src/events/EventBusBase.ts +132 -39
- package/src/events/EventNames.ts +43 -36
- package/src/events/PublicEvents.ts +8 -0
- package/src/events/ServerEventBus.ts +9 -128
- package/src/events/event-definitions/ControlLoopEvents.ts +12 -0
- package/src/events/event-definitions/SdkEvents.ts +58 -0
- package/src/events/event-definitions/TaskEvents.ts +2 -2
- package/src/index.ts +15 -0
- package/src/interfaces/AgentInterfaces.ts +5 -0
- package/src/interfaces/ChannelConfig.ts +2 -2
- package/src/interfaces/ConversationMessage.ts +5 -0
- package/src/interfaces/IMemoryPersistence.ts +55 -1
- package/src/interfaces/SocketServiceInterface.ts +3 -2
- package/src/interfaces/TaskInterfaces.ts +16 -1
- package/src/models/agent.ts +0 -6
- package/src/models/agentIdentityReservation.ts +77 -0
- package/src/models/channel.ts +2 -0
- package/src/models/channelKey.ts +10 -0
- package/src/models/memory.ts +18 -19
- package/src/models/memoryStrata.ts +9 -23
- package/src/models/plan.ts +3 -3
- package/src/models/taskEffectiveness.ts +9 -2
- package/src/models/user.ts +12 -0
- package/src/protocols/mcp/LlmTestEnvironmentGuard.ts +30 -0
- package/src/protocols/mcp/McpServerTypes.ts +9 -0
- package/src/protocols/mcp/providers/AnthropicMcpClient.ts +2 -0
- package/src/protocols/mcp/providers/AzureOpenAiMcpClient.ts +1 -0
- package/src/protocols/mcp/providers/BaseMcpClient.ts +13 -0
- package/src/protocols/mcp/providers/CustomMcpClient.ts +7 -0
- package/src/protocols/mcp/providers/GeminiMcpClient.ts +2 -0
- package/src/protocols/mcp/providers/OllamaMcpClient.ts +3 -1
- package/src/protocols/mcp/providers/OpenAiMcpClient.ts +2 -0
- package/src/protocols/mcp/providers/OpenRouterMcpClient.ts +3 -0
- package/src/protocols/mcp/providers/XaiMcpClient.ts +2 -0
- package/src/protocols/mcp/security/BrowserTargetGuard.ts +64 -0
- package/src/protocols/mcp/security/ExternalMcpRegistrationPolicy.ts +38 -0
- package/src/protocols/mcp/security/HttpTargetGuard.ts +77 -6
- package/src/protocols/mcp/security/McpSecurityGuard.ts +7 -5
- package/src/protocols/mcp/security/McpToolPolicy.ts +74 -0
- package/src/protocols/mcp/services/ExternalMcpServerManager.ts +146 -17
- package/src/protocols/mcp/services/ExternalServerConfigs.ts +26 -8
- package/src/protocols/mcp/tools/AnalyticsTools.ts +167 -641
- package/src/protocols/mcp/tools/CodeAnalysisTools.ts +44 -14
- package/src/protocols/mcp/tools/EffectivenessTools.ts +185 -45
- package/src/protocols/mcp/tools/GitTools.ts +15 -5
- package/src/protocols/mcp/tools/InfrastructureTools.ts +42 -90
- package/src/protocols/mcp/tools/JsonTools.ts +7 -4
- package/src/protocols/mcp/tools/KnowledgeGraphTools.ts +313 -164
- package/src/protocols/mcp/tools/MemorySearchTools.ts +158 -46
- package/src/protocols/mcp/tools/MemoryUtilityTools.ts +85 -232
- package/src/protocols/mcp/tools/PlanningTools.ts +137 -59
- package/src/protocols/mcp/tools/ProjectContextTools.ts +33 -12
- package/src/protocols/mcp/tools/SafetyTools.ts +49 -13
- package/src/protocols/mcp/tools/SearchProjectTools.ts +294 -153
- package/src/protocols/mcp/tools/TaskPlanningTools.ts +437 -514
- package/src/protocols/mcp/tools/TestTools.ts +41 -11
- package/src/protocols/mcp/tools/TypeScriptTools.ts +61 -12
- package/src/protocols/mcp/tools/UserInputTools.ts +15 -1
- package/src/protocols/mcp/tools/UserMemoryTools.ts +27 -62
- package/src/protocols/mcp/tools/shell/ShellExecuteHandler.ts +26 -84
- package/src/protocols/mcp/tools/shell/ShellSandbox.ts +13 -31
- package/src/repositories/interfaces/IKnowledgeGraphRepository.ts +45 -27
- package/src/schemas/EventPayloadSchema.ts +45 -1
- package/src/services/AgentPerformanceService.ts +85 -36
- package/src/services/AutoCorrectionService.ts +25 -6
- package/src/services/BackgroundTaskManager.ts +183 -76
- package/src/services/BrowserManager.ts +20 -16
- package/src/services/ChannelContextMemoryOperations.ts +169 -202
- package/src/services/ChannelContextMessageOperations.ts +112 -274
- package/src/services/MemoryService.ts +1053 -760
- package/src/services/PatternLearningService.ts +32 -7
- package/src/services/PerformanceOptimizationService.ts +26 -9
- package/src/services/PredictiveAnalyticsService.ts +23 -10
- package/src/services/ProactiveValidationService.ts +66 -40
- package/src/services/TaskEffectivenessService.ts +421 -206
- package/src/services/ToolExecutionInterceptor.ts +40 -9
- package/src/services/UserInputRequestManager.ts +51 -6
- package/src/services/UserMemoryService.ts +12 -3
- package/src/services/ValidationAnalyticsService.ts +36 -11
- package/src/services/ValidationCacheService.ts +30 -7
- package/src/services/ValidationMiddleware.ts +62 -14
- package/src/services/ValidationPerformanceService.ts +47 -25
- package/src/services/WebSearchService.ts +16 -4
- package/src/services/dag/TaskDagService.ts +20 -1
- package/src/services/kg/EntityQValueManager.ts +21 -10
- package/src/services/kg/GraphSurpriseCalculator.ts +0 -14
- package/src/services/kg/KnowledgeGraphService.ts +56 -48
- package/src/services/kg/OrparGraphIntegration.ts +11 -5
- package/src/services/orpar-memory/CycleConsolidationTrigger.ts +10 -1
- package/src/services/orpar-memory/OrparMemoryCoordinator.ts +142 -71
- package/src/services/orpar-memory/SurpriseOrparAdapter.ts +10 -1
- package/src/types/ChannelContext.ts +3 -1
- package/src/types/EffectivenessTypes.ts +6 -2
- package/src/types/TaskCompletionTypes.ts +9 -9
- package/src/types/TaskTypes.ts +12 -1
- package/src/utils/GlobMatcher.ts +157 -0
|
@@ -31,8 +31,7 @@ import { EventBus } from '../events/EventBus.js';
|
|
|
31
31
|
import { Events } from '../events/EventNames.js';
|
|
32
32
|
import { AgentId } from '../types/Agent.js';
|
|
33
33
|
import { ChannelId } from '../types/ChannelContext.js';
|
|
34
|
-
import {
|
|
35
|
-
import { TaskEffectivenessModel, ITaskEffectiveness } from '../models/taskEffectiveness.js';
|
|
34
|
+
import { TaskEffectivenessModel } from '../models/taskEffectiveness.js';
|
|
36
35
|
import {
|
|
37
36
|
TaskEffectivenessMetrics,
|
|
38
37
|
TaskDefinition,
|
|
@@ -42,12 +41,42 @@ import {
|
|
|
42
41
|
EffectivenessConfig
|
|
43
42
|
} from '../types/EffectivenessTypes.js';
|
|
44
43
|
|
|
44
|
+
interface PersistedEffectivenessRecord {
|
|
45
|
+
agentId: AgentId;
|
|
46
|
+
channelId: ChannelId;
|
|
47
|
+
metrics: TaskEffectivenessMetrics;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface EffectivenessTrendDataPoint {
|
|
51
|
+
timestamp: number;
|
|
52
|
+
averageScore: number;
|
|
53
|
+
successRate: number;
|
|
54
|
+
avgAutonomy: number;
|
|
55
|
+
taskCount: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface EffectivenessTrends {
|
|
59
|
+
dataPoints: EffectivenessTrendDataPoint[];
|
|
60
|
+
intervalMs: number;
|
|
61
|
+
timeRange: { start: number; end: number };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface AgentEffectivenessSummary {
|
|
65
|
+
agentId: AgentId;
|
|
66
|
+
totalTasks: number;
|
|
67
|
+
successRate: number;
|
|
68
|
+
averageScore: number;
|
|
69
|
+
averageAutonomy: number;
|
|
70
|
+
taskTypeBreakdown: Array<{ type: string; count: number }>;
|
|
71
|
+
trend: 'improving' | 'stable' | 'declining';
|
|
72
|
+
timeRange: { start: number; end: number };
|
|
73
|
+
}
|
|
74
|
+
|
|
45
75
|
/**
|
|
46
76
|
* Service for tracking and analyzing task effectiveness
|
|
47
77
|
*/
|
|
48
78
|
export class TaskEffectivenessService {
|
|
49
79
|
private readonly logger: Logger;
|
|
50
|
-
private readonly performanceService: AgentPerformanceService;
|
|
51
80
|
private static instance: TaskEffectivenessService;
|
|
52
81
|
|
|
53
82
|
// Active task tracking
|
|
@@ -76,7 +105,6 @@ export class TaskEffectivenessService {
|
|
|
76
105
|
|
|
77
106
|
private constructor() {
|
|
78
107
|
this.logger = new Logger('info', 'TaskEffectivenessService', 'server');
|
|
79
|
-
this.performanceService = AgentPerformanceService.getInstance();
|
|
80
108
|
this.setupEventListeners();
|
|
81
109
|
}
|
|
82
110
|
|
|
@@ -87,78 +115,103 @@ export class TaskEffectivenessService {
|
|
|
87
115
|
return TaskEffectivenessService.instance;
|
|
88
116
|
}
|
|
89
117
|
|
|
118
|
+
private getTaskKey(taskId: string, agentId: AgentId, channelId: ChannelId): string {
|
|
119
|
+
return JSON.stringify([agentId, channelId, taskId]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private requireTenantIdentity(agentId: AgentId, channelId: ChannelId): void {
|
|
123
|
+
if (!agentId?.trim() || !channelId?.trim() ||
|
|
124
|
+
agentId !== agentId.trim() || channelId !== channelId.trim()) {
|
|
125
|
+
throw new Error('Agent ID and channel ID are required');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private requireTaskIdentity(taskId: string): void {
|
|
130
|
+
if (!taskId?.trim() || taskId !== taskId.trim()) {
|
|
131
|
+
throw new Error('A canonical task ID is required');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
90
135
|
/**
|
|
91
136
|
* Start tracking a new task
|
|
92
137
|
*/
|
|
93
138
|
public startTask(definition: TaskDefinition): string {
|
|
94
139
|
try {
|
|
95
|
-
if (!definition.channelId || !definition.taskType || !definition.description) {
|
|
140
|
+
if (!definition.agentId || !definition.channelId || !definition.taskType || !definition.description) {
|
|
96
141
|
throw new Error('Missing required task definition fields');
|
|
97
142
|
}
|
|
143
|
+
this.requireTenantIdentity(definition.agentId, definition.channelId);
|
|
98
144
|
|
|
99
145
|
const taskId = definition.taskId || uuidv4();
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
type: definition.taskType,
|
|
105
|
-
description: definition.description,
|
|
106
|
-
startTime: Date.now(),
|
|
107
|
-
status: 'in_progress'
|
|
108
|
-
},
|
|
109
|
-
performance: {
|
|
110
|
-
stepCount: 0,
|
|
111
|
-
toolsUsed: 0,
|
|
112
|
-
uniqueTools: [],
|
|
113
|
-
agentInteractions: 0,
|
|
114
|
-
humanInterventions: 0,
|
|
115
|
-
autonomyScore: 1.0 // Starts at 100%, decreases with interventions
|
|
116
|
-
},
|
|
117
|
-
quality: {
|
|
118
|
-
goalAchieved: false,
|
|
119
|
-
completenessScore: 0,
|
|
120
|
-
iterationCount: 0,
|
|
121
|
-
errorCount: 0,
|
|
122
|
-
customMetrics: {}
|
|
123
|
-
},
|
|
124
|
-
resources: {
|
|
125
|
-
totalComputeTime: 0,
|
|
126
|
-
peakConcurrentAgents: 0,
|
|
127
|
-
memoryOperations: 0
|
|
128
|
-
},
|
|
129
|
-
collaboration: {
|
|
130
|
-
participatingAgents: [],
|
|
131
|
-
messageCount: 0,
|
|
132
|
-
coordinationCount: 0,
|
|
133
|
-
knowledgeTransfers: 0,
|
|
134
|
-
collaborationScore: 0
|
|
146
|
+
this.requireTaskIdentity(taskId);
|
|
147
|
+
const taskKey = this.getTaskKey(taskId, definition.agentId, definition.channelId);
|
|
148
|
+
if (this.activeTasks.has(taskKey)) {
|
|
149
|
+
throw new Error(`Task ${taskId} is already being tracked for this agent and channel`);
|
|
135
150
|
}
|
|
136
|
-
};
|
|
137
151
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
const metrics: TaskEffectivenessMetrics = {
|
|
153
|
+
taskId,
|
|
154
|
+
metadata: {
|
|
155
|
+
type: definition.taskType,
|
|
156
|
+
description: definition.description,
|
|
157
|
+
startTime: Date.now(),
|
|
158
|
+
status: 'in_progress'
|
|
159
|
+
},
|
|
160
|
+
performance: {
|
|
161
|
+
stepCount: 0,
|
|
162
|
+
toolsUsed: 0,
|
|
163
|
+
uniqueTools: [],
|
|
164
|
+
agentInteractions: 0,
|
|
165
|
+
humanInterventions: 0,
|
|
166
|
+
autonomyScore: 1.0
|
|
167
|
+
},
|
|
168
|
+
quality: {
|
|
169
|
+
goalAchieved: false,
|
|
170
|
+
completenessScore: 0,
|
|
171
|
+
iterationCount: 0,
|
|
172
|
+
errorCount: 0,
|
|
173
|
+
customMetrics: {}
|
|
174
|
+
},
|
|
175
|
+
resources: {
|
|
176
|
+
totalComputeTime: 0,
|
|
177
|
+
peakConcurrentAgents: 0,
|
|
178
|
+
memoryOperations: 0
|
|
179
|
+
},
|
|
180
|
+
collaboration: {
|
|
181
|
+
participatingAgents: [definition.agentId],
|
|
182
|
+
messageCount: 0,
|
|
183
|
+
coordinationCount: 0,
|
|
184
|
+
knowledgeTransfers: 0,
|
|
185
|
+
collaborationScore: 0
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
this.activeTasks.set(taskKey, metrics);
|
|
190
|
+
this.taskDefinitions.set(taskKey, definition);
|
|
191
|
+
this.taskEvents.set(taskKey, []);
|
|
192
|
+
|
|
193
|
+
this.recordEvent({
|
|
194
|
+
eventId: uuidv4(),
|
|
156
195
|
taskId,
|
|
196
|
+
agentId: definition.agentId,
|
|
157
197
|
channelId: definition.channelId,
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
198
|
+
timestamp: Date.now(),
|
|
199
|
+
type: 'start',
|
|
200
|
+
details: { definition }
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
EventBus.server.emit(Events.Analytics.TASK_STARTED, createBaseEventPayload(
|
|
204
|
+
Events.Analytics.TASK_STARTED,
|
|
205
|
+
definition.agentId,
|
|
206
|
+
definition.channelId,
|
|
207
|
+
{
|
|
208
|
+
taskId,
|
|
209
|
+
agentId: definition.agentId,
|
|
210
|
+
channelId: definition.channelId,
|
|
211
|
+
taskType: definition.taskType,
|
|
212
|
+
timestamp: new Date()
|
|
213
|
+
}
|
|
214
|
+
));
|
|
162
215
|
|
|
163
216
|
return taskId;
|
|
164
217
|
} catch (error) {
|
|
@@ -171,82 +224,85 @@ export class TaskEffectivenessService {
|
|
|
171
224
|
* Record a task execution event
|
|
172
225
|
*/
|
|
173
226
|
public recordEvent(event: TaskExecutionEvent): void {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
// Update metrics based on event
|
|
186
|
-
const metrics = this.activeTasks.get(event.taskId);
|
|
187
|
-
if (metrics) {
|
|
188
|
-
this.updateMetricsFromEvent(metrics, event);
|
|
189
|
-
} else {
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Emit event for analytics tracking
|
|
193
|
-
EventBus.server.emit(Events.Analytics.TASK_EFFECTIVENESS_EVENT, createBaseEventPayload(
|
|
194
|
-
Events.Analytics.TASK_EFFECTIVENESS_EVENT,
|
|
195
|
-
event.agentId || 'unknown',
|
|
196
|
-
'global',
|
|
197
|
-
{
|
|
198
|
-
taskId: event.taskId,
|
|
199
|
-
agentId: event.agentId || 'unknown',
|
|
200
|
-
eventType: event.type,
|
|
201
|
-
details: event.details,
|
|
202
|
-
timestamp: new Date()
|
|
203
|
-
}
|
|
204
|
-
));
|
|
205
|
-
} catch (error) {
|
|
206
|
-
this.logger.error(`Failed to record event: ${error}`);
|
|
227
|
+
if (!event.taskId || !event.type) {
|
|
228
|
+
throw new Error('Task ID and event type are required');
|
|
229
|
+
}
|
|
230
|
+
this.requireTaskIdentity(event.taskId);
|
|
231
|
+
this.requireTenantIdentity(event.agentId, event.channelId);
|
|
232
|
+
|
|
233
|
+
const taskKey = this.getTaskKey(event.taskId, event.agentId, event.channelId);
|
|
234
|
+
const events = this.taskEvents.get(taskKey);
|
|
235
|
+
const metrics = this.activeTasks.get(taskKey);
|
|
236
|
+
if (!events || !metrics) {
|
|
237
|
+
throw new Error(`Active task ${event.taskId} was not found for this agent and channel`);
|
|
207
238
|
}
|
|
239
|
+
|
|
240
|
+
events.push(event);
|
|
241
|
+
this.updateMetricsFromEvent(metrics, event);
|
|
242
|
+
|
|
243
|
+
EventBus.server.emit(Events.Analytics.TASK_EFFECTIVENESS_EVENT, createBaseEventPayload(
|
|
244
|
+
Events.Analytics.TASK_EFFECTIVENESS_EVENT,
|
|
245
|
+
event.agentId,
|
|
246
|
+
event.channelId,
|
|
247
|
+
{
|
|
248
|
+
taskId: event.taskId,
|
|
249
|
+
agentId: event.agentId,
|
|
250
|
+
channelId: event.channelId,
|
|
251
|
+
eventType: event.type,
|
|
252
|
+
details: event.details,
|
|
253
|
+
timestamp: new Date()
|
|
254
|
+
}
|
|
255
|
+
));
|
|
208
256
|
}
|
|
209
257
|
|
|
210
258
|
/**
|
|
211
259
|
* Update task quality metrics
|
|
212
260
|
*/
|
|
213
261
|
public updateQuality(
|
|
214
|
-
taskId: string,
|
|
215
|
-
|
|
216
|
-
|
|
262
|
+
taskId: string,
|
|
263
|
+
agentId: AgentId,
|
|
264
|
+
channelId: ChannelId,
|
|
265
|
+
updates: Partial<TaskEffectivenessMetrics['quality']>
|
|
217
266
|
): void {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
// Emit quality update event
|
|
225
|
-
EventBus.server.emit(Events.Analytics.TASK_EFFECTIVENESS_QUALITY_UPDATE, createBaseEventPayload(
|
|
226
|
-
Events.Analytics.TASK_EFFECTIVENESS_QUALITY_UPDATE,
|
|
227
|
-
agentId || 'unknown',
|
|
228
|
-
'global',
|
|
229
|
-
{
|
|
230
|
-
taskId,
|
|
231
|
-
agentId: agentId || 'unknown',
|
|
232
|
-
qualityUpdates: updates,
|
|
233
|
-
timestamp: new Date()
|
|
234
|
-
}
|
|
235
|
-
));
|
|
267
|
+
this.requireTenantIdentity(agentId, channelId);
|
|
268
|
+
this.requireTaskIdentity(taskId);
|
|
269
|
+
const taskKey = this.getTaskKey(taskId, agentId, channelId);
|
|
270
|
+
const metrics = this.activeTasks.get(taskKey);
|
|
271
|
+
if (!metrics) {
|
|
272
|
+
throw new Error(`Active task ${taskId} was not found for this agent and channel`);
|
|
236
273
|
}
|
|
274
|
+
|
|
275
|
+
metrics.quality = { ...metrics.quality, ...updates };
|
|
276
|
+
|
|
277
|
+
EventBus.server.emit(Events.Analytics.TASK_EFFECTIVENESS_QUALITY_UPDATE, createBaseEventPayload(
|
|
278
|
+
Events.Analytics.TASK_EFFECTIVENESS_QUALITY_UPDATE,
|
|
279
|
+
agentId,
|
|
280
|
+
channelId,
|
|
281
|
+
{
|
|
282
|
+
taskId,
|
|
283
|
+
agentId,
|
|
284
|
+
channelId,
|
|
285
|
+
qualityUpdates: updates,
|
|
286
|
+
timestamp: new Date()
|
|
287
|
+
}
|
|
288
|
+
));
|
|
237
289
|
}
|
|
238
290
|
|
|
239
291
|
/**
|
|
240
292
|
* Complete a task and calculate final metrics
|
|
241
293
|
*/
|
|
242
294
|
public async completeTask(
|
|
243
|
-
taskId: string,
|
|
295
|
+
taskId: string,
|
|
296
|
+
agentId: AgentId,
|
|
297
|
+
channelId: ChannelId,
|
|
244
298
|
success: boolean,
|
|
245
299
|
customMetrics?: Record<string, number>
|
|
246
300
|
): Promise<TaskEffectivenessMetrics | null> {
|
|
247
|
-
|
|
301
|
+
this.requireTenantIdentity(agentId, channelId);
|
|
302
|
+
this.requireTaskIdentity(taskId);
|
|
303
|
+
const taskKey = this.getTaskKey(taskId, agentId, channelId);
|
|
304
|
+
const metrics = this.activeTasks.get(taskKey);
|
|
248
305
|
if (!metrics) {
|
|
249
|
-
this.logger.warn(`Cannot complete unknown task ${taskId}`);
|
|
250
306
|
return null;
|
|
251
307
|
}
|
|
252
308
|
|
|
@@ -267,16 +323,18 @@ export class TaskEffectivenessService {
|
|
|
267
323
|
|
|
268
324
|
// Persist to MongoDB, then drop from the active set. Persist first: if
|
|
269
325
|
// it throws, the task stays active rather than disappearing entirely.
|
|
270
|
-
await this.persistTaskToDB(taskId, metrics);
|
|
271
|
-
this.activeTasks.delete(
|
|
326
|
+
await this.persistTaskToDB(taskId, agentId, channelId, metrics);
|
|
327
|
+
this.activeTasks.delete(taskKey);
|
|
272
328
|
|
|
273
329
|
// Emit completion event
|
|
274
330
|
EventBus.server.emit(Events.Analytics.TASK_COMPLETED, createBaseEventPayload(
|
|
275
331
|
Events.Analytics.TASK_COMPLETED,
|
|
276
|
-
|
|
277
|
-
|
|
332
|
+
agentId,
|
|
333
|
+
channelId,
|
|
278
334
|
{
|
|
279
335
|
taskId,
|
|
336
|
+
agentId,
|
|
337
|
+
channelId,
|
|
280
338
|
metrics,
|
|
281
339
|
success,
|
|
282
340
|
timestamp: new Date()
|
|
@@ -294,12 +352,19 @@ export class TaskEffectivenessService {
|
|
|
294
352
|
*
|
|
295
353
|
* @returns null when the task or its definition is unknown
|
|
296
354
|
*/
|
|
297
|
-
public async compareWithBaseline(
|
|
298
|
-
|
|
299
|
-
|
|
355
|
+
public async compareWithBaseline(
|
|
356
|
+
taskId: string,
|
|
357
|
+
agentId: AgentId,
|
|
358
|
+
channelId: ChannelId
|
|
359
|
+
): Promise<EffectivenessComparison | null> {
|
|
360
|
+
this.requireTenantIdentity(agentId, channelId);
|
|
361
|
+
this.requireTaskIdentity(taskId);
|
|
362
|
+
const taskKey = this.getTaskKey(taskId, agentId, channelId);
|
|
363
|
+
let metrics = this.activeTasks.get(taskKey);
|
|
364
|
+
let definition = this.taskDefinitions.get(taskKey);
|
|
300
365
|
|
|
301
366
|
if (!metrics || !definition) {
|
|
302
|
-
const taskDoc = await TaskEffectivenessModel.findOne({ taskId }).exec();
|
|
367
|
+
const taskDoc = await TaskEffectivenessModel.findOne({ taskId, agentId, channelId }).exec();
|
|
303
368
|
if (taskDoc) {
|
|
304
369
|
metrics = metrics ?? (taskDoc.metrics as TaskEffectivenessMetrics);
|
|
305
370
|
definition = definition ?? (taskDoc.definition as TaskDefinition);
|
|
@@ -350,33 +415,44 @@ export class TaskEffectivenessService {
|
|
|
350
415
|
// Generate insights
|
|
351
416
|
comparison.summary.achievements = this.identifyAchievements(metrics, baseline);
|
|
352
417
|
comparison.summary.improvements = this.identifyImprovements(metrics);
|
|
353
|
-
comparison.summary.recommendations = this.generateRecommendations(metrics);
|
|
418
|
+
comparison.summary.recommendations = this.generateRecommendations(metrics, taskKey);
|
|
354
419
|
|
|
355
420
|
return comparison;
|
|
356
421
|
}
|
|
357
422
|
|
|
358
|
-
/**
|
|
359
|
-
* Effectiveness analytics for a time period, computed from persisted tasks.
|
|
360
|
-
*
|
|
361
|
-
* Reads from MongoDB, so results cover every task ever completed — not just
|
|
362
|
-
* the ones this process happened to run.
|
|
363
|
-
*
|
|
364
|
-
* @param startTime Start of the window (epoch ms)
|
|
365
|
-
* @param endTime End of the window (epoch ms)
|
|
366
|
-
* @param channelId Optional channel filter
|
|
367
|
-
* @param taskType Optional task-type filter
|
|
368
|
-
* @throws If the query fails. Effectiveness numbers computed from an empty
|
|
369
|
-
* result set would look like real "no activity" data.
|
|
370
|
-
*/
|
|
423
|
+
/** Effectiveness analytics for one exact agent and channel. */
|
|
371
424
|
public async getAnalytics(
|
|
372
425
|
startTime: number,
|
|
373
426
|
endTime: number,
|
|
374
|
-
|
|
427
|
+
agentId: AgentId,
|
|
428
|
+
channelId: ChannelId,
|
|
375
429
|
taskType?: string
|
|
376
430
|
): Promise<EffectivenessAnalytics> {
|
|
431
|
+
this.requireTenantIdentity(agentId, channelId);
|
|
432
|
+
const tasks = await this.findCompletedTasks({
|
|
433
|
+
startTime,
|
|
434
|
+
endTime,
|
|
435
|
+
agentId,
|
|
436
|
+
channelId,
|
|
437
|
+
taskType
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
return this.computeAnalyticsFromRecords(tasks, startTime, endTime);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/** Channel-wide analytics intended only for the admin-authenticated REST surface. */
|
|
444
|
+
public async getAdministrativeChannelAnalytics(
|
|
445
|
+
startTime: number,
|
|
446
|
+
endTime: number,
|
|
447
|
+
channelId: ChannelId,
|
|
448
|
+
taskType?: string
|
|
449
|
+
): Promise<EffectivenessAnalytics> {
|
|
450
|
+
if (!channelId?.trim()) {
|
|
451
|
+
throw new Error('Channel ID is required');
|
|
452
|
+
}
|
|
377
453
|
const tasks = await this.findCompletedTasks({ startTime, endTime, channelId, taskType });
|
|
378
454
|
|
|
379
|
-
return this.
|
|
455
|
+
return this.computeAnalyticsFromRecords(tasks, startTime, endTime);
|
|
380
456
|
}
|
|
381
457
|
|
|
382
458
|
/**
|
|
@@ -390,11 +466,15 @@ export class TaskEffectivenessService {
|
|
|
390
466
|
channelId?: ChannelId;
|
|
391
467
|
taskType?: string;
|
|
392
468
|
agentId?: AgentId;
|
|
393
|
-
}): Promise<
|
|
469
|
+
}): Promise<PersistedEffectivenessRecord[]> {
|
|
394
470
|
const query: Record<string, unknown> = {
|
|
395
471
|
'metrics.metadata.startTime': { $gte: filter.startTime, $lte: filter.endTime }
|
|
396
472
|
};
|
|
397
473
|
|
|
474
|
+
if (!Number.isFinite(filter.startTime) || !Number.isFinite(filter.endTime) || filter.startTime > filter.endTime) {
|
|
475
|
+
throw new Error('A valid effectiveness analytics time range is required');
|
|
476
|
+
}
|
|
477
|
+
|
|
398
478
|
if (filter.channelId) {
|
|
399
479
|
query.channelId = filter.channelId;
|
|
400
480
|
}
|
|
@@ -404,12 +484,21 @@ export class TaskEffectivenessService {
|
|
|
404
484
|
}
|
|
405
485
|
|
|
406
486
|
if (filter.agentId) {
|
|
407
|
-
query.
|
|
487
|
+
query.agentId = filter.agentId;
|
|
408
488
|
}
|
|
409
489
|
|
|
410
490
|
try {
|
|
411
491
|
const docs = await TaskEffectivenessModel.find(query).exec();
|
|
412
|
-
return docs.map(doc =>
|
|
492
|
+
return docs.map(doc => {
|
|
493
|
+
if (!doc.agentId || !doc.channelId) {
|
|
494
|
+
throw new Error(`Task effectiveness record ${doc.taskId} has no tenant identity`);
|
|
495
|
+
}
|
|
496
|
+
return {
|
|
497
|
+
agentId: doc.agentId as AgentId,
|
|
498
|
+
channelId: doc.channelId as ChannelId,
|
|
499
|
+
metrics: doc.metrics as TaskEffectivenessMetrics
|
|
500
|
+
};
|
|
501
|
+
});
|
|
413
502
|
} catch (error) {
|
|
414
503
|
const message = error instanceof Error ? error.message : String(error);
|
|
415
504
|
this.logger.error(`Failed to query task effectiveness data: ${message}`);
|
|
@@ -424,25 +513,33 @@ export class TaskEffectivenessService {
|
|
|
424
513
|
* that is not written down is history that is simply gone; the caller
|
|
425
514
|
* needs to know.
|
|
426
515
|
*/
|
|
427
|
-
private async persistTaskToDB(
|
|
428
|
-
|
|
516
|
+
private async persistTaskToDB(
|
|
517
|
+
taskId: string,
|
|
518
|
+
agentId: AgentId,
|
|
519
|
+
channelId: ChannelId,
|
|
520
|
+
metrics: TaskEffectivenessMetrics
|
|
521
|
+
): Promise<void> {
|
|
522
|
+
const taskKey = this.getTaskKey(taskId, agentId, channelId);
|
|
523
|
+
const definition = this.taskDefinitions.get(taskKey);
|
|
429
524
|
if (!definition) {
|
|
430
525
|
throw new Error(`Cannot persist task ${taskId}: no task definition was registered for it`);
|
|
431
526
|
}
|
|
432
527
|
|
|
433
528
|
try {
|
|
434
529
|
await TaskEffectivenessModel.findOneAndUpdate(
|
|
435
|
-
{ taskId },
|
|
530
|
+
{ taskId, agentId, channelId },
|
|
436
531
|
{
|
|
437
532
|
$set: {
|
|
438
|
-
|
|
533
|
+
agentId,
|
|
534
|
+
channelId,
|
|
439
535
|
agentIds: metrics.collaboration.participatingAgents,
|
|
440
536
|
definition,
|
|
441
537
|
metrics,
|
|
538
|
+
completedAt: new Date(),
|
|
442
539
|
updatedAt: new Date()
|
|
443
540
|
}
|
|
444
541
|
},
|
|
445
|
-
{ upsert: true, new: true }
|
|
542
|
+
{ upsert: true, new: true, runValidators: true, setDefaultsOnInsert: true }
|
|
446
543
|
).exec();
|
|
447
544
|
} catch (error) {
|
|
448
545
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -454,8 +551,8 @@ export class TaskEffectivenessService {
|
|
|
454
551
|
/**
|
|
455
552
|
* Compute analytics from metrics array
|
|
456
553
|
*/
|
|
457
|
-
private
|
|
458
|
-
|
|
554
|
+
private computeAnalyticsFromRecords(
|
|
555
|
+
records: PersistedEffectivenessRecord[],
|
|
459
556
|
startTime: number,
|
|
460
557
|
endTime: number
|
|
461
558
|
): EffectivenessAnalytics {
|
|
@@ -476,8 +573,7 @@ export class TaskEffectivenessService {
|
|
|
476
573
|
}
|
|
477
574
|
};
|
|
478
575
|
|
|
479
|
-
|
|
480
|
-
for (const task of tasks) {
|
|
576
|
+
for (const { metrics: task } of records) {
|
|
481
577
|
const type = task.metadata.type;
|
|
482
578
|
if (!analytics.byTaskType[type]) {
|
|
483
579
|
analytics.byTaskType[type] = {
|
|
@@ -508,11 +604,62 @@ export class TaskEffectivenessService {
|
|
|
508
604
|
|
|
509
605
|
// Calculate success rates
|
|
510
606
|
for (const [type, stats] of Object.entries(analytics.byTaskType)) {
|
|
511
|
-
const typeTasks =
|
|
607
|
+
const typeTasks = records
|
|
608
|
+
.map(record => record.metrics)
|
|
609
|
+
.filter(task => task.metadata.type === type);
|
|
512
610
|
const successful = typeTasks.filter(t => t.quality.goalAchieved).length;
|
|
513
611
|
stats.successRate = typeTasks.length > 0 ? successful / typeTasks.length : 0;
|
|
514
612
|
}
|
|
515
613
|
|
|
614
|
+
const channelIds = Array.from(new Set(records.map(record => record.channelId)));
|
|
615
|
+
for (const channelId of channelIds) {
|
|
616
|
+
const channelRecords = records.filter(record => record.channelId === channelId);
|
|
617
|
+
const agentScores = new Map<AgentId, number[]>();
|
|
618
|
+
for (const record of channelRecords) {
|
|
619
|
+
const scores = agentScores.get(record.agentId) ?? [];
|
|
620
|
+
scores.push(this.calculateOverallScore(record.metrics));
|
|
621
|
+
agentScores.set(record.agentId, scores);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
analytics.byChannel[channelId] = {
|
|
625
|
+
totalTasks: channelRecords.length,
|
|
626
|
+
completedTasks: channelRecords.filter(
|
|
627
|
+
record => record.metrics.metadata.status === 'completed'
|
|
628
|
+
).length,
|
|
629
|
+
avgEffectivenessScore: channelRecords.length === 0
|
|
630
|
+
? 0
|
|
631
|
+
: channelRecords.reduce(
|
|
632
|
+
(sum, record) => sum + this.calculateOverallScore(record.metrics),
|
|
633
|
+
0
|
|
634
|
+
) / channelRecords.length,
|
|
635
|
+
topPerformingAgents: Array.from(agentScores.entries())
|
|
636
|
+
.sort(([, left], [, right]) => {
|
|
637
|
+
const leftAverage = left.reduce((sum, score) => sum + score, 0) / left.length;
|
|
638
|
+
const rightAverage = right.reduce((sum, score) => sum + score, 0) / right.length;
|
|
639
|
+
return rightAverage - leftAverage;
|
|
640
|
+
})
|
|
641
|
+
.map(([agentId]) => agentId)
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
analytics.trends.effectivenessOverTime = records
|
|
646
|
+
.map(record => ({
|
|
647
|
+
timestamp: record.metrics.metadata.startTime,
|
|
648
|
+
avgScore: this.calculateOverallScore(record.metrics),
|
|
649
|
+
taskCount: 1
|
|
650
|
+
}))
|
|
651
|
+
.sort((left, right) => left.timestamp - right.timestamp);
|
|
652
|
+
|
|
653
|
+
if (analytics.trends.effectivenessOverTime.length > 1) {
|
|
654
|
+
const first = analytics.trends.effectivenessOverTime[0].avgScore;
|
|
655
|
+
const last = analytics.trends.effectivenessOverTime.at(-1)!.avgScore;
|
|
656
|
+
if (last > first) {
|
|
657
|
+
analytics.trends.improving.push('overall_effectiveness');
|
|
658
|
+
} else if (last < first) {
|
|
659
|
+
analytics.trends.declining.push('overall_effectiveness');
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
|
|
516
663
|
// Identify patterns
|
|
517
664
|
analytics.patterns.highPerformanceTasks = Object.entries(analytics.byTaskType)
|
|
518
665
|
.filter(([_, stats]) => stats.successRate > 0.8 && stats.avgAutonomyScore > 0.7)
|
|
@@ -522,6 +669,13 @@ export class TaskEffectivenessService {
|
|
|
522
669
|
.filter(([_, stats]) => stats.successRate < 0.5 || stats.avgAutonomyScore < 0.3)
|
|
523
670
|
.map(([type]) => type);
|
|
524
671
|
|
|
672
|
+
const teamRecords = records.filter(record => record.metrics.collaboration.participatingAgents.length > 1);
|
|
673
|
+
analytics.patterns.effectiveTeams = teamRecords.map(record => ({
|
|
674
|
+
agents: [...record.metrics.collaboration.participatingAgents].sort(),
|
|
675
|
+
taskTypes: [record.metrics.metadata.type],
|
|
676
|
+
avgScore: this.calculateOverallScore(record.metrics)
|
|
677
|
+
}));
|
|
678
|
+
|
|
525
679
|
return analytics;
|
|
526
680
|
}
|
|
527
681
|
|
|
@@ -534,13 +688,14 @@ export class TaskEffectivenessService {
|
|
|
534
688
|
metrics.performance.stepCount++;
|
|
535
689
|
break;
|
|
536
690
|
|
|
537
|
-
case 'tool_use':
|
|
691
|
+
case 'tool_use': {
|
|
538
692
|
metrics.performance.toolsUsed++;
|
|
539
693
|
const toolName = event.details.toolName;
|
|
540
694
|
if (toolName && !metrics.performance.uniqueTools.includes(toolName)) {
|
|
541
695
|
metrics.performance.uniqueTools.push(toolName);
|
|
542
696
|
}
|
|
543
697
|
break;
|
|
698
|
+
}
|
|
544
699
|
|
|
545
700
|
case 'agent_join':
|
|
546
701
|
if (event.agentId && !metrics.collaboration.participatingAgents.includes(event.agentId)) {
|
|
@@ -669,7 +824,7 @@ export class TaskEffectivenessService {
|
|
|
669
824
|
/**
|
|
670
825
|
* Generate optimization recommendations
|
|
671
826
|
*/
|
|
672
|
-
private generateRecommendations(metrics: TaskEffectivenessMetrics): string[] {
|
|
827
|
+
private generateRecommendations(metrics: TaskEffectivenessMetrics, taskKey: string): string[] {
|
|
673
828
|
const recommendations: string[] = [];
|
|
674
829
|
|
|
675
830
|
if (metrics.performance.humanInterventions > 0) {
|
|
@@ -681,7 +836,7 @@ export class TaskEffectivenessService {
|
|
|
681
836
|
}
|
|
682
837
|
|
|
683
838
|
if (metrics.quality.errorCount > 0) {
|
|
684
|
-
const commonErrors = this.analyzeCommonErrors(
|
|
839
|
+
const commonErrors = this.analyzeCommonErrors(taskKey);
|
|
685
840
|
if (commonErrors.length > 0) {
|
|
686
841
|
recommendations.push(`Address common errors: ${commonErrors.join(', ')}`);
|
|
687
842
|
}
|
|
@@ -693,8 +848,8 @@ export class TaskEffectivenessService {
|
|
|
693
848
|
/**
|
|
694
849
|
* Analyze common errors for a task
|
|
695
850
|
*/
|
|
696
|
-
private analyzeCommonErrors(
|
|
697
|
-
const events = this.taskEvents.get(
|
|
851
|
+
private analyzeCommonErrors(taskKey: string): string[] {
|
|
852
|
+
const events = this.taskEvents.get(taskKey) || [];
|
|
698
853
|
const errors = events.filter(e => e.type === 'error');
|
|
699
854
|
|
|
700
855
|
// Group by error type
|
|
@@ -715,42 +870,54 @@ export class TaskEffectivenessService {
|
|
|
715
870
|
* Setup event listeners
|
|
716
871
|
*/
|
|
717
872
|
private setupEventListeners(): void {
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
if (payload.
|
|
873
|
+
EventBus.server.on(Events.Mcp.TOOL_CALL, (payload) => {
|
|
874
|
+
const taskId = payload.data?.taskId ?? payload.taskId;
|
|
875
|
+
if (taskId && payload.agentId && payload.channelId) {
|
|
876
|
+
const taskKey = this.getTaskKey(taskId, payload.agentId, payload.channelId);
|
|
877
|
+
if (!this.activeTasks.has(taskKey)) {
|
|
878
|
+
return;
|
|
879
|
+
}
|
|
721
880
|
this.recordEvent({
|
|
722
881
|
eventId: uuidv4(),
|
|
723
|
-
taskId
|
|
882
|
+
taskId,
|
|
724
883
|
timestamp: Date.now(),
|
|
725
884
|
type: 'tool_use',
|
|
726
885
|
agentId: payload.agentId,
|
|
727
|
-
|
|
886
|
+
channelId: payload.channelId,
|
|
887
|
+
details: { toolName: payload.data?.toolName ?? payload.toolName }
|
|
728
888
|
});
|
|
729
889
|
}
|
|
730
890
|
});
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
if (payload.
|
|
891
|
+
|
|
892
|
+
EventBus.server.on(Events.Mcp.TOOL_ERROR, (payload) => {
|
|
893
|
+
const taskId = payload.data?.taskId ?? payload.taskId;
|
|
894
|
+
if (taskId && payload.agentId && payload.channelId) {
|
|
895
|
+
const taskKey = this.getTaskKey(taskId, payload.agentId, payload.channelId);
|
|
896
|
+
if (!this.activeTasks.has(taskKey)) {
|
|
897
|
+
return;
|
|
898
|
+
}
|
|
735
899
|
this.recordEvent({
|
|
736
900
|
eventId: uuidv4(),
|
|
737
|
-
taskId
|
|
901
|
+
taskId,
|
|
738
902
|
timestamp: Date.now(),
|
|
739
903
|
type: 'error',
|
|
740
904
|
agentId: payload.agentId,
|
|
741
|
-
|
|
905
|
+
channelId: payload.channelId,
|
|
906
|
+
details: {
|
|
742
907
|
errorType: 'tool_error',
|
|
743
|
-
toolName: payload.toolName,
|
|
744
|
-
error: payload.error
|
|
908
|
+
toolName: payload.data?.toolName ?? payload.toolName,
|
|
909
|
+
error: payload.data?.error ?? payload.error
|
|
745
910
|
}
|
|
746
911
|
});
|
|
747
912
|
}
|
|
748
913
|
});
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
if (payload.
|
|
753
|
-
const metrics = this.activeTasks.get(
|
|
914
|
+
|
|
915
|
+
EventBus.server.on(Events.Message.CHANNEL_MESSAGE, (payload) => {
|
|
916
|
+
const taskId = payload.data?.taskId ?? payload.taskId;
|
|
917
|
+
if (taskId && payload.agentId && payload.channelId) {
|
|
918
|
+
const metrics = this.activeTasks.get(
|
|
919
|
+
this.getTaskKey(taskId, payload.agentId, payload.channelId)
|
|
920
|
+
);
|
|
754
921
|
if (metrics) {
|
|
755
922
|
metrics.collaboration.messageCount++;
|
|
756
923
|
}
|
|
@@ -758,18 +925,21 @@ export class TaskEffectivenessService {
|
|
|
758
925
|
});
|
|
759
926
|
}
|
|
760
927
|
|
|
761
|
-
/**
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
928
|
+
/** Get task metrics for one exact tenant task. */
|
|
929
|
+
public async getTaskMetrics(
|
|
930
|
+
taskId: string,
|
|
931
|
+
agentId: AgentId,
|
|
932
|
+
channelId: ChannelId
|
|
933
|
+
): Promise<TaskEffectivenessMetrics | null> {
|
|
934
|
+
this.requireTenantIdentity(agentId, channelId);
|
|
935
|
+
this.requireTaskIdentity(taskId);
|
|
936
|
+
const activeTask = this.activeTasks.get(this.getTaskKey(taskId, agentId, channelId));
|
|
767
937
|
if (activeTask) {
|
|
768
938
|
return activeTask;
|
|
769
939
|
}
|
|
770
940
|
|
|
771
941
|
try {
|
|
772
|
-
const taskDoc = await TaskEffectivenessModel.findOne({ taskId }).exec();
|
|
942
|
+
const taskDoc = await TaskEffectivenessModel.findOne({ taskId, agentId, channelId }).exec();
|
|
773
943
|
return taskDoc ? (taskDoc.metrics as TaskEffectivenessMetrics) : null;
|
|
774
944
|
} catch (error) {
|
|
775
945
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -778,29 +948,52 @@ export class TaskEffectivenessService {
|
|
|
778
948
|
}
|
|
779
949
|
}
|
|
780
950
|
|
|
781
|
-
/**
|
|
782
|
-
* Get effectiveness trends over time
|
|
783
|
-
*/
|
|
951
|
+
/** Get effectiveness trends for one exact agent and channel. */
|
|
784
952
|
public async getEffectivenessTrends(
|
|
953
|
+
startTime: number,
|
|
954
|
+
endTime: number,
|
|
955
|
+
intervalMs: number,
|
|
956
|
+
agentId: AgentId,
|
|
957
|
+
channelId: ChannelId
|
|
958
|
+
): Promise<EffectivenessTrends> {
|
|
959
|
+
this.requireTenantIdentity(agentId, channelId);
|
|
960
|
+
const records = await this.findCompletedTasks({ startTime, endTime, agentId, channelId });
|
|
961
|
+
return this.computeEffectivenessTrends(records, startTime, endTime, intervalMs);
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
/** Trend analytics intended only for the admin-authenticated REST surface. */
|
|
965
|
+
public async getAdministrativeEffectivenessTrends(
|
|
785
966
|
startTime: number,
|
|
786
967
|
endTime: number,
|
|
787
968
|
intervalMs: number,
|
|
788
969
|
channelId?: ChannelId
|
|
789
|
-
): Promise<
|
|
790
|
-
const
|
|
791
|
-
|
|
970
|
+
): Promise<EffectivenessTrends> {
|
|
971
|
+
const records = await this.findCompletedTasks({ startTime, endTime, channelId });
|
|
972
|
+
return this.computeEffectivenessTrends(records, startTime, endTime, intervalMs);
|
|
973
|
+
}
|
|
792
974
|
|
|
793
|
-
|
|
794
|
-
|
|
975
|
+
private computeEffectivenessTrends(
|
|
976
|
+
records: PersistedEffectivenessRecord[],
|
|
977
|
+
startTime: number,
|
|
978
|
+
endTime: number,
|
|
979
|
+
intervalMs: number
|
|
980
|
+
): EffectivenessTrends {
|
|
981
|
+
if (!Number.isFinite(intervalMs) || intervalMs <= 0) {
|
|
982
|
+
throw new Error('A positive trend interval is required');
|
|
983
|
+
}
|
|
984
|
+
const dataPoints: EffectivenessTrendDataPoint[] = [];
|
|
985
|
+
const intervals = Math.floor((endTime - startTime) / intervalMs);
|
|
795
986
|
|
|
796
987
|
for (let i = 0; i < intervals; i++) {
|
|
797
988
|
const intervalStart = startTime + (i * intervalMs);
|
|
798
989
|
const intervalEnd = intervalStart + intervalMs;
|
|
799
990
|
|
|
800
|
-
const intervalTasks =
|
|
801
|
-
|
|
802
|
-
task
|
|
803
|
-
|
|
991
|
+
const intervalTasks = records
|
|
992
|
+
.map(record => record.metrics)
|
|
993
|
+
.filter(task =>
|
|
994
|
+
task.metadata.startTime >= intervalStart &&
|
|
995
|
+
task.metadata.startTime < intervalEnd
|
|
996
|
+
);
|
|
804
997
|
|
|
805
998
|
if (intervalTasks.length > 0) {
|
|
806
999
|
const avgScore = intervalTasks.reduce((sum, task) =>
|
|
@@ -829,17 +1022,39 @@ export class TaskEffectivenessService {
|
|
|
829
1022
|
};
|
|
830
1023
|
}
|
|
831
1024
|
|
|
832
|
-
/**
|
|
833
|
-
* Get agent-specific effectiveness
|
|
834
|
-
*/
|
|
1025
|
+
/** Get agent-specific effectiveness in one exact channel. */
|
|
835
1026
|
public async getAgentEffectiveness(
|
|
1027
|
+
agentId: AgentId,
|
|
1028
|
+
startTime: number,
|
|
1029
|
+
endTime: number,
|
|
1030
|
+
channelId: ChannelId
|
|
1031
|
+
): Promise<AgentEffectivenessSummary> {
|
|
1032
|
+
this.requireTenantIdentity(agentId, channelId);
|
|
1033
|
+
const records = await this.findCompletedTasks({ startTime, endTime, channelId, agentId });
|
|
1034
|
+
return this.computeAgentEffectiveness(agentId, records, startTime, endTime);
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
/** Agent analytics intended only for the admin-authenticated REST surface. */
|
|
1038
|
+
public async getAdministrativeAgentEffectiveness(
|
|
836
1039
|
agentId: AgentId,
|
|
837
1040
|
startTime: number,
|
|
838
1041
|
endTime: number,
|
|
839
1042
|
channelId?: ChannelId
|
|
840
|
-
): Promise<
|
|
841
|
-
|
|
842
|
-
|
|
1043
|
+
): Promise<AgentEffectivenessSummary> {
|
|
1044
|
+
if (!agentId?.trim()) {
|
|
1045
|
+
throw new Error('Agent ID is required');
|
|
1046
|
+
}
|
|
1047
|
+
const records = await this.findCompletedTasks({ startTime, endTime, channelId, agentId });
|
|
1048
|
+
return this.computeAgentEffectiveness(agentId, records, startTime, endTime);
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
private computeAgentEffectiveness(
|
|
1052
|
+
agentId: AgentId,
|
|
1053
|
+
records: PersistedEffectivenessRecord[],
|
|
1054
|
+
startTime: number,
|
|
1055
|
+
endTime: number
|
|
1056
|
+
): AgentEffectivenessSummary {
|
|
1057
|
+
const agentTasks = records.map(record => record.metrics);
|
|
843
1058
|
|
|
844
1059
|
const totalTasks = agentTasks.length;
|
|
845
1060
|
const successfulTasks = agentTasks.filter(t => t.quality.goalAchieved).length;
|
|
@@ -892,4 +1107,4 @@ export class TaskEffectivenessService {
|
|
|
892
1107
|
timeRange: { start: startTime, end: endTime }
|
|
893
1108
|
};
|
|
894
1109
|
}
|
|
895
|
-
}
|
|
1110
|
+
}
|