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