mcp-wordpress 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/README.md +210 -182
  2. package/dist/cache/CacheInvalidation.d.ts +3 -3
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -1
  4. package/dist/cache/CacheInvalidation.js +119 -119
  5. package/dist/cache/CacheInvalidation.js.map +1 -1
  6. package/dist/cache/CacheManager.d.ts +5 -0
  7. package/dist/cache/CacheManager.d.ts.map +1 -1
  8. package/dist/cache/CacheManager.js +26 -16
  9. package/dist/cache/CacheManager.js.map +1 -1
  10. package/dist/cache/HttpCacheWrapper.d.ts +1 -1
  11. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
  12. package/dist/cache/HttpCacheWrapper.js +29 -29
  13. package/dist/cache/HttpCacheWrapper.js.map +1 -1
  14. package/dist/cache/__tests__/CacheInvalidation.test.js +96 -94
  15. package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -1
  16. package/dist/cache/__tests__/CacheManager.test.js +113 -113
  17. package/dist/cache/__tests__/CacheManager.test.js.map +1 -1
  18. package/dist/cache/__tests__/CachedWordPressClient.test.js +102 -99
  19. package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -1
  20. package/dist/cache/__tests__/HttpCacheWrapper.test.js +98 -95
  21. package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -1
  22. package/dist/cache/index.d.ts +7 -7
  23. package/dist/cache/index.d.ts.map +1 -1
  24. package/dist/cache/index.js +4 -4
  25. package/dist/cache/index.js.map +1 -1
  26. package/dist/client/CachedWordPressClient.d.ts +4 -4
  27. package/dist/client/CachedWordPressClient.d.ts.map +1 -1
  28. package/dist/client/CachedWordPressClient.js +55 -51
  29. package/dist/client/CachedWordPressClient.js.map +1 -1
  30. package/dist/client/api.d.ts +10 -10
  31. package/dist/client/api.js +158 -158
  32. package/dist/client/api.js.map +1 -1
  33. package/dist/client/auth.d.ts +2 -2
  34. package/dist/client/auth.js +72 -72
  35. package/dist/client/managers/AuthenticationManager.d.ts +2 -2
  36. package/dist/client/managers/AuthenticationManager.js +46 -46
  37. package/dist/client/managers/BaseManager.d.ts +1 -1
  38. package/dist/client/managers/BaseManager.js +9 -9
  39. package/dist/client/managers/RequestManager.d.ts +5 -3
  40. package/dist/client/managers/RequestManager.d.ts.map +1 -1
  41. package/dist/client/managers/RequestManager.js +39 -19
  42. package/dist/client/managers/RequestManager.js.map +1 -1
  43. package/dist/client/managers/index.d.ts +3 -3
  44. package/dist/client/managers/index.js +3 -3
  45. package/dist/config/ConfigurationSchema.d.ts +2 -2
  46. package/dist/config/ConfigurationSchema.d.ts.map +1 -1
  47. package/dist/config/ConfigurationSchema.js +40 -40
  48. package/dist/config/ConfigurationSchema.js.map +1 -1
  49. package/dist/config/ServerConfiguration.d.ts +2 -2
  50. package/dist/config/ServerConfiguration.js +35 -35
  51. package/dist/config/ServerConfiguration.js.map +1 -1
  52. package/dist/docs/DocumentationGenerator.d.ts.map +1 -1
  53. package/dist/docs/DocumentationGenerator.js +296 -255
  54. package/dist/docs/DocumentationGenerator.js.map +1 -1
  55. package/dist/docs/MarkdownFormatter.d.ts +1 -1
  56. package/dist/docs/MarkdownFormatter.d.ts.map +1 -1
  57. package/dist/docs/MarkdownFormatter.js +60 -51
  58. package/dist/docs/MarkdownFormatter.js.map +1 -1
  59. package/dist/docs/index.d.ts +3 -3
  60. package/dist/docs/index.d.ts.map +1 -1
  61. package/dist/docs/index.js +2 -2
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +16 -16
  64. package/dist/index.js.map +1 -1
  65. package/dist/mcp-wordpress-1.3.0.tgz +0 -0
  66. package/dist/performance/MetricsCollector.d.ts +3 -3
  67. package/dist/performance/MetricsCollector.d.ts.map +1 -1
  68. package/dist/performance/MetricsCollector.js +33 -27
  69. package/dist/performance/MetricsCollector.js.map +1 -1
  70. package/dist/performance/PerformanceAnalytics.d.ts +12 -12
  71. package/dist/performance/PerformanceAnalytics.d.ts.map +1 -1
  72. package/dist/performance/PerformanceAnalytics.js +200 -154
  73. package/dist/performance/PerformanceAnalytics.js.map +1 -1
  74. package/dist/performance/PerformanceMonitor.d.ts +5 -5
  75. package/dist/performance/PerformanceMonitor.d.ts.map +1 -1
  76. package/dist/performance/PerformanceMonitor.js +53 -52
  77. package/dist/performance/PerformanceMonitor.js.map +1 -1
  78. package/dist/performance/index.d.ts +6 -6
  79. package/dist/performance/index.d.ts.map +1 -1
  80. package/dist/performance/index.js +3 -3
  81. package/dist/security/InputValidator.d.ts +1 -1
  82. package/dist/security/InputValidator.d.ts.map +1 -1
  83. package/dist/security/InputValidator.js +111 -88
  84. package/dist/security/InputValidator.js.map +1 -1
  85. package/dist/security/SecurityConfig.d.ts +5 -5
  86. package/dist/security/SecurityConfig.js +92 -92
  87. package/dist/security/SecurityConfig.js.map +1 -1
  88. package/dist/server/ConnectionTester.d.ts +1 -1
  89. package/dist/server/ConnectionTester.d.ts.map +1 -1
  90. package/dist/server/ConnectionTester.js +4 -4
  91. package/dist/server/ConnectionTester.js.map +1 -1
  92. package/dist/server/ToolRegistry.d.ts +2 -2
  93. package/dist/server/ToolRegistry.d.ts.map +1 -1
  94. package/dist/server/ToolRegistry.js +35 -32
  95. package/dist/server/ToolRegistry.js.map +1 -1
  96. package/dist/server.d.ts +2 -2
  97. package/dist/server.js +2 -2
  98. package/dist/tools/BaseToolManager.js +5 -5
  99. package/dist/tools/auth.d.ts +2 -2
  100. package/dist/tools/auth.d.ts.map +1 -1
  101. package/dist/tools/auth.js +32 -31
  102. package/dist/tools/auth.js.map +1 -1
  103. package/dist/tools/cache.d.ts +1 -1
  104. package/dist/tools/cache.d.ts.map +1 -1
  105. package/dist/tools/cache.js +71 -71
  106. package/dist/tools/cache.js.map +1 -1
  107. package/dist/tools/comments.d.ts +2 -2
  108. package/dist/tools/comments.d.ts.map +1 -1
  109. package/dist/tools/comments.js +79 -79
  110. package/dist/tools/comments.js.map +1 -1
  111. package/dist/tools/index.d.ts +10 -10
  112. package/dist/tools/index.js +10 -10
  113. package/dist/tools/media.d.ts +2 -2
  114. package/dist/tools/media.js +80 -80
  115. package/dist/tools/pages.d.ts +2 -2
  116. package/dist/tools/pages.d.ts.map +1 -1
  117. package/dist/tools/pages.js +75 -75
  118. package/dist/tools/pages.js.map +1 -1
  119. package/dist/tools/performance.d.ts +1 -1
  120. package/dist/tools/performance.d.ts.map +1 -1
  121. package/dist/tools/performance.js +311 -287
  122. package/dist/tools/performance.js.map +1 -1
  123. package/dist/tools/posts.d.ts +2 -2
  124. package/dist/tools/posts.d.ts.map +1 -1
  125. package/dist/tools/posts.js +94 -94
  126. package/dist/tools/posts.js.map +1 -1
  127. package/dist/tools/site.d.ts +2 -2
  128. package/dist/tools/site.d.ts.map +1 -1
  129. package/dist/tools/site.js +60 -60
  130. package/dist/tools/site.js.map +1 -1
  131. package/dist/tools/taxonomies.d.ts +2 -2
  132. package/dist/tools/taxonomies.js +89 -89
  133. package/dist/tools/users.d.ts +2 -2
  134. package/dist/tools/users.js +68 -68
  135. package/dist/tools/users.js.map +1 -1
  136. package/dist/types/client.d.ts +13 -13
  137. package/dist/types/client.d.ts.map +1 -1
  138. package/dist/types/client.js +12 -12
  139. package/dist/types/client.js.map +1 -1
  140. package/dist/types/index.d.ts +19 -19
  141. package/dist/types/index.d.ts.map +1 -1
  142. package/dist/types/index.js +3 -3
  143. package/dist/types/mcp.d.ts +7 -7
  144. package/dist/types/wordpress.d.ts +21 -21
  145. package/dist/types/wordpress.d.ts.map +1 -1
  146. package/dist/utils/debug.d.ts +2 -2
  147. package/dist/utils/debug.js +28 -28
  148. package/dist/utils/error.d.ts.map +1 -1
  149. package/dist/utils/error.js +13 -13
  150. package/dist/utils/error.js.map +1 -1
  151. package/dist/utils/toolWrapper.d.ts.map +1 -1
  152. package/dist/utils/toolWrapper.js +5 -5
  153. package/dist/utils/toolWrapper.js.map +1 -1
  154. package/dist/utils/validation.d.ts.map +1 -1
  155. package/dist/utils/validation.js +41 -31
  156. package/dist/utils/validation.js.map +1 -1
  157. package/docs/CACHING.md +36 -2
  158. package/docs/DOCKER.md +24 -18
  159. package/docs/PERFORMANCE_MONITORING.md +49 -1
  160. package/docs/SECURITY_TESTING.md +30 -1
  161. package/docs/api/README.md +9 -1
  162. package/docs/api/summary.json +1 -1
  163. package/docs/contract-testing.md +24 -3
  164. package/docs/developer/GITHUB_ACTIONS_SETUP.md +8 -2
  165. package/docs/developer/MAINTENANCE.md +29 -3
  166. package/docs/developer/MIGRATION_GUIDE.md +13 -1
  167. package/docs/developer/NPM_AUTH_SETUP.md +13 -2
  168. package/docs/developer/REFACTORING.md +31 -1
  169. package/docs/releases/COMMUNITY_ANNOUNCEMENT_v1.1.2.md +18 -7
  170. package/docs/releases/RELEASE_NOTES_v1.1.2.md +31 -5
  171. package/docs/user-guides/DOCKER_SETUP.md +264 -0
  172. package/docs/user-guides/DTX_SETUP.md +327 -0
  173. package/docs/user-guides/NPM_SETUP.md +109 -0
  174. package/docs/user-guides/NPX_SETUP.md +281 -0
  175. package/docs/wordpress-rest-api-authentication-troubleshooting.md +13 -2
  176. package/package.json +27 -8
  177. package/src/cache/CacheInvalidation.ts +140 -132
  178. package/src/cache/CacheManager.ts +40 -29
  179. package/src/cache/HttpCacheWrapper.ts +105 -68
  180. package/src/cache/__tests__/CacheInvalidation.test.ts +123 -118
  181. package/src/cache/__tests__/CacheManager.test.ts +156 -152
  182. package/src/cache/__tests__/CachedWordPressClient.test.ts +131 -116
  183. package/src/cache/__tests__/HttpCacheWrapper.test.ts +118 -115
  184. package/src/cache/index.ts +13 -13
  185. package/src/client/CachedWordPressClient.ts +90 -80
  186. package/src/client/api.ts +205 -205
  187. package/src/client/auth.ts +80 -80
  188. package/src/client/managers/AuthenticationManager.ts +61 -61
  189. package/src/client/managers/BaseManager.ts +11 -11
  190. package/src/client/managers/RequestManager.ts +79 -47
  191. package/src/client/managers/index.ts +3 -3
  192. package/src/config/ConfigurationSchema.ts +44 -44
  193. package/src/config/ServerConfiguration.ts +39 -39
  194. package/src/docs/DocumentationGenerator.ts +402 -295
  195. package/src/docs/MarkdownFormatter.ts +94 -69
  196. package/src/docs/index.ts +4 -4
  197. package/src/index.ts +24 -21
  198. package/src/performance/MetricsCollector.ts +90 -58
  199. package/src/performance/PerformanceAnalytics.ts +386 -262
  200. package/src/performance/PerformanceMonitor.ts +152 -118
  201. package/src/performance/index.ts +9 -9
  202. package/src/security/InputValidator.ts +148 -91
  203. package/src/security/SecurityConfig.ts +94 -94
  204. package/src/server/ConnectionTester.ts +21 -15
  205. package/src/server/ToolRegistry.ts +64 -51
  206. package/src/server.ts +2 -2
  207. package/src/tools/BaseToolManager.ts +6 -6
  208. package/src/tools/auth.ts +42 -37
  209. package/src/tools/cache.ts +85 -81
  210. package/src/tools/comments.ts +93 -91
  211. package/src/tools/index.ts +10 -10
  212. package/src/tools/media.ts +89 -89
  213. package/src/tools/pages.ts +89 -87
  214. package/src/tools/performance.ts +443 -352
  215. package/src/tools/posts.ts +109 -107
  216. package/src/tools/site.ts +86 -77
  217. package/src/tools/taxonomies.ts +102 -102
  218. package/src/tools/users.ts +77 -77
  219. package/src/types/client.ts +157 -60
  220. package/src/types/index.ts +49 -27
  221. package/src/types/mcp.ts +15 -15
  222. package/src/types/wordpress.ts +57 -29
  223. package/src/utils/debug.ts +37 -37
  224. package/src/utils/error.ts +47 -25
  225. package/src/utils/toolWrapper.ts +12 -8
  226. package/src/utils/validation.ts +116 -65
  227. package/dist/client/WordPressClient.d.ts +0 -81
  228. package/dist/client/WordPressClient.d.ts.map +0 -1
  229. package/dist/client/WordPressClient.js +0 -354
  230. package/dist/client/WordPressClient.js.map +0 -1
  231. package/dist/performance/AnomalyDetector.d.ts +0 -63
  232. package/dist/performance/AnomalyDetector.d.ts.map +0 -1
  233. package/dist/performance/AnomalyDetector.js +0 -222
  234. package/dist/performance/AnomalyDetector.js.map +0 -1
  235. package/dist/performance/BenchmarkAnalyzer.d.ts +0 -67
  236. package/dist/performance/BenchmarkAnalyzer.d.ts.map +0 -1
  237. package/dist/performance/BenchmarkAnalyzer.js +0 -301
  238. package/dist/performance/BenchmarkAnalyzer.js.map +0 -1
  239. package/dist/performance/TrendAnalyzer.d.ts +0 -69
  240. package/dist/performance/TrendAnalyzer.d.ts.map +0 -1
  241. package/dist/performance/TrendAnalyzer.js +0 -203
  242. package/dist/performance/TrendAnalyzer.js.map +0 -1
  243. package/dist/tools/BaseToolClass.d.ts +0 -76
  244. package/dist/tools/BaseToolClass.d.ts.map +0 -1
  245. package/dist/tools/BaseToolClass.js +0 -104
  246. package/dist/tools/BaseToolClass.js.map +0 -1
  247. package/dist/tools/base.d.ts +0 -37
  248. package/dist/tools/base.d.ts.map +0 -1
  249. package/dist/tools/base.js +0 -60
  250. package/dist/tools/base.js.map +0 -1
  251. package/docs/user-guides/CLAUDE_DESKTOP_SETUP.md +0 -187
@@ -3,20 +3,20 @@
3
3
  * Provides insights, predictions, and optimization recommendations
4
4
  */
5
5
 
6
- import { PerformanceMetrics } from './PerformanceMonitor.js';
7
- import { MetricsCollector } from './MetricsCollector.js';
6
+ import { PerformanceMetrics } from "./PerformanceMonitor.js";
7
+ import { MetricsCollector } from "./MetricsCollector.js";
8
8
 
9
9
  export interface AnalyticsConfig {
10
10
  enablePredictiveAnalysis: boolean;
11
11
  enableAnomalyDetection: boolean;
12
12
  enableTrendAnalysis: boolean;
13
13
  lookbackPeriod: number; // in milliseconds
14
- sensitivityLevel: 'low' | 'medium' | 'high';
14
+ sensitivityLevel: "low" | "medium" | "high";
15
15
  }
16
16
 
17
17
  export interface PerformanceTrend {
18
18
  metric: string;
19
- direction: 'improving' | 'declining' | 'stable';
19
+ direction: "improving" | "declining" | "stable";
20
20
  changeRate: number; // percentage change
21
21
  confidence: number; // 0-1
22
22
  prediction: {
@@ -32,20 +32,20 @@ export interface PerformanceAnomaly {
32
32
  expectedValue: number;
33
33
  actualValue: number;
34
34
  deviation: number; // percentage
35
- severity: 'minor' | 'moderate' | 'major' | 'critical';
35
+ severity: "minor" | "moderate" | "major" | "critical";
36
36
  possibleCauses: string[];
37
37
  }
38
38
 
39
39
  export interface PerformanceInsight {
40
40
  id: string;
41
- category: 'optimization' | 'scaling' | 'maintenance' | 'alert';
42
- priority: 'low' | 'medium' | 'high' | 'critical';
41
+ category: "optimization" | "scaling" | "maintenance" | "alert";
42
+ priority: "low" | "medium" | "high" | "critical";
43
43
  title: string;
44
44
  description: string;
45
- impact: 'performance' | 'reliability' | 'cost' | 'user_experience';
45
+ impact: "performance" | "reliability" | "cost" | "user_experience";
46
46
  recommendation: string;
47
47
  estimatedImprovement: string;
48
- implementationEffort: 'low' | 'medium' | 'high';
48
+ implementationEffort: "low" | "medium" | "high";
49
49
  relatedMetrics: string[];
50
50
  }
51
51
 
@@ -54,7 +54,7 @@ export interface BenchmarkComparison {
54
54
  currentValue: number;
55
55
  benchmarkValue: number;
56
56
  percentile: number; // Where current performance ranks (0-100)
57
- status: 'excellent' | 'good' | 'average' | 'below_average' | 'poor';
57
+ status: "excellent" | "good" | "average" | "below_average" | "poor";
58
58
  improvement: number; // How much improvement needed to reach next tier
59
59
  }
60
60
 
@@ -71,44 +71,47 @@ export class PerformanceAnalytics {
71
71
  // Performance benchmarks (based on industry standards)
72
72
  private benchmarks = {
73
73
  responseTime: {
74
- excellent: 200, // <200ms
75
- good: 500, // 200-500ms
76
- average: 1000, // 500ms-1s
74
+ excellent: 200, // <200ms
75
+ good: 500, // 200-500ms
76
+ average: 1000, // 500ms-1s
77
77
  below_average: 2000, // 1-2s
78
- poor: Infinity // >2s
78
+ poor: Infinity, // >2s
79
79
  },
80
80
  cacheHitRate: {
81
- excellent: 0.95, // >95%
82
- good: 0.85, // 85-95%
83
- average: 0.70, // 70-85%
84
- below_average: 0.50, // 50-70%
85
- poor: 0 // <50%
81
+ excellent: 0.95, // >95%
82
+ good: 0.85, // 85-95%
83
+ average: 0.7, // 70-85%
84
+ below_average: 0.5, // 50-70%
85
+ poor: 0, // <50%
86
86
  },
87
87
  errorRate: {
88
88
  excellent: 0.001, // <0.1%
89
- good: 0.01, // 0.1-1%
90
- average: 0.02, // 1-2%
89
+ good: 0.01, // 0.1-1%
90
+ average: 0.02, // 1-2%
91
91
  below_average: 0.05, // 2-5%
92
- poor: Infinity // >5%
92
+ poor: Infinity, // >5%
93
93
  },
94
94
  memoryUsage: {
95
- excellent: 50, // <50%
96
- good: 70, // 50-70%
97
- average: 80, // 70-80%
95
+ excellent: 50, // <50%
96
+ good: 70, // 50-70%
97
+ average: 80, // 70-80%
98
98
  below_average: 90, // 80-90%
99
- poor: 100 // >90%
100
- }
99
+ poor: 100, // >90%
100
+ },
101
101
  };
102
102
 
103
- constructor(collector: MetricsCollector, config: Partial<AnalyticsConfig> = {}) {
103
+ constructor(
104
+ collector: MetricsCollector,
105
+ config: Partial<AnalyticsConfig> = {},
106
+ ) {
104
107
  this.collector = collector;
105
108
  this.config = {
106
109
  enablePredictiveAnalysis: true,
107
110
  enableAnomalyDetection: true,
108
111
  enableTrendAnalysis: true,
109
112
  lookbackPeriod: 24 * 60 * 60 * 1000, // 24 hours
110
- sensitivityLevel: 'medium',
111
- ...config
113
+ sensitivityLevel: "medium",
114
+ ...config,
112
115
  };
113
116
  }
114
117
 
@@ -117,11 +120,11 @@ export class PerformanceAnalytics {
117
120
  */
118
121
  addDataPoint(metrics: PerformanceMetrics): void {
119
122
  this.historicalData.push(metrics);
120
-
123
+
121
124
  // Limit historical data to lookback period
122
125
  const cutoff = Date.now() - this.config.lookbackPeriod;
123
126
  this.historicalData = this.historicalData.filter(
124
- data => data.system.uptime > cutoff
127
+ (data) => data.system.uptime > cutoff,
125
128
  );
126
129
 
127
130
  // Run analysis on new data
@@ -139,38 +142,48 @@ export class PerformanceAnalytics {
139
142
  }
140
143
 
141
144
  const trends: PerformanceTrend[] = [];
142
-
145
+
143
146
  // Analyze response time trend
144
- trends.push(this.analyzeTrend(
145
- 'responseTime',
146
- this.historicalData.map(d => d.requests.averageResponseTime)
147
- ));
147
+ trends.push(
148
+ this.analyzeTrend(
149
+ "responseTime",
150
+ this.historicalData.map((d) => d.requests.averageResponseTime),
151
+ ),
152
+ );
148
153
 
149
154
  // Analyze cache hit rate trend
150
- trends.push(this.analyzeTrend(
151
- 'cacheHitRate',
152
- this.historicalData.map(d => d.cache.hitRate)
153
- ));
155
+ trends.push(
156
+ this.analyzeTrend(
157
+ "cacheHitRate",
158
+ this.historicalData.map((d) => d.cache.hitRate),
159
+ ),
160
+ );
154
161
 
155
162
  // Analyze error rate trend
156
- trends.push(this.analyzeTrend(
157
- 'errorRate',
158
- this.historicalData.map(d =>
159
- d.requests.total > 0 ? d.requests.failed / d.requests.total : 0
160
- )
161
- ));
163
+ trends.push(
164
+ this.analyzeTrend(
165
+ "errorRate",
166
+ this.historicalData.map((d) =>
167
+ d.requests.total > 0 ? d.requests.failed / d.requests.total : 0,
168
+ ),
169
+ ),
170
+ );
162
171
 
163
172
  // Analyze memory usage trend
164
- trends.push(this.analyzeTrend(
165
- 'memoryUsage',
166
- this.historicalData.map(d => d.system.memoryUsage)
167
- ));
173
+ trends.push(
174
+ this.analyzeTrend(
175
+ "memoryUsage",
176
+ this.historicalData.map((d) => d.system.memoryUsage),
177
+ ),
178
+ );
168
179
 
169
180
  // Analyze request volume trend
170
- trends.push(this.analyzeTrend(
171
- 'requestVolume',
172
- this.historicalData.map(d => d.requests.requestsPerSecond)
173
- ));
181
+ trends.push(
182
+ this.analyzeTrend(
183
+ "requestVolume",
184
+ this.historicalData.map((d) => d.requests.requestsPerSecond),
185
+ ),
186
+ );
174
187
 
175
188
  return trends;
176
189
  }
@@ -186,48 +199,51 @@ export class PerformanceAnalytics {
186
199
  // Cache optimization insights
187
200
  if (currentMetrics.cache.hitRate < 0.8) {
188
201
  insights.push({
189
- id: 'cache-optimization-1',
190
- category: 'optimization',
191
- priority: 'high',
192
- title: 'Improve Cache Hit Rate',
202
+ id: "cache-optimization-1",
203
+ category: "optimization",
204
+ priority: "high",
205
+ title: "Improve Cache Hit Rate",
193
206
  description: `Current cache hit rate is ${(currentMetrics.cache.hitRate * 100).toFixed(1)}%, which is below optimal performance.`,
194
- impact: 'performance',
195
- recommendation: 'Implement cache warming strategies and optimize TTL values for frequently accessed data.',
196
- estimatedImprovement: '20-40% reduction in response times',
197
- implementationEffort: 'medium',
198
- relatedMetrics: ['cacheHitRate', 'responseTime']
207
+ impact: "performance",
208
+ recommendation:
209
+ "Implement cache warming strategies and optimize TTL values for frequently accessed data.",
210
+ estimatedImprovement: "20-40% reduction in response times",
211
+ implementationEffort: "medium",
212
+ relatedMetrics: ["cacheHitRate", "responseTime"],
199
213
  });
200
214
  }
201
215
 
202
216
  // Response time insights
203
217
  if (currentMetrics.requests.averageResponseTime > 1000) {
204
218
  insights.push({
205
- id: 'response-time-1',
206
- category: 'optimization',
207
- priority: 'high',
208
- title: 'Reduce Response Times',
219
+ id: "response-time-1",
220
+ category: "optimization",
221
+ priority: "high",
222
+ title: "Reduce Response Times",
209
223
  description: `Average response time of ${currentMetrics.requests.averageResponseTime.toFixed(0)}ms is above recommended threshold.`,
210
- impact: 'user_experience',
211
- recommendation: 'Enable aggressive caching, optimize database queries, or consider upgrading server resources.',
212
- estimatedImprovement: '50-70% reduction in response times',
213
- implementationEffort: 'medium',
214
- relatedMetrics: ['responseTime', 'cacheHitRate']
224
+ impact: "user_experience",
225
+ recommendation:
226
+ "Enable aggressive caching, optimize database queries, or consider upgrading server resources.",
227
+ estimatedImprovement: "50-70% reduction in response times",
228
+ implementationEffort: "medium",
229
+ relatedMetrics: ["responseTime", "cacheHitRate"],
215
230
  });
216
231
  }
217
232
 
218
233
  // Memory usage insights
219
234
  if (currentMetrics.system.memoryUsage > 80) {
220
235
  insights.push({
221
- id: 'memory-usage-1',
222
- category: 'scaling',
223
- priority: 'medium',
224
- title: 'Memory Usage Optimization',
236
+ id: "memory-usage-1",
237
+ category: "scaling",
238
+ priority: "medium",
239
+ title: "Memory Usage Optimization",
225
240
  description: `Memory usage at ${currentMetrics.system.memoryUsage}% is approaching limits.`,
226
- impact: 'reliability',
227
- recommendation: 'Increase cache size limits, implement cache eviction policies, or scale server resources.',
228
- estimatedImprovement: 'Improved system stability',
229
- implementationEffort: 'low',
230
- relatedMetrics: ['memoryUsage', 'cacheSize']
241
+ impact: "reliability",
242
+ recommendation:
243
+ "Increase cache size limits, implement cache eviction policies, or scale server resources.",
244
+ estimatedImprovement: "Improved system stability",
245
+ implementationEffort: "low",
246
+ relatedMetrics: ["memoryUsage", "cacheSize"],
231
247
  });
232
248
  }
233
249
 
@@ -235,37 +251,43 @@ export class PerformanceAnalytics {
235
251
  const toolMetrics = currentMetrics.tools;
236
252
  if (Object.keys(toolMetrics.toolUsageCount).length > 0) {
237
253
  const mostUsed = Object.entries(toolMetrics.toolUsageCount)
238
- .sort(([,a], [,b]) => b - a)
254
+ .sort(([, a], [, b]) => b - a)
239
255
  .slice(0, 3);
240
256
 
241
257
  insights.push({
242
- id: 'tool-usage-1',
243
- category: 'optimization',
244
- priority: 'low',
245
- title: 'Optimize Frequently Used Tools',
246
- description: `Most used tools: ${mostUsed.map(([tool]) => tool).join(', ')}. Consider optimizing these workflows.`,
247
- impact: 'performance',
248
- recommendation: 'Create cached workflows or batch operations for frequently used tools.',
249
- estimatedImprovement: '10-20% reduction in API calls',
250
- implementationEffort: 'high',
251
- relatedMetrics: ['toolUsage', 'requestVolume']
258
+ id: "tool-usage-1",
259
+ category: "optimization",
260
+ priority: "low",
261
+ title: "Optimize Frequently Used Tools",
262
+ description: `Most used tools: ${mostUsed.map(([tool]) => tool).join(", ")}. Consider optimizing these workflows.`,
263
+ impact: "performance",
264
+ recommendation:
265
+ "Create cached workflows or batch operations for frequently used tools.",
266
+ estimatedImprovement: "10-20% reduction in API calls",
267
+ implementationEffort: "high",
268
+ relatedMetrics: ["toolUsage", "requestVolume"],
252
269
  });
253
270
  }
254
271
 
255
272
  // Trend-based insights
256
- const responseTimeTrend = trends.find(t => t.metric === 'responseTime');
257
- if (responseTimeTrend && responseTimeTrend.direction === 'declining' && responseTimeTrend.changeRate > 10) {
273
+ const responseTimeTrend = trends.find((t) => t.metric === "responseTime");
274
+ if (
275
+ responseTimeTrend &&
276
+ responseTimeTrend.direction === "declining" &&
277
+ responseTimeTrend.changeRate > 10
278
+ ) {
258
279
  insights.push({
259
- id: 'trend-response-time-1',
260
- category: 'alert',
261
- priority: 'high',
262
- title: 'Response Time Degradation Detected',
280
+ id: "trend-response-time-1",
281
+ category: "alert",
282
+ priority: "high",
283
+ title: "Response Time Degradation Detected",
263
284
  description: `Response times are declining at ${responseTimeTrend.changeRate.toFixed(1)}% rate.`,
264
- impact: 'performance',
265
- recommendation: 'Investigate recent changes, check WordPress site health, and monitor resource usage.',
266
- estimatedImprovement: 'Prevent further degradation',
267
- implementationEffort: 'medium',
268
- relatedMetrics: ['responseTime', 'errorRate']
285
+ impact: "performance",
286
+ recommendation:
287
+ "Investigate recent changes, check WordPress site health, and monitor resource usage.",
288
+ estimatedImprovement: "Prevent further degradation",
289
+ implementationEffort: "medium",
290
+ relatedMetrics: ["responseTime", "errorRate"],
269
291
  });
270
292
  }
271
293
 
@@ -281,43 +303,58 @@ export class PerformanceAnalytics {
281
303
  const comparisons: BenchmarkComparison[] = [];
282
304
 
283
305
  // Response time benchmark
284
- comparisons.push(this.createBenchmarkComparison(
285
- 'Response Time',
286
- currentMetrics.requests.averageResponseTime,
287
- this.benchmarks.responseTime,
288
- false // lower is better
289
- ));
306
+ comparisons.push(
307
+ this.createBenchmarkComparison(
308
+ "Response Time",
309
+ currentMetrics.requests.averageResponseTime,
310
+ this.benchmarks.responseTime,
311
+ false, // lower is better
312
+ ),
313
+ );
290
314
 
291
315
  // Cache hit rate benchmark
292
- comparisons.push(this.createBenchmarkComparison(
293
- 'Cache Hit Rate',
294
- currentMetrics.cache.hitRate * 100,
295
- Object.fromEntries(
296
- Object.entries(this.benchmarks.cacheHitRate).map(([k, v]) => [k, v * 100])
316
+ comparisons.push(
317
+ this.createBenchmarkComparison(
318
+ "Cache Hit Rate",
319
+ currentMetrics.cache.hitRate * 100,
320
+ Object.fromEntries(
321
+ Object.entries(this.benchmarks.cacheHitRate).map(([k, v]) => [
322
+ k,
323
+ v * 100,
324
+ ]),
325
+ ),
326
+ true, // higher is better
297
327
  ),
298
- true // higher is better
299
- ));
328
+ );
300
329
 
301
330
  // Error rate benchmark
302
- const errorRate = currentMetrics.requests.total > 0
303
- ? (currentMetrics.requests.failed / currentMetrics.requests.total) * 100
304
- : 0;
305
- comparisons.push(this.createBenchmarkComparison(
306
- 'Error Rate',
307
- errorRate,
308
- Object.fromEntries(
309
- Object.entries(this.benchmarks.errorRate).map(([k, v]) => [k, v * 100])
331
+ const errorRate =
332
+ currentMetrics.requests.total > 0
333
+ ? (currentMetrics.requests.failed / currentMetrics.requests.total) * 100
334
+ : 0;
335
+ comparisons.push(
336
+ this.createBenchmarkComparison(
337
+ "Error Rate",
338
+ errorRate,
339
+ Object.fromEntries(
340
+ Object.entries(this.benchmarks.errorRate).map(([k, v]) => [
341
+ k,
342
+ v * 100,
343
+ ]),
344
+ ),
345
+ false, // lower is better
310
346
  ),
311
- false // lower is better
312
- ));
347
+ );
313
348
 
314
349
  // Memory usage benchmark
315
- comparisons.push(this.createBenchmarkComparison(
316
- 'Memory Usage',
317
- currentMetrics.system.memoryUsage,
318
- this.benchmarks.memoryUsage,
319
- false // lower is better
320
- ));
350
+ comparisons.push(
351
+ this.createBenchmarkComparison(
352
+ "Memory Usage",
353
+ currentMetrics.system.memoryUsage,
354
+ this.benchmarks.memoryUsage,
355
+ false, // lower is better
356
+ ),
357
+ );
321
358
 
322
359
  return comparisons;
323
360
  }
@@ -331,7 +368,7 @@ export class PerformanceAnalytics {
331
368
  currentValue: number;
332
369
  predictedValue: number;
333
370
  confidence: number;
334
- trend: 'improving' | 'declining' | 'stable';
371
+ trend: "improving" | "declining" | "stable";
335
372
  }>;
336
373
  alerts: string[];
337
374
  } {
@@ -346,26 +383,44 @@ export class PerformanceAnalytics {
346
383
  for (const trend of trends) {
347
384
  const _timeframeMs = timeframeMinutes * 60 * 1000;
348
385
  const predictedValue = trend.prediction.nextValue;
349
-
386
+
350
387
  predictions.push({
351
388
  metric: trend.metric,
352
389
  currentValue: this.getCurrentMetricValue(trend.metric),
353
390
  predictedValue,
354
391
  confidence: trend.confidence,
355
- trend: trend.direction
392
+ trend: trend.direction,
356
393
  });
357
394
 
358
395
  // Generate alerts for concerning predictions
359
- if (trend.metric === 'responseTime' && predictedValue > 2000 && trend.direction === 'declining') {
360
- alerts.push(`Response times predicted to exceed 2s in ${timeframeMinutes} minutes`);
396
+ if (
397
+ trend.metric === "responseTime" &&
398
+ predictedValue > 2000 &&
399
+ trend.direction === "declining"
400
+ ) {
401
+ alerts.push(
402
+ `Response times predicted to exceed 2s in ${timeframeMinutes} minutes`,
403
+ );
361
404
  }
362
405
 
363
- if (trend.metric === 'cacheHitRate' && predictedValue < 0.5 && trend.direction === 'declining') {
364
- alerts.push(`Cache hit rate predicted to drop below 50% in ${timeframeMinutes} minutes`);
406
+ if (
407
+ trend.metric === "cacheHitRate" &&
408
+ predictedValue < 0.5 &&
409
+ trend.direction === "declining"
410
+ ) {
411
+ alerts.push(
412
+ `Cache hit rate predicted to drop below 50% in ${timeframeMinutes} minutes`,
413
+ );
365
414
  }
366
415
 
367
- if (trend.metric === 'memoryUsage' && predictedValue > 90 && trend.direction === 'declining') {
368
- alerts.push(`Memory usage predicted to exceed 90% in ${timeframeMinutes} minutes`);
416
+ if (
417
+ trend.metric === "memoryUsage" &&
418
+ predictedValue > 90 &&
419
+ trend.direction === "declining"
420
+ ) {
421
+ alerts.push(
422
+ `Memory usage predicted to exceed 90% in ${timeframeMinutes} minutes`,
423
+ );
369
424
  }
370
425
  }
371
426
 
@@ -381,28 +436,28 @@ export class PerformanceAnalytics {
381
436
  longTerm: PerformanceInsight[];
382
437
  estimatedROI: {
383
438
  performanceGain: number; // percentage
384
- implementationCost: 'low' | 'medium' | 'high';
439
+ implementationCost: "low" | "medium" | "high";
385
440
  timeToValue: number; // days
386
441
  };
387
442
  } {
388
443
  const insights = this.generateInsights();
389
-
444
+
390
445
  const quickWins = insights.filter(
391
- i => i.implementationEffort === 'low' && ['high', 'critical'].includes(i.priority)
446
+ (i) =>
447
+ i.implementationEffort === "low" &&
448
+ ["high", "critical"].includes(i.priority),
392
449
  );
393
-
450
+
394
451
  const mediumTerm = insights.filter(
395
- i => i.implementationEffort === 'medium'
396
- );
397
-
398
- const longTerm = insights.filter(
399
- i => i.implementationEffort === 'high'
452
+ (i) => i.implementationEffort === "medium",
400
453
  );
401
454
 
455
+ const longTerm = insights.filter((i) => i.implementationEffort === "high");
456
+
402
457
  // Estimate ROI based on current performance issues
403
458
  const currentMetrics = this.collector.collectCurrentMetrics();
404
459
  let estimatedGain = 0;
405
-
460
+
406
461
  if (currentMetrics.cache.hitRate < 0.8) estimatedGain += 30;
407
462
  if (currentMetrics.requests.averageResponseTime > 1000) estimatedGain += 40;
408
463
  if (currentMetrics.system.memoryUsage > 80) estimatedGain += 20;
@@ -413,9 +468,14 @@ export class PerformanceAnalytics {
413
468
  longTerm,
414
469
  estimatedROI: {
415
470
  performanceGain: Math.min(estimatedGain, 80), // Cap at 80%
416
- implementationCost: quickWins.length > 2 ? 'low' : mediumTerm.length > 2 ? 'medium' : 'high',
417
- timeToValue: quickWins.length > 0 ? 1 : mediumTerm.length > 0 ? 7 : 30
418
- }
471
+ implementationCost:
472
+ quickWins.length > 2
473
+ ? "low"
474
+ : mediumTerm.length > 2
475
+ ? "medium"
476
+ : "high",
477
+ timeToValue: quickWins.length > 0 ? 1 : mediumTerm.length > 0 ? 7 : 30,
478
+ },
419
479
  };
420
480
  }
421
481
 
@@ -424,7 +484,7 @@ export class PerformanceAnalytics {
424
484
  */
425
485
  getAnomalies(severity?: string): PerformanceAnomaly[] {
426
486
  if (severity) {
427
- return this.detectedAnomalies.filter(a => a.severity === severity);
487
+ return this.detectedAnomalies.filter((a) => a.severity === severity);
428
488
  }
429
489
  return [...this.detectedAnomalies];
430
490
  }
@@ -449,21 +509,23 @@ export class PerformanceAnalytics {
449
509
  } {
450
510
  const currentMetrics = this.collector.collectCurrentMetrics();
451
511
  const performanceScore = this.calculatePerformanceScore(currentMetrics);
452
-
512
+
453
513
  return {
454
514
  timestamp: new Date().toISOString(),
455
515
  summary: {
456
516
  overallHealth: this.calculateOverallHealth(performanceScore),
457
517
  keyInsights: this.generatedInsights.length,
458
- criticalAlerts: this.generatedInsights.filter(i => i.priority === 'critical').length,
459
- performanceScore
518
+ criticalAlerts: this.generatedInsights.filter(
519
+ (i) => i.priority === "critical",
520
+ ).length,
521
+ performanceScore,
460
522
  },
461
523
  trends: this.analyzeTrends(),
462
524
  benchmarks: this.benchmarkPerformance(),
463
525
  insights: this.generateInsights(),
464
526
  anomalies: this.getAnomalies(),
465
527
  predictions: this.predictPerformance(),
466
- optimizationPlan: this.generateOptimizationPlan()
528
+ optimizationPlan: this.generateOptimizationPlan(),
467
529
  };
468
530
  }
469
531
 
@@ -474,10 +536,14 @@ export class PerformanceAnalytics {
474
536
  if (values.length < 3) {
475
537
  return {
476
538
  metric: metricName,
477
- direction: 'stable',
539
+ direction: "stable",
478
540
  changeRate: 0,
479
541
  confidence: 0,
480
- prediction: { nextValue: values[values.length - 1] || 0, timeframe: 0, confidence: 0 }
542
+ prediction: {
543
+ nextValue: values[values.length - 1] || 0,
544
+ timeframe: 0,
545
+ confidence: 0,
546
+ },
481
547
  };
482
548
  }
483
549
 
@@ -485,44 +551,49 @@ export class PerformanceAnalytics {
485
551
  const n = values.length;
486
552
  const x = Array.from({ length: n }, (_, i) => i);
487
553
  const y = values;
488
-
554
+
489
555
  const sumX = x.reduce((a, b) => a + b, 0);
490
556
  const sumY = y.reduce((a, b) => a + b, 0);
491
557
  const sumXY = x.map((xi, i) => xi * y[i]).reduce((a, b) => a + b, 0);
492
- const sumXX = x.map(xi => xi * xi).reduce((a, b) => a + b, 0);
493
-
558
+ const sumXX = x.map((xi) => xi * xi).reduce((a, b) => a + b, 0);
559
+
494
560
  const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
495
561
  const intercept = (sumY - slope * sumX) / n;
496
-
562
+
497
563
  // Calculate R-squared for confidence
498
564
  const yMean = sumY / n;
499
- const totalSumSquares = y.map(yi => Math.pow(yi - yMean, 2)).reduce((a, b) => a + b, 0);
500
- const residualSumSquares = y.map((yi, i) => {
501
- const predicted = slope * x[i] + intercept;
502
- return Math.pow(yi - predicted, 2);
503
- }).reduce((a, b) => a + b, 0);
504
-
505
- const rSquared = 1 - (residualSumSquares / totalSumSquares);
506
-
565
+ const totalSumSquares = y
566
+ .map((yi) => Math.pow(yi - yMean, 2))
567
+ .reduce((a, b) => a + b, 0);
568
+ const residualSumSquares = y
569
+ .map((yi, i) => {
570
+ const predicted = slope * x[i] + intercept;
571
+ return Math.pow(yi - predicted, 2);
572
+ })
573
+ .reduce((a, b) => a + b, 0);
574
+
575
+ const rSquared = 1 - residualSumSquares / totalSumSquares;
576
+
507
577
  // Determine direction and change rate
508
578
  const currentValue = values[values.length - 1];
509
579
  const previousValue = values[values.length - 2];
510
- const changeRate = Math.abs((currentValue - previousValue) / previousValue) * 100;
511
-
512
- let direction: 'improving' | 'declining' | 'stable' = 'stable';
580
+ const changeRate =
581
+ Math.abs((currentValue - previousValue) / previousValue) * 100;
582
+
583
+ let direction: "improving" | "declining" | "stable" = "stable";
513
584
  if (Math.abs(slope) > 0.1) {
514
585
  // For metrics where lower is better (response time, error rate)
515
- if (['responseTime', 'errorRate', 'memoryUsage'].includes(metricName)) {
516
- direction = slope < 0 ? 'improving' : 'declining';
586
+ if (["responseTime", "errorRate", "memoryUsage"].includes(metricName)) {
587
+ direction = slope < 0 ? "improving" : "declining";
517
588
  } else {
518
589
  // For metrics where higher is better (cache hit rate)
519
- direction = slope > 0 ? 'improving' : 'declining';
590
+ direction = slope > 0 ? "improving" : "declining";
520
591
  }
521
592
  }
522
593
 
523
594
  // Predict next value
524
595
  const nextValue = slope * n + intercept;
525
-
596
+
526
597
  return {
527
598
  metric: metricName,
528
599
  direction,
@@ -531,8 +602,8 @@ export class PerformanceAnalytics {
531
602
  prediction: {
532
603
  nextValue: Math.max(0, nextValue),
533
604
  timeframe: 30 * 60 * 1000, // 30 minutes
534
- confidence: Math.max(0, Math.min(1, rSquared * 0.8)) // Slightly lower confidence for predictions
535
- }
605
+ confidence: Math.max(0, Math.min(1, rSquared * 0.8)), // Slightly lower confidence for predictions
606
+ },
536
607
  };
537
608
  }
538
609
 
@@ -543,37 +614,38 @@ export class PerformanceAnalytics {
543
614
  if (this.historicalData.length < 10) return; // Need historical context
544
615
 
545
616
  const recentData = this.historicalData.slice(-10);
546
-
617
+
547
618
  // Check response time anomalies
548
- const responseTimes = recentData.map(d => d.requests.averageResponseTime);
619
+ const responseTimes = recentData.map((d) => d.requests.averageResponseTime);
549
620
  this.checkMetricAnomaly(
550
- 'responseTime',
621
+ "responseTime",
551
622
  metrics.requests.averageResponseTime,
552
623
  responseTimes,
553
- 'Response time spike detected'
624
+ "Response time spike detected",
554
625
  );
555
626
 
556
627
  // Check cache hit rate anomalies
557
- const hitRates = recentData.map(d => d.cache.hitRate);
628
+ const hitRates = recentData.map((d) => d.cache.hitRate);
558
629
  this.checkMetricAnomaly(
559
- 'cacheHitRate',
630
+ "cacheHitRate",
560
631
  metrics.cache.hitRate,
561
632
  hitRates,
562
- 'Cache hit rate drop detected'
633
+ "Cache hit rate drop detected",
563
634
  );
564
635
 
565
636
  // Check error rate anomalies
566
- const errorRates = recentData.map(d =>
567
- d.requests.total > 0 ? d.requests.failed / d.requests.total : 0
637
+ const errorRates = recentData.map((d) =>
638
+ d.requests.total > 0 ? d.requests.failed / d.requests.total : 0,
568
639
  );
569
- const currentErrorRate = metrics.requests.total > 0
570
- ? metrics.requests.failed / metrics.requests.total
571
- : 0;
640
+ const currentErrorRate =
641
+ metrics.requests.total > 0
642
+ ? metrics.requests.failed / metrics.requests.total
643
+ : 0;
572
644
  this.checkMetricAnomaly(
573
- 'errorRate',
645
+ "errorRate",
574
646
  currentErrorRate,
575
647
  errorRates,
576
- 'Error rate spike detected'
648
+ "Error rate spike detected",
577
649
  );
578
650
  }
579
651
 
@@ -584,29 +656,32 @@ export class PerformanceAnalytics {
584
656
  metricName: string,
585
657
  currentValue: number,
586
658
  historicalValues: number[],
587
- description: string
659
+ description: string,
588
660
  ): void {
589
661
  if (historicalValues.length < 5) return;
590
662
 
591
- const mean = historicalValues.reduce((a, b) => a + b, 0) / historicalValues.length;
592
- const variance = historicalValues.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / historicalValues.length;
663
+ const mean =
664
+ historicalValues.reduce((a, b) => a + b, 0) / historicalValues.length;
665
+ const variance =
666
+ historicalValues.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) /
667
+ historicalValues.length;
593
668
  const standardDeviation = Math.sqrt(variance);
594
669
 
595
670
  // Calculate z-score
596
671
  const zScore = Math.abs((currentValue - mean) / standardDeviation);
597
-
672
+
598
673
  // Determine sensitivity threshold
599
674
  let threshold = 2; // Default for medium sensitivity
600
- if (this.config.sensitivityLevel === 'low') threshold = 3;
601
- if (this.config.sensitivityLevel === 'high') threshold = 1.5;
675
+ if (this.config.sensitivityLevel === "low") threshold = 3;
676
+ if (this.config.sensitivityLevel === "high") threshold = 1.5;
602
677
 
603
678
  if (zScore > threshold) {
604
679
  const deviation = ((currentValue - mean) / mean) * 100;
605
-
606
- let severity: 'minor' | 'moderate' | 'major' | 'critical' = 'minor';
607
- if (zScore > 4) severity = 'critical';
608
- else if (zScore > 3) severity = 'major';
609
- else if (zScore > 2.5) severity = 'moderate';
680
+
681
+ let severity: "minor" | "moderate" | "major" | "critical" = "minor";
682
+ if (zScore > 4) severity = "critical";
683
+ else if (zScore > 3) severity = "major";
684
+ else if (zScore > 2.5) severity = "moderate";
610
685
 
611
686
  const anomaly: PerformanceAnomaly = {
612
687
  timestamp: Date.now(),
@@ -615,11 +690,14 @@ export class PerformanceAnalytics {
615
690
  actualValue: currentValue,
616
691
  deviation,
617
692
  severity,
618
- possibleCauses: this.generatePossibleCauses(metricName, currentValue > mean)
693
+ possibleCauses: this.generatePossibleCauses(
694
+ metricName,
695
+ currentValue > mean,
696
+ ),
619
697
  };
620
698
 
621
699
  this.detectedAnomalies.push(anomaly);
622
-
700
+
623
701
  // Limit anomaly history
624
702
  if (this.detectedAnomalies.length > 100) {
625
703
  this.detectedAnomalies = this.detectedAnomalies.slice(-50);
@@ -630,15 +708,33 @@ export class PerformanceAnalytics {
630
708
  /**
631
709
  * Generate possible causes for anomalies
632
710
  */
633
- private generatePossibleCauses(metricName: string, isIncrease: boolean): string[] {
711
+ private generatePossibleCauses(
712
+ metricName: string,
713
+ isIncrease: boolean,
714
+ ): string[] {
634
715
  const causes: string[] = [];
635
716
 
636
- if (metricName === 'responseTime' && isIncrease) {
637
- causes.push('High server load', 'Database performance issues', 'Network latency', 'Cache miss increase');
638
- } else if (metricName === 'cacheHitRate' && !isIncrease) {
639
- causes.push('Cache invalidation event', 'New data requests', 'Cache size limit reached', 'TTL expiration');
640
- } else if (metricName === 'errorRate' && isIncrease) {
641
- causes.push('WordPress site issues', 'Authentication problems', 'Network connectivity', 'Plugin conflicts');
717
+ if (metricName === "responseTime" && isIncrease) {
718
+ causes.push(
719
+ "High server load",
720
+ "Database performance issues",
721
+ "Network latency",
722
+ "Cache miss increase",
723
+ );
724
+ } else if (metricName === "cacheHitRate" && !isIncrease) {
725
+ causes.push(
726
+ "Cache invalidation event",
727
+ "New data requests",
728
+ "Cache size limit reached",
729
+ "TTL expiration",
730
+ );
731
+ } else if (metricName === "errorRate" && isIncrease) {
732
+ causes.push(
733
+ "WordPress site issues",
734
+ "Authentication problems",
735
+ "Network connectivity",
736
+ "Plugin conflicts",
737
+ );
642
738
  }
643
739
 
644
740
  return causes;
@@ -651,47 +747,64 @@ export class PerformanceAnalytics {
651
747
  category: string,
652
748
  currentValue: number,
653
749
  benchmarks: any,
654
- higherIsBetter: boolean
750
+ higherIsBetter: boolean,
655
751
  ): BenchmarkComparison {
656
- let status: 'excellent' | 'good' | 'average' | 'below_average' | 'poor' = 'poor';
752
+ let status: "excellent" | "good" | "average" | "below_average" | "poor" =
753
+ "poor";
657
754
  let percentile = 0;
658
755
  let improvement = 0;
659
756
 
660
757
  if (higherIsBetter) {
661
- if (currentValue >= benchmarks.excellent) status = 'excellent';
662
- else if (currentValue >= benchmarks.good) status = 'good';
663
- else if (currentValue >= benchmarks.average) status = 'average';
664
- else if (currentValue >= benchmarks.below_average) status = 'below_average';
665
-
758
+ if (currentValue >= benchmarks.excellent) status = "excellent";
759
+ else if (currentValue >= benchmarks.good) status = "good";
760
+ else if (currentValue >= benchmarks.average) status = "average";
761
+ else if (currentValue >= benchmarks.below_average)
762
+ status = "below_average";
763
+
666
764
  // Calculate improvement needed
667
- if (status !== 'excellent') {
668
- const nextTier = status === 'good' ? benchmarks.excellent :
669
- status === 'average' ? benchmarks.good :
670
- status === 'below_average' ? benchmarks.average :
671
- benchmarks.below_average;
765
+ if (status !== "excellent") {
766
+ const nextTier =
767
+ status === "good"
768
+ ? benchmarks.excellent
769
+ : status === "average"
770
+ ? benchmarks.good
771
+ : status === "below_average"
772
+ ? benchmarks.average
773
+ : benchmarks.below_average;
672
774
  improvement = nextTier - currentValue;
673
775
  }
674
776
  } else {
675
- if (currentValue <= benchmarks.excellent) status = 'excellent';
676
- else if (currentValue <= benchmarks.good) status = 'good';
677
- else if (currentValue <= benchmarks.average) status = 'average';
678
- else if (currentValue <= benchmarks.below_average) status = 'below_average';
679
-
777
+ if (currentValue <= benchmarks.excellent) status = "excellent";
778
+ else if (currentValue <= benchmarks.good) status = "good";
779
+ else if (currentValue <= benchmarks.average) status = "average";
780
+ else if (currentValue <= benchmarks.below_average)
781
+ status = "below_average";
782
+
680
783
  // Calculate improvement needed
681
- if (status !== 'excellent') {
682
- const nextTier = status === 'good' ? benchmarks.excellent :
683
- status === 'average' ? benchmarks.good :
684
- status === 'below_average' ? benchmarks.average :
685
- benchmarks.below_average;
784
+ if (status !== "excellent") {
785
+ const nextTier =
786
+ status === "good"
787
+ ? benchmarks.excellent
788
+ : status === "average"
789
+ ? benchmarks.good
790
+ : status === "below_average"
791
+ ? benchmarks.average
792
+ : benchmarks.below_average;
686
793
  improvement = currentValue - nextTier;
687
794
  }
688
795
  }
689
796
 
690
797
  // Calculate percentile (simplified)
691
- percentile = status === 'excellent' ? 95 :
692
- status === 'good' ? 80 :
693
- status === 'average' ? 60 :
694
- status === 'below_average' ? 30 : 10;
798
+ percentile =
799
+ status === "excellent"
800
+ ? 95
801
+ : status === "good"
802
+ ? 80
803
+ : status === "average"
804
+ ? 60
805
+ : status === "below_average"
806
+ ? 30
807
+ : 10;
695
808
 
696
809
  return {
697
810
  category,
@@ -699,7 +812,7 @@ export class PerformanceAnalytics {
699
812
  benchmarkValue: benchmarks.excellent,
700
813
  percentile,
701
814
  status,
702
- improvement
815
+ improvement,
703
816
  };
704
817
  }
705
818
 
@@ -708,14 +821,22 @@ export class PerformanceAnalytics {
708
821
  */
709
822
  private getCurrentMetricValue(metricName: string): number {
710
823
  const current = this.collector.collectCurrentMetrics();
711
-
824
+
712
825
  switch (metricName) {
713
- case 'responseTime': return current.requests.averageResponseTime;
714
- case 'cacheHitRate': return current.cache.hitRate;
715
- case 'errorRate': return current.requests.total > 0 ? current.requests.failed / current.requests.total : 0;
716
- case 'memoryUsage': return current.system.memoryUsage;
717
- case 'requestVolume': return current.requests.requestsPerSecond;
718
- default: return 0;
826
+ case "responseTime":
827
+ return current.requests.averageResponseTime;
828
+ case "cacheHitRate":
829
+ return current.cache.hitRate;
830
+ case "errorRate":
831
+ return current.requests.total > 0
832
+ ? current.requests.failed / current.requests.total
833
+ : 0;
834
+ case "memoryUsage":
835
+ return current.system.memoryUsage;
836
+ case "requestVolume":
837
+ return current.requests.requestsPerSecond;
838
+ default:
839
+ return 0;
719
840
  }
720
841
  }
721
842
 
@@ -724,28 +845,31 @@ export class PerformanceAnalytics {
724
845
  */
725
846
  private calculatePerformanceScore(metrics: PerformanceMetrics): number {
726
847
  let score = 100;
727
-
848
+
728
849
  // Response time (30% weight)
729
850
  if (metrics.requests.averageResponseTime > 2000) score -= 30;
730
851
  else if (metrics.requests.averageResponseTime > 1000) score -= 15;
731
852
  else if (metrics.requests.averageResponseTime > 500) score -= 5;
732
-
853
+
733
854
  // Error rate (25% weight)
734
- const errorRate = metrics.requests.total > 0 ? metrics.requests.failed / metrics.requests.total : 0;
855
+ const errorRate =
856
+ metrics.requests.total > 0
857
+ ? metrics.requests.failed / metrics.requests.total
858
+ : 0;
735
859
  if (errorRate > 0.05) score -= 25;
736
860
  else if (errorRate > 0.02) score -= 15;
737
861
  else if (errorRate > 0.01) score -= 5;
738
-
862
+
739
863
  // Cache performance (25% weight)
740
864
  if (metrics.cache.hitRate < 0.5) score -= 25;
741
865
  else if (metrics.cache.hitRate < 0.7) score -= 15;
742
866
  else if (metrics.cache.hitRate < 0.85) score -= 5;
743
-
867
+
744
868
  // System resources (20% weight)
745
869
  if (metrics.system.memoryUsage > 90) score -= 20;
746
870
  else if (metrics.system.memoryUsage > 80) score -= 10;
747
871
  else if (metrics.system.memoryUsage > 70) score -= 5;
748
-
872
+
749
873
  return Math.max(0, score);
750
874
  }
751
875
 
@@ -753,10 +877,10 @@ export class PerformanceAnalytics {
753
877
  * Calculate overall health status
754
878
  */
755
879
  private calculateOverallHealth(score: number): string {
756
- if (score >= 90) return 'excellent';
757
- if (score >= 75) return 'good';
758
- if (score >= 60) return 'fair';
759
- if (score >= 40) return 'poor';
760
- return 'critical';
880
+ if (score >= 90) return "excellent";
881
+ if (score >= 75) return "good";
882
+ if (score >= 60) return "fair";
883
+ if (score >= 40) return "poor";
884
+ return "critical";
761
885
  }
762
886
  }