@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
@@ -60,15 +60,27 @@ export interface MxpMessage {
60
60
 
61
61
  export class BinaryProtocolLayer {
62
62
  private static instance: BinaryProtocolLayer | null = null;
63
-
63
+
64
64
  private readonly logger: Logger;
65
65
  private readonly validator = createStrictValidator('BinaryProtocolLayer');
66
-
66
+
67
67
  // Compression thresholds and settings
68
68
  private readonly compressionThresholds = {
69
69
  minSize: 1024, // Only compress messages > 1KB
70
- brotliThreshold: 10240, // Use Brotli for messages > 10KB
71
- gzipThreshold: 1024 // Use Gzip for smaller messages
70
+ brotliThreshold: 10240 // Use Brotli for messages > 10KB
71
+ };
72
+
73
+ /** Counters for getCompressionStats(). Updated on every encode. */
74
+ private readonly stats = {
75
+ totalCompressions: 0,
76
+ totalOriginalBytes: 0,
77
+ totalCompressedBytes: 0,
78
+ algorithmUsage: {
79
+ none: 0,
80
+ gzip: 0,
81
+ brotli: 0,
82
+ msgpack: 0
83
+ } as Record<CompressionAlgorithm, number>
72
84
  };
73
85
 
74
86
  private constructor() {
@@ -166,6 +178,12 @@ export class BinaryProtocolLayer {
166
178
  throw new Error(`Unknown encoding format: ${format}`);
167
179
  }
168
180
 
181
+ // Record the measured result so getCompressionStats() reports reality
182
+ this.stats.totalCompressions++;
183
+ this.stats.totalOriginalBytes += originalSize;
184
+ this.stats.totalCompressedBytes += result.compressedSize;
185
+ this.stats.algorithmUsage[result.algorithm]++;
186
+
169
187
  // Emit compression event for analytics using proper payload creator
170
188
  const bandwidthEventPayload = createMxpBandwidthOptimizationEventPayload(
171
189
  Events.Mxp.BANDWIDTH_OPTIMIZATION_COMPLETE,
@@ -183,82 +201,69 @@ export class BinaryProtocolLayer {
183
201
  );
184
202
  EventBus.server.emit(Events.Mxp.BANDWIDTH_OPTIMIZATION_COMPLETE, bandwidthEventPayload);
185
203
 
186
- // format: result.format,
187
- // algorithm: result.algorithm,
188
- // originalSize,
189
- // compressedSize: result.compressedSize,
190
- // compressionRatio: result.compressionRatio,
191
- // bandwidthSaved: originalSize - result.compressedSize
192
- // });
193
-
194
204
  return result;
195
205
 
196
206
  } catch (error) {
207
+ const message_ = error instanceof Error ? error.message : String(error);
197
208
  this.logger.error('Message encoding failed', {
198
- error: error instanceof Error ? error.message : String(error),
209
+ error: message_,
199
210
  channelId,
200
211
  messageType: message.type
201
212
  });
202
-
203
- // Fallback: return original JSON
204
- const jsonData = JSON.stringify(message);
205
- const originalBuffer = Buffer.from(jsonData, 'utf8');
206
- return {
207
- data: originalBuffer,
208
- format: 'json',
209
- algorithm: 'none',
210
- originalSize: originalBuffer.length,
211
- compressedSize: originalBuffer.length,
212
- compressionRatio: 1.0
213
- };
213
+
214
+ // No silent fallback to plain JSON: the caller asked for an encoded
215
+ // message and must find out that it did not get one.
216
+ throw new Error(`Binary protocol encoding failed for '${message.type}': ${message_}`);
214
217
  }
215
218
  }
216
219
 
217
220
  /**
218
- * Decode compressed message back to original format
221
+ * Decode an encoded message back to its original form.
222
+ *
223
+ * @throws If the payload cannot be decoded. A corrupt message is an error,
224
+ * not an empty result.
219
225
  */
220
- public decodeMessage(compressedData: CompressionResult): MxpMessage | null {
226
+ public decodeMessage(compressedData: CompressionResult): MxpMessage {
221
227
  try {
222
- let message: MxpMessage;
223
-
224
228
  switch (compressedData.format) {
225
- case 'json':
226
- // Plain JSON
229
+ case 'json': {
227
230
  const jsonString = compressedData.data.toString('utf8');
228
- message = JSON.parse(jsonString) as MxpMessage;
229
- break;
230
-
231
+ return JSON.parse(jsonString) as MxpMessage;
232
+ }
233
+
231
234
  case 'msgpack':
232
- // MessagePack format
233
- message = msgpack.decode(compressedData.data) as MxpMessage;
234
- break;
235
-
236
- case 'msgpack-compressed':
237
- // MessagePack + Brotli compression
235
+ return msgpack.decode(compressedData.data) as MxpMessage;
236
+
237
+ case 'msgpack-compressed': {
238
238
  const decompressedMsgpack = zlib.brotliDecompressSync(compressedData.data);
239
- message = msgpack.decode(decompressedMsgpack) as MxpMessage;
240
- break;
241
-
239
+ return msgpack.decode(decompressedMsgpack) as MxpMessage;
240
+ }
241
+
242
242
  default:
243
243
  throw new Error(`Unknown encoding format: ${compressedData.format}`);
244
244
  }
245
-
246
- // ;
247
-
248
- return message;
249
-
250
245
  } catch (error) {
246
+ const message = error instanceof Error ? error.message : String(error);
251
247
  this.logger.error('Message decoding failed', {
252
- error: error instanceof Error ? error.message : String(error),
248
+ error: message,
253
249
  format: compressedData.format,
254
250
  algorithm: compressedData.algorithm
255
251
  });
256
- return null;
252
+ throw new Error(`Binary protocol decoding failed (${compressedData.format}): ${message}`);
257
253
  }
258
254
  }
259
255
 
260
256
  /**
261
- * Batch compress multiple messages with intelligent batching
257
+ * Encode a group of messages as one or more batches.
258
+ *
259
+ * Batches that exceed maxBatchSize are split in half recursively until each
260
+ * part fits, and EVERY part is returned. An earlier version encoded only the
261
+ * first half and discarded the rest, silently losing messages.
262
+ *
263
+ * @returns One CompressionResult per batch, or null when bandwidth
264
+ * optimization is disabled or there is nothing to send.
265
+ * @throws If a batch cannot be encoded, or a single message is too large to
266
+ * fit in maxBatchSize on its own.
262
267
  */
263
268
  public batchEncode(
264
269
  messages: MxpMessage[],
@@ -268,9 +273,9 @@ export class BinaryProtocolLayer {
268
273
  maxBatchSize?: number;
269
274
  compressionLevel?: 'light' | 'standard' | 'aggressive';
270
275
  } = {}
271
- ): CompressionResult | null {
276
+ ): CompressionResult[] | null {
272
277
  this.validator.assertIsArray(messages, 'Messages must be an array');
273
-
278
+
274
279
  // Check if bandwidth optimization is enabled
275
280
  const isBandwidthOptEnabled = MxpConfigManager.getInstance().isFeatureEnabled(
276
281
  channelId,
@@ -287,54 +292,44 @@ export class BinaryProtocolLayer {
287
292
  }
288
293
 
289
294
  const maxBatchSize = options.maxBatchSize || 32768; // 32KB default
290
-
291
- try {
292
- // Create batch envelope
293
- const batchMessage: MxpMessage = {
294
- type: 'mxp_batch',
295
- payload: {
296
- version: '2.0',
297
- messageCount: messages.length,
298
- messages: messages
299
- },
300
- metadata: {
301
- batchId: `batch_${uuidv4()}`,
302
- timestamp: Date.now(),
303
- compressionLevel: options.compressionLevel || 'standard'
304
- }
305
- };
306
295
 
307
- // Check if batch exceeds size limit
308
- const batchJson = JSON.stringify(batchMessage);
309
- const batchBuffer = Buffer.from(batchJson, 'utf8');
310
-
311
- if (batchBuffer.length > maxBatchSize) {
312
- this.logger.warn(`Batch size ${batchBuffer.length} exceeds limit ${maxBatchSize}, splitting`);
313
-
314
- // Split into smaller batches (recursive approach)
315
- const midpoint = Math.floor(messages.length / 2);
316
- const firstHalf = messages.slice(0, midpoint);
317
- const secondHalf = messages.slice(midpoint);
318
-
319
- // Process first half only for now (in full implementation would handle both)
320
- return this.batchEncode(firstHalf, channelId, agentId, options);
296
+ // Create batch envelope
297
+ const batchMessage: MxpMessage = {
298
+ type: 'mxp_batch',
299
+ payload: {
300
+ version: '2.0',
301
+ messageCount: messages.length,
302
+ messages: messages
303
+ },
304
+ metadata: {
305
+ batchId: `batch_${uuidv4()}`,
306
+ timestamp: Date.now(),
307
+ compressionLevel: options.compressionLevel || 'standard'
321
308
  }
309
+ };
322
310
 
323
- // Compress the batch
324
- const compressionResult = this.encodeMessage(batchMessage, channelId, agentId);
325
-
326
- if (compressionResult) {
327
- }
311
+ // Check if batch exceeds size limit
312
+ const batchBuffer = Buffer.from(JSON.stringify(batchMessage), 'utf8');
328
313
 
329
- return compressionResult;
314
+ if (batchBuffer.length <= maxBatchSize) {
315
+ const encoded = this.encodeMessage(batchMessage, channelId, agentId);
316
+ return encoded ? [encoded] : null;
317
+ }
330
318
 
331
- } catch (error) {
332
- this.logger.error('Batch encoding failed', {
333
- error: error instanceof Error ? error.message : String(error),
334
- messageCount: messages.length
335
- });
336
- return null;
319
+ if (messages.length === 1) {
320
+ throw new Error(
321
+ `Message '${messages[0].type}' is ${batchBuffer.length} bytes, which exceeds the ` +
322
+ `maximum batch size of ${maxBatchSize} bytes and cannot be split further.`
323
+ );
337
324
  }
325
+
326
+ this.logger.warn(`Batch size ${batchBuffer.length} exceeds limit ${maxBatchSize}, splitting`);
327
+
328
+ const midpoint = Math.floor(messages.length / 2);
329
+ const firstHalf = this.batchEncode(messages.slice(0, midpoint), channelId, agentId, options);
330
+ const secondHalf = this.batchEncode(messages.slice(midpoint), channelId, agentId, options);
331
+
332
+ return [...(firstHalf ?? []), ...(secondHalf ?? [])];
338
333
  }
339
334
 
340
335
  /**
@@ -372,7 +367,10 @@ export class BinaryProtocolLayer {
372
367
  }
373
368
 
374
369
  /**
375
- * Get compression statistics for monitoring
370
+ * Compression statistics measured from the encodes this instance performed.
371
+ *
372
+ * averageCompressionRatio is compressedBytes/originalBytes across all
373
+ * encodes (1.0 = no reduction), and is 0 before anything has been encoded.
376
374
  */
377
375
  public getCompressionStats(): {
378
376
  totalCompressions: number;
@@ -380,40 +378,26 @@ export class BinaryProtocolLayer {
380
378
  totalBandwidthSaved: number;
381
379
  algorithmUsage: Record<CompressionAlgorithm, number>;
382
380
  } {
383
- // In full implementation, these would be tracked
381
+ const { totalCompressions, totalOriginalBytes, totalCompressedBytes } = this.stats;
382
+
384
383
  return {
385
- totalCompressions: 0,
386
- averageCompressionRatio: 0.3, // 70% reduction typical
387
- totalBandwidthSaved: 0,
388
- algorithmUsage: {
389
- 'none': 0,
390
- 'gzip': 0,
391
- 'brotli': 0,
392
- 'msgpack': 0
393
- }
384
+ totalCompressions,
385
+ averageCompressionRatio: totalOriginalBytes > 0
386
+ ? totalCompressedBytes / totalOriginalBytes
387
+ : 0,
388
+ totalBandwidthSaved: totalOriginalBytes - totalCompressedBytes,
389
+ algorithmUsage: { ...this.stats.algorithmUsage }
394
390
  };
395
391
  }
396
392
 
397
393
  /**
398
- * Create streaming compression for real-time communication
399
- * Placeholder for future implementation with Socket.IO streaming
394
+ * Reset the compression counters (used by tests).
400
395
  */
401
- public createCompressionStream(channelId: string, agentId?: string): any {
402
- // Check if compression is enabled
403
- if (!this.shouldApplyCompression(channelId, agentId)) {
404
- return null;
405
- }
406
-
407
-
408
- // In full implementation, would return Transform stream
409
- // For now, return configuration object
410
- return {
411
- channelId,
412
- agentId,
413
- compressionEnabled: true,
414
- algorithm: 'gzip', // Start with gzip for streaming
415
- flushInterval: 100 // Flush every 100ms for low latency
416
- };
396
+ public resetCompressionStats(): void {
397
+ this.stats.totalCompressions = 0;
398
+ this.stats.totalOriginalBytes = 0;
399
+ this.stats.totalCompressedBytes = 0;
400
+ this.stats.algorithmUsage = { none: 0, gzip: 0, brotli: 0, msgpack: 0 };
417
401
  }
418
402
  }
419
403