@mxf-dev/core 2.0.4 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/dist/config/ModelContextLimits.d.ts.map +1 -1
  2. package/dist/config/ModelContextLimits.js +7 -1
  3. package/dist/config/ModelContextLimits.js.map +1 -1
  4. package/dist/constants/CoreTools.d.ts +6 -5
  5. package/dist/constants/CoreTools.d.ts.map +1 -1
  6. package/dist/constants/CoreTools.js +6 -5
  7. package/dist/constants/CoreTools.js.map +1 -1
  8. package/dist/constants/DefaultPhaseProfiles.d.ts.map +1 -1
  9. package/dist/constants/DefaultPhaseProfiles.js +29 -0
  10. package/dist/constants/DefaultPhaseProfiles.js.map +1 -1
  11. package/dist/constants/ReservedIdentities.d.ts +14 -0
  12. package/dist/constants/ReservedIdentities.d.ts.map +1 -0
  13. package/dist/constants/ReservedIdentities.js +42 -0
  14. package/dist/constants/ReservedIdentities.js.map +1 -0
  15. package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.d.ts +16 -16
  16. package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.d.ts.map +1 -1
  17. package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.js +98 -36
  18. package/dist/database/adapters/mongodb/MongoKnowledgeGraphRepository.js.map +1 -1
  19. package/dist/events/ClientEventBus.d.ts +28 -0
  20. package/dist/events/ClientEventBus.d.ts.map +1 -1
  21. package/dist/events/ClientEventBus.js +87 -40
  22. package/dist/events/ClientEventBus.js.map +1 -1
  23. package/dist/events/EventBus.d.ts +19 -1
  24. package/dist/events/EventBus.d.ts.map +1 -1
  25. package/dist/events/EventBus.js +23 -0
  26. package/dist/events/EventBus.js.map +1 -1
  27. package/dist/events/EventBusBase.d.ts +37 -6
  28. package/dist/events/EventBusBase.d.ts.map +1 -1
  29. package/dist/events/EventBusBase.js +75 -27
  30. package/dist/events/EventBusBase.js.map +1 -1
  31. package/dist/events/EventNames.d.ts +49 -36
  32. package/dist/events/EventNames.d.ts.map +1 -1
  33. package/dist/events/EventNames.js +38 -36
  34. package/dist/events/EventNames.js.map +1 -1
  35. package/dist/events/PublicEvents.d.ts +5 -1
  36. package/dist/events/PublicEvents.d.ts.map +1 -1
  37. package/dist/events/PublicEvents.js +7 -0
  38. package/dist/events/PublicEvents.js.map +1 -1
  39. package/dist/events/ServerEventBus.d.ts +7 -54
  40. package/dist/events/ServerEventBus.d.ts.map +1 -1
  41. package/dist/events/ServerEventBus.js +10 -96
  42. package/dist/events/ServerEventBus.js.map +1 -1
  43. package/dist/events/event-definitions/ControlLoopEvents.d.ts +35 -0
  44. package/dist/events/event-definitions/ControlLoopEvents.d.ts.map +1 -1
  45. package/dist/events/event-definitions/ControlLoopEvents.js +6 -0
  46. package/dist/events/event-definitions/ControlLoopEvents.js.map +1 -1
  47. package/dist/events/event-definitions/SdkEvents.d.ts +55 -0
  48. package/dist/events/event-definitions/SdkEvents.d.ts.map +1 -0
  49. package/dist/events/event-definitions/SdkEvents.js +36 -0
  50. package/dist/events/event-definitions/SdkEvents.js.map +1 -0
  51. package/dist/events/event-definitions/TaskEvents.d.ts +2 -7
  52. package/dist/events/event-definitions/TaskEvents.d.ts.map +1 -1
  53. package/dist/index.d.ts +4 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +2 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/interfaces/AgentInterfaces.d.ts +5 -0
  58. package/dist/interfaces/AgentInterfaces.d.ts.map +1 -1
  59. package/dist/interfaces/ChannelConfig.d.ts +2 -2
  60. package/dist/interfaces/ChannelConfig.d.ts.map +1 -1
  61. package/dist/interfaces/ConversationMessage.d.ts +1 -1
  62. package/dist/interfaces/ConversationMessage.d.ts.map +1 -1
  63. package/dist/interfaces/IMemoryPersistence.d.ts +47 -1
  64. package/dist/interfaces/IMemoryPersistence.d.ts.map +1 -1
  65. package/dist/interfaces/SocketServiceInterface.d.ts +3 -2
  66. package/dist/interfaces/SocketServiceInterface.d.ts.map +1 -1
  67. package/dist/interfaces/TaskInterfaces.d.ts +14 -1
  68. package/dist/interfaces/TaskInterfaces.d.ts.map +1 -1
  69. package/dist/models/agent.d.ts +0 -1
  70. package/dist/models/agent.d.ts.map +1 -1
  71. package/dist/models/agent.js +0 -5
  72. package/dist/models/agent.js.map +1 -1
  73. package/dist/models/agentIdentityReservation.d.ts +42 -0
  74. package/dist/models/agentIdentityReservation.d.ts.map +1 -0
  75. package/dist/models/agentIdentityReservation.js +52 -0
  76. package/dist/models/agentIdentityReservation.js.map +1 -0
  77. package/dist/models/channel.d.ts +2 -0
  78. package/dist/models/channel.d.ts.map +1 -1
  79. package/dist/models/channel.js.map +1 -1
  80. package/dist/models/channelKey.d.ts +1 -0
  81. package/dist/models/channelKey.d.ts.map +1 -1
  82. package/dist/models/channelKey.js +5 -0
  83. package/dist/models/channelKey.js.map +1 -1
  84. package/dist/models/memory.d.ts +1 -1
  85. package/dist/models/memory.d.ts.map +1 -1
  86. package/dist/models/memory.js +9 -12
  87. package/dist/models/memory.js.map +1 -1
  88. package/dist/models/memoryStrata.d.ts +3 -16
  89. package/dist/models/memoryStrata.d.ts.map +1 -1
  90. package/dist/models/memoryStrata.js +3 -5
  91. package/dist/models/memoryStrata.js.map +1 -1
  92. package/dist/models/plan.d.ts +2 -2
  93. package/dist/models/plan.d.ts.map +1 -1
  94. package/dist/models/plan.js +1 -1
  95. package/dist/models/plan.js.map +1 -1
  96. package/dist/models/taskEffectiveness.d.ts +1 -0
  97. package/dist/models/taskEffectiveness.d.ts.map +1 -1
  98. package/dist/models/taskEffectiveness.js +7 -1
  99. package/dist/models/taskEffectiveness.js.map +1 -1
  100. package/dist/models/user.d.ts +4 -0
  101. package/dist/models/user.d.ts.map +1 -1
  102. package/dist/models/user.js +8 -0
  103. package/dist/models/user.js.map +1 -1
  104. package/dist/protocols/mcp/LlmTestEnvironmentGuard.d.ts +16 -0
  105. package/dist/protocols/mcp/LlmTestEnvironmentGuard.d.ts.map +1 -0
  106. package/dist/protocols/mcp/LlmTestEnvironmentGuard.js +25 -0
  107. package/dist/protocols/mcp/LlmTestEnvironmentGuard.js.map +1 -0
  108. package/dist/protocols/mcp/McpServerTypes.d.ts +9 -0
  109. package/dist/protocols/mcp/McpServerTypes.d.ts.map +1 -1
  110. package/dist/protocols/mcp/providers/AnthropicMcpClient.d.ts.map +1 -1
  111. package/dist/protocols/mcp/providers/AnthropicMcpClient.js +1 -0
  112. package/dist/protocols/mcp/providers/AnthropicMcpClient.js.map +1 -1
  113. package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.d.ts.map +1 -1
  114. package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.js +1 -0
  115. package/dist/protocols/mcp/providers/AzureOpenAiMcpClient.js.map +1 -1
  116. package/dist/protocols/mcp/providers/BaseMcpClient.d.ts +4 -0
  117. package/dist/protocols/mcp/providers/BaseMcpClient.d.ts.map +1 -1
  118. package/dist/protocols/mcp/providers/BaseMcpClient.js +10 -0
  119. package/dist/protocols/mcp/providers/BaseMcpClient.js.map +1 -1
  120. package/dist/protocols/mcp/providers/CustomMcpClient.d.ts.map +1 -1
  121. package/dist/protocols/mcp/providers/CustomMcpClient.js +7 -0
  122. package/dist/protocols/mcp/providers/CustomMcpClient.js.map +1 -1
  123. package/dist/protocols/mcp/providers/GeminiMcpClient.d.ts.map +1 -1
  124. package/dist/protocols/mcp/providers/GeminiMcpClient.js +1 -0
  125. package/dist/protocols/mcp/providers/GeminiMcpClient.js.map +1 -1
  126. package/dist/protocols/mcp/providers/OllamaMcpClient.d.ts +1 -0
  127. package/dist/protocols/mcp/providers/OllamaMcpClient.d.ts.map +1 -1
  128. package/dist/protocols/mcp/providers/OllamaMcpClient.js +1 -0
  129. package/dist/protocols/mcp/providers/OllamaMcpClient.js.map +1 -1
  130. package/dist/protocols/mcp/providers/OpenAiMcpClient.d.ts.map +1 -1
  131. package/dist/protocols/mcp/providers/OpenAiMcpClient.js +1 -0
  132. package/dist/protocols/mcp/providers/OpenAiMcpClient.js.map +1 -1
  133. package/dist/protocols/mcp/providers/OpenRouterMcpClient.d.ts.map +1 -1
  134. package/dist/protocols/mcp/providers/OpenRouterMcpClient.js +2 -0
  135. package/dist/protocols/mcp/providers/OpenRouterMcpClient.js.map +1 -1
  136. package/dist/protocols/mcp/providers/XaiMcpClient.d.ts.map +1 -1
  137. package/dist/protocols/mcp/providers/XaiMcpClient.js +1 -0
  138. package/dist/protocols/mcp/providers/XaiMcpClient.js.map +1 -1
  139. package/dist/protocols/mcp/security/BrowserTargetGuard.d.ts +14 -0
  140. package/dist/protocols/mcp/security/BrowserTargetGuard.d.ts.map +1 -0
  141. package/dist/protocols/mcp/security/BrowserTargetGuard.js +55 -0
  142. package/dist/protocols/mcp/security/BrowserTargetGuard.js.map +1 -0
  143. package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.d.ts +24 -0
  144. package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.d.ts.map +1 -0
  145. package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.js +33 -0
  146. package/dist/protocols/mcp/security/ExternalMcpRegistrationPolicy.js.map +1 -0
  147. package/dist/protocols/mcp/security/HttpTargetGuard.d.ts.map +1 -1
  148. package/dist/protocols/mcp/security/HttpTargetGuard.js +68 -6
  149. package/dist/protocols/mcp/security/HttpTargetGuard.js.map +1 -1
  150. package/dist/protocols/mcp/security/McpSecurityGuard.d.ts.map +1 -1
  151. package/dist/protocols/mcp/security/McpSecurityGuard.js +7 -5
  152. package/dist/protocols/mcp/security/McpSecurityGuard.js.map +1 -1
  153. package/dist/protocols/mcp/security/McpToolPolicy.d.ts +18 -0
  154. package/dist/protocols/mcp/security/McpToolPolicy.d.ts.map +1 -1
  155. package/dist/protocols/mcp/security/McpToolPolicy.js +60 -0
  156. package/dist/protocols/mcp/security/McpToolPolicy.js.map +1 -1
  157. package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts +118 -5
  158. package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts.map +1 -1
  159. package/dist/protocols/mcp/services/ExternalMcpServerManager.js +499 -98
  160. package/dist/protocols/mcp/services/ExternalMcpServerManager.js.map +1 -1
  161. package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts +2 -2
  162. package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts.map +1 -1
  163. package/dist/protocols/mcp/services/ExternalServerConfigs.js +25 -8
  164. package/dist/protocols/mcp/services/ExternalServerConfigs.js.map +1 -1
  165. package/dist/protocols/mcp/tools/AnalyticsTools.d.ts +3 -37
  166. package/dist/protocols/mcp/tools/AnalyticsTools.d.ts.map +1 -1
  167. package/dist/protocols/mcp/tools/AnalyticsTools.js +134 -614
  168. package/dist/protocols/mcp/tools/AnalyticsTools.js.map +1 -1
  169. package/dist/protocols/mcp/tools/CodeAnalysisTools.d.ts.map +1 -1
  170. package/dist/protocols/mcp/tools/CodeAnalysisTools.js +16 -13
  171. package/dist/protocols/mcp/tools/CodeAnalysisTools.js.map +1 -1
  172. package/dist/protocols/mcp/tools/EffectivenessTools.d.ts.map +1 -1
  173. package/dist/protocols/mcp/tools/EffectivenessTools.js +94 -30
  174. package/dist/protocols/mcp/tools/EffectivenessTools.js.map +1 -1
  175. package/dist/protocols/mcp/tools/GitTools.d.ts.map +1 -1
  176. package/dist/protocols/mcp/tools/GitTools.js +9 -5
  177. package/dist/protocols/mcp/tools/GitTools.js.map +1 -1
  178. package/dist/protocols/mcp/tools/InfrastructureTools.d.ts +10 -40
  179. package/dist/protocols/mcp/tools/InfrastructureTools.d.ts.map +1 -1
  180. package/dist/protocols/mcp/tools/InfrastructureTools.js +29 -70
  181. package/dist/protocols/mcp/tools/InfrastructureTools.js.map +1 -1
  182. package/dist/protocols/mcp/tools/JsonTools.d.ts.map +1 -1
  183. package/dist/protocols/mcp/tools/JsonTools.js +4 -4
  184. package/dist/protocols/mcp/tools/JsonTools.js.map +1 -1
  185. package/dist/protocols/mcp/tools/KnowledgeGraphTools.d.ts +55 -592
  186. package/dist/protocols/mcp/tools/KnowledgeGraphTools.d.ts.map +1 -1
  187. package/dist/protocols/mcp/tools/KnowledgeGraphTools.js +169 -119
  188. package/dist/protocols/mcp/tools/KnowledgeGraphTools.js.map +1 -1
  189. package/dist/protocols/mcp/tools/MemorySearchTools.d.ts +6 -6
  190. package/dist/protocols/mcp/tools/MemorySearchTools.d.ts.map +1 -1
  191. package/dist/protocols/mcp/tools/MemorySearchTools.js +107 -39
  192. package/dist/protocols/mcp/tools/MemorySearchTools.js.map +1 -1
  193. package/dist/protocols/mcp/tools/MemoryUtilityTools.d.ts +4 -5
  194. package/dist/protocols/mcp/tools/MemoryUtilityTools.d.ts.map +1 -1
  195. package/dist/protocols/mcp/tools/MemoryUtilityTools.js +59 -208
  196. package/dist/protocols/mcp/tools/MemoryUtilityTools.js.map +1 -1
  197. package/dist/protocols/mcp/tools/PlanningTools.d.ts +2 -1
  198. package/dist/protocols/mcp/tools/PlanningTools.d.ts.map +1 -1
  199. package/dist/protocols/mcp/tools/PlanningTools.js +111 -49
  200. package/dist/protocols/mcp/tools/PlanningTools.js.map +1 -1
  201. package/dist/protocols/mcp/tools/ProjectContextTools.d.ts.map +1 -1
  202. package/dist/protocols/mcp/tools/ProjectContextTools.js +18 -12
  203. package/dist/protocols/mcp/tools/ProjectContextTools.js.map +1 -1
  204. package/dist/protocols/mcp/tools/SafetyTools.d.ts.map +1 -1
  205. package/dist/protocols/mcp/tools/SafetyTools.js +16 -13
  206. package/dist/protocols/mcp/tools/SafetyTools.js.map +1 -1
  207. package/dist/protocols/mcp/tools/SearchProjectTools.d.ts +24 -7
  208. package/dist/protocols/mcp/tools/SearchProjectTools.d.ts.map +1 -1
  209. package/dist/protocols/mcp/tools/SearchProjectTools.js +226 -126
  210. package/dist/protocols/mcp/tools/SearchProjectTools.js.map +1 -1
  211. package/dist/protocols/mcp/tools/TaskPlanningTools.d.ts +0 -32
  212. package/dist/protocols/mcp/tools/TaskPlanningTools.d.ts.map +1 -1
  213. package/dist/protocols/mcp/tools/TaskPlanningTools.js +363 -450
  214. package/dist/protocols/mcp/tools/TaskPlanningTools.js.map +1 -1
  215. package/dist/protocols/mcp/tools/TestTools.d.ts.map +1 -1
  216. package/dist/protocols/mcp/tools/TestTools.js +18 -11
  217. package/dist/protocols/mcp/tools/TestTools.js.map +1 -1
  218. package/dist/protocols/mcp/tools/TypeScriptTools.d.ts.map +1 -1
  219. package/dist/protocols/mcp/tools/TypeScriptTools.js +22 -12
  220. package/dist/protocols/mcp/tools/TypeScriptTools.js.map +1 -1
  221. package/dist/protocols/mcp/tools/UserInputTools.d.ts.map +1 -1
  222. package/dist/protocols/mcp/tools/UserInputTools.js +14 -1
  223. package/dist/protocols/mcp/tools/UserInputTools.js.map +1 -1
  224. package/dist/protocols/mcp/tools/UserMemoryTools.d.ts +3 -1
  225. package/dist/protocols/mcp/tools/UserMemoryTools.d.ts.map +1 -1
  226. package/dist/protocols/mcp/tools/UserMemoryTools.js +27 -62
  227. package/dist/protocols/mcp/tools/UserMemoryTools.js.map +1 -1
  228. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.d.ts.map +1 -1
  229. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js +14 -60
  230. package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js.map +1 -1
  231. package/dist/protocols/mcp/tools/shell/ShellSandbox.d.ts.map +1 -1
  232. package/dist/protocols/mcp/tools/shell/ShellSandbox.js +9 -27
  233. package/dist/protocols/mcp/tools/shell/ShellSandbox.js.map +1 -1
  234. package/dist/repositories/interfaces/IKnowledgeGraphRepository.d.ts +40 -30
  235. package/dist/repositories/interfaces/IKnowledgeGraphRepository.d.ts.map +1 -1
  236. package/dist/schemas/EventPayloadSchema.d.ts +28 -0
  237. package/dist/schemas/EventPayloadSchema.d.ts.map +1 -1
  238. package/dist/schemas/EventPayloadSchema.js +30 -1
  239. package/dist/schemas/EventPayloadSchema.js.map +1 -1
  240. package/dist/schemas/MxpProtocolSchemas.d.ts +6 -6
  241. package/dist/services/AgentPerformanceService.d.ts +11 -0
  242. package/dist/services/AgentPerformanceService.d.ts.map +1 -1
  243. package/dist/services/AgentPerformanceService.js +59 -33
  244. package/dist/services/AgentPerformanceService.js.map +1 -1
  245. package/dist/services/AutoCorrectionService.d.ts +3 -0
  246. package/dist/services/AutoCorrectionService.d.ts.map +1 -1
  247. package/dist/services/AutoCorrectionService.js +19 -2
  248. package/dist/services/AutoCorrectionService.js.map +1 -1
  249. package/dist/services/BackgroundTaskManager.d.ts +23 -7
  250. package/dist/services/BackgroundTaskManager.d.ts.map +1 -1
  251. package/dist/services/BackgroundTaskManager.js +137 -57
  252. package/dist/services/BackgroundTaskManager.js.map +1 -1
  253. package/dist/services/BrowserManager.d.ts +2 -0
  254. package/dist/services/BrowserManager.d.ts.map +1 -1
  255. package/dist/services/BrowserManager.js +18 -15
  256. package/dist/services/BrowserManager.js.map +1 -1
  257. package/dist/services/ChannelContextMemoryOperations.d.ts +8 -1
  258. package/dist/services/ChannelContextMemoryOperations.d.ts.map +1 -1
  259. package/dist/services/ChannelContextMemoryOperations.js +89 -165
  260. package/dist/services/ChannelContextMemoryOperations.js.map +1 -1
  261. package/dist/services/ChannelContextMessageOperations.d.ts +4 -3
  262. package/dist/services/ChannelContextMessageOperations.d.ts.map +1 -1
  263. package/dist/services/ChannelContextMessageOperations.js +72 -212
  264. package/dist/services/ChannelContextMessageOperations.js.map +1 -1
  265. package/dist/services/MemoryService.d.ts +52 -21
  266. package/dist/services/MemoryService.d.ts.map +1 -1
  267. package/dist/services/MemoryService.js +775 -548
  268. package/dist/services/MemoryService.js.map +1 -1
  269. package/dist/services/PatternLearningService.d.ts +5 -0
  270. package/dist/services/PatternLearningService.d.ts.map +1 -1
  271. package/dist/services/PatternLearningService.js +26 -3
  272. package/dist/services/PatternLearningService.js.map +1 -1
  273. package/dist/services/PerformanceOptimizationService.d.ts +2 -1
  274. package/dist/services/PerformanceOptimizationService.d.ts.map +1 -1
  275. package/dist/services/PerformanceOptimizationService.js +21 -6
  276. package/dist/services/PerformanceOptimizationService.js.map +1 -1
  277. package/dist/services/PredictiveAnalyticsService.d.ts +1 -0
  278. package/dist/services/PredictiveAnalyticsService.d.ts.map +1 -1
  279. package/dist/services/PredictiveAnalyticsService.js +18 -6
  280. package/dist/services/PredictiveAnalyticsService.js.map +1 -1
  281. package/dist/services/ProactiveValidationService.d.ts +6 -0
  282. package/dist/services/ProactiveValidationService.d.ts.map +1 -1
  283. package/dist/services/ProactiveValidationService.js +58 -39
  284. package/dist/services/ProactiveValidationService.js.map +1 -1
  285. package/dist/services/TaskEffectivenessService.d.ts +55 -31
  286. package/dist/services/TaskEffectivenessService.d.ts.map +1 -1
  287. package/dist/services/TaskEffectivenessService.js +243 -125
  288. package/dist/services/TaskEffectivenessService.js.map +1 -1
  289. package/dist/services/ToolExecutionInterceptor.d.ts +4 -0
  290. package/dist/services/ToolExecutionInterceptor.d.ts.map +1 -1
  291. package/dist/services/ToolExecutionInterceptor.js +31 -5
  292. package/dist/services/ToolExecutionInterceptor.js.map +1 -1
  293. package/dist/services/UserInputRequestManager.d.ts +13 -3
  294. package/dist/services/UserInputRequestManager.d.ts.map +1 -1
  295. package/dist/services/UserInputRequestManager.js +42 -6
  296. package/dist/services/UserInputRequestManager.js.map +1 -1
  297. package/dist/services/UserMemoryService.d.ts +2 -0
  298. package/dist/services/UserMemoryService.d.ts.map +1 -1
  299. package/dist/services/UserMemoryService.js +9 -4
  300. package/dist/services/UserMemoryService.js.map +1 -1
  301. package/dist/services/ValidationAnalyticsService.d.ts +4 -0
  302. package/dist/services/ValidationAnalyticsService.d.ts.map +1 -1
  303. package/dist/services/ValidationAnalyticsService.js +30 -8
  304. package/dist/services/ValidationAnalyticsService.js.map +1 -1
  305. package/dist/services/ValidationCacheService.d.ts +3 -1
  306. package/dist/services/ValidationCacheService.d.ts.map +1 -1
  307. package/dist/services/ValidationCacheService.js +25 -4
  308. package/dist/services/ValidationCacheService.js.map +1 -1
  309. package/dist/services/ValidationMiddleware.d.ts +7 -0
  310. package/dist/services/ValidationMiddleware.d.ts.map +1 -1
  311. package/dist/services/ValidationMiddleware.js +53 -10
  312. package/dist/services/ValidationMiddleware.js.map +1 -1
  313. package/dist/services/ValidationPerformanceService.d.ts +3 -0
  314. package/dist/services/ValidationPerformanceService.d.ts.map +1 -1
  315. package/dist/services/ValidationPerformanceService.js +28 -11
  316. package/dist/services/ValidationPerformanceService.js.map +1 -1
  317. package/dist/services/WebSearchService.d.ts.map +1 -1
  318. package/dist/services/WebSearchService.js +9 -0
  319. package/dist/services/WebSearchService.js.map +1 -1
  320. package/dist/services/dag/TaskDagService.d.ts +3 -0
  321. package/dist/services/dag/TaskDagService.d.ts.map +1 -1
  322. package/dist/services/dag/TaskDagService.js +18 -0
  323. package/dist/services/dag/TaskDagService.js.map +1 -1
  324. package/dist/services/kg/EntityQValueManager.d.ts +3 -1
  325. package/dist/services/kg/EntityQValueManager.d.ts.map +1 -1
  326. package/dist/services/kg/EntityQValueManager.js +10 -10
  327. package/dist/services/kg/EntityQValueManager.js.map +1 -1
  328. package/dist/services/kg/GraphSurpriseCalculator.d.ts +0 -4
  329. package/dist/services/kg/GraphSurpriseCalculator.d.ts.map +1 -1
  330. package/dist/services/kg/GraphSurpriseCalculator.js +0 -9
  331. package/dist/services/kg/GraphSurpriseCalculator.js.map +1 -1
  332. package/dist/services/kg/KnowledgeGraphService.d.ts +12 -12
  333. package/dist/services/kg/KnowledgeGraphService.d.ts.map +1 -1
  334. package/dist/services/kg/KnowledgeGraphService.js +43 -51
  335. package/dist/services/kg/KnowledgeGraphService.js.map +1 -1
  336. package/dist/services/kg/OrparGraphIntegration.d.ts.map +1 -1
  337. package/dist/services/kg/OrparGraphIntegration.js +6 -5
  338. package/dist/services/kg/OrparGraphIntegration.js.map +1 -1
  339. package/dist/services/orpar-memory/CycleConsolidationTrigger.d.ts +1 -0
  340. package/dist/services/orpar-memory/CycleConsolidationTrigger.d.ts.map +1 -1
  341. package/dist/services/orpar-memory/CycleConsolidationTrigger.js +8 -1
  342. package/dist/services/orpar-memory/CycleConsolidationTrigger.js.map +1 -1
  343. package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts +8 -1
  344. package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts.map +1 -1
  345. package/dist/services/orpar-memory/OrparMemoryCoordinator.js +93 -45
  346. package/dist/services/orpar-memory/OrparMemoryCoordinator.js.map +1 -1
  347. package/dist/services/orpar-memory/SurpriseOrparAdapter.d.ts +1 -0
  348. package/dist/services/orpar-memory/SurpriseOrparAdapter.d.ts.map +1 -1
  349. package/dist/services/orpar-memory/SurpriseOrparAdapter.js +8 -1
  350. package/dist/services/orpar-memory/SurpriseOrparAdapter.js.map +1 -1
  351. package/dist/types/ChannelContext.d.ts +2 -1
  352. package/dist/types/ChannelContext.d.ts.map +1 -1
  353. package/dist/types/EffectivenessTypes.d.ts +4 -1
  354. package/dist/types/EffectivenessTypes.d.ts.map +1 -1
  355. package/dist/types/TaskCompletionTypes.d.ts +7 -5
  356. package/dist/types/TaskCompletionTypes.d.ts.map +1 -1
  357. package/dist/types/TaskTypes.d.ts +8 -1
  358. package/dist/types/TaskTypes.d.ts.map +1 -1
  359. package/dist/utils/GlobMatcher.d.ts +37 -0
  360. package/dist/utils/GlobMatcher.d.ts.map +1 -0
  361. package/dist/utils/GlobMatcher.js +131 -0
  362. package/dist/utils/GlobMatcher.js.map +1 -0
  363. package/package.json +1 -1
  364. package/src/config/ModelContextLimits.ts +7 -1
  365. package/src/constants/CoreTools.ts +6 -5
  366. package/src/constants/DefaultPhaseProfiles.ts +29 -0
  367. package/src/constants/ReservedIdentities.ts +51 -0
  368. package/src/database/adapters/mongodb/MongoKnowledgeGraphRepository.ts +115 -36
  369. package/src/events/ClientEventBus.ts +117 -48
  370. package/src/events/EventBus.ts +32 -2
  371. package/src/events/EventBusBase.ts +132 -39
  372. package/src/events/EventNames.ts +43 -36
  373. package/src/events/PublicEvents.ts +8 -0
  374. package/src/events/ServerEventBus.ts +9 -128
  375. package/src/events/event-definitions/ControlLoopEvents.ts +12 -0
  376. package/src/events/event-definitions/SdkEvents.ts +58 -0
  377. package/src/events/event-definitions/TaskEvents.ts +2 -2
  378. package/src/index.ts +15 -0
  379. package/src/interfaces/AgentInterfaces.ts +5 -0
  380. package/src/interfaces/ChannelConfig.ts +2 -2
  381. package/src/interfaces/ConversationMessage.ts +5 -0
  382. package/src/interfaces/IMemoryPersistence.ts +55 -1
  383. package/src/interfaces/SocketServiceInterface.ts +3 -2
  384. package/src/interfaces/TaskInterfaces.ts +16 -1
  385. package/src/models/agent.ts +0 -6
  386. package/src/models/agentIdentityReservation.ts +77 -0
  387. package/src/models/channel.ts +2 -0
  388. package/src/models/channelKey.ts +10 -0
  389. package/src/models/memory.ts +18 -19
  390. package/src/models/memoryStrata.ts +9 -23
  391. package/src/models/plan.ts +3 -3
  392. package/src/models/taskEffectiveness.ts +9 -2
  393. package/src/models/user.ts +12 -0
  394. package/src/protocols/mcp/LlmTestEnvironmentGuard.ts +30 -0
  395. package/src/protocols/mcp/McpServerTypes.ts +9 -0
  396. package/src/protocols/mcp/providers/AnthropicMcpClient.ts +2 -0
  397. package/src/protocols/mcp/providers/AzureOpenAiMcpClient.ts +1 -0
  398. package/src/protocols/mcp/providers/BaseMcpClient.ts +13 -0
  399. package/src/protocols/mcp/providers/CustomMcpClient.ts +7 -0
  400. package/src/protocols/mcp/providers/GeminiMcpClient.ts +2 -0
  401. package/src/protocols/mcp/providers/OllamaMcpClient.ts +3 -1
  402. package/src/protocols/mcp/providers/OpenAiMcpClient.ts +2 -0
  403. package/src/protocols/mcp/providers/OpenRouterMcpClient.ts +3 -0
  404. package/src/protocols/mcp/providers/XaiMcpClient.ts +2 -0
  405. package/src/protocols/mcp/security/BrowserTargetGuard.ts +64 -0
  406. package/src/protocols/mcp/security/ExternalMcpRegistrationPolicy.ts +38 -0
  407. package/src/protocols/mcp/security/HttpTargetGuard.ts +77 -6
  408. package/src/protocols/mcp/security/McpSecurityGuard.ts +7 -5
  409. package/src/protocols/mcp/security/McpToolPolicy.ts +74 -0
  410. package/src/protocols/mcp/services/ExternalMcpServerManager.ts +656 -111
  411. package/src/protocols/mcp/services/ExternalServerConfigs.ts +26 -8
  412. package/src/protocols/mcp/tools/AnalyticsTools.ts +167 -641
  413. package/src/protocols/mcp/tools/CodeAnalysisTools.ts +44 -14
  414. package/src/protocols/mcp/tools/EffectivenessTools.ts +185 -45
  415. package/src/protocols/mcp/tools/GitTools.ts +15 -5
  416. package/src/protocols/mcp/tools/InfrastructureTools.ts +42 -90
  417. package/src/protocols/mcp/tools/JsonTools.ts +7 -4
  418. package/src/protocols/mcp/tools/KnowledgeGraphTools.ts +313 -164
  419. package/src/protocols/mcp/tools/MemorySearchTools.ts +158 -46
  420. package/src/protocols/mcp/tools/MemoryUtilityTools.ts +85 -232
  421. package/src/protocols/mcp/tools/PlanningTools.ts +137 -59
  422. package/src/protocols/mcp/tools/ProjectContextTools.ts +33 -12
  423. package/src/protocols/mcp/tools/SafetyTools.ts +49 -13
  424. package/src/protocols/mcp/tools/SearchProjectTools.ts +294 -153
  425. package/src/protocols/mcp/tools/TaskPlanningTools.ts +437 -514
  426. package/src/protocols/mcp/tools/TestTools.ts +41 -11
  427. package/src/protocols/mcp/tools/TypeScriptTools.ts +61 -12
  428. package/src/protocols/mcp/tools/UserInputTools.ts +15 -1
  429. package/src/protocols/mcp/tools/UserMemoryTools.ts +27 -62
  430. package/src/protocols/mcp/tools/shell/ShellExecuteHandler.ts +26 -84
  431. package/src/protocols/mcp/tools/shell/ShellSandbox.ts +13 -31
  432. package/src/repositories/interfaces/IKnowledgeGraphRepository.ts +45 -27
  433. package/src/schemas/EventPayloadSchema.ts +45 -1
  434. package/src/services/AgentPerformanceService.ts +85 -36
  435. package/src/services/AutoCorrectionService.ts +25 -6
  436. package/src/services/BackgroundTaskManager.ts +183 -76
  437. package/src/services/BrowserManager.ts +20 -16
  438. package/src/services/ChannelContextMemoryOperations.ts +169 -202
  439. package/src/services/ChannelContextMessageOperations.ts +112 -274
  440. package/src/services/MemoryService.ts +1053 -760
  441. package/src/services/PatternLearningService.ts +32 -7
  442. package/src/services/PerformanceOptimizationService.ts +26 -9
  443. package/src/services/PredictiveAnalyticsService.ts +23 -10
  444. package/src/services/ProactiveValidationService.ts +66 -40
  445. package/src/services/TaskEffectivenessService.ts +421 -206
  446. package/src/services/ToolExecutionInterceptor.ts +40 -9
  447. package/src/services/UserInputRequestManager.ts +51 -6
  448. package/src/services/UserMemoryService.ts +12 -3
  449. package/src/services/ValidationAnalyticsService.ts +36 -11
  450. package/src/services/ValidationCacheService.ts +30 -7
  451. package/src/services/ValidationMiddleware.ts +62 -14
  452. package/src/services/ValidationPerformanceService.ts +47 -25
  453. package/src/services/WebSearchService.ts +16 -4
  454. package/src/services/dag/TaskDagService.ts +20 -1
  455. package/src/services/kg/EntityQValueManager.ts +21 -10
  456. package/src/services/kg/GraphSurpriseCalculator.ts +0 -14
  457. package/src/services/kg/KnowledgeGraphService.ts +56 -48
  458. package/src/services/kg/OrparGraphIntegration.ts +11 -5
  459. package/src/services/orpar-memory/CycleConsolidationTrigger.ts +10 -1
  460. package/src/services/orpar-memory/OrparMemoryCoordinator.ts +142 -71
  461. package/src/services/orpar-memory/SurpriseOrparAdapter.ts +10 -1
  462. package/src/types/ChannelContext.ts +3 -1
  463. package/src/types/EffectivenessTypes.ts +6 -2
  464. package/src/types/TaskCompletionTypes.ts +9 -9
  465. package/src/types/TaskTypes.ts +12 -1
  466. package/src/utils/GlobMatcher.ts +157 -0
@@ -21,181 +21,299 @@
21
21
  /**
22
22
  * Search Project Tools
23
23
  *
24
- * MCP tool for scoped grep/find within a working directory. Supports two modes:
25
- * - search_content: grep for patterns in file contents (uses rg with grep fallback)
26
- * - search_files: find files by name/glob pattern
27
- *
28
- * Safety: Validates pattern input against an allowlist to prevent command injection.
24
+ * Scoped content and filename search under MXF_WORKSPACE_ROOT. Content search
25
+ * invokes rg/grep with an argv array (never a shell); filename search uses a
26
+ * bounded filesystem walk and never starts a process.
29
27
  */
30
28
 
31
- import { McpToolDefinition, McpToolHandlerContext, McpToolHandlerResult, McpToolResultContent } from '../McpServerTypes.js';
32
- import { McpToolInput } from '../IMcpClient.js';
29
+ import { execFile } from 'child_process';
30
+ import * as fs from 'fs/promises';
31
+ import * as path from 'path';
32
+ import { promisify } from 'util';
33
+
33
34
  import { Logger } from '../../../utils/Logger.js';
34
- import { execSync } from 'child_process';
35
+ import { createGlobMatcher, MAX_GLOB_WILDCARDS } from '../../../utils/GlobMatcher.js';
36
+ import {
37
+ buildShellChildEnv,
38
+ resolveWorkspacePath
39
+ } from '../security/McpToolPolicy.js';
35
40
 
36
41
  const logger = new Logger('info', 'SearchProjectTools', 'server');
42
+ const execFileAsync = promisify(execFile);
43
+
44
+ const DEFAULT_MAX_RESULTS = 50;
45
+ const MAX_RESULTS = 200;
46
+ const MAX_PATTERN_LENGTH = 512;
47
+ const MAX_FILE_TYPES = 20;
48
+ const MAX_EXTENSION_LENGTH = 16;
49
+ const MAX_SEARCH_OUTPUT_BYTES = 2 * 1024 * 1024;
50
+ const MAX_SCANNED_ENTRIES = 50_000;
51
+ const MAX_DIRECTORY_DEPTH = 50;
52
+ const EXCLUDED_DIRECTORIES = new Set(['.git', 'node_modules', 'dist']);
53
+
54
+ type SearchMode = 'search_content' | 'search_files';
55
+
56
+ export interface SearchProjectInput {
57
+ mode: SearchMode;
58
+ pattern: string;
59
+ workingDirectory?: string;
60
+ fileTypes?: string[];
61
+ maxResults?: number;
62
+ caseSensitive?: boolean;
63
+ }
37
64
 
38
- /** Characters that are not allowed in search patterns to prevent command injection */
39
- const DANGEROUS_CHARS = [';', '|', '&', '$', '`', '(', ')'];
65
+ interface ProcessFailure extends Error {
66
+ code?: string | number;
67
+ status?: number;
68
+ stdout?: string;
69
+ }
40
70
 
41
- /**
42
- * Validate that the pattern does not contain dangerous shell characters.
43
- * Throws an error if any dangerous character is found.
44
- */
45
- function validatePattern(pattern: string): void {
46
- for (const char of DANGEROUS_CHARS) {
47
- if (pattern.includes(char)) {
48
- throw new Error(`Pattern contains dangerous character '${char}'. Patterns must not include: ${DANGEROUS_CHARS.join(' ')}`);
49
- }
71
+ function validatePattern(pattern: unknown): asserts pattern is string {
72
+ if (typeof pattern !== 'string' || pattern.length === 0) {
73
+ throw new Error('pattern must be a non-empty string');
74
+ }
75
+ if (pattern.length > MAX_PATTERN_LENGTH) {
76
+ throw new Error(`pattern must be at most ${MAX_PATTERN_LENGTH} characters`);
77
+ }
78
+ if ([...pattern].some(character => {
79
+ const codePoint = character.codePointAt(0) ?? 0;
80
+ return codePoint <= 0x1f || codePoint === 0x7f;
81
+ })) {
82
+ throw new Error('pattern must not contain control characters');
50
83
  }
51
84
  }
52
85
 
53
- /**
54
- * Handle search_content mode: grep for patterns in file contents.
55
- * Tries ripgrep (rg) first, falls back to grep if rg is not installed.
56
- */
57
- function handleSearchContent(
58
- pattern: string,
59
- dir: string,
60
- maxResults: number,
61
- caseSensitive: boolean,
62
- fileTypes?: string[]
63
- ): any {
64
- const caseFlag = caseSensitive ? '' : '-i';
65
- let output = '';
66
-
67
- try {
68
- // Try ripgrep first
69
- let cmd = `rg -n --max-count ${maxResults} ${caseFlag}`;
86
+ function validateFileTypes(value: unknown): string[] {
87
+ if (value === undefined) {
88
+ return [];
89
+ }
90
+ if (!Array.isArray(value) || value.length > MAX_FILE_TYPES) {
91
+ throw new Error(`fileTypes must be an array of at most ${MAX_FILE_TYPES} extensions`);
92
+ }
70
93
 
71
- // Add file type filters for rg
72
- if (fileTypes && fileTypes.length > 0) {
73
- for (const ext of fileTypes) {
74
- cmd += ` --type-add 'custom:*.${ext}' --type custom`;
75
- }
94
+ const normalized = value.map((extension, index) => {
95
+ if (typeof extension !== 'string') {
96
+ throw new Error(`fileTypes[${index}] must be a string`);
76
97
  }
98
+ const withoutDot = extension.startsWith('.') ? extension.slice(1) : extension;
99
+ if (
100
+ withoutDot.length === 0 ||
101
+ withoutDot.length > MAX_EXTENSION_LENGTH ||
102
+ !/^[A-Za-z0-9][A-Za-z0-9_+-]*$/u.test(withoutDot)
103
+ ) {
104
+ throw new Error(
105
+ `fileTypes[${index}] is not a valid file extension (maximum ${MAX_EXTENSION_LENGTH} characters)`
106
+ );
107
+ }
108
+ return withoutDot.toLowerCase();
109
+ });
77
110
 
78
- // Exclude common non-source directories
79
- cmd += ` --glob '!.git' --glob '!node_modules' --glob '!dist'`;
80
- cmd += ` "${pattern}" "${dir}"`;
81
-
82
- logger.info(`Executing ripgrep: ${cmd}`);
83
- output = execSync(cmd, { cwd: dir, timeout: 15000, encoding: 'utf-8' });
84
- } catch (rgError: any) {
85
- // Check if rg is not installed (ENOENT)
86
- if (rgError.code === 'ENOENT' || (rgError.message && rgError.message.includes('ENOENT'))) {
87
- logger.info('ripgrep not found, falling back to grep');
88
-
89
- // Fall back to grep
90
- let grepCmd = `grep -rn ${caseFlag}`;
91
-
92
- // Add file type includes for grep
93
- if (fileTypes && fileTypes.length > 0) {
94
- for (const ext of fileTypes) {
95
- grepCmd += ` --include="*.${ext}"`;
96
- }
97
- }
98
-
99
- // Exclude common non-source directories
100
- grepCmd += ` --exclude-dir=.git --exclude-dir=node_modules --exclude-dir=dist`;
101
- grepCmd += ` "${pattern}" "${dir}"`;
111
+ return [...new Set(normalized)];
112
+ }
102
113
 
103
- logger.info(`Executing grep: ${grepCmd}`);
104
- output = execSync(grepCmd, { cwd: dir, timeout: 15000, encoding: 'utf-8' });
105
- } else if (rgError.status === 1) {
106
- // rg returns exit code 1 when no matches found — not an error
107
- output = '';
108
- } else {
109
- throw rgError;
110
- }
114
+ function validateMaxResults(value: unknown): number {
115
+ if (value === undefined) {
116
+ return DEFAULT_MAX_RESULTS;
117
+ }
118
+ if (!Number.isInteger(value) || (value as number) < 1 || (value as number) > MAX_RESULTS) {
119
+ throw new Error(`maxResults must be an integer between 1 and ${MAX_RESULTS}`);
111
120
  }
121
+ return value as number;
122
+ }
123
+
124
+ function isNoMatch(error: ProcessFailure): boolean {
125
+ return error.code === 1 || error.status === 1;
126
+ }
112
127
 
113
- // Parse output: each line is file:line:text
114
- const lines = output.split('\n').filter((line: string) => line.trim().length > 0);
115
- const totalFound = lines.length;
128
+ function isCommandMissing(error: ProcessFailure): boolean {
129
+ return error.code === 'ENOENT' || error.message.includes('ENOENT');
130
+ }
116
131
 
117
- const matches = lines.slice(0, maxResults).map((line: string) => {
118
- // rg/grep output format: file:line:text
132
+ function parseContentMatches(output: string, maxResults: number): {
133
+ matches: Array<{ file: string; line: number; text: string }>;
134
+ totalFound: number;
135
+ truncated: boolean;
136
+ success: true;
137
+ } {
138
+ const lines = output.split('\n').filter(line => line.trim().length > 0);
139
+ const matches = lines.slice(0, maxResults).map(line => {
119
140
  const firstColon = line.indexOf(':');
120
141
  const secondColon = line.indexOf(':', firstColon + 1);
121
142
 
122
- if (firstColon === -1 || secondColon === -1) {
143
+ if (firstColon < 0 || secondColon < 0) {
123
144
  return { file: line, line: 0, text: '' };
124
145
  }
125
146
 
126
- const file = line.substring(0, firstColon);
127
- const lineNum = parseInt(line.substring(firstColon + 1, secondColon), 10);
128
- let text = line.substring(secondColon + 1);
129
-
130
- // Truncate text to 200 chars
147
+ let text = line.slice(secondColon + 1);
131
148
  if (text.length > 200) {
132
- text = text.substring(0, 200) + '...';
149
+ text = `${text.slice(0, 200)}...`;
133
150
  }
134
-
135
- return { file, line: lineNum, text };
151
+ return {
152
+ file: line.slice(0, firstColon),
153
+ line: Number.parseInt(line.slice(firstColon + 1, secondColon), 10) || 0,
154
+ text
155
+ };
136
156
  });
137
157
 
138
158
  return {
139
159
  matches,
140
- totalFound,
141
- truncated: totalFound > maxResults,
160
+ totalFound: lines.length,
161
+ truncated: lines.length > maxResults,
142
162
  success: true
143
163
  };
144
164
  }
145
165
 
146
- /**
147
- * Handle search_files mode: find files by name/glob pattern.
148
- * Uses the find command to locate files matching the pattern.
149
- */
150
- function handleSearchFiles(
166
+ async function runContentSearch(
151
167
  pattern: string,
152
- dir: string,
168
+ directory: string,
153
169
  maxResults: number,
154
- fileTypes?: string[]
155
- ): any {
156
- let cmd: string;
157
-
158
- if (fileTypes && fileTypes.length > 0) {
159
- // Build find command with file type filters
160
- const typeConditions = fileTypes.map(ext => `-name "*.${ext}"`).join(' -o ');
161
- cmd = `find "${dir}" \\( ${typeConditions} \\) -type f -not -path '*/.git/*' -not -path '*/node_modules/*' -not -path '*/dist/*'`;
162
- } else {
163
- cmd = `find "${dir}" -name "${pattern}" -type f -not -path '*/.git/*' -not -path '*/node_modules/*' -not -path '*/dist/*'`;
170
+ caseSensitive: boolean,
171
+ fileTypes: string[]
172
+ ): Promise<ReturnType<typeof parseContentMatches>> {
173
+ const rgArgs = [
174
+ '--line-number',
175
+ '--no-heading',
176
+ '--color', 'never',
177
+ '--max-count', String(maxResults),
178
+ ...(caseSensitive ? [] : ['--ignore-case']),
179
+ ...fileTypes.flatMap(extension => ['--glob', `*.${extension}`]),
180
+ '--glob', '!.git/**',
181
+ '--glob', '!node_modules/**',
182
+ '--glob', '!dist/**',
183
+ '--', pattern, '.'
184
+ ];
185
+
186
+ try {
187
+ const result = await execFileAsync('rg', rgArgs, {
188
+ cwd: directory,
189
+ env: buildShellChildEnv(),
190
+ encoding: 'utf-8',
191
+ timeout: 15_000,
192
+ maxBuffer: MAX_SEARCH_OUTPUT_BYTES
193
+ });
194
+ return parseContentMatches(result.stdout, maxResults);
195
+ } catch (rawError) {
196
+ const rgError = rawError as ProcessFailure;
197
+ if (isNoMatch(rgError)) {
198
+ return parseContentMatches('', maxResults);
199
+ }
200
+ if (!isCommandMissing(rgError)) {
201
+ throw rgError;
202
+ }
164
203
  }
165
204
 
166
- logger.info(`Executing find: ${cmd}`);
205
+ const grepArgs = [
206
+ '--recursive',
207
+ '--line-number',
208
+ '--binary-files=without-match',
209
+ ...(caseSensitive ? [] : ['--ignore-case']),
210
+ ...fileTypes.map(extension => `--include=*.${extension}`),
211
+ '--exclude-dir=.git',
212
+ '--exclude-dir=node_modules',
213
+ '--exclude-dir=dist',
214
+ '--', pattern, '.'
215
+ ];
167
216
 
168
- let output = '';
169
217
  try {
170
- output = execSync(cmd, { cwd: dir, timeout: 15000, encoding: 'utf-8' });
171
- } catch (error: any) {
172
- // find returns exit code 1 on permission errors but may still have output
173
- if (error.stdout) {
174
- output = error.stdout;
175
- } else {
176
- throw error;
218
+ const result = await execFileAsync('grep', grepArgs, {
219
+ cwd: directory,
220
+ env: buildShellChildEnv(),
221
+ encoding: 'utf-8',
222
+ timeout: 15_000,
223
+ maxBuffer: MAX_SEARCH_OUTPUT_BYTES
224
+ });
225
+ return parseContentMatches(result.stdout, maxResults);
226
+ } catch (rawError) {
227
+ const grepError = rawError as ProcessFailure;
228
+ if (isNoMatch(grepError)) {
229
+ return parseContentMatches('', maxResults);
177
230
  }
231
+ throw grepError;
178
232
  }
233
+ }
179
234
 
180
- const allFiles = output.split('\n').filter((line: string) => line.trim().length > 0);
181
- const totalFound = allFiles.length;
182
- const files = allFiles.slice(0, maxResults);
235
+ async function searchFiles(
236
+ pattern: string,
237
+ directory: string,
238
+ maxResults: number,
239
+ caseSensitive: boolean,
240
+ fileTypes: string[]
241
+ ): Promise<{ files: string[]; totalFound: number; truncated: boolean; success: true }> {
242
+ // Compiled without a regular expression: a pattern cannot make matching
243
+ // backtrack for seconds per entry while this walk holds the event loop.
244
+ const matcher = createGlobMatcher(pattern, caseSensitive);
245
+ const extensionSet = new Set(fileTypes);
246
+ const files: string[] = [];
247
+ const pending: Array<{ absolutePath: string; relativePath: string; depth: number }> = [
248
+ { absolutePath: directory, relativePath: '', depth: 0 }
249
+ ];
250
+ let totalFound = 0;
251
+ let scannedEntries = 0;
252
+ let scanLimitReached = false;
253
+
254
+ while (pending.length > 0) {
255
+ const current = pending.pop()!;
256
+ const entries = await fs.readdir(current.absolutePath, { withFileTypes: true });
257
+
258
+ for (const entry of entries) {
259
+ scannedEntries += 1;
260
+ if (scannedEntries > MAX_SCANNED_ENTRIES) {
261
+ scanLimitReached = true;
262
+ pending.length = 0;
263
+ break;
264
+ }
265
+
266
+ const relativePath = current.relativePath
267
+ ? `${current.relativePath}/${entry.name}`
268
+ : entry.name;
269
+
270
+ if (entry.isSymbolicLink()) {
271
+ continue;
272
+ }
273
+ if (entry.isDirectory()) {
274
+ if (
275
+ !EXCLUDED_DIRECTORIES.has(entry.name) &&
276
+ current.depth < MAX_DIRECTORY_DEPTH
277
+ ) {
278
+ pending.push({
279
+ absolutePath: path.join(current.absolutePath, entry.name),
280
+ relativePath,
281
+ depth: current.depth + 1
282
+ });
283
+ }
284
+ continue;
285
+ }
286
+ if (!entry.isFile()) {
287
+ continue;
288
+ }
289
+
290
+ const extension = path.extname(entry.name).slice(1).toLowerCase();
291
+ const extensionMatches = extensionSet.size === 0 || extensionSet.has(extension);
292
+ // A pattern with a separator addresses the path under the search
293
+ // directory; one without addresses the file name.
294
+ const patternMatches = matcher.test(matcher.matchesPath ? relativePath : entry.name);
295
+ if (!extensionMatches || !patternMatches) {
296
+ continue;
297
+ }
298
+
299
+ totalFound += 1;
300
+ if (files.length < maxResults) {
301
+ files.push(relativePath);
302
+ }
303
+ }
304
+ }
183
305
 
184
306
  return {
185
307
  files,
186
308
  totalFound,
187
- truncated: totalFound > maxResults,
309
+ truncated: scanLimitReached || totalFound > maxResults,
188
310
  success: true
189
311
  };
190
312
  }
191
313
 
192
- /**
193
- * Search for files or content within the working directory.
194
- * Two modes: search_content (grep for patterns in file contents) and search_files (find files by name/glob).
195
- */
196
314
  export const search_project_tool = {
197
315
  name: 'search_project',
198
- description: 'Search for files or content within the working directory. Two modes: search_content (grep for patterns in file contents) and search_files (find files by name/glob).',
316
+ description: 'Search for files or content under MXF_WORKSPACE_ROOT without invoking a shell.',
199
317
  enabled: true,
200
318
  executionSide: 'either' as const,
201
319
  inputSchema: {
@@ -204,26 +322,32 @@ export const search_project_tool = {
204
322
  mode: {
205
323
  type: 'string',
206
324
  enum: ['search_content', 'search_files'],
207
- description: 'search_content greps file contents, search_files finds files by name'
325
+ description: 'search_content searches file contents; search_files finds filenames'
208
326
  },
209
327
  pattern: {
210
328
  type: 'string',
211
- description: 'Search pattern (regex for content, glob for files)'
329
+ minLength: 1,
330
+ maxLength: MAX_PATTERN_LENGTH,
331
+ description: 'Regular expression for content search, or a glob for filename search: ' +
332
+ '* within one segment, ? for one character, ** as a whole segment for any depth ' +
333
+ `(at most ${MAX_GLOB_WILDCARDS} wildcards)`
212
334
  },
213
335
  workingDirectory: {
214
336
  type: 'string',
215
- description: 'Directory to search in (defaults to current working directory)'
337
+ description: 'Directory under MXF_WORKSPACE_ROOT (defaults to MXF_WORKSPACE_ROOT)'
216
338
  },
217
339
  fileTypes: {
218
340
  type: 'array',
219
- items: { type: 'string' },
220
- description: "File extensions to filter (e.g., ['ts', 'js'])"
341
+ maxItems: MAX_FILE_TYPES,
342
+ items: { type: 'string', minLength: 1, maxLength: MAX_EXTENSION_LENGTH + 1 },
343
+ description: "File extensions to filter (for example ['ts', 'js'])"
221
344
  },
222
345
  maxResults: {
223
- type: 'number',
224
- description: 'Maximum results to return (default: 50, max: 200)',
225
- default: 50,
226
- maximum: 200
346
+ type: 'integer',
347
+ description: `Maximum results to return (default: ${DEFAULT_MAX_RESULTS}, max: ${MAX_RESULTS})`,
348
+ default: DEFAULT_MAX_RESULTS,
349
+ minimum: 1,
350
+ maximum: MAX_RESULTS
227
351
  },
228
352
  caseSensitive: {
229
353
  type: 'boolean',
@@ -246,34 +370,51 @@ export const search_project_tool = {
246
370
  ],
247
371
  metadata: {
248
372
  category: 'search',
249
- timeout: 15000
373
+ timeout: 15_000
250
374
  },
251
375
 
252
- async handler(input: any, context: any): Promise<any> {
376
+ async handler(input: SearchProjectInput): Promise<unknown> {
253
377
  try {
254
- const { mode, pattern, workingDirectory, fileTypes, maxResults: inputMax, caseSensitive } = input;
255
-
256
- // Validate pattern for command injection safety
257
- validatePattern(pattern);
258
-
259
- const dir = workingDirectory || process.cwd();
260
- const maxResults = Math.min(inputMax || 50, 200);
261
- const isCaseSensitive = caseSensitive ?? false;
378
+ if (input.mode !== 'search_content' && input.mode !== 'search_files') {
379
+ throw new Error('mode must be search_content or search_files');
380
+ }
381
+ validatePattern(input.pattern);
382
+ const fileTypes = validateFileTypes(input.fileTypes);
383
+ const maxResults = validateMaxResults(input.maxResults);
384
+ if (input.caseSensitive !== undefined && typeof input.caseSensitive !== 'boolean') {
385
+ throw new Error('caseSensitive must be a boolean');
386
+ }
262
387
 
263
- if (mode === 'search_content') {
264
- return handleSearchContent(pattern, dir, maxResults, isCaseSensitive, fileTypes);
265
- } else {
266
- return handleSearchFiles(pattern, dir, maxResults, fileTypes);
388
+ const directory = resolveWorkspacePath(
389
+ input.workingDirectory,
390
+ 'search_project workingDirectory'
391
+ );
392
+ const stat = await fs.stat(directory);
393
+ if (!stat.isDirectory()) {
394
+ throw new Error('search_project workingDirectory must be a directory');
267
395
  }
268
- } catch (error: any) {
269
- logger.error('search_project failed:', error.message);
270
- return {
271
- error: error.message,
272
- success: false
273
- };
396
+
397
+ return input.mode === 'search_content'
398
+ ? await runContentSearch(
399
+ input.pattern,
400
+ directory,
401
+ maxResults,
402
+ input.caseSensitive ?? false,
403
+ fileTypes
404
+ )
405
+ : await searchFiles(
406
+ input.pattern,
407
+ directory,
408
+ maxResults,
409
+ input.caseSensitive ?? false,
410
+ fileTypes
411
+ );
412
+ } catch (error) {
413
+ const message = error instanceof Error ? error.message : String(error);
414
+ logger.error('search_project failed', { error: message });
415
+ return { error: message, success: false };
274
416
  }
275
417
  }
276
418
  };
277
419
 
278
- /** Exported array of search project tools for registration */
279
420
  export const searchProjectTools = [search_project_tool];