mcp-wordpress 2.4.1 → 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/BRANCH_PROTECTION.md +0 -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/docs/v2.2.0-resolution-demo.md +119 -0
- 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
|
@@ -3,12 +3,11 @@
|
|
|
3
3
|
* Integrates with existing client and cache systems
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
PerformanceMonitor,
|
|
8
|
-
PerformanceMetrics,
|
|
9
|
-
} from "./PerformanceMonitor.js";
|
|
6
|
+
import { PerformanceMonitor, PerformanceMetrics } from "./PerformanceMonitor.js";
|
|
10
7
|
import type { CacheStats } from "../cache/CacheManager.js";
|
|
11
8
|
import type { ClientStats } from "../types/client.js";
|
|
9
|
+
import { ConfigHelpers } from "../config/Config.js";
|
|
10
|
+
import { LoggerFactory } from "../utils/logger.js";
|
|
12
11
|
|
|
13
12
|
export interface CollectorConfig {
|
|
14
13
|
enableRealTime: boolean;
|
|
@@ -30,7 +29,7 @@ export interface RequestMetadata {
|
|
|
30
29
|
|
|
31
30
|
export interface ToolExecutionContext {
|
|
32
31
|
toolName: string;
|
|
33
|
-
parameters:
|
|
32
|
+
parameters: Record<string, unknown>;
|
|
34
33
|
startTime: number;
|
|
35
34
|
siteId: string | undefined;
|
|
36
35
|
}
|
|
@@ -43,13 +42,12 @@ export class MetricsCollector {
|
|
|
43
42
|
private config: CollectorConfig;
|
|
44
43
|
private activeRequests: Map<string, RequestMetadata> = new Map();
|
|
45
44
|
private activeTools: Map<string, ToolExecutionContext> = new Map();
|
|
46
|
-
private clientInstances: Map<string,
|
|
47
|
-
private cacheManagers: Map<string,
|
|
45
|
+
private clientInstances: Map<string, unknown> = new Map();
|
|
46
|
+
private cacheManagers: Map<string, unknown> = new Map();
|
|
47
|
+
private logger = LoggerFactory.performance();
|
|
48
|
+
private realTimeInterval?: NodeJS.Timeout | undefined;
|
|
48
49
|
|
|
49
|
-
constructor(
|
|
50
|
-
monitor: PerformanceMonitor,
|
|
51
|
-
config: Partial<CollectorConfig> = {},
|
|
52
|
-
) {
|
|
50
|
+
constructor(monitor: PerformanceMonitor, config: Partial<CollectorConfig> = {}) {
|
|
53
51
|
this.monitor = monitor;
|
|
54
52
|
this.config = {
|
|
55
53
|
enableRealTime: true,
|
|
@@ -61,37 +59,36 @@ export class MetricsCollector {
|
|
|
61
59
|
...config,
|
|
62
60
|
};
|
|
63
61
|
|
|
64
|
-
|
|
62
|
+
// Only enable real-time collection in appropriate environments
|
|
63
|
+
if (this.config.enableRealTime && (ConfigHelpers.isDev() || ConfigHelpers.isProd())) {
|
|
65
64
|
this.startRealTimeCollection();
|
|
65
|
+
} else if (ConfigHelpers.isTest() || ConfigHelpers.isCI()) {
|
|
66
|
+
this.logger.debug("Skipping real-time metrics collection in test/CI environment");
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
/**
|
|
70
71
|
* Register a WordPress client for monitoring
|
|
71
72
|
*/
|
|
72
|
-
registerClient(siteId: string, client:
|
|
73
|
+
registerClient(siteId: string, client: unknown): void {
|
|
73
74
|
this.clientInstances.set(siteId, client);
|
|
74
75
|
|
|
75
76
|
if (this.config.enableRequestInterception) {
|
|
76
|
-
this.interceptClientRequests(siteId, client);
|
|
77
|
+
this.interceptClientRequests(siteId, client as Record<string, unknown>);
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
/**
|
|
81
82
|
* Register a cache manager for monitoring
|
|
82
83
|
*/
|
|
83
|
-
registerCacheManager(siteId: string, cacheManager:
|
|
84
|
+
registerCacheManager(siteId: string, cacheManager: unknown): void {
|
|
84
85
|
this.cacheManagers.set(siteId, cacheManager);
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
/**
|
|
88
89
|
* Start tracking a tool execution
|
|
89
90
|
*/
|
|
90
|
-
startToolExecution(
|
|
91
|
-
toolName: string,
|
|
92
|
-
parameters: any,
|
|
93
|
-
siteId?: string,
|
|
94
|
-
): string {
|
|
91
|
+
startToolExecution(toolName: string, parameters: Record<string, unknown>, siteId?: string): string {
|
|
95
92
|
const executionId = `${toolName}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
96
93
|
|
|
97
94
|
this.activeTools.set(executionId, {
|
|
@@ -122,12 +119,7 @@ export class MetricsCollector {
|
|
|
122
119
|
/**
|
|
123
120
|
* Record a raw request (bypass tool tracking)
|
|
124
121
|
*/
|
|
125
|
-
recordRawRequest(
|
|
126
|
-
responseTime: number,
|
|
127
|
-
success: boolean,
|
|
128
|
-
endpoint: string,
|
|
129
|
-
fromCache: boolean = false,
|
|
130
|
-
): void {
|
|
122
|
+
recordRawRequest(responseTime: number, success: boolean, endpoint: string, fromCache: boolean = false): void {
|
|
131
123
|
this.monitor.recordRequest(responseTime, success);
|
|
132
124
|
}
|
|
133
125
|
|
|
@@ -158,8 +150,9 @@ export class MetricsCollector {
|
|
|
158
150
|
};
|
|
159
151
|
|
|
160
152
|
for (const [_siteId, cacheManager] of this.cacheManagers) {
|
|
161
|
-
|
|
162
|
-
|
|
153
|
+
const manager = cacheManager as { getStats?: () => CacheStats };
|
|
154
|
+
if (manager && typeof manager.getStats === "function") {
|
|
155
|
+
const stats = manager.getStats();
|
|
163
156
|
aggregated.hits += stats.hits || 0;
|
|
164
157
|
aggregated.misses += stats.misses || 0;
|
|
165
158
|
aggregated.evictions += stats.evictions || 0;
|
|
@@ -190,8 +183,9 @@ export class MetricsCollector {
|
|
|
190
183
|
const responseTimes: number[] = [];
|
|
191
184
|
|
|
192
185
|
for (const [_siteId, client] of this.clientInstances) {
|
|
193
|
-
|
|
194
|
-
|
|
186
|
+
const clientObj = client as { getStats?: () => ClientStats };
|
|
187
|
+
if (clientObj && typeof clientObj.getStats === "function") {
|
|
188
|
+
const stats = clientObj.getStats();
|
|
195
189
|
aggregated.totalRequests += stats.totalRequests || 0;
|
|
196
190
|
aggregated.successfulRequests += stats.successfulRequests || 0;
|
|
197
191
|
aggregated.failedRequests += stats.failedRequests || 0;
|
|
@@ -206,9 +200,7 @@ export class MetricsCollector {
|
|
|
206
200
|
|
|
207
201
|
// Calculate overall average response time
|
|
208
202
|
if (responseTimes.length > 0) {
|
|
209
|
-
aggregated.averageResponseTime =
|
|
210
|
-
responseTimes.reduce((sum, time) => sum + time, 0) /
|
|
211
|
-
responseTimes.length;
|
|
203
|
+
aggregated.averageResponseTime = responseTimes.reduce((sum, time) => sum + time, 0) / responseTimes.length;
|
|
212
204
|
}
|
|
213
205
|
|
|
214
206
|
return aggregated;
|
|
@@ -222,21 +214,23 @@ export class MetricsCollector {
|
|
|
222
214
|
client?: ClientStats;
|
|
223
215
|
isActive: boolean;
|
|
224
216
|
} {
|
|
225
|
-
const result:
|
|
217
|
+
const result: Record<string, unknown> = { isActive: false };
|
|
226
218
|
|
|
227
219
|
const cacheManager = this.cacheManagers.get(siteId);
|
|
228
|
-
|
|
229
|
-
|
|
220
|
+
const cacheObj = cacheManager as { getStats?: () => CacheStats } | undefined;
|
|
221
|
+
if (cacheObj && typeof cacheObj.getStats === "function") {
|
|
222
|
+
result.cache = cacheObj.getStats();
|
|
230
223
|
result.isActive = true;
|
|
231
224
|
}
|
|
232
225
|
|
|
233
226
|
const client = this.clientInstances.get(siteId);
|
|
234
|
-
|
|
235
|
-
|
|
227
|
+
const clientObj = client as { getStats?: () => ClientStats } | undefined;
|
|
228
|
+
if (clientObj && typeof clientObj.getStats === "function") {
|
|
229
|
+
result.client = clientObj.getStats();
|
|
236
230
|
result.isActive = true;
|
|
237
231
|
}
|
|
238
232
|
|
|
239
|
-
return result;
|
|
233
|
+
return result as { cache?: CacheStats; client?: ClientStats; isActive: boolean };
|
|
240
234
|
}
|
|
241
235
|
|
|
242
236
|
/**
|
|
@@ -258,7 +252,13 @@ export class MetricsCollector {
|
|
|
258
252
|
worstPerforming: string;
|
|
259
253
|
} {
|
|
260
254
|
const sites = Array.from(this.clientInstances.keys());
|
|
261
|
-
const comparison:
|
|
255
|
+
const comparison: Record<string, {
|
|
256
|
+
responseTime: number;
|
|
257
|
+
cacheHitRate: number;
|
|
258
|
+
errorRate: number;
|
|
259
|
+
requestCount: number;
|
|
260
|
+
ranking: number;
|
|
261
|
+
}> = {};
|
|
262
262
|
const rankings: Array<{ site: string; score: number }> = [];
|
|
263
263
|
|
|
264
264
|
for (const siteId of sites) {
|
|
@@ -266,18 +266,11 @@ export class MetricsCollector {
|
|
|
266
266
|
|
|
267
267
|
const responseTime = metrics.client?.averageResponseTime || 0;
|
|
268
268
|
const cacheHitRate = metrics.cache?.hitRate || 0;
|
|
269
|
-
const errorRate = metrics.client
|
|
270
|
-
? metrics.client.failedRequests /
|
|
271
|
-
Math.max(metrics.client.totalRequests, 1)
|
|
272
|
-
: 0;
|
|
269
|
+
const errorRate = metrics.client ? metrics.client.failedRequests / Math.max(metrics.client.totalRequests, 1) : 0;
|
|
273
270
|
const requestCount = metrics.client?.totalRequests || 0;
|
|
274
271
|
|
|
275
272
|
// Calculate performance score (lower is better for response time and error rate)
|
|
276
|
-
const score =
|
|
277
|
-
responseTime / 1000 +
|
|
278
|
-
errorRate * 100 -
|
|
279
|
-
cacheHitRate * 50 +
|
|
280
|
-
requestCount * 0.001;
|
|
273
|
+
const score = responseTime / 1000 + errorRate * 100 - cacheHitRate * 50 + requestCount * 0.001;
|
|
281
274
|
|
|
282
275
|
comparison[siteId] = {
|
|
283
276
|
responseTime,
|
|
@@ -295,7 +288,10 @@ export class MetricsCollector {
|
|
|
295
288
|
|
|
296
289
|
// Assign rankings
|
|
297
290
|
rankings.forEach((item, index) => {
|
|
298
|
-
comparison[item.site]
|
|
291
|
+
const siteData = comparison[item.site];
|
|
292
|
+
if (siteData) {
|
|
293
|
+
siteData.ranking = index + 1;
|
|
294
|
+
}
|
|
299
295
|
});
|
|
300
296
|
|
|
301
297
|
return {
|
|
@@ -321,49 +317,34 @@ export class MetricsCollector {
|
|
|
321
317
|
|
|
322
318
|
// Critical issues
|
|
323
319
|
if (metrics.requests.averageResponseTime > 5000) {
|
|
324
|
-
critical.push(
|
|
325
|
-
"Response times are critically high (>5s). Enable caching immediately.",
|
|
326
|
-
);
|
|
320
|
+
critical.push("Response times are critically high (>5s). Enable caching immediately.");
|
|
327
321
|
}
|
|
328
322
|
|
|
329
|
-
const errorRate =
|
|
330
|
-
metrics.requests.failed / Math.max(metrics.requests.total, 1);
|
|
323
|
+
const errorRate = metrics.requests.failed / Math.max(metrics.requests.total, 1);
|
|
331
324
|
if (errorRate > 0.1) {
|
|
332
|
-
critical.push(
|
|
333
|
-
"Error rate is critically high (>10%). Check WordPress connectivity.",
|
|
334
|
-
);
|
|
325
|
+
critical.push("Error rate is critically high (>10%). Check WordPress connectivity.");
|
|
335
326
|
}
|
|
336
327
|
|
|
337
328
|
// Recommended optimizations
|
|
338
329
|
if (metrics.cache.hitRate < 0.8) {
|
|
339
|
-
recommended.push(
|
|
340
|
-
"Cache hit rate is below 80%. Consider cache warming or TTL adjustment.",
|
|
341
|
-
);
|
|
330
|
+
recommended.push("Cache hit rate is below 80%. Consider cache warming or TTL adjustment.");
|
|
342
331
|
}
|
|
343
332
|
|
|
344
333
|
if (metrics.requests.averageResponseTime > 2000) {
|
|
345
|
-
recommended.push(
|
|
346
|
-
"Response times could be improved. Consider enabling more aggressive caching.",
|
|
347
|
-
);
|
|
334
|
+
recommended.push("Response times could be improved. Consider enabling more aggressive caching.");
|
|
348
335
|
}
|
|
349
336
|
|
|
350
337
|
if (metrics.system.memoryUsage > 80) {
|
|
351
|
-
recommended.push(
|
|
352
|
-
"Memory usage is high. Consider increasing cache size limits or server resources.",
|
|
353
|
-
);
|
|
338
|
+
recommended.push("Memory usage is high. Consider increasing cache size limits or server resources.");
|
|
354
339
|
}
|
|
355
340
|
|
|
356
341
|
// Optional optimizations
|
|
357
342
|
if (metrics.cache.totalSize < 100) {
|
|
358
|
-
optional.push(
|
|
359
|
-
"Cache utilization is low. Consider pre-warming with frequently accessed data.",
|
|
360
|
-
);
|
|
343
|
+
optional.push("Cache utilization is low. Consider pre-warming with frequently accessed data.");
|
|
361
344
|
}
|
|
362
345
|
|
|
363
346
|
if (Object.keys(metrics.tools.toolUsageCount).length > 10) {
|
|
364
|
-
optional.push(
|
|
365
|
-
"Many tools are being used. Consider creating custom workflows for common operations.",
|
|
366
|
-
);
|
|
347
|
+
optional.push("Many tools are being used. Consider creating custom workflows for common operations.");
|
|
367
348
|
}
|
|
368
349
|
|
|
369
350
|
return { critical, recommended, optional };
|
|
@@ -375,13 +356,13 @@ export class MetricsCollector {
|
|
|
375
356
|
exportDetailedReport(): {
|
|
376
357
|
timestamp: string;
|
|
377
358
|
overview: PerformanceMetrics;
|
|
378
|
-
siteComparison:
|
|
359
|
+
siteComparison: Record<string, unknown>;
|
|
379
360
|
aggregatedStats: {
|
|
380
361
|
cache: CacheStats;
|
|
381
362
|
client: ClientStats;
|
|
382
363
|
};
|
|
383
|
-
optimizations:
|
|
384
|
-
alerts:
|
|
364
|
+
optimizations: Record<string, unknown>;
|
|
365
|
+
alerts: unknown[];
|
|
385
366
|
} {
|
|
386
367
|
return {
|
|
387
368
|
timestamp: new Date().toISOString(),
|
|
@@ -400,10 +381,43 @@ export class MetricsCollector {
|
|
|
400
381
|
* Start real-time metric collection
|
|
401
382
|
*/
|
|
402
383
|
private startRealTimeCollection(): void {
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
}
|
|
384
|
+
// Skip in test/CI environments to prevent performance issues
|
|
385
|
+
if (ConfigHelpers.isTest() || ConfigHelpers.isCI()) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Adjust collection frequency based on environment
|
|
390
|
+
const interval = ConfigHelpers.isDev()
|
|
391
|
+
? Math.max(this.config.collectInterval * 2, 60000) // Longer intervals in dev
|
|
392
|
+
: this.config.collectInterval;
|
|
393
|
+
|
|
394
|
+
this.logger.info("Starting real-time metrics collection", {
|
|
395
|
+
interval: `${interval / 1000}s`,
|
|
396
|
+
environment: ConfigHelpers.get().get().app.nodeEnv,
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
this.realTimeInterval = setInterval(() => {
|
|
400
|
+
try {
|
|
401
|
+
this.updateCacheMetrics();
|
|
402
|
+
this.updateClientMetrics();
|
|
403
|
+
this.logger.debug("Real-time metrics updated");
|
|
404
|
+
} catch (error) {
|
|
405
|
+
this.logger.error("Failed to update real-time metrics", {
|
|
406
|
+
error: error instanceof Error ? error.message : String(error),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}, interval);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Stop real-time collection and cleanup resources
|
|
414
|
+
*/
|
|
415
|
+
public destroy(): void {
|
|
416
|
+
if (this.realTimeInterval) {
|
|
417
|
+
clearInterval(this.realTimeInterval);
|
|
418
|
+
this.realTimeInterval = undefined;
|
|
419
|
+
this.logger.info("Real-time metrics collection stopped");
|
|
420
|
+
}
|
|
407
421
|
}
|
|
408
422
|
|
|
409
423
|
/**
|
|
@@ -411,7 +425,8 @@ export class MetricsCollector {
|
|
|
411
425
|
*/
|
|
412
426
|
private updateCacheMetrics(): void {
|
|
413
427
|
const aggregatedStats = this.getAggregatedCacheStats();
|
|
414
|
-
|
|
428
|
+
// Type assertion: convert CacheStats to Record<string, unknown> via unknown
|
|
429
|
+
this.monitor.updateCacheMetrics(aggregatedStats as unknown as Record<string, unknown>);
|
|
415
430
|
}
|
|
416
431
|
|
|
417
432
|
/**
|
|
@@ -425,22 +440,29 @@ export class MetricsCollector {
|
|
|
425
440
|
/**
|
|
426
441
|
* Intercept client requests for automatic tracking
|
|
427
442
|
*/
|
|
428
|
-
private interceptClientRequests(siteId: string, client:
|
|
443
|
+
private interceptClientRequests(siteId: string, client: Record<string, unknown>): void {
|
|
429
444
|
if (!client.request || typeof client.request !== "function") {
|
|
430
445
|
return;
|
|
431
446
|
}
|
|
432
447
|
|
|
433
448
|
const originalRequest = client.request.bind(client);
|
|
434
449
|
|
|
435
|
-
|
|
450
|
+
const clientObj = client as {
|
|
451
|
+
request?: (...args: unknown[]) => Promise<unknown>;
|
|
452
|
+
originalRequest?: (...args: unknown[]) => Promise<unknown>;
|
|
453
|
+
};
|
|
454
|
+
if (!clientObj.request) return;
|
|
455
|
+
|
|
456
|
+
clientObj.originalRequest = clientObj.request;
|
|
457
|
+
clientObj.request = async (...args: unknown[]) => {
|
|
436
458
|
const startTime = Date.now();
|
|
437
459
|
const requestId = `${siteId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
438
460
|
|
|
439
|
-
// Extract metadata
|
|
461
|
+
// Extract metadata with proper type assertions
|
|
440
462
|
const metadata: RequestMetadata = {
|
|
441
463
|
siteId,
|
|
442
|
-
endpoint: args[0] || "unknown",
|
|
443
|
-
method: args[1] || "GET",
|
|
464
|
+
endpoint: (args[0] as string) || "unknown",
|
|
465
|
+
method: (args[1] as string) || "GET",
|
|
444
466
|
startTime,
|
|
445
467
|
fromCache: false,
|
|
446
468
|
};
|