claude-flow-novice 2.0.3 → 2.0.4
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/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -1,493 +1,418 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Real Performance Metrics Collection System
|
|
3
3
|
* Tracks actual system performance, agent activity, and resource usage
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import os from 'os';
|
|
9
|
-
import { performance } from 'perf_hooks';
|
|
10
|
-
|
|
4
|
+
*/ import { promises as fs } from "fs";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import os from "os";
|
|
7
|
+
import { performance } from "perf_hooks";
|
|
11
8
|
// Metrics storage path
|
|
12
9
|
const METRICS_DIR = path.join(process.cwd(), '.claude-flow', 'metrics');
|
|
13
10
|
const PERFORMANCE_FILE = path.join(METRICS_DIR, 'performance.json');
|
|
14
11
|
const AGENT_METRICS_FILE = path.join(METRICS_DIR, 'agent-metrics.json');
|
|
15
12
|
const TASK_METRICS_FILE = path.join(METRICS_DIR, 'task-metrics.json');
|
|
16
13
|
const SYSTEM_METRICS_FILE = path.join(METRICS_DIR, 'system-metrics.json');
|
|
17
|
-
|
|
18
14
|
// In-memory metrics cache
|
|
19
15
|
let metricsCache = {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
16
|
+
tasks: [],
|
|
17
|
+
agents: {},
|
|
18
|
+
system: [],
|
|
19
|
+
performance: {
|
|
20
|
+
startTime: Date.now(),
|
|
21
|
+
totalTasks: 0,
|
|
22
|
+
successfulTasks: 0,
|
|
23
|
+
failedTasks: 0,
|
|
24
|
+
totalAgents: 0,
|
|
25
|
+
activeAgents: 0,
|
|
26
|
+
neuralEvents: 0
|
|
27
|
+
}
|
|
32
28
|
};
|
|
33
|
-
|
|
34
29
|
// Store interval ID for cleanup
|
|
35
30
|
let systemMonitoringInterval = null;
|
|
36
|
-
|
|
37
31
|
// Initialize metrics system
|
|
38
32
|
export async function initializeMetrics(startMonitoring = true) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
33
|
+
try {
|
|
34
|
+
await fs.mkdir(METRICS_DIR, {
|
|
35
|
+
recursive: true
|
|
36
|
+
});
|
|
37
|
+
// Load existing metrics if available
|
|
38
|
+
await loadMetricsFromDisk();
|
|
39
|
+
// Start system monitoring only if requested
|
|
40
|
+
if (startMonitoring) {
|
|
41
|
+
startSystemMonitoring();
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
} catch (err) {
|
|
45
|
+
console.error('Failed to initialize metrics:', err);
|
|
46
|
+
return false;
|
|
48
47
|
}
|
|
49
|
-
|
|
50
|
-
return true;
|
|
51
|
-
} catch (err) {
|
|
52
|
-
console.error('Failed to initialize metrics:', err);
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
48
|
}
|
|
56
|
-
|
|
57
49
|
// Load metrics from disk
|
|
58
50
|
async function loadMetricsFromDisk() {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
51
|
+
try {
|
|
52
|
+
// Load performance metrics
|
|
53
|
+
if (await fileExists(PERFORMANCE_FILE)) {
|
|
54
|
+
const data = await fs.readFile(PERFORMANCE_FILE, 'utf8');
|
|
55
|
+
const saved = JSON.parse(data);
|
|
56
|
+
metricsCache.performance = {
|
|
57
|
+
...metricsCache.performance,
|
|
58
|
+
...saved
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Load task metrics
|
|
62
|
+
if (await fileExists(TASK_METRICS_FILE)) {
|
|
63
|
+
const data = await fs.readFile(TASK_METRICS_FILE, 'utf8');
|
|
64
|
+
metricsCache.tasks = JSON.parse(data);
|
|
65
|
+
}
|
|
66
|
+
// Load agent metrics
|
|
67
|
+
if (await fileExists(AGENT_METRICS_FILE)) {
|
|
68
|
+
const data = await fs.readFile(AGENT_METRICS_FILE, 'utf8');
|
|
69
|
+
metricsCache.agents = JSON.parse(data);
|
|
70
|
+
}
|
|
71
|
+
} catch (err) {
|
|
79
72
|
// Ignore errors, start fresh
|
|
80
|
-
|
|
73
|
+
}
|
|
81
74
|
}
|
|
82
|
-
|
|
83
75
|
// Save metrics to disk
|
|
84
76
|
async function saveMetricsToDisk() {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
77
|
+
try {
|
|
78
|
+
await fs.writeFile(PERFORMANCE_FILE, JSON.stringify(metricsCache.performance, null, 2));
|
|
79
|
+
await fs.writeFile(TASK_METRICS_FILE, JSON.stringify(metricsCache.tasks, null, 2));
|
|
80
|
+
await fs.writeFile(AGENT_METRICS_FILE, JSON.stringify(metricsCache.agents, null, 2));
|
|
81
|
+
} catch (err) {
|
|
90
82
|
// Ignore save errors
|
|
91
|
-
|
|
83
|
+
}
|
|
92
84
|
}
|
|
93
|
-
|
|
94
85
|
// Track task execution
|
|
95
86
|
export async function trackTaskExecution(taskId, taskType, success, duration, metadata = {}) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
metricsCache.tasks = metricsCache.tasks.slice(-1000);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
await saveMetricsToDisk();
|
|
87
|
+
const task = {
|
|
88
|
+
id: taskId,
|
|
89
|
+
type: taskType,
|
|
90
|
+
success,
|
|
91
|
+
duration,
|
|
92
|
+
timestamp: Date.now(),
|
|
93
|
+
metadata
|
|
94
|
+
};
|
|
95
|
+
metricsCache.tasks.push(task);
|
|
96
|
+
metricsCache.performance.totalTasks++;
|
|
97
|
+
if (success) {
|
|
98
|
+
metricsCache.performance.successfulTasks++;
|
|
99
|
+
} else {
|
|
100
|
+
metricsCache.performance.failedTasks++;
|
|
101
|
+
}
|
|
102
|
+
// Keep only last 1000 tasks
|
|
103
|
+
if (metricsCache.tasks.length > 1000) {
|
|
104
|
+
metricsCache.tasks = metricsCache.tasks.slice(-1000);
|
|
105
|
+
}
|
|
106
|
+
await saveMetricsToDisk();
|
|
120
107
|
}
|
|
121
|
-
|
|
122
108
|
// Track agent activity
|
|
123
109
|
export async function trackAgentActivity(agentId, agentType, action, duration, success = true) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
agent.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
agent.actions = agent.actions.slice(-100);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
metricsCache.performance.totalAgents = Object.keys(metricsCache.agents).length;
|
|
158
|
-
|
|
159
|
-
await saveMetricsToDisk();
|
|
110
|
+
if (!metricsCache.agents[agentType]) {
|
|
111
|
+
metricsCache.agents[agentType] = {
|
|
112
|
+
total: 0,
|
|
113
|
+
successful: 0,
|
|
114
|
+
failed: 0,
|
|
115
|
+
totalDuration: 0,
|
|
116
|
+
actions: []
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const agent = metricsCache.agents[agentType];
|
|
120
|
+
agent.total++;
|
|
121
|
+
agent.totalDuration += duration;
|
|
122
|
+
if (success) {
|
|
123
|
+
agent.successful++;
|
|
124
|
+
} else {
|
|
125
|
+
agent.failed++;
|
|
126
|
+
}
|
|
127
|
+
agent.actions.push({
|
|
128
|
+
id: agentId,
|
|
129
|
+
action,
|
|
130
|
+
duration,
|
|
131
|
+
success,
|
|
132
|
+
timestamp: Date.now()
|
|
133
|
+
});
|
|
134
|
+
// Keep only last 100 actions per agent type
|
|
135
|
+
if (agent.actions.length > 100) {
|
|
136
|
+
agent.actions = agent.actions.slice(-100);
|
|
137
|
+
}
|
|
138
|
+
metricsCache.performance.totalAgents = Object.keys(metricsCache.agents).length;
|
|
139
|
+
await saveMetricsToDisk();
|
|
160
140
|
}
|
|
161
|
-
|
|
162
141
|
// Track neural events
|
|
163
142
|
export async function trackNeuralEvent(eventType, metadata = {}) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
await saveMetricsToDisk();
|
|
143
|
+
metricsCache.performance.neuralEvents++;
|
|
144
|
+
await saveMetricsToDisk();
|
|
167
145
|
}
|
|
168
|
-
|
|
169
146
|
// Get performance report data
|
|
170
147
|
export async function getPerformanceReport(timeframe = '24h') {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
summary: {
|
|
223
|
-
totalTasks,
|
|
224
|
-
successRate,
|
|
225
|
-
avgDuration: avgDuration / 1000, // Convert to seconds
|
|
226
|
-
agentsSpawned: Object.values(agentMetrics).reduce((sum, m) => sum + m.total, 0),
|
|
227
|
-
memoryEfficiency: systemMetrics.memoryEfficiency,
|
|
228
|
-
neuralEvents: metricsCache.performance.neuralEvents,
|
|
229
|
-
},
|
|
230
|
-
agentMetrics,
|
|
231
|
-
systemMetrics,
|
|
232
|
-
trends,
|
|
233
|
-
tasks: recentTasks.slice(-20), // Last 20 tasks
|
|
234
|
-
};
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
const timeframeMs = parseTimeframe(timeframe);
|
|
150
|
+
const cutoff = now - timeframeMs;
|
|
151
|
+
// Filter tasks within timeframe
|
|
152
|
+
const recentTasks = metricsCache.tasks.filter((task)=>task.timestamp >= cutoff);
|
|
153
|
+
// Calculate metrics
|
|
154
|
+
const totalTasks = recentTasks.length;
|
|
155
|
+
const successfulTasks = recentTasks.filter((t)=>t.success).length;
|
|
156
|
+
const successRate = totalTasks > 0 ? successfulTasks / totalTasks * 100 : 0;
|
|
157
|
+
const avgDuration = totalTasks > 0 ? recentTasks.reduce((sum, t)=>sum + t.duration, 0) / totalTasks : 0;
|
|
158
|
+
// Agent metrics
|
|
159
|
+
const agentMetrics = {};
|
|
160
|
+
Object.entries(metricsCache.agents).forEach(([type, data])=>{
|
|
161
|
+
const recentActions = data.actions.filter((a)=>a.timestamp >= cutoff);
|
|
162
|
+
if (recentActions.length > 0) {
|
|
163
|
+
const successCount = recentActions.filter((a)=>a.success).length;
|
|
164
|
+
const avgDur = recentActions.reduce((sum, a)=>sum + a.duration, 0) / recentActions.length;
|
|
165
|
+
agentMetrics[type] = {
|
|
166
|
+
total: recentActions.length,
|
|
167
|
+
successRate: successCount / recentActions.length * 100,
|
|
168
|
+
avgDuration: avgDur
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
// System metrics
|
|
173
|
+
const systemMetrics = await getSystemMetrics();
|
|
174
|
+
// Calculate trends (compare to previous period)
|
|
175
|
+
const prevCutoff = cutoff - timeframeMs;
|
|
176
|
+
const prevTasks = metricsCache.tasks.filter((t)=>t.timestamp >= prevCutoff && t.timestamp < cutoff);
|
|
177
|
+
const prevSuccessRate = prevTasks.length > 0 ? prevTasks.filter((t)=>t.success).length / prevTasks.length * 100 : 0;
|
|
178
|
+
const prevAvgDuration = prevTasks.length > 0 ? prevTasks.reduce((sum, t)=>sum + t.duration, 0) / prevTasks.length : 0;
|
|
179
|
+
const trends = {
|
|
180
|
+
successRateChange: successRate - prevSuccessRate,
|
|
181
|
+
durationChange: avgDuration - prevAvgDuration,
|
|
182
|
+
taskVolumeChange: totalTasks - prevTasks.length
|
|
183
|
+
};
|
|
184
|
+
return {
|
|
185
|
+
timeframe,
|
|
186
|
+
summary: {
|
|
187
|
+
totalTasks,
|
|
188
|
+
successRate,
|
|
189
|
+
avgDuration: avgDuration / 1000,
|
|
190
|
+
agentsSpawned: Object.values(agentMetrics).reduce((sum, m)=>sum + m.total, 0),
|
|
191
|
+
memoryEfficiency: systemMetrics.memoryEfficiency,
|
|
192
|
+
neuralEvents: metricsCache.performance.neuralEvents
|
|
193
|
+
},
|
|
194
|
+
agentMetrics,
|
|
195
|
+
systemMetrics,
|
|
196
|
+
trends,
|
|
197
|
+
tasks: recentTasks.slice(-20)
|
|
198
|
+
};
|
|
235
199
|
}
|
|
236
|
-
|
|
237
200
|
// Get bottleneck analysis data
|
|
238
201
|
export async function getBottleneckAnalysis(scope = 'system', target = 'all') {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
})),
|
|
259
|
-
});
|
|
260
|
-
recommendations.push('Optimize slow task types or break them into smaller subtasks');
|
|
202
|
+
const bottlenecks = [];
|
|
203
|
+
const recommendations = [];
|
|
204
|
+
// Analyze task performance
|
|
205
|
+
if (scope === 'system' || scope === 'task') {
|
|
206
|
+
const slowTasks = metricsCache.tasks.filter((t)=>t.duration > 10000) // Tasks taking more than 10s
|
|
207
|
+
.sort((a, b)=>b.duration - a.duration).slice(0, 5);
|
|
208
|
+
if (slowTasks.length > 0) {
|
|
209
|
+
bottlenecks.push({
|
|
210
|
+
severity: 'warning',
|
|
211
|
+
component: 'Task execution',
|
|
212
|
+
metric: `${slowTasks.length} slow tasks (>10s)`,
|
|
213
|
+
details: slowTasks.map((t)=>({
|
|
214
|
+
id: t.id,
|
|
215
|
+
type: t.type,
|
|
216
|
+
duration: t.duration / 1000
|
|
217
|
+
}))
|
|
218
|
+
});
|
|
219
|
+
recommendations.push('Optimize slow task types or break them into smaller subtasks');
|
|
220
|
+
}
|
|
261
221
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
222
|
+
// Analyze agent performance
|
|
223
|
+
if (scope === 'system' || scope === 'agent') {
|
|
224
|
+
Object.entries(metricsCache.agents).forEach(([type, data])=>{
|
|
225
|
+
const successRate = data.total > 0 ? data.successful / data.total * 100 : 100;
|
|
226
|
+
const avgDuration = data.total > 0 ? data.totalDuration / data.total : 0;
|
|
227
|
+
if (successRate < 80) {
|
|
228
|
+
bottlenecks.push({
|
|
229
|
+
severity: 'critical',
|
|
230
|
+
component: `${type} agents`,
|
|
231
|
+
metric: `${successRate.toFixed(1)}% success rate`,
|
|
232
|
+
target: type
|
|
233
|
+
});
|
|
234
|
+
recommendations.push(`Investigate ${type} agent failures and improve error handling`);
|
|
235
|
+
}
|
|
236
|
+
if (avgDuration > 15000) {
|
|
237
|
+
bottlenecks.push({
|
|
238
|
+
severity: 'warning',
|
|
239
|
+
component: `${type} agents`,
|
|
240
|
+
metric: `${(avgDuration / 1000).toFixed(1)}s avg duration`,
|
|
241
|
+
target: type
|
|
242
|
+
});
|
|
243
|
+
recommendations.push(`Optimize ${type} agent performance or increase parallelization`);
|
|
244
|
+
}
|
|
276
245
|
});
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
246
|
+
}
|
|
247
|
+
// Analyze system resources
|
|
248
|
+
if (scope === 'system' || scope === 'memory') {
|
|
249
|
+
const systemMetrics = await getSystemMetrics();
|
|
250
|
+
if (systemMetrics.memoryUsagePercent > 80) {
|
|
251
|
+
bottlenecks.push({
|
|
252
|
+
severity: 'critical',
|
|
253
|
+
component: 'Memory usage',
|
|
254
|
+
metric: `${systemMetrics.memoryUsagePercent}% utilization`
|
|
255
|
+
});
|
|
256
|
+
recommendations.push('Implement memory optimization or increase system resources');
|
|
257
|
+
}
|
|
258
|
+
if (systemMetrics.cpuLoad > 0.8) {
|
|
259
|
+
bottlenecks.push({
|
|
260
|
+
severity: 'warning',
|
|
261
|
+
component: 'CPU usage',
|
|
262
|
+
metric: `${(systemMetrics.cpuLoad * 100).toFixed(1)}% load`
|
|
263
|
+
});
|
|
264
|
+
recommendations.push('Consider horizontal scaling or CPU optimization');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Add positive indicators
|
|
268
|
+
if (bottlenecks.length === 0) {
|
|
281
269
|
bottlenecks.push({
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
target: type,
|
|
270
|
+
severity: 'good',
|
|
271
|
+
component: 'Overall system',
|
|
272
|
+
metric: 'No bottlenecks detected'
|
|
286
273
|
});
|
|
287
|
-
recommendations.push(`Optimize ${type} agent performance or increase parallelization`);
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Analyze system resources
|
|
293
|
-
if (scope === 'system' || scope === 'memory') {
|
|
294
|
-
const systemMetrics = await getSystemMetrics();
|
|
295
|
-
|
|
296
|
-
if (systemMetrics.memoryUsagePercent > 80) {
|
|
297
|
-
bottlenecks.push({
|
|
298
|
-
severity: 'critical',
|
|
299
|
-
component: 'Memory usage',
|
|
300
|
-
metric: `${systemMetrics.memoryUsagePercent}% utilization`,
|
|
301
|
-
});
|
|
302
|
-
recommendations.push('Implement memory optimization or increase system resources');
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
if (systemMetrics.cpuLoad > 0.8) {
|
|
306
|
-
bottlenecks.push({
|
|
307
|
-
severity: 'warning',
|
|
308
|
-
component: 'CPU usage',
|
|
309
|
-
metric: `${(systemMetrics.cpuLoad * 100).toFixed(1)}% load`,
|
|
310
|
-
});
|
|
311
|
-
recommendations.push('Consider horizontal scaling or CPU optimization');
|
|
312
274
|
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
return {
|
|
325
|
-
scope,
|
|
326
|
-
target,
|
|
327
|
-
bottlenecks,
|
|
328
|
-
recommendations,
|
|
329
|
-
analysisDuration: performance.now(),
|
|
330
|
-
confidenceScore: 0.85,
|
|
331
|
-
issuesDetected: bottlenecks.filter((b) => b.severity !== 'good').length,
|
|
332
|
-
};
|
|
275
|
+
return {
|
|
276
|
+
scope,
|
|
277
|
+
target,
|
|
278
|
+
bottlenecks,
|
|
279
|
+
recommendations,
|
|
280
|
+
analysisDuration: performance.now(),
|
|
281
|
+
confidenceScore: 0.85,
|
|
282
|
+
issuesDetected: bottlenecks.filter((b)=>b.severity !== 'good').length
|
|
283
|
+
};
|
|
333
284
|
}
|
|
334
|
-
|
|
335
285
|
// System monitoring
|
|
336
286
|
function startSystemMonitoring() {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// Collect system metrics every 30 seconds
|
|
343
|
-
systemMonitoringInterval = setInterval(async () => {
|
|
344
|
-
const metrics = await getSystemMetrics();
|
|
345
|
-
|
|
346
|
-
// Store system metrics
|
|
347
|
-
if (!metricsCache.system) {
|
|
348
|
-
metricsCache.system = [];
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
metricsCache.system.push({
|
|
352
|
-
timestamp: Date.now(),
|
|
353
|
-
...metrics,
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
// Keep only last 24 hours of system metrics
|
|
357
|
-
const dayAgo = Date.now() - 24 * 60 * 60 * 1000;
|
|
358
|
-
metricsCache.system = metricsCache.system.filter((m) => m.timestamp > dayAgo);
|
|
359
|
-
|
|
360
|
-
// Save to disk
|
|
361
|
-
try {
|
|
362
|
-
await fs.writeFile(SYSTEM_METRICS_FILE, JSON.stringify(metricsCache.system, null, 2));
|
|
363
|
-
} catch (err) {
|
|
364
|
-
// Ignore save errors
|
|
287
|
+
// Clear any existing interval
|
|
288
|
+
if (systemMonitoringInterval) {
|
|
289
|
+
clearInterval(systemMonitoringInterval);
|
|
365
290
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
291
|
+
// Collect system metrics every 30 seconds
|
|
292
|
+
systemMonitoringInterval = setInterval(async ()=>{
|
|
293
|
+
const metrics = await getSystemMetrics();
|
|
294
|
+
// Store system metrics
|
|
295
|
+
if (!metricsCache.system) {
|
|
296
|
+
metricsCache.system = [];
|
|
297
|
+
}
|
|
298
|
+
metricsCache.system.push({
|
|
299
|
+
timestamp: Date.now(),
|
|
300
|
+
...metrics
|
|
301
|
+
});
|
|
302
|
+
// Keep only last 24 hours of system metrics
|
|
303
|
+
const dayAgo = Date.now() - 24 * 60 * 60 * 1000;
|
|
304
|
+
metricsCache.system = metricsCache.system.filter((m)=>m.timestamp > dayAgo);
|
|
305
|
+
// Save to disk
|
|
306
|
+
try {
|
|
307
|
+
await fs.writeFile(SYSTEM_METRICS_FILE, JSON.stringify(metricsCache.system, null, 2));
|
|
308
|
+
} catch (err) {
|
|
309
|
+
// Ignore save errors
|
|
310
|
+
}
|
|
311
|
+
}, 30000);
|
|
312
|
+
// Allow process to exit even with active interval
|
|
313
|
+
systemMonitoringInterval.unref();
|
|
370
314
|
}
|
|
371
|
-
|
|
372
315
|
// Stop system monitoring
|
|
373
316
|
export function stopSystemMonitoring() {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
317
|
+
if (systemMonitoringInterval) {
|
|
318
|
+
clearInterval(systemMonitoringInterval);
|
|
319
|
+
systemMonitoringInterval = null;
|
|
320
|
+
}
|
|
378
321
|
}
|
|
379
|
-
|
|
380
322
|
// Get current system metrics
|
|
381
323
|
async function getSystemMetrics() {
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
uptime: os.uptime(),
|
|
399
|
-
};
|
|
324
|
+
const totalMem = os.totalmem();
|
|
325
|
+
const freeMem = os.freemem();
|
|
326
|
+
const usedMem = totalMem - freeMem;
|
|
327
|
+
const memoryUsagePercent = usedMem / totalMem * 100;
|
|
328
|
+
const cpuLoad = os.loadavg()[0] / os.cpus().length; // 1-minute load average
|
|
329
|
+
return {
|
|
330
|
+
memoryTotal: totalMem,
|
|
331
|
+
memoryUsed: usedMem,
|
|
332
|
+
memoryFree: freeMem,
|
|
333
|
+
memoryUsagePercent,
|
|
334
|
+
memoryEfficiency: 100 - memoryUsagePercent,
|
|
335
|
+
cpuCount: os.cpus().length,
|
|
336
|
+
cpuLoad,
|
|
337
|
+
platform: os.platform(),
|
|
338
|
+
uptime: os.uptime()
|
|
339
|
+
};
|
|
400
340
|
}
|
|
401
|
-
|
|
402
341
|
// Parse timeframe string to milliseconds
|
|
403
342
|
function parseTimeframe(timeframe) {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
// Default to 24 hours
|
|
417
|
-
return 24 * 60 * 60 * 1000;
|
|
343
|
+
const units = {
|
|
344
|
+
h: 60 * 60 * 1000,
|
|
345
|
+
d: 24 * 60 * 60 * 1000
|
|
346
|
+
};
|
|
347
|
+
const match = timeframe.match(/^(\d+)([hd])$/);
|
|
348
|
+
if (match) {
|
|
349
|
+
const value = parseInt(match[1]);
|
|
350
|
+
const unit = match[2];
|
|
351
|
+
return value * units[unit];
|
|
352
|
+
}
|
|
353
|
+
// Default to 24 hours
|
|
354
|
+
return 24 * 60 * 60 * 1000;
|
|
418
355
|
}
|
|
419
|
-
|
|
420
356
|
// Check if file exists
|
|
421
357
|
async function fileExists(filepath) {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
358
|
+
try {
|
|
359
|
+
await fs.access(filepath);
|
|
360
|
+
return true;
|
|
361
|
+
} catch {
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
428
364
|
}
|
|
429
|
-
|
|
430
365
|
// Cleanup function for graceful shutdown
|
|
431
366
|
export function cleanup() {
|
|
432
|
-
|
|
367
|
+
stopSystemMonitoring();
|
|
433
368
|
}
|
|
434
|
-
|
|
435
369
|
// Export metrics for reporting
|
|
436
370
|
export async function exportMetrics(format = 'json') {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
if (format === 'json') {
|
|
443
|
-
const reportPath = path.join(reportsDir, `performance-${timestamp}.json`);
|
|
444
|
-
const data = {
|
|
445
|
-
timestamp: new Date().toISOString(),
|
|
446
|
-
performance: metricsCache.performance,
|
|
447
|
-
tasks: metricsCache.tasks.slice(-100), // Last 100 tasks
|
|
448
|
-
agents: metricsCache.agents,
|
|
449
|
-
system: metricsCache.system.slice(-50), // Last 50 system snapshots
|
|
450
|
-
};
|
|
451
|
-
|
|
452
|
-
await fs.writeFile(reportPath, JSON.stringify(data, null, 2));
|
|
453
|
-
return reportPath;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
if (format === 'csv') {
|
|
457
|
-
const reportPath = path.join(reportsDir, `performance-${timestamp}.csv`);
|
|
458
|
-
let csv = 'Timestamp,Type,Metric,Value\n';
|
|
459
|
-
|
|
460
|
-
// Add performance metrics
|
|
461
|
-
Object.entries(metricsCache.performance).forEach(([key, value]) => {
|
|
462
|
-
csv += `${new Date().toISOString()},performance,${key},${value}\n`;
|
|
371
|
+
const timestamp = Date.now();
|
|
372
|
+
const reportsDir = path.join(process.cwd(), 'analysis-reports');
|
|
373
|
+
await fs.mkdir(reportsDir, {
|
|
374
|
+
recursive: true
|
|
463
375
|
});
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
376
|
+
if (format === 'json') {
|
|
377
|
+
const reportPath = path.join(reportsDir, `performance-${timestamp}.json`);
|
|
378
|
+
const data = {
|
|
379
|
+
timestamp: new Date().toISOString(),
|
|
380
|
+
performance: metricsCache.performance,
|
|
381
|
+
tasks: metricsCache.tasks.slice(-100),
|
|
382
|
+
agents: metricsCache.agents,
|
|
383
|
+
system: metricsCache.system.slice(-50)
|
|
384
|
+
};
|
|
385
|
+
await fs.writeFile(reportPath, JSON.stringify(data, null, 2));
|
|
386
|
+
return reportPath;
|
|
387
|
+
}
|
|
388
|
+
if (format === 'csv') {
|
|
389
|
+
const reportPath = path.join(reportsDir, `performance-${timestamp}.csv`);
|
|
390
|
+
let csv = 'Timestamp,Type,Metric,Value\n';
|
|
391
|
+
// Add performance metrics
|
|
392
|
+
Object.entries(metricsCache.performance).forEach(([key, value])=>{
|
|
393
|
+
csv += `${new Date().toISOString()},performance,${key},${value}\n`;
|
|
394
|
+
});
|
|
395
|
+
// Add agent metrics
|
|
396
|
+
Object.entries(metricsCache.agents).forEach(([type, data])=>{
|
|
397
|
+
csv += `${new Date().toISOString()},agent,${type}_total,${data.total}\n`;
|
|
398
|
+
csv += `${new Date().toISOString()},agent,${type}_success_rate,${data.total > 0 ? data.successful / data.total * 100 : 0}\n`;
|
|
399
|
+
csv += `${new Date().toISOString()},agent,${type}_avg_duration,${data.total > 0 ? data.totalDuration / data.total : 0}\n`;
|
|
400
|
+
});
|
|
401
|
+
await fs.writeFile(reportPath, csv);
|
|
402
|
+
return reportPath;
|
|
403
|
+
}
|
|
404
|
+
if (format === 'html') {
|
|
405
|
+
const reportPath = path.join(reportsDir, `performance-${timestamp}.html`);
|
|
406
|
+
const report = await getPerformanceReport('24h');
|
|
407
|
+
const html = generateHTMLReport(report);
|
|
408
|
+
await fs.writeFile(reportPath, html);
|
|
409
|
+
return reportPath;
|
|
410
|
+
}
|
|
411
|
+
throw new Error(`Unsupported format: ${format}`);
|
|
486
412
|
}
|
|
487
|
-
|
|
488
413
|
// Generate HTML report
|
|
489
414
|
function generateHTMLReport(report) {
|
|
490
|
-
|
|
415
|
+
return `<!DOCTYPE html>
|
|
491
416
|
<html>
|
|
492
417
|
<head>
|
|
493
418
|
<title>Claude Flow Performance Report - ${new Date().toISOString()}</title>
|
|
@@ -546,18 +471,14 @@ function generateHTMLReport(report) {
|
|
|
546
471
|
</tr>
|
|
547
472
|
</thead>
|
|
548
473
|
<tbody>
|
|
549
|
-
${Object.entries(report.agentMetrics)
|
|
550
|
-
.map(
|
|
551
|
-
([type, metrics]) => `
|
|
474
|
+
${Object.entries(report.agentMetrics).map(([type, metrics])=>`
|
|
552
475
|
<tr>
|
|
553
476
|
<td>${type}</td>
|
|
554
477
|
<td>${metrics.total}</td>
|
|
555
478
|
<td>${metrics.successRate.toFixed(1)}%</td>
|
|
556
479
|
<td>${(metrics.avgDuration / 1000).toFixed(1)}s</td>
|
|
557
480
|
</tr>
|
|
558
|
-
|
|
559
|
-
)
|
|
560
|
-
.join('')}
|
|
481
|
+
`).join('')}
|
|
561
482
|
</tbody>
|
|
562
483
|
</table>
|
|
563
484
|
|
|
@@ -578,11 +499,7 @@ function generateHTMLReport(report) {
|
|
|
578
499
|
</tr>
|
|
579
500
|
</thead>
|
|
580
501
|
<tbody>
|
|
581
|
-
${report.tasks
|
|
582
|
-
.slice(-10)
|
|
583
|
-
.reverse()
|
|
584
|
-
.map(
|
|
585
|
-
(task) => `
|
|
502
|
+
${report.tasks.slice(-10).reverse().map((task)=>`
|
|
586
503
|
<tr>
|
|
587
504
|
<td>${task.id}</td>
|
|
588
505
|
<td>${task.type}</td>
|
|
@@ -590,9 +507,7 @@ function generateHTMLReport(report) {
|
|
|
590
507
|
<td>${(task.duration / 1000).toFixed(2)}s</td>
|
|
591
508
|
<td>${new Date(task.timestamp).toLocaleString()}</td>
|
|
592
509
|
</tr>
|
|
593
|
-
|
|
594
|
-
)
|
|
595
|
-
.join('')}
|
|
510
|
+
`).join('')}
|
|
596
511
|
</tbody>
|
|
597
512
|
</table>
|
|
598
513
|
</div>
|