@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
@@ -17,14 +17,15 @@
17
17
  * @repository https://github.com/BradA1878/model-exchange-framework
18
18
  * @documentation https://mxf-dev.github.io/mxf/
19
19
  */
20
- // Default logging configuration
20
+ // Default logging configuration.
21
+ // `enabled: false` gates info/warn/debug/trace only — errors are always written.
21
22
  const LOGGING_CONFIG = {
22
23
  server: {
23
- enabled: false, // Server logging disabled by default
24
+ enabled: false, // Server non-error logging off by default
24
25
  level: 'debug'
25
26
  },
26
27
  client: {
27
- enabled: false, // Client logging disabled by default (TUI suppresses via disableClientLogging())
28
+ enabled: false, // Client non-error logging off by default (TUI suppresses via disableClientLogging())
28
29
  level: 'debug'
29
30
  }
30
31
  };
@@ -69,15 +70,44 @@ export class Logger {
69
70
  };
70
71
  /**
71
72
  * Create a new Logger
72
- * @param level Log level (error, warn, info, debug, trace)
73
+ *
74
+ * @param level Log level (error, warn, info, debug, trace). Caps this
75
+ * component's verbosity; the target level still applies, and
76
+ * the more restrictive of the two wins.
73
77
  * @param context Context string to prefix log messages
74
78
  * @param target Target pathway ('server' or 'client') - defaults to 'server'
75
79
  */
76
80
  constructor(level, context = '', target = 'server') {
81
+ if (Logger.LOG_LEVELS[level] === undefined) {
82
+ throw new Error(`Logger: unknown log level '${level}'. Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`);
83
+ }
77
84
  this.level = level;
78
85
  this.context = context;
79
86
  this.target = target;
80
87
  }
88
+ /**
89
+ * Resolve the level this logger actually writes at.
90
+ *
91
+ * The instance level and the target level are both honoured; whichever is
92
+ * more restrictive wins. Levels are ordered error(0) → trace(4), so "more
93
+ * restrictive" is the lower number.
94
+ *
95
+ * An unknown level string is a programming error and is rejected rather
96
+ * than silently treated as "log everything".
97
+ */
98
+ resolveEffectiveLevel() {
99
+ const instanceRank = Logger.LOG_LEVELS[this.level];
100
+ if (instanceRank === undefined) {
101
+ throw new Error(`Logger: unknown log level '${this.level}'. Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`);
102
+ }
103
+ const targetLevel = LOGGING_CONFIG[this.target].level;
104
+ const targetRank = Logger.LOG_LEVELS[targetLevel];
105
+ if (targetRank === undefined) {
106
+ throw new Error(`Logger: unknown log level '${targetLevel}' configured for target '${this.target}'. ` +
107
+ `Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`);
108
+ }
109
+ return Math.min(instanceRank, targetRank);
110
+ }
81
111
  /**
82
112
  * Internal log method
83
113
  * @param level Log level
@@ -85,38 +115,39 @@ export class Logger {
85
115
  * @param args Additional arguments
86
116
  */
87
117
  log(level, message, ...args) {
88
- // Get target-specific configuration
89
- const targetConfig = LOGGING_CONFIG[this.target];
90
- // Check if logging is enabled for this target
91
- if (!targetConfig.enabled) {
118
+ const isError = level === 'error';
119
+ // Errors are always written. Everything else respects the target's
120
+ // enabled flag, so a host app can keep its output clean without also
121
+ // hiding failures from itself.
122
+ if (!isError && !LOGGING_CONFIG[this.target].enabled) {
123
+ return;
124
+ }
125
+ const messageRank = Logger.LOG_LEVELS[level];
126
+ if (messageRank === undefined) {
127
+ throw new Error(`Logger: unknown log level '${level}'. Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`);
128
+ }
129
+ // Errors bypass the level check too — error is rank 0, so this is only
130
+ // belt-and-braces against a misconfigured level.
131
+ if (!isError && messageRank > this.resolveEffectiveLevel()) {
92
132
  return;
93
133
  }
94
- // Use target-specific level if different from instance level
95
- const effectiveLevel = targetConfig.level || this.level;
96
- // Only log if the level is sufficient
97
- if (Logger.LOG_LEVELS[level] <= Logger.LOG_LEVELS[effectiveLevel]) {
98
- const timestamp = new Date().toISOString();
99
- const targetPrefix = this.target === 'client' ? 'CLIENT' : 'SERVER';
100
- const prefix = this.context
101
- ? `[${timestamp}][${targetPrefix}][${level.toUpperCase()}][${this.context}]`
102
- : `[${timestamp}][${targetPrefix}][${level.toUpperCase()}]`;
103
- // Output to console based on level
104
- if (level === 'error') {
105
- console.error(prefix, message, ...args);
106
- }
107
- else if (level === 'warn') {
108
- console.warn(prefix, message, ...args);
109
- }
110
- else if (level === 'info') {
111
- console.info(prefix, message, ...args);
112
- }
113
- else {
114
- console.log(prefix, message, ...args);
115
- }
116
- // Force flush stdout if in Node.js environment to ensure logs appear immediately
117
- if (typeof process !== 'undefined' && process.stdout && process.stdout.write) {
118
- process.stdout.write('');
119
- }
134
+ const timestamp = new Date().toISOString();
135
+ const targetPrefix = this.target === 'client' ? 'CLIENT' : 'SERVER';
136
+ const prefix = this.context
137
+ ? `[${timestamp}][${targetPrefix}][${level.toUpperCase()}][${this.context}]`
138
+ : `[${timestamp}][${targetPrefix}][${level.toUpperCase()}]`;
139
+ // Output to console based on level
140
+ if (isError) {
141
+ console.error(prefix, message, ...args);
142
+ }
143
+ else if (level === 'warn') {
144
+ console.warn(prefix, message, ...args);
145
+ }
146
+ else if (level === 'info') {
147
+ console.info(prefix, message, ...args);
148
+ }
149
+ else {
150
+ console.log(prefix, message, ...args);
120
151
  }
121
152
  }
122
153
  /**
@@ -160,12 +191,23 @@ export class Logger {
160
191
  this.log('trace', message, ...args);
161
192
  }
162
193
  /**
163
- * Set the log level
164
- * @param level New log level
194
+ * Set the log level for this instance.
195
+ * Caps this component's verbosity; the target level still applies.
196
+ *
197
+ * @param level New log level (error, warn, info, debug, trace)
165
198
  */
166
199
  setLevel(level) {
200
+ if (Logger.LOG_LEVELS[level] === undefined) {
201
+ throw new Error(`Logger: unknown log level '${level}'. Valid levels: ${Object.keys(Logger.LOG_LEVELS).join(', ')}`);
202
+ }
167
203
  this.level = level;
168
204
  }
205
+ /**
206
+ * Get the log level configured for this instance.
207
+ */
208
+ getLevel() {
209
+ return this.level;
210
+ }
169
211
  /**
170
212
  * Get a child logger with a sub-context
171
213
  * @param subContext Sub-context to add
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/utils/Logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/utils/Logger.ts"],"names":[],"mappings":"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"}
@@ -36,21 +36,34 @@ export declare class MxpEncryption {
36
36
  */
37
37
  isEncryptionEnabled(): boolean;
38
38
  /**
39
- * Encrypt an MXP payload
39
+ * Encrypt an MXP payload.
40
+ *
41
+ * @returns The encrypted payload, or null if encryption is not configured.
42
+ * @throws If encryption IS configured but the cipher fails. Never returns
43
+ * plaintext.
40
44
  */
41
45
  encrypt(payload: MxpPayload): EncryptedPayload | null;
42
46
  /**
43
- * Decrypt an encrypted payload
47
+ * Decrypt an encrypted payload.
48
+ *
49
+ * @throws If encryption is not configured, the algorithm is unsupported, or
50
+ * the ciphertext fails authentication.
44
51
  */
45
- decrypt(encryptedPayload: EncryptedPayload): MxpPayload | null;
52
+ decrypt(encryptedPayload: EncryptedPayload): MxpPayload;
46
53
  /**
47
- * Encrypt a full message payload (for convenience)
54
+ * Encrypt a full message payload.
55
+ *
56
+ * @returns The encrypted payload, or the original payload when encryption
57
+ * is not configured.
58
+ * @throws If encryption is configured but fails.
48
59
  */
49
60
  encryptMessage(payload: MxpPayload): MxpPayload | EncryptedPayload;
50
61
  /**
51
- * Decrypt a message payload (with type checking)
62
+ * Decrypt a message payload (with type checking).
63
+ *
64
+ * @throws If the payload is encrypted and decryption fails.
52
65
  */
53
- decryptMessage(payload: MxpPayload | EncryptedPayload): MxpPayload | null;
66
+ decryptMessage(payload: MxpPayload | EncryptedPayload): MxpPayload;
54
67
  /**
55
68
  * Generate a secure random key (utility for initial setup)
56
69
  */
@@ -1 +1 @@
1
- {"version":3,"file":"MxpEncryption.d.ts","sourceRoot":"","sources":["../../src/utils/MxpEncryption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAA0B,MAAM,kCAAkC,CAAC;AAKxG;;GAEG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,SAAS,CAAkB;IAEnC,OAAO;WAIO,WAAW,IAAI,aAAa;IAO1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACI,mBAAmB,IAAI,OAAO;IAIrC;;OAEG;IACI,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI;IAkC5D;;OAEG;IACI,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,UAAU,GAAG,IAAI;IAmCrE;;OAEG;IACI,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,gBAAgB;IASzE;;OAEG;IACI,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,GAAG,UAAU,GAAG,IAAI;IAUhF;;OAEG;WACW,iBAAiB,IAAI,MAAM;CAG5C;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,eAA8B,CAAC"}
1
+ {"version":3,"file":"MxpEncryption.d.ts","sourceRoot":"","sources":["../../src/utils/MxpEncryption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAyBH,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAA0B,MAAM,kCAAkC,CAAC;AAKxG;;GAEG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,SAAS,CAAkB;IAEnC,OAAO;WAIO,WAAW,IAAI,aAAa;IAO1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACI,mBAAmB,IAAI,OAAO;IAIrC;;;;;;OAMG;IACI,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI;IAmC5D;;;;;OAKG;IACI,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,UAAU;IAoC9D;;;;;;OAMG;IACI,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,gBAAgB;IAezE;;;;OAIG;IACI,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,GAAG,UAAU;IAUzE;;OAEG;WACW,iBAAiB,IAAI,MAAM;CAG5C;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,eAA8B,CAAC"}
@@ -20,8 +20,22 @@
20
20
  /**
21
21
  * MXP Encryption Utilities
22
22
  *
23
- * Simple encryption/decryption using a shared key from environment variables.
23
+ * Encryption/decryption using a shared key from environment variables.
24
24
  * Uses AES-256-GCM for authenticated encryption.
25
+ *
26
+ * ## Failure policy
27
+ *
28
+ * Encryption is a security boundary, so there is no degraded mode:
29
+ *
30
+ * - `encrypt()` / `decrypt()` return `null` ONLY to mean "encryption is not
31
+ * configured" (no MXP_ENCRYPTION_KEY). That is a deliberate, operator-chosen
32
+ * state, not a failure.
33
+ * - Any actual crypto failure — bad key, bad IV, failed authentication tag,
34
+ * unsupported algorithm — THROWS.
35
+ *
36
+ * Earlier versions returned the plaintext payload when encryption threw
37
+ * (`return encrypted || payload`), so a crypto fault silently put cleartext on
38
+ * the wire while the caller believed it was encrypted.
25
39
  */
26
40
  import * as crypto from 'crypto';
27
41
  import { requireEnv } from './env.js';
@@ -70,7 +84,11 @@ export class MxpEncryption {
70
84
  return this.isEnabled && this.encryptionKey !== null;
71
85
  }
72
86
  /**
73
- * Encrypt an MXP payload
87
+ * Encrypt an MXP payload.
88
+ *
89
+ * @returns The encrypted payload, or null if encryption is not configured.
90
+ * @throws If encryption IS configured but the cipher fails. Never returns
91
+ * plaintext.
74
92
  */
75
93
  encrypt(payload) {
76
94
  if (!this.isEncryptionEnabled()) {
@@ -97,21 +115,23 @@ export class MxpEncryption {
97
115
  };
98
116
  }
99
117
  catch (error) {
100
- logger.error(`Encryption failed: ${error}`);
101
- return null;
118
+ const message = error instanceof Error ? error.message : String(error);
119
+ logger.error(`Encryption failed: ${message}`);
120
+ throw new Error(`MXP encryption failed: ${message}`);
102
121
  }
103
122
  }
104
123
  /**
105
- * Decrypt an encrypted payload
124
+ * Decrypt an encrypted payload.
125
+ *
126
+ * @throws If encryption is not configured, the algorithm is unsupported, or
127
+ * the ciphertext fails authentication.
106
128
  */
107
129
  decrypt(encryptedPayload) {
108
130
  if (!this.isEncryptionEnabled()) {
109
- logger.error('Cannot decrypt - encryption not configured');
110
- return null;
131
+ throw new Error('Cannot decrypt MXP payload: encryption is not configured. Set MXP_ENCRYPTION_KEY and MXP_ENCRYPTION_SALT.');
111
132
  }
112
133
  if (encryptedPayload.algorithm !== MxpEncryptionAlgorithm.AES_256_GCM) {
113
- logger.error(`Unsupported encryption algorithm: ${encryptedPayload.algorithm}`);
114
- return null;
134
+ throw new Error(`Unsupported MXP encryption algorithm: ${encryptedPayload.algorithm}`);
115
135
  }
116
136
  try {
117
137
  // Decode from base64
@@ -121,7 +141,7 @@ export class MxpEncryption {
121
141
  // Create decipher
122
142
  const decipher = crypto.createDecipheriv('aes-256-gcm', this.encryptionKey, iv);
123
143
  decipher.setAuthTag(authTag);
124
- // Decrypt
144
+ // Decrypt — final() throws if the authentication tag does not match
125
145
  const decrypted = Buffer.concat([
126
146
  decipher.update(encrypted),
127
147
  decipher.final()
@@ -130,22 +150,34 @@ export class MxpEncryption {
130
150
  return JSON.parse(decrypted.toString('utf8'));
131
151
  }
132
152
  catch (error) {
133
- logger.error(`Decryption failed: ${error}`);
134
- return null;
153
+ const message = error instanceof Error ? error.message : String(error);
154
+ logger.error(`Decryption failed: ${message}`);
155
+ throw new Error(`MXP decryption failed: ${message}`);
135
156
  }
136
157
  }
137
158
  /**
138
- * Encrypt a full message payload (for convenience)
159
+ * Encrypt a full message payload.
160
+ *
161
+ * @returns The encrypted payload, or the original payload when encryption
162
+ * is not configured.
163
+ * @throws If encryption is configured but fails.
139
164
  */
140
165
  encryptMessage(payload) {
141
166
  if (!this.isEncryptionEnabled()) {
142
- return payload; // Return unencrypted if encryption is disabled
167
+ return payload; // Encryption not configured caller opted out
143
168
  }
144
169
  const encrypted = this.encrypt(payload);
145
- return encrypted || payload; // Fallback to unencrypted on error
170
+ if (!encrypted) {
171
+ // isEncryptionEnabled() was true, so encrypt() either returns a
172
+ // payload or throws. Reaching here means the two disagree.
173
+ throw new Error('MXP encryption is enabled but produced no payload');
174
+ }
175
+ return encrypted;
146
176
  }
147
177
  /**
148
- * Decrypt a message payload (with type checking)
178
+ * Decrypt a message payload (with type checking).
179
+ *
180
+ * @throws If the payload is encrypted and decryption fails.
149
181
  */
150
182
  decryptMessage(payload) {
151
183
  // Check if it's an encrypted payload
@@ -1 +1 @@
1
- {"version":3,"file":"MxpEncryption.js","sourceRoot":"","sources":["../../src/utils/MxpEncryption.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MxpEncryption.js","sourceRoot":"","sources":["../../src/utils/MxpEncryption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAgC,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AACxG,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,OAAO,aAAa;IACd,MAAM,CAAC,QAAQ,CAAgB;IAC/B,aAAa,GAAkB,IAAI,CAAC;IACpC,SAAS,GAAY,KAAK,CAAC;IAEnC;QACI,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,WAAW;QACrB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC1B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,iBAAiB;QACrB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACjD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,OAAO,CAAC,CAAC,kBAAkB;QAE3F,IAAI,SAAS,EAAE,CAAC;YACZ,gEAAgE;YAChE,mEAAmE;YACnE,qDAAqD;YACrD,MAAM,IAAI,GAAG,UAAU,CACnB,qBAAqB,EACrB,qGAAqG,CACxG,CAAC;YACF,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC9E,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC;QACtC,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAChE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAC3B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,mBAAmB;QACtB,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;IACzD,CAAC;IAED;;;;;;OAMG;IACI,OAAO,CAAC,OAAmB;QAC9B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACD,2CAA2C;YAC3C,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAElC,gBAAgB;YAChB,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,aAAc,EAAE,EAAE,CAAC,CAAC;YAE7E,sBAAsB;YACtB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC;gBACpC,MAAM,CAAC,KAAK,EAAE;aACjB,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAEpC,OAAO;gBACH,SAAS,EAAE,sBAAsB,CAAC,WAAW;gBAC7C,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAClC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACzB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;aACtC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,OAAO,CAAC,gBAAkC;QAC7C,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACX,2GAA2G,CAC9G,CAAC;QACN,CAAC;QAED,IAAI,gBAAgB,CAAC,SAAS,KAAK,sBAAsB,CAAC,WAAW,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,yCAAyC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,CAAC;YACD,qBAAqB;YACrB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEhE,kBAAkB;YAClB,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAc,EAAE,EAAE,CAAC,CAAC;YACjF,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAE7B,oEAAoE;YACpE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC5B,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC1B,QAAQ,CAAC,KAAK,EAAE;aACnB,CAAC,CAAC;YAEH,yBAAyB;YACzB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACI,cAAc,CAAC,OAAmB;QACrC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC,CAAC,+CAA+C;QACnE,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,gEAAgE;YAChE,2DAA2D;YAC3D,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,OAAsC;QACxD,qCAAqC;QACrC,IAAI,WAAW,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC,OAAO,CAAC,OAA2B,CAAC,CAAC;QACrD,CAAC;QAED,yBAAyB;QACzB,OAAO,OAAqB,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,iBAAiB;QAC3B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxf-dev/core",
3
- "version": "1.0.1",
3
+ "version": "2.0.0",
4
4
  "description": "Model Exchange Framework core: events, schemas, types, services, and protocol contracts",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -37,7 +37,6 @@
37
37
  "README.md",
38
38
  "LICENSE"
39
39
  ],
40
- "sideEffects": false,
41
40
  "scripts": {
42
41
  "build": "tsc -b",
43
42
  "clean": "rm -rf dist tsconfig.tsbuildinfo",
@@ -45,27 +44,38 @@
45
44
  },
46
45
  "dependencies": {
47
46
  "@google/genai": "^0.9.0",
47
+ "@mozilla/readability": "^0.6.0",
48
48
  "@msgpack/msgpack": "^3.1.2",
49
49
  "ajv": "^8.17.1",
50
50
  "ajv-formats": "^3.0.1",
51
- "bcrypt": "^5.1.1",
52
51
  "dockerode": "^4.0.2",
52
+ "dompurify": "^3.2.4",
53
+ "html-to-text": "^9.0.5",
54
+ "jsdom": "^26.0.0",
53
55
  "meilisearch": "^0.53.0",
54
56
  "mongoose": "^8.10.2",
55
57
  "openai": "^4.95.1",
56
- "puppeteer": "^24.11.2",
57
58
  "rxjs": "^7.8.2",
59
+ "turndown": "^7.2.0",
58
60
  "uuid": "^9.0.1",
59
61
  "zod": "^3.24.3"
60
62
  },
61
63
  "peerDependencies": {
62
64
  "@tensorflow/tfjs": "^4.22.0",
65
+ "bcrypt": "^5.1.1",
66
+ "puppeteer": "^24.11.2",
63
67
  "socket.io": "^4.7.2"
64
68
  },
65
69
  "peerDependenciesMeta": {
66
70
  "@tensorflow/tfjs": {
67
71
  "optional": true
68
72
  },
73
+ "bcrypt": {
74
+ "optional": true
75
+ },
76
+ "puppeteer": {
77
+ "optional": true
78
+ },
69
79
  "socket.io": {
70
80
  "optional": true
71
81
  }
@@ -74,7 +84,12 @@
74
84
  "@tensorflow/tfjs": "^4.22.0",
75
85
  "@types/bcrypt": "^5.0.2",
76
86
  "@types/dockerode": "^3.3.24",
87
+ "@types/html-to-text": "^9.0.4",
88
+ "@types/jsdom": "^21.1.7",
77
89
  "@types/node": "^20.10.5",
90
+ "@types/turndown": "^5.0.5",
91
+ "bcrypt": "^5.1.1",
92
+ "puppeteer": "^24.11.2",
78
93
  "socket.io": "^4.7.2",
79
94
  "typescript": "^5.2.2"
80
95
  },
@@ -123,7 +123,7 @@ export abstract class FrameworkAdapter {
123
123
 
124
124
  constructor(config: FrameworkAdapterConfig) {
125
125
  this.config = config;
126
- this.logger = new Logger('FrameworkAdapter');
126
+ this.logger = new Logger('info', 'FrameworkAdapter');
127
127
 
128
128
  this.logger.info('Initialized framework adapter', {
129
129
  frameworkName: config.frameworkName,
@@ -25,6 +25,7 @@
25
25
  * Enables dynamic configuration of agent behaviors and capabilities.
26
26
  */
27
27
 
28
+ import { readFile } from 'node:fs/promises';
28
29
  import { Observable, from } from 'rxjs';
29
30
  import { map } from 'rxjs/operators';
30
31
  import { Logger } from '../utils/Logger.js';
@@ -750,24 +751,55 @@ export class ConfigManager implements IConfigManager {
750
751
  }
751
752
 
752
753
  /**
753
- * Load configuration from a file
754
- * @param filePath - Path to configuration file
754
+ * Load configuration from a JSON file and merge it over the defaults.
755
+ *
756
+ * Errors are surfaced through the Observable: a missing file, unreadable
757
+ * file, or malformed JSON is a configuration error the caller must see.
758
+ * (This method previously logged "not fully implemented" and handed back the
759
+ * current config, so callers believed they had loaded a file they had not.)
760
+ *
761
+ * @param filePath - Path to a JSON configuration file
762
+ * @returns Observable of the merged configuration
755
763
  */
756
764
  public loadConfigFromFile(filePath: string): Observable<SdkConfig> {
757
- // In a browser environment, we would use fetch
758
- // In Node.js, we would use fs.readFile
759
-
760
- // This is a simplified implementation that assumes we're in a Node.js environment
761
- try {
762
- // Note: In a real implementation, this would be asynchronous
763
- // For now, we'll just return the current config
764
- this.logger.warn(`loadConfigFromFile not fully implemented. File path: ${filePath}`);
765
-
766
- return from(Promise.resolve(this.config));
767
- } catch (error) {
768
- this.logger.error(`Failed to load configuration from file: ${error}`);
769
- return from(Promise.resolve(this.config));
765
+ if (typeof filePath !== 'string' || filePath.trim() === '') {
766
+ throw new Error('loadConfigFromFile requires a non-empty file path');
770
767
  }
768
+
769
+ const load = async (): Promise<SdkConfig> => {
770
+ let fileContents: string;
771
+ try {
772
+ fileContents = await readFile(filePath, 'utf8');
773
+ } catch (error) {
774
+ const message = error instanceof Error ? error.message : String(error);
775
+ this.logger.error(`Failed to read configuration file '${filePath}': ${message}`);
776
+ throw new Error(`Failed to read configuration file '${filePath}': ${message}`);
777
+ }
778
+
779
+ let parsed: unknown;
780
+ try {
781
+ parsed = JSON.parse(fileContents);
782
+ } catch (error) {
783
+ const message = error instanceof Error ? error.message : String(error);
784
+ this.logger.error(`Configuration file '${filePath}' is not valid JSON: ${message}`);
785
+ throw new Error(`Configuration file '${filePath}' is not valid JSON: ${message}`);
786
+ }
787
+
788
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
789
+ throw new Error(`Configuration file '${filePath}' must contain a JSON object`);
790
+ }
791
+
792
+ // Merge, validate and emit CONFIG_UPDATED through the normal path.
793
+ this.config = this.mergeConfigs(DEFAULT_CONFIG, parsed as Partial<SdkConfig>);
794
+ this.validateConfig();
795
+ this.emitConfigUpdated(['all']);
796
+
797
+ this.logger.info(`Loaded configuration from '${filePath}'`);
798
+
799
+ return this.config;
800
+ };
801
+
802
+ return from(load());
771
803
  }
772
804
 
773
805
  /**
@@ -1397,10 +1429,11 @@ export class ConfigManager implements IConfigManager {
1397
1429
  data,
1398
1430
  { source: 'ConfigManager' }
1399
1431
  );
1400
- // Emit to client bus - will propagate to server via shared eventSubject
1432
+ // Emit once. Both buses push into the SAME RxJS Subject (see EventBus.ts),
1433
+ // so emitting on both delivered every local subscriber two copies of the
1434
+ // event. The client bus is the right one here: ConfigManager runs in the
1435
+ // SDK, and the shared Subject already carries the event to server-side
1436
+ // subscribers.
1401
1437
  EventBus.client.emit(ConfigEvents.CHANNEL_SYSTEM_LLM_CHANGED, payload);
1402
-
1403
- // Also emit to server bus to ensure propagation
1404
- EventBus.server.emit(ConfigEvents.CHANNEL_SYSTEM_LLM_CHANGED, payload);
1405
1438
  }
1406
1439
  }