mcp-wordpress 2.4.2 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -48
- package/dist/ajv-patch.js +34 -0
- package/dist/cache/CacheInvalidation.d.ts +3 -1
- package/dist/cache/CacheInvalidation.d.ts.map +1 -1
- package/dist/cache/CacheInvalidation.js +10 -4
- package/dist/cache/CacheInvalidation.js.map +1 -1
- package/dist/cache/CacheManager.d.ts +3 -2
- package/dist/cache/CacheManager.d.ts.map +1 -1
- package/dist/cache/CacheManager.js +11 -3
- package/dist/cache/CacheManager.js.map +1 -1
- package/dist/cache/HttpCacheWrapper.d.ts +7 -6
- package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
- package/dist/cache/HttpCacheWrapper.js +8 -5
- package/dist/cache/HttpCacheWrapper.js.map +1 -1
- package/dist/cache/__tests__/HttpCacheWrapper.test.js +6 -5
- package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -1
- package/dist/cache/index.d.ts +3 -3
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/client/CachedWordPressClient.d.ts +23 -9
- package/dist/client/CachedWordPressClient.d.ts.map +1 -1
- package/dist/client/CachedWordPressClient.js +4 -1
- package/dist/client/CachedWordPressClient.js.map +1 -1
- package/dist/client/MockWordPressClient.d.ts +2 -1
- package/dist/client/MockWordPressClient.d.ts.map +1 -1
- package/dist/client/MockWordPressClient.js +3 -1
- package/dist/client/MockWordPressClient.js.map +1 -1
- package/dist/client/api.d.ts +17 -13
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/api.js +135 -30
- package/dist/client/api.js.map +1 -1
- package/dist/client/auth.d.ts.map +1 -1
- package/dist/client/auth.js +2 -3
- package/dist/client/auth.js.map +1 -1
- package/dist/client/managers/AuthenticationManager.d.ts +55 -2
- package/dist/client/managers/AuthenticationManager.d.ts.map +1 -1
- package/dist/client/managers/AuthenticationManager.js +269 -71
- package/dist/client/managers/AuthenticationManager.js.map +1 -1
- package/dist/client/managers/BaseManager.d.ts +3 -3
- package/dist/client/managers/BaseManager.d.ts.map +1 -1
- package/dist/client/managers/BaseManager.js +11 -5
- package/dist/client/managers/BaseManager.js.map +1 -1
- package/dist/client/managers/RequestManager.d.ts +2 -2
- package/dist/client/managers/RequestManager.d.ts.map +1 -1
- package/dist/client/managers/RequestManager.js +25 -12
- package/dist/client/managers/RequestManager.js.map +1 -1
- package/dist/config/Config.d.ts +155 -0
- package/dist/config/Config.d.ts.map +1 -0
- package/dist/config/Config.js +215 -0
- package/dist/config/Config.js.map +1 -0
- package/dist/config/ConfigurationSchema.d.ts +21 -21
- package/dist/config/ConfigurationSchema.d.ts.map +1 -1
- package/dist/config/ConfigurationSchema.js +19 -2
- package/dist/config/ConfigurationSchema.js.map +1 -1
- package/dist/config/ServerConfiguration.d.ts +2 -1
- package/dist/config/ServerConfiguration.d.ts.map +1 -1
- package/dist/config/ServerConfiguration.js +50 -41
- package/dist/config/ServerConfiguration.js.map +1 -1
- package/dist/docs/DocumentationGenerator.d.ts +9 -8
- package/dist/docs/DocumentationGenerator.d.ts.map +1 -1
- package/dist/docs/DocumentationGenerator.js +10 -7
- package/dist/docs/DocumentationGenerator.js.map +1 -1
- package/dist/docs/MarkdownFormatter.d.ts.map +1 -1
- package/dist/docs/MarkdownFormatter.js +3 -2
- package/dist/docs/MarkdownFormatter.js.map +1 -1
- package/dist/dxt-entry.cjs +81 -0
- package/dist/dxt-entry.js +15 -14
- package/dist/dxt-entry.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -21
- package/dist/index.js.map +1 -1
- package/dist/performance/MetricsCollector.d.ts +13 -7
- package/dist/performance/MetricsCollector.d.ts.map +1 -1
- package/dist/performance/MetricsCollector.js +69 -27
- package/dist/performance/MetricsCollector.js.map +1 -1
- package/dist/performance/PerformanceAnalytics.d.ts +8 -2
- package/dist/performance/PerformanceAnalytics.d.ts.map +1 -1
- package/dist/performance/PerformanceAnalytics.js +17 -47
- package/dist/performance/PerformanceAnalytics.js.map +1 -1
- package/dist/performance/PerformanceMonitor.d.ts +2 -1
- package/dist/performance/PerformanceMonitor.d.ts.map +1 -1
- package/dist/performance/PerformanceMonitor.js +12 -13
- package/dist/performance/PerformanceMonitor.js.map +1 -1
- package/dist/performance/index.d.ts +2 -2
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/security/AISecurityScanner.d.ts +1 -0
- package/dist/security/AISecurityScanner.d.ts.map +1 -1
- package/dist/security/AISecurityScanner.js +22 -12
- package/dist/security/AISecurityScanner.js.map +1 -1
- package/dist/security/AutomatedRemediation.d.ts +4 -3
- package/dist/security/AutomatedRemediation.d.ts.map +1 -1
- package/dist/security/AutomatedRemediation.js +46 -15
- package/dist/security/AutomatedRemediation.js.map +1 -1
- package/dist/security/InputValidator.d.ts +13 -9
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +4 -2
- package/dist/security/InputValidator.js.map +1 -1
- package/dist/security/SecurityCIPipeline.d.ts +1 -1
- package/dist/security/SecurityCIPipeline.d.ts.map +1 -1
- package/dist/security/SecurityCIPipeline.js +38 -29
- package/dist/security/SecurityCIPipeline.js.map +1 -1
- package/dist/security/SecurityConfig.d.ts +3 -3
- package/dist/security/SecurityConfig.d.ts.map +1 -1
- package/dist/security/SecurityConfig.js +13 -9
- package/dist/security/SecurityConfig.js.map +1 -1
- package/dist/security/SecurityConfigManager.d.ts +2 -2
- package/dist/security/SecurityConfigManager.d.ts.map +1 -1
- package/dist/security/SecurityConfigManager.js +20 -15
- package/dist/security/SecurityConfigManager.js.map +1 -1
- package/dist/security/SecurityMonitoring.d.ts +2 -2
- package/dist/security/SecurityMonitoring.d.ts.map +1 -1
- package/dist/security/SecurityMonitoring.js +19 -17
- package/dist/security/SecurityMonitoring.js.map +1 -1
- package/dist/security/SecurityReviewer.d.ts.map +1 -1
- package/dist/security/SecurityReviewer.js +10 -7
- package/dist/security/SecurityReviewer.js.map +1 -1
- package/dist/security/index.d.ts +24 -23
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +52 -23
- package/dist/security/index.js.map +1 -1
- package/dist/server/ConnectionTester.d.ts +12 -4
- package/dist/server/ConnectionTester.d.ts.map +1 -1
- package/dist/server/ConnectionTester.js +96 -22
- package/dist/server/ConnectionTester.js.map +1 -1
- package/dist/server/ToolRegistry.d.ts +2 -2
- package/dist/server/ToolRegistry.d.ts.map +1 -1
- package/dist/server/ToolRegistry.js +10 -5
- package/dist/server/ToolRegistry.js.map +1 -1
- package/dist/tools/BaseToolManager.d.ts +47 -11
- package/dist/tools/BaseToolManager.d.ts.map +1 -1
- package/dist/tools/BaseToolManager.js +168 -29
- package/dist/tools/BaseToolManager.js.map +1 -1
- package/dist/tools/auth.d.ts +16 -10
- package/dist/tools/auth.d.ts.map +1 -1
- package/dist/tools/auth.js +3 -2
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/cache.d.ts +30 -30
- package/dist/tools/cache.d.ts.map +1 -1
- package/dist/tools/cache.js +1 -6
- package/dist/tools/cache.js.map +1 -1
- package/dist/tools/comments.d.ts +20 -20
- package/dist/tools/comments.d.ts.map +1 -1
- package/dist/tools/comments.js +16 -9
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/media.d.ts +18 -16
- package/dist/tools/media.d.ts.map +1 -1
- package/dist/tools/media.js +16 -15
- package/dist/tools/media.js.map +1 -1
- package/dist/tools/pages.d.ts +19 -17
- package/dist/tools/pages.d.ts.map +1 -1
- package/dist/tools/pages.js +16 -12
- package/dist/tools/pages.js.map +1 -1
- package/dist/tools/performance.d.ts +11 -1
- package/dist/tools/performance.d.ts.map +1 -1
- package/dist/tools/performance.js +67 -34
- package/dist/tools/performance.js.map +1 -1
- package/dist/tools/posts/PostHandlers.d.ts +46 -0
- package/dist/tools/posts/PostHandlers.d.ts.map +1 -0
- package/dist/tools/posts/PostHandlers.js +400 -0
- package/dist/tools/posts/PostHandlers.js.map +1 -0
- package/dist/tools/posts/PostToolDefinitions.d.ts +37 -0
- package/dist/tools/posts/PostToolDefinitions.d.ts.map +1 -0
- package/dist/tools/posts/PostToolDefinitions.js +236 -0
- package/dist/tools/posts/PostToolDefinitions.js.map +1 -0
- package/dist/tools/posts/index.d.ts +138 -0
- package/dist/tools/posts/index.d.ts.map +1 -0
- package/dist/tools/posts/index.js +163 -0
- package/dist/tools/posts/index.js.map +1 -0
- package/dist/tools/posts.d.ts +10 -246
- package/dist/tools/posts.d.ts.map +1 -1
- package/dist/tools/posts.js +11 -723
- package/dist/tools/posts.js.map +1 -1
- package/dist/tools/site.d.ts +19 -18
- package/dist/tools/site.d.ts.map +1 -1
- package/dist/tools/site.js +14 -10
- package/dist/tools/site.js.map +1 -1
- package/dist/tools/taxonomies.d.ts +23 -24
- package/dist/tools/taxonomies.d.ts.map +1 -1
- package/dist/tools/taxonomies.js +24 -18
- package/dist/tools/taxonomies.js.map +1 -1
- package/dist/tools/users.d.ts +20 -15
- package/dist/tools/users.d.ts.map +1 -1
- package/dist/tools/users.js +12 -8
- package/dist/tools/users.js.map +1 -1
- package/dist/types/client.d.ts +48 -41
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/client.js +30 -5
- package/dist/types/client.js.map +1 -1
- package/dist/types/enhanced.d.ts +237 -0
- package/dist/types/enhanced.d.ts.map +1 -0
- package/dist/types/enhanced.js +49 -0
- package/dist/types/enhanced.js.map +1 -0
- package/dist/types/index.d.ts +15 -12
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/mcp.d.ts +12 -12
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/requests.d.ts +322 -0
- package/dist/types/requests.d.ts.map +1 -0
- package/dist/types/requests.js +8 -0
- package/dist/types/requests.js.map +1 -0
- package/dist/types/tools.d.ts +506 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +8 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types/wordpress.d.ts +43 -15
- package/dist/types/wordpress.d.ts.map +1 -1
- package/dist/types/wordpress.js +8 -1
- package/dist/types/wordpress.js.map +1 -1
- package/dist/utils/debug.d.ts +19 -11
- package/dist/utils/debug.d.ts.map +1 -1
- package/dist/utils/debug.js +46 -10
- package/dist/utils/debug.js.map +1 -1
- package/dist/utils/enhancedError.d.ts +8 -8
- package/dist/utils/enhancedError.d.ts.map +1 -1
- package/dist/utils/enhancedError.js.map +1 -1
- package/dist/utils/error.d.ts +2 -4
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.js +42 -5
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/logger.d.ts +106 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +280 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/streaming.d.ts +9 -9
- package/dist/utils/streaming.d.ts.map +1 -1
- package/dist/utils/streaming.js +71 -52
- package/dist/utils/streaming.js.map +1 -1
- package/dist/utils/toolWrapper.d.ts +9 -7
- package/dist/utils/toolWrapper.d.ts.map +1 -1
- package/dist/utils/toolWrapper.js.map +1 -1
- package/dist/utils/validation/core.d.ts +21 -0
- package/dist/utils/validation/core.d.ts.map +1 -0
- package/dist/utils/validation/core.js +71 -0
- package/dist/utils/validation/core.js.map +1 -0
- package/dist/utils/validation/index.d.ts +25 -0
- package/dist/utils/validation/index.d.ts.map +1 -0
- package/dist/utils/validation/index.js +29 -0
- package/dist/utils/validation/index.js.map +1 -0
- package/dist/utils/validation/network.d.ts +19 -0
- package/dist/utils/validation/network.d.ts.map +1 -0
- package/dist/utils/validation/network.js +93 -0
- package/dist/utils/validation/network.js.map +1 -0
- package/dist/utils/validation/rateLimit.d.ts +21 -0
- package/dist/utils/validation/rateLimit.d.ts.map +1 -0
- package/dist/utils/validation/rateLimit.js +43 -0
- package/dist/utils/validation/rateLimit.js.map +1 -0
- package/dist/utils/validation/security.d.ts +29 -0
- package/dist/utils/validation/security.d.ts.map +1 -0
- package/dist/utils/validation/security.js +327 -0
- package/dist/utils/validation/security.js.map +1 -0
- package/dist/utils/validation/wordpress.d.ts +31 -0
- package/dist/utils/validation/wordpress.d.ts.map +1 -0
- package/dist/utils/validation/wordpress.js +146 -0
- package/dist/utils/validation/wordpress.js.map +1 -0
- package/dist/utils/validation.d.ts +13 -82
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +25 -343
- package/dist/utils/validation.js.map +1 -1
- package/docs/BADGE_UPDATES.md +132 -0
- package/docs/CI_CD_IMPROVEMENTS.md +191 -0
- package/docs/INCREMENTAL_COVERAGE.md +183 -0
- package/docs/api/README.md +3 -1
- package/docs/api/openapi.json +5 -1
- package/docs/api/summary.json +1 -1
- package/docs/api/tools/wp_create_post.md +12 -14
- package/docs/examples/claude-desktop-config.md +1 -1
- package/docs/examples/docker-production.md +100 -93
- package/docs/examples/multi-site-setup.md +5 -4
- package/docs/examples/single-site-setup.md +3 -4
- package/docs/examples/use-case-workflows.md +4 -5
- package/docs/integrations/claude-desktop.md +31 -31
- package/docs/integrations/cline.md +4 -4
- package/docs/integrations/vs-code.md +9 -8
- package/docs/user-guides/SMITHERY_SETUP.md +10 -10
- package/package.json +44 -25
- package/src/cache/CacheInvalidation.ts +12 -5
- package/src/cache/CacheManager.ts +18 -15
- package/src/cache/HttpCacheWrapper.ts +30 -59
- package/src/cache/__tests__/HttpCacheWrapper.test.ts +6 -5
- package/src/cache/index.ts +3 -14
- package/src/client/CachedWordPressClient.ts +32 -30
- package/src/client/MockWordPressClient.ts +4 -2
- package/src/client/api.ts +186 -64
- package/src/client/auth.ts +15 -40
- package/src/client/managers/AuthenticationManager.ts +337 -77
- package/src/client/managers/BaseManager.ts +18 -30
- package/src/client/managers/RequestManager.ts +39 -44
- package/src/config/Config.ts +308 -0
- package/src/config/ConfigurationSchema.ts +23 -2
- package/src/config/ServerConfiguration.ts +51 -47
- package/src/docs/DocumentationGenerator.ts +50 -39
- package/src/docs/MarkdownFormatter.ts +19 -29
- package/src/dxt-entry.cjs +26 -16
- package/src/dxt-entry.ts +17 -27
- package/src/index.ts +42 -28
- package/src/performance/MetricsCollector.ts +108 -86
- package/src/performance/PerformanceAnalytics.ts +69 -164
- package/src/performance/PerformanceMonitor.ts +32 -47
- package/src/performance/index.ts +2 -10
- package/src/security/AISecurityScanner.ts +22 -12
- package/src/security/AutomatedRemediation.ts +49 -18
- package/src/security/InputValidator.ts +9 -6
- package/src/security/SecurityCIPipeline.ts +53 -37
- package/src/security/SecurityConfig.ts +22 -22
- package/src/security/SecurityConfigManager.ts +23 -19
- package/src/security/SecurityMonitoring.ts +24 -21
- package/src/security/SecurityReviewer.ts +10 -7
- package/src/security/index.ts +64 -29
- package/src/server/ConnectionTester.ts +120 -31
- package/src/server/ToolRegistry.ts +31 -21
- package/src/tools/BaseToolManager.ts +286 -33
- package/src/tools/auth.ts +20 -8
- package/src/tools/cache.ts +5 -15
- package/src/tools/comments.ts +34 -48
- package/src/tools/media.ts +41 -53
- package/src/tools/pages.ts +32 -54
- package/src/tools/performance.ts +141 -176
- package/src/tools/posts/PostHandlers.ts +474 -0
- package/src/tools/posts/PostToolDefinitions.ts +250 -0
- package/src/tools/posts/index.ts +192 -0
- package/src/tools/posts.ts +24 -780
- package/src/tools/site.ts +34 -19
- package/src/tools/taxonomies.ts +41 -57
- package/src/tools/users.ts +28 -16
- package/src/types/client.ts +114 -138
- package/src/types/enhanced.ts +318 -0
- package/src/types/index.ts +51 -30
- package/src/types/mcp.ts +20 -42
- package/src/types/requests.ts +378 -0
- package/src/types/tools.ts +608 -0
- package/src/types/wordpress.ts +56 -34
- package/src/utils/debug.ts +77 -59
- package/src/utils/enhancedError.ts +8 -8
- package/src/utils/error.ts +53 -31
- package/src/utils/logger.ts +351 -0
- package/src/utils/streaming.ts +86 -68
- package/src/utils/toolWrapper.ts +10 -12
- package/src/utils/validation/core.ts +108 -0
- package/src/utils/validation/index.ts +36 -0
- package/src/utils/validation/network.ts +132 -0
- package/src/utils/validation/rateLimit.ts +54 -0
- package/src/utils/validation/security.ts +361 -0
- package/src/utils/validation/wordpress.ts +180 -0
- package/src/utils/validation.ts +47 -470
|
@@ -100,10 +100,7 @@ export class PerformanceAnalytics {
|
|
|
100
100
|
},
|
|
101
101
|
};
|
|
102
102
|
|
|
103
|
-
constructor(
|
|
104
|
-
collector: MetricsCollector,
|
|
105
|
-
config: Partial<AnalyticsConfig> = {},
|
|
106
|
-
) {
|
|
103
|
+
constructor(collector: MetricsCollector, config: Partial<AnalyticsConfig> = {}) {
|
|
107
104
|
this.collector = collector;
|
|
108
105
|
this.config = {
|
|
109
106
|
enablePredictiveAnalysis: true,
|
|
@@ -123,9 +120,7 @@ export class PerformanceAnalytics {
|
|
|
123
120
|
|
|
124
121
|
// Limit historical data to lookback period
|
|
125
122
|
const cutoff = Date.now() - this.config.lookbackPeriod;
|
|
126
|
-
this.historicalData = this.historicalData.filter(
|
|
127
|
-
(data) => data.system.uptime > cutoff,
|
|
128
|
-
);
|
|
123
|
+
this.historicalData = this.historicalData.filter((data) => data.system.uptime > cutoff);
|
|
129
124
|
|
|
130
125
|
// Run analysis on new data
|
|
131
126
|
if (this.config.enableAnomalyDetection) {
|
|
@@ -163,9 +158,7 @@ export class PerformanceAnalytics {
|
|
|
163
158
|
trends.push(
|
|
164
159
|
this.analyzeTrend(
|
|
165
160
|
"errorRate",
|
|
166
|
-
this.historicalData.map((d) =>
|
|
167
|
-
d.requests.total > 0 ? d.requests.failed / d.requests.total : 0,
|
|
168
|
-
),
|
|
161
|
+
this.historicalData.map((d) => (d.requests.total > 0 ? d.requests.failed / d.requests.total : 0)),
|
|
169
162
|
),
|
|
170
163
|
);
|
|
171
164
|
|
|
@@ -205,8 +198,7 @@ export class PerformanceAnalytics {
|
|
|
205
198
|
title: "Improve Cache Hit Rate",
|
|
206
199
|
description: `Current cache hit rate is ${(currentMetrics.cache.hitRate * 100).toFixed(1)}%, which is below optimal performance.`,
|
|
207
200
|
impact: "performance",
|
|
208
|
-
recommendation:
|
|
209
|
-
"Implement cache warming strategies and optimize TTL values for frequently accessed data.",
|
|
201
|
+
recommendation: "Implement cache warming strategies and optimize TTL values for frequently accessed data.",
|
|
210
202
|
estimatedImprovement: "20-40% reduction in response times",
|
|
211
203
|
implementationEffort: "medium",
|
|
212
204
|
relatedMetrics: ["cacheHitRate", "responseTime"],
|
|
@@ -222,8 +214,7 @@ export class PerformanceAnalytics {
|
|
|
222
214
|
title: "Reduce Response Times",
|
|
223
215
|
description: `Average response time of ${currentMetrics.requests.averageResponseTime.toFixed(0)}ms is above recommended threshold.`,
|
|
224
216
|
impact: "user_experience",
|
|
225
|
-
recommendation:
|
|
226
|
-
"Enable aggressive caching, optimize database queries, or consider upgrading server resources.",
|
|
217
|
+
recommendation: "Enable aggressive caching, optimize database queries, or consider upgrading server resources.",
|
|
227
218
|
estimatedImprovement: "50-70% reduction in response times",
|
|
228
219
|
implementationEffort: "medium",
|
|
229
220
|
relatedMetrics: ["responseTime", "cacheHitRate"],
|
|
@@ -239,8 +230,7 @@ export class PerformanceAnalytics {
|
|
|
239
230
|
title: "Memory Usage Optimization",
|
|
240
231
|
description: `Memory usage at ${currentMetrics.system.memoryUsage}% is approaching limits.`,
|
|
241
232
|
impact: "reliability",
|
|
242
|
-
recommendation:
|
|
243
|
-
"Increase cache size limits, implement cache eviction policies, or scale server resources.",
|
|
233
|
+
recommendation: "Increase cache size limits, implement cache eviction policies, or scale server resources.",
|
|
244
234
|
estimatedImprovement: "Improved system stability",
|
|
245
235
|
implementationEffort: "low",
|
|
246
236
|
relatedMetrics: ["memoryUsage", "cacheSize"],
|
|
@@ -261,8 +251,7 @@ export class PerformanceAnalytics {
|
|
|
261
251
|
title: "Optimize Frequently Used Tools",
|
|
262
252
|
description: `Most used tools: ${mostUsed.map(([tool]) => tool).join(", ")}. Consider optimizing these workflows.`,
|
|
263
253
|
impact: "performance",
|
|
264
|
-
recommendation:
|
|
265
|
-
"Create cached workflows or batch operations for frequently used tools.",
|
|
254
|
+
recommendation: "Create cached workflows or batch operations for frequently used tools.",
|
|
266
255
|
estimatedImprovement: "10-20% reduction in API calls",
|
|
267
256
|
implementationEffort: "high",
|
|
268
257
|
relatedMetrics: ["toolUsage", "requestVolume"],
|
|
@@ -271,11 +260,7 @@ export class PerformanceAnalytics {
|
|
|
271
260
|
|
|
272
261
|
// Trend-based insights
|
|
273
262
|
const responseTimeTrend = trends.find((t) => t.metric === "responseTime");
|
|
274
|
-
if (
|
|
275
|
-
responseTimeTrend &&
|
|
276
|
-
responseTimeTrend.direction === "declining" &&
|
|
277
|
-
responseTimeTrend.changeRate > 10
|
|
278
|
-
) {
|
|
263
|
+
if (responseTimeTrend && responseTimeTrend.direction === "declining" && responseTimeTrend.changeRate > 10) {
|
|
279
264
|
insights.push({
|
|
280
265
|
id: "trend-response-time-1",
|
|
281
266
|
category: "alert",
|
|
@@ -283,8 +268,7 @@ export class PerformanceAnalytics {
|
|
|
283
268
|
title: "Response Time Degradation Detected",
|
|
284
269
|
description: `Response times are declining at ${responseTimeTrend.changeRate.toFixed(1)}% rate.`,
|
|
285
270
|
impact: "performance",
|
|
286
|
-
recommendation:
|
|
287
|
-
"Investigate recent changes, check WordPress site health, and monitor resource usage.",
|
|
271
|
+
recommendation: "Investigate recent changes, check WordPress site health, and monitor resource usage.",
|
|
288
272
|
estimatedImprovement: "Prevent further degradation",
|
|
289
273
|
implementationEffort: "medium",
|
|
290
274
|
relatedMetrics: ["responseTime", "errorRate"],
|
|
@@ -317,31 +301,19 @@ export class PerformanceAnalytics {
|
|
|
317
301
|
this.createBenchmarkComparison(
|
|
318
302
|
"Cache Hit Rate",
|
|
319
303
|
currentMetrics.cache.hitRate * 100,
|
|
320
|
-
Object.fromEntries(
|
|
321
|
-
Object.entries(this.benchmarks.cacheHitRate).map(([k, v]) => [
|
|
322
|
-
k,
|
|
323
|
-
v * 100,
|
|
324
|
-
]),
|
|
325
|
-
),
|
|
304
|
+
Object.fromEntries(Object.entries(this.benchmarks.cacheHitRate).map(([k, v]) => [k, v * 100])),
|
|
326
305
|
true, // higher is better
|
|
327
306
|
),
|
|
328
307
|
);
|
|
329
308
|
|
|
330
309
|
// Error rate benchmark
|
|
331
310
|
const errorRate =
|
|
332
|
-
currentMetrics.requests.total > 0
|
|
333
|
-
? (currentMetrics.requests.failed / currentMetrics.requests.total) * 100
|
|
334
|
-
: 0;
|
|
311
|
+
currentMetrics.requests.total > 0 ? (currentMetrics.requests.failed / currentMetrics.requests.total) * 100 : 0;
|
|
335
312
|
comparisons.push(
|
|
336
313
|
this.createBenchmarkComparison(
|
|
337
314
|
"Error Rate",
|
|
338
315
|
errorRate,
|
|
339
|
-
Object.fromEntries(
|
|
340
|
-
Object.entries(this.benchmarks.errorRate).map(([k, v]) => [
|
|
341
|
-
k,
|
|
342
|
-
v * 100,
|
|
343
|
-
]),
|
|
344
|
-
),
|
|
316
|
+
Object.fromEntries(Object.entries(this.benchmarks.errorRate).map(([k, v]) => [k, v * 100])),
|
|
345
317
|
false, // lower is better
|
|
346
318
|
),
|
|
347
319
|
);
|
|
@@ -377,7 +349,13 @@ export class PerformanceAnalytics {
|
|
|
377
349
|
}
|
|
378
350
|
|
|
379
351
|
const trends = this.analyzeTrends();
|
|
380
|
-
const predictions:
|
|
352
|
+
const predictions: Array<{
|
|
353
|
+
metric: string;
|
|
354
|
+
currentValue: number;
|
|
355
|
+
predictedValue: number;
|
|
356
|
+
confidence: number;
|
|
357
|
+
trend: "improving" | "declining" | "stable";
|
|
358
|
+
}> = [];
|
|
381
359
|
const alerts: string[] = [];
|
|
382
360
|
|
|
383
361
|
for (const trend of trends) {
|
|
@@ -393,34 +371,16 @@ export class PerformanceAnalytics {
|
|
|
393
371
|
});
|
|
394
372
|
|
|
395
373
|
// Generate alerts for concerning predictions
|
|
396
|
-
if (
|
|
397
|
-
|
|
398
|
-
predictedValue > 2000 &&
|
|
399
|
-
trend.direction === "declining"
|
|
400
|
-
) {
|
|
401
|
-
alerts.push(
|
|
402
|
-
`Response times predicted to exceed 2s in ${timeframeMinutes} minutes`,
|
|
403
|
-
);
|
|
374
|
+
if (trend.metric === "responseTime" && predictedValue > 2000 && trend.direction === "declining") {
|
|
375
|
+
alerts.push(`Response times predicted to exceed 2s in ${timeframeMinutes} minutes`);
|
|
404
376
|
}
|
|
405
377
|
|
|
406
|
-
if (
|
|
407
|
-
|
|
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
|
-
);
|
|
378
|
+
if (trend.metric === "cacheHitRate" && predictedValue < 0.5 && trend.direction === "declining") {
|
|
379
|
+
alerts.push(`Cache hit rate predicted to drop below 50% in ${timeframeMinutes} minutes`);
|
|
414
380
|
}
|
|
415
381
|
|
|
416
|
-
if (
|
|
417
|
-
|
|
418
|
-
predictedValue > 90 &&
|
|
419
|
-
trend.direction === "declining"
|
|
420
|
-
) {
|
|
421
|
-
alerts.push(
|
|
422
|
-
`Memory usage predicted to exceed 90% in ${timeframeMinutes} minutes`,
|
|
423
|
-
);
|
|
382
|
+
if (trend.metric === "memoryUsage" && predictedValue > 90 && trend.direction === "declining") {
|
|
383
|
+
alerts.push(`Memory usage predicted to exceed 90% in ${timeframeMinutes} minutes`);
|
|
424
384
|
}
|
|
425
385
|
}
|
|
426
386
|
|
|
@@ -443,14 +403,10 @@ export class PerformanceAnalytics {
|
|
|
443
403
|
const insights = this.generateInsights();
|
|
444
404
|
|
|
445
405
|
const quickWins = insights.filter(
|
|
446
|
-
(i) =>
|
|
447
|
-
i.implementationEffort === "low" &&
|
|
448
|
-
["high", "critical"].includes(i.priority),
|
|
406
|
+
(i) => i.implementationEffort === "low" && ["high", "critical"].includes(i.priority),
|
|
449
407
|
);
|
|
450
408
|
|
|
451
|
-
const mediumTerm = insights.filter(
|
|
452
|
-
(i) => i.implementationEffort === "medium",
|
|
453
|
-
);
|
|
409
|
+
const mediumTerm = insights.filter((i) => i.implementationEffort === "medium");
|
|
454
410
|
|
|
455
411
|
const longTerm = insights.filter((i) => i.implementationEffort === "high");
|
|
456
412
|
|
|
@@ -468,12 +424,7 @@ export class PerformanceAnalytics {
|
|
|
468
424
|
longTerm,
|
|
469
425
|
estimatedROI: {
|
|
470
426
|
performanceGain: Math.min(estimatedGain, 80), // Cap at 80%
|
|
471
|
-
implementationCost:
|
|
472
|
-
quickWins.length > 2
|
|
473
|
-
? "low"
|
|
474
|
-
: mediumTerm.length > 2
|
|
475
|
-
? "medium"
|
|
476
|
-
: "high",
|
|
427
|
+
implementationCost: quickWins.length > 2 ? "low" : mediumTerm.length > 2 ? "medium" : "high",
|
|
477
428
|
timeToValue: quickWins.length > 0 ? 1 : mediumTerm.length > 0 ? 7 : 30,
|
|
478
429
|
},
|
|
479
430
|
};
|
|
@@ -504,8 +455,14 @@ export class PerformanceAnalytics {
|
|
|
504
455
|
benchmarks: BenchmarkComparison[];
|
|
505
456
|
insights: PerformanceInsight[];
|
|
506
457
|
anomalies: PerformanceAnomaly[];
|
|
507
|
-
predictions:
|
|
508
|
-
|
|
458
|
+
predictions: Array<{
|
|
459
|
+
metric: string;
|
|
460
|
+
currentValue: number;
|
|
461
|
+
predictedValue: number;
|
|
462
|
+
confidence: number;
|
|
463
|
+
trend: "improving" | "declining" | "stable";
|
|
464
|
+
}>;
|
|
465
|
+
optimizationPlan: Record<string, unknown>;
|
|
509
466
|
} {
|
|
510
467
|
const currentMetrics = this.collector.collectCurrentMetrics();
|
|
511
468
|
const performanceScore = this.calculatePerformanceScore(currentMetrics);
|
|
@@ -515,16 +472,14 @@ export class PerformanceAnalytics {
|
|
|
515
472
|
summary: {
|
|
516
473
|
overallHealth: this.calculateOverallHealth(performanceScore),
|
|
517
474
|
keyInsights: this.generatedInsights.length,
|
|
518
|
-
criticalAlerts: this.generatedInsights.filter(
|
|
519
|
-
(i) => i.priority === "critical",
|
|
520
|
-
).length,
|
|
475
|
+
criticalAlerts: this.generatedInsights.filter((i) => i.priority === "critical").length,
|
|
521
476
|
performanceScore,
|
|
522
477
|
},
|
|
523
478
|
trends: this.analyzeTrends(),
|
|
524
479
|
benchmarks: this.benchmarkPerformance(),
|
|
525
480
|
insights: this.generateInsights(),
|
|
526
481
|
anomalies: this.getAnomalies(),
|
|
527
|
-
predictions: this.predictPerformance(),
|
|
482
|
+
predictions: this.predictPerformance().predictions,
|
|
528
483
|
optimizationPlan: this.generateOptimizationPlan(),
|
|
529
484
|
};
|
|
530
485
|
}
|
|
@@ -562,9 +517,7 @@ export class PerformanceAnalytics {
|
|
|
562
517
|
|
|
563
518
|
// Calculate R-squared for confidence
|
|
564
519
|
const yMean = sumY / n;
|
|
565
|
-
const totalSumSquares = y
|
|
566
|
-
.map((yi) => Math.pow(yi - yMean, 2))
|
|
567
|
-
.reduce((a, b) => a + b, 0);
|
|
520
|
+
const totalSumSquares = y.map((yi) => Math.pow(yi - yMean, 2)).reduce((a, b) => a + b, 0);
|
|
568
521
|
const residualSumSquares = y
|
|
569
522
|
.map((yi, i) => {
|
|
570
523
|
const predicted = slope * x[i] + intercept;
|
|
@@ -577,8 +530,7 @@ export class PerformanceAnalytics {
|
|
|
577
530
|
// Determine direction and change rate
|
|
578
531
|
const currentValue = values[values.length - 1];
|
|
579
532
|
const previousValue = values[values.length - 2];
|
|
580
|
-
const changeRate =
|
|
581
|
-
Math.abs((currentValue - previousValue) / previousValue) * 100;
|
|
533
|
+
const changeRate = Math.abs((currentValue - previousValue) / previousValue) * 100;
|
|
582
534
|
|
|
583
535
|
let direction: "improving" | "declining" | "stable" = "stable";
|
|
584
536
|
if (Math.abs(slope) > 0.1) {
|
|
@@ -626,27 +578,12 @@ export class PerformanceAnalytics {
|
|
|
626
578
|
|
|
627
579
|
// Check cache hit rate anomalies
|
|
628
580
|
const hitRates = recentData.map((d) => d.cache.hitRate);
|
|
629
|
-
this.checkMetricAnomaly(
|
|
630
|
-
"cacheHitRate",
|
|
631
|
-
metrics.cache.hitRate,
|
|
632
|
-
hitRates,
|
|
633
|
-
"Cache hit rate drop detected",
|
|
634
|
-
);
|
|
581
|
+
this.checkMetricAnomaly("cacheHitRate", metrics.cache.hitRate, hitRates, "Cache hit rate drop detected");
|
|
635
582
|
|
|
636
583
|
// Check error rate anomalies
|
|
637
|
-
const errorRates = recentData.map((d) =>
|
|
638
|
-
|
|
639
|
-
);
|
|
640
|
-
const currentErrorRate =
|
|
641
|
-
metrics.requests.total > 0
|
|
642
|
-
? metrics.requests.failed / metrics.requests.total
|
|
643
|
-
: 0;
|
|
644
|
-
this.checkMetricAnomaly(
|
|
645
|
-
"errorRate",
|
|
646
|
-
currentErrorRate,
|
|
647
|
-
errorRates,
|
|
648
|
-
"Error rate spike detected",
|
|
649
|
-
);
|
|
584
|
+
const errorRates = recentData.map((d) => (d.requests.total > 0 ? d.requests.failed / d.requests.total : 0));
|
|
585
|
+
const currentErrorRate = metrics.requests.total > 0 ? metrics.requests.failed / metrics.requests.total : 0;
|
|
586
|
+
this.checkMetricAnomaly("errorRate", currentErrorRate, errorRates, "Error rate spike detected");
|
|
650
587
|
}
|
|
651
588
|
|
|
652
589
|
/**
|
|
@@ -660,11 +597,8 @@ export class PerformanceAnalytics {
|
|
|
660
597
|
): void {
|
|
661
598
|
if (historicalValues.length < 5) return;
|
|
662
599
|
|
|
663
|
-
const mean =
|
|
664
|
-
|
|
665
|
-
const variance =
|
|
666
|
-
historicalValues.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) /
|
|
667
|
-
historicalValues.length;
|
|
600
|
+
const mean = historicalValues.reduce((a, b) => a + b, 0) / historicalValues.length;
|
|
601
|
+
const variance = historicalValues.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / historicalValues.length;
|
|
668
602
|
const standardDeviation = Math.sqrt(variance);
|
|
669
603
|
|
|
670
604
|
// Calculate z-score
|
|
@@ -690,10 +624,7 @@ export class PerformanceAnalytics {
|
|
|
690
624
|
actualValue: currentValue,
|
|
691
625
|
deviation,
|
|
692
626
|
severity,
|
|
693
|
-
possibleCauses: this.generatePossibleCauses(
|
|
694
|
-
metricName,
|
|
695
|
-
currentValue > mean,
|
|
696
|
-
),
|
|
627
|
+
possibleCauses: this.generatePossibleCauses(metricName, currentValue > mean),
|
|
697
628
|
};
|
|
698
629
|
|
|
699
630
|
this.detectedAnomalies.push(anomaly);
|
|
@@ -708,33 +639,15 @@ export class PerformanceAnalytics {
|
|
|
708
639
|
/**
|
|
709
640
|
* Generate possible causes for anomalies
|
|
710
641
|
*/
|
|
711
|
-
private generatePossibleCauses(
|
|
712
|
-
metricName: string,
|
|
713
|
-
isIncrease: boolean,
|
|
714
|
-
): string[] {
|
|
642
|
+
private generatePossibleCauses(metricName: string, isIncrease: boolean): string[] {
|
|
715
643
|
const causes: string[] = [];
|
|
716
644
|
|
|
717
645
|
if (metricName === "responseTime" && isIncrease) {
|
|
718
|
-
causes.push(
|
|
719
|
-
"High server load",
|
|
720
|
-
"Database performance issues",
|
|
721
|
-
"Network latency",
|
|
722
|
-
"Cache miss increase",
|
|
723
|
-
);
|
|
646
|
+
causes.push("High server load", "Database performance issues", "Network latency", "Cache miss increase");
|
|
724
647
|
} 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
|
-
);
|
|
648
|
+
causes.push("Cache invalidation event", "New data requests", "Cache size limit reached", "TTL expiration");
|
|
731
649
|
} else if (metricName === "errorRate" && isIncrease) {
|
|
732
|
-
causes.push(
|
|
733
|
-
"WordPress site issues",
|
|
734
|
-
"Authentication problems",
|
|
735
|
-
"Network connectivity",
|
|
736
|
-
"Plugin conflicts",
|
|
737
|
-
);
|
|
650
|
+
causes.push("WordPress site issues", "Authentication problems", "Network connectivity", "Plugin conflicts");
|
|
738
651
|
}
|
|
739
652
|
|
|
740
653
|
return causes;
|
|
@@ -746,39 +659,36 @@ export class PerformanceAnalytics {
|
|
|
746
659
|
private createBenchmarkComparison(
|
|
747
660
|
category: string,
|
|
748
661
|
currentValue: number,
|
|
749
|
-
benchmarks:
|
|
662
|
+
benchmarks: Record<string, unknown>,
|
|
750
663
|
higherIsBetter: boolean,
|
|
751
664
|
): BenchmarkComparison {
|
|
752
|
-
let status: "excellent" | "good" | "average" | "below_average" | "poor" =
|
|
753
|
-
"poor";
|
|
665
|
+
let status: "excellent" | "good" | "average" | "below_average" | "poor" = "poor";
|
|
754
666
|
let percentile = 0;
|
|
755
667
|
let improvement = 0;
|
|
756
668
|
|
|
757
669
|
if (higherIsBetter) {
|
|
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";
|
|
670
|
+
if (currentValue >= (benchmarks.excellent as number)) status = "excellent";
|
|
671
|
+
else if (currentValue >= (benchmarks.good as number)) status = "good";
|
|
672
|
+
else if (currentValue >= (benchmarks.average as number)) status = "average";
|
|
673
|
+
else if (currentValue >= (benchmarks.below_average as number)) status = "below_average";
|
|
763
674
|
|
|
764
675
|
// Calculate improvement needed
|
|
765
676
|
if (status !== "excellent") {
|
|
766
677
|
const nextTier =
|
|
767
678
|
status === "good"
|
|
768
|
-
? benchmarks.excellent
|
|
679
|
+
? (benchmarks.excellent as number)
|
|
769
680
|
: status === "average"
|
|
770
|
-
? benchmarks.good
|
|
681
|
+
? (benchmarks.good as number)
|
|
771
682
|
: status === "below_average"
|
|
772
|
-
? benchmarks.average
|
|
773
|
-
: benchmarks.below_average;
|
|
683
|
+
? (benchmarks.average as number)
|
|
684
|
+
: (benchmarks.below_average as number);
|
|
774
685
|
improvement = nextTier - currentValue;
|
|
775
686
|
}
|
|
776
687
|
} else {
|
|
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";
|
|
688
|
+
if (currentValue <= (benchmarks.excellent as number)) status = "excellent";
|
|
689
|
+
else if (currentValue <= (benchmarks.good as number)) status = "good";
|
|
690
|
+
else if (currentValue <= (benchmarks.average as number)) status = "average";
|
|
691
|
+
else if (currentValue <= (benchmarks.below_average as number)) status = "below_average";
|
|
782
692
|
|
|
783
693
|
// Calculate improvement needed
|
|
784
694
|
if (status !== "excellent") {
|
|
@@ -790,7 +700,7 @@ export class PerformanceAnalytics {
|
|
|
790
700
|
: status === "below_average"
|
|
791
701
|
? benchmarks.average
|
|
792
702
|
: benchmarks.below_average;
|
|
793
|
-
improvement = currentValue - nextTier;
|
|
703
|
+
improvement = currentValue - (nextTier as number);
|
|
794
704
|
}
|
|
795
705
|
}
|
|
796
706
|
|
|
@@ -809,7 +719,7 @@ export class PerformanceAnalytics {
|
|
|
809
719
|
return {
|
|
810
720
|
category,
|
|
811
721
|
currentValue,
|
|
812
|
-
benchmarkValue: benchmarks.excellent,
|
|
722
|
+
benchmarkValue: benchmarks.excellent as number,
|
|
813
723
|
percentile,
|
|
814
724
|
status,
|
|
815
725
|
improvement,
|
|
@@ -828,9 +738,7 @@ export class PerformanceAnalytics {
|
|
|
828
738
|
case "cacheHitRate":
|
|
829
739
|
return current.cache.hitRate;
|
|
830
740
|
case "errorRate":
|
|
831
|
-
return current.requests.total > 0
|
|
832
|
-
? current.requests.failed / current.requests.total
|
|
833
|
-
: 0;
|
|
741
|
+
return current.requests.total > 0 ? current.requests.failed / current.requests.total : 0;
|
|
834
742
|
case "memoryUsage":
|
|
835
743
|
return current.system.memoryUsage;
|
|
836
744
|
case "requestVolume":
|
|
@@ -852,10 +760,7 @@ export class PerformanceAnalytics {
|
|
|
852
760
|
else if (metrics.requests.averageResponseTime > 500) score -= 5;
|
|
853
761
|
|
|
854
762
|
// Error rate (25% weight)
|
|
855
|
-
const errorRate =
|
|
856
|
-
metrics.requests.total > 0
|
|
857
|
-
? metrics.requests.failed / metrics.requests.total
|
|
858
|
-
: 0;
|
|
763
|
+
const errorRate = metrics.requests.total > 0 ? metrics.requests.failed / metrics.requests.total : 0;
|
|
859
764
|
if (errorRate > 0.05) score -= 25;
|
|
860
765
|
else if (errorRate > 0.02) score -= 15;
|
|
861
766
|
else if (errorRate > 0.01) score -= 5;
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
* Collects, analyzes, and reports performance metrics
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { ConfigHelpers } from "../config/Config.js";
|
|
7
|
+
|
|
6
8
|
export interface PerformanceMetrics {
|
|
7
9
|
// Request Performance
|
|
8
10
|
requests: {
|
|
@@ -121,7 +123,8 @@ export class PerformanceMonitor {
|
|
|
121
123
|
|
|
122
124
|
this.metrics = this.initializeMetrics();
|
|
123
125
|
|
|
124
|
-
|
|
126
|
+
// Don't start collection in test environment to avoid timer issues
|
|
127
|
+
if (this.config.enableRealTimeMonitoring && !ConfigHelpers.isTest()) {
|
|
125
128
|
this.startCollection();
|
|
126
129
|
}
|
|
127
130
|
}
|
|
@@ -177,11 +180,7 @@ export class PerformanceMonitor {
|
|
|
177
180
|
/**
|
|
178
181
|
* Record a request performance metric
|
|
179
182
|
*/
|
|
180
|
-
recordRequest(
|
|
181
|
-
responseTime: number,
|
|
182
|
-
success: boolean,
|
|
183
|
-
toolName?: string,
|
|
184
|
-
): void {
|
|
183
|
+
recordRequest(responseTime: number, success: boolean, toolName?: string): void {
|
|
185
184
|
this.metrics.requests.total++;
|
|
186
185
|
|
|
187
186
|
if (success) {
|
|
@@ -208,14 +207,14 @@ export class PerformanceMonitor {
|
|
|
208
207
|
/**
|
|
209
208
|
* Update cache metrics from cache manager
|
|
210
209
|
*/
|
|
211
|
-
updateCacheMetrics(cacheStats:
|
|
210
|
+
updateCacheMetrics(cacheStats: Record<string, unknown>): void {
|
|
212
211
|
this.metrics.cache = {
|
|
213
|
-
hits: cacheStats.hits || 0,
|
|
214
|
-
misses: cacheStats.misses || 0,
|
|
215
|
-
hitRate: cacheStats.hitRate || 0,
|
|
216
|
-
totalSize: cacheStats.totalSize || 0,
|
|
217
|
-
memoryUsageMB: this.estimateCacheMemoryUsage(cacheStats.totalSize),
|
|
218
|
-
evictions: cacheStats.evictions || 0,
|
|
212
|
+
hits: (cacheStats.hits as number) || 0,
|
|
213
|
+
misses: (cacheStats.misses as number) || 0,
|
|
214
|
+
hitRate: (cacheStats.hitRate as number) || 0,
|
|
215
|
+
totalSize: (cacheStats.totalSize as number) || 0,
|
|
216
|
+
memoryUsageMB: this.estimateCacheMemoryUsage((cacheStats.totalSize as number) || 0),
|
|
217
|
+
evictions: (cacheStats.evictions as number) || 0,
|
|
219
218
|
averageCacheTime: 0.5, // Sub-millisecond average
|
|
220
219
|
};
|
|
221
220
|
}
|
|
@@ -246,10 +245,7 @@ export class PerformanceMonitor {
|
|
|
246
245
|
/**
|
|
247
246
|
* Get historical performance data
|
|
248
247
|
*/
|
|
249
|
-
getHistoricalData(
|
|
250
|
-
startTime?: number,
|
|
251
|
-
endTime?: number,
|
|
252
|
-
): PerformanceMetrics[] {
|
|
248
|
+
getHistoricalData(startTime?: number, endTime?: number): PerformanceMetrics[] {
|
|
253
249
|
if (!this.config.enableHistoricalData) {
|
|
254
250
|
return [];
|
|
255
251
|
}
|
|
@@ -317,7 +313,7 @@ export class PerformanceMonitor {
|
|
|
317
313
|
};
|
|
318
314
|
|
|
319
315
|
if (format === "csv") {
|
|
320
|
-
return this.convertToCSV(data);
|
|
316
|
+
return this.convertToCSV([data] as Record<string, unknown>[]);
|
|
321
317
|
}
|
|
322
318
|
|
|
323
319
|
return JSON.stringify(data, null, 2);
|
|
@@ -325,6 +321,7 @@ export class PerformanceMonitor {
|
|
|
325
321
|
|
|
326
322
|
/**
|
|
327
323
|
* Start automatic metric collection
|
|
324
|
+
* Note: This uses setInterval and is not called in test environments to avoid Jest timer issues
|
|
328
325
|
*/
|
|
329
326
|
private startCollection(): void {
|
|
330
327
|
this.collectionTimer = setInterval(() => {
|
|
@@ -349,14 +346,9 @@ export class PerformanceMonitor {
|
|
|
349
346
|
/**
|
|
350
347
|
* Record tool usage and performance
|
|
351
348
|
*/
|
|
352
|
-
private recordToolUsage(
|
|
353
|
-
toolName: string,
|
|
354
|
-
responseTime: number,
|
|
355
|
-
success: boolean,
|
|
356
|
-
): void {
|
|
349
|
+
private recordToolUsage(toolName: string, responseTime: number, success: boolean): void {
|
|
357
350
|
// Update usage count
|
|
358
|
-
this.metrics.tools.toolUsageCount[toolName] =
|
|
359
|
-
(this.metrics.tools.toolUsageCount[toolName] || 0) + 1;
|
|
351
|
+
this.metrics.tools.toolUsageCount[toolName] = (this.metrics.tools.toolUsageCount[toolName] || 0) + 1;
|
|
360
352
|
|
|
361
353
|
// Update performance metrics
|
|
362
354
|
if (!this.metrics.tools.toolPerformance[toolName]) {
|
|
@@ -370,12 +362,10 @@ export class PerformanceMonitor {
|
|
|
370
362
|
const totalCalls = perf.callCount + 1;
|
|
371
363
|
|
|
372
364
|
// Update average time
|
|
373
|
-
perf.averageTime =
|
|
374
|
-
(perf.averageTime * perf.callCount + responseTime) / totalCalls;
|
|
365
|
+
perf.averageTime = (perf.averageTime * perf.callCount + responseTime) / totalCalls;
|
|
375
366
|
|
|
376
367
|
// Update success rate
|
|
377
|
-
const totalSuccess =
|
|
378
|
-
perf.successRate * perf.callCount + (success ? 1 : 0);
|
|
368
|
+
const totalSuccess = perf.successRate * perf.callCount + (success ? 1 : 0);
|
|
379
369
|
perf.successRate = totalSuccess / totalCalls;
|
|
380
370
|
|
|
381
371
|
perf.callCount = totalCalls;
|
|
@@ -398,8 +388,7 @@ export class PerformanceMonitor {
|
|
|
398
388
|
const total = this.metrics.requests.total;
|
|
399
389
|
|
|
400
390
|
this.metrics.requests.averageResponseTime =
|
|
401
|
-
this.responseTimes.reduce((sum, time) => sum + time, 0) /
|
|
402
|
-
this.responseTimes.length;
|
|
391
|
+
this.responseTimes.reduce((sum, time) => sum + time, 0) / this.responseTimes.length;
|
|
403
392
|
|
|
404
393
|
this.metrics.requests.minResponseTime = sorted[0];
|
|
405
394
|
this.metrics.requests.maxResponseTime = sorted[sorted.length - 1];
|
|
@@ -464,8 +453,7 @@ export class PerformanceMonitor {
|
|
|
464
453
|
}
|
|
465
454
|
|
|
466
455
|
// Error rate alert
|
|
467
|
-
const errorRate =
|
|
468
|
-
this.metrics.requests.failed / this.metrics.requests.total;
|
|
456
|
+
const errorRate = this.metrics.requests.failed / this.metrics.requests.total;
|
|
469
457
|
if (errorRate > thresholds.errorRate) {
|
|
470
458
|
this.addAlert(
|
|
471
459
|
"error",
|
|
@@ -527,9 +515,7 @@ export class PerformanceMonitor {
|
|
|
527
515
|
/**
|
|
528
516
|
* Calculate overall system health
|
|
529
517
|
*/
|
|
530
|
-
private calculateOverallHealth(
|
|
531
|
-
metrics: PerformanceMetrics,
|
|
532
|
-
): "excellent" | "good" | "warning" | "critical" {
|
|
518
|
+
private calculateOverallHealth(metrics: PerformanceMetrics): "excellent" | "good" | "warning" | "critical" {
|
|
533
519
|
let score = 100;
|
|
534
520
|
|
|
535
521
|
// Response time impact
|
|
@@ -560,9 +546,7 @@ export class PerformanceMonitor {
|
|
|
560
546
|
*/
|
|
561
547
|
private generateSummary(metrics: PerformanceMetrics): string {
|
|
562
548
|
const errorRate =
|
|
563
|
-
metrics.requests.total > 0
|
|
564
|
-
? ((metrics.requests.failed / metrics.requests.total) * 100).toFixed(1)
|
|
565
|
-
: "0";
|
|
549
|
+
metrics.requests.total > 0 ? ((metrics.requests.failed / metrics.requests.total) * 100).toFixed(1) : "0";
|
|
566
550
|
|
|
567
551
|
return (
|
|
568
552
|
`Performance Summary: ${metrics.requests.total} requests processed with ${errorRate}% error rate. ` +
|
|
@@ -587,9 +571,7 @@ export class PerformanceMonitor {
|
|
|
587
571
|
}
|
|
588
572
|
|
|
589
573
|
if (metrics.system.memoryUsage > 80) {
|
|
590
|
-
recommendations.push(
|
|
591
|
-
"Consider increasing memory allocation or cache size limits",
|
|
592
|
-
);
|
|
574
|
+
recommendations.push("Consider increasing memory allocation or cache size limits");
|
|
593
575
|
}
|
|
594
576
|
|
|
595
577
|
const errorRate = metrics.requests.failed / metrics.requests.total;
|
|
@@ -653,9 +635,14 @@ export class PerformanceMonitor {
|
|
|
653
635
|
/**
|
|
654
636
|
* Convert data to CSV format
|
|
655
637
|
*/
|
|
656
|
-
private convertToCSV(data:
|
|
638
|
+
private convertToCSV(data: Record<string, unknown>[]): string {
|
|
657
639
|
// Simplified CSV conversion for metrics
|
|
658
|
-
const
|
|
640
|
+
const reportData = data[0];
|
|
641
|
+
const metrics = reportData?.currentMetrics as {
|
|
642
|
+
requests: { total: number; successful: number; failed: number; averageResponseTime: number };
|
|
643
|
+
cache: { hitRate: number; totalSize: number };
|
|
644
|
+
system: { memoryUsage: number; uptime: number };
|
|
645
|
+
};
|
|
659
646
|
const csv = [
|
|
660
647
|
"Metric,Value",
|
|
661
648
|
`Total Requests,${metrics.requests.total}`,
|
|
@@ -676,8 +663,6 @@ export class PerformanceMonitor {
|
|
|
676
663
|
*/
|
|
677
664
|
private cleanupOldData(): void {
|
|
678
665
|
const cutoff = Date.now() - this.config.retentionPeriod;
|
|
679
|
-
this.historicalData = this.historicalData.filter(
|
|
680
|
-
(data) => data.system.uptime > cutoff,
|
|
681
|
-
);
|
|
666
|
+
this.historicalData = this.historicalData.filter((data) => data.system.uptime > cutoff);
|
|
682
667
|
}
|
|
683
668
|
}
|
package/src/performance/index.ts
CHANGED
|
@@ -7,17 +7,9 @@ export { PerformanceMonitor } from "./PerformanceMonitor.js";
|
|
|
7
7
|
export { MetricsCollector } from "./MetricsCollector.js";
|
|
8
8
|
export { PerformanceAnalytics } from "./PerformanceAnalytics.js";
|
|
9
9
|
|
|
10
|
-
export type {
|
|
11
|
-
PerformanceMetrics,
|
|
12
|
-
PerformanceAlert,
|
|
13
|
-
PerformanceConfig,
|
|
14
|
-
} from "./PerformanceMonitor.js";
|
|
10
|
+
export type { PerformanceMetrics, PerformanceAlert, PerformanceConfig } from "./PerformanceMonitor.js";
|
|
15
11
|
|
|
16
|
-
export type {
|
|
17
|
-
CollectorConfig,
|
|
18
|
-
RequestMetadata,
|
|
19
|
-
ToolExecutionContext,
|
|
20
|
-
} from "./MetricsCollector.js";
|
|
12
|
+
export type { CollectorConfig, RequestMetadata, ToolExecutionContext } from "./MetricsCollector.js";
|
|
21
13
|
|
|
22
14
|
export type {
|
|
23
15
|
AnalyticsConfig,
|