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