@mxf-dev/core 2.0.4 → 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 +118 -5
- package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts.map +1 -1
- package/dist/protocols/mcp/services/ExternalMcpServerManager.js +499 -98
- 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 +656 -111
- 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
|
@@ -6,68 +6,120 @@
|
|
|
6
6
|
* You may obtain a copy of the License at
|
|
7
7
|
*
|
|
8
8
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*
|
|
16
|
-
* @author Brad Anderson <BradA1878@pm.me>
|
|
17
|
-
* @repository https://github.com/BradA1878/model-exchange-framework
|
|
18
|
-
* @documentation https://mxf-dev.github.io/mxf/
|
|
19
9
|
*/
|
|
20
10
|
import { Logger } from '../../../utils/Logger.js';
|
|
21
11
|
import { EventBus } from '../../../events/EventBus.js';
|
|
22
12
|
import { Events } from '../../../events/EventNames.js';
|
|
23
13
|
import { TaskEvents } from '../../../events/event-definitions/TaskEvents.js';
|
|
24
14
|
import { createTaskEventPayload } from '../../../schemas/EventPayloadSchema.js';
|
|
25
|
-
import
|
|
26
|
-
import {
|
|
15
|
+
import PlanModel from '../../../models/plan.js';
|
|
16
|
+
import { Task } from '../../../models/task.js';
|
|
27
17
|
import { v4 as uuidv4 } from 'uuid';
|
|
28
18
|
const logger = new Logger('debug', 'TaskPlanningTools', 'server');
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
19
|
+
const planUpdateLocks = new Set();
|
|
20
|
+
const requireIdentity = (context) => {
|
|
21
|
+
if (typeof context.agentId !== 'string' || context.agentId.trim().length === 0 ||
|
|
22
|
+
typeof context.channelId !== 'string' || context.channelId.trim().length === 0) {
|
|
23
|
+
throw new Error('Authenticated agentId and channelId are required');
|
|
24
|
+
}
|
|
25
|
+
return { agentId: context.agentId.trim(), channelId: context.channelId.trim() };
|
|
26
|
+
};
|
|
27
|
+
const readCorrelatedEvent = (payload) => {
|
|
28
|
+
if (!payload || typeof payload !== 'object' || !('data' in payload)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const candidate = payload;
|
|
32
|
+
if (!candidate.data || typeof candidate.data !== 'object') {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
channelId: typeof candidate.channelId === 'string' ? candidate.channelId : undefined,
|
|
37
|
+
data: candidate.data
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
const awaitTaskEvent = (requestId, channelId, successEvent, emitRequest) => {
|
|
41
|
+
let successSubscription;
|
|
42
|
+
let errorSubscription;
|
|
43
|
+
const result = new Promise((resolve, reject) => {
|
|
44
|
+
const cleanup = () => {
|
|
45
|
+
successSubscription?.unsubscribe();
|
|
46
|
+
errorSubscription?.unsubscribe();
|
|
47
|
+
};
|
|
48
|
+
successSubscription = EventBus.server.on(successEvent, payload => {
|
|
49
|
+
const event = readCorrelatedEvent(payload);
|
|
50
|
+
if (event?.channelId !== channelId || event.data.requestId !== requestId) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (!event.data.task?.id) {
|
|
54
|
+
cleanup();
|
|
55
|
+
reject(new Error(`${successEvent} ${requestId} returned no persisted task`));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
cleanup();
|
|
59
|
+
resolve(event.data.task);
|
|
60
|
+
});
|
|
61
|
+
errorSubscription = EventBus.server.on(TaskEvents.ERROR, payload => {
|
|
62
|
+
const event = readCorrelatedEvent(payload);
|
|
63
|
+
if (event?.channelId !== channelId || event.data.requestId !== requestId) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
cleanup();
|
|
67
|
+
reject(new Error(event.data.error ?? `Task operation ${requestId} failed`));
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
emitRequest();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
successSubscription?.unsubscribe();
|
|
75
|
+
errorSubscription?.unsubscribe();
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
};
|
|
80
|
+
const requireString = (value, field) => {
|
|
81
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
82
|
+
throw new Error(`${field} is required`);
|
|
83
|
+
}
|
|
84
|
+
return value.trim();
|
|
85
|
+
};
|
|
86
|
+
const requireAssignees = (value, defaultAgentId) => {
|
|
87
|
+
if (value === undefined) {
|
|
88
|
+
return [defaultAgentId];
|
|
89
|
+
}
|
|
90
|
+
if (!Array.isArray(value) || value.length === 0 ||
|
|
91
|
+
value.some(agentId => typeof agentId !== 'string' || agentId.trim().length === 0)) {
|
|
92
|
+
throw new Error('assignTo must be a non-empty array of agent ids');
|
|
93
|
+
}
|
|
94
|
+
return Array.from(new Set(value.map(agentId => agentId.trim())));
|
|
95
|
+
};
|
|
96
|
+
const emitCreateRequest = (identity, requestId, task) => awaitTaskEvent(requestId, identity.channelId, TaskEvents.CREATED, () => EventBus.server.emit(TaskEvents.CREATE_REQUEST, createTaskEventPayload(TaskEvents.CREATE_REQUEST, identity.agentId, identity.channelId, {
|
|
97
|
+
taskId: requestId,
|
|
98
|
+
requestId,
|
|
99
|
+
fromAgentId: identity.agentId,
|
|
100
|
+
toAgentId: task.assignedAgentIds?.[0] ?? identity.agentId,
|
|
101
|
+
task
|
|
102
|
+
})));
|
|
34
103
|
export const task_create_with_plan = {
|
|
35
104
|
name: 'task_create_with_plan',
|
|
36
|
-
description: '
|
|
105
|
+
description: 'Persist a task and completion plan, then monitor the task until its configured plan criteria are met.',
|
|
37
106
|
inputSchema: {
|
|
38
107
|
type: 'object',
|
|
39
108
|
properties: {
|
|
40
|
-
title: {
|
|
41
|
-
|
|
42
|
-
description: 'Title of the task'
|
|
43
|
-
},
|
|
44
|
-
description: {
|
|
45
|
-
type: 'string',
|
|
46
|
-
description: 'Detailed description of what needs to be done'
|
|
47
|
-
},
|
|
109
|
+
title: { type: 'string', description: 'Title of the task' },
|
|
110
|
+
description: { type: 'string', description: 'Detailed task description' },
|
|
48
111
|
completionPlan: {
|
|
49
112
|
type: 'object',
|
|
50
|
-
description: 'Plan-based completion criteria',
|
|
51
113
|
properties: {
|
|
52
114
|
steps: {
|
|
53
115
|
type: 'array',
|
|
54
|
-
|
|
116
|
+
minItems: 1,
|
|
55
117
|
items: {
|
|
56
118
|
type: 'object',
|
|
57
119
|
properties: {
|
|
58
|
-
title: {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
},
|
|
62
|
-
description: {
|
|
63
|
-
type: 'string',
|
|
64
|
-
description: 'Step description'
|
|
65
|
-
},
|
|
66
|
-
critical: {
|
|
67
|
-
type: 'boolean',
|
|
68
|
-
description: 'Is this step critical for completion?',
|
|
69
|
-
default: false
|
|
70
|
-
}
|
|
120
|
+
title: { type: 'string' },
|
|
121
|
+
description: { type: 'string' },
|
|
122
|
+
critical: { type: 'boolean', default: false }
|
|
71
123
|
},
|
|
72
124
|
required: ['title']
|
|
73
125
|
}
|
|
@@ -75,521 +127,382 @@ export const task_create_with_plan = {
|
|
|
75
127
|
completionType: {
|
|
76
128
|
type: 'string',
|
|
77
129
|
enum: ['all_steps', 'critical_steps', 'percentage'],
|
|
78
|
-
description: 'How to determine completion',
|
|
79
130
|
default: 'all_steps'
|
|
80
131
|
},
|
|
81
|
-
percentage: {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
minimum: 0,
|
|
85
|
-
maximum: 100
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
assignTo: {
|
|
90
|
-
type: 'array',
|
|
91
|
-
items: { type: 'string' },
|
|
92
|
-
description: 'Agent IDs to assign this task to. REQUIRED for delegation — without this, the task stays assigned to the calling agent and nobody else picks it up. Example: ["mxf-planner"]'
|
|
93
|
-
},
|
|
94
|
-
priority: {
|
|
95
|
-
type: 'string',
|
|
96
|
-
enum: ['low', 'medium', 'high'],
|
|
97
|
-
default: 'medium'
|
|
132
|
+
percentage: { type: 'number', minimum: 0, maximum: 100 }
|
|
133
|
+
},
|
|
134
|
+
required: ['steps']
|
|
98
135
|
},
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
136
|
+
assignTo: { type: 'array', minItems: 1, items: { type: 'string' } },
|
|
137
|
+
priority: { type: 'string', enum: ['low', 'medium', 'high'], default: 'medium' },
|
|
138
|
+
absoluteTimeout: { type: 'number', minimum: 1 }
|
|
103
139
|
},
|
|
104
140
|
required: ['title', 'description', 'completionPlan']
|
|
105
141
|
},
|
|
106
142
|
enabled: true,
|
|
107
143
|
handler: async (input, context) => {
|
|
144
|
+
const startedAt = Date.now();
|
|
145
|
+
const identity = requireIdentity(context);
|
|
146
|
+
const title = requireString(input.title, 'title');
|
|
147
|
+
const description = requireString(input.description, 'description');
|
|
148
|
+
const completionPlan = input.completionPlan;
|
|
149
|
+
if (!completionPlan || !Array.isArray(completionPlan.steps) || completionPlan.steps.length === 0) {
|
|
150
|
+
throw new Error('completionPlan.steps must contain at least one step');
|
|
151
|
+
}
|
|
152
|
+
for (const step of completionPlan.steps) {
|
|
153
|
+
requireString(step.title, 'completionPlan step title');
|
|
154
|
+
}
|
|
155
|
+
const completionType = completionPlan.completionType ?? 'all_steps';
|
|
156
|
+
if (completionType === 'percentage' &&
|
|
157
|
+
(typeof completionPlan.percentage !== 'number' ||
|
|
158
|
+
completionPlan.percentage < 0 || completionPlan.percentage > 100)) {
|
|
159
|
+
throw new Error('percentage must be between 0 and 100 for percentage completion');
|
|
160
|
+
}
|
|
161
|
+
if (completionType === 'critical_steps' && !completionPlan.steps.some(step => step.critical === true)) {
|
|
162
|
+
throw new Error('critical_steps completion requires at least one critical step');
|
|
163
|
+
}
|
|
164
|
+
const planId = uuidv4();
|
|
165
|
+
const planDoc = new PlanModel({
|
|
166
|
+
planId,
|
|
167
|
+
title: `${title} - Completion Plan`,
|
|
168
|
+
createdBy: identity.agentId,
|
|
169
|
+
channelId: identity.channelId,
|
|
170
|
+
items: completionPlan.steps.map((step, index) => ({
|
|
171
|
+
id: `item-${index + 1}`,
|
|
172
|
+
title: step.title.trim(),
|
|
173
|
+
description: step.description,
|
|
174
|
+
status: 'pending',
|
|
175
|
+
priority: step.critical ? 'high' : 'medium'
|
|
176
|
+
})),
|
|
177
|
+
metadata: { type: 'task_completion_plan', taskTitle: title }
|
|
178
|
+
});
|
|
179
|
+
await planDoc.save();
|
|
180
|
+
const completionConfig = {
|
|
181
|
+
primary: {
|
|
182
|
+
type: 'plan-based',
|
|
183
|
+
planId,
|
|
184
|
+
completionType,
|
|
185
|
+
percentage: completionPlan.percentage
|
|
186
|
+
},
|
|
187
|
+
absoluteTimeout: typeof input.absoluteTimeout === 'number' ? input.absoluteTimeout : undefined,
|
|
188
|
+
timeoutBehavior: typeof input.absoluteTimeout === 'number' ? 'fail' : undefined,
|
|
189
|
+
allowManualCompletion: true
|
|
190
|
+
};
|
|
191
|
+
const assignees = requireAssignees(input.assignTo, identity.agentId);
|
|
192
|
+
const requestId = uuidv4();
|
|
108
193
|
try {
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
title: step.title,
|
|
120
|
-
description: step.description,
|
|
121
|
-
status: 'pending',
|
|
122
|
-
priority: step.critical ? 'high' : 'medium',
|
|
123
|
-
critical: step.critical || false,
|
|
124
|
-
order: index
|
|
125
|
-
}))
|
|
126
|
-
};
|
|
127
|
-
// Store plan in channel memory using MemoryService
|
|
128
|
-
const memoryService = MemoryService.getInstance();
|
|
129
|
-
const channelMemory = await firstValueFrom(memoryService.getChannelMemory(context.channelId));
|
|
130
|
-
const currentSharedState = channelMemory.sharedState || {};
|
|
131
|
-
await firstValueFrom(memoryService.updateChannelMemory(context.channelId, {
|
|
132
|
-
sharedState: {
|
|
133
|
-
...currentSharedState,
|
|
134
|
-
[`plan:${planId}`]: {
|
|
135
|
-
...plan,
|
|
136
|
-
metadata: {
|
|
137
|
-
type: 'task_completion_plan',
|
|
138
|
-
taskTitle: input.title
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}));
|
|
143
|
-
// Also store in planning tool's active plans for compatibility
|
|
144
|
-
const activePlans = global.activePlans || new Map();
|
|
145
|
-
activePlans.set(planId, plan);
|
|
146
|
-
global.activePlans = activePlans;
|
|
147
|
-
// Create completion config
|
|
148
|
-
const completionConfig = {
|
|
149
|
-
primary: {
|
|
150
|
-
type: 'plan-based',
|
|
151
|
-
planId: planId,
|
|
152
|
-
completionType: input.completionPlan.completionType || 'all_steps',
|
|
153
|
-
percentage: input.completionPlan.percentage
|
|
154
|
-
},
|
|
155
|
-
absoluteTimeout: input.absoluteTimeout,
|
|
156
|
-
timeoutBehavior: 'complete',
|
|
157
|
-
allowManualCompletion: true
|
|
158
|
-
};
|
|
159
|
-
// Create the task with monitoring config
|
|
160
|
-
// If no assignTo specified and the caller is the orchestrator (Concierge),
|
|
161
|
-
// default to mxf-planner so the task actually gets picked up by the right agent
|
|
162
|
-
const callerIsOrchestrator = context.agentId?.includes('concierge') ||
|
|
163
|
-
context.metadata?.role === 'orchestrator';
|
|
164
|
-
const defaultAssignee = callerIsOrchestrator ? 'mxf-planner' : (context.agentId || 'system');
|
|
165
|
-
const assignedAgentIds = input.assignTo || [defaultAssignee];
|
|
166
|
-
const taskId = uuidv4();
|
|
167
|
-
const taskPayload = createTaskEventPayload(TaskEvents.CREATE_REQUEST, context.agentId || 'system', context.channelId || 'default', {
|
|
168
|
-
taskId: taskId,
|
|
169
|
-
fromAgentId: context.agentId || 'system',
|
|
170
|
-
toAgentId: assignedAgentIds[0],
|
|
171
|
-
task: {
|
|
172
|
-
channelId: context.channelId || 'default',
|
|
173
|
-
title: input.title,
|
|
174
|
-
description: `${input.description}\n\nThis task will automatically complete when the plan steps are finished.`,
|
|
175
|
-
assignmentScope: assignedAgentIds.length > 1 ? 'multiple' : 'single',
|
|
176
|
-
assignmentStrategy: 'manual',
|
|
177
|
-
assignedAgentIds,
|
|
178
|
-
coordinationMode: 'collaborative',
|
|
179
|
-
priority: input.priority || 'medium',
|
|
180
|
-
metadata: {
|
|
181
|
-
completionConfig: completionConfig,
|
|
182
|
-
planId: planId,
|
|
183
|
-
enableMonitoring: true
|
|
184
|
-
}
|
|
185
|
-
}
|
|
194
|
+
const task = await emitCreateRequest(identity, requestId, {
|
|
195
|
+
channelId: identity.channelId,
|
|
196
|
+
title,
|
|
197
|
+
description,
|
|
198
|
+
assignmentScope: assignees.length > 1 ? 'multiple' : 'single',
|
|
199
|
+
assignmentStrategy: 'manual',
|
|
200
|
+
assignedAgentIds: assignees,
|
|
201
|
+
coordinationMode: 'collaborative',
|
|
202
|
+
priority: input.priority ?? 'medium',
|
|
203
|
+
metadata: { completionConfig, planId, enableMonitoring: true }
|
|
186
204
|
});
|
|
187
|
-
EventBus.server.emit(TaskEvents.CREATE_REQUEST, taskPayload);
|
|
188
|
-
const content = {
|
|
189
|
-
type: 'text',
|
|
190
|
-
data: `Task created successfully with automatic completion monitoring.
|
|
191
|
-
|
|
192
|
-
Task ID: ${taskId}
|
|
193
|
-
Plan ID: ${planId}
|
|
194
|
-
Total Steps: ${plan.items.length}
|
|
195
|
-
Critical Steps: ${plan.items.filter((s) => s.critical).length}
|
|
196
|
-
Completion Type: ${input.completionPlan.completionType || 'all_steps'}
|
|
197
|
-
|
|
198
|
-
The task will automatically complete when the plan criteria are met.`
|
|
199
|
-
};
|
|
200
205
|
return {
|
|
201
|
-
content
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
206
|
+
content: {
|
|
207
|
+
type: 'application/json',
|
|
208
|
+
data: {
|
|
209
|
+
success: true,
|
|
210
|
+
taskId: task.id,
|
|
211
|
+
planId,
|
|
212
|
+
totalSteps: planDoc.items.length,
|
|
213
|
+
criticalSteps: planDoc.items.filter(item => item.priority === 'high').length,
|
|
214
|
+
completionType
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
metadata: { processingTime: Date.now() - startedAt, taskId: task.id, planId }
|
|
207
218
|
};
|
|
208
219
|
}
|
|
209
220
|
catch (error) {
|
|
210
|
-
|
|
221
|
+
try {
|
|
222
|
+
await PlanModel.deleteOne({ planId, channelId: identity.channelId });
|
|
223
|
+
}
|
|
224
|
+
catch (cleanupError) {
|
|
225
|
+
logger.error(`Failed to remove plan ${planId} after task creation failure: ${String(cleanupError)}`);
|
|
226
|
+
}
|
|
227
|
+
logger.error(`Failed to create task with plan: ${String(error)}`);
|
|
211
228
|
throw error;
|
|
212
229
|
}
|
|
213
230
|
}
|
|
214
231
|
};
|
|
215
|
-
/**
|
|
216
|
-
* Create a task with custom completion criteria
|
|
217
|
-
*/
|
|
218
232
|
export const task_create_custom_completion = {
|
|
219
233
|
name: 'task_create_custom_completion',
|
|
220
|
-
description: '
|
|
234
|
+
description: 'Persist a task with a supported SystemLLM, output, or time-based completion monitor.',
|
|
221
235
|
inputSchema: {
|
|
222
236
|
type: 'object',
|
|
223
237
|
properties: {
|
|
224
|
-
title: {
|
|
225
|
-
|
|
226
|
-
description: 'Title of the task'
|
|
227
|
-
},
|
|
228
|
-
description: {
|
|
229
|
-
type: 'string',
|
|
230
|
-
description: 'Detailed description'
|
|
231
|
-
},
|
|
238
|
+
title: { type: 'string' },
|
|
239
|
+
description: { type: 'string' },
|
|
232
240
|
completionStrategy: {
|
|
233
241
|
type: 'string',
|
|
234
|
-
enum: ['systemllm-eval', 'output-based', 'time-based'
|
|
235
|
-
description: 'Type of completion strategy'
|
|
242
|
+
enum: ['systemllm-eval', 'output-based', 'time-based']
|
|
236
243
|
},
|
|
237
244
|
completionCriteria: {
|
|
238
245
|
type: 'object',
|
|
239
|
-
description: 'Strategy-specific criteria',
|
|
240
246
|
properties: {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
description: 'Objectives that must be met (for systemllm-eval)'
|
|
246
|
-
},
|
|
247
|
-
evaluationInterval: {
|
|
248
|
-
type: 'number',
|
|
249
|
-
description: 'How often to evaluate in ms (for systemllm-eval)',
|
|
250
|
-
default: 30000
|
|
251
|
-
},
|
|
252
|
-
confidenceThreshold: {
|
|
247
|
+
objectives: { type: 'array', minItems: 1, items: { type: 'string' } },
|
|
248
|
+
evaluationInterval: { type: 'number', minimum: 1, default: 30000 },
|
|
249
|
+
confidenceThreshold: { type: 'number', minimum: 0, maximum: 1, default: 0.8 },
|
|
250
|
+
maxEvaluations: {
|
|
253
251
|
type: 'number',
|
|
254
|
-
|
|
255
|
-
|
|
252
|
+
minimum: 1,
|
|
253
|
+
maximum: 100,
|
|
254
|
+
description: 'Maximum SystemLLM evaluations before the task fails'
|
|
256
255
|
},
|
|
257
|
-
// For output-based
|
|
258
256
|
requiredOutputs: {
|
|
259
257
|
type: 'array',
|
|
260
|
-
|
|
258
|
+
minItems: 1,
|
|
261
259
|
items: {
|
|
262
260
|
type: 'object',
|
|
263
261
|
properties: {
|
|
264
|
-
type: {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
type: 'string',
|
|
270
|
-
description: 'Regex pattern to match'
|
|
271
|
-
},
|
|
272
|
-
count: {
|
|
273
|
-
type: 'number',
|
|
274
|
-
description: 'Required count',
|
|
275
|
-
default: 1
|
|
276
|
-
}
|
|
277
|
-
}
|
|
262
|
+
type: { type: 'string', enum: ['message', 'tool_call'] },
|
|
263
|
+
pattern: { type: 'string', maxLength: 256 },
|
|
264
|
+
count: { type: 'number', minimum: 1, default: 1 }
|
|
265
|
+
},
|
|
266
|
+
required: ['type']
|
|
278
267
|
}
|
|
279
268
|
},
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
description: 'Minimum duration in ms (for time-based)'
|
|
284
|
-
},
|
|
285
|
-
maximumDuration: {
|
|
286
|
-
type: 'number',
|
|
287
|
-
description: 'Maximum duration in ms (for time-based)'
|
|
288
|
-
},
|
|
289
|
-
requireActivity: {
|
|
290
|
-
type: 'boolean',
|
|
291
|
-
description: 'Require some activity (for time-based)',
|
|
292
|
-
default: true
|
|
293
|
-
},
|
|
294
|
-
// For event-based
|
|
295
|
-
eventName: {
|
|
296
|
-
type: 'string',
|
|
297
|
-
description: 'Event name to watch for (for event-based)'
|
|
298
|
-
}
|
|
269
|
+
minimumDuration: { type: 'number', minimum: 0 },
|
|
270
|
+
maximumDuration: { type: 'number', minimum: 1 },
|
|
271
|
+
requireActivity: { type: 'boolean', default: true }
|
|
299
272
|
}
|
|
300
273
|
},
|
|
301
|
-
assignTo: {
|
|
302
|
-
type: 'array',
|
|
303
|
-
items: { type: 'string' },
|
|
304
|
-
description: 'Agent IDs to assign to'
|
|
305
|
-
}
|
|
274
|
+
assignTo: { type: 'array', minItems: 1, items: { type: 'string' } }
|
|
306
275
|
},
|
|
307
276
|
required: ['title', 'description', 'completionStrategy', 'completionCriteria']
|
|
308
277
|
},
|
|
309
278
|
enabled: true,
|
|
310
279
|
handler: async (input, context) => {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
case 'output-based':
|
|
325
|
-
primaryCriteria = {
|
|
326
|
-
type: 'output-based',
|
|
327
|
-
requiredOutputs: input.completionCriteria.requiredOutputs || []
|
|
328
|
-
};
|
|
329
|
-
break;
|
|
330
|
-
case 'time-based':
|
|
331
|
-
primaryCriteria = {
|
|
332
|
-
type: 'time-based',
|
|
333
|
-
minimumDuration: input.completionCriteria.minimumDuration,
|
|
334
|
-
maximumDuration: input.completionCriteria.maximumDuration || 300000, // 5 min default
|
|
335
|
-
requireActivity: input.completionCriteria.requireActivity !== false
|
|
336
|
-
};
|
|
337
|
-
break;
|
|
338
|
-
case 'event-based':
|
|
339
|
-
primaryCriteria = {
|
|
340
|
-
type: 'event-based',
|
|
341
|
-
eventName: input.completionCriteria.eventName
|
|
342
|
-
};
|
|
343
|
-
break;
|
|
280
|
+
const startedAt = Date.now();
|
|
281
|
+
const identity = requireIdentity(context);
|
|
282
|
+
const title = requireString(input.title, 'title');
|
|
283
|
+
const description = requireString(input.description, 'description');
|
|
284
|
+
const criteria = input.completionCriteria;
|
|
285
|
+
if (!criteria || typeof criteria !== 'object') {
|
|
286
|
+
throw new Error('completionCriteria is required');
|
|
287
|
+
}
|
|
288
|
+
let primary;
|
|
289
|
+
if (input.completionStrategy === 'systemllm-eval') {
|
|
290
|
+
if (!Array.isArray(criteria.objectives) || criteria.objectives.length === 0 ||
|
|
291
|
+
criteria.objectives.some(objective => typeof objective !== 'string' || objective.trim().length === 0)) {
|
|
292
|
+
throw new Error('systemllm-eval requires at least one objective');
|
|
344
293
|
}
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
294
|
+
if (!Number.isInteger(criteria.maxEvaluations) ||
|
|
295
|
+
criteria.maxEvaluations < 1 ||
|
|
296
|
+
criteria.maxEvaluations > 100) {
|
|
297
|
+
throw new Error('systemllm-eval requires maxEvaluations between 1 and 100');
|
|
298
|
+
}
|
|
299
|
+
primary = {
|
|
300
|
+
type: 'systemllm-eval',
|
|
301
|
+
objectives: criteria.objectives,
|
|
302
|
+
evaluationInterval: typeof criteria.evaluationInterval === 'number'
|
|
303
|
+
? criteria.evaluationInterval
|
|
304
|
+
: 30_000,
|
|
305
|
+
confidenceThreshold: typeof criteria.confidenceThreshold === 'number'
|
|
306
|
+
? criteria.confidenceThreshold
|
|
307
|
+
: 0.8,
|
|
308
|
+
maxEvaluations: criteria.maxEvaluations
|
|
348
309
|
};
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
title: input.title,
|
|
358
|
-
description: input.description,
|
|
359
|
-
assignmentScope: input.assignTo && input.assignTo.length > 1 ? 'multiple' : 'single',
|
|
360
|
-
assignmentStrategy: 'manual',
|
|
361
|
-
assignedAgentIds: input.assignTo || [context.agentId || 'system'],
|
|
362
|
-
coordinationMode: 'collaborative',
|
|
363
|
-
metadata: {
|
|
364
|
-
completionConfig: completionConfig,
|
|
365
|
-
enableMonitoring: true
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
EventBus.server.emit(TaskEvents.CREATE_REQUEST, taskPayload);
|
|
370
|
-
const content = {
|
|
371
|
-
type: 'text',
|
|
372
|
-
data: `Task created with ${input.completionStrategy} completion monitoring.
|
|
373
|
-
|
|
374
|
-
Task ID: ${taskId}
|
|
375
|
-
Strategy: ${input.completionStrategy}
|
|
376
|
-
${input.completionStrategy === 'systemllm-eval' ? `Objectives: ${input.completionCriteria.objectives?.length || 0}` : ''}
|
|
377
|
-
${input.completionStrategy === 'time-based' ? `Duration: ${input.completionCriteria.minimumDuration || 0}-${input.completionCriteria.maximumDuration}ms` : ''}
|
|
378
|
-
|
|
379
|
-
The task will be monitored and automatically completed when criteria are met.`
|
|
310
|
+
}
|
|
311
|
+
else if (input.completionStrategy === 'output-based') {
|
|
312
|
+
if (!Array.isArray(criteria.requiredOutputs) || criteria.requiredOutputs.length === 0) {
|
|
313
|
+
throw new Error('output-based completion requires at least one output');
|
|
314
|
+
}
|
|
315
|
+
primary = {
|
|
316
|
+
type: 'output-based',
|
|
317
|
+
requiredOutputs: criteria.requiredOutputs
|
|
380
318
|
};
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
319
|
+
}
|
|
320
|
+
else if (input.completionStrategy === 'time-based') {
|
|
321
|
+
if (typeof criteria.maximumDuration !== 'number' || criteria.maximumDuration <= 0) {
|
|
322
|
+
throw new Error('time-based completion requires a positive maximumDuration');
|
|
323
|
+
}
|
|
324
|
+
primary = {
|
|
325
|
+
type: 'time-based',
|
|
326
|
+
minimumDuration: typeof criteria.minimumDuration === 'number'
|
|
327
|
+
? criteria.minimumDuration
|
|
328
|
+
: undefined,
|
|
329
|
+
maximumDuration: criteria.maximumDuration,
|
|
330
|
+
requireActivity: criteria.requireActivity !== false
|
|
387
331
|
};
|
|
388
332
|
}
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
throw error;
|
|
333
|
+
else {
|
|
334
|
+
throw new Error(`Unsupported completion strategy: ${String(input.completionStrategy)}`);
|
|
392
335
|
}
|
|
336
|
+
const assignees = requireAssignees(input.assignTo, identity.agentId);
|
|
337
|
+
const requestId = uuidv4();
|
|
338
|
+
const task = await emitCreateRequest(identity, requestId, {
|
|
339
|
+
channelId: identity.channelId,
|
|
340
|
+
title,
|
|
341
|
+
description,
|
|
342
|
+
assignmentScope: assignees.length > 1 ? 'multiple' : 'single',
|
|
343
|
+
assignmentStrategy: 'manual',
|
|
344
|
+
assignedAgentIds: assignees,
|
|
345
|
+
coordinationMode: 'collaborative',
|
|
346
|
+
priority: 'medium',
|
|
347
|
+
metadata: {
|
|
348
|
+
completionConfig: { primary, allowManualCompletion: true },
|
|
349
|
+
enableMonitoring: true
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
return {
|
|
353
|
+
content: {
|
|
354
|
+
type: 'application/json',
|
|
355
|
+
data: {
|
|
356
|
+
success: true,
|
|
357
|
+
taskId: task.id,
|
|
358
|
+
strategy: primary.type,
|
|
359
|
+
monitoringConfigured: true
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
metadata: { processingTime: Date.now() - startedAt, taskId: task.id }
|
|
363
|
+
};
|
|
393
364
|
}
|
|
394
365
|
};
|
|
395
|
-
/**
|
|
396
|
-
* Link an existing task to a plan
|
|
397
|
-
*/
|
|
398
366
|
export const task_link_to_plan = {
|
|
399
367
|
name: 'task_link_to_plan',
|
|
400
|
-
|
|
401
|
-
// metadata. It does NOT itself start the completion monitor — the monitor is
|
|
402
|
-
// started by TaskService when a task is created with this metadata. The old
|
|
403
|
-
// description promised "the task will now automatically complete when plan
|
|
404
|
-
// criteria are met", which was untrue twice over: the event it emitted
|
|
405
|
-
// ('task:update_metadata') had no listeners anywhere, so not even the metadata
|
|
406
|
-
// was written.
|
|
407
|
-
description: 'Record a plan-based completion config on an existing task: which plan it is ' +
|
|
408
|
-
'linked to and what counts as done (all steps, critical steps, or a percentage). ' +
|
|
409
|
-
'Writing the config does not by itself start the completion monitor — check ' +
|
|
410
|
-
'task_monitoring_status to see whether the task is actually being monitored.',
|
|
368
|
+
description: 'Persist a plan-based completion config on an existing same-channel task and start monitoring it.',
|
|
411
369
|
inputSchema: {
|
|
412
370
|
type: 'object',
|
|
413
371
|
properties: {
|
|
414
|
-
taskId: {
|
|
415
|
-
|
|
416
|
-
description: 'ID of the existing task'
|
|
417
|
-
},
|
|
418
|
-
planId: {
|
|
419
|
-
type: 'string',
|
|
420
|
-
description: 'ID of the plan to link to'
|
|
421
|
-
},
|
|
372
|
+
taskId: { type: 'string' },
|
|
373
|
+
planId: { type: 'string' },
|
|
422
374
|
completionType: {
|
|
423
375
|
type: 'string',
|
|
424
376
|
enum: ['all_steps', 'critical_steps', 'percentage'],
|
|
425
377
|
default: 'all_steps'
|
|
426
378
|
},
|
|
427
|
-
percentage: {
|
|
428
|
-
type: 'number',
|
|
429
|
-
description: 'Required percentage (if using percentage type)',
|
|
430
|
-
minimum: 0,
|
|
431
|
-
maximum: 100
|
|
432
|
-
}
|
|
379
|
+
percentage: { type: 'number', minimum: 0, maximum: 100 }
|
|
433
380
|
},
|
|
434
381
|
required: ['taskId', 'planId']
|
|
435
382
|
},
|
|
436
383
|
enabled: true,
|
|
437
384
|
handler: async (input, context) => {
|
|
385
|
+
const startedAt = Date.now();
|
|
386
|
+
const identity = requireIdentity(context);
|
|
387
|
+
const taskId = requireString(input.taskId, 'taskId');
|
|
388
|
+
const planId = requireString(input.planId, 'planId');
|
|
389
|
+
const lockKey = `${identity.channelId}\0${planId}`;
|
|
390
|
+
if (planUpdateLocks.has(lockKey)) {
|
|
391
|
+
throw new Error(`Plan ${planId} is already being linked in this channel`);
|
|
392
|
+
}
|
|
393
|
+
planUpdateLocks.add(lockKey);
|
|
438
394
|
try {
|
|
439
|
-
const
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
const content = {
|
|
443
|
-
type: 'text',
|
|
444
|
-
data: `Plan ${input.planId} is currently being updated. Please try again.`
|
|
445
|
-
};
|
|
446
|
-
return { content };
|
|
395
|
+
const completionType = input.completionType ?? 'all_steps';
|
|
396
|
+
if (completionType === 'percentage' && typeof input.percentage !== 'number') {
|
|
397
|
+
throw new Error('percentage is required for percentage completion');
|
|
447
398
|
}
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
EventBus.server.emit(Events.Task.UPDATE_REQUEST, createTaskEventPayload(Events.Task.UPDATE_REQUEST, context.agentId, context.channelId, {
|
|
478
|
-
taskId: input.taskId,
|
|
399
|
+
const plan = await PlanModel.findOne({ planId, channelId: identity.channelId });
|
|
400
|
+
if (!plan) {
|
|
401
|
+
throw new Error(`Plan ${planId} not found in channel ${identity.channelId}`);
|
|
402
|
+
}
|
|
403
|
+
if (completionType === 'critical_steps' && !plan.items.some(item => item.priority === 'high')) {
|
|
404
|
+
throw new Error(`Plan ${planId} contains no critical steps`);
|
|
405
|
+
}
|
|
406
|
+
const task = await Task.findOne({ _id: taskId, channelId: identity.channelId });
|
|
407
|
+
if (!task) {
|
|
408
|
+
throw new Error(`Task ${taskId} not found in channel ${identity.channelId}`);
|
|
409
|
+
}
|
|
410
|
+
const completionConfig = {
|
|
411
|
+
primary: {
|
|
412
|
+
type: 'plan-based',
|
|
413
|
+
planId,
|
|
414
|
+
completionType,
|
|
415
|
+
percentage: typeof input.percentage === 'number' ? input.percentage : undefined
|
|
416
|
+
},
|
|
417
|
+
allowManualCompletion: true
|
|
418
|
+
};
|
|
419
|
+
const requestId = uuidv4();
|
|
420
|
+
const updatedTask = await awaitTaskEvent(requestId, identity.channelId, TaskEvents.PROGRESS_UPDATED, () => EventBus.server.emit(Events.Task.UPDATE_REQUEST, createTaskEventPayload(Events.Task.UPDATE_REQUEST, identity.agentId, identity.channelId, {
|
|
421
|
+
taskId,
|
|
422
|
+
requestId,
|
|
423
|
+
fromAgentId: identity.agentId,
|
|
424
|
+
toAgentId: task.assignedAgentId ?? identity.agentId,
|
|
425
|
+
task: {
|
|
426
|
+
taskId,
|
|
427
|
+
requestId,
|
|
479
428
|
metadata: {
|
|
429
|
+
...(task.metadata ?? {}),
|
|
480
430
|
completionConfig,
|
|
431
|
+
planId,
|
|
481
432
|
enableMonitoring: true
|
|
482
433
|
}
|
|
483
|
-
}
|
|
484
|
-
|
|
434
|
+
}
|
|
435
|
+
})));
|
|
436
|
+
return {
|
|
437
|
+
content: {
|
|
485
438
|
type: 'application/json',
|
|
486
439
|
data: {
|
|
487
|
-
|
|
488
|
-
|
|
440
|
+
success: true,
|
|
441
|
+
taskId: updatedTask.id,
|
|
442
|
+
planId,
|
|
489
443
|
completionType,
|
|
490
|
-
|
|
491
|
-
completionConfigWritten: true,
|
|
492
|
-
// Say only what is true. The write is asynchronous (it goes
|
|
493
|
-
// through the task update handler), and starting the monitor
|
|
494
|
-
// is a separate step owned by the task service.
|
|
495
|
-
note: 'The plan-based completion config has been submitted for this task. ' +
|
|
496
|
-
'Call task_monitoring_status to confirm the task is being monitored.'
|
|
444
|
+
monitoringConfigured: true
|
|
497
445
|
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
metadata: {
|
|
502
|
-
processingTime: Date.now() - startTime
|
|
503
|
-
}
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
finally {
|
|
507
|
-
// Always release lock
|
|
508
|
-
planUpdateLocks.delete(input.planId);
|
|
509
|
-
}
|
|
446
|
+
},
|
|
447
|
+
metadata: { processingTime: Date.now() - startedAt }
|
|
448
|
+
};
|
|
510
449
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
throw error;
|
|
450
|
+
finally {
|
|
451
|
+
planUpdateLocks.delete(lockKey);
|
|
514
452
|
}
|
|
515
453
|
}
|
|
516
454
|
};
|
|
517
|
-
/**
|
|
518
|
-
* Get task monitoring status
|
|
519
|
-
*/
|
|
520
455
|
export const task_monitoring_status = {
|
|
521
456
|
name: 'task_monitoring_status',
|
|
522
|
-
description: '
|
|
457
|
+
description: 'Read the persisted task state and automatic-completion configuration for a same-channel task.',
|
|
523
458
|
inputSchema: {
|
|
524
459
|
type: 'object',
|
|
525
|
-
properties: {
|
|
526
|
-
taskId: {
|
|
527
|
-
type: 'string',
|
|
528
|
-
description: 'ID of the task to check'
|
|
529
|
-
}
|
|
530
|
-
},
|
|
460
|
+
properties: { taskId: { type: 'string' } },
|
|
531
461
|
required: ['taskId']
|
|
532
462
|
},
|
|
533
463
|
enabled: true,
|
|
534
464
|
handler: async (input, context) => {
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
Use task_update to check task status, or listen for task completion events on the channel.
|
|
542
|
-
Agent: ${context.agentId} | Channel: ${context.channelId}`
|
|
543
|
-
};
|
|
544
|
-
return {
|
|
545
|
-
content,
|
|
546
|
-
metadata: {
|
|
547
|
-
processingTime: Date.now() - startTime
|
|
548
|
-
}
|
|
549
|
-
};
|
|
550
|
-
}
|
|
551
|
-
catch (error) {
|
|
552
|
-
logger.error(`Failed to get monitoring status: ${error}`);
|
|
553
|
-
throw error;
|
|
465
|
+
const identity = requireIdentity(context);
|
|
466
|
+
const taskId = requireString(input.taskId, 'taskId');
|
|
467
|
+
const task = await Task.findOne({ _id: taskId, channelId: identity.channelId });
|
|
468
|
+
if (!task) {
|
|
469
|
+
throw new Error(`Task ${taskId} not found in channel ${identity.channelId}`);
|
|
554
470
|
}
|
|
471
|
+
return {
|
|
472
|
+
content: {
|
|
473
|
+
type: 'application/json',
|
|
474
|
+
data: {
|
|
475
|
+
taskId,
|
|
476
|
+
channelId: identity.channelId,
|
|
477
|
+
status: task.status,
|
|
478
|
+
progress: task.progress,
|
|
479
|
+
monitoringConfigured: task.metadata?.enableMonitoring === true &&
|
|
480
|
+
task.metadata?.completionConfig !== undefined,
|
|
481
|
+
completionConfig: task.metadata?.completionConfig
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
};
|
|
555
485
|
}
|
|
556
486
|
};
|
|
557
|
-
/**
|
|
558
|
-
* Yield control after delegating a task to another agent.
|
|
559
|
-
*
|
|
560
|
-
* Calling this tool tells the framework "I delegated my work and I'm done —
|
|
561
|
-
* stop my LLM loop." Unlike task_complete, this does NOT mark the parent
|
|
562
|
-
* task as completed, so downstream agents continue their work uninterrupted.
|
|
563
|
-
*
|
|
564
|
-
* The agent loop in MxfAgent.ts recognises this tool name and breaks the
|
|
565
|
-
* iteration loop without setting the persistent taskCompleted flag.
|
|
566
|
-
*/
|
|
567
487
|
export const task_delegate = {
|
|
568
488
|
name: 'task_delegate',
|
|
569
|
-
description: 'Signal that
|
|
489
|
+
description: 'Signal that work was delegated and yield the current agent loop without completing the parent task.',
|
|
570
490
|
inputSchema: {
|
|
571
491
|
type: 'object',
|
|
572
|
-
properties: {
|
|
573
|
-
summary: {
|
|
574
|
-
type: 'string',
|
|
575
|
-
description: 'Brief summary of what was delegated and to whom'
|
|
576
|
-
}
|
|
577
|
-
},
|
|
492
|
+
properties: { summary: { type: 'string' } },
|
|
578
493
|
required: ['summary']
|
|
579
494
|
},
|
|
580
495
|
enabled: true,
|
|
581
496
|
handler: async (input, context) => {
|
|
497
|
+
const identity = requireIdentity(context);
|
|
498
|
+
const summary = requireString(input.summary, 'summary');
|
|
582
499
|
const content = {
|
|
583
500
|
type: 'text',
|
|
584
|
-
data: `Delegation
|
|
585
|
-
};
|
|
586
|
-
return {
|
|
587
|
-
content,
|
|
588
|
-
metadata: { delegated: true }
|
|
501
|
+
data: `Delegation recorded for ${identity.agentId}.\n\n${summary}`
|
|
589
502
|
};
|
|
503
|
+
return { content, metadata: { delegated: true } };
|
|
590
504
|
}
|
|
591
505
|
};
|
|
592
|
-
// Export all task planning tools
|
|
593
506
|
export const taskPlanningTools = [
|
|
594
507
|
task_create_with_plan,
|
|
595
508
|
task_create_custom_completion,
|