mcp-wordpress 2.4.1 → 2.5.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 (350) hide show
  1. package/README.md +114 -48
  2. package/dist/ajv-patch.js +34 -0
  3. package/dist/cache/CacheInvalidation.d.ts +3 -1
  4. package/dist/cache/CacheInvalidation.d.ts.map +1 -1
  5. package/dist/cache/CacheInvalidation.js +10 -4
  6. package/dist/cache/CacheInvalidation.js.map +1 -1
  7. package/dist/cache/CacheManager.d.ts +3 -2
  8. package/dist/cache/CacheManager.d.ts.map +1 -1
  9. package/dist/cache/CacheManager.js +11 -3
  10. package/dist/cache/CacheManager.js.map +1 -1
  11. package/dist/cache/HttpCacheWrapper.d.ts +7 -6
  12. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
  13. package/dist/cache/HttpCacheWrapper.js +8 -5
  14. package/dist/cache/HttpCacheWrapper.js.map +1 -1
  15. package/dist/cache/__tests__/HttpCacheWrapper.test.js +6 -5
  16. package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -1
  17. package/dist/cache/index.d.ts +3 -3
  18. package/dist/cache/index.d.ts.map +1 -1
  19. package/dist/cache/index.js +1 -1
  20. package/dist/cache/index.js.map +1 -1
  21. package/dist/client/CachedWordPressClient.d.ts +23 -9
  22. package/dist/client/CachedWordPressClient.d.ts.map +1 -1
  23. package/dist/client/CachedWordPressClient.js +4 -1
  24. package/dist/client/CachedWordPressClient.js.map +1 -1
  25. package/dist/client/MockWordPressClient.d.ts +2 -1
  26. package/dist/client/MockWordPressClient.d.ts.map +1 -1
  27. package/dist/client/MockWordPressClient.js +3 -1
  28. package/dist/client/MockWordPressClient.js.map +1 -1
  29. package/dist/client/api.d.ts +17 -13
  30. package/dist/client/api.d.ts.map +1 -1
  31. package/dist/client/api.js +135 -30
  32. package/dist/client/api.js.map +1 -1
  33. package/dist/client/auth.d.ts.map +1 -1
  34. package/dist/client/auth.js +2 -3
  35. package/dist/client/auth.js.map +1 -1
  36. package/dist/client/managers/AuthenticationManager.d.ts +55 -2
  37. package/dist/client/managers/AuthenticationManager.d.ts.map +1 -1
  38. package/dist/client/managers/AuthenticationManager.js +269 -71
  39. package/dist/client/managers/AuthenticationManager.js.map +1 -1
  40. package/dist/client/managers/BaseManager.d.ts +3 -3
  41. package/dist/client/managers/BaseManager.d.ts.map +1 -1
  42. package/dist/client/managers/BaseManager.js +11 -5
  43. package/dist/client/managers/BaseManager.js.map +1 -1
  44. package/dist/client/managers/RequestManager.d.ts +2 -2
  45. package/dist/client/managers/RequestManager.d.ts.map +1 -1
  46. package/dist/client/managers/RequestManager.js +25 -12
  47. package/dist/client/managers/RequestManager.js.map +1 -1
  48. package/dist/config/Config.d.ts +155 -0
  49. package/dist/config/Config.d.ts.map +1 -0
  50. package/dist/config/Config.js +215 -0
  51. package/dist/config/Config.js.map +1 -0
  52. package/dist/config/ConfigurationSchema.d.ts +21 -21
  53. package/dist/config/ConfigurationSchema.d.ts.map +1 -1
  54. package/dist/config/ConfigurationSchema.js +19 -2
  55. package/dist/config/ConfigurationSchema.js.map +1 -1
  56. package/dist/config/ServerConfiguration.d.ts +2 -1
  57. package/dist/config/ServerConfiguration.d.ts.map +1 -1
  58. package/dist/config/ServerConfiguration.js +50 -41
  59. package/dist/config/ServerConfiguration.js.map +1 -1
  60. package/dist/docs/DocumentationGenerator.d.ts +9 -8
  61. package/dist/docs/DocumentationGenerator.d.ts.map +1 -1
  62. package/dist/docs/DocumentationGenerator.js +10 -7
  63. package/dist/docs/DocumentationGenerator.js.map +1 -1
  64. package/dist/docs/MarkdownFormatter.d.ts.map +1 -1
  65. package/dist/docs/MarkdownFormatter.js +3 -2
  66. package/dist/docs/MarkdownFormatter.js.map +1 -1
  67. package/dist/dxt-entry.cjs +81 -0
  68. package/dist/dxt-entry.js +15 -14
  69. package/dist/dxt-entry.js.map +1 -1
  70. package/dist/index.d.ts +3 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +37 -21
  73. package/dist/index.js.map +1 -1
  74. package/dist/performance/MetricsCollector.d.ts +13 -7
  75. package/dist/performance/MetricsCollector.d.ts.map +1 -1
  76. package/dist/performance/MetricsCollector.js +69 -27
  77. package/dist/performance/MetricsCollector.js.map +1 -1
  78. package/dist/performance/PerformanceAnalytics.d.ts +8 -2
  79. package/dist/performance/PerformanceAnalytics.d.ts.map +1 -1
  80. package/dist/performance/PerformanceAnalytics.js +17 -47
  81. package/dist/performance/PerformanceAnalytics.js.map +1 -1
  82. package/dist/performance/PerformanceMonitor.d.ts +2 -1
  83. package/dist/performance/PerformanceMonitor.d.ts.map +1 -1
  84. package/dist/performance/PerformanceMonitor.js +12 -13
  85. package/dist/performance/PerformanceMonitor.js.map +1 -1
  86. package/dist/performance/index.d.ts +2 -2
  87. package/dist/performance/index.d.ts.map +1 -1
  88. package/dist/security/AISecurityScanner.d.ts +1 -0
  89. package/dist/security/AISecurityScanner.d.ts.map +1 -1
  90. package/dist/security/AISecurityScanner.js +22 -12
  91. package/dist/security/AISecurityScanner.js.map +1 -1
  92. package/dist/security/AutomatedRemediation.d.ts +4 -3
  93. package/dist/security/AutomatedRemediation.d.ts.map +1 -1
  94. package/dist/security/AutomatedRemediation.js +46 -15
  95. package/dist/security/AutomatedRemediation.js.map +1 -1
  96. package/dist/security/InputValidator.d.ts +13 -9
  97. package/dist/security/InputValidator.d.ts.map +1 -1
  98. package/dist/security/InputValidator.js +4 -2
  99. package/dist/security/InputValidator.js.map +1 -1
  100. package/dist/security/SecurityCIPipeline.d.ts +1 -1
  101. package/dist/security/SecurityCIPipeline.d.ts.map +1 -1
  102. package/dist/security/SecurityCIPipeline.js +38 -29
  103. package/dist/security/SecurityCIPipeline.js.map +1 -1
  104. package/dist/security/SecurityConfig.d.ts +3 -3
  105. package/dist/security/SecurityConfig.d.ts.map +1 -1
  106. package/dist/security/SecurityConfig.js +13 -9
  107. package/dist/security/SecurityConfig.js.map +1 -1
  108. package/dist/security/SecurityConfigManager.d.ts +2 -2
  109. package/dist/security/SecurityConfigManager.d.ts.map +1 -1
  110. package/dist/security/SecurityConfigManager.js +20 -15
  111. package/dist/security/SecurityConfigManager.js.map +1 -1
  112. package/dist/security/SecurityMonitoring.d.ts +2 -2
  113. package/dist/security/SecurityMonitoring.d.ts.map +1 -1
  114. package/dist/security/SecurityMonitoring.js +19 -17
  115. package/dist/security/SecurityMonitoring.js.map +1 -1
  116. package/dist/security/SecurityReviewer.d.ts.map +1 -1
  117. package/dist/security/SecurityReviewer.js +10 -7
  118. package/dist/security/SecurityReviewer.js.map +1 -1
  119. package/dist/security/index.d.ts +24 -23
  120. package/dist/security/index.d.ts.map +1 -1
  121. package/dist/security/index.js +52 -23
  122. package/dist/security/index.js.map +1 -1
  123. package/dist/server/ConnectionTester.d.ts +12 -4
  124. package/dist/server/ConnectionTester.d.ts.map +1 -1
  125. package/dist/server/ConnectionTester.js +96 -22
  126. package/dist/server/ConnectionTester.js.map +1 -1
  127. package/dist/server/ToolRegistry.d.ts +2 -2
  128. package/dist/server/ToolRegistry.d.ts.map +1 -1
  129. package/dist/server/ToolRegistry.js +10 -5
  130. package/dist/server/ToolRegistry.js.map +1 -1
  131. package/dist/tools/BaseToolManager.d.ts +47 -11
  132. package/dist/tools/BaseToolManager.d.ts.map +1 -1
  133. package/dist/tools/BaseToolManager.js +168 -29
  134. package/dist/tools/BaseToolManager.js.map +1 -1
  135. package/dist/tools/auth.d.ts +16 -10
  136. package/dist/tools/auth.d.ts.map +1 -1
  137. package/dist/tools/auth.js +3 -2
  138. package/dist/tools/auth.js.map +1 -1
  139. package/dist/tools/cache.d.ts +30 -30
  140. package/dist/tools/cache.d.ts.map +1 -1
  141. package/dist/tools/cache.js +1 -6
  142. package/dist/tools/cache.js.map +1 -1
  143. package/dist/tools/comments.d.ts +20 -20
  144. package/dist/tools/comments.d.ts.map +1 -1
  145. package/dist/tools/comments.js +16 -9
  146. package/dist/tools/comments.js.map +1 -1
  147. package/dist/tools/media.d.ts +18 -16
  148. package/dist/tools/media.d.ts.map +1 -1
  149. package/dist/tools/media.js +16 -15
  150. package/dist/tools/media.js.map +1 -1
  151. package/dist/tools/pages.d.ts +19 -17
  152. package/dist/tools/pages.d.ts.map +1 -1
  153. package/dist/tools/pages.js +16 -12
  154. package/dist/tools/pages.js.map +1 -1
  155. package/dist/tools/performance.d.ts +11 -1
  156. package/dist/tools/performance.d.ts.map +1 -1
  157. package/dist/tools/performance.js +67 -34
  158. package/dist/tools/performance.js.map +1 -1
  159. package/dist/tools/posts/PostHandlers.d.ts +46 -0
  160. package/dist/tools/posts/PostHandlers.d.ts.map +1 -0
  161. package/dist/tools/posts/PostHandlers.js +400 -0
  162. package/dist/tools/posts/PostHandlers.js.map +1 -0
  163. package/dist/tools/posts/PostToolDefinitions.d.ts +37 -0
  164. package/dist/tools/posts/PostToolDefinitions.d.ts.map +1 -0
  165. package/dist/tools/posts/PostToolDefinitions.js +236 -0
  166. package/dist/tools/posts/PostToolDefinitions.js.map +1 -0
  167. package/dist/tools/posts/index.d.ts +138 -0
  168. package/dist/tools/posts/index.d.ts.map +1 -0
  169. package/dist/tools/posts/index.js +163 -0
  170. package/dist/tools/posts/index.js.map +1 -0
  171. package/dist/tools/posts.d.ts +10 -246
  172. package/dist/tools/posts.d.ts.map +1 -1
  173. package/dist/tools/posts.js +11 -723
  174. package/dist/tools/posts.js.map +1 -1
  175. package/dist/tools/site.d.ts +19 -18
  176. package/dist/tools/site.d.ts.map +1 -1
  177. package/dist/tools/site.js +14 -10
  178. package/dist/tools/site.js.map +1 -1
  179. package/dist/tools/taxonomies.d.ts +23 -24
  180. package/dist/tools/taxonomies.d.ts.map +1 -1
  181. package/dist/tools/taxonomies.js +24 -18
  182. package/dist/tools/taxonomies.js.map +1 -1
  183. package/dist/tools/users.d.ts +20 -15
  184. package/dist/tools/users.d.ts.map +1 -1
  185. package/dist/tools/users.js +12 -8
  186. package/dist/tools/users.js.map +1 -1
  187. package/dist/types/client.d.ts +48 -41
  188. package/dist/types/client.d.ts.map +1 -1
  189. package/dist/types/client.js +30 -5
  190. package/dist/types/client.js.map +1 -1
  191. package/dist/types/enhanced.d.ts +237 -0
  192. package/dist/types/enhanced.d.ts.map +1 -0
  193. package/dist/types/enhanced.js +49 -0
  194. package/dist/types/enhanced.js.map +1 -0
  195. package/dist/types/index.d.ts +15 -12
  196. package/dist/types/index.d.ts.map +1 -1
  197. package/dist/types/index.js +2 -0
  198. package/dist/types/index.js.map +1 -1
  199. package/dist/types/mcp.d.ts +12 -12
  200. package/dist/types/mcp.d.ts.map +1 -1
  201. package/dist/types/requests.d.ts +322 -0
  202. package/dist/types/requests.d.ts.map +1 -0
  203. package/dist/types/requests.js +8 -0
  204. package/dist/types/requests.js.map +1 -0
  205. package/dist/types/tools.d.ts +506 -0
  206. package/dist/types/tools.d.ts.map +1 -0
  207. package/dist/types/tools.js +8 -0
  208. package/dist/types/tools.js.map +1 -0
  209. package/dist/types/wordpress.d.ts +43 -15
  210. package/dist/types/wordpress.d.ts.map +1 -1
  211. package/dist/types/wordpress.js +8 -1
  212. package/dist/types/wordpress.js.map +1 -1
  213. package/dist/utils/debug.d.ts +19 -11
  214. package/dist/utils/debug.d.ts.map +1 -1
  215. package/dist/utils/debug.js +46 -10
  216. package/dist/utils/debug.js.map +1 -1
  217. package/dist/utils/enhancedError.d.ts +8 -8
  218. package/dist/utils/enhancedError.d.ts.map +1 -1
  219. package/dist/utils/enhancedError.js.map +1 -1
  220. package/dist/utils/error.d.ts +2 -4
  221. package/dist/utils/error.d.ts.map +1 -1
  222. package/dist/utils/error.js +42 -5
  223. package/dist/utils/error.js.map +1 -1
  224. package/dist/utils/logger.d.ts +106 -0
  225. package/dist/utils/logger.d.ts.map +1 -0
  226. package/dist/utils/logger.js +280 -0
  227. package/dist/utils/logger.js.map +1 -0
  228. package/dist/utils/streaming.d.ts +9 -9
  229. package/dist/utils/streaming.d.ts.map +1 -1
  230. package/dist/utils/streaming.js +71 -52
  231. package/dist/utils/streaming.js.map +1 -1
  232. package/dist/utils/toolWrapper.d.ts +9 -7
  233. package/dist/utils/toolWrapper.d.ts.map +1 -1
  234. package/dist/utils/toolWrapper.js.map +1 -1
  235. package/dist/utils/validation/core.d.ts +21 -0
  236. package/dist/utils/validation/core.d.ts.map +1 -0
  237. package/dist/utils/validation/core.js +71 -0
  238. package/dist/utils/validation/core.js.map +1 -0
  239. package/dist/utils/validation/index.d.ts +25 -0
  240. package/dist/utils/validation/index.d.ts.map +1 -0
  241. package/dist/utils/validation/index.js +29 -0
  242. package/dist/utils/validation/index.js.map +1 -0
  243. package/dist/utils/validation/network.d.ts +19 -0
  244. package/dist/utils/validation/network.d.ts.map +1 -0
  245. package/dist/utils/validation/network.js +93 -0
  246. package/dist/utils/validation/network.js.map +1 -0
  247. package/dist/utils/validation/rateLimit.d.ts +21 -0
  248. package/dist/utils/validation/rateLimit.d.ts.map +1 -0
  249. package/dist/utils/validation/rateLimit.js +43 -0
  250. package/dist/utils/validation/rateLimit.js.map +1 -0
  251. package/dist/utils/validation/security.d.ts +29 -0
  252. package/dist/utils/validation/security.d.ts.map +1 -0
  253. package/dist/utils/validation/security.js +327 -0
  254. package/dist/utils/validation/security.js.map +1 -0
  255. package/dist/utils/validation/wordpress.d.ts +31 -0
  256. package/dist/utils/validation/wordpress.d.ts.map +1 -0
  257. package/dist/utils/validation/wordpress.js +146 -0
  258. package/dist/utils/validation/wordpress.js.map +1 -0
  259. package/dist/utils/validation.d.ts +13 -82
  260. package/dist/utils/validation.d.ts.map +1 -1
  261. package/dist/utils/validation.js +25 -343
  262. package/dist/utils/validation.js.map +1 -1
  263. package/docs/BADGE_UPDATES.md +132 -0
  264. package/docs/BRANCH_PROTECTION.md +0 -0
  265. package/docs/CI_CD_IMPROVEMENTS.md +191 -0
  266. package/docs/INCREMENTAL_COVERAGE.md +183 -0
  267. package/docs/api/README.md +3 -1
  268. package/docs/api/openapi.json +5 -1
  269. package/docs/api/summary.json +1 -1
  270. package/docs/api/tools/wp_create_post.md +12 -14
  271. package/docs/examples/claude-desktop-config.md +1 -1
  272. package/docs/examples/docker-production.md +100 -93
  273. package/docs/examples/multi-site-setup.md +5 -4
  274. package/docs/examples/single-site-setup.md +3 -4
  275. package/docs/examples/use-case-workflows.md +4 -5
  276. package/docs/integrations/claude-desktop.md +31 -31
  277. package/docs/integrations/cline.md +4 -4
  278. package/docs/integrations/vs-code.md +9 -8
  279. package/docs/user-guides/SMITHERY_SETUP.md +10 -10
  280. package/docs/v2.2.0-resolution-demo.md +119 -0
  281. package/package.json +44 -25
  282. package/src/cache/CacheInvalidation.ts +12 -5
  283. package/src/cache/CacheManager.ts +18 -15
  284. package/src/cache/HttpCacheWrapper.ts +30 -59
  285. package/src/cache/__tests__/HttpCacheWrapper.test.ts +6 -5
  286. package/src/cache/index.ts +3 -14
  287. package/src/client/CachedWordPressClient.ts +32 -30
  288. package/src/client/MockWordPressClient.ts +4 -2
  289. package/src/client/api.ts +186 -64
  290. package/src/client/auth.ts +15 -40
  291. package/src/client/managers/AuthenticationManager.ts +337 -77
  292. package/src/client/managers/BaseManager.ts +18 -30
  293. package/src/client/managers/RequestManager.ts +39 -44
  294. package/src/config/Config.ts +308 -0
  295. package/src/config/ConfigurationSchema.ts +23 -2
  296. package/src/config/ServerConfiguration.ts +51 -47
  297. package/src/docs/DocumentationGenerator.ts +50 -39
  298. package/src/docs/MarkdownFormatter.ts +19 -29
  299. package/src/dxt-entry.cjs +26 -16
  300. package/src/dxt-entry.ts +17 -27
  301. package/src/index.ts +42 -28
  302. package/src/performance/MetricsCollector.ts +108 -86
  303. package/src/performance/PerformanceAnalytics.ts +69 -164
  304. package/src/performance/PerformanceMonitor.ts +32 -47
  305. package/src/performance/index.ts +2 -10
  306. package/src/security/AISecurityScanner.ts +22 -12
  307. package/src/security/AutomatedRemediation.ts +49 -18
  308. package/src/security/InputValidator.ts +9 -6
  309. package/src/security/SecurityCIPipeline.ts +53 -37
  310. package/src/security/SecurityConfig.ts +22 -22
  311. package/src/security/SecurityConfigManager.ts +23 -19
  312. package/src/security/SecurityMonitoring.ts +24 -21
  313. package/src/security/SecurityReviewer.ts +10 -7
  314. package/src/security/index.ts +64 -29
  315. package/src/server/ConnectionTester.ts +120 -31
  316. package/src/server/ToolRegistry.ts +31 -21
  317. package/src/tools/BaseToolManager.ts +286 -33
  318. package/src/tools/auth.ts +20 -8
  319. package/src/tools/cache.ts +5 -15
  320. package/src/tools/comments.ts +34 -48
  321. package/src/tools/media.ts +41 -53
  322. package/src/tools/pages.ts +32 -54
  323. package/src/tools/performance.ts +141 -176
  324. package/src/tools/posts/PostHandlers.ts +474 -0
  325. package/src/tools/posts/PostToolDefinitions.ts +250 -0
  326. package/src/tools/posts/index.ts +192 -0
  327. package/src/tools/posts.ts +24 -780
  328. package/src/tools/site.ts +34 -19
  329. package/src/tools/taxonomies.ts +41 -57
  330. package/src/tools/users.ts +28 -16
  331. package/src/types/client.ts +114 -138
  332. package/src/types/enhanced.ts +318 -0
  333. package/src/types/index.ts +51 -30
  334. package/src/types/mcp.ts +20 -42
  335. package/src/types/requests.ts +378 -0
  336. package/src/types/tools.ts +608 -0
  337. package/src/types/wordpress.ts +56 -34
  338. package/src/utils/debug.ts +77 -59
  339. package/src/utils/enhancedError.ts +8 -8
  340. package/src/utils/error.ts +53 -31
  341. package/src/utils/logger.ts +351 -0
  342. package/src/utils/streaming.ts +86 -68
  343. package/src/utils/toolWrapper.ts +10 -12
  344. package/src/utils/validation/core.ts +108 -0
  345. package/src/utils/validation/index.ts +36 -0
  346. package/src/utils/validation/network.ts +132 -0
  347. package/src/utils/validation/rateLimit.ts +54 -0
  348. package/src/utils/validation/security.ts +361 -0
  349. package/src/utils/validation/wordpress.ts +180 -0
  350. package/src/utils/validation.ts +47 -470
@@ -3,12 +3,11 @@
3
3
  * Integrates with existing client and cache systems
4
4
  */
5
5
 
6
- import {
7
- PerformanceMonitor,
8
- PerformanceMetrics,
9
- } from "./PerformanceMonitor.js";
6
+ import { PerformanceMonitor, PerformanceMetrics } from "./PerformanceMonitor.js";
10
7
  import type { CacheStats } from "../cache/CacheManager.js";
11
8
  import type { ClientStats } from "../types/client.js";
9
+ import { ConfigHelpers } from "../config/Config.js";
10
+ import { LoggerFactory } from "../utils/logger.js";
12
11
 
13
12
  export interface CollectorConfig {
14
13
  enableRealTime: boolean;
@@ -30,7 +29,7 @@ export interface RequestMetadata {
30
29
 
31
30
  export interface ToolExecutionContext {
32
31
  toolName: string;
33
- parameters: any;
32
+ parameters: Record<string, unknown>;
34
33
  startTime: number;
35
34
  siteId: string | undefined;
36
35
  }
@@ -43,13 +42,12 @@ export class MetricsCollector {
43
42
  private config: CollectorConfig;
44
43
  private activeRequests: Map<string, RequestMetadata> = new Map();
45
44
  private activeTools: Map<string, ToolExecutionContext> = new Map();
46
- private clientInstances: Map<string, any> = new Map();
47
- private cacheManagers: Map<string, any> = new Map();
45
+ private clientInstances: Map<string, unknown> = new Map();
46
+ private cacheManagers: Map<string, unknown> = new Map();
47
+ private logger = LoggerFactory.performance();
48
+ private realTimeInterval?: NodeJS.Timeout | undefined;
48
49
 
49
- constructor(
50
- monitor: PerformanceMonitor,
51
- config: Partial<CollectorConfig> = {},
52
- ) {
50
+ constructor(monitor: PerformanceMonitor, config: Partial<CollectorConfig> = {}) {
53
51
  this.monitor = monitor;
54
52
  this.config = {
55
53
  enableRealTime: true,
@@ -61,37 +59,36 @@ export class MetricsCollector {
61
59
  ...config,
62
60
  };
63
61
 
64
- if (this.config.enableRealTime) {
62
+ // Only enable real-time collection in appropriate environments
63
+ if (this.config.enableRealTime && (ConfigHelpers.isDev() || ConfigHelpers.isProd())) {
65
64
  this.startRealTimeCollection();
65
+ } else if (ConfigHelpers.isTest() || ConfigHelpers.isCI()) {
66
+ this.logger.debug("Skipping real-time metrics collection in test/CI environment");
66
67
  }
67
68
  }
68
69
 
69
70
  /**
70
71
  * Register a WordPress client for monitoring
71
72
  */
72
- registerClient(siteId: string, client: any): void {
73
+ registerClient(siteId: string, client: unknown): void {
73
74
  this.clientInstances.set(siteId, client);
74
75
 
75
76
  if (this.config.enableRequestInterception) {
76
- this.interceptClientRequests(siteId, client);
77
+ this.interceptClientRequests(siteId, client as Record<string, unknown>);
77
78
  }
78
79
  }
79
80
 
80
81
  /**
81
82
  * Register a cache manager for monitoring
82
83
  */
83
- registerCacheManager(siteId: string, cacheManager: any): void {
84
+ registerCacheManager(siteId: string, cacheManager: unknown): void {
84
85
  this.cacheManagers.set(siteId, cacheManager);
85
86
  }
86
87
 
87
88
  /**
88
89
  * Start tracking a tool execution
89
90
  */
90
- startToolExecution(
91
- toolName: string,
92
- parameters: any,
93
- siteId?: string,
94
- ): string {
91
+ startToolExecution(toolName: string, parameters: Record<string, unknown>, siteId?: string): string {
95
92
  const executionId = `${toolName}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
96
93
 
97
94
  this.activeTools.set(executionId, {
@@ -122,12 +119,7 @@ export class MetricsCollector {
122
119
  /**
123
120
  * Record a raw request (bypass tool tracking)
124
121
  */
125
- recordRawRequest(
126
- responseTime: number,
127
- success: boolean,
128
- endpoint: string,
129
- fromCache: boolean = false,
130
- ): void {
122
+ recordRawRequest(responseTime: number, success: boolean, endpoint: string, fromCache: boolean = false): void {
131
123
  this.monitor.recordRequest(responseTime, success);
132
124
  }
133
125
 
@@ -158,8 +150,9 @@ export class MetricsCollector {
158
150
  };
159
151
 
160
152
  for (const [_siteId, cacheManager] of this.cacheManagers) {
161
- if (cacheManager && typeof cacheManager.getStats === "function") {
162
- const stats = cacheManager.getStats();
153
+ const manager = cacheManager as { getStats?: () => CacheStats };
154
+ if (manager && typeof manager.getStats === "function") {
155
+ const stats = manager.getStats();
163
156
  aggregated.hits += stats.hits || 0;
164
157
  aggregated.misses += stats.misses || 0;
165
158
  aggregated.evictions += stats.evictions || 0;
@@ -190,8 +183,9 @@ export class MetricsCollector {
190
183
  const responseTimes: number[] = [];
191
184
 
192
185
  for (const [_siteId, client] of this.clientInstances) {
193
- if (client && typeof client.getStats === "function") {
194
- const stats = client.getStats();
186
+ const clientObj = client as { getStats?: () => ClientStats };
187
+ if (clientObj && typeof clientObj.getStats === "function") {
188
+ const stats = clientObj.getStats();
195
189
  aggregated.totalRequests += stats.totalRequests || 0;
196
190
  aggregated.successfulRequests += stats.successfulRequests || 0;
197
191
  aggregated.failedRequests += stats.failedRequests || 0;
@@ -206,9 +200,7 @@ export class MetricsCollector {
206
200
 
207
201
  // Calculate overall average response time
208
202
  if (responseTimes.length > 0) {
209
- aggregated.averageResponseTime =
210
- responseTimes.reduce((sum, time) => sum + time, 0) /
211
- responseTimes.length;
203
+ aggregated.averageResponseTime = responseTimes.reduce((sum, time) => sum + time, 0) / responseTimes.length;
212
204
  }
213
205
 
214
206
  return aggregated;
@@ -222,21 +214,23 @@ export class MetricsCollector {
222
214
  client?: ClientStats;
223
215
  isActive: boolean;
224
216
  } {
225
- const result: any = { isActive: false };
217
+ const result: Record<string, unknown> = { isActive: false };
226
218
 
227
219
  const cacheManager = this.cacheManagers.get(siteId);
228
- if (cacheManager && typeof cacheManager.getStats === "function") {
229
- result.cache = cacheManager.getStats();
220
+ const cacheObj = cacheManager as { getStats?: () => CacheStats } | undefined;
221
+ if (cacheObj && typeof cacheObj.getStats === "function") {
222
+ result.cache = cacheObj.getStats();
230
223
  result.isActive = true;
231
224
  }
232
225
 
233
226
  const client = this.clientInstances.get(siteId);
234
- if (client && typeof client.getStats === "function") {
235
- result.client = client.getStats();
227
+ const clientObj = client as { getStats?: () => ClientStats } | undefined;
228
+ if (clientObj && typeof clientObj.getStats === "function") {
229
+ result.client = clientObj.getStats();
236
230
  result.isActive = true;
237
231
  }
238
232
 
239
- return result;
233
+ return result as { cache?: CacheStats; client?: ClientStats; isActive: boolean };
240
234
  }
241
235
 
242
236
  /**
@@ -258,7 +252,13 @@ export class MetricsCollector {
258
252
  worstPerforming: string;
259
253
  } {
260
254
  const sites = Array.from(this.clientInstances.keys());
261
- const comparison: any = {};
255
+ const comparison: Record<string, {
256
+ responseTime: number;
257
+ cacheHitRate: number;
258
+ errorRate: number;
259
+ requestCount: number;
260
+ ranking: number;
261
+ }> = {};
262
262
  const rankings: Array<{ site: string; score: number }> = [];
263
263
 
264
264
  for (const siteId of sites) {
@@ -266,18 +266,11 @@ export class MetricsCollector {
266
266
 
267
267
  const responseTime = metrics.client?.averageResponseTime || 0;
268
268
  const cacheHitRate = metrics.cache?.hitRate || 0;
269
- const errorRate = metrics.client
270
- ? metrics.client.failedRequests /
271
- Math.max(metrics.client.totalRequests, 1)
272
- : 0;
269
+ const errorRate = metrics.client ? metrics.client.failedRequests / Math.max(metrics.client.totalRequests, 1) : 0;
273
270
  const requestCount = metrics.client?.totalRequests || 0;
274
271
 
275
272
  // Calculate performance score (lower is better for response time and error rate)
276
- const score =
277
- responseTime / 1000 +
278
- errorRate * 100 -
279
- cacheHitRate * 50 +
280
- requestCount * 0.001;
273
+ const score = responseTime / 1000 + errorRate * 100 - cacheHitRate * 50 + requestCount * 0.001;
281
274
 
282
275
  comparison[siteId] = {
283
276
  responseTime,
@@ -295,7 +288,10 @@ export class MetricsCollector {
295
288
 
296
289
  // Assign rankings
297
290
  rankings.forEach((item, index) => {
298
- comparison[item.site].ranking = index + 1;
291
+ const siteData = comparison[item.site];
292
+ if (siteData) {
293
+ siteData.ranking = index + 1;
294
+ }
299
295
  });
300
296
 
301
297
  return {
@@ -321,49 +317,34 @@ export class MetricsCollector {
321
317
 
322
318
  // Critical issues
323
319
  if (metrics.requests.averageResponseTime > 5000) {
324
- critical.push(
325
- "Response times are critically high (>5s). Enable caching immediately.",
326
- );
320
+ critical.push("Response times are critically high (>5s). Enable caching immediately.");
327
321
  }
328
322
 
329
- const errorRate =
330
- metrics.requests.failed / Math.max(metrics.requests.total, 1);
323
+ const errorRate = metrics.requests.failed / Math.max(metrics.requests.total, 1);
331
324
  if (errorRate > 0.1) {
332
- critical.push(
333
- "Error rate is critically high (>10%). Check WordPress connectivity.",
334
- );
325
+ critical.push("Error rate is critically high (>10%). Check WordPress connectivity.");
335
326
  }
336
327
 
337
328
  // Recommended optimizations
338
329
  if (metrics.cache.hitRate < 0.8) {
339
- recommended.push(
340
- "Cache hit rate is below 80%. Consider cache warming or TTL adjustment.",
341
- );
330
+ recommended.push("Cache hit rate is below 80%. Consider cache warming or TTL adjustment.");
342
331
  }
343
332
 
344
333
  if (metrics.requests.averageResponseTime > 2000) {
345
- recommended.push(
346
- "Response times could be improved. Consider enabling more aggressive caching.",
347
- );
334
+ recommended.push("Response times could be improved. Consider enabling more aggressive caching.");
348
335
  }
349
336
 
350
337
  if (metrics.system.memoryUsage > 80) {
351
- recommended.push(
352
- "Memory usage is high. Consider increasing cache size limits or server resources.",
353
- );
338
+ recommended.push("Memory usage is high. Consider increasing cache size limits or server resources.");
354
339
  }
355
340
 
356
341
  // Optional optimizations
357
342
  if (metrics.cache.totalSize < 100) {
358
- optional.push(
359
- "Cache utilization is low. Consider pre-warming with frequently accessed data.",
360
- );
343
+ optional.push("Cache utilization is low. Consider pre-warming with frequently accessed data.");
361
344
  }
362
345
 
363
346
  if (Object.keys(metrics.tools.toolUsageCount).length > 10) {
364
- optional.push(
365
- "Many tools are being used. Consider creating custom workflows for common operations.",
366
- );
347
+ optional.push("Many tools are being used. Consider creating custom workflows for common operations.");
367
348
  }
368
349
 
369
350
  return { critical, recommended, optional };
@@ -375,13 +356,13 @@ export class MetricsCollector {
375
356
  exportDetailedReport(): {
376
357
  timestamp: string;
377
358
  overview: PerformanceMetrics;
378
- siteComparison: any;
359
+ siteComparison: Record<string, unknown>;
379
360
  aggregatedStats: {
380
361
  cache: CacheStats;
381
362
  client: ClientStats;
382
363
  };
383
- optimizations: any;
384
- alerts: any[];
364
+ optimizations: Record<string, unknown>;
365
+ alerts: unknown[];
385
366
  } {
386
367
  return {
387
368
  timestamp: new Date().toISOString(),
@@ -400,10 +381,43 @@ export class MetricsCollector {
400
381
  * Start real-time metric collection
401
382
  */
402
383
  private startRealTimeCollection(): void {
403
- setInterval(() => {
404
- this.updateCacheMetrics();
405
- this.updateClientMetrics();
406
- }, this.config.collectInterval);
384
+ // Skip in test/CI environments to prevent performance issues
385
+ if (ConfigHelpers.isTest() || ConfigHelpers.isCI()) {
386
+ return;
387
+ }
388
+
389
+ // Adjust collection frequency based on environment
390
+ const interval = ConfigHelpers.isDev()
391
+ ? Math.max(this.config.collectInterval * 2, 60000) // Longer intervals in dev
392
+ : this.config.collectInterval;
393
+
394
+ this.logger.info("Starting real-time metrics collection", {
395
+ interval: `${interval / 1000}s`,
396
+ environment: ConfigHelpers.get().get().app.nodeEnv,
397
+ });
398
+
399
+ this.realTimeInterval = setInterval(() => {
400
+ try {
401
+ this.updateCacheMetrics();
402
+ this.updateClientMetrics();
403
+ this.logger.debug("Real-time metrics updated");
404
+ } catch (error) {
405
+ this.logger.error("Failed to update real-time metrics", {
406
+ error: error instanceof Error ? error.message : String(error),
407
+ });
408
+ }
409
+ }, interval);
410
+ }
411
+
412
+ /**
413
+ * Stop real-time collection and cleanup resources
414
+ */
415
+ public destroy(): void {
416
+ if (this.realTimeInterval) {
417
+ clearInterval(this.realTimeInterval);
418
+ this.realTimeInterval = undefined;
419
+ this.logger.info("Real-time metrics collection stopped");
420
+ }
407
421
  }
408
422
 
409
423
  /**
@@ -411,7 +425,8 @@ export class MetricsCollector {
411
425
  */
412
426
  private updateCacheMetrics(): void {
413
427
  const aggregatedStats = this.getAggregatedCacheStats();
414
- this.monitor.updateCacheMetrics(aggregatedStats);
428
+ // Type assertion: convert CacheStats to Record<string, unknown> via unknown
429
+ this.monitor.updateCacheMetrics(aggregatedStats as unknown as Record<string, unknown>);
415
430
  }
416
431
 
417
432
  /**
@@ -425,22 +440,29 @@ export class MetricsCollector {
425
440
  /**
426
441
  * Intercept client requests for automatic tracking
427
442
  */
428
- private interceptClientRequests(siteId: string, client: any): void {
443
+ private interceptClientRequests(siteId: string, client: Record<string, unknown>): void {
429
444
  if (!client.request || typeof client.request !== "function") {
430
445
  return;
431
446
  }
432
447
 
433
448
  const originalRequest = client.request.bind(client);
434
449
 
435
- client.request = async (...args: any[]) => {
450
+ const clientObj = client as {
451
+ request?: (...args: unknown[]) => Promise<unknown>;
452
+ originalRequest?: (...args: unknown[]) => Promise<unknown>;
453
+ };
454
+ if (!clientObj.request) return;
455
+
456
+ clientObj.originalRequest = clientObj.request;
457
+ clientObj.request = async (...args: unknown[]) => {
436
458
  const startTime = Date.now();
437
459
  const requestId = `${siteId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
438
460
 
439
- // Extract metadata
461
+ // Extract metadata with proper type assertions
440
462
  const metadata: RequestMetadata = {
441
463
  siteId,
442
- endpoint: args[0] || "unknown",
443
- method: args[1] || "GET",
464
+ endpoint: (args[0] as string) || "unknown",
465
+ method: (args[1] as string) || "GET",
444
466
  startTime,
445
467
  fromCache: false,
446
468
  };