@mxf-dev/core 1.0.1 → 2.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 (298) hide show
  1. package/README.md +18 -0
  2. package/dist/adapters/FrameworkAdapter.js +1 -1
  3. package/dist/adapters/FrameworkAdapter.js.map +1 -1
  4. package/dist/config/ConfigManager.d.ts +9 -8
  5. package/dist/config/ConfigManager.d.ts.map +1 -1
  6. package/dist/config/ConfigManager.js +47 -17
  7. package/dist/config/ConfigManager.js.map +1 -1
  8. package/dist/config/memory-strata.config.d.ts +25 -0
  9. package/dist/config/memory-strata.config.d.ts.map +1 -0
  10. package/dist/config/memory-strata.config.js +107 -0
  11. package/dist/config/memory-strata.config.js.map +1 -0
  12. package/dist/constants/ToolNames.d.ts +1 -29
  13. package/dist/constants/ToolNames.d.ts.map +1 -1
  14. package/dist/constants/ToolNames.js +4 -17
  15. package/dist/constants/ToolNames.js.map +1 -1
  16. package/dist/database/DatabaseAdapterFactory.d.ts +14 -2
  17. package/dist/database/DatabaseAdapterFactory.d.ts.map +1 -1
  18. package/dist/database/DatabaseAdapterFactory.js +21 -6
  19. package/dist/database/DatabaseAdapterFactory.js.map +1 -1
  20. package/dist/database/adapters/mongodb/MongoBaseRepository.d.ts +7 -1
  21. package/dist/database/adapters/mongodb/MongoBaseRepository.d.ts.map +1 -1
  22. package/dist/database/adapters/mongodb/MongoBaseRepository.js +12 -2
  23. package/dist/database/adapters/mongodb/MongoBaseRepository.js.map +1 -1
  24. package/dist/events/ClientEventBus.d.ts +16 -77
  25. package/dist/events/ClientEventBus.d.ts.map +1 -1
  26. package/dist/events/ClientEventBus.js +38 -311
  27. package/dist/events/ClientEventBus.js.map +1 -1
  28. package/dist/events/EventBus.d.ts +1 -1
  29. package/dist/events/EventBus.d.ts.map +1 -1
  30. package/dist/events/EventBus.js +5 -4
  31. package/dist/events/EventBus.js.map +1 -1
  32. package/dist/events/EventBusBase.d.ts +139 -34
  33. package/dist/events/EventBusBase.d.ts.map +1 -1
  34. package/dist/events/EventBusBase.js +366 -88
  35. package/dist/events/EventBusBase.js.map +1 -1
  36. package/dist/events/EventNames.d.ts +10 -1
  37. package/dist/events/EventNames.d.ts.map +1 -1
  38. package/dist/events/EventNames.js +3 -0
  39. package/dist/events/EventNames.js.map +1 -1
  40. package/dist/events/PublicEvents.d.ts +6 -2
  41. package/dist/events/PublicEvents.d.ts.map +1 -1
  42. package/dist/events/PublicEvents.js +7 -4
  43. package/dist/events/PublicEvents.js.map +1 -1
  44. package/dist/events/ServerEventBus.d.ts +23 -112
  45. package/dist/events/ServerEventBus.d.ts.map +1 -1
  46. package/dist/events/ServerEventBus.js +58 -323
  47. package/dist/events/ServerEventBus.js.map +1 -1
  48. package/dist/events/event-definitions/LlmBudgetEvents.d.ts +68 -0
  49. package/dist/events/event-definitions/LlmBudgetEvents.d.ts.map +1 -0
  50. package/dist/events/event-definitions/LlmBudgetEvents.js +35 -0
  51. package/dist/events/event-definitions/LlmBudgetEvents.js.map +1 -0
  52. package/dist/interfaces/IMemoryPersistence.d.ts +41 -0
  53. package/dist/interfaces/IMemoryPersistence.d.ts.map +1 -0
  54. package/dist/interfaces/IMemoryPersistence.js +15 -0
  55. package/dist/interfaces/IMemoryPersistence.js.map +1 -0
  56. package/dist/middleware/MxpMiddleware.d.ts +8 -1
  57. package/dist/middleware/MxpMiddleware.d.ts.map +1 -1
  58. package/dist/middleware/MxpMiddleware.js +42 -20
  59. package/dist/middleware/MxpMiddleware.js.map +1 -1
  60. package/dist/models/channelKey.d.ts +1 -0
  61. package/dist/models/channelKey.d.ts.map +1 -1
  62. package/dist/models/channelKey.js +5 -0
  63. package/dist/models/channelKey.js.map +1 -1
  64. package/dist/models/memoryUtility.d.ts +39 -0
  65. package/dist/models/memoryUtility.d.ts.map +1 -0
  66. package/dist/models/memoryUtility.js +39 -0
  67. package/dist/models/memoryUtility.js.map +1 -0
  68. package/dist/models/user.d.ts.map +1 -1
  69. package/dist/models/user.js +23 -1
  70. package/dist/models/user.js.map +1 -1
  71. package/dist/mxp/BinaryProtocolLayer.d.ts +24 -8
  72. package/dist/mxp/BinaryProtocolLayer.d.ts.map +1 -1
  73. package/dist/mxp/BinaryProtocolLayer.js +90 -103
  74. package/dist/mxp/BinaryProtocolLayer.js.map +1 -1
  75. package/dist/mxp/ContextCompressionEngine.d.ts +57 -10
  76. package/dist/mxp/ContextCompressionEngine.d.ts.map +1 -1
  77. package/dist/mxp/ContextCompressionEngine.js +170 -128
  78. package/dist/mxp/ContextCompressionEngine.js.map +1 -1
  79. package/dist/mxp/MxpTokenOptimizer.d.ts +7 -3
  80. package/dist/mxp/MxpTokenOptimizer.d.ts.map +1 -1
  81. package/dist/mxp/MxpTokenOptimizer.js +8 -5
  82. package/dist/mxp/MxpTokenOptimizer.js.map +1 -1
  83. package/dist/prompts/MxfAgentSystemPrompt.d.ts +1 -1
  84. package/dist/prompts/MxfAgentSystemPrompt.d.ts.map +1 -1
  85. package/dist/prompts/MxfAgentSystemPrompt.js +47 -57
  86. package/dist/prompts/MxfAgentSystemPrompt.js.map +1 -1
  87. package/dist/protocols/mcp/ToolError.d.ts +123 -0
  88. package/dist/protocols/mcp/ToolError.d.ts.map +1 -0
  89. package/dist/protocols/mcp/ToolError.js +108 -0
  90. package/dist/protocols/mcp/ToolError.js.map +1 -0
  91. package/dist/protocols/mcp/defineTool.d.ts +133 -0
  92. package/dist/protocols/mcp/defineTool.d.ts.map +1 -0
  93. package/dist/protocols/mcp/defineTool.js +236 -0
  94. package/dist/protocols/mcp/defineTool.js.map +1 -0
  95. package/dist/protocols/mcp/security/HttpTargetGuard.d.ts +38 -0
  96. package/dist/protocols/mcp/security/HttpTargetGuard.d.ts.map +1 -0
  97. package/dist/protocols/mcp/security/HttpTargetGuard.js +227 -0
  98. package/dist/protocols/mcp/security/HttpTargetGuard.js.map +1 -0
  99. package/dist/protocols/mcp/security/McpSecurityGuard.d.ts +9 -1
  100. package/dist/protocols/mcp/security/McpSecurityGuard.d.ts.map +1 -1
  101. package/dist/protocols/mcp/security/McpSecurityGuard.js +10 -2
  102. package/dist/protocols/mcp/security/McpSecurityGuard.js.map +1 -1
  103. package/dist/protocols/mcp/security/McpToolPolicy.d.ts +81 -0
  104. package/dist/protocols/mcp/security/McpToolPolicy.d.ts.map +1 -0
  105. package/dist/protocols/mcp/security/McpToolPolicy.js +202 -0
  106. package/dist/protocols/mcp/security/McpToolPolicy.js.map +1 -0
  107. package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts +51 -18
  108. package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts.map +1 -1
  109. package/dist/protocols/mcp/services/ExternalMcpServerManager.js +256 -283
  110. package/dist/protocols/mcp/services/ExternalMcpServerManager.js.map +1 -1
  111. package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts +39 -6
  112. package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts.map +1 -1
  113. package/dist/protocols/mcp/services/ExternalServerConfigs.js +76 -18
  114. package/dist/protocols/mcp/services/ExternalServerConfigs.js.map +1 -1
  115. package/dist/protocols/mcp/tools/AnalyticsTools.js +1 -1
  116. package/dist/protocols/mcp/tools/AnalyticsTools.js.map +1 -1
  117. package/dist/protocols/mcp/tools/CodeAnalysisTools.d.ts.map +1 -1
  118. package/dist/protocols/mcp/tools/CodeAnalysisTools.js +15 -0
  119. package/dist/protocols/mcp/tools/CodeAnalysisTools.js.map +1 -1
  120. package/dist/protocols/mcp/tools/EffectivenessTools.js +3 -3
  121. package/dist/protocols/mcp/tools/EffectivenessTools.js.map +1 -1
  122. package/dist/protocols/mcp/tools/GitTools.d.ts +9 -369
  123. package/dist/protocols/mcp/tools/GitTools.d.ts.map +1 -1
  124. package/dist/protocols/mcp/tools/GitTools.js +222 -517
  125. package/dist/protocols/mcp/tools/GitTools.js.map +1 -1
  126. package/dist/protocols/mcp/tools/InfrastructureTools.d.ts +56 -24
  127. package/dist/protocols/mcp/tools/InfrastructureTools.d.ts.map +1 -1
  128. package/dist/protocols/mcp/tools/InfrastructureTools.js +117 -26
  129. package/dist/protocols/mcp/tools/InfrastructureTools.js.map +1 -1
  130. package/dist/protocols/mcp/tools/MemorySearchTools.d.ts +0 -3
  131. package/dist/protocols/mcp/tools/MemorySearchTools.d.ts.map +1 -1
  132. package/dist/protocols/mcp/tools/MemorySearchTools.js +58 -1
  133. package/dist/protocols/mcp/tools/MemorySearchTools.js.map +1 -1
  134. package/dist/protocols/mcp/tools/OrparTools.d.ts +8 -0
  135. package/dist/protocols/mcp/tools/OrparTools.d.ts.map +1 -1
  136. package/dist/protocols/mcp/tools/OrparTools.js +66 -0
  137. package/dist/protocols/mcp/tools/OrparTools.js.map +1 -1
  138. package/dist/protocols/mcp/tools/SafetyTools.d.ts +7 -525
  139. package/dist/protocols/mcp/tools/SafetyTools.d.ts.map +1 -1
  140. package/dist/protocols/mcp/tools/SafetyTools.js +349 -514
  141. package/dist/protocols/mcp/tools/SafetyTools.js.map +1 -1
  142. package/dist/protocols/mcp/tools/TaskPlanningTools.d.ts.map +1 -1
  143. package/dist/protocols/mcp/tools/TaskPlanningTools.js +56 -26
  144. package/dist/protocols/mcp/tools/TaskPlanningTools.js.map +1 -1
  145. package/dist/protocols/mcp/tools/TestTools.d.ts +15 -376
  146. package/dist/protocols/mcp/tools/TestTools.d.ts.map +1 -1
  147. package/dist/protocols/mcp/tools/TestTools.js +241 -363
  148. package/dist/protocols/mcp/tools/TestTools.js.map +1 -1
  149. package/dist/protocols/mcp/tools/TypeScriptTools.d.ts +6 -276
  150. package/dist/protocols/mcp/tools/TypeScriptTools.d.ts.map +1 -1
  151. package/dist/protocols/mcp/tools/TypeScriptTools.js +223 -337
  152. package/dist/protocols/mcp/tools/TypeScriptTools.js.map +1 -1
  153. package/dist/protocols/mcp/tools/WebTools.d.ts +15 -728
  154. package/dist/protocols/mcp/tools/WebTools.d.ts.map +1 -1
  155. package/dist/protocols/mcp/tools/WebTools.js +151 -257
  156. package/dist/protocols/mcp/tools/WebTools.js.map +1 -1
  157. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.d.ts +5 -3
  158. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.d.ts.map +1 -1
  159. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js +31 -6
  160. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js.map +1 -1
  161. package/dist/schemas/EventPayloadSchema.d.ts +21 -0
  162. package/dist/schemas/EventPayloadSchema.d.ts.map +1 -1
  163. package/dist/schemas/EventPayloadSchema.js +14 -0
  164. package/dist/schemas/EventPayloadSchema.js.map +1 -1
  165. package/dist/services/BackgroundTaskManager.d.ts.map +1 -1
  166. package/dist/services/BackgroundTaskManager.js +12 -4
  167. package/dist/services/BackgroundTaskManager.js.map +1 -1
  168. package/dist/services/BrowserManager.d.ts +1 -1
  169. package/dist/services/BrowserManager.d.ts.map +1 -1
  170. package/dist/services/BrowserManager.js +26 -3
  171. package/dist/services/BrowserManager.js.map +1 -1
  172. package/dist/services/MemoryCompressor.d.ts +11 -2
  173. package/dist/services/MemoryCompressor.d.ts.map +1 -1
  174. package/dist/services/MemoryCompressor.js +8 -26
  175. package/dist/services/MemoryCompressor.js.map +1 -1
  176. package/dist/services/MemoryService.d.ts +16 -3
  177. package/dist/services/MemoryService.d.ts.map +1 -1
  178. package/dist/services/MemoryService.js +79 -55
  179. package/dist/services/MemoryService.js.map +1 -1
  180. package/dist/services/PredictiveAnalyticsService.d.ts +34 -4
  181. package/dist/services/PredictiveAnalyticsService.d.ts.map +1 -1
  182. package/dist/services/PredictiveAnalyticsService.js +41 -25
  183. package/dist/services/PredictiveAnalyticsService.js.map +1 -1
  184. package/dist/services/QValueManager.d.ts +7 -0
  185. package/dist/services/QValueManager.d.ts.map +1 -1
  186. package/dist/services/QValueManager.js +9 -0
  187. package/dist/services/QValueManager.js.map +1 -1
  188. package/dist/services/RewardSignalProcessor.d.ts +38 -1
  189. package/dist/services/RewardSignalProcessor.d.ts.map +1 -1
  190. package/dist/services/RewardSignalProcessor.js +109 -7
  191. package/dist/services/RewardSignalProcessor.js.map +1 -1
  192. package/dist/services/SharedStateService.d.ts +16 -2
  193. package/dist/services/SharedStateService.d.ts.map +1 -1
  194. package/dist/services/SharedStateService.js +44 -3
  195. package/dist/services/SharedStateService.js.map +1 -1
  196. package/dist/services/TaskEffectivenessService.d.ts +34 -18
  197. package/dist/services/TaskEffectivenessService.d.ts.map +1 -1
  198. package/dist/services/TaskEffectivenessService.js +91 -155
  199. package/dist/services/TaskEffectivenessService.js.map +1 -1
  200. package/dist/services/WebSearchService.d.ts.map +1 -1
  201. package/dist/services/WebSearchService.js.map +1 -1
  202. package/dist/services/dag/TaskDagService.d.ts.map +1 -1
  203. package/dist/services/dag/TaskDagService.js +2 -0
  204. package/dist/services/dag/TaskDagService.js.map +1 -1
  205. package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts +7 -0
  206. package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts.map +1 -1
  207. package/dist/services/orpar-memory/OrparMemoryCoordinator.js +71 -10
  208. package/dist/services/orpar-memory/OrparMemoryCoordinator.js.map +1 -1
  209. package/dist/types/MemoryUtilityTypes.d.ts +2 -0
  210. package/dist/types/MemoryUtilityTypes.d.ts.map +1 -1
  211. package/dist/types/MemoryUtilityTypes.js.map +1 -1
  212. package/dist/utils/Logger.d.ts +43 -3
  213. package/dist/utils/Logger.d.ts.map +1 -1
  214. package/dist/utils/Logger.js +78 -36
  215. package/dist/utils/Logger.js.map +1 -1
  216. package/dist/utils/MxpEncryption.d.ts +19 -6
  217. package/dist/utils/MxpEncryption.d.ts.map +1 -1
  218. package/dist/utils/MxpEncryption.js +48 -16
  219. package/dist/utils/MxpEncryption.js.map +1 -1
  220. package/package.json +19 -4
  221. package/src/adapters/FrameworkAdapter.ts +1 -1
  222. package/src/config/ConfigManager.ts +52 -19
  223. package/src/config/memory-strata.config.ts +136 -0
  224. package/src/constants/ToolNames.ts +4 -18
  225. package/src/database/DatabaseAdapterFactory.ts +23 -6
  226. package/src/database/adapters/mongodb/MongoBaseRepository.ts +16 -2
  227. package/src/events/ClientEventBus.ts +68 -403
  228. package/src/events/EventBus.ts +7 -8
  229. package/src/events/EventBusBase.ts +479 -116
  230. package/src/events/EventNames.ts +6 -0
  231. package/src/events/PublicEvents.ts +7 -4
  232. package/src/events/ServerEventBus.ts +78 -473
  233. package/src/events/event-definitions/LlmBudgetEvents.ts +74 -0
  234. package/src/interfaces/IMemoryPersistence.ts +51 -0
  235. package/src/middleware/MxpMiddleware.ts +51 -24
  236. package/src/models/channelKey.ts +18 -4
  237. package/src/models/memoryUtility.ts +64 -0
  238. package/src/models/user.ts +36 -4
  239. package/src/mxp/BinaryProtocolLayer.ts +108 -124
  240. package/src/mxp/ContextCompressionEngine.ts +219 -161
  241. package/src/mxp/MxpTokenOptimizer.ts +10 -10
  242. package/src/prompts/MxfAgentSystemPrompt.ts +45 -55
  243. package/src/protocols/mcp/ToolError.ts +201 -0
  244. package/src/protocols/mcp/defineTool.ts +379 -0
  245. package/src/protocols/mcp/security/HttpTargetGuard.ts +267 -0
  246. package/src/protocols/mcp/security/McpSecurityGuard.ts +10 -3
  247. package/src/protocols/mcp/security/McpToolPolicy.ts +221 -0
  248. package/src/protocols/mcp/services/ExternalMcpServerManager.ts +340 -322
  249. package/src/protocols/mcp/services/ExternalServerConfigs.ts +82 -19
  250. package/src/protocols/mcp/tools/AnalyticsTools.ts +1 -1
  251. package/src/protocols/mcp/tools/CodeAnalysisTools.ts +15 -0
  252. package/src/protocols/mcp/tools/EffectivenessTools.ts +3 -3
  253. package/src/protocols/mcp/tools/GitTools.ts +290 -569
  254. package/src/protocols/mcp/tools/InfrastructureTools.ts +189 -43
  255. package/src/protocols/mcp/tools/MemorySearchTools.ts +77 -1
  256. package/src/protocols/mcp/tools/OrparTools.ts +87 -0
  257. package/src/protocols/mcp/tools/SafetyTools.ts +501 -579
  258. package/src/protocols/mcp/tools/TaskPlanningTools.ts +81 -39
  259. package/src/protocols/mcp/tools/TestTools.ts +339 -419
  260. package/src/protocols/mcp/tools/TypeScriptTools.ts +316 -376
  261. package/src/protocols/mcp/tools/WebTools.ts +209 -307
  262. package/src/protocols/mcp/tools/shell/ShellExecuteHandler.ts +53 -14
  263. package/src/schemas/EventPayloadSchema.ts +37 -0
  264. package/src/services/BackgroundTaskManager.ts +12 -4
  265. package/src/services/BrowserManager.ts +41 -1
  266. package/src/services/MemoryCompressor.ts +20 -32
  267. package/src/services/MemoryService.ts +96 -58
  268. package/src/services/PredictiveAnalyticsService.ts +55 -32
  269. package/src/services/QValueManager.ts +10 -0
  270. package/src/services/RewardSignalProcessor.ts +138 -9
  271. package/src/services/SharedStateService.ts +56 -8
  272. package/src/services/TaskEffectivenessService.ts +114 -187
  273. package/src/services/WebSearchService.ts +2 -1
  274. package/src/services/dag/TaskDagService.ts +2 -0
  275. package/src/services/orpar-memory/OrparMemoryCoordinator.ts +86 -10
  276. package/src/types/MemoryUtilityTypes.ts +2 -0
  277. package/src/utils/Logger.ts +116 -40
  278. package/src/utils/MxpEncryption.ts +69 -34
  279. package/dist/mxp/MxpEventForwardingEnhancer.d.ts +0 -134
  280. package/dist/mxp/MxpEventForwardingEnhancer.d.ts.map +0 -1
  281. package/dist/mxp/MxpEventForwardingEnhancer.js +0 -361
  282. package/dist/mxp/MxpEventForwardingEnhancer.js.map +0 -1
  283. package/dist/protocols/mcp/services/ToolSchemaEnhancements.d.ts +0 -56
  284. package/dist/protocols/mcp/services/ToolSchemaEnhancements.d.ts.map +0 -1
  285. package/dist/protocols/mcp/services/ToolSchemaEnhancements.js +0 -57
  286. package/dist/protocols/mcp/services/ToolSchemaEnhancements.js.map +0 -1
  287. package/dist/protocols/mcp/tools/ControlLoopLifecycle.d.ts +0 -270
  288. package/dist/protocols/mcp/tools/ControlLoopLifecycle.d.ts.map +0 -1
  289. package/dist/protocols/mcp/tools/ControlLoopLifecycle.js +0 -256
  290. package/dist/protocols/mcp/tools/ControlLoopLifecycle.js.map +0 -1
  291. package/dist/protocols/mcp/tools/LspTools.d.ts +0 -495
  292. package/dist/protocols/mcp/tools/LspTools.d.ts.map +0 -1
  293. package/dist/protocols/mcp/tools/LspTools.js +0 -469
  294. package/dist/protocols/mcp/tools/LspTools.js.map +0 -1
  295. package/src/mxp/MxpEventForwardingEnhancer.ts +0 -471
  296. package/src/protocols/mcp/services/ToolSchemaEnhancements.ts +0 -92
  297. package/src/protocols/mcp/tools/ControlLoopLifecycle.ts +0 -302
  298. package/src/protocols/mcp/tools/LspTools.ts +0 -476
@@ -25,22 +25,17 @@
25
25
  * Handles client-specific event operations, socket connections, and event forwarding.
26
26
  */
27
27
 
28
- import { Subject, Subscription, filter, map } from 'rxjs';
29
- import { Events } from './EventNames.js';
30
- import type { EventMap } from './EventNames.js';
28
+ import { Subject, Subscription } from 'rxjs';
31
29
  import { ControlLoopEvents } from './event-definitions/ControlLoopEvents.js';
32
30
  import { OrparEvents } from './event-definitions/OrparEvents.js';
33
- import {
34
- AnyEventName,
35
- BaseEventBusImplementation,
36
- EventHandler,
37
- EventMessage,
38
- SocketLike,
39
- validateEventName, invokeHandlerSafely, PayloadOf } from './EventBusBase.js';
40
- import {
41
- createAgentEventPayload,
42
- createBaseEventPayload,
43
- } from '../schemas/EventPayloadSchema.js';
31
+ import {
32
+ AnyEventName,
33
+ BaseEventBusImplementation,
34
+ EventMessage,
35
+ SocketLike,
36
+ validateEventName,
37
+ PayloadOf
38
+ } from './EventBusBase.js';
44
39
  import { createStrictValidator } from '../utils/validation.js';
45
40
  import { Logger } from '../utils/Logger.js';
46
41
 
@@ -87,8 +82,8 @@ export interface IClientEventBus extends BaseEventBusImplementation {
87
82
  unregisterSocket(socketId: string): this;
88
83
 
89
84
  /**
90
- * Emit an event through a specific registered socket
91
- * Falls back to the primary socket with a warning if socketId not found.
85
+ * Emit an event through a specific registered socket.
86
+ * Uses the primary socket when socketId is not in the registry.
92
87
  * @param socketId Identifier of the socket to emit through
93
88
  * @param event Event name
94
89
  * @param payload Event payload
@@ -102,50 +97,39 @@ export interface IClientEventBus extends BaseEventBusImplementation {
102
97
  disconnect(): this;
103
98
 
104
99
  /**
105
- * Remove all socket listeners
100
+ * Remove listeners the sockets registered on this bus
106
101
  * @returns this (for chaining)
107
102
  */
108
- removeAllListeners(event?: AnyEventName): this;
109
-
110
- /**
111
- * Emit an event through the primary socket
112
- * @param event Event name
113
- * @param payload Event payload
114
- */
115
- emit<K extends AnyEventName>(event: K, payload: PayloadOf<K>): void;
103
+ removeAllSocketListeners(): this;
116
104
  }
117
105
 
118
106
  /**
119
- * Client-side event bus implementation
107
+ * Client-side event bus implementation.
108
+ *
109
+ * Subscription handling (on/once/off/onAll/categories/debug) lives in
110
+ * BaseEventBusImplementation. This class owns only the socket transport.
120
111
  */
121
112
  export class ClientEventBus extends BaseEventBusImplementation implements IClientEventBus {
122
113
  // Primary socket (set by setClientSocket, used by admin/SDK emit())
123
114
  private socket: SocketLike | null = null;
124
115
  // Listeners tracked for the primary socket's onAny handler
125
116
  private socketListeners: Map<string, (...args: any[]) => void> = new Map();
126
- private subscriptions: Subscription[] = [];
127
- private categorySubscriptions: Map<string, Subscription[]> = new Map();
128
-
129
- // Track subscriptions by event and handler
130
- private handlerSubscriptions: Map<string, Map<EventHandler<any>, Subscription>> = new Map();
131
- private debugMode: boolean = false;
132
- private debugSubscription: Subscription | null = null;
133
117
 
134
118
  // Socket registry: maps socketId (typically agentId) → socket instance
135
119
  // Agent sockets register here so they don't overwrite the primary admin socket
136
120
  private socketRegistry: Map<string, SocketLike> = new Map();
137
121
  // Listeners tracked for each registered socket's onAny handler
138
122
  private socketListenersRegistry: Map<string, Map<string, (...args: any[]) => void>> = new Map();
139
-
123
+
124
+
140
125
  /**
141
126
  * Create a new ClientEventBus
142
127
  * @param eventSubject Subject to use for events
143
128
  */
144
129
  constructor(eventSubject: Subject<EventMessage>) {
145
- super(eventSubject);
146
- //// ;
130
+ super(eventSubject, logger);
147
131
  }
148
-
132
+
149
133
  /**
150
134
  * Set the socket to use for event forwarding
151
135
  * @param socket Socket to use
@@ -154,78 +138,44 @@ export class ClientEventBus extends BaseEventBusImplementation implements IClien
154
138
  public setClientSocket(socket: SocketLike): this {
155
139
  try {
156
140
  validator.assertIsObject(socket);
157
-
141
+
158
142
  // Check that this is a socket-like object
159
143
  validator.assertHasFunction(socket, 'on');
160
144
  validator.assertHasFunction(socket, 'emit');
161
-
145
+
162
146
  // Store the socket
163
147
  this.socket = socket;
164
-
148
+
165
149
  // Set up event forwarding
166
150
  this.setupClientSocketForwarding(socket);
167
-
151
+
168
152
  } catch (error) {
169
153
  logger.error('[ClientEventBus] Error setting socket:', error instanceof Error ? error.message : String(error));
170
154
  throw new Error(`Error setting socket: ${error instanceof Error ? error.message : 'Invalid socket'}`);
171
155
  }
172
-
156
+
173
157
  return this;
174
158
  }
175
-
159
+
176
160
  /**
177
- * Emit an event
178
- * This is the core method that handles all event emission
179
- * @param event Event name
180
- * @param payload Event payload
161
+ * Forward an emitted event to the primary socket.
162
+ *
163
+ * Called by BaseEventBusImplementation.emit() after validation and local
164
+ * delivery. A disconnected socket is a warning, not an error: local
165
+ * subscribers still received the event.
181
166
  */
182
- public emit<K extends AnyEventName>(event: K, payload: PayloadOf<K>): void {
183
- try {
184
-
185
- // ;
186
-
187
- // Validate event name and payload
188
- validateEventName(event);
189
- this.validateEventPayload(String(event), payload);
190
-
191
- // Emit to local event bus
192
- this.eventSubject.next({
193
- type: event,
194
- payload,
195
- });
196
-
197
- // Forward to socket.io if connected
198
- if (this.socket && this.socket.connected) {
199
- // Direct log for critical events to ensure visibility
200
- if (typeof event === 'string' && (event.includes('register') || event.includes('connect'))) {
201
- }
202
-
203
- // Add detailed logging for message events
204
- if (typeof event === 'string' && event.includes('message')) {
205
- }
206
-
207
- // Emit to socket
208
- this.socket.emit(event, payload);
209
- } else {
210
- logger.warn(`[ClientEventBus] WARNING: Socket not connected, could not forward event: ${event}. Socket exists: ${!!this.socket}, Socket connected: ${this.socket?.connected}`);
211
- }
212
-
213
- //// ;
214
- } catch (error) {
215
- logger.error(`[ClientEventBus] Error emitting event '${event}':`, error instanceof Error ? error.message : String(error));
216
-
217
- // Emit error event
218
- this.eventSubject.next({
219
- type: Events.Agent.ERROR,
220
- payload: {
221
- error: error instanceof Error ? error.message : String(error),
222
- event,
223
- timestamp: Date.now()
224
- }
225
- });
167
+ protected override forwardToTransport<K extends AnyEventName>(event: K, payload: PayloadOf<K>): void {
168
+ if (this.socket && this.socket.connected) {
169
+ this.socket.emit(String(event), payload);
170
+ return;
226
171
  }
172
+
173
+ logger.warn(
174
+ `[ClientEventBus] Socket not connected, could not forward event: ${String(event)}. ` +
175
+ `Socket exists: ${!!this.socket}, Socket connected: ${this.socket?.connected}`
176
+ );
227
177
  }
228
-
178
+
229
179
  /**
230
180
  * Set up socket event forwarding from socket to event bus
231
181
  * @param socket Socket to use
@@ -397,48 +347,36 @@ export class ClientEventBus extends BaseEventBusImplementation implements IClien
397
347
  * @param payload Event payload
398
348
  */
399
349
  public emitOn(socketId: string, event: AnyEventName, payload: any): void {
400
- try {
401
- // Validate event name and payload (same checks as emit())
402
- validateEventName(event);
403
- this.validateEventPayload(String(event), payload);
404
-
405
- // Push to local event bus so on()/once() subscribers receive it
406
- this.eventSubject.next({ type: event, payload });
407
-
408
- // Look up the registered socket
409
- const registeredSocket = this.socketRegistry.get(socketId);
410
- if (registeredSocket && registeredSocket.connected) {
411
- registeredSocket.emit(event, payload);
412
- return;
413
- }
350
+ // Same validation contract as emit(): a bad event name or payload throws.
351
+ validateEventName(event);
414
352
 
415
- // Fallback: try the primary socket with a warning
416
- if (registeredSocket && !registeredSocket.connected) {
417
- logger.warn(`[ClientEventBus] Registered socket '${socketId}' not connected, falling back to primary for event: ${event}`);
418
- } else {
419
- // Debug level: this is expected during early agent startup before the socket is registered
420
- logger.debug(`[ClientEventBus] Socket '${socketId}' not found in registry, falling back to primary for event: ${event}`);
421
- }
353
+ if (payload === undefined || payload === null) {
354
+ throw new Error(
355
+ `Event '${String(event)}' was emitted with a ${payload === null ? 'null' : 'undefined'} payload. ` +
356
+ `Build the payload with a helper from EventPayloadSchema.`
357
+ );
358
+ }
422
359
 
423
- if (this.socket && this.socket.connected) {
424
- this.socket.emit(event, payload);
425
- } else {
426
- logger.warn(`[ClientEventBus] No socket available to emit event: ${event}`);
427
- }
360
+ this.validateEventPayload(String(event), payload);
428
361
 
429
- } catch (error) {
430
- logger.error(`[ClientEventBus] Error in emitOn('${socketId}', '${event}'):`, error instanceof Error ? error.message : String(error));
431
-
432
- // Emit error event
433
- this.eventSubject.next({
434
- type: Events.Agent.ERROR,
435
- payload: {
436
- error: error instanceof Error ? error.message : String(error),
437
- event,
438
- timestamp: Date.now()
439
- }
440
- });
362
+ // Push to local event bus so on()/once() subscribers receive it
363
+ this.eventSubject.next({ type: event, payload });
364
+
365
+ // Look up the registered socket
366
+ const registeredSocket = this.socketRegistry.get(socketId);
367
+ if (registeredSocket && registeredSocket.connected) {
368
+ registeredSocket.emit(String(event), payload);
369
+ return;
441
370
  }
371
+
372
+ if (registeredSocket && !registeredSocket.connected) {
373
+ logger.warn(`[ClientEventBus] Registered socket '${socketId}' not connected, using primary socket for event: ${String(event)}`);
374
+ } else {
375
+ // Debug level: this is expected during early agent startup before the socket is registered
376
+ logger.debug(`[ClientEventBus] Socket '${socketId}' not found in registry, using primary socket for event: ${String(event)}`);
377
+ }
378
+
379
+ this.forwardToTransport(event, payload as PayloadOf<AnyEventName>);
442
380
  }
443
381
 
444
382
  /**
@@ -471,65 +409,6 @@ export class ClientEventBus extends BaseEventBusImplementation implements IClien
471
409
  return this;
472
410
  }
473
411
 
474
- /**
475
- * Unsubscribe from an event
476
- * @param event Event name
477
- * @param handler Event handler function (optional)
478
- */
479
- public override off<K extends AnyEventName>(event: K, handler?: EventHandler<any>): void {
480
- validateEventName(event);
481
-
482
- const eventHandlers = this.handlerSubscriptions.get(event);
483
- if (!eventHandlers) {
484
- // No handlers for this event found
485
- // ;
486
- return;
487
- }
488
-
489
- if (handler) {
490
- // If specific handler provided, just unsubscribe that one
491
- const subscription = eventHandlers.get(handler);
492
- if (subscription) {
493
- // Unsubscribe from the RxJS subscription
494
- subscription.unsubscribe();
495
-
496
- // Remove from our handler registry
497
- eventHandlers.delete(handler);
498
-
499
- // Remove from the array if present
500
- const index = this.subscriptions.indexOf(subscription);
501
- if (index !== -1) {
502
- this.subscriptions.splice(index, 1);
503
- }
504
-
505
- // ;
506
- } else {
507
- // ;
508
- }
509
- } else {
510
- // If no specific handler, unsubscribe all handlers for this event
511
- let unsubscribedCount = 0;
512
-
513
- eventHandlers.forEach((subscription) => {
514
- // Unsubscribe from the RxJS subscription
515
- subscription.unsubscribe();
516
-
517
- // Remove from the array if present
518
- const index = this.subscriptions.indexOf(subscription);
519
- if (index !== -1) {
520
- this.subscriptions.splice(index, 1);
521
- }
522
-
523
- unsubscribedCount++;
524
- });
525
-
526
- // Clear all handlers for this event
527
- eventHandlers.clear();
528
-
529
- // ;
530
- }
531
- }
532
-
533
412
  /**
534
413
  * Remove all socket listeners (primary socket and all registered sockets)
535
414
  * @returns this (for chaining)
@@ -604,218 +483,4 @@ export class ClientEventBus extends BaseEventBusImplementation implements IClien
604
483
  return !!this.socket && !!this.socket.connected;
605
484
  }
606
485
 
607
- /**
608
- * Subscribe to an event in the client event bus
609
- *
610
- * @param event Event name to subscribe to
611
- * @param listener Listener function to call when the event is emitted
612
- * @returns Subscription that can be unsubscribed to stop listening
613
- */
614
- public on<T extends AnyEventName>(event: T, listener: (payload: PayloadOf<T>) => void): Subscription {
615
- // Create a filtered observable for this specific event
616
- const observable = this.eventSubject.pipe(
617
- filter((e: EventMessage) => e.type === event),
618
- map((e: EventMessage) => e.payload)
619
- );
620
-
621
- // Log subscription to important events
622
- if (event && typeof event === 'string' &&
623
- (event.includes('register') || event.includes('connect'))) {
624
- }
625
-
626
- // Subscribe with throw/rejection isolation so one bad listener cannot
627
- // kill the subscription or fail silently.
628
- const subscription = observable.subscribe((payload) =>
629
- invokeHandlerSafely(logger, event, listener, payload)
630
- );
631
-
632
- // Store the subscription for cleanup
633
- this.subscriptions.push(subscription);
634
-
635
- // Also store in our handler-based registry for off() support
636
- if (!this.handlerSubscriptions.has(event)) {
637
- this.handlerSubscriptions.set(event, new Map());
638
- }
639
-
640
- const eventHandlers = this.handlerSubscriptions.get(event);
641
- if (eventHandlers) {
642
- eventHandlers.set(listener, subscription);
643
- }
644
-
645
- return subscription;
646
- }
647
-
648
- /**
649
- * Subscribe to an event once in the client event bus
650
- * Once the event is fired, the subscription is automatically removed
651
- *
652
- * @param event Event name to subscribe to
653
- * @param listener Listener function to call when the event is emitted
654
- * @returns Subscription that can be unsubscribed to stop listening
655
- */
656
- public override once<T extends AnyEventName>(event: T, listener: (payload: PayloadOf<T>) => void): Subscription {
657
- // Create a filtered observable for this specific event
658
- const observable = this.eventSubject.pipe(
659
- filter((e: EventMessage) => e.type === event),
660
- map((e: EventMessage) => e.payload)
661
- );
662
-
663
- // Log subscription to important events
664
- if (event && typeof event === 'string' &&
665
- (event.includes('register') || event.includes('connect'))) {
666
- }
667
-
668
- // Create a wrapper listener that will unsubscribe after first execution
669
- const onceListener = (payload: any) => {
670
- try {
671
- invokeHandlerSafely(logger, event, listener, payload);
672
- } finally {
673
- // Always unsubscribe — once means once, even when the listener throws.
674
- this.off(event, onceListener);
675
- }
676
- };
677
-
678
- // Subscribe to the observable with the one-time listener
679
- const subscription = observable.subscribe(onceListener);
680
-
681
- // Store the subscription for cleanup
682
- this.subscriptions.push(subscription);
683
-
684
- // Also store in our handler-based registry for off() support
685
- if (!this.handlerSubscriptions.has(event)) {
686
- this.handlerSubscriptions.set(event, new Map());
687
- }
688
-
689
- const eventHandlers = this.handlerSubscriptions.get(event);
690
- if (eventHandlers) {
691
- eventHandlers.set(listener, subscription);
692
- }
693
-
694
- return subscription;
695
- }
696
-
697
- /**
698
- * Subscribe to all events in the client event bus
699
- *
700
- * @param listener Listener function that receives both event type and payload
701
- * @returns Subscription that can be unsubscribed to stop listening
702
- */
703
- public onAll(listener: (eventType: string, payload: any) => void): Subscription {
704
- // Create an observable that passes both event type and payload
705
- const observable = this.eventSubject.pipe(
706
- map((e: EventMessage) => ({ type: e.type, payload: e.payload }))
707
- );
708
-
709
-
710
- // Subscribe to the observable with the listener
711
- const subscription = observable.subscribe(event => {
712
- listener(event.type, event.payload);
713
- });
714
-
715
- // Store the subscription for cleanup
716
- this.subscriptions.push(subscription);
717
-
718
- return subscription;
719
- }
720
-
721
- /**
722
- * Subscribe to an event in the client event bus with category
723
- * for grouped subscription management
724
- *
725
- * @param category Category name for grouping subscriptions
726
- * @param event Event name to subscribe to
727
- * @param listener Listener function to call when the event is emitted
728
- * @returns Subscription that can be unsubscribed to stop listening
729
- */
730
- public onWithCategory<T extends AnyEventName>(
731
- category: string,
732
- event: T,
733
- listener: (payload: any) => void
734
- ): Subscription {
735
- // Get the subscription using the standard on method
736
- const subscription = this.on(event, listener);
737
-
738
- // Store in the category map
739
- if (!this.categorySubscriptions.has(category)) {
740
- this.categorySubscriptions.set(category, []);
741
- }
742
-
743
- const categorySubs = this.categorySubscriptions.get(category);
744
- if (categorySubs) {
745
- categorySubs.push(subscription);
746
- }
747
-
748
- return subscription;
749
- }
750
-
751
- /**
752
- * Unsubscribe from all events in a specific category
753
- *
754
- * @param category Category name to unsubscribe from
755
- * @returns this (for chaining)
756
- */
757
- public unsubscribeCategory(category: string): this {
758
- const subscriptions = this.categorySubscriptions.get(category) || [];
759
-
760
- // Unsubscribe from each subscription in the category
761
- subscriptions.forEach(subscription => {
762
- subscription.unsubscribe();
763
-
764
- // Also remove from the main subscriptions array
765
- const index = this.subscriptions.indexOf(subscription);
766
- if (index !== -1) {
767
- this.subscriptions.splice(index, 1);
768
- }
769
- });
770
-
771
- // Clear the category
772
- this.categorySubscriptions.delete(category);
773
-
774
- return this;
775
- }
776
-
777
- /**
778
- * Enable or disable debug mode to log all events
779
- *
780
- * @param enabled Whether debug mode should be enabled
781
- * @returns this (for chaining)
782
- */
783
- public enableDebugMode(enabled: boolean = true): this {
784
- // If already in the requested mode, do nothing
785
- if (this.debugMode === enabled) {
786
- return this;
787
- }
788
-
789
- this.debugMode = enabled;
790
-
791
- // If enabling debug mode
792
- if (enabled) {
793
-
794
- // Create a subscription to all events
795
- this.debugSubscription = this.onAll((eventType, payload) => {
796
- // ;
797
- });
798
-
799
- // Make sure it's tracked for cleanup
800
- if (this.debugSubscription) {
801
- this.subscriptions.push(this.debugSubscription);
802
- }
803
- }
804
- // If disabling debug mode
805
- else if (this.debugSubscription) {
806
-
807
- // Unsubscribe from the debug subscription
808
- this.debugSubscription.unsubscribe();
809
-
810
- // Remove from subscriptions array
811
- const index = this.subscriptions.indexOf(this.debugSubscription);
812
- if (index !== -1) {
813
- this.subscriptions.splice(index, 1);
814
- }
815
-
816
- this.debugSubscription = null;
817
- }
818
-
819
- return this;
820
- }
821
486
  }
@@ -54,7 +54,6 @@ export class EventBusImplementation {
54
54
  */
55
55
  public constructor() {
56
56
  this.eventSubject = new Subject<EventMessage>();
57
- //;
58
57
  }
59
58
 
60
59
  /**
@@ -86,23 +85,23 @@ export class EventBusImplementation {
86
85
  * This is primarily used for testing.
87
86
  */
88
87
  public reset(): void {
89
- // Reset the event subject
88
+ // Completing the Subject disposes every subscription both buses hold,
89
+ // and their completion callbacks clear their registries.
90
90
  this.eventSubject.complete();
91
91
  this.eventSubject = new Subject<EventMessage>();
92
-
93
- // Reset client and server instances
92
+
93
+ // Reset client and server instances so they bind to the new Subject
94
94
  this.clientEventBus = null;
95
95
  this.serverEventBus = null;
96
-
97
96
  }
98
-
97
+
99
98
  /**
100
- * Debug method to log all events being processed by the EventBus
99
+ * Log every event passing through the bus.
101
100
  * @returns A subscription that can be unsubscribed to stop debugging
102
101
  */
103
102
  public debug() {
104
-
105
103
  return this.eventSubject.subscribe(event => {
104
+ logger.debug(`event '${event.type}': ${JSON.stringify(event.payload)}`);
106
105
  });
107
106
  }
108
107
  }