claude-flow-novice 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-flow-novice/preferences/generation.json +147 -0
- package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
- package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
- package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
- package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
- package/.claude-flow-novice/preferences/project-local.json +91 -0
- package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
- package/.claude-flow-novice/preferences/team-shared.json +195 -0
- package/.claude-flow-novice/preferences/user-global.json +247 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
- package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
- package/CLAUDE.md +81 -0
- package/README-NPM.md +0 -0
- package/package.json +11 -7
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/migration/README.md +434 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
- package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
- package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
- package/src/cli/simple-commands/__tests__/task.test.js +8 -0
- package/src/cli/simple-commands/agent.js +216 -0
- package/src/cli/simple-commands/analysis.js +570 -0
- package/src/cli/simple-commands/automation-executor.js +1603 -0
- package/src/cli/simple-commands/automation.js +627 -0
- package/src/cli/simple-commands/batch-manager.js +338 -0
- package/src/cli/simple-commands/claude-telemetry.js +311 -0
- package/src/cli/simple-commands/claude-track.js +102 -0
- package/src/cli/simple-commands/concurrent-display.js +348 -0
- package/src/cli/simple-commands/config.js +319 -0
- package/src/cli/simple-commands/coordination.js +307 -0
- package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
- package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
- package/src/cli/simple-commands/fix-hook-variables.js +363 -0
- package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
- package/src/cli/simple-commands/github/github-api.js +624 -0
- package/src/cli/simple-commands/github/init.js +543 -0
- package/src/cli/simple-commands/github.js +377 -0
- package/src/cli/simple-commands/goal.js +145 -0
- package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
- package/src/cli/simple-commands/hive-mind/communication.js +740 -0
- package/src/cli/simple-commands/hive-mind/core.js +1031 -0
- package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
- package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
- package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
- package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
- package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
- package/src/cli/simple-commands/hive-mind/queen.js +809 -0
- package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
- package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
- package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
- package/src/cli/simple-commands/hive-mind.js +3112 -0
- package/src/cli/simple-commands/hive.js +140 -0
- package/src/cli/simple-commands/hook-safety.js +671 -0
- package/src/cli/simple-commands/hooks.js +1268 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
- package/src/cli/simple-commands/init/README.md +106 -0
- package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
- package/src/cli/simple-commands/init/agent-copier.js +347 -0
- package/src/cli/simple-commands/init/batch-init.js +663 -0
- package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
- package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
- package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
- package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
- package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
- package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
- package/src/cli/simple-commands/init/help.js +110 -0
- package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
- package/src/cli/simple-commands/init/index.js +1953 -0
- package/src/cli/simple-commands/init/performance-monitor.js +344 -0
- package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
- package/src/cli/simple-commands/init/rollback/index.js +399 -0
- package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
- package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
- package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
- package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
- package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
- package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
- package/src/cli/simple-commands/init/sparc-structure.js +68 -0
- package/src/cli/simple-commands/init/template-copier.js +640 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
- package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
- package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
- package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
- package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
- package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
- package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
- package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
- package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
- package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
- package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
- package/src/cli/simple-commands/init/templates/coordination.md +16 -0
- package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
- package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
- package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
- package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
- package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
- package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
- package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
- package/src/cli/simple-commands/init/templates/settings.json +109 -0
- package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
- package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
- package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
- package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
- package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
- package/src/cli/simple-commands/init/validation/index.js +388 -0
- package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
- package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
- package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
- package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
- package/src/cli/simple-commands/init.js +4 -0
- package/src/cli/simple-commands/mcp-health.js +163 -0
- package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
- package/src/cli/simple-commands/mcp.js +420 -0
- package/src/cli/simple-commands/memory-consolidation.js +631 -0
- package/src/cli/simple-commands/memory.js +345 -0
- package/src/cli/simple-commands/migrate-hooks.js +63 -0
- package/src/cli/simple-commands/monitor.js +417 -0
- package/src/cli/simple-commands/neural.js +148 -0
- package/src/cli/simple-commands/pair-autofix-only.js +755 -0
- package/src/cli/simple-commands/pair-basic.js +751 -0
- package/src/cli/simple-commands/pair-old.js +623 -0
- package/src/cli/simple-commands/pair-working.js +849 -0
- package/src/cli/simple-commands/pair.js +849 -0
- package/src/cli/simple-commands/performance-hooks.js +149 -0
- package/src/cli/simple-commands/performance-metrics.js +601 -0
- package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
- package/src/cli/simple-commands/process-ui.js +274 -0
- package/src/cli/simple-commands/realtime-update-system.js +659 -0
- package/src/cli/simple-commands/sparc/architecture.js +1750 -0
- package/src/cli/simple-commands/sparc/commands.js +575 -0
- package/src/cli/simple-commands/sparc/completion.js +1831 -0
- package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
- package/src/cli/simple-commands/sparc/index.js +321 -0
- package/src/cli/simple-commands/sparc/phase-base.js +430 -0
- package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
- package/src/cli/simple-commands/sparc/refinement.js +1856 -0
- package/src/cli/simple-commands/sparc/specification.js +736 -0
- package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
- package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
- package/src/cli/simple-commands/sparc-modes/code.js +148 -0
- package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
- package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
- package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
- package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
- package/src/cli/simple-commands/sparc-modes/index.js +201 -0
- package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
- package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
- package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
- package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
- package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
- package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
- package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
- package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
- package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
- package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
- package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
- package/src/cli/simple-commands/sparc.js +530 -0
- package/src/cli/simple-commands/start-ui.js +147 -0
- package/src/cli/simple-commands/start-wrapper.js +285 -0
- package/src/cli/simple-commands/start.js +2 -0
- package/src/cli/simple-commands/status.js +303 -0
- package/src/cli/simple-commands/stream-chain-clean.js +221 -0
- package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
- package/src/cli/simple-commands/stream-chain-real.js +408 -0
- package/src/cli/simple-commands/stream-chain-working.js +323 -0
- package/src/cli/simple-commands/stream-chain.js +491 -0
- package/src/cli/simple-commands/stream-processor.js +340 -0
- package/src/cli/simple-commands/swarm-executor.js +253 -0
- package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
- package/src/cli/simple-commands/swarm-ui.js +741 -0
- package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
- package/src/cli/simple-commands/swarm.js +2277 -0
- package/src/cli/simple-commands/task.js +228 -0
- package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
- package/src/cli/simple-commands/timestamp-fix.js +104 -0
- package/src/cli/simple-commands/token-tracker.js +372 -0
- package/src/cli/simple-commands/tool-execution-framework.js +555 -0
- package/src/cli/simple-commands/train-and-stream.js +354 -0
- package/src/cli/simple-commands/training-pipeline.js +874 -0
- package/src/cli/simple-commands/training.js +288 -0
- package/src/cli/simple-commands/verification-hooks.js +336 -0
- package/src/cli/simple-commands/verification-integration.js +464 -0
- package/src/cli/simple-commands/verification-training-integration.js +646 -0
- package/src/cli/simple-commands/verification.js +551 -0
- package/src/cli/simple-commands/web-server.js +929 -0
- package/src/cli/simple-commands/webui-validator.js +136 -0
- package/src/language/README.md +503 -0
- package/src/language/claude-md-generator.js +618 -0
- package/src/language/cli.js +422 -0
- package/src/language/example.js +347 -0
- package/src/language/integration-system.js +619 -0
- package/src/language/language-detector.js +581 -0
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real Performance Metrics Collection System
|
|
3
|
+
* Tracks actual system performance, agent activity, and resource usage
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import os from 'os';
|
|
9
|
+
import { performance } from 'perf_hooks';
|
|
10
|
+
|
|
11
|
+
// Metrics storage path
|
|
12
|
+
const METRICS_DIR = path.join(process.cwd(), '.claude-flow', 'metrics');
|
|
13
|
+
const PERFORMANCE_FILE = path.join(METRICS_DIR, 'performance.json');
|
|
14
|
+
const AGENT_METRICS_FILE = path.join(METRICS_DIR, 'agent-metrics.json');
|
|
15
|
+
const TASK_METRICS_FILE = path.join(METRICS_DIR, 'task-metrics.json');
|
|
16
|
+
const SYSTEM_METRICS_FILE = path.join(METRICS_DIR, 'system-metrics.json');
|
|
17
|
+
|
|
18
|
+
// In-memory metrics cache
|
|
19
|
+
let metricsCache = {
|
|
20
|
+
tasks: [],
|
|
21
|
+
agents: {},
|
|
22
|
+
system: [],
|
|
23
|
+
performance: {
|
|
24
|
+
startTime: Date.now(),
|
|
25
|
+
totalTasks: 0,
|
|
26
|
+
successfulTasks: 0,
|
|
27
|
+
failedTasks: 0,
|
|
28
|
+
totalAgents: 0,
|
|
29
|
+
activeAgents: 0,
|
|
30
|
+
neuralEvents: 0,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Store interval ID for cleanup
|
|
35
|
+
let systemMonitoringInterval = null;
|
|
36
|
+
|
|
37
|
+
// Initialize metrics system
|
|
38
|
+
export async function initializeMetrics(startMonitoring = true) {
|
|
39
|
+
try {
|
|
40
|
+
await fs.mkdir(METRICS_DIR, { recursive: true });
|
|
41
|
+
|
|
42
|
+
// Load existing metrics if available
|
|
43
|
+
await loadMetricsFromDisk();
|
|
44
|
+
|
|
45
|
+
// Start system monitoring only if requested
|
|
46
|
+
if (startMonitoring) {
|
|
47
|
+
startSystemMonitoring();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return true;
|
|
51
|
+
} catch (err) {
|
|
52
|
+
console.error('Failed to initialize metrics:', err);
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Load metrics from disk
|
|
58
|
+
async function loadMetricsFromDisk() {
|
|
59
|
+
try {
|
|
60
|
+
// Load performance metrics
|
|
61
|
+
if (await fileExists(PERFORMANCE_FILE)) {
|
|
62
|
+
const data = await fs.readFile(PERFORMANCE_FILE, 'utf8');
|
|
63
|
+
const saved = JSON.parse(data);
|
|
64
|
+
metricsCache.performance = { ...metricsCache.performance, ...saved };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Load task metrics
|
|
68
|
+
if (await fileExists(TASK_METRICS_FILE)) {
|
|
69
|
+
const data = await fs.readFile(TASK_METRICS_FILE, 'utf8');
|
|
70
|
+
metricsCache.tasks = JSON.parse(data);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Load agent metrics
|
|
74
|
+
if (await fileExists(AGENT_METRICS_FILE)) {
|
|
75
|
+
const data = await fs.readFile(AGENT_METRICS_FILE, 'utf8');
|
|
76
|
+
metricsCache.agents = JSON.parse(data);
|
|
77
|
+
}
|
|
78
|
+
} catch (err) {
|
|
79
|
+
// Ignore errors, start fresh
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Save metrics to disk
|
|
84
|
+
async function saveMetricsToDisk() {
|
|
85
|
+
try {
|
|
86
|
+
await fs.writeFile(PERFORMANCE_FILE, JSON.stringify(metricsCache.performance, null, 2));
|
|
87
|
+
await fs.writeFile(TASK_METRICS_FILE, JSON.stringify(metricsCache.tasks, null, 2));
|
|
88
|
+
await fs.writeFile(AGENT_METRICS_FILE, JSON.stringify(metricsCache.agents, null, 2));
|
|
89
|
+
} catch (err) {
|
|
90
|
+
// Ignore save errors
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Track task execution
|
|
95
|
+
export async function trackTaskExecution(taskId, taskType, success, duration, metadata = {}) {
|
|
96
|
+
const task = {
|
|
97
|
+
id: taskId,
|
|
98
|
+
type: taskType,
|
|
99
|
+
success,
|
|
100
|
+
duration,
|
|
101
|
+
timestamp: Date.now(),
|
|
102
|
+
metadata,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
metricsCache.tasks.push(task);
|
|
106
|
+
metricsCache.performance.totalTasks++;
|
|
107
|
+
|
|
108
|
+
if (success) {
|
|
109
|
+
metricsCache.performance.successfulTasks++;
|
|
110
|
+
} else {
|
|
111
|
+
metricsCache.performance.failedTasks++;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Keep only last 1000 tasks
|
|
115
|
+
if (metricsCache.tasks.length > 1000) {
|
|
116
|
+
metricsCache.tasks = metricsCache.tasks.slice(-1000);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
await saveMetricsToDisk();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Track agent activity
|
|
123
|
+
export async function trackAgentActivity(agentId, agentType, action, duration, success = true) {
|
|
124
|
+
if (!metricsCache.agents[agentType]) {
|
|
125
|
+
metricsCache.agents[agentType] = {
|
|
126
|
+
total: 0,
|
|
127
|
+
successful: 0,
|
|
128
|
+
failed: 0,
|
|
129
|
+
totalDuration: 0,
|
|
130
|
+
actions: [],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const agent = metricsCache.agents[agentType];
|
|
135
|
+
agent.total++;
|
|
136
|
+
agent.totalDuration += duration;
|
|
137
|
+
|
|
138
|
+
if (success) {
|
|
139
|
+
agent.successful++;
|
|
140
|
+
} else {
|
|
141
|
+
agent.failed++;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
agent.actions.push({
|
|
145
|
+
id: agentId,
|
|
146
|
+
action,
|
|
147
|
+
duration,
|
|
148
|
+
success,
|
|
149
|
+
timestamp: Date.now(),
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// Keep only last 100 actions per agent type
|
|
153
|
+
if (agent.actions.length > 100) {
|
|
154
|
+
agent.actions = agent.actions.slice(-100);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
metricsCache.performance.totalAgents = Object.keys(metricsCache.agents).length;
|
|
158
|
+
|
|
159
|
+
await saveMetricsToDisk();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Track neural events
|
|
163
|
+
export async function trackNeuralEvent(eventType, metadata = {}) {
|
|
164
|
+
metricsCache.performance.neuralEvents++;
|
|
165
|
+
|
|
166
|
+
await saveMetricsToDisk();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Get performance report data
|
|
170
|
+
export async function getPerformanceReport(timeframe = '24h') {
|
|
171
|
+
const now = Date.now();
|
|
172
|
+
const timeframeMs = parseTimeframe(timeframe);
|
|
173
|
+
const cutoff = now - timeframeMs;
|
|
174
|
+
|
|
175
|
+
// Filter tasks within timeframe
|
|
176
|
+
const recentTasks = metricsCache.tasks.filter((task) => task.timestamp >= cutoff);
|
|
177
|
+
|
|
178
|
+
// Calculate metrics
|
|
179
|
+
const totalTasks = recentTasks.length;
|
|
180
|
+
const successfulTasks = recentTasks.filter((t) => t.success).length;
|
|
181
|
+
const successRate = totalTasks > 0 ? (successfulTasks / totalTasks) * 100 : 0;
|
|
182
|
+
const avgDuration =
|
|
183
|
+
totalTasks > 0 ? recentTasks.reduce((sum, t) => sum + t.duration, 0) / totalTasks : 0;
|
|
184
|
+
|
|
185
|
+
// Agent metrics
|
|
186
|
+
const agentMetrics = {};
|
|
187
|
+
Object.entries(metricsCache.agents).forEach(([type, data]) => {
|
|
188
|
+
const recentActions = data.actions.filter((a) => a.timestamp >= cutoff);
|
|
189
|
+
if (recentActions.length > 0) {
|
|
190
|
+
const successCount = recentActions.filter((a) => a.success).length;
|
|
191
|
+
const avgDur = recentActions.reduce((sum, a) => sum + a.duration, 0) / recentActions.length;
|
|
192
|
+
|
|
193
|
+
agentMetrics[type] = {
|
|
194
|
+
total: recentActions.length,
|
|
195
|
+
successRate: (successCount / recentActions.length) * 100,
|
|
196
|
+
avgDuration: avgDur,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// System metrics
|
|
202
|
+
const systemMetrics = await getSystemMetrics();
|
|
203
|
+
|
|
204
|
+
// Calculate trends (compare to previous period)
|
|
205
|
+
const prevCutoff = cutoff - timeframeMs;
|
|
206
|
+
const prevTasks = metricsCache.tasks.filter(
|
|
207
|
+
(t) => t.timestamp >= prevCutoff && t.timestamp < cutoff,
|
|
208
|
+
);
|
|
209
|
+
const prevSuccessRate =
|
|
210
|
+
prevTasks.length > 0 ? (prevTasks.filter((t) => t.success).length / prevTasks.length) * 100 : 0;
|
|
211
|
+
const prevAvgDuration =
|
|
212
|
+
prevTasks.length > 0 ? prevTasks.reduce((sum, t) => sum + t.duration, 0) / prevTasks.length : 0;
|
|
213
|
+
|
|
214
|
+
const trends = {
|
|
215
|
+
successRateChange: successRate - prevSuccessRate,
|
|
216
|
+
durationChange: avgDuration - prevAvgDuration,
|
|
217
|
+
taskVolumeChange: totalTasks - prevTasks.length,
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
timeframe,
|
|
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
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Get bottleneck analysis data
|
|
238
|
+
export async function getBottleneckAnalysis(scope = 'system', target = 'all') {
|
|
239
|
+
const bottlenecks = [];
|
|
240
|
+
const recommendations = [];
|
|
241
|
+
|
|
242
|
+
// Analyze task performance
|
|
243
|
+
if (scope === 'system' || scope === 'task') {
|
|
244
|
+
const slowTasks = metricsCache.tasks
|
|
245
|
+
.filter((t) => t.duration > 10000) // Tasks taking more than 10s
|
|
246
|
+
.sort((a, b) => b.duration - a.duration)
|
|
247
|
+
.slice(0, 5);
|
|
248
|
+
|
|
249
|
+
if (slowTasks.length > 0) {
|
|
250
|
+
bottlenecks.push({
|
|
251
|
+
severity: 'warning',
|
|
252
|
+
component: 'Task execution',
|
|
253
|
+
metric: `${slowTasks.length} slow tasks (>10s)`,
|
|
254
|
+
details: slowTasks.map((t) => ({
|
|
255
|
+
id: t.id,
|
|
256
|
+
type: t.type,
|
|
257
|
+
duration: t.duration / 1000,
|
|
258
|
+
})),
|
|
259
|
+
});
|
|
260
|
+
recommendations.push('Optimize slow task types or break them into smaller subtasks');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Analyze agent performance
|
|
265
|
+
if (scope === 'system' || scope === 'agent') {
|
|
266
|
+
Object.entries(metricsCache.agents).forEach(([type, data]) => {
|
|
267
|
+
const successRate = data.total > 0 ? (data.successful / data.total) * 100 : 100;
|
|
268
|
+
const avgDuration = data.total > 0 ? data.totalDuration / data.total : 0;
|
|
269
|
+
|
|
270
|
+
if (successRate < 80) {
|
|
271
|
+
bottlenecks.push({
|
|
272
|
+
severity: 'critical',
|
|
273
|
+
component: `${type} agents`,
|
|
274
|
+
metric: `${successRate.toFixed(1)}% success rate`,
|
|
275
|
+
target: type,
|
|
276
|
+
});
|
|
277
|
+
recommendations.push(`Investigate ${type} agent failures and improve error handling`);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (avgDuration > 15000) {
|
|
281
|
+
bottlenecks.push({
|
|
282
|
+
severity: 'warning',
|
|
283
|
+
component: `${type} agents`,
|
|
284
|
+
metric: `${(avgDuration / 1000).toFixed(1)}s avg duration`,
|
|
285
|
+
target: type,
|
|
286
|
+
});
|
|
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
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Add positive indicators
|
|
316
|
+
if (bottlenecks.length === 0) {
|
|
317
|
+
bottlenecks.push({
|
|
318
|
+
severity: 'good',
|
|
319
|
+
component: 'Overall system',
|
|
320
|
+
metric: 'No bottlenecks detected',
|
|
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
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// System monitoring
|
|
336
|
+
function startSystemMonitoring() {
|
|
337
|
+
// Clear any existing interval
|
|
338
|
+
if (systemMonitoringInterval) {
|
|
339
|
+
clearInterval(systemMonitoringInterval);
|
|
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
|
|
365
|
+
}
|
|
366
|
+
}, 30000);
|
|
367
|
+
|
|
368
|
+
// Allow process to exit even with active interval
|
|
369
|
+
systemMonitoringInterval.unref();
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Stop system monitoring
|
|
373
|
+
export function stopSystemMonitoring() {
|
|
374
|
+
if (systemMonitoringInterval) {
|
|
375
|
+
clearInterval(systemMonitoringInterval);
|
|
376
|
+
systemMonitoringInterval = null;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Get current system metrics
|
|
381
|
+
async function getSystemMetrics() {
|
|
382
|
+
const totalMem = os.totalmem();
|
|
383
|
+
const freeMem = os.freemem();
|
|
384
|
+
const usedMem = totalMem - freeMem;
|
|
385
|
+
const memoryUsagePercent = (usedMem / totalMem) * 100;
|
|
386
|
+
|
|
387
|
+
const cpuLoad = os.loadavg()[0] / os.cpus().length; // 1-minute load average
|
|
388
|
+
|
|
389
|
+
return {
|
|
390
|
+
memoryTotal: totalMem,
|
|
391
|
+
memoryUsed: usedMem,
|
|
392
|
+
memoryFree: freeMem,
|
|
393
|
+
memoryUsagePercent,
|
|
394
|
+
memoryEfficiency: 100 - memoryUsagePercent,
|
|
395
|
+
cpuCount: os.cpus().length,
|
|
396
|
+
cpuLoad,
|
|
397
|
+
platform: os.platform(),
|
|
398
|
+
uptime: os.uptime(),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Parse timeframe string to milliseconds
|
|
403
|
+
function parseTimeframe(timeframe) {
|
|
404
|
+
const units = {
|
|
405
|
+
h: 60 * 60 * 1000,
|
|
406
|
+
d: 24 * 60 * 60 * 1000,
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
const match = timeframe.match(/^(\d+)([hd])$/);
|
|
410
|
+
if (match) {
|
|
411
|
+
const value = parseInt(match[1]);
|
|
412
|
+
const unit = match[2];
|
|
413
|
+
return value * units[unit];
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Default to 24 hours
|
|
417
|
+
return 24 * 60 * 60 * 1000;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Check if file exists
|
|
421
|
+
async function fileExists(filepath) {
|
|
422
|
+
try {
|
|
423
|
+
await fs.access(filepath);
|
|
424
|
+
return true;
|
|
425
|
+
} catch {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Cleanup function for graceful shutdown
|
|
431
|
+
export function cleanup() {
|
|
432
|
+
stopSystemMonitoring();
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Export metrics for reporting
|
|
436
|
+
export async function exportMetrics(format = 'json') {
|
|
437
|
+
const timestamp = Date.now();
|
|
438
|
+
const reportsDir = path.join(process.cwd(), 'analysis-reports');
|
|
439
|
+
|
|
440
|
+
await fs.mkdir(reportsDir, { recursive: true });
|
|
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`;
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// Add agent metrics
|
|
466
|
+
Object.entries(metricsCache.agents).forEach(([type, data]) => {
|
|
467
|
+
csv += `${new Date().toISOString()},agent,${type}_total,${data.total}\n`;
|
|
468
|
+
csv += `${new Date().toISOString()},agent,${type}_success_rate,${data.total > 0 ? (data.successful / data.total) * 100 : 0}\n`;
|
|
469
|
+
csv += `${new Date().toISOString()},agent,${type}_avg_duration,${data.total > 0 ? data.totalDuration / data.total : 0}\n`;
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
await fs.writeFile(reportPath, csv);
|
|
473
|
+
return reportPath;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
if (format === 'html') {
|
|
477
|
+
const reportPath = path.join(reportsDir, `performance-${timestamp}.html`);
|
|
478
|
+
const report = await getPerformanceReport('24h');
|
|
479
|
+
|
|
480
|
+
const html = generateHTMLReport(report);
|
|
481
|
+
await fs.writeFile(reportPath, html);
|
|
482
|
+
return reportPath;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
throw new Error(`Unsupported format: ${format}`);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// Generate HTML report
|
|
489
|
+
function generateHTMLReport(report) {
|
|
490
|
+
return `<!DOCTYPE html>
|
|
491
|
+
<html>
|
|
492
|
+
<head>
|
|
493
|
+
<title>Claude Flow Performance Report - ${new Date().toISOString()}</title>
|
|
494
|
+
<style>
|
|
495
|
+
body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; }
|
|
496
|
+
.container { max-width: 1200px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
|
|
497
|
+
h1, h2 { color: #333; }
|
|
498
|
+
.metric { display: inline-block; margin: 10px 20px 10px 0; }
|
|
499
|
+
.metric-label { color: #666; font-size: 14px; }
|
|
500
|
+
.metric-value { font-size: 24px; font-weight: bold; color: #2196F3; }
|
|
501
|
+
.trend { font-size: 14px; margin-left: 10px; }
|
|
502
|
+
.trend.positive { color: #4CAF50; }
|
|
503
|
+
.trend.negative { color: #F44336; }
|
|
504
|
+
table { width: 100%; border-collapse: collapse; margin: 20px 0; }
|
|
505
|
+
th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; }
|
|
506
|
+
th { background: #f5f5f5; font-weight: bold; }
|
|
507
|
+
.chart { margin: 20px 0; height: 300px; background: #fafafa; border: 1px solid #ddd; border-radius: 4px; display: flex; align-items: center; justify-content: center; color: #999; }
|
|
508
|
+
</style>
|
|
509
|
+
</head>
|
|
510
|
+
<body>
|
|
511
|
+
<div class="container">
|
|
512
|
+
<h1>Claude Flow Performance Report</h1>
|
|
513
|
+
<p>Generated: ${new Date().toISOString()} | Timeframe: ${report.timeframe}</p>
|
|
514
|
+
|
|
515
|
+
<h2>Summary Metrics</h2>
|
|
516
|
+
<div class="metrics">
|
|
517
|
+
<div class="metric">
|
|
518
|
+
<div class="metric-label">Total Tasks</div>
|
|
519
|
+
<div class="metric-value">${report.summary.totalTasks}</div>
|
|
520
|
+
${report.trends.taskVolumeChange !== 0 ? `<span class="trend ${report.trends.taskVolumeChange > 0 ? 'positive' : 'negative'}">${report.trends.taskVolumeChange > 0 ? '+' : ''}${report.trends.taskVolumeChange}</span>` : ''}
|
|
521
|
+
</div>
|
|
522
|
+
<div class="metric">
|
|
523
|
+
<div class="metric-label">Success Rate</div>
|
|
524
|
+
<div class="metric-value">${report.summary.successRate.toFixed(1)}%</div>
|
|
525
|
+
${report.trends.successRateChange !== 0 ? `<span class="trend ${report.trends.successRateChange > 0 ? 'positive' : 'negative'}">${report.trends.successRateChange > 0 ? '+' : ''}${report.trends.successRateChange.toFixed(1)}%</span>` : ''}
|
|
526
|
+
</div>
|
|
527
|
+
<div class="metric">
|
|
528
|
+
<div class="metric-label">Avg Duration</div>
|
|
529
|
+
<div class="metric-value">${report.summary.avgDuration.toFixed(1)}s</div>
|
|
530
|
+
${report.trends.durationChange !== 0 ? `<span class="trend ${report.trends.durationChange < 0 ? 'positive' : 'negative'}">${report.trends.durationChange > 0 ? '+' : ''}${(report.trends.durationChange / 1000).toFixed(1)}s</span>` : ''}
|
|
531
|
+
</div>
|
|
532
|
+
<div class="metric">
|
|
533
|
+
<div class="metric-label">Memory Efficiency</div>
|
|
534
|
+
<div class="metric-value">${report.summary.memoryEfficiency.toFixed(0)}%</div>
|
|
535
|
+
</div>
|
|
536
|
+
</div>
|
|
537
|
+
|
|
538
|
+
<h2>Agent Performance</h2>
|
|
539
|
+
<table>
|
|
540
|
+
<thead>
|
|
541
|
+
<tr>
|
|
542
|
+
<th>Agent Type</th>
|
|
543
|
+
<th>Total Actions</th>
|
|
544
|
+
<th>Success Rate</th>
|
|
545
|
+
<th>Avg Duration</th>
|
|
546
|
+
</tr>
|
|
547
|
+
</thead>
|
|
548
|
+
<tbody>
|
|
549
|
+
${Object.entries(report.agentMetrics)
|
|
550
|
+
.map(
|
|
551
|
+
([type, metrics]) => `
|
|
552
|
+
<tr>
|
|
553
|
+
<td>${type}</td>
|
|
554
|
+
<td>${metrics.total}</td>
|
|
555
|
+
<td>${metrics.successRate.toFixed(1)}%</td>
|
|
556
|
+
<td>${(metrics.avgDuration / 1000).toFixed(1)}s</td>
|
|
557
|
+
</tr>
|
|
558
|
+
`,
|
|
559
|
+
)
|
|
560
|
+
.join('')}
|
|
561
|
+
</tbody>
|
|
562
|
+
</table>
|
|
563
|
+
|
|
564
|
+
<h2>Performance Trends</h2>
|
|
565
|
+
<div class="chart">
|
|
566
|
+
<p>Interactive charts would be displayed here</p>
|
|
567
|
+
</div>
|
|
568
|
+
|
|
569
|
+
<h2>Recent Tasks</h2>
|
|
570
|
+
<table>
|
|
571
|
+
<thead>
|
|
572
|
+
<tr>
|
|
573
|
+
<th>Task ID</th>
|
|
574
|
+
<th>Type</th>
|
|
575
|
+
<th>Status</th>
|
|
576
|
+
<th>Duration</th>
|
|
577
|
+
<th>Timestamp</th>
|
|
578
|
+
</tr>
|
|
579
|
+
</thead>
|
|
580
|
+
<tbody>
|
|
581
|
+
${report.tasks
|
|
582
|
+
.slice(-10)
|
|
583
|
+
.reverse()
|
|
584
|
+
.map(
|
|
585
|
+
(task) => `
|
|
586
|
+
<tr>
|
|
587
|
+
<td>${task.id}</td>
|
|
588
|
+
<td>${task.type}</td>
|
|
589
|
+
<td>${task.success ? '✅ Success' : '❌ Failed'}</td>
|
|
590
|
+
<td>${(task.duration / 1000).toFixed(2)}s</td>
|
|
591
|
+
<td>${new Date(task.timestamp).toLocaleString()}</td>
|
|
592
|
+
</tr>
|
|
593
|
+
`,
|
|
594
|
+
)
|
|
595
|
+
.join('')}
|
|
596
|
+
</tbody>
|
|
597
|
+
</table>
|
|
598
|
+
</div>
|
|
599
|
+
</body>
|
|
600
|
+
</html>`;
|
|
601
|
+
}
|