mcp-wordpress 1.1.7 → 1.2.2

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 (255) hide show
  1. package/README.md +388 -66
  2. package/dist/cache/CacheInvalidation.d.ts +118 -0
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -0
  4. package/dist/cache/CacheInvalidation.js +349 -0
  5. package/dist/cache/CacheInvalidation.js.map +1 -0
  6. package/dist/cache/CacheManager.d.ts +143 -0
  7. package/dist/cache/CacheManager.d.ts.map +1 -0
  8. package/dist/cache/CacheManager.js +308 -0
  9. package/dist/cache/CacheManager.js.map +1 -0
  10. package/dist/cache/HttpCacheWrapper.d.ts +121 -0
  11. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -0
  12. package/dist/cache/HttpCacheWrapper.js +280 -0
  13. package/dist/cache/HttpCacheWrapper.js.map +1 -0
  14. package/dist/cache/__tests__/CacheInvalidation.test.d.ts +5 -0
  15. package/dist/cache/__tests__/CacheInvalidation.test.d.ts.map +1 -0
  16. package/dist/cache/__tests__/CacheInvalidation.test.js +236 -0
  17. package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -0
  18. package/dist/cache/__tests__/CacheManager.test.d.ts +5 -0
  19. package/dist/cache/__tests__/CacheManager.test.d.ts.map +1 -0
  20. package/dist/cache/__tests__/CacheManager.test.js +233 -0
  21. package/dist/cache/__tests__/CacheManager.test.js.map +1 -0
  22. package/dist/cache/__tests__/CachedWordPressClient.test.d.ts +5 -0
  23. package/dist/cache/__tests__/CachedWordPressClient.test.d.ts.map +1 -0
  24. package/dist/cache/__tests__/CachedWordPressClient.test.js +228 -0
  25. package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -0
  26. package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts +5 -0
  27. package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts.map +1 -0
  28. package/dist/cache/__tests__/HttpCacheWrapper.test.js +296 -0
  29. package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -0
  30. package/dist/cache/index.d.ts +12 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +9 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/client/CachedWordPressClient.d.ts +160 -0
  35. package/dist/client/CachedWordPressClient.d.ts.map +1 -0
  36. package/dist/client/CachedWordPressClient.js +338 -0
  37. package/dist/client/CachedWordPressClient.js.map +1 -0
  38. package/dist/client/WordPressClient.d.ts +81 -0
  39. package/dist/client/WordPressClient.d.ts.map +1 -0
  40. package/dist/client/WordPressClient.js +354 -0
  41. package/dist/client/WordPressClient.js.map +1 -0
  42. package/dist/config/ConfigurationSchema.d.ts +281 -0
  43. package/dist/config/ConfigurationSchema.d.ts.map +1 -0
  44. package/dist/config/ConfigurationSchema.js +205 -0
  45. package/dist/config/ConfigurationSchema.js.map +1 -0
  46. package/dist/config/ServerConfiguration.d.ts +38 -0
  47. package/dist/config/ServerConfiguration.d.ts.map +1 -0
  48. package/dist/config/ServerConfiguration.js +158 -0
  49. package/dist/config/ServerConfiguration.js.map +1 -0
  50. package/dist/docs/DocumentationGenerator.d.ts +184 -0
  51. package/dist/docs/DocumentationGenerator.d.ts.map +1 -0
  52. package/dist/docs/DocumentationGenerator.js +735 -0
  53. package/dist/docs/DocumentationGenerator.js.map +1 -0
  54. package/dist/docs/MarkdownFormatter.d.ts +84 -0
  55. package/dist/docs/MarkdownFormatter.d.ts.map +1 -0
  56. package/dist/docs/MarkdownFormatter.js +448 -0
  57. package/dist/docs/MarkdownFormatter.js.map +1 -0
  58. package/dist/docs/index.d.ts +8 -0
  59. package/dist/docs/index.d.ts.map +1 -0
  60. package/dist/docs/index.js +7 -0
  61. package/dist/docs/index.js.map +1 -0
  62. package/dist/index.d.ts +1 -4
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +12 -212
  65. package/dist/index.js.map +1 -1
  66. package/dist/performance/AnomalyDetector.d.ts +63 -0
  67. package/dist/performance/AnomalyDetector.d.ts.map +1 -0
  68. package/dist/performance/AnomalyDetector.js +222 -0
  69. package/dist/performance/AnomalyDetector.js.map +1 -0
  70. package/dist/performance/BenchmarkAnalyzer.d.ts +67 -0
  71. package/dist/performance/BenchmarkAnalyzer.d.ts.map +1 -0
  72. package/dist/performance/BenchmarkAnalyzer.js +301 -0
  73. package/dist/performance/BenchmarkAnalyzer.js.map +1 -0
  74. package/dist/performance/MetricsCollector.d.ts +139 -0
  75. package/dist/performance/MetricsCollector.d.ts.map +1 -0
  76. package/dist/performance/MetricsCollector.js +320 -0
  77. package/dist/performance/MetricsCollector.js.map +1 -0
  78. package/dist/performance/PerformanceAnalytics.d.ts +162 -0
  79. package/dist/performance/PerformanceAnalytics.d.ts.map +1 -0
  80. package/dist/performance/PerformanceAnalytics.js +554 -0
  81. package/dist/performance/PerformanceAnalytics.js.map +1 -0
  82. package/dist/performance/PerformanceMonitor.d.ts +202 -0
  83. package/dist/performance/PerformanceMonitor.d.ts.map +1 -0
  84. package/dist/performance/PerformanceMonitor.js +478 -0
  85. package/dist/performance/PerformanceMonitor.js.map +1 -0
  86. package/dist/performance/TrendAnalyzer.d.ts +69 -0
  87. package/dist/performance/TrendAnalyzer.d.ts.map +1 -0
  88. package/dist/performance/TrendAnalyzer.js +203 -0
  89. package/dist/performance/TrendAnalyzer.js.map +1 -0
  90. package/dist/performance/index.d.ts +11 -0
  91. package/dist/performance/index.d.ts.map +1 -0
  92. package/dist/performance/index.js +8 -0
  93. package/dist/performance/index.js.map +1 -0
  94. package/dist/security/InputValidator.d.ts +215 -0
  95. package/dist/security/InputValidator.d.ts.map +1 -0
  96. package/dist/security/InputValidator.js +278 -0
  97. package/dist/security/InputValidator.js.map +1 -0
  98. package/dist/security/SecurityConfig.d.ts +129 -0
  99. package/dist/security/SecurityConfig.d.ts.map +1 -0
  100. package/dist/security/SecurityConfig.js +262 -0
  101. package/dist/security/SecurityConfig.js.map +1 -0
  102. package/dist/server/ConnectionTester.d.ts +24 -0
  103. package/dist/server/ConnectionTester.d.ts.map +1 -0
  104. package/dist/server/ConnectionTester.js +61 -0
  105. package/dist/server/ConnectionTester.js.map +1 -0
  106. package/dist/server/ToolRegistry.d.ts +46 -0
  107. package/dist/server/ToolRegistry.d.ts.map +1 -0
  108. package/dist/server/ToolRegistry.js +148 -0
  109. package/dist/server/ToolRegistry.js.map +1 -0
  110. package/dist/tools/BaseToolClass.d.ts +76 -0
  111. package/dist/tools/BaseToolClass.d.ts.map +1 -0
  112. package/dist/tools/BaseToolClass.js +104 -0
  113. package/dist/tools/BaseToolClass.js.map +1 -0
  114. package/dist/tools/BaseToolManager.d.ts +26 -0
  115. package/dist/tools/BaseToolManager.d.ts.map +1 -0
  116. package/dist/tools/BaseToolManager.js +56 -0
  117. package/dist/tools/BaseToolManager.js.map +1 -0
  118. package/dist/tools/base.d.ts +37 -0
  119. package/dist/tools/base.d.ts.map +1 -0
  120. package/dist/tools/base.js +60 -0
  121. package/dist/tools/base.js.map +1 -0
  122. package/dist/tools/cache.d.ts +260 -0
  123. package/dist/tools/cache.d.ts.map +1 -0
  124. package/dist/tools/cache.js +237 -0
  125. package/dist/tools/cache.js.map +1 -0
  126. package/dist/tools/index.d.ts +2 -0
  127. package/dist/tools/index.d.ts.map +1 -1
  128. package/dist/tools/index.js +2 -0
  129. package/dist/tools/index.js.map +1 -1
  130. package/dist/tools/performance.d.ts +63 -0
  131. package/dist/tools/performance.d.ts.map +1 -0
  132. package/dist/tools/performance.js +865 -0
  133. package/dist/tools/performance.js.map +1 -0
  134. package/dist/types/client.d.ts +1 -0
  135. package/dist/types/client.d.ts.map +1 -1
  136. package/dist/types/client.js.map +1 -1
  137. package/dist/utils/toolWrapper.d.ts +4 -0
  138. package/dist/utils/toolWrapper.d.ts.map +1 -1
  139. package/dist/utils/toolWrapper.js +11 -0
  140. package/dist/utils/toolWrapper.js.map +1 -1
  141. package/dist/utils/validation.d.ts +68 -0
  142. package/dist/utils/validation.d.ts.map +1 -0
  143. package/dist/utils/validation.js +185 -0
  144. package/dist/utils/validation.js.map +1 -0
  145. package/docs/CACHING.md +340 -0
  146. package/docs/DOCKER.md +451 -0
  147. package/docs/PERFORMANCE_MONITORING.md +471 -0
  148. package/docs/SECURITY_TESTING.md +393 -0
  149. package/docs/api/README.md +200 -0
  150. package/docs/api/categories/auth.md +40 -0
  151. package/docs/api/categories/cache.md +41 -0
  152. package/docs/api/categories/comment.md +44 -0
  153. package/docs/api/categories/media.md +43 -0
  154. package/docs/api/categories/page.md +43 -0
  155. package/docs/api/categories/performance.md +44 -0
  156. package/docs/api/categories/post.md +43 -0
  157. package/docs/api/categories/site.md +43 -0
  158. package/docs/api/categories/taxonomy.md +47 -0
  159. package/docs/api/categories/user.md +43 -0
  160. package/docs/api/openapi.json +3305 -0
  161. package/docs/api/summary.json +12 -0
  162. package/docs/api/tools/wp_approve_comment.md +98 -0
  163. package/docs/api/tools/wp_cache_clear.md +120 -0
  164. package/docs/api/tools/wp_cache_info.md +119 -0
  165. package/docs/api/tools/wp_cache_stats.md +119 -0
  166. package/docs/api/tools/wp_cache_warm.md +119 -0
  167. package/docs/api/tools/wp_create_application_password.md +102 -0
  168. package/docs/api/tools/wp_create_category.md +102 -0
  169. package/docs/api/tools/wp_create_comment.md +128 -0
  170. package/docs/api/tools/wp_create_page.md +135 -0
  171. package/docs/api/tools/wp_create_post.md +147 -0
  172. package/docs/api/tools/wp_create_tag.md +101 -0
  173. package/docs/api/tools/wp_create_user.md +135 -0
  174. package/docs/api/tools/wp_delete_application_password.md +101 -0
  175. package/docs/api/tools/wp_delete_category.md +100 -0
  176. package/docs/api/tools/wp_delete_comment.md +101 -0
  177. package/docs/api/tools/wp_delete_media.md +108 -0
  178. package/docs/api/tools/wp_delete_page.md +108 -0
  179. package/docs/api/tools/wp_delete_post.md +117 -0
  180. package/docs/api/tools/wp_delete_tag.md +100 -0
  181. package/docs/api/tools/wp_delete_user.md +108 -0
  182. package/docs/api/tools/wp_get_application_passwords.md +103 -0
  183. package/docs/api/tools/wp_get_auth_status.md +101 -0
  184. package/docs/api/tools/wp_get_category.md +103 -0
  185. package/docs/api/tools/wp_get_comment.md +103 -0
  186. package/docs/api/tools/wp_get_current_user.md +101 -0
  187. package/docs/api/tools/wp_get_media.md +103 -0
  188. package/docs/api/tools/wp_get_page.md +103 -0
  189. package/docs/api/tools/wp_get_page_revisions.md +103 -0
  190. package/docs/api/tools/wp_get_post.md +112 -0
  191. package/docs/api/tools/wp_get_post_revisions.md +103 -0
  192. package/docs/api/tools/wp_get_site_settings.md +108 -0
  193. package/docs/api/tools/wp_get_tag.md +103 -0
  194. package/docs/api/tools/wp_get_user.md +103 -0
  195. package/docs/api/tools/wp_list_categories.md +111 -0
  196. package/docs/api/tools/wp_list_comments.md +111 -0
  197. package/docs/api/tools/wp_list_media.md +145 -0
  198. package/docs/api/tools/wp_list_pages.md +145 -0
  199. package/docs/api/tools/wp_list_posts.md +156 -0
  200. package/docs/api/tools/wp_list_tags.md +110 -0
  201. package/docs/api/tools/wp_list_users.md +111 -0
  202. package/docs/api/tools/wp_performance_alerts.md +162 -0
  203. package/docs/api/tools/wp_performance_benchmark.md +160 -0
  204. package/docs/api/tools/wp_performance_export.md +162 -0
  205. package/docs/api/tools/wp_performance_history.md +161 -0
  206. package/docs/api/tools/wp_performance_optimize.md +162 -0
  207. package/docs/api/tools/wp_performance_stats.md +160 -0
  208. package/docs/api/tools/wp_search_site.md +99 -0
  209. package/docs/api/tools/wp_spam_comment.md +98 -0
  210. package/docs/api/tools/wp_switch_auth_method.md +122 -0
  211. package/docs/api/tools/wp_test_auth.md +96 -0
  212. package/docs/api/tools/wp_update_category.md +102 -0
  213. package/docs/api/tools/wp_update_comment.md +127 -0
  214. package/docs/api/tools/wp_update_media.md +129 -0
  215. package/docs/api/tools/wp_update_page.md +135 -0
  216. package/docs/api/tools/wp_update_post.md +144 -0
  217. package/docs/api/tools/wp_update_site_settings.md +127 -0
  218. package/docs/api/tools/wp_update_tag.md +102 -0
  219. package/docs/api/tools/wp_update_user.md +134 -0
  220. package/docs/api/tools/wp_upload_media.md +131 -0
  221. package/docs/api/types/WordPressPost.md +39 -0
  222. package/docs/contract-testing.md +183 -0
  223. package/docs/developer/NPM_AUTH_SETUP.md +3 -3
  224. package/docs/wordpress-rest-api-authentication-troubleshooting.md +218 -0
  225. package/package.json +84 -64
  226. package/src/cache/CacheInvalidation.ts +421 -0
  227. package/src/cache/CacheManager.ts +391 -0
  228. package/src/cache/HttpCacheWrapper.ts +372 -0
  229. package/src/cache/__tests__/CacheInvalidation.test.ts +299 -0
  230. package/src/cache/__tests__/CacheManager.test.ts +300 -0
  231. package/src/cache/__tests__/CachedWordPressClient.test.ts +304 -0
  232. package/src/cache/__tests__/HttpCacheWrapper.test.ts +359 -0
  233. package/src/cache/index.ts +26 -0
  234. package/src/client/CachedWordPressClient.ts +442 -0
  235. package/src/config/ConfigurationSchema.ts +246 -0
  236. package/src/config/ServerConfiguration.ts +215 -0
  237. package/src/docs/DocumentationGenerator.ts +952 -0
  238. package/src/docs/MarkdownFormatter.ts +494 -0
  239. package/src/docs/index.ts +21 -0
  240. package/src/index.ts +14 -274
  241. package/src/performance/MetricsCollector.ts +447 -0
  242. package/src/performance/PerformanceAnalytics.ts +762 -0
  243. package/src/performance/PerformanceMonitor.ts +649 -0
  244. package/src/performance/index.ts +28 -0
  245. package/src/security/InputValidator.ts +319 -0
  246. package/src/security/SecurityConfig.ts +301 -0
  247. package/src/server/ConnectionTester.ts +74 -0
  248. package/src/server/ToolRegistry.ts +194 -0
  249. package/src/tools/BaseToolManager.ts +66 -0
  250. package/src/tools/cache.ts +259 -0
  251. package/src/tools/index.ts +2 -0
  252. package/src/tools/performance.ts +948 -0
  253. package/src/types/client.ts +1 -0
  254. package/src/utils/toolWrapper.ts +11 -0
  255. package/src/utils/validation.ts +259 -0
@@ -0,0 +1,649 @@
1
+ /**
2
+ * Performance Monitoring System for WordPress MCP Server
3
+ * Collects, analyzes, and reports performance metrics
4
+ */
5
+
6
+ export interface PerformanceMetrics {
7
+ // Request Performance
8
+ requests: {
9
+ total: number;
10
+ successful: number;
11
+ failed: number;
12
+ averageResponseTime: number;
13
+ minResponseTime: number;
14
+ maxResponseTime: number;
15
+ requestsPerSecond: number;
16
+ p50ResponseTime: number;
17
+ p95ResponseTime: number;
18
+ p99ResponseTime: number;
19
+ };
20
+
21
+ // Cache Performance
22
+ cache: {
23
+ hits: number;
24
+ misses: number;
25
+ hitRate: number;
26
+ totalSize: number;
27
+ memoryUsageMB: number;
28
+ evictions: number;
29
+ averageCacheTime: number;
30
+ };
31
+
32
+ // System Performance
33
+ system: {
34
+ cpuUsage: number;
35
+ memoryUsage: number;
36
+ uptime: number;
37
+ activeConnections: number;
38
+ concurrentRequests: number;
39
+ };
40
+
41
+ // WordPress Specific
42
+ wordpress: {
43
+ authSuccessRate: number;
44
+ apiVersion: string;
45
+ siteHealth: 'healthy' | 'warning' | 'critical';
46
+ averageDbResponseTime: number;
47
+ pluginCompatibility: number;
48
+ };
49
+
50
+ // Tool Usage
51
+ tools: {
52
+ mostUsedTool: string;
53
+ toolUsageCount: Record<string, number>;
54
+ toolPerformance: Record<string, {
55
+ averageTime: number;
56
+ successRate: number;
57
+ callCount: number;
58
+ }>;
59
+ };
60
+ }
61
+
62
+ export interface PerformanceAlert {
63
+ id: string;
64
+ timestamp: number;
65
+ severity: 'info' | 'warning' | 'error' | 'critical';
66
+ category: 'performance' | 'cache' | 'system' | 'wordpress';
67
+ message: string;
68
+ metric: string;
69
+ threshold: number;
70
+ actualValue: number;
71
+ suggestion?: string;
72
+ }
73
+
74
+ export interface PerformanceConfig {
75
+ collectInterval: number; // Collection interval in ms
76
+ retentionPeriod: number; // Data retention in ms
77
+ alertThresholds: {
78
+ responseTime: number;
79
+ errorRate: number;
80
+ cacheHitRate: number;
81
+ memoryUsage: number;
82
+ cpuUsage: number;
83
+ };
84
+ enableRealTimeMonitoring: boolean;
85
+ enableHistoricalData: boolean;
86
+ enableAlerts: boolean;
87
+ }
88
+
89
+ /**
90
+ * Core Performance Monitor class
91
+ */
92
+ export class PerformanceMonitor {
93
+ private metrics: PerformanceMetrics;
94
+ private historicalData: PerformanceMetrics[] = [];
95
+ private alerts: PerformanceAlert[] = [];
96
+ private config: PerformanceConfig;
97
+ private startTime: number;
98
+ private responseTimes: number[] = [];
99
+ private collectionTimer?: NodeJS.Timeout;
100
+
101
+ constructor(config: Partial<PerformanceConfig> = {}) {
102
+ this.startTime = Date.now();
103
+ this.config = {
104
+ collectInterval: 30000, // 30 seconds
105
+ retentionPeriod: 24 * 60 * 60 * 1000, // 24 hours
106
+ alertThresholds: {
107
+ responseTime: 2000, // 2 seconds
108
+ errorRate: 0.05, // 5%
109
+ cacheHitRate: 0.8, // 80%
110
+ memoryUsage: 80, // 80%
111
+ cpuUsage: 80 // 80%
112
+ },
113
+ enableRealTimeMonitoring: true,
114
+ enableHistoricalData: true,
115
+ enableAlerts: true,
116
+ ...config
117
+ };
118
+
119
+ this.metrics = this.initializeMetrics();
120
+
121
+ if (this.config.enableRealTimeMonitoring) {
122
+ this.startCollection();
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Initialize empty metrics structure
128
+ */
129
+ private initializeMetrics(): PerformanceMetrics {
130
+ return {
131
+ requests: {
132
+ total: 0,
133
+ successful: 0,
134
+ failed: 0,
135
+ averageResponseTime: 0,
136
+ minResponseTime: 0,
137
+ maxResponseTime: 0,
138
+ requestsPerSecond: 0,
139
+ p50ResponseTime: 0,
140
+ p95ResponseTime: 0,
141
+ p99ResponseTime: 0
142
+ },
143
+ cache: {
144
+ hits: 0,
145
+ misses: 0,
146
+ hitRate: 0,
147
+ totalSize: 0,
148
+ memoryUsageMB: 0,
149
+ evictions: 0,
150
+ averageCacheTime: 0
151
+ },
152
+ system: {
153
+ cpuUsage: 0,
154
+ memoryUsage: 0,
155
+ uptime: 0,
156
+ activeConnections: 0,
157
+ concurrentRequests: 0
158
+ },
159
+ wordpress: {
160
+ authSuccessRate: 0,
161
+ apiVersion: 'v2',
162
+ siteHealth: 'healthy',
163
+ averageDbResponseTime: 0,
164
+ pluginCompatibility: 100
165
+ },
166
+ tools: {
167
+ mostUsedTool: '',
168
+ toolUsageCount: {},
169
+ toolPerformance: {}
170
+ }
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Record a request performance metric
176
+ */
177
+ recordRequest(responseTime: number, success: boolean, toolName?: string): void {
178
+ this.metrics.requests.total++;
179
+
180
+ if (success) {
181
+ this.metrics.requests.successful++;
182
+ } else {
183
+ this.metrics.requests.failed++;
184
+ }
185
+
186
+ // Track response times
187
+ this.responseTimes.push(responseTime);
188
+ this.updateResponseTimeMetrics();
189
+
190
+ // Track tool usage
191
+ if (toolName) {
192
+ this.recordToolUsage(toolName, responseTime, success);
193
+ }
194
+
195
+ // Check for alerts
196
+ if (this.config.enableAlerts) {
197
+ this.checkPerformanceAlerts();
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Update cache metrics from cache manager
203
+ */
204
+ updateCacheMetrics(cacheStats: any): void {
205
+ this.metrics.cache = {
206
+ hits: cacheStats.hits || 0,
207
+ misses: cacheStats.misses || 0,
208
+ hitRate: cacheStats.hitRate || 0,
209
+ totalSize: cacheStats.totalSize || 0,
210
+ memoryUsageMB: this.estimateCacheMemoryUsage(cacheStats.totalSize),
211
+ evictions: cacheStats.evictions || 0,
212
+ averageCacheTime: 0.5 // Sub-millisecond average
213
+ };
214
+ }
215
+
216
+ /**
217
+ * Update system metrics
218
+ */
219
+ updateSystemMetrics(): void {
220
+ const memUsage = process.memoryUsage();
221
+
222
+ this.metrics.system = {
223
+ cpuUsage: this.getCpuUsage(),
224
+ memoryUsage: Math.round((memUsage.heapUsed / memUsage.heapTotal) * 100),
225
+ uptime: Date.now() - this.startTime,
226
+ activeConnections: 1, // Will be updated by connection manager
227
+ concurrentRequests: 0 // Will be updated by request manager
228
+ };
229
+ }
230
+
231
+ /**
232
+ * Get current performance metrics
233
+ */
234
+ getMetrics(): PerformanceMetrics {
235
+ this.updateSystemMetrics();
236
+ return { ...this.metrics };
237
+ }
238
+
239
+ /**
240
+ * Get historical performance data
241
+ */
242
+ getHistoricalData(
243
+ startTime?: number,
244
+ endTime?: number
245
+ ): PerformanceMetrics[] {
246
+ if (!this.config.enableHistoricalData) {
247
+ return [];
248
+ }
249
+
250
+ let data = [...this.historicalData];
251
+
252
+ if (startTime) {
253
+ data = data.filter(m => m.system.uptime >= startTime);
254
+ }
255
+
256
+ if (endTime) {
257
+ data = data.filter(m => m.system.uptime <= endTime);
258
+ }
259
+
260
+ return data;
261
+ }
262
+
263
+ /**
264
+ * Get performance alerts
265
+ */
266
+ getAlerts(severity?: string): PerformanceAlert[] {
267
+ if (severity) {
268
+ return this.alerts.filter(alert => alert.severity === severity);
269
+ }
270
+ return [...this.alerts];
271
+ }
272
+
273
+ /**
274
+ * Clear alerts
275
+ */
276
+ clearAlerts(): void {
277
+ this.alerts = [];
278
+ }
279
+
280
+ /**
281
+ * Generate performance insights
282
+ */
283
+ generateInsights(): {
284
+ summary: string;
285
+ recommendations: string[];
286
+ trends: string[];
287
+ health: 'excellent' | 'good' | 'warning' | 'critical';
288
+ } {
289
+ const current = this.getMetrics();
290
+ const health = this.calculateOverallHealth(current);
291
+
292
+ return {
293
+ summary: this.generateSummary(current),
294
+ recommendations: this.generateRecommendations(current),
295
+ trends: this.generateTrends(),
296
+ health
297
+ };
298
+ }
299
+
300
+ /**
301
+ * Export performance data
302
+ */
303
+ exportData(format: 'json' | 'csv' = 'json'): string {
304
+ const data = {
305
+ currentMetrics: this.getMetrics(),
306
+ historicalData: this.getHistoricalData(),
307
+ alerts: this.getAlerts(),
308
+ config: this.config,
309
+ generatedAt: new Date().toISOString()
310
+ };
311
+
312
+ if (format === 'csv') {
313
+ return this.convertToCSV(data);
314
+ }
315
+
316
+ return JSON.stringify(data, null, 2);
317
+ }
318
+
319
+ /**
320
+ * Start automatic metric collection
321
+ */
322
+ private startCollection(): void {
323
+ this.collectionTimer = setInterval(() => {
324
+ const snapshot = this.getMetrics();
325
+
326
+ if (this.config.enableHistoricalData) {
327
+ this.historicalData.push(snapshot);
328
+ this.cleanupOldData();
329
+ }
330
+ }, this.config.collectInterval);
331
+ }
332
+
333
+ /**
334
+ * Stop metric collection
335
+ */
336
+ stop(): void {
337
+ if (this.collectionTimer) {
338
+ clearInterval(this.collectionTimer);
339
+ }
340
+ }
341
+
342
+ /**
343
+ * Record tool usage and performance
344
+ */
345
+ private recordToolUsage(toolName: string, responseTime: number, success: boolean): void {
346
+ // Update usage count
347
+ this.metrics.tools.toolUsageCount[toolName] =
348
+ (this.metrics.tools.toolUsageCount[toolName] || 0) + 1;
349
+
350
+ // Update performance metrics
351
+ if (!this.metrics.tools.toolPerformance[toolName]) {
352
+ this.metrics.tools.toolPerformance[toolName] = {
353
+ averageTime: responseTime,
354
+ successRate: success ? 1 : 0,
355
+ callCount: 1
356
+ };
357
+ } else {
358
+ const perf = this.metrics.tools.toolPerformance[toolName];
359
+ const totalCalls = perf.callCount + 1;
360
+
361
+ // Update average time
362
+ perf.averageTime = (perf.averageTime * perf.callCount + responseTime) / totalCalls;
363
+
364
+ // Update success rate
365
+ const totalSuccess = perf.successRate * perf.callCount + (success ? 1 : 0);
366
+ perf.successRate = totalSuccess / totalCalls;
367
+
368
+ perf.callCount = totalCalls;
369
+ }
370
+
371
+ // Update most used tool
372
+ const usageCounts = this.metrics.tools.toolUsageCount;
373
+ this.metrics.tools.mostUsedTool = Object.keys(usageCounts)
374
+ .reduce((a, b) => usageCounts[a] > usageCounts[b] ? a : b);
375
+ }
376
+
377
+ /**
378
+ * Update response time metrics with percentiles
379
+ */
380
+ private updateResponseTimeMetrics(): void {
381
+ if (this.responseTimes.length === 0) return;
382
+
383
+ const sorted = [...this.responseTimes].sort((a, b) => a - b);
384
+ const total = this.metrics.requests.total;
385
+
386
+ this.metrics.requests.averageResponseTime =
387
+ this.responseTimes.reduce((sum, time) => sum + time, 0) / this.responseTimes.length;
388
+
389
+ this.metrics.requests.minResponseTime = sorted[0];
390
+ this.metrics.requests.maxResponseTime = sorted[sorted.length - 1];
391
+
392
+ // Calculate percentiles
393
+ this.metrics.requests.p50ResponseTime = this.getPercentile(sorted, 0.5);
394
+ this.metrics.requests.p95ResponseTime = this.getPercentile(sorted, 0.95);
395
+ this.metrics.requests.p99ResponseTime = this.getPercentile(sorted, 0.99);
396
+
397
+ // Calculate requests per second
398
+ const uptime = (Date.now() - this.startTime) / 1000;
399
+ this.metrics.requests.requestsPerSecond = total / uptime;
400
+
401
+ // Limit response time history to prevent memory growth
402
+ if (this.responseTimes.length > 10000) {
403
+ this.responseTimes = this.responseTimes.slice(-5000);
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Get percentile value from sorted array
409
+ */
410
+ private getPercentile(sorted: number[], percentile: number): number {
411
+ const index = Math.ceil(sorted.length * percentile) - 1;
412
+ return sorted[Math.max(0, index)];
413
+ }
414
+
415
+ /**
416
+ * Estimate cache memory usage
417
+ */
418
+ private estimateCacheMemoryUsage(totalSize: number): number {
419
+ // Rough estimate: ~1KB per cache entry
420
+ return (totalSize * 1024) / (1024 * 1024); // Convert to MB
421
+ }
422
+
423
+ /**
424
+ * Get CPU usage (simplified)
425
+ */
426
+ private getCpuUsage(): number {
427
+ // Simplified CPU usage estimation
428
+ // In production, use more sophisticated monitoring
429
+ return Math.round(Math.random() * 20 + 10); // 10-30% placeholder
430
+ }
431
+
432
+ /**
433
+ * Check for performance alerts
434
+ */
435
+ private checkPerformanceAlerts(): void {
436
+ const thresholds = this.config.alertThresholds;
437
+
438
+ // Response time alert
439
+ if (this.metrics.requests.averageResponseTime > thresholds.responseTime) {
440
+ this.addAlert('warning', 'performance',
441
+ `High response time: ${this.metrics.requests.averageResponseTime}ms`,
442
+ 'averageResponseTime', thresholds.responseTime,
443
+ this.metrics.requests.averageResponseTime,
444
+ 'Consider enabling caching or optimizing queries'
445
+ );
446
+ }
447
+
448
+ // Error rate alert
449
+ const errorRate = this.metrics.requests.failed / this.metrics.requests.total;
450
+ if (errorRate > thresholds.errorRate) {
451
+ this.addAlert('error', 'performance',
452
+ `High error rate: ${Math.round(errorRate * 100)}%`,
453
+ 'errorRate', thresholds.errorRate, errorRate,
454
+ 'Check WordPress connectivity and authentication'
455
+ );
456
+ }
457
+
458
+ // Cache hit rate alert
459
+ if (this.metrics.cache.hitRate < thresholds.cacheHitRate) {
460
+ this.addAlert('warning', 'cache',
461
+ `Low cache hit rate: ${Math.round(this.metrics.cache.hitRate * 100)}%`,
462
+ 'cacheHitRate', thresholds.cacheHitRate, this.metrics.cache.hitRate,
463
+ 'Consider cache warming or adjusting TTL values'
464
+ );
465
+ }
466
+ }
467
+
468
+ /**
469
+ * Add performance alert
470
+ */
471
+ private addAlert(
472
+ severity: 'info' | 'warning' | 'error' | 'critical',
473
+ category: 'performance' | 'cache' | 'system' | 'wordpress',
474
+ message: string,
475
+ metric: string,
476
+ threshold: number,
477
+ actualValue: number,
478
+ suggestion?: string
479
+ ): void {
480
+ const alert: PerformanceAlert = {
481
+ id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
482
+ timestamp: Date.now(),
483
+ severity,
484
+ category,
485
+ message,
486
+ metric,
487
+ threshold,
488
+ actualValue,
489
+ ...(suggestion && { suggestion })
490
+ };
491
+
492
+ this.alerts.push(alert);
493
+
494
+ // Limit alert history
495
+ if (this.alerts.length > 1000) {
496
+ this.alerts = this.alerts.slice(-500);
497
+ }
498
+ }
499
+
500
+ /**
501
+ * Calculate overall system health
502
+ */
503
+ private calculateOverallHealth(metrics: PerformanceMetrics): 'excellent' | 'good' | 'warning' | 'critical' {
504
+ let score = 100;
505
+
506
+ // Response time impact
507
+ if (metrics.requests.averageResponseTime > 3000) score -= 30;
508
+ else if (metrics.requests.averageResponseTime > 1000) score -= 15;
509
+
510
+ // Error rate impact
511
+ const errorRate = metrics.requests.failed / metrics.requests.total;
512
+ if (errorRate > 0.1) score -= 40;
513
+ else if (errorRate > 0.05) score -= 20;
514
+
515
+ // Cache performance impact
516
+ if (metrics.cache.hitRate < 0.5) score -= 25;
517
+ else if (metrics.cache.hitRate < 0.8) score -= 10;
518
+
519
+ // System resource impact
520
+ if (metrics.system.memoryUsage > 90) score -= 20;
521
+ else if (metrics.system.memoryUsage > 80) score -= 10;
522
+
523
+ if (score >= 90) return 'excellent';
524
+ if (score >= 75) return 'good';
525
+ if (score >= 50) return 'warning';
526
+ return 'critical';
527
+ }
528
+
529
+ /**
530
+ * Generate performance summary
531
+ */
532
+ private generateSummary(metrics: PerformanceMetrics): string {
533
+ const errorRate = metrics.requests.total > 0
534
+ ? (metrics.requests.failed / metrics.requests.total * 100).toFixed(1)
535
+ : '0';
536
+
537
+ return `Performance Summary: ${metrics.requests.total} requests processed with ${errorRate}% error rate. ` +
538
+ `Average response time: ${metrics.requests.averageResponseTime.toFixed(0)}ms. ` +
539
+ `Cache hit rate: ${(metrics.cache.hitRate * 100).toFixed(1)}%. ` +
540
+ `System uptime: ${Math.round(metrics.system.uptime / 1000 / 60)} minutes.`;
541
+ }
542
+
543
+ /**
544
+ * Generate performance recommendations
545
+ */
546
+ private generateRecommendations(metrics: PerformanceMetrics): string[] {
547
+ const recommendations: string[] = [];
548
+
549
+ if (metrics.requests.averageResponseTime > 1000) {
550
+ recommendations.push('Enable caching to reduce response times');
551
+ }
552
+
553
+ if (metrics.cache.hitRate < 0.8) {
554
+ recommendations.push('Warm cache with frequently accessed data');
555
+ }
556
+
557
+ if (metrics.system.memoryUsage > 80) {
558
+ recommendations.push('Consider increasing memory allocation or cache size limits');
559
+ }
560
+
561
+ const errorRate = metrics.requests.failed / metrics.requests.total;
562
+ if (errorRate > 0.05) {
563
+ recommendations.push('Review error logs and improve error handling');
564
+ }
565
+
566
+ return recommendations;
567
+ }
568
+
569
+ /**
570
+ * Generate trend analysis
571
+ */
572
+ private generateTrends(): string[] {
573
+ if (this.historicalData.length < 2) {
574
+ return ['Insufficient data for trend analysis'];
575
+ }
576
+
577
+ const trends: string[] = [];
578
+ const recent = this.historicalData.slice(-5);
579
+
580
+ // Response time trend
581
+ const responseTimes = recent.map(d => d.requests.averageResponseTime);
582
+ if (this.isIncreasing(responseTimes)) {
583
+ trends.push('Response times are increasing');
584
+ } else if (this.isDecreasing(responseTimes)) {
585
+ trends.push('Response times are improving');
586
+ }
587
+
588
+ // Cache hit rate trend
589
+ const hitRates = recent.map(d => d.cache.hitRate);
590
+ if (this.isIncreasing(hitRates)) {
591
+ trends.push('Cache performance is improving');
592
+ } else if (this.isDecreasing(hitRates)) {
593
+ trends.push('Cache performance is declining');
594
+ }
595
+
596
+ return trends;
597
+ }
598
+
599
+ /**
600
+ * Check if values are increasing
601
+ */
602
+ private isIncreasing(values: number[]): boolean {
603
+ for (let i = 1; i < values.length; i++) {
604
+ if (values[i] <= values[i - 1]) return false;
605
+ }
606
+ return true;
607
+ }
608
+
609
+ /**
610
+ * Check if values are decreasing
611
+ */
612
+ private isDecreasing(values: number[]): boolean {
613
+ for (let i = 1; i < values.length; i++) {
614
+ if (values[i] >= values[i - 1]) return false;
615
+ }
616
+ return true;
617
+ }
618
+
619
+ /**
620
+ * Convert data to CSV format
621
+ */
622
+ private convertToCSV(data: any): string {
623
+ // Simplified CSV conversion for metrics
624
+ const metrics = data.currentMetrics;
625
+ const csv = [
626
+ 'Metric,Value',
627
+ `Total Requests,${metrics.requests.total}`,
628
+ `Successful Requests,${metrics.requests.successful}`,
629
+ `Failed Requests,${metrics.requests.failed}`,
630
+ `Average Response Time,${metrics.requests.averageResponseTime}`,
631
+ `Cache Hit Rate,${metrics.cache.hitRate}`,
632
+ `Cache Size,${metrics.cache.totalSize}`,
633
+ `Memory Usage,${metrics.system.memoryUsage}%`,
634
+ `Uptime,${metrics.system.uptime}ms`
635
+ ];
636
+
637
+ return csv.join('\n');
638
+ }
639
+
640
+ /**
641
+ * Clean up old historical data
642
+ */
643
+ private cleanupOldData(): void {
644
+ const cutoff = Date.now() - this.config.retentionPeriod;
645
+ this.historicalData = this.historicalData.filter(
646
+ data => data.system.uptime > cutoff
647
+ );
648
+ }
649
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Performance Monitoring System Exports
3
+ * Central export point for all performance monitoring components
4
+ */
5
+
6
+ export { PerformanceMonitor } from './PerformanceMonitor.js';
7
+ export { MetricsCollector } from './MetricsCollector.js';
8
+ export { PerformanceAnalytics } from './PerformanceAnalytics.js';
9
+
10
+ export type {
11
+ PerformanceMetrics,
12
+ PerformanceAlert,
13
+ PerformanceConfig
14
+ } from './PerformanceMonitor.js';
15
+
16
+ export type {
17
+ CollectorConfig,
18
+ RequestMetadata,
19
+ ToolExecutionContext
20
+ } from './MetricsCollector.js';
21
+
22
+ export type {
23
+ AnalyticsConfig,
24
+ PerformanceTrend,
25
+ PerformanceAnomaly,
26
+ PerformanceInsight,
27
+ BenchmarkComparison
28
+ } from './PerformanceAnalytics.js';