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,948 @@
1
+ /**
2
+ * Performance Monitoring MCP Tools for WordPress Server
3
+ * Provides comprehensive performance insights and management
4
+ */
5
+
6
+ import type { ToolDefinition } from '../server/ToolRegistry.js';
7
+ import { PerformanceMonitor } from '../performance/PerformanceMonitor.js';
8
+ import { MetricsCollector } from '../performance/MetricsCollector.js';
9
+ import { PerformanceAnalytics } from '../performance/PerformanceAnalytics.js';
10
+ import { toolWrapper } from '../utils/toolWrapper.js';
11
+
12
+ /**
13
+ * Performance Tools Class
14
+ */
15
+ export default class PerformanceTools {
16
+ private monitor: PerformanceMonitor;
17
+ private collector: MetricsCollector;
18
+ private analytics: PerformanceAnalytics;
19
+
20
+ constructor(clients?: Map<string, any>) {
21
+ // Initialize performance monitoring system
22
+ this.monitor = new PerformanceMonitor({
23
+ enableRealTimeMonitoring: true,
24
+ enableHistoricalData: true,
25
+ enableAlerts: true
26
+ });
27
+
28
+ this.collector = new MetricsCollector(this.monitor, {
29
+ enableRealTime: true,
30
+ enableToolTracking: true,
31
+ enableCacheIntegration: true
32
+ });
33
+
34
+ this.analytics = new PerformanceAnalytics(this.collector, {
35
+ enablePredictiveAnalysis: true,
36
+ enableAnomalyDetection: true,
37
+ enableTrendAnalysis: true
38
+ });
39
+
40
+ // Register clients if provided
41
+ if (clients) {
42
+ for (const [siteId, client] of clients) {
43
+ this.collector.registerClient(siteId, client);
44
+
45
+ // Register cache manager if client has one
46
+ if (client.cacheManager) {
47
+ this.collector.registerCacheManager(siteId, client.cacheManager);
48
+ }
49
+ }
50
+ }
51
+
52
+ // Start collecting metrics from historical data for analytics
53
+ this.startHistoricalDataCollection();
54
+ }
55
+
56
+ /**
57
+ * Get all performance monitoring tools
58
+ */
59
+ getTools(): ToolDefinition[] {
60
+ return [
61
+ {
62
+ name: 'wp_performance_stats',
63
+ description: 'Get real-time performance statistics and metrics',
64
+ parameters: [
65
+ {
66
+ name: 'site',
67
+ type: 'string',
68
+ description: 'Specific site ID for multi-site setups (optional for single site)',
69
+ required: false
70
+ },
71
+ {
72
+ name: 'category',
73
+ type: 'string',
74
+ description: 'Category of metrics to return (overview, requests, cache, system, tools, all)',
75
+ required: false
76
+ },
77
+ {
78
+ name: 'format',
79
+ type: 'string',
80
+ description: 'Detail level of the response (summary, detailed, raw)',
81
+ required: false
82
+ }
83
+ ],
84
+ handler: this.getPerformanceStats.bind(this)
85
+ },
86
+ {
87
+ name: 'wp_performance_history',
88
+ description: 'Get historical performance data and trends',
89
+ parameters: [
90
+ {
91
+ name: 'site',
92
+ type: 'string',
93
+ description: 'Specific site ID for multi-site setups (optional for single site)',
94
+ required: false
95
+ },
96
+ {
97
+ name: 'timeframe',
98
+ type: 'string',
99
+ description: 'Time period for historical data (1h, 6h, 12h, 24h, 7d)',
100
+ required: false
101
+ },
102
+ {
103
+ name: 'metrics',
104
+ type: 'array',
105
+ description: 'Specific metrics to include (responseTime, cacheHitRate, errorRate, memoryUsage, requestVolume)',
106
+ required: false
107
+ },
108
+ {
109
+ name: 'includeTrends',
110
+ type: 'boolean',
111
+ description: 'Include trend analysis (default: true)',
112
+ required: false
113
+ }
114
+ ],
115
+ handler: this.getPerformanceHistory.bind(this)
116
+ },
117
+ {
118
+ name: 'wp_performance_benchmark',
119
+ description: 'Compare current performance against industry benchmarks',
120
+ parameters: [
121
+ {
122
+ name: 'site',
123
+ type: 'string',
124
+ description: 'Specific site ID for multi-site setups (optional for single site)',
125
+ required: false
126
+ },
127
+ {
128
+ name: 'category',
129
+ type: 'string',
130
+ description: 'Benchmark category (response_time, cache_performance, error_rate, system_resources, all)',
131
+ required: false
132
+ },
133
+ {
134
+ name: 'includeRecommendations',
135
+ type: 'boolean',
136
+ description: 'Include improvement recommendations (default: true)',
137
+ required: false
138
+ }
139
+ ],
140
+ handler: this.getBenchmarkComparison.bind(this)
141
+ },
142
+ {
143
+ name: 'wp_performance_alerts',
144
+ description: 'Get performance alerts and anomaly detection results',
145
+ parameters: [
146
+ {
147
+ name: 'site',
148
+ type: 'string',
149
+ description: 'Specific site ID for multi-site setups (optional for single site)',
150
+ required: false
151
+ },
152
+ {
153
+ name: 'severity',
154
+ type: 'string',
155
+ description: 'Filter alerts by severity level (info, warning, error, critical)',
156
+ required: false
157
+ },
158
+ {
159
+ name: 'category',
160
+ type: 'string',
161
+ description: 'Filter alerts by category (performance, cache, system, wordpress)',
162
+ required: false
163
+ },
164
+ {
165
+ name: 'limit',
166
+ type: 'number',
167
+ description: 'Maximum number of alerts to return (default: 20)',
168
+ required: false
169
+ },
170
+ {
171
+ name: 'includeAnomalies',
172
+ type: 'boolean',
173
+ description: 'Include detected anomalies (default: true)',
174
+ required: false
175
+ }
176
+ ],
177
+ handler: this.getPerformanceAlerts.bind(this)
178
+ },
179
+ {
180
+ name: 'wp_performance_optimize',
181
+ description: 'Get optimization recommendations and insights',
182
+ parameters: [
183
+ {
184
+ name: 'site',
185
+ type: 'string',
186
+ description: 'Specific site ID for multi-site setups (optional for single site)',
187
+ required: false
188
+ },
189
+ {
190
+ name: 'focus',
191
+ type: 'string',
192
+ description: 'Optimization focus area (speed, reliability, efficiency, scaling)',
193
+ required: false
194
+ },
195
+ {
196
+ name: 'priority',
197
+ type: 'string',
198
+ description: 'Implementation timeline (quick_wins, medium_term, long_term, all)',
199
+ required: false
200
+ },
201
+ {
202
+ name: 'includeROI',
203
+ type: 'boolean',
204
+ description: 'Include ROI estimates (default: true)',
205
+ required: false
206
+ },
207
+ {
208
+ name: 'includePredictions',
209
+ type: 'boolean',
210
+ description: 'Include performance predictions (default: true)',
211
+ required: false
212
+ }
213
+ ],
214
+ handler: this.getOptimizationRecommendations.bind(this)
215
+ },
216
+ {
217
+ name: 'wp_performance_export',
218
+ description: 'Export comprehensive performance report',
219
+ parameters: [
220
+ {
221
+ name: 'site',
222
+ type: 'string',
223
+ description: 'Specific site ID for multi-site setups (optional for single site)',
224
+ required: false
225
+ },
226
+ {
227
+ name: 'format',
228
+ type: 'string',
229
+ description: 'Export format (json, csv, summary)',
230
+ required: false
231
+ },
232
+ {
233
+ name: 'includeHistorical',
234
+ type: 'boolean',
235
+ description: 'Include historical data (default: true)',
236
+ required: false
237
+ },
238
+ {
239
+ name: 'includeAnalytics',
240
+ type: 'boolean',
241
+ description: 'Include analytics and insights (default: true)',
242
+ required: false
243
+ },
244
+ {
245
+ name: 'timeRange',
246
+ type: 'string',
247
+ description: 'Time range for data export (1h, 6h, 24h, 7d, 30d)',
248
+ required: false
249
+ }
250
+ ],
251
+ handler: this.exportPerformanceReport.bind(this)
252
+ }
253
+ ];
254
+ }
255
+
256
+ /**
257
+ * Get real-time performance statistics
258
+ */
259
+ private async getPerformanceStats(params: any): Promise<any> {
260
+ return toolWrapper(async () => {
261
+ const { site, category = 'overview', format = 'summary' } = params;
262
+
263
+ // Get current metrics
264
+ const metrics = this.collector.collectCurrentMetrics();
265
+
266
+ // Get site-specific metrics if requested
267
+ let siteMetrics = null;
268
+ if (site) {
269
+ siteMetrics = this.collector.getSiteMetrics(site);
270
+ }
271
+
272
+ // Filter by category
273
+ const result: any = {};
274
+
275
+ if (category === 'overview' || category === 'all') {
276
+ result.overview = {
277
+ overallHealth: this.calculateHealthStatus(metrics),
278
+ performanceScore: this.calculatePerformanceScore(metrics),
279
+ totalRequests: metrics.requests.total,
280
+ averageResponseTime: `${metrics.requests.averageResponseTime.toFixed(0)}ms`,
281
+ cacheHitRate: `${(metrics.cache.hitRate * 100).toFixed(1)}%`,
282
+ errorRate: `${((metrics.requests.failed / Math.max(metrics.requests.total, 1)) * 100).toFixed(2)}%`,
283
+ uptime: this.formatUptime(metrics.system.uptime)
284
+ };
285
+ }
286
+
287
+ if (category === 'requests' || category === 'all') {
288
+ result.requests = {
289
+ ...metrics.requests,
290
+ requestsPerSecond: metrics.requests.requestsPerSecond.toFixed(2),
291
+ p50ResponseTime: `${metrics.requests.p50ResponseTime}ms`,
292
+ p95ResponseTime: `${metrics.requests.p95ResponseTime}ms`,
293
+ p99ResponseTime: `${metrics.requests.p99ResponseTime}ms`
294
+ };
295
+ }
296
+
297
+ if (category === 'cache' || category === 'all') {
298
+ result.cache = {
299
+ ...metrics.cache,
300
+ hitRate: `${(metrics.cache.hitRate * 100).toFixed(1)}%`,
301
+ memoryUsage: `${metrics.cache.memoryUsageMB.toFixed(1)}MB`,
302
+ efficiency: this.calculateCacheEfficiency(metrics.cache)
303
+ };
304
+ }
305
+
306
+ if (category === 'system' || category === 'all') {
307
+ result.system = {
308
+ ...metrics.system,
309
+ memoryUsage: `${metrics.system.memoryUsage}%`,
310
+ cpuUsage: `${metrics.system.cpuUsage}%`,
311
+ uptime: this.formatUptime(metrics.system.uptime)
312
+ };
313
+ }
314
+
315
+ if (category === 'tools' || category === 'all') {
316
+ result.tools = {
317
+ mostUsedTool: metrics.tools.mostUsedTool,
318
+ totalToolCalls: Object.values(metrics.tools.toolUsageCount).reduce((sum: number, count: any) => sum + count, 0),
319
+ topTools: Object.entries(metrics.tools.toolUsageCount)
320
+ .sort(([,a], [,b]) => (b as number) - (a as number))
321
+ .slice(0, 5)
322
+ .map(([tool, count]) => ({ tool, count })),
323
+ toolPerformance: format === 'detailed' ? metrics.tools.toolPerformance : undefined
324
+ };
325
+ }
326
+
327
+ // Add site-specific data if requested
328
+ if (siteMetrics && siteMetrics.isActive) {
329
+ result.siteSpecific = {
330
+ siteId: site,
331
+ cache: siteMetrics.cache,
332
+ client: siteMetrics.client
333
+ };
334
+ }
335
+
336
+ // Add metadata
337
+ result.metadata = {
338
+ timestamp: new Date().toISOString(),
339
+ category,
340
+ format,
341
+ site: site || 'all',
342
+ monitoringEnabled: true
343
+ };
344
+
345
+ return {
346
+ success: true,
347
+ data: result
348
+ };
349
+ });
350
+ }
351
+
352
+ /**
353
+ * Get historical performance data and trends
354
+ */
355
+ private async getPerformanceHistory(params: any): Promise<any> {
356
+ return toolWrapper(async () => {
357
+ const {
358
+ site,
359
+ timeframe = '24h',
360
+ metrics: requestedMetrics,
361
+ includeTrends = true
362
+ } = params;
363
+
364
+ // Convert timeframe to milliseconds
365
+ const timeframMs = this.parseTimeframe(timeframe);
366
+ const startTime = Date.now() - timeframMs;
367
+
368
+ // Get historical data
369
+ const historicalData = this.monitor.getHistoricalData(startTime);
370
+
371
+ // Analyze trends if requested
372
+ let trends = null;
373
+ if (includeTrends) {
374
+ // Add current data for trend analysis
375
+ this.analytics.addDataPoint(this.collector.collectCurrentMetrics());
376
+ trends = this.analytics.analyzeTrends();
377
+
378
+ // Filter trends by requested metrics
379
+ if (requestedMetrics && Array.isArray(requestedMetrics)) {
380
+ trends = trends.filter(trend => requestedMetrics.includes(trend.metric));
381
+ }
382
+ }
383
+
384
+ // Process historical data for charting
385
+ const chartData = this.processHistoricalDataForChart(historicalData, requestedMetrics);
386
+
387
+ return {
388
+ success: true,
389
+ data: {
390
+ timeframe,
391
+ dataPoints: historicalData.length,
392
+ historicalData: chartData,
393
+ trends: trends || [],
394
+ summary: {
395
+ averageResponseTime: this.calculateAverage(historicalData.map(d => d.requests.averageResponseTime)),
396
+ averageCacheHitRate: this.calculateAverage(historicalData.map(d => d.cache.hitRate)),
397
+ averageErrorRate: this.calculateAverage(historicalData.map(d =>
398
+ d.requests.total > 0 ? d.requests.failed / d.requests.total : 0
399
+ )),
400
+ totalRequests: historicalData.reduce((sum, d) => sum + d.requests.total, 0)
401
+ },
402
+ metadata: {
403
+ timestamp: new Date().toISOString(),
404
+ site: site || 'all',
405
+ requestedMetrics: requestedMetrics || ['all']
406
+ }
407
+ }
408
+ };
409
+ });
410
+ }
411
+
412
+ /**
413
+ * Get benchmark comparison
414
+ */
415
+ private async getBenchmarkComparison(params: any): Promise<any> {
416
+ return toolWrapper(async () => {
417
+ const { site, category = 'all', includeRecommendations = true } = params;
418
+
419
+ // Get benchmark comparisons
420
+ const benchmarks = this.analytics.benchmarkPerformance();
421
+
422
+ // Filter by category if specified
423
+ let filteredBenchmarks = benchmarks;
424
+ if (category !== 'all') {
425
+ const categoryMap: Record<string, string> = {
426
+ 'response_time': 'Response Time',
427
+ 'cache_performance': 'Cache Hit Rate',
428
+ 'error_rate': 'Error Rate',
429
+ 'system_resources': 'Memory Usage'
430
+ };
431
+ const targetCategory = categoryMap[category];
432
+ if (targetCategory) {
433
+ filteredBenchmarks = benchmarks.filter(b => b.category === targetCategory);
434
+ }
435
+ }
436
+
437
+ // Get recommendations if requested
438
+ let recommendations = null;
439
+ if (includeRecommendations) {
440
+ const insights = this.analytics.generateInsights();
441
+ recommendations = insights
442
+ .filter(insight => insight.category === 'optimization')
443
+ .map(insight => ({
444
+ title: insight.title,
445
+ description: insight.description,
446
+ priority: insight.priority,
447
+ estimatedImprovement: insight.estimatedImprovement,
448
+ implementationEffort: insight.implementationEffort
449
+ }));
450
+ }
451
+
452
+ return {
453
+ success: true,
454
+ data: {
455
+ benchmarks: filteredBenchmarks.map(benchmark => ({
456
+ ...benchmark,
457
+ status: this.formatBenchmarkStatus(benchmark.status),
458
+ improvement: benchmark.improvement > 0 ? {
459
+ needed: benchmark.improvement,
460
+ description: this.getBenchmarkImprovementDescription(benchmark)
461
+ } : null
462
+ })),
463
+ overallRanking: this.calculateOverallRanking(benchmarks),
464
+ recommendations: recommendations || [],
465
+ metadata: {
466
+ timestamp: new Date().toISOString(),
467
+ category,
468
+ site: site || 'all',
469
+ benchmarkVersion: '2024-industry-standards'
470
+ }
471
+ }
472
+ };
473
+ });
474
+ }
475
+
476
+ /**
477
+ * Get performance alerts and anomalies
478
+ */
479
+ private async getPerformanceAlerts(params: any): Promise<any> {
480
+ return toolWrapper(async () => {
481
+ const {
482
+ site,
483
+ severity,
484
+ category,
485
+ limit = 20,
486
+ includeAnomalies = true
487
+ } = params;
488
+
489
+ // Get alerts from monitor
490
+ let alerts = this.monitor.getAlerts(severity);
491
+
492
+ // Filter by category if specified
493
+ if (category) {
494
+ alerts = alerts.filter(alert => alert.category === category);
495
+ }
496
+
497
+ // Limit results
498
+ alerts = alerts.slice(-limit);
499
+
500
+ // Get anomalies if requested
501
+ let anomalies: any[] = [];
502
+ if (includeAnomalies) {
503
+ anomalies = this.analytics.getAnomalies(severity);
504
+ }
505
+
506
+ // Calculate alert summary
507
+ const alertSummary = {
508
+ total: alerts.length,
509
+ critical: alerts.filter(a => a.severity === 'critical').length,
510
+ error: alerts.filter(a => a.severity === 'error').length,
511
+ warning: alerts.filter(a => a.severity === 'warning').length,
512
+ info: alerts.filter(a => a.severity === 'info').length
513
+ };
514
+
515
+ const anomalySummary = {
516
+ total: anomalies.length,
517
+ critical: anomalies.filter(a => a.severity === 'critical').length,
518
+ major: anomalies.filter(a => a.severity === 'major').length,
519
+ moderate: anomalies.filter(a => a.severity === 'moderate').length,
520
+ minor: anomalies.filter(a => a.severity === 'minor').length
521
+ };
522
+
523
+ return {
524
+ success: true,
525
+ data: {
526
+ alerts: alerts.map(alert => ({
527
+ ...alert,
528
+ timestamp: new Date(alert.timestamp).toISOString(),
529
+ formattedMessage: this.formatAlertMessage(alert)
530
+ })),
531
+ anomalies: anomalies.map(anomaly => ({
532
+ ...anomaly,
533
+ timestamp: new Date(anomaly.timestamp).toISOString(),
534
+ formattedDescription: this.formatAnomalyDescription(anomaly)
535
+ })),
536
+ summary: {
537
+ alerts: alertSummary,
538
+ anomalies: anomalySummary,
539
+ overallStatus: this.calculateAlertStatus(alertSummary, anomalySummary)
540
+ },
541
+ metadata: {
542
+ timestamp: new Date().toISOString(),
543
+ filters: { severity, category, site: site || 'all' },
544
+ limit
545
+ }
546
+ }
547
+ };
548
+ });
549
+ }
550
+
551
+ /**
552
+ * Get optimization recommendations
553
+ */
554
+ private async getOptimizationRecommendations(params: any): Promise<any> {
555
+ return toolWrapper(async () => {
556
+ const {
557
+ site,
558
+ focus = 'speed',
559
+ priority = 'all',
560
+ includeROI = true,
561
+ includePredictions = true
562
+ } = params;
563
+
564
+ // Generate optimization plan
565
+ const optimizationPlan = this.analytics.generateOptimizationPlan();
566
+
567
+ // Filter by priority
568
+ let recommendations = [];
569
+ if (priority === 'quick_wins' || priority === 'all') {
570
+ recommendations.push(...optimizationPlan.quickWins.map(r => ({ ...r, timeline: 'quick_wins' })));
571
+ }
572
+ if (priority === 'medium_term' || priority === 'all') {
573
+ recommendations.push(...optimizationPlan.mediumTerm.map(r => ({ ...r, timeline: 'medium_term' })));
574
+ }
575
+ if (priority === 'long_term' || priority === 'all') {
576
+ recommendations.push(...optimizationPlan.longTerm.map(r => ({ ...r, timeline: 'long_term' })));
577
+ }
578
+
579
+ // Filter by focus area
580
+ if (focus !== 'speed') {
581
+ const focusMap: Record<string, string[]> = {
582
+ reliability: ['reliability'],
583
+ efficiency: ['cost', 'performance'],
584
+ scaling: ['performance', 'reliability']
585
+ };
586
+ const targetImpacts = focusMap[focus] || [];
587
+ recommendations = recommendations.filter(r => targetImpacts.includes(r.impact));
588
+ }
589
+
590
+ // Get predictions if requested
591
+ let predictions = null;
592
+ if (includePredictions) {
593
+ predictions = this.analytics.predictPerformance(60); // 1 hour prediction
594
+ }
595
+
596
+ return {
597
+ success: true,
598
+ data: {
599
+ recommendations: recommendations.map(rec => ({
600
+ ...rec,
601
+ formattedPriority: this.formatPriority(rec.priority),
602
+ formattedEffort: this.formatEffort(rec.implementationEffort)
603
+ })),
604
+ roi: includeROI ? optimizationPlan.estimatedROI : null,
605
+ predictions: predictions || null,
606
+ summary: {
607
+ totalRecommendations: recommendations.length,
608
+ quickWins: optimizationPlan.quickWins.length,
609
+ mediumTerm: optimizationPlan.mediumTerm.length,
610
+ longTerm: optimizationPlan.longTerm.length,
611
+ estimatedImpact: this.calculateEstimatedImpact(recommendations)
612
+ },
613
+ metadata: {
614
+ timestamp: new Date().toISOString(),
615
+ focus,
616
+ priority,
617
+ site: site || 'all'
618
+ }
619
+ }
620
+ };
621
+ });
622
+ }
623
+
624
+ /**
625
+ * Export comprehensive performance report
626
+ */
627
+ private async exportPerformanceReport(params: any): Promise<any> {
628
+ return toolWrapper(async () => {
629
+ const {
630
+ site,
631
+ format = 'json',
632
+ includeHistorical = true,
633
+ includeAnalytics = true,
634
+ timeRange = '24h'
635
+ } = params;
636
+
637
+ // Generate comprehensive analytics report
638
+ const report = this.analytics.exportAnalyticsReport();
639
+
640
+ // Add additional data based on parameters
641
+ const exportData: any = {
642
+ metadata: {
643
+ generatedAt: new Date().toISOString(),
644
+ site: site || 'all',
645
+ timeRange,
646
+ format,
647
+ version: '1.0.0'
648
+ },
649
+ summary: report.summary,
650
+ currentMetrics: this.collector.collectCurrentMetrics()
651
+ };
652
+
653
+ if (includeHistorical) {
654
+ const timeframMs = this.parseTimeframe(timeRange);
655
+ const startTime = Date.now() - timeframMs;
656
+ exportData.historicalData = this.monitor.getHistoricalData(startTime);
657
+ }
658
+
659
+ if (includeAnalytics) {
660
+ exportData.analytics = {
661
+ trends: report.trends,
662
+ benchmarks: report.benchmarks,
663
+ insights: report.insights,
664
+ anomalies: report.anomalies,
665
+ predictions: report.predictions,
666
+ optimizationPlan: report.optimizationPlan
667
+ };
668
+ }
669
+
670
+ // Add aggregated statistics
671
+ exportData.aggregatedStats = {
672
+ cache: this.collector.getAggregatedCacheStats(),
673
+ client: this.collector.getAggregatedClientStats()
674
+ };
675
+
676
+ // Add site comparison if multi-site
677
+ if (!site) {
678
+ exportData.siteComparison = this.collector.compareSitePerformance();
679
+ }
680
+
681
+ // Format output based on requested format
682
+ let formattedOutput: any;
683
+ if (format === 'csv') {
684
+ formattedOutput = this.convertToCSV(exportData);
685
+ } else if (format === 'summary') {
686
+ formattedOutput = this.createSummaryReport(exportData);
687
+ } else {
688
+ formattedOutput = exportData;
689
+ }
690
+
691
+ return {
692
+ success: true,
693
+ data: formattedOutput,
694
+ metadata: {
695
+ timestamp: new Date().toISOString(),
696
+ format,
697
+ dataSize: JSON.stringify(exportData).length,
698
+ site: site || 'all'
699
+ }
700
+ };
701
+ });
702
+ }
703
+
704
+ // Helper methods
705
+
706
+ private calculateHealthStatus(metrics: any): string {
707
+ let score = 100;
708
+
709
+ if (metrics.requests.averageResponseTime > 2000) score -= 30;
710
+ else if (metrics.requests.averageResponseTime > 1000) score -= 15;
711
+
712
+ const errorRate = metrics.requests.failed / Math.max(metrics.requests.total, 1);
713
+ if (errorRate > 0.05) score -= 30;
714
+ else if (errorRate > 0.02) score -= 15;
715
+
716
+ if (metrics.cache.hitRate < 0.7) score -= 25;
717
+ else if (metrics.cache.hitRate < 0.85) score -= 10;
718
+
719
+ if (metrics.system.memoryUsage > 85) score -= 15;
720
+
721
+ if (score >= 90) return 'Excellent';
722
+ if (score >= 75) return 'Good';
723
+ if (score >= 60) return 'Fair';
724
+ if (score >= 40) return 'Poor';
725
+ return 'Critical';
726
+ }
727
+
728
+ private calculatePerformanceScore(metrics: any): number {
729
+ let score = 100;
730
+
731
+ // Response time scoring
732
+ if (metrics.requests.averageResponseTime > 3000) score -= 40;
733
+ else if (metrics.requests.averageResponseTime > 1500) score -= 25;
734
+ else if (metrics.requests.averageResponseTime > 800) score -= 10;
735
+
736
+ // Error rate scoring
737
+ const errorRate = metrics.requests.failed / Math.max(metrics.requests.total, 1);
738
+ if (errorRate > 0.1) score -= 30;
739
+ else if (errorRate > 0.05) score -= 20;
740
+ else if (errorRate > 0.02) score -= 10;
741
+
742
+ // Cache performance scoring
743
+ if (metrics.cache.hitRate < 0.5) score -= 20;
744
+ else if (metrics.cache.hitRate < 0.75) score -= 10;
745
+ else if (metrics.cache.hitRate < 0.9) score -= 5;
746
+
747
+ // System resource scoring
748
+ if (metrics.system.memoryUsage > 90) score -= 10;
749
+ else if (metrics.system.memoryUsage > 80) score -= 5;
750
+
751
+ return Math.max(0, Math.min(100, score));
752
+ }
753
+
754
+ private calculateCacheEfficiency(cacheMetrics: any): string {
755
+ const efficiency = (cacheMetrics.hitRate * 100) +
756
+ (cacheMetrics.totalSize > 0 ? 10 : 0) -
757
+ (cacheMetrics.evictions > 100 ? 10 : 0);
758
+
759
+ if (efficiency >= 95) return 'Excellent';
760
+ if (efficiency >= 85) return 'Good';
761
+ if (efficiency >= 70) return 'Fair';
762
+ return 'Poor';
763
+ }
764
+
765
+ private formatUptime(uptimeMs: number): string {
766
+ const seconds = Math.floor(uptimeMs / 1000);
767
+ const minutes = Math.floor(seconds / 60);
768
+ const hours = Math.floor(minutes / 60);
769
+ const days = Math.floor(hours / 24);
770
+
771
+ if (days > 0) return `${days}d ${hours % 24}h ${minutes % 60}m`;
772
+ if (hours > 0) return `${hours}h ${minutes % 60}m`;
773
+ if (minutes > 0) return `${minutes}m ${seconds % 60}s`;
774
+ return `${seconds}s`;
775
+ }
776
+
777
+ private parseTimeframe(timeframe: string): number {
778
+ const map: Record<string, number> = {
779
+ '1h': 60 * 60 * 1000,
780
+ '6h': 6 * 60 * 60 * 1000,
781
+ '12h': 12 * 60 * 60 * 1000,
782
+ '24h': 24 * 60 * 60 * 1000,
783
+ '7d': 7 * 24 * 60 * 60 * 1000,
784
+ '30d': 30 * 24 * 60 * 60 * 1000
785
+ };
786
+ return map[timeframe] || map['24h'];
787
+ }
788
+
789
+ private processHistoricalDataForChart(data: any[], requestedMetrics?: string[]): any {
790
+ if (!data.length) return {};
791
+
792
+ const allMetrics = ['responseTime', 'cacheHitRate', 'errorRate', 'memoryUsage', 'requestVolume'];
793
+ const metricsToProcess = requestedMetrics || allMetrics;
794
+
795
+ const result: any = {};
796
+
797
+ for (const metric of metricsToProcess) {
798
+ result[metric] = data.map((point, index) => ({
799
+ timestamp: point.system.uptime,
800
+ value: this.extractMetricValue(point, metric),
801
+ index
802
+ }));
803
+ }
804
+
805
+ return result;
806
+ }
807
+
808
+ private extractMetricValue(dataPoint: any, metric: string): number {
809
+ switch (metric) {
810
+ case 'responseTime': return dataPoint.requests.averageResponseTime;
811
+ case 'cacheHitRate': return dataPoint.cache.hitRate * 100;
812
+ case 'errorRate': return (dataPoint.requests.failed / Math.max(dataPoint.requests.total, 1)) * 100;
813
+ case 'memoryUsage': return dataPoint.system.memoryUsage;
814
+ case 'requestVolume': return dataPoint.requests.requestsPerSecond;
815
+ default: return 0;
816
+ }
817
+ }
818
+
819
+ private calculateAverage(values: number[]): number {
820
+ if (values.length === 0) return 0;
821
+ return values.reduce((sum, val) => sum + val, 0) / values.length;
822
+ }
823
+
824
+ private formatBenchmarkStatus(status: string): string {
825
+ const statusMap: Record<string, string> = {
826
+ 'excellent': '🟢 Excellent',
827
+ 'good': '🟡 Good',
828
+ 'average': '🟠 Average',
829
+ 'below_average': '🔴 Below Average',
830
+ 'poor': '⚫ Poor'
831
+ };
832
+ return statusMap[status] || status;
833
+ }
834
+
835
+ private getBenchmarkImprovementDescription(benchmark: any): string {
836
+ const improvements: Record<string, string> = {
837
+ 'Response Time': `Reduce by ${benchmark.improvement.toFixed(0)}ms`,
838
+ 'Cache Hit Rate': `Increase by ${benchmark.improvement.toFixed(1)}%`,
839
+ 'Error Rate': `Reduce by ${benchmark.improvement.toFixed(2)}%`,
840
+ 'Memory Usage': `Reduce by ${benchmark.improvement.toFixed(0)}%`
841
+ };
842
+ return improvements[benchmark.category] || `Improve by ${benchmark.improvement}`;
843
+ }
844
+
845
+ private calculateOverallRanking(benchmarks: any[]): { percentile: number; status: string } {
846
+ const statuses = benchmarks.map(b => b.status);
847
+ const excellentCount = statuses.filter(s => s === 'excellent').length;
848
+ const goodCount = statuses.filter(s => s === 'good').length;
849
+
850
+ const percentile = ((excellentCount + goodCount * 0.8) / statuses.length) * 100;
851
+
852
+ let status = 'Needs Improvement';
853
+ if (percentile >= 90) status = 'Top Performer';
854
+ else if (percentile >= 75) status = 'Above Average';
855
+ else if (percentile >= 50) status = 'Average';
856
+
857
+ return { percentile: Math.round(percentile), status };
858
+ }
859
+
860
+ private formatAlertMessage(alert: any): string {
861
+ return `${alert.severity.toUpperCase()}: ${alert.message} (${alert.metric}: ${alert.actualValue} vs threshold: ${alert.threshold})`;
862
+ }
863
+
864
+ private formatAnomalyDescription(anomaly: any): string {
865
+ const direction = anomaly.actualValue > anomaly.expectedValue ? 'higher' : 'lower';
866
+ return `${anomaly.metric} is ${Math.abs(anomaly.deviation).toFixed(1)}% ${direction} than expected (${anomaly.expectedValue.toFixed(2)} vs ${anomaly.actualValue.toFixed(2)})`;
867
+ }
868
+
869
+ private calculateAlertStatus(alertSummary: any, anomalySummary: any): string {
870
+ const critical = alertSummary.critical + anomalySummary.critical;
871
+ const high = alertSummary.error + anomalySummary.major;
872
+
873
+ if (critical > 0) return 'Critical Issues Detected';
874
+ if (high > 2) return 'High Priority Issues';
875
+ if (alertSummary.warning + anomalySummary.moderate > 5) return 'Performance Warnings';
876
+ return 'System Healthy';
877
+ }
878
+
879
+ private formatPriority(priority: string): string {
880
+ const map: Record<string, string> = {
881
+ 'critical': '🔴 Critical',
882
+ 'high': '🟠 High',
883
+ 'medium': '🟡 Medium',
884
+ 'low': '🟢 Low'
885
+ };
886
+ return map[priority] || priority;
887
+ }
888
+
889
+ private formatEffort(effort: string): string {
890
+ const map: Record<string, string> = {
891
+ 'low': '⚡ Low Effort',
892
+ 'medium': '⚖️ Medium Effort',
893
+ 'high': '🏋️ High Effort'
894
+ };
895
+ return map[effort] || effort;
896
+ }
897
+
898
+ private calculateEstimatedImpact(recommendations: any[]): string {
899
+ const highImpact = recommendations.filter(r => ['critical', 'high'].includes(r.priority)).length;
900
+ const totalImpact = recommendations.length;
901
+
902
+ if (highImpact >= 3) return 'Significant Performance Gains Expected';
903
+ if (totalImpact >= 5) return 'Moderate Performance Improvements';
904
+ if (totalImpact > 0) return 'Minor Performance Optimizations';
905
+ return 'System Already Optimized';
906
+ }
907
+
908
+ private convertToCSV(data: any): string {
909
+ // Simplified CSV conversion for current metrics
910
+ const metrics = data.currentMetrics;
911
+ const csv = [
912
+ 'Metric,Value,Unit',
913
+ `Total Requests,${metrics.requests.total},count`,
914
+ `Average Response Time,${metrics.requests.averageResponseTime.toFixed(0)},ms`,
915
+ `Success Rate,${((metrics.requests.successful / Math.max(metrics.requests.total, 1)) * 100).toFixed(1)},%`,
916
+ `Cache Hit Rate,${(metrics.cache.hitRate * 100).toFixed(1)},%`,
917
+ `Cache Size,${metrics.cache.totalSize},entries`,
918
+ `Memory Usage,${metrics.system.memoryUsage},percent`,
919
+ `Uptime,${metrics.system.uptime},ms`
920
+ ];
921
+
922
+ return csv.join('\n');
923
+ }
924
+
925
+ private createSummaryReport(data: any): any {
926
+ const metrics = data.currentMetrics;
927
+ return {
928
+ summary: `Performance Report - ${new Date().toISOString()}`,
929
+ overallHealth: this.calculateHealthStatus(metrics),
930
+ keyMetrics: {
931
+ averageResponseTime: `${metrics.requests.averageResponseTime.toFixed(0)}ms`,
932
+ cacheEfficiency: `${(metrics.cache.hitRate * 100).toFixed(1)}%`,
933
+ systemLoad: `${metrics.system.memoryUsage}%`,
934
+ errorRate: `${((metrics.requests.failed / Math.max(metrics.requests.total, 1)) * 100).toFixed(2)}%`
935
+ },
936
+ recommendations: data.analytics?.insights?.slice(0, 3) || [],
937
+ nextSteps: 'Review detailed metrics and implement high-priority optimizations'
938
+ };
939
+ }
940
+
941
+ private startHistoricalDataCollection(): void {
942
+ // Collect metrics every 30 seconds for analytics
943
+ setInterval(() => {
944
+ const currentMetrics = this.collector.collectCurrentMetrics();
945
+ this.analytics.addDataPoint(currentMetrics);
946
+ }, 30000);
947
+ }
948
+ }