@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
@@ -20,16 +20,36 @@
20
20
 
21
21
  /**
22
22
  * Unified Logger for the Model Exchange Framework
23
- *
23
+ *
24
24
  * Provides a consistent logging interface for both server and SDK components.
25
25
  * Features:
26
26
  * - Configurable log levels
27
27
  * - Context tagging
28
28
  * - Timestamp formatting
29
29
  * - Separate client/server logging pathways
30
- *
30
+ *
31
31
  * This follows DRY principles by providing a single logging implementation
32
32
  * for the entire framework.
33
+ *
34
+ * ## Level resolution
35
+ *
36
+ * Two levels are in play and BOTH are honoured — the more restrictive one wins:
37
+ *
38
+ * - The **target level** (`enableServerLogging('info')`, `enableClientLogging(...)`)
39
+ * is the application-wide ceiling. An operator who asks for `error` gets `error`.
40
+ * - The **instance level** (`new Logger('warn', 'Foo')`, `logger.setLevel('warn')`)
41
+ * turns an individual component down below that ceiling.
42
+ *
43
+ * Effective level = min(instanceLevel, targetLevel). Before this, the target
44
+ * level was read unconditionally and every instance level in the codebase was
45
+ * silently discarded.
46
+ *
47
+ * ## Errors always surface
48
+ *
49
+ * `error()` output ignores the `enabled` flag. A library that swallows its own
50
+ * errors gives consumers no way to find out something broke: the buses catch
51
+ * handler failures and log them, so a disabled logger made those failures
52
+ * disappear entirely. Everything below `error` still respects `enabled`.
33
53
  */
34
54
 
35
55
  // Global logging configuration
@@ -44,14 +64,15 @@ interface LoggingConfig {
44
64
  };
45
65
  }
46
66
 
47
- // Default logging configuration
67
+ // Default logging configuration.
68
+ // `enabled: false` gates info/warn/debug/trace only — errors are always written.
48
69
  const LOGGING_CONFIG: LoggingConfig = {
49
70
  server: {
50
- enabled: false, // Server logging disabled by default
71
+ enabled: false, // Server non-error logging off by default
51
72
  level: 'debug'
52
73
  },
53
74
  client: {
54
- enabled: false, // Client logging disabled by default (TUI suppresses via disableClientLogging())
75
+ enabled: false, // Client non-error logging off by default (TUI suppresses via disableClientLogging())
55
76
  level: 'debug'
56
77
  }
57
78
  };
@@ -103,16 +124,54 @@ export class Logger {
103
124
 
104
125
  /**
105
126
  * Create a new Logger
106
- * @param level Log level (error, warn, info, debug, trace)
127
+ *
128
+ * @param level Log level (error, warn, info, debug, trace). Caps this
129
+ * component's verbosity; the target level still applies, and
130
+ * the more restrictive of the two wins.
107
131
  * @param context Context string to prefix log messages
108
132
  * @param target Target pathway ('server' or 'client') - defaults to 'server'
109
133
  */
110
134
  constructor(level: string, context: string = '', target: 'server' | 'client' = 'server') {
135
+ if (Logger.LOG_LEVELS[level] === undefined) {
136
+ throw new Error(
137
+ `Logger: unknown log level '${level}'. Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`
138
+ );
139
+ }
111
140
  this.level = level;
112
141
  this.context = context;
113
142
  this.target = target;
114
143
  }
115
144
 
145
+ /**
146
+ * Resolve the level this logger actually writes at.
147
+ *
148
+ * The instance level and the target level are both honoured; whichever is
149
+ * more restrictive wins. Levels are ordered error(0) → trace(4), so "more
150
+ * restrictive" is the lower number.
151
+ *
152
+ * An unknown level string is a programming error and is rejected rather
153
+ * than silently treated as "log everything".
154
+ */
155
+ private resolveEffectiveLevel(): number {
156
+ const instanceRank = Logger.LOG_LEVELS[this.level];
157
+ if (instanceRank === undefined) {
158
+ throw new Error(
159
+ `Logger: unknown log level '${this.level}'. Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`
160
+ );
161
+ }
162
+
163
+ const targetLevel = LOGGING_CONFIG[this.target].level;
164
+ const targetRank = Logger.LOG_LEVELS[targetLevel];
165
+ if (targetRank === undefined) {
166
+ throw new Error(
167
+ `Logger: unknown log level '${targetLevel}' configured for target '${this.target}'. ` +
168
+ `Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`
169
+ );
170
+ }
171
+
172
+ return Math.min(instanceRank, targetRank);
173
+ }
174
+
116
175
  /**
117
176
  * Internal log method
118
177
  * @param level Log level
@@ -120,40 +179,43 @@ export class Logger {
120
179
  * @param args Additional arguments
121
180
  */
122
181
  private log(level: string, message: string, ...args: any[]): void {
123
- // Get target-specific configuration
124
- const targetConfig = LOGGING_CONFIG[this.target];
125
-
126
- // Check if logging is enabled for this target
127
- if (!targetConfig.enabled) {
182
+ const isError = level === 'error';
183
+
184
+ // Errors are always written. Everything else respects the target's
185
+ // enabled flag, so a host app can keep its output clean without also
186
+ // hiding failures from itself.
187
+ if (!isError && !LOGGING_CONFIG[this.target].enabled) {
188
+ return;
189
+ }
190
+
191
+ const messageRank = Logger.LOG_LEVELS[level];
192
+ if (messageRank === undefined) {
193
+ throw new Error(
194
+ `Logger: unknown log level '${level}'. Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`
195
+ );
196
+ }
197
+
198
+ // Errors bypass the level check too — error is rank 0, so this is only
199
+ // belt-and-braces against a misconfigured level.
200
+ if (!isError && messageRank > this.resolveEffectiveLevel()) {
128
201
  return;
129
202
  }
130
-
131
- // Use target-specific level if different from instance level
132
- const effectiveLevel = targetConfig.level || this.level;
133
-
134
- // Only log if the level is sufficient
135
- if (Logger.LOG_LEVELS[level] <= Logger.LOG_LEVELS[effectiveLevel]) {
136
- const timestamp = new Date().toISOString();
137
- const targetPrefix = this.target === 'client' ? 'CLIENT' : 'SERVER';
138
- const prefix = this.context
139
- ? `[${timestamp}][${targetPrefix}][${level.toUpperCase()}][${this.context}]`
140
- : `[${timestamp}][${targetPrefix}][${level.toUpperCase()}]`;
141
-
142
- // Output to console based on level
143
- if (level === 'error') {
144
- console.error(prefix, message, ...args);
145
- } else if (level === 'warn') {
146
- console.warn(prefix, message, ...args);
147
- } else if (level === 'info') {
148
- console.info(prefix, message, ...args);
149
- } else {
150
- console.log(prefix, message, ...args);
151
- }
152
-
153
- // Force flush stdout if in Node.js environment to ensure logs appear immediately
154
- if (typeof process !== 'undefined' && process.stdout && process.stdout.write) {
155
- process.stdout.write('');
156
- }
203
+
204
+ const timestamp = new Date().toISOString();
205
+ const targetPrefix = this.target === 'client' ? 'CLIENT' : 'SERVER';
206
+ const prefix = this.context
207
+ ? `[${timestamp}][${targetPrefix}][${level.toUpperCase()}][${this.context}]`
208
+ : `[${timestamp}][${targetPrefix}][${level.toUpperCase()}]`;
209
+
210
+ // Output to console based on level
211
+ if (isError) {
212
+ console.error(prefix, message, ...args);
213
+ } else if (level === 'warn') {
214
+ console.warn(prefix, message, ...args);
215
+ } else if (level === 'info') {
216
+ console.info(prefix, message, ...args);
217
+ } else {
218
+ console.log(prefix, message, ...args);
157
219
  }
158
220
  }
159
221
 
@@ -203,13 +265,27 @@ export class Logger {
203
265
  }
204
266
 
205
267
  /**
206
- * Set the log level
207
- * @param level New log level
268
+ * Set the log level for this instance.
269
+ * Caps this component's verbosity; the target level still applies.
270
+ *
271
+ * @param level New log level (error, warn, info, debug, trace)
208
272
  */
209
273
  public setLevel(level: string): void {
274
+ if (Logger.LOG_LEVELS[level] === undefined) {
275
+ throw new Error(
276
+ `Logger: unknown log level '${level}'. Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`
277
+ );
278
+ }
210
279
  this.level = level;
211
280
  }
212
281
 
282
+ /**
283
+ * Get the log level configured for this instance.
284
+ */
285
+ public getLevel(): string {
286
+ return this.level;
287
+ }
288
+
213
289
  /**
214
290
  * Get a child logger with a sub-context
215
291
  * @param subContext Sub-context to add
@@ -20,9 +20,23 @@
20
20
 
21
21
  /**
22
22
  * MXP Encryption Utilities
23
- *
24
- * Simple encryption/decryption using a shared key from environment variables.
23
+ *
24
+ * Encryption/decryption using a shared key from environment variables.
25
25
  * Uses AES-256-GCM for authenticated encryption.
26
+ *
27
+ * ## Failure policy
28
+ *
29
+ * Encryption is a security boundary, so there is no degraded mode:
30
+ *
31
+ * - `encrypt()` / `decrypt()` return `null` ONLY to mean "encryption is not
32
+ * configured" (no MXP_ENCRYPTION_KEY). That is a deliberate, operator-chosen
33
+ * state, not a failure.
34
+ * - Any actual crypto failure — bad key, bad IV, failed authentication tag,
35
+ * unsupported algorithm — THROWS.
36
+ *
37
+ * Earlier versions returned the plaintext payload when encryption threw
38
+ * (`return encrypted || payload`), so a crypto fault silently put cleartext on
39
+ * the wire while the caller believed it was encrypted.
26
40
  */
27
41
 
28
42
  import * as crypto from 'crypto';
@@ -82,30 +96,34 @@ export class MxpEncryption {
82
96
  }
83
97
 
84
98
  /**
85
- * Encrypt an MXP payload
99
+ * Encrypt an MXP payload.
100
+ *
101
+ * @returns The encrypted payload, or null if encryption is not configured.
102
+ * @throws If encryption IS configured but the cipher fails. Never returns
103
+ * plaintext.
86
104
  */
87
105
  public encrypt(payload: MxpPayload): EncryptedPayload | null {
88
106
  if (!this.isEncryptionEnabled()) {
89
107
  return null;
90
108
  }
91
-
109
+
92
110
  try {
93
111
  // Generate a random IV for each encryption
94
112
  const iv = crypto.randomBytes(16);
95
-
113
+
96
114
  // Create cipher
97
115
  const cipher = crypto.createCipheriv('aes-256-gcm', this.encryptionKey!, iv);
98
-
116
+
99
117
  // Encrypt the payload
100
118
  const payloadString = JSON.stringify(payload);
101
119
  const encrypted = Buffer.concat([
102
120
  cipher.update(payloadString, 'utf8'),
103
121
  cipher.final()
104
122
  ]);
105
-
123
+
106
124
  // Get the authentication tag
107
125
  const authTag = cipher.getAuthTag();
108
-
126
+
109
127
  return {
110
128
  algorithm: MxpEncryptionAlgorithm.AES_256_GCM,
111
129
  data: encrypted.toString('base64'),
@@ -113,70 +131,87 @@ export class MxpEncryption {
113
131
  authTag: authTag.toString('base64')
114
132
  };
115
133
  } catch (error) {
116
- logger.error(`Encryption failed: ${error}`);
117
- return null;
134
+ const message = error instanceof Error ? error.message : String(error);
135
+ logger.error(`Encryption failed: ${message}`);
136
+ throw new Error(`MXP encryption failed: ${message}`);
118
137
  }
119
138
  }
120
-
139
+
121
140
  /**
122
- * Decrypt an encrypted payload
141
+ * Decrypt an encrypted payload.
142
+ *
143
+ * @throws If encryption is not configured, the algorithm is unsupported, or
144
+ * the ciphertext fails authentication.
123
145
  */
124
- public decrypt(encryptedPayload: EncryptedPayload): MxpPayload | null {
146
+ public decrypt(encryptedPayload: EncryptedPayload): MxpPayload {
125
147
  if (!this.isEncryptionEnabled()) {
126
- logger.error('Cannot decrypt - encryption not configured');
127
- return null;
148
+ throw new Error(
149
+ 'Cannot decrypt MXP payload: encryption is not configured. Set MXP_ENCRYPTION_KEY and MXP_ENCRYPTION_SALT.'
150
+ );
128
151
  }
129
-
152
+
130
153
  if (encryptedPayload.algorithm !== MxpEncryptionAlgorithm.AES_256_GCM) {
131
- logger.error(`Unsupported encryption algorithm: ${encryptedPayload.algorithm}`);
132
- return null;
154
+ throw new Error(`Unsupported MXP encryption algorithm: ${encryptedPayload.algorithm}`);
133
155
  }
134
-
156
+
135
157
  try {
136
158
  // Decode from base64
137
159
  const encrypted = Buffer.from(encryptedPayload.data, 'base64');
138
160
  const iv = Buffer.from(encryptedPayload.iv, 'base64');
139
161
  const authTag = Buffer.from(encryptedPayload.authTag, 'base64');
140
-
162
+
141
163
  // Create decipher
142
164
  const decipher = crypto.createDecipheriv('aes-256-gcm', this.encryptionKey!, iv);
143
165
  decipher.setAuthTag(authTag);
144
-
145
- // Decrypt
166
+
167
+ // Decrypt — final() throws if the authentication tag does not match
146
168
  const decrypted = Buffer.concat([
147
169
  decipher.update(encrypted),
148
170
  decipher.final()
149
171
  ]);
150
-
172
+
151
173
  // Parse the JSON payload
152
174
  return JSON.parse(decrypted.toString('utf8'));
153
175
  } catch (error) {
154
- logger.error(`Decryption failed: ${error}`);
155
- return null;
176
+ const message = error instanceof Error ? error.message : String(error);
177
+ logger.error(`Decryption failed: ${message}`);
178
+ throw new Error(`MXP decryption failed: ${message}`);
156
179
  }
157
180
  }
158
-
181
+
159
182
  /**
160
- * Encrypt a full message payload (for convenience)
183
+ * Encrypt a full message payload.
184
+ *
185
+ * @returns The encrypted payload, or the original payload when encryption
186
+ * is not configured.
187
+ * @throws If encryption is configured but fails.
161
188
  */
162
189
  public encryptMessage(payload: MxpPayload): MxpPayload | EncryptedPayload {
163
190
  if (!this.isEncryptionEnabled()) {
164
- return payload; // Return unencrypted if encryption is disabled
191
+ return payload; // Encryption not configured caller opted out
165
192
  }
166
-
193
+
167
194
  const encrypted = this.encrypt(payload);
168
- return encrypted || payload; // Fallback to unencrypted on error
195
+ if (!encrypted) {
196
+ // isEncryptionEnabled() was true, so encrypt() either returns a
197
+ // payload or throws. Reaching here means the two disagree.
198
+ throw new Error('MXP encryption is enabled but produced no payload');
199
+ }
200
+
201
+ return encrypted;
169
202
  }
170
-
203
+
171
204
  /**
172
- * Decrypt a message payload (with type checking)
205
+ * Decrypt a message payload (with type checking).
206
+ *
207
+ * @throws If the payload is encrypted and decryption fails.
173
208
  */
174
- public decryptMessage(payload: MxpPayload | EncryptedPayload): MxpPayload | null {
209
+ public decryptMessage(payload: MxpPayload | EncryptedPayload): MxpPayload {
175
210
  // Check if it's an encrypted payload
176
211
  if ('algorithm' in payload && 'data' in payload && 'iv' in payload) {
177
212
  return this.decrypt(payload as EncryptedPayload);
178
213
  }
179
-
214
+
180
215
  // It's already decrypted
181
216
  return payload as MxpPayload;
182
217
  }
@@ -1,134 +0,0 @@
1
- /**
2
- * Copyright 2024 Brad Anderson
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- *
16
- * @author Brad Anderson <BradA1878@pm.me>
17
- * @repository https://github.com/BradA1878/model-exchange-framework
18
- * @documentation https://mxf-dev.github.io/mxf/
19
- */
20
- import { CompressionResult } from './BinaryProtocolLayer.js';
21
- export declare enum EventPriority {
22
- CRITICAL = 0,// System failures, agent disconnections
23
- HIGH = 1,// Task assignments, tool results
24
- NORMAL = 2,// Agent messages, status updates
25
- LOW = 3,// Discovery requests, heartbeats
26
- BACKGROUND = 4
27
- }
28
- export interface MxpQueuedEvent {
29
- id: string;
30
- priority: EventPriority;
31
- type: 'agent' | 'channel';
32
- eventName: string;
33
- payload: any;
34
- targetId: string;
35
- excludedAgentId?: string;
36
- timestamp: number;
37
- retryCount: number;
38
- compressionEnabled?: boolean;
39
- originalSize?: number;
40
- compressedData?: CompressionResult;
41
- channelId?: string;
42
- }
43
- export interface MxpEventQueueConfig {
44
- enabled: boolean;
45
- batchSize: number;
46
- processingDelayMs: number;
47
- maxQueueSize: number;
48
- maxRetries: number;
49
- mxpEnabled: boolean;
50
- compressionByPriority: {
51
- [key in EventPriority]: {
52
- enabled: boolean;
53
- algorithm: 'none' | 'msgpack' | 'msgpack-compressed';
54
- minSize: number;
55
- };
56
- };
57
- }
58
- export declare class MxpEventForwardingEnhancer {
59
- private static instance;
60
- private readonly logger;
61
- private readonly validator;
62
- private config;
63
- private enhancedQueues;
64
- private processing;
65
- private processingTimer;
66
- private stats;
67
- private constructor();
68
- /**
69
- * Get the singleton instance of MxpEventForwardingEnhancer
70
- */
71
- static getInstance(): MxpEventForwardingEnhancer;
72
- /**
73
- * Enhanced event queueing with MXP compression support
74
- * Only applies compression when bandwidth optimization is enabled
75
- */
76
- enqueueEvent(eventName: string, payload: any, priority: EventPriority, targetId: string, type: 'agent' | 'channel', channelId?: string, excludedAgentId?: string): Promise<void>;
77
- /**
78
- * Enhanced batch processing with MXP compression awareness
79
- */
80
- private processBatch;
81
- /**
82
- * Apply MXP compression to an event if warranted
83
- */
84
- private applyMxpCompression;
85
- /**
86
- * Check if an event should be compressed based on configuration
87
- */
88
- private shouldCompressEvent;
89
- /**
90
- * Process a compressed event (placeholder for actual forwarding logic)
91
- */
92
- private processCompressedEvent;
93
- /**
94
- * Process an uncompressed event (placeholder for actual forwarding logic)
95
- */
96
- private processUncompressedEvent;
97
- /**
98
- * Start enhanced batch processing
99
- */
100
- startProcessing(): void;
101
- /**
102
- * Stop enhanced batch processing
103
- */
104
- stopProcessing(): void;
105
- /**
106
- * Schedule next batch processing
107
- */
108
- private scheduleNextBatch;
109
- /**
110
- * Get MXP-enhanced queue statistics
111
- */
112
- getEnhancedStats(): {
113
- totalEvents: number;
114
- compressedEvents: number;
115
- compressionRate: number;
116
- totalBandwidthSaved: number;
117
- averageCompressionRatio: number;
118
- queueSizes: Record<string, number>;
119
- processingTimeMs: number;
120
- };
121
- /**
122
- * Update configuration at runtime
123
- */
124
- updateConfig(newConfig: Partial<MxpEventQueueConfig>): void;
125
- /**
126
- * Clear all queues (useful for testing or shutdown)
127
- */
128
- clearQueues(): void;
129
- /**
130
- * Check if MXP enhancement is enabled
131
- */
132
- isMxpEnabled(): boolean;
133
- }
134
- //# sourceMappingURL=MxpEventForwardingEnhancer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MxpEventForwardingEnhancer.d.ts","sourceRoot":"","sources":["../../src/mxp/MxpEventForwardingEnhancer.ts"],"names":[],"mappings":"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"}