@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.
Files changed (466) hide show
  1. package/dist/config/ModelContextLimits.d.ts.map +1 -1
  2. package/dist/config/ModelContextLimits.js +7 -1
  3. package/dist/config/ModelContextLimits.js.map +1 -1
  4. package/dist/constants/CoreTools.d.ts +6 -5
  5. package/dist/constants/CoreTools.d.ts.map +1 -1
  6. package/dist/constants/CoreTools.js +6 -5
  7. package/dist/constants/CoreTools.js.map +1 -1
  8. package/dist/constants/DefaultPhaseProfiles.d.ts.map +1 -1
  9. package/dist/constants/DefaultPhaseProfiles.js +29 -0
  10. package/dist/constants/DefaultPhaseProfiles.js.map +1 -1
  11. package/dist/constants/ReservedIdentities.d.ts +14 -0
  12. package/dist/constants/ReservedIdentities.d.ts.map +1 -0
  13. package/dist/constants/ReservedIdentities.js +42 -0
  14. package/dist/constants/ReservedIdentities.js.map +1 -0
  15. package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.d.ts +16 -16
  16. package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.d.ts.map +1 -1
  17. package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.js +98 -36
  18. package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.js.map +1 -1
  19. package/dist/events/ClientEventBus.d.ts +28 -0
  20. package/dist/events/ClientEventBus.d.ts.map +1 -1
  21. package/dist/events/ClientEventBus.js +87 -40
  22. package/dist/events/ClientEventBus.js.map +1 -1
  23. package/dist/events/EventBus.d.ts +19 -1
  24. package/dist/events/EventBus.d.ts.map +1 -1
  25. package/dist/events/EventBus.js +23 -0
  26. package/dist/events/EventBus.js.map +1 -1
  27. package/dist/events/EventBusBase.d.ts +37 -6
  28. package/dist/events/EventBusBase.d.ts.map +1 -1
  29. package/dist/events/EventBusBase.js +75 -27
  30. package/dist/events/EventBusBase.js.map +1 -1
  31. package/dist/events/EventNames.d.ts +49 -36
  32. package/dist/events/EventNames.d.ts.map +1 -1
  33. package/dist/events/EventNames.js +38 -36
  34. package/dist/events/EventNames.js.map +1 -1
  35. package/dist/events/PublicEvents.d.ts +5 -1
  36. package/dist/events/PublicEvents.d.ts.map +1 -1
  37. package/dist/events/PublicEvents.js +7 -0
  38. package/dist/events/PublicEvents.js.map +1 -1
  39. package/dist/events/ServerEventBus.d.ts +7 -54
  40. package/dist/events/ServerEventBus.d.ts.map +1 -1
  41. package/dist/events/ServerEventBus.js +10 -96
  42. package/dist/events/ServerEventBus.js.map +1 -1
  43. package/dist/events/event-definitions/ControlLoopEvents.d.ts +35 -0
  44. package/dist/events/event-definitions/ControlLoopEvents.d.ts.map +1 -1
  45. package/dist/events/event-definitions/ControlLoopEvents.js +6 -0
  46. package/dist/events/event-definitions/ControlLoopEvents.js.map +1 -1
  47. package/dist/events/event-definitions/SdkEvents.d.ts +55 -0
  48. package/dist/events/event-definitions/SdkEvents.d.ts.map +1 -0
  49. package/dist/events/event-definitions/SdkEvents.js +36 -0
  50. package/dist/events/event-definitions/SdkEvents.js.map +1 -0
  51. package/dist/events/event-definitions/TaskEvents.d.ts +2 -7
  52. package/dist/events/event-definitions/TaskEvents.d.ts.map +1 -1
  53. package/dist/index.d.ts +4 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +2 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/interfaces/AgentInterfaces.d.ts +5 -0
  58. package/dist/interfaces/AgentInterfaces.d.ts.map +1 -1
  59. package/dist/interfaces/ChannelConfig.d.ts +2 -2
  60. package/dist/interfaces/ChannelConfig.d.ts.map +1 -1
  61. package/dist/interfaces/ConversationMessage.d.ts +1 -1
  62. package/dist/interfaces/ConversationMessage.d.ts.map +1 -1
  63. package/dist/interfaces/IMemoryPersistence.d.ts +47 -1
  64. package/dist/interfaces/IMemoryPersistence.d.ts.map +1 -1
  65. package/dist/interfaces/SocketServiceInterface.d.ts +3 -2
  66. package/dist/interfaces/SocketServiceInterface.d.ts.map +1 -1
  67. package/dist/interfaces/TaskInterfaces.d.ts +14 -1
  68. package/dist/interfaces/TaskInterfaces.d.ts.map +1 -1
  69. package/dist/models/agent.d.ts +0 -1
  70. package/dist/models/agent.d.ts.map +1 -1
  71. package/dist/models/agent.js +0 -5
  72. package/dist/models/agent.js.map +1 -1
  73. package/dist/models/agentIdentityReservation.d.ts +42 -0
  74. package/dist/models/agentIdentityReservation.d.ts.map +1 -0
  75. package/dist/models/agentIdentityReservation.js +52 -0
  76. package/dist/models/agentIdentityReservation.js.map +1 -0
  77. package/dist/models/channel.d.ts +2 -0
  78. package/dist/models/channel.d.ts.map +1 -1
  79. package/dist/models/channel.js.map +1 -1
  80. package/dist/models/channelKey.d.ts +1 -0
  81. package/dist/models/channelKey.d.ts.map +1 -1
  82. package/dist/models/channelKey.js +5 -0
  83. package/dist/models/channelKey.js.map +1 -1
  84. package/dist/models/memory.d.ts +1 -1
  85. package/dist/models/memory.d.ts.map +1 -1
  86. package/dist/models/memory.js +9 -12
  87. package/dist/models/memory.js.map +1 -1
  88. package/dist/models/memoryStrata.d.ts +3 -16
  89. package/dist/models/memoryStrata.d.ts.map +1 -1
  90. package/dist/models/memoryStrata.js +3 -5
  91. package/dist/models/memoryStrata.js.map +1 -1
  92. package/dist/models/plan.d.ts +2 -2
  93. package/dist/models/plan.d.ts.map +1 -1
  94. package/dist/models/plan.js +1 -1
  95. package/dist/models/plan.js.map +1 -1
  96. package/dist/models/taskEffectiveness.d.ts +1 -0
  97. package/dist/models/taskEffectiveness.d.ts.map +1 -1
  98. package/dist/models/taskEffectiveness.js +7 -1
  99. package/dist/models/taskEffectiveness.js.map +1 -1
  100. package/dist/models/user.d.ts +4 -0
  101. package/dist/models/user.d.ts.map +1 -1
  102. package/dist/models/user.js +8 -0
  103. package/dist/models/user.js.map +1 -1
  104. package/dist/protocols/mcp/LlmTestEnvironmentGuard.d.ts +16 -0
  105. package/dist/protocols/mcp/LlmTestEnvironmentGuard.d.ts.map +1 -0
  106. package/dist/protocols/mcp/LlmTestEnvironmentGuard.js +25 -0
  107. package/dist/protocols/mcp/LlmTestEnvironmentGuard.js.map +1 -0
  108. package/dist/protocols/mcp/McpServerTypes.d.ts +9 -0
  109. package/dist/protocols/mcp/McpServerTypes.d.ts.map +1 -1
  110. package/dist/protocols/mcp/providers/AnthropicMcpClient.d.ts.map +1 -1
  111. package/dist/protocols/mcp/providers/AnthropicMcpClient.js +1 -0
  112. package/dist/protocols/mcp/providers/AnthropicMcpClient.js.map +1 -1
  113. package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.d.ts.map +1 -1
  114. package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.js +1 -0
  115. package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.js.map +1 -1
  116. package/dist/protocols/mcp/providers/BaseMcpClient.d.ts +4 -0
  117. package/dist/protocols/mcp/providers/BaseMcpClient.d.ts.map +1 -1
  118. package/dist/protocols/mcp/providers/BaseMcpClient.js +10 -0
  119. package/dist/protocols/mcp/providers/BaseMcpClient.js.map +1 -1
  120. package/dist/protocols/mcp/providers/CustomMcpClient.d.ts.map +1 -1
  121. package/dist/protocols/mcp/providers/CustomMcpClient.js +7 -0
  122. package/dist/protocols/mcp/providers/CustomMcpClient.js.map +1 -1
  123. package/dist/protocols/mcp/providers/GeminiMcpClient.d.ts.map +1 -1
  124. package/dist/protocols/mcp/providers/GeminiMcpClient.js +1 -0
  125. package/dist/protocols/mcp/providers/GeminiMcpClient.js.map +1 -1
  126. package/dist/protocols/mcp/providers/OllamaMcpClient.d.ts +1 -0
  127. package/dist/protocols/mcp/providers/OllamaMcpClient.d.ts.map +1 -1
  128. package/dist/protocols/mcp/providers/OllamaMcpClient.js +1 -0
  129. package/dist/protocols/mcp/providers/OllamaMcpClient.js.map +1 -1
  130. package/dist/protocols/mcp/providers/OpenAiMcpClient.d.ts.map +1 -1
  131. package/dist/protocols/mcp/providers/OpenAiMcpClient.js +1 -0
  132. package/dist/protocols/mcp/providers/OpenAiMcpClient.js.map +1 -1
  133. package/dist/protocols/mcp/providers/OpenRouterMcpClient.d.ts.map +1 -1
  134. package/dist/protocols/mcp/providers/OpenRouterMcpClient.js +2 -0
  135. package/dist/protocols/mcp/providers/OpenRouterMcpClient.js.map +1 -1
  136. package/dist/protocols/mcp/providers/XaiMcpClient.d.ts.map +1 -1
  137. package/dist/protocols/mcp/providers/XaiMcpClient.js +1 -0
  138. package/dist/protocols/mcp/providers/XaiMcpClient.js.map +1 -1
  139. package/dist/protocols/mcp/security/BrowserTargetGuard.d.ts +14 -0
  140. package/dist/protocols/mcp/security/BrowserTargetGuard.d.ts.map +1 -0
  141. package/dist/protocols/mcp/security/BrowserTargetGuard.js +55 -0
  142. package/dist/protocols/mcp/security/BrowserTargetGuard.js.map +1 -0
  143. package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.d.ts +24 -0
  144. package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.d.ts.map +1 -0
  145. package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.js +33 -0
  146. package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.js.map +1 -0
  147. package/dist/protocols/mcp/security/HttpTargetGuard.d.ts.map +1 -1
  148. package/dist/protocols/mcp/security/HttpTargetGuard.js +68 -6
  149. package/dist/protocols/mcp/security/HttpTargetGuard.js.map +1 -1
  150. package/dist/protocols/mcp/security/McpSecurityGuard.d.ts.map +1 -1
  151. package/dist/protocols/mcp/security/McpSecurityGuard.js +7 -5
  152. package/dist/protocols/mcp/security/McpSecurityGuard.js.map +1 -1
  153. package/dist/protocols/mcp/security/McpToolPolicy.d.ts +18 -0
  154. package/dist/protocols/mcp/security/McpToolPolicy.d.ts.map +1 -1
  155. package/dist/protocols/mcp/security/McpToolPolicy.js +60 -0
  156. package/dist/protocols/mcp/security/McpToolPolicy.js.map +1 -1
  157. package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts +25 -0
  158. package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts.map +1 -1
  159. package/dist/protocols/mcp/services/ExternalMcpServerManager.js +93 -17
  160. package/dist/protocols/mcp/services/ExternalMcpServerManager.js.map +1 -1
  161. package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts +2 -2
  162. package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts.map +1 -1
  163. package/dist/protocols/mcp/services/ExternalServerConfigs.js +25 -8
  164. package/dist/protocols/mcp/services/ExternalServerConfigs.js.map +1 -1
  165. package/dist/protocols/mcp/tools/AnalyticsTools.d.ts +3 -37
  166. package/dist/protocols/mcp/tools/AnalyticsTools.d.ts.map +1 -1
  167. package/dist/protocols/mcp/tools/AnalyticsTools.js +134 -614
  168. package/dist/protocols/mcp/tools/AnalyticsTools.js.map +1 -1
  169. package/dist/protocols/mcp/tools/CodeAnalysisTools.d.ts.map +1 -1
  170. package/dist/protocols/mcp/tools/CodeAnalysisTools.js +16 -13
  171. package/dist/protocols/mcp/tools/CodeAnalysisTools.js.map +1 -1
  172. package/dist/protocols/mcp/tools/EffectivenessTools.d.ts.map +1 -1
  173. package/dist/protocols/mcp/tools/EffectivenessTools.js +94 -30
  174. package/dist/protocols/mcp/tools/EffectivenessTools.js.map +1 -1
  175. package/dist/protocols/mcp/tools/GitTools.d.ts.map +1 -1
  176. package/dist/protocols/mcp/tools/GitTools.js +9 -5
  177. package/dist/protocols/mcp/tools/GitTools.js.map +1 -1
  178. package/dist/protocols/mcp/tools/InfrastructureTools.d.ts +10 -40
  179. package/dist/protocols/mcp/tools/InfrastructureTools.d.ts.map +1 -1
  180. package/dist/protocols/mcp/tools/InfrastructureTools.js +29 -70
  181. package/dist/protocols/mcp/tools/InfrastructureTools.js.map +1 -1
  182. package/dist/protocols/mcp/tools/JsonTools.d.ts.map +1 -1
  183. package/dist/protocols/mcp/tools/JsonTools.js +4 -4
  184. package/dist/protocols/mcp/tools/JsonTools.js.map +1 -1
  185. package/dist/protocols/mcp/tools/KnowledgeGraphTools.d.ts +55 -592
  186. package/dist/protocols/mcp/tools/KnowledgeGraphTools.d.ts.map +1 -1
  187. package/dist/protocols/mcp/tools/KnowledgeGraphTools.js +169 -119
  188. package/dist/protocols/mcp/tools/KnowledgeGraphTools.js.map +1 -1
  189. package/dist/protocols/mcp/tools/MemorySearchTools.d.ts +6 -6
  190. package/dist/protocols/mcp/tools/MemorySearchTools.d.ts.map +1 -1
  191. package/dist/protocols/mcp/tools/MemorySearchTools.js +107 -39
  192. package/dist/protocols/mcp/tools/MemorySearchTools.js.map +1 -1
  193. package/dist/protocols/mcp/tools/MemoryUtilityTools.d.ts +4 -5
  194. package/dist/protocols/mcp/tools/MemoryUtilityTools.d.ts.map +1 -1
  195. package/dist/protocols/mcp/tools/MemoryUtilityTools.js +59 -208
  196. package/dist/protocols/mcp/tools/MemoryUtilityTools.js.map +1 -1
  197. package/dist/protocols/mcp/tools/PlanningTools.d.ts +2 -1
  198. package/dist/protocols/mcp/tools/PlanningTools.d.ts.map +1 -1
  199. package/dist/protocols/mcp/tools/PlanningTools.js +111 -49
  200. package/dist/protocols/mcp/tools/PlanningTools.js.map +1 -1
  201. package/dist/protocols/mcp/tools/ProjectContextTools.d.ts.map +1 -1
  202. package/dist/protocols/mcp/tools/ProjectContextTools.js +18 -12
  203. package/dist/protocols/mcp/tools/ProjectContextTools.js.map +1 -1
  204. package/dist/protocols/mcp/tools/SafetyTools.d.ts.map +1 -1
  205. package/dist/protocols/mcp/tools/SafetyTools.js +16 -13
  206. package/dist/protocols/mcp/tools/SafetyTools.js.map +1 -1
  207. package/dist/protocols/mcp/tools/SearchProjectTools.d.ts +24 -7
  208. package/dist/protocols/mcp/tools/SearchProjectTools.d.ts.map +1 -1
  209. package/dist/protocols/mcp/tools/SearchProjectTools.js +226 -126
  210. package/dist/protocols/mcp/tools/SearchProjectTools.js.map +1 -1
  211. package/dist/protocols/mcp/tools/TaskPlanningTools.d.ts +0 -32
  212. package/dist/protocols/mcp/tools/TaskPlanningTools.d.ts.map +1 -1
  213. package/dist/protocols/mcp/tools/TaskPlanningTools.js +363 -450
  214. package/dist/protocols/mcp/tools/TaskPlanningTools.js.map +1 -1
  215. package/dist/protocols/mcp/tools/TestTools.d.ts.map +1 -1
  216. package/dist/protocols/mcp/tools/TestTools.js +18 -11
  217. package/dist/protocols/mcp/tools/TestTools.js.map +1 -1
  218. package/dist/protocols/mcp/tools/TypeScriptTools.d.ts.map +1 -1
  219. package/dist/protocols/mcp/tools/TypeScriptTools.js +22 -12
  220. package/dist/protocols/mcp/tools/TypeScriptTools.js.map +1 -1
  221. package/dist/protocols/mcp/tools/UserInputTools.d.ts.map +1 -1
  222. package/dist/protocols/mcp/tools/UserInputTools.js +14 -1
  223. package/dist/protocols/mcp/tools/UserInputTools.js.map +1 -1
  224. package/dist/protocols/mcp/tools/UserMemoryTools.d.ts +3 -1
  225. package/dist/protocols/mcp/tools/UserMemoryTools.d.ts.map +1 -1
  226. package/dist/protocols/mcp/tools/UserMemoryTools.js +27 -62
  227. package/dist/protocols/mcp/tools/UserMemoryTools.js.map +1 -1
  228. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.d.ts.map +1 -1
  229. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js +14 -60
  230. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js.map +1 -1
  231. package/dist/protocols/mcp/tools/shell/ShellSandbox.d.ts.map +1 -1
  232. package/dist/protocols/mcp/tools/shell/ShellSandbox.js +9 -27
  233. package/dist/protocols/mcp/tools/shell/ShellSandbox.js.map +1 -1
  234. package/dist/repositories/interfaces/IKnowledgeGraphRepository.d.ts +40 -30
  235. package/dist/repositories/interfaces/IKnowledgeGraphRepository.d.ts.map +1 -1
  236. package/dist/schemas/EventPayloadSchema.d.ts +28 -0
  237. package/dist/schemas/EventPayloadSchema.d.ts.map +1 -1
  238. package/dist/schemas/EventPayloadSchema.js +30 -1
  239. package/dist/schemas/EventPayloadSchema.js.map +1 -1
  240. package/dist/schemas/MxpProtocolSchemas.d.ts +6 -6
  241. package/dist/services/AgentPerformanceService.d.ts +11 -0
  242. package/dist/services/AgentPerformanceService.d.ts.map +1 -1
  243. package/dist/services/AgentPerformanceService.js +59 -33
  244. package/dist/services/AgentPerformanceService.js.map +1 -1
  245. package/dist/services/AutoCorrectionService.d.ts +3 -0
  246. package/dist/services/AutoCorrectionService.d.ts.map +1 -1
  247. package/dist/services/AutoCorrectionService.js +19 -2
  248. package/dist/services/AutoCorrectionService.js.map +1 -1
  249. package/dist/services/BackgroundTaskManager.d.ts +23 -7
  250. package/dist/services/BackgroundTaskManager.d.ts.map +1 -1
  251. package/dist/services/BackgroundTaskManager.js +137 -57
  252. package/dist/services/BackgroundTaskManager.js.map +1 -1
  253. package/dist/services/BrowserManager.d.ts +2 -0
  254. package/dist/services/BrowserManager.d.ts.map +1 -1
  255. package/dist/services/BrowserManager.js +18 -15
  256. package/dist/services/BrowserManager.js.map +1 -1
  257. package/dist/services/ChannelContextMemoryOperations.d.ts +8 -1
  258. package/dist/services/ChannelContextMemoryOperations.d.ts.map +1 -1
  259. package/dist/services/ChannelContextMemoryOperations.js +89 -165
  260. package/dist/services/ChannelContextMemoryOperations.js.map +1 -1
  261. package/dist/services/ChannelContextMessageOperations.d.ts +4 -3
  262. package/dist/services/ChannelContextMessageOperations.d.ts.map +1 -1
  263. package/dist/services/ChannelContextMessageOperations.js +72 -212
  264. package/dist/services/ChannelContextMessageOperations.js.map +1 -1
  265. package/dist/services/MemoryService.d.ts +52 -21
  266. package/dist/services/MemoryService.d.ts.map +1 -1
  267. package/dist/services/MemoryService.js +775 -548
  268. package/dist/services/MemoryService.js.map +1 -1
  269. package/dist/services/PatternLearningService.d.ts +5 -0
  270. package/dist/services/PatternLearningService.d.ts.map +1 -1
  271. package/dist/services/PatternLearningService.js +26 -3
  272. package/dist/services/PatternLearningService.js.map +1 -1
  273. package/dist/services/PerformanceOptimizationService.d.ts +2 -1
  274. package/dist/services/PerformanceOptimizationService.d.ts.map +1 -1
  275. package/dist/services/PerformanceOptimizationService.js +21 -6
  276. package/dist/services/PerformanceOptimizationService.js.map +1 -1
  277. package/dist/services/PredictiveAnalyticsService.d.ts +1 -0
  278. package/dist/services/PredictiveAnalyticsService.d.ts.map +1 -1
  279. package/dist/services/PredictiveAnalyticsService.js +18 -6
  280. package/dist/services/PredictiveAnalyticsService.js.map +1 -1
  281. package/dist/services/ProactiveValidationService.d.ts +6 -0
  282. package/dist/services/ProactiveValidationService.d.ts.map +1 -1
  283. package/dist/services/ProactiveValidationService.js +58 -39
  284. package/dist/services/ProactiveValidationService.js.map +1 -1
  285. package/dist/services/TaskEffectivenessService.d.ts +55 -31
  286. package/dist/services/TaskEffectivenessService.d.ts.map +1 -1
  287. package/dist/services/TaskEffectivenessService.js +243 -125
  288. package/dist/services/TaskEffectivenessService.js.map +1 -1
  289. package/dist/services/ToolExecutionInterceptor.d.ts +4 -0
  290. package/dist/services/ToolExecutionInterceptor.d.ts.map +1 -1
  291. package/dist/services/ToolExecutionInterceptor.js +31 -5
  292. package/dist/services/ToolExecutionInterceptor.js.map +1 -1
  293. package/dist/services/UserInputRequestManager.d.ts +13 -3
  294. package/dist/services/UserInputRequestManager.d.ts.map +1 -1
  295. package/dist/services/UserInputRequestManager.js +42 -6
  296. package/dist/services/UserInputRequestManager.js.map +1 -1
  297. package/dist/services/UserMemoryService.d.ts +2 -0
  298. package/dist/services/UserMemoryService.d.ts.map +1 -1
  299. package/dist/services/UserMemoryService.js +9 -4
  300. package/dist/services/UserMemoryService.js.map +1 -1
  301. package/dist/services/ValidationAnalyticsService.d.ts +4 -0
  302. package/dist/services/ValidationAnalyticsService.d.ts.map +1 -1
  303. package/dist/services/ValidationAnalyticsService.js +30 -8
  304. package/dist/services/ValidationAnalyticsService.js.map +1 -1
  305. package/dist/services/ValidationCacheService.d.ts +3 -1
  306. package/dist/services/ValidationCacheService.d.ts.map +1 -1
  307. package/dist/services/ValidationCacheService.js +25 -4
  308. package/dist/services/ValidationCacheService.js.map +1 -1
  309. package/dist/services/ValidationMiddleware.d.ts +7 -0
  310. package/dist/services/ValidationMiddleware.d.ts.map +1 -1
  311. package/dist/services/ValidationMiddleware.js +53 -10
  312. package/dist/services/ValidationMiddleware.js.map +1 -1
  313. package/dist/services/ValidationPerformanceService.d.ts +3 -0
  314. package/dist/services/ValidationPerformanceService.d.ts.map +1 -1
  315. package/dist/services/ValidationPerformanceService.js +28 -11
  316. package/dist/services/ValidationPerformanceService.js.map +1 -1
  317. package/dist/services/WebSearchService.d.ts.map +1 -1
  318. package/dist/services/WebSearchService.js +9 -0
  319. package/dist/services/WebSearchService.js.map +1 -1
  320. package/dist/services/dag/TaskDagService.d.ts +3 -0
  321. package/dist/services/dag/TaskDagService.d.ts.map +1 -1
  322. package/dist/services/dag/TaskDagService.js +18 -0
  323. package/dist/services/dag/TaskDagService.js.map +1 -1
  324. package/dist/services/kg/EntityQValueManager.d.ts +3 -1
  325. package/dist/services/kg/EntityQValueManager.d.ts.map +1 -1
  326. package/dist/services/kg/EntityQValueManager.js +10 -10
  327. package/dist/services/kg/EntityQValueManager.js.map +1 -1
  328. package/dist/services/kg/GraphSurpriseCalculator.d.ts +0 -4
  329. package/dist/services/kg/GraphSurpriseCalculator.d.ts.map +1 -1
  330. package/dist/services/kg/GraphSurpriseCalculator.js +0 -9
  331. package/dist/services/kg/GraphSurpriseCalculator.js.map +1 -1
  332. package/dist/services/kg/KnowledgeGraphService.d.ts +12 -12
  333. package/dist/services/kg/KnowledgeGraphService.d.ts.map +1 -1
  334. package/dist/services/kg/KnowledgeGraphService.js +43 -51
  335. package/dist/services/kg/KnowledgeGraphService.js.map +1 -1
  336. package/dist/services/kg/OrparGraphIntegration.d.ts.map +1 -1
  337. package/dist/services/kg/OrparGraphIntegration.js +6 -5
  338. package/dist/services/kg/OrparGraphIntegration.js.map +1 -1
  339. package/dist/services/orpar-memory/CycleConsolidationTrigger.d.ts +1 -0
  340. package/dist/services/orpar-memory/CycleConsolidationTrigger.d.ts.map +1 -1
  341. package/dist/services/orpar-memory/CycleConsolidationTrigger.js +8 -1
  342. package/dist/services/orpar-memory/CycleConsolidationTrigger.js.map +1 -1
  343. package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts +8 -1
  344. package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts.map +1 -1
  345. package/dist/services/orpar-memory/OrparMemoryCoordinator.js +93 -45
  346. package/dist/services/orpar-memory/OrparMemoryCoordinator.js.map +1 -1
  347. package/dist/services/orpar-memory/SurpriseOrparAdapter.d.ts +1 -0
  348. package/dist/services/orpar-memory/SurpriseOrparAdapter.d.ts.map +1 -1
  349. package/dist/services/orpar-memory/SurpriseOrparAdapter.js +8 -1
  350. package/dist/services/orpar-memory/SurpriseOrparAdapter.js.map +1 -1
  351. package/dist/types/ChannelContext.d.ts +2 -1
  352. package/dist/types/ChannelContext.d.ts.map +1 -1
  353. package/dist/types/EffectivenessTypes.d.ts +4 -1
  354. package/dist/types/EffectivenessTypes.d.ts.map +1 -1
  355. package/dist/types/TaskCompletionTypes.d.ts +7 -5
  356. package/dist/types/TaskCompletionTypes.d.ts.map +1 -1
  357. package/dist/types/TaskTypes.d.ts +8 -1
  358. package/dist/types/TaskTypes.d.ts.map +1 -1
  359. package/dist/utils/GlobMatcher.d.ts +37 -0
  360. package/dist/utils/GlobMatcher.d.ts.map +1 -0
  361. package/dist/utils/GlobMatcher.js +131 -0
  362. package/dist/utils/GlobMatcher.js.map +1 -0
  363. package/package.json +1 -1
  364. package/src/config/ModelContextLimits.ts +7 -1
  365. package/src/constants/CoreTools.ts +6 -5
  366. package/src/constants/DefaultPhaseProfiles.ts +29 -0
  367. package/src/constants/ReservedIdentities.ts +51 -0
  368. package/src/database/adapters/mongodb/MongoKnowledgeGraphRepository.ts +115 -36
  369. package/src/events/ClientEventBus.ts +117 -48
  370. package/src/events/EventBus.ts +32 -2
  371. package/src/events/EventBusBase.ts +132 -39
  372. package/src/events/EventNames.ts +43 -36
  373. package/src/events/PublicEvents.ts +8 -0
  374. package/src/events/ServerEventBus.ts +9 -128
  375. package/src/events/event-definitions/ControlLoopEvents.ts +12 -0
  376. package/src/events/event-definitions/SdkEvents.ts +58 -0
  377. package/src/events/event-definitions/TaskEvents.ts +2 -2
  378. package/src/index.ts +15 -0
  379. package/src/interfaces/AgentInterfaces.ts +5 -0
  380. package/src/interfaces/ChannelConfig.ts +2 -2
  381. package/src/interfaces/ConversationMessage.ts +5 -0
  382. package/src/interfaces/IMemoryPersistence.ts +55 -1
  383. package/src/interfaces/SocketServiceInterface.ts +3 -2
  384. package/src/interfaces/TaskInterfaces.ts +16 -1
  385. package/src/models/agent.ts +0 -6
  386. package/src/models/agentIdentityReservation.ts +77 -0
  387. package/src/models/channel.ts +2 -0
  388. package/src/models/channelKey.ts +10 -0
  389. package/src/models/memory.ts +18 -19
  390. package/src/models/memoryStrata.ts +9 -23
  391. package/src/models/plan.ts +3 -3
  392. package/src/models/taskEffectiveness.ts +9 -2
  393. package/src/models/user.ts +12 -0
  394. package/src/protocols/mcp/LlmTestEnvironmentGuard.ts +30 -0
  395. package/src/protocols/mcp/McpServerTypes.ts +9 -0
  396. package/src/protocols/mcp/providers/AnthropicMcpClient.ts +2 -0
  397. package/src/protocols/mcp/providers/AzureOpenAiMcpClient.ts +1 -0
  398. package/src/protocols/mcp/providers/BaseMcpClient.ts +13 -0
  399. package/src/protocols/mcp/providers/CustomMcpClient.ts +7 -0
  400. package/src/protocols/mcp/providers/GeminiMcpClient.ts +2 -0
  401. package/src/protocols/mcp/providers/OllamaMcpClient.ts +3 -1
  402. package/src/protocols/mcp/providers/OpenAiMcpClient.ts +2 -0
  403. package/src/protocols/mcp/providers/OpenRouterMcpClient.ts +3 -0
  404. package/src/protocols/mcp/providers/XaiMcpClient.ts +2 -0
  405. package/src/protocols/mcp/security/BrowserTargetGuard.ts +64 -0
  406. package/src/protocols/mcp/security/ExternalMcpRegistrationPolicy.ts +38 -0
  407. package/src/protocols/mcp/security/HttpTargetGuard.ts +77 -6
  408. package/src/protocols/mcp/security/McpSecurityGuard.ts +7 -5
  409. package/src/protocols/mcp/security/McpToolPolicy.ts +74 -0
  410. package/src/protocols/mcp/services/ExternalMcpServerManager.ts +146 -17
  411. package/src/protocols/mcp/services/ExternalServerConfigs.ts +26 -8
  412. package/src/protocols/mcp/tools/AnalyticsTools.ts +167 -641
  413. package/src/protocols/mcp/tools/CodeAnalysisTools.ts +44 -14
  414. package/src/protocols/mcp/tools/EffectivenessTools.ts +185 -45
  415. package/src/protocols/mcp/tools/GitTools.ts +15 -5
  416. package/src/protocols/mcp/tools/InfrastructureTools.ts +42 -90
  417. package/src/protocols/mcp/tools/JsonTools.ts +7 -4
  418. package/src/protocols/mcp/tools/KnowledgeGraphTools.ts +313 -164
  419. package/src/protocols/mcp/tools/MemorySearchTools.ts +158 -46
  420. package/src/protocols/mcp/tools/MemoryUtilityTools.ts +85 -232
  421. package/src/protocols/mcp/tools/PlanningTools.ts +137 -59
  422. package/src/protocols/mcp/tools/ProjectContextTools.ts +33 -12
  423. package/src/protocols/mcp/tools/SafetyTools.ts +49 -13
  424. package/src/protocols/mcp/tools/SearchProjectTools.ts +294 -153
  425. package/src/protocols/mcp/tools/TaskPlanningTools.ts +437 -514
  426. package/src/protocols/mcp/tools/TestTools.ts +41 -11
  427. package/src/protocols/mcp/tools/TypeScriptTools.ts +61 -12
  428. package/src/protocols/mcp/tools/UserInputTools.ts +15 -1
  429. package/src/protocols/mcp/tools/UserMemoryTools.ts +27 -62
  430. package/src/protocols/mcp/tools/shell/ShellExecuteHandler.ts +26 -84
  431. package/src/protocols/mcp/tools/shell/ShellSandbox.ts +13 -31
  432. package/src/repositories/interfaces/IKnowledgeGraphRepository.ts +45 -27
  433. package/src/schemas/EventPayloadSchema.ts +45 -1
  434. package/src/services/AgentPerformanceService.ts +85 -36
  435. package/src/services/AutoCorrectionService.ts +25 -6
  436. package/src/services/BackgroundTaskManager.ts +183 -76
  437. package/src/services/BrowserManager.ts +20 -16
  438. package/src/services/ChannelContextMemoryOperations.ts +169 -202
  439. package/src/services/ChannelContextMessageOperations.ts +112 -274
  440. package/src/services/MemoryService.ts +1053 -760
  441. package/src/services/PatternLearningService.ts +32 -7
  442. package/src/services/PerformanceOptimizationService.ts +26 -9
  443. package/src/services/PredictiveAnalyticsService.ts +23 -10
  444. package/src/services/ProactiveValidationService.ts +66 -40
  445. package/src/services/TaskEffectivenessService.ts +421 -206
  446. package/src/services/ToolExecutionInterceptor.ts +40 -9
  447. package/src/services/UserInputRequestManager.ts +51 -6
  448. package/src/services/UserMemoryService.ts +12 -3
  449. package/src/services/ValidationAnalyticsService.ts +36 -11
  450. package/src/services/ValidationCacheService.ts +30 -7
  451. package/src/services/ValidationMiddleware.ts +62 -14
  452. package/src/services/ValidationPerformanceService.ts +47 -25
  453. package/src/services/WebSearchService.ts +16 -4
  454. package/src/services/dag/TaskDagService.ts +20 -1
  455. package/src/services/kg/EntityQValueManager.ts +21 -10
  456. package/src/services/kg/GraphSurpriseCalculator.ts +0 -14
  457. package/src/services/kg/KnowledgeGraphService.ts +56 -48
  458. package/src/services/kg/OrparGraphIntegration.ts +11 -5
  459. package/src/services/orpar-memory/CycleConsolidationTrigger.ts +10 -1
  460. package/src/services/orpar-memory/OrparMemoryCoordinator.ts +142 -71
  461. package/src/services/orpar-memory/SurpriseOrparAdapter.ts +10 -1
  462. package/src/types/ChannelContext.ts +3 -1
  463. package/src/types/EffectivenessTypes.ts +6 -2
  464. package/src/types/TaskCompletionTypes.ts +9 -9
  465. package/src/types/TaskTypes.ts +12 -1
  466. 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 { MemoryService } from '../../../services/MemoryService.js';
26
- import { firstValueFrom } from 'rxjs';
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
- // Serialization locks to prevent parallel plan updates
30
- const planUpdateLocks = new Map();
31
- /**
32
- * Create a task with a completion plan
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: 'Create a task with built-in completion criteria based on a plan. The task will automatically complete when plan steps are done.',
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
- type: 'string',
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
- description: 'Steps that need to be completed',
116
+ minItems: 1,
55
117
  items: {
56
118
  type: 'object',
57
119
  properties: {
58
- title: {
59
- type: 'string',
60
- description: 'Step title'
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
- type: 'number',
83
- description: 'Required percentage for percentage type (0-100)',
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
- absoluteTimeout: {
100
- type: 'number',
101
- description: 'Maximum time in milliseconds before task times out'
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 startTime = Date.now();
110
- // First create the plan
111
- const planId = uuidv4();
112
- const plan = {
113
- id: planId,
114
- title: `${input.title} - Completion Plan`,
115
- createdBy: context.agentId,
116
- createdAt: Date.now(),
117
- items: input.completionPlan.steps.map((step, index) => ({
118
- id: uuidv4(),
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
- metadata: {
203
- processingTime: Date.now() - startTime,
204
- taskId: taskId,
205
- planId: planId
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
- logger.error(`Failed to create task with plan: ${error}`);
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: 'Create a task with custom completion criteria (SystemLLM evaluation, output-based, time-based, etc.)',
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
- type: 'string',
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', 'event-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
- // For systemllm-eval
242
- objectives: {
243
- type: 'array',
244
- items: { type: 'string' },
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
- description: 'Required confidence 0-1 (for systemllm-eval)',
255
- default: 0.8
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
- description: 'Required outputs (for output-based)',
258
+ minItems: 1,
261
259
  items: {
262
260
  type: 'object',
263
261
  properties: {
264
- type: {
265
- type: 'string',
266
- enum: ['message', 'tool_call', 'file', 'memory_entry']
267
- },
268
- pattern: {
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
- // For time-based
281
- minimumDuration: {
282
- type: 'number',
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
- try {
312
- const startTime = Date.now();
313
- // Build completion config based on strategy
314
- let primaryCriteria;
315
- switch (input.completionStrategy) {
316
- case 'systemllm-eval':
317
- primaryCriteria = {
318
- type: 'systemllm-eval',
319
- objectives: input.completionCriteria.objectives || [],
320
- evaluationInterval: input.completionCriteria.evaluationInterval || 30000,
321
- confidenceThreshold: input.completionCriteria.confidenceThreshold || 0.8
322
- };
323
- break;
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
- const completionConfig = {
346
- primary: primaryCriteria,
347
- allowManualCompletion: true
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
- // Create the task
350
- const taskId = uuidv4();
351
- const taskPayload = createTaskEventPayload(TaskEvents.CREATE_REQUEST, context.agentId || 'system', context.channelId || 'default', {
352
- taskId: taskId,
353
- fromAgentId: context.agentId || 'system',
354
- toAgentId: input.assignTo?.[0] || context.agentId || 'system',
355
- task: {
356
- channelId: context.channelId || 'default',
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
- return {
382
- content,
383
- metadata: {
384
- processingTime: Date.now() - startTime,
385
- taskId: taskId
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
- catch (error) {
390
- logger.error(`Failed to create task with custom completion: ${error}`);
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
- // What this does: write the plan-based completion config onto the task's
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
- type: 'string',
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 startTime = Date.now();
440
- // Check for serialization lock
441
- if (planUpdateLocks.get(input.planId)) {
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
- // Acquire lock
449
- planUpdateLocks.set(input.planId, true);
450
- try {
451
- const completionType = input.completionType || 'all_steps';
452
- // 'percentage' completion needs a percentage. Without one the config
453
- // is meaningless and the monitor could never decide the task is done.
454
- if (completionType === 'percentage' && typeof input.percentage !== 'number') {
455
- throw new Error('percentage is required when completionType is "percentage".');
456
- }
457
- const completionConfig = {
458
- primary: {
459
- type: 'plan-based',
460
- planId: input.planId,
461
- completionType,
462
- percentage: input.percentage
463
- },
464
- allowManualCompletion: true
465
- };
466
- // Emit the real task-update event.
467
- //
468
- // This used to emit the string literal 'task:update_metadata' with a
469
- // raw object payload. No such event exists in EventNames.ts and
470
- // nothing listens for it, so the emit was a no-op — the task metadata
471
- // was never written — while the tool told the model the link had
472
- // succeeded and monitoring was active.
473
- //
474
- // TaskEvents.UPDATE_REQUEST is a real event with a real listener
475
- // (taskHandlers.handleTaskUpdate), which calls TaskService.updateTask
476
- // and persists the metadata.
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
- const content = {
434
+ }
435
+ })));
436
+ return {
437
+ content: {
485
438
  type: 'application/json',
486
439
  data: {
487
- taskId: input.taskId,
488
- planId: input.planId,
440
+ success: true,
441
+ taskId: updatedTask.id,
442
+ planId,
489
443
  completionType,
490
- percentage: input.percentage,
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
- return {
500
- content,
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
- catch (error) {
512
- logger.error(`Failed to link task to plan: ${error}`);
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: 'Get the current monitoring status and progress of a task',
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
- try {
536
- const startTime = Date.now();
537
- const content = {
538
- type: 'text',
539
- data: `Task monitoring status for ${input.taskId}:
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 you have delegated your work to another agent and are done. Stops your processing loop without completing the parent task, so the downstream agent can continue.',
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 acknowledged. Agent ${context.agentId} yielding control.\n\n${input.summary}`
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,