@claude-flow/cli 3.10.36 → 3.10.37
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/agents/analysis/analyze-code-quality.md +178 -178
- package/.claude/agents/analysis/code-analyzer.md +209 -209
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +178 -178
- package/.claude/agents/architecture/arch-system-design.md +156 -156
- package/.claude/agents/architecture/system-design/arch-system-design.md +154 -154
- package/.claude/agents/browser/browser-agent.yaml +182 -182
- package/.claude/agents/consensus/byzantine-coordinator.md +62 -62
- package/.claude/agents/consensus/crdt-synchronizer.md +996 -996
- package/.claude/agents/consensus/gossip-coordinator.md +62 -62
- package/.claude/agents/consensus/performance-benchmarker.md +850 -850
- package/.claude/agents/consensus/quorum-manager.md +822 -822
- package/.claude/agents/consensus/raft-manager.md +62 -62
- package/.claude/agents/consensus/security-manager.md +621 -621
- package/.claude/agents/core/planner.md +374 -374
- package/.claude/agents/custom/test-long-runner.md +44 -44
- package/.claude/agents/data/data-ml-model.md +444 -444
- package/.claude/agents/data/ml/data-ml-model.md +192 -192
- package/.claude/agents/development/backend/dev-backend-api.md +141 -141
- package/.claude/agents/development/dev-backend-api.md +344 -344
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +163 -163
- package/.claude/agents/devops/ops-cicd-github.md +164 -164
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +173 -173
- package/.claude/agents/documentation/docs-api-openapi.md +354 -354
- package/.claude/agents/flow-nexus/app-store.md +87 -87
- package/.claude/agents/flow-nexus/authentication.md +68 -68
- package/.claude/agents/flow-nexus/challenges.md +80 -80
- package/.claude/agents/flow-nexus/neural-network.md +87 -87
- package/.claude/agents/flow-nexus/payments.md +82 -82
- package/.claude/agents/flow-nexus/sandbox.md +75 -75
- package/.claude/agents/flow-nexus/swarm.md +75 -75
- package/.claude/agents/flow-nexus/user-tools.md +95 -95
- package/.claude/agents/flow-nexus/workflow.md +83 -83
- package/.claude/agents/github/code-review-swarm.md +377 -377
- package/.claude/agents/github/github-modes.md +172 -172
- package/.claude/agents/github/issue-tracker.md +575 -575
- package/.claude/agents/github/multi-repo-swarm.md +552 -552
- package/.claude/agents/github/pr-manager.md +437 -437
- package/.claude/agents/github/project-board-sync.md +508 -508
- package/.claude/agents/github/release-manager.md +604 -604
- package/.claude/agents/github/release-swarm.md +582 -582
- package/.claude/agents/github/repo-architect.md +397 -397
- package/.claude/agents/github/swarm-issue.md +572 -572
- package/.claude/agents/github/swarm-pr.md +427 -427
- package/.claude/agents/github/sync-coordinator.md +451 -451
- package/.claude/agents/github/workflow-automation.md +902 -902
- package/.claude/agents/goal/agent.md +815 -815
- package/.claude/agents/optimization/benchmark-suite.md +664 -664
- package/.claude/agents/optimization/load-balancer.md +430 -430
- package/.claude/agents/optimization/performance-monitor.md +671 -671
- package/.claude/agents/optimization/resource-allocator.md +673 -673
- package/.claude/agents/optimization/topology-optimizer.md +807 -807
- package/.claude/agents/payments/agentic-payments.md +126 -126
- package/.claude/agents/sona/sona-learning-optimizer.md +74 -74
- package/.claude/agents/sparc/architecture.md +698 -698
- package/.claude/agents/sparc/pseudocode.md +519 -519
- package/.claude/agents/sparc/refinement.md +801 -801
- package/.claude/agents/sparc/specification.md +477 -477
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +224 -224
- package/.claude/agents/specialized/spec-mobile-react-native.md +226 -226
- package/.claude/agents/sublinear/consensus-coordinator.md +337 -337
- package/.claude/agents/sublinear/matrix-optimizer.md +184 -184
- package/.claude/agents/sublinear/pagerank-analyzer.md +298 -298
- package/.claude/agents/sublinear/performance-optimizer.md +367 -367
- package/.claude/agents/sublinear/trading-predictor.md +245 -245
- package/.claude/agents/swarm/adaptive-coordinator.md +1126 -1126
- package/.claude/agents/swarm/hierarchical-coordinator.md +709 -709
- package/.claude/agents/swarm/mesh-coordinator.md +962 -962
- package/.claude/agents/templates/automation-smart-agent.md +204 -204
- package/.claude/agents/templates/base-template-generator.md +289 -289
- package/.claude/agents/templates/coordinator-swarm-init.md +89 -89
- package/.claude/agents/templates/github-pr-manager.md +176 -176
- package/.claude/agents/templates/implementer-sparc-coder.md +258 -258
- package/.claude/agents/templates/memory-coordinator.md +186 -186
- package/.claude/agents/templates/orchestrator-task.md +138 -138
- package/.claude/agents/templates/performance-analyzer.md +198 -198
- package/.claude/agents/templates/sparc-coordinator.md +513 -513
- package/.claude/agents/testing/production-validator.md +394 -394
- package/.claude/agents/testing/tdd-london-swarm.md +243 -243
- package/.claude/agents/v3/aidefence-guardian.md +282 -282
- package/.claude/agents/v3/claims-authorizer.md +208 -208
- package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -993
- package/.claude/agents/v3/ddd-domain-expert.md +220 -220
- package/.claude/agents/v3/injection-analyst.md +236 -236
- package/.claude/agents/v3/performance-engineer.md +1233 -1233
- package/.claude/agents/v3/pii-detector.md +151 -151
- package/.claude/agents/v3/reasoningbank-learner.md +213 -213
- package/.claude/agents/v3/security-architect-aidefence.md +410 -410
- package/.claude/agents/v3/security-architect.md +867 -867
- package/.claude/agents/v3/swarm-memory-manager.md +157 -157
- package/.claude/agents/v3/v3-integration-architect.md +205 -205
- package/.claude/commands/agents/README.md +50 -50
- package/.claude/commands/agents/agent-capabilities.md +140 -140
- package/.claude/commands/agents/agent-coordination.md +28 -28
- package/.claude/commands/agents/agent-spawning.md +28 -28
- package/.claude/commands/agents/agent-types.md +216 -216
- package/.claude/commands/agents/health.md +139 -139
- package/.claude/commands/agents/list.md +100 -100
- package/.claude/commands/agents/logs.md +130 -130
- package/.claude/commands/agents/metrics.md +122 -122
- package/.claude/commands/agents/pool.md +127 -127
- package/.claude/commands/agents/spawn.md +140 -140
- package/.claude/commands/agents/status.md +115 -115
- package/.claude/commands/agents/stop.md +102 -102
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +53 -53
- package/.claude/commands/analysis/README.md +9 -9
- package/.claude/commands/analysis/bottleneck-detect.md +162 -162
- package/.claude/commands/analysis/performance-bottlenecks.md +58 -58
- package/.claude/commands/analysis/performance-report.md +25 -25
- package/.claude/commands/analysis/token-efficiency.md +44 -44
- package/.claude/commands/analysis/token-usage.md +25 -25
- package/.claude/commands/automation/README.md +9 -9
- package/.claude/commands/automation/auto-agent.md +122 -122
- package/.claude/commands/automation/self-healing.md +105 -105
- package/.claude/commands/automation/session-memory.md +89 -89
- package/.claude/commands/automation/smart-agents.md +72 -72
- package/.claude/commands/automation/smart-spawn.md +25 -25
- package/.claude/commands/automation/workflow-select.md +25 -25
- package/.claude/commands/claude-flow-help.md +103 -103
- package/.claude/commands/claude-flow-memory.md +107 -107
- package/.claude/commands/claude-flow-swarm.md +205 -205
- package/.claude/commands/coordination/README.md +9 -9
- package/.claude/commands/coordination/agent-spawn.md +25 -25
- package/.claude/commands/coordination/init.md +44 -44
- package/.claude/commands/coordination/orchestrate.md +43 -43
- package/.claude/commands/coordination/spawn.md +45 -45
- package/.claude/commands/coordination/swarm-init.md +85 -85
- package/.claude/commands/coordination/task-orchestrate.md +25 -25
- package/.claude/commands/github/README.md +11 -11
- package/.claude/commands/github/code-review-swarm.md +513 -513
- package/.claude/commands/github/code-review.md +25 -25
- package/.claude/commands/github/github-modes.md +146 -146
- package/.claude/commands/github/github-swarm.md +121 -121
- package/.claude/commands/github/issue-tracker.md +291 -291
- package/.claude/commands/github/issue-triage.md +25 -25
- package/.claude/commands/github/multi-repo-swarm.md +518 -518
- package/.claude/commands/github/pr-enhance.md +26 -26
- package/.claude/commands/github/pr-manager.md +169 -169
- package/.claude/commands/github/project-board-sync.md +470 -470
- package/.claude/commands/github/release-manager.md +339 -339
- package/.claude/commands/github/release-swarm.md +543 -543
- package/.claude/commands/github/repo-analyze.md +25 -25
- package/.claude/commands/github/repo-architect.md +366 -366
- package/.claude/commands/github/swarm-issue.md +484 -484
- package/.claude/commands/github/swarm-pr.md +287 -287
- package/.claude/commands/github/sync-coordinator.md +302 -302
- package/.claude/commands/github/workflow-automation.md +441 -441
- package/.claude/commands/hive-mind/README.md +17 -17
- package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-init.md +18 -18
- package/.claude/commands/hive-mind/hive-mind-memory.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-resume.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -21
- package/.claude/commands/hive-mind/hive-mind-status.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-stop.md +8 -8
- package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -8
- package/.claude/commands/hive-mind/hive-mind.md +27 -27
- package/.claude/commands/hooks/README.md +11 -11
- package/.claude/commands/hooks/overview.md +57 -57
- package/.claude/commands/hooks/post-edit.md +117 -117
- package/.claude/commands/hooks/post-task.md +112 -112
- package/.claude/commands/hooks/pre-edit.md +113 -113
- package/.claude/commands/hooks/pre-task.md +111 -111
- package/.claude/commands/hooks/session-end.md +118 -118
- package/.claude/commands/hooks/setup.md +102 -102
- package/.claude/commands/memory/README.md +9 -9
- package/.claude/commands/memory/memory-persist.md +25 -25
- package/.claude/commands/memory/memory-search.md +25 -25
- package/.claude/commands/memory/memory-usage.md +25 -25
- package/.claude/commands/memory/neural.md +47 -47
- package/.claude/commands/monitoring/README.md +9 -9
- package/.claude/commands/monitoring/agent-metrics.md +25 -25
- package/.claude/commands/monitoring/agents.md +44 -44
- package/.claude/commands/monitoring/real-time-view.md +25 -25
- package/.claude/commands/monitoring/status.md +46 -46
- package/.claude/commands/monitoring/swarm-monitor.md +25 -25
- package/.claude/commands/optimization/README.md +9 -9
- package/.claude/commands/optimization/auto-topology.md +61 -61
- package/.claude/commands/optimization/cache-manage.md +25 -25
- package/.claude/commands/optimization/parallel-execute.md +25 -25
- package/.claude/commands/optimization/parallel-execution.md +49 -49
- package/.claude/commands/optimization/topology-optimize.md +25 -25
- package/.claude/commands/pair/README.md +260 -260
- package/.claude/commands/pair/commands.md +545 -545
- package/.claude/commands/pair/config.md +509 -509
- package/.claude/commands/pair/examples.md +511 -511
- package/.claude/commands/pair/modes.md +347 -347
- package/.claude/commands/pair/session.md +406 -406
- package/.claude/commands/pair/start.md +208 -208
- package/.claude/commands/sparc/analyzer.md +51 -51
- package/.claude/commands/sparc/architect.md +53 -53
- package/.claude/commands/sparc/ask.md +97 -97
- package/.claude/commands/sparc/batch-executor.md +54 -54
- package/.claude/commands/sparc/code.md +89 -89
- package/.claude/commands/sparc/coder.md +54 -54
- package/.claude/commands/sparc/debug.md +83 -83
- package/.claude/commands/sparc/debugger.md +54 -54
- package/.claude/commands/sparc/designer.md +53 -53
- package/.claude/commands/sparc/devops.md +109 -109
- package/.claude/commands/sparc/docs-writer.md +80 -80
- package/.claude/commands/sparc/documenter.md +54 -54
- package/.claude/commands/sparc/innovator.md +54 -54
- package/.claude/commands/sparc/integration.md +83 -83
- package/.claude/commands/sparc/mcp.md +117 -117
- package/.claude/commands/sparc/memory-manager.md +54 -54
- package/.claude/commands/sparc/optimizer.md +54 -54
- package/.claude/commands/sparc/orchestrator.md +131 -131
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -83
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -83
- package/.claude/commands/sparc/researcher.md +54 -54
- package/.claude/commands/sparc/reviewer.md +54 -54
- package/.claude/commands/sparc/security-review.md +80 -80
- package/.claude/commands/sparc/sparc-modes.md +174 -174
- package/.claude/commands/sparc/sparc.md +111 -111
- package/.claude/commands/sparc/spec-pseudocode.md +80 -80
- package/.claude/commands/sparc/supabase-admin.md +348 -348
- package/.claude/commands/sparc/swarm-coordinator.md +54 -54
- package/.claude/commands/sparc/tdd.md +54 -54
- package/.claude/commands/sparc/tester.md +54 -54
- package/.claude/commands/sparc/tutorial.md +79 -79
- package/.claude/commands/sparc/workflow-manager.md +54 -54
- package/.claude/commands/sparc.md +166 -166
- package/.claude/commands/stream-chain/pipeline.md +120 -120
- package/.claude/commands/stream-chain/run.md +69 -69
- package/.claude/commands/swarm/README.md +15 -15
- package/.claude/commands/swarm/analysis.md +95 -95
- package/.claude/commands/swarm/development.md +96 -96
- package/.claude/commands/swarm/examples.md +168 -168
- package/.claude/commands/swarm/maintenance.md +102 -102
- package/.claude/commands/swarm/optimization.md +117 -117
- package/.claude/commands/swarm/research.md +136 -136
- package/.claude/commands/swarm/swarm-analysis.md +8 -8
- package/.claude/commands/swarm/swarm-background.md +8 -8
- package/.claude/commands/swarm/swarm-init.md +19 -19
- package/.claude/commands/swarm/swarm-modes.md +8 -8
- package/.claude/commands/swarm/swarm-monitor.md +8 -8
- package/.claude/commands/swarm/swarm-spawn.md +19 -19
- package/.claude/commands/swarm/swarm-status.md +8 -8
- package/.claude/commands/swarm/swarm-strategies.md +8 -8
- package/.claude/commands/swarm/swarm.md +87 -87
- package/.claude/commands/swarm/testing.md +131 -131
- package/.claude/commands/training/README.md +9 -9
- package/.claude/commands/training/model-update.md +25 -25
- package/.claude/commands/training/neural-patterns.md +107 -107
- package/.claude/commands/training/neural-train.md +75 -75
- package/.claude/commands/training/pattern-learn.md +25 -25
- package/.claude/commands/training/specialization.md +62 -62
- package/.claude/commands/truth/start.md +142 -142
- package/.claude/commands/verify/check.md +49 -49
- package/.claude/commands/verify/start.md +127 -127
- package/.claude/commands/workflows/README.md +9 -9
- package/.claude/commands/workflows/development.md +77 -77
- package/.claude/commands/workflows/research.md +62 -62
- package/.claude/commands/workflows/workflow-create.md +25 -25
- package/.claude/commands/workflows/workflow-execute.md +25 -25
- package/.claude/commands/workflows/workflow-export.md +25 -25
- package/.claude/helpers/README.md +96 -96
- package/.claude/helpers/adr-compliance.sh +186 -186
- package/.claude/helpers/auto-commit.sh +178 -178
- package/.claude/helpers/auto-memory-hook.mjs +368 -368
- package/.claude/helpers/checkpoint-manager.sh +251 -251
- package/.claude/helpers/daemon-manager.sh +252 -252
- package/.claude/helpers/ddd-tracker.sh +144 -144
- package/.claude/helpers/github-safe.js +156 -156
- package/.claude/helpers/github-setup.sh +45 -45
- package/.claude/helpers/guidance-hook.sh +13 -13
- package/.claude/helpers/guidance-hooks.sh +102 -102
- package/.claude/helpers/health-monitor.sh +108 -108
- package/.claude/helpers/hook-handler.cjs +286 -286
- package/.claude/helpers/intelligence.cjs +1031 -1031
- package/.claude/helpers/learning-hooks.sh +329 -329
- package/.claude/helpers/learning-optimizer.sh +127 -127
- package/.claude/helpers/learning-service.mjs +1144 -1144
- package/.claude/helpers/memory.js +83 -83
- package/.claude/helpers/metrics-db.mjs +488 -488
- package/.claude/helpers/pattern-consolidator.sh +86 -86
- package/.claude/helpers/perf-worker.sh +160 -160
- package/.claude/helpers/post-commit +16 -16
- package/.claude/helpers/pre-commit +26 -26
- package/.claude/helpers/quick-start.sh +19 -19
- package/.claude/helpers/router.js +105 -105
- package/.claude/helpers/security-scanner.sh +127 -127
- package/.claude/helpers/session.js +135 -135
- package/.claude/helpers/setup-mcp.sh +18 -18
- package/.claude/helpers/standard-checkpoint-hooks.sh +189 -189
- package/.claude/helpers/statusline-hook.sh +21 -21
- package/.claude/helpers/statusline.cjs +604 -604
- package/.claude/helpers/statusline.js +352 -352
- package/.claude/helpers/swarm-comms.sh +353 -353
- package/.claude/helpers/swarm-hooks.sh +761 -761
- package/.claude/helpers/swarm-monitor.sh +210 -210
- package/.claude/helpers/sync-v3-metrics.sh +245 -245
- package/.claude/helpers/update-v3-progress.sh +165 -165
- package/.claude/helpers/v3-quick-status.sh +57 -57
- package/.claude/helpers/v3.sh +110 -110
- package/.claude/helpers/validate-v3-config.sh +215 -215
- package/.claude/helpers/worker-manager.sh +170 -170
- package/.claude/settings.json +182 -182
- package/.claude/skills/agentdb-advanced/SKILL.md +550 -550
- package/.claude/skills/agentdb-learning/SKILL.md +545 -545
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -339
- package/.claude/skills/agentdb-optimization/SKILL.md +509 -509
- package/.claude/skills/agentdb-vector-search/SKILL.md +339 -339
- package/.claude/skills/browser/SKILL.md +204 -204
- package/.claude/skills/dual-mode/README.md +71 -71
- package/.claude/skills/dual-mode/dual-collect.md +103 -103
- package/.claude/skills/dual-mode/dual-coordinate.md +85 -85
- package/.claude/skills/dual-mode/dual-spawn.md +81 -81
- package/.claude/skills/flow-nexus-neural/SKILL.md +727 -727
- package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -1154
- package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -604
- package/.claude/skills/github-code-review/SKILL.md +1125 -1125
- package/.claude/skills/github-multi-repo/SKILL.md +862 -862
- package/.claude/skills/github-project-management/SKILL.md +1262 -1262
- package/.claude/skills/github-release-management/SKILL.md +1064 -1064
- package/.claude/skills/github-workflow-automation/SKILL.md +1047 -1047
- package/.claude/skills/hooks-automation/SKILL.md +1201 -1201
- package/.claude/skills/pair-programming/SKILL.md +1202 -1202
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -446
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -201
- package/.claude/skills/skill-builder/SKILL.md +910 -910
- package/.claude/skills/sparc-methodology/SKILL.md +1106 -1106
- package/.claude/skills/stream-chain/SKILL.md +560 -560
- package/.claude/skills/swarm-advanced/SKILL.md +970 -970
- package/.claude/skills/swarm-orchestration/SKILL.md +179 -179
- package/.claude/skills/v3-cli-modernization/SKILL.md +871 -871
- package/.claude/skills/v3-core-implementation/SKILL.md +796 -796
- package/.claude/skills/v3-ddd-architecture/SKILL.md +441 -441
- package/.claude/skills/v3-integration-deep/SKILL.md +240 -240
- package/.claude/skills/v3-mcp-optimization/SKILL.md +776 -776
- package/.claude/skills/v3-memory-unification/SKILL.md +173 -173
- package/.claude/skills/v3-performance-optimization/SKILL.md +389 -389
- package/.claude/skills/v3-security-overhaul/SKILL.md +81 -81
- package/.claude/skills/v3-swarm-coordination/SKILL.md +339 -339
- package/.claude/skills/verification-quality/SKILL.md +691 -691
- package/README.md +416 -416
- package/bin/cli.js +314 -314
- package/bin/mcp-server.js +224 -224
- package/bin/preinstall.cjs +2 -2
- package/dist/src/benchmarks/gaia-critic.js +24 -24
- package/dist/src/commands/completions.js +409 -409
- package/dist/src/commands/daemon.js +44 -44
- package/dist/src/commands/embeddings.js +29 -29
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.js +9 -9
- package/dist/src/commands/ruvector/backup.js +23 -23
- package/dist/src/commands/ruvector/benchmark.js +31 -31
- package/dist/src/commands/ruvector/import.js +14 -14
- package/dist/src/commands/ruvector/init.js +115 -115
- package/dist/src/commands/ruvector/migrate.js +99 -99
- package/dist/src/commands/ruvector/optimize.js +51 -51
- package/dist/src/commands/ruvector/setup.js +624 -624
- package/dist/src/commands/ruvector/status.js +38 -38
- package/dist/src/init/claudemd-generator.js +227 -227
- package/dist/src/init/executor.js +453 -453
- package/dist/src/init/helpers-generator.js +727 -727
- package/dist/src/init/statusline-generator.js +570 -570
- package/dist/src/mcp-tools/agentdb-tools.js +15 -15
- package/dist/src/memory/graph-edge-writer.js +18 -18
- package/dist/src/memory/memory-bridge.js +84 -84
- package/dist/src/memory/memory-initializer.js +393 -393
- package/dist/src/memory/rabitq-index.js +5 -5
- package/dist/src/runtime/headless.js +28 -28
- package/dist/src/ruvector/flash-attention.d.ts +195 -0
- package/dist/src/ruvector/flash-attention.d.ts.map +1 -0
- package/dist/src/ruvector/flash-attention.js +643 -0
- package/dist/src/ruvector/flash-attention.js.map +1 -0
- package/dist/src/ruvector/moe-router.d.ts +206 -0
- package/dist/src/ruvector/moe-router.d.ts.map +1 -0
- package/dist/src/ruvector/moe-router.js +626 -0
- package/dist/src/ruvector/moe-router.js.map +1 -0
- package/dist/src/services/event-stream.d.ts +25 -0
- package/dist/src/services/event-stream.js +27 -0
- package/dist/src/services/headless-worker-executor.js +84 -84
- package/dist/src/services/loop-worker-runner.d.ts +16 -0
- package/dist/src/services/loop-worker-runner.js +34 -0
- package/dist/src/services/runtime-capabilities.d.ts +22 -0
- package/dist/src/services/runtime-capabilities.js +45 -0
- package/dist/src/transfer/deploy-seraphine.js +23 -23
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +134 -134
- package/scripts/beir-bootstrap-significance.mjs +162 -162
- package/scripts/bench-rvagent.mjs +312 -312
- package/scripts/benchmark-codemods.mjs +127 -127
- package/scripts/benchmark-cross-repo.mjs +206 -206
- package/scripts/benchmark-pretrained-retrieval.mjs +305 -305
- package/scripts/benchmark-self-learning.mjs +241 -241
- package/scripts/benchmark-trajectory-mrr.mjs +191 -191
- package/scripts/deploy-ipfs-node.sh +153 -153
- package/scripts/grid-search-retrieval.mjs +216 -216
- package/scripts/postinstall.cjs +153 -153
- package/scripts/pretrain-from-github.mjs +358 -358
- package/scripts/publish-registry.ts +345 -345
- package/scripts/publish.sh +57 -57
- package/scripts/run-beir-bge.mjs +324 -336
- package/scripts/run-beir-hybrid.mjs +261 -263
- package/scripts/run-beir-lucene-bm25.mjs +154 -154
- package/scripts/run-beir-nfcorpus.mjs +231 -231
- package/scripts/run-beir-rrf-ablation.mjs +221 -221
- package/scripts/setup-ipfs-registry.md +366 -366
- package/dist/src/benchmarks/capability-tasks.d.ts +0 -126
- package/dist/src/benchmarks/capability-tasks.d.ts.map +0 -1
- package/dist/src/benchmarks/capability-tasks.js +0 -147
- package/dist/src/benchmarks/capability-tasks.js.map +0 -1
- package/dist/src/benchmarks/gaia-agent-contrastive.d.ts +0 -53
- package/dist/src/benchmarks/gaia-agent-contrastive.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-agent-contrastive.js +0 -177
- package/dist/src/benchmarks/gaia-agent-contrastive.js.map +0 -1
- package/dist/src/benchmarks/gaia-agent-gemini.d.ts +0 -51
- package/dist/src/benchmarks/gaia-agent-gemini.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-agent-gemini.js +0 -352
- package/dist/src/benchmarks/gaia-agent-gemini.js.map +0 -1
- package/dist/src/benchmarks/gaia-claude-p.d.ts +0 -105
- package/dist/src/benchmarks/gaia-claude-p.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-claude-p.js +0 -269
- package/dist/src/benchmarks/gaia-claude-p.js.map +0 -1
- package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts +0 -20
- package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-claude-p.smoke.js +0 -168
- package/dist/src/benchmarks/gaia-claude-p.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-codeagent-runner.py +0 -556
- package/dist/src/benchmarks/gaia-codeagent.d.ts +0 -129
- package/dist/src/benchmarks/gaia-codeagent.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-codeagent.js +0 -590
- package/dist/src/benchmarks/gaia-codeagent.js.map +0 -1
- package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts +0 -33
- package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-codeagent.smoke.js +0 -241
- package/dist/src/benchmarks/gaia-codeagent.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-dag-pilot.d.ts +0 -22
- package/dist/src/benchmarks/gaia-dag-pilot.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-dag-pilot.js +0 -158
- package/dist/src/benchmarks/gaia-dag-pilot.js.map +0 -1
- package/dist/src/benchmarks/gaia-dag.d.ts +0 -110
- package/dist/src/benchmarks/gaia-dag.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-dag.js +0 -658
- package/dist/src/benchmarks/gaia-dag.js.map +0 -1
- package/dist/src/benchmarks/gaia-dag.smoke.d.ts +0 -21
- package/dist/src/benchmarks/gaia-dag.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-dag.smoke.js +0 -290
- package/dist/src/benchmarks/gaia-dag.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts +0 -17
- package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-ensemble-pilot.js +0 -106
- package/dist/src/benchmarks/gaia-ensemble-pilot.js.map +0 -1
- package/dist/src/benchmarks/gaia-ensemble.d.ts +0 -103
- package/dist/src/benchmarks/gaia-ensemble.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-ensemble.js +0 -462
- package/dist/src/benchmarks/gaia-ensemble.js.map +0 -1
- package/dist/src/benchmarks/gaia-gemini-pilot.d.ts +0 -17
- package/dist/src/benchmarks/gaia-gemini-pilot.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-gemini-pilot.js +0 -168
- package/dist/src/benchmarks/gaia-gemini-pilot.js.map +0 -1
- package/dist/src/benchmarks/gaia-mode-router.d.ts +0 -67
- package/dist/src/benchmarks/gaia-mode-router.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-mode-router.js +0 -126
- package/dist/src/benchmarks/gaia-mode-router.js.map +0 -1
- package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts +0 -15
- package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-mode-router.smoke.js +0 -131
- package/dist/src/benchmarks/gaia-mode-router.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts +0 -24
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js +0 -276
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/image_describe.d.ts +0 -45
- package/dist/src/benchmarks/gaia-tools/image_describe.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/image_describe.js +0 -222
- package/dist/src/benchmarks/gaia-tools/image_describe.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts +0 -24
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js +0 -169
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts +0 -27
- package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/pdf_read.js +0 -226
- package/dist/src/benchmarks/gaia-tools/pdf_read.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/python_exec.d.ts +0 -31
- package/dist/src/benchmarks/gaia-tools/python_exec.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/python_exec.js +0 -94
- package/dist/src/benchmarks/gaia-tools/python_exec.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts +0 -13
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js +0 -98
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts +0 -52
- package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/visit_webpage.js +0 -304
- package/dist/src/benchmarks/gaia-tools/visit_webpage.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/web_browse.d.ts +0 -61
- package/dist/src/benchmarks/gaia-tools/web_browse.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/web_browse.js +0 -217
- package/dist/src/benchmarks/gaia-tools/web_browse.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts +0 -26
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js +0 -152
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts +0 -24
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.js +0 -311
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.js.map +0 -1
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts +0 -25
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts.map +0 -1
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.js +0 -304
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.js.map +0 -1
- package/dist/src/commands/performance-capability.d.ts +0 -30
- package/dist/src/commands/performance-capability.d.ts.map +0 -1
- package/dist/src/commands/performance-capability.js +0 -349
- package/dist/src/commands/performance-capability.js.map +0 -1
|
@@ -1,312 +1,312 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* ADR-129 rvagent benchmark suite.
|
|
4
|
-
*
|
|
5
|
-
* Measures the four performance wins introduced by ADR-129 Phases 1–4:
|
|
6
|
-
*
|
|
7
|
-
* P1 — Provider routing latency (JsModelProvider wiring).
|
|
8
|
-
* Compares echo-stub round-trip (keyless baseline) against provider
|
|
9
|
-
* attachment overhead (measured with a fake key that will 401 — we
|
|
10
|
-
* capture the latency to the WASM call boundary, not the network hop).
|
|
11
|
-
*
|
|
12
|
-
* P2 — wasm_agent_compose throughput with N=10/50/100 MCP tools.
|
|
13
|
-
* Shows cost of allowlist validation + descriptor building at scale.
|
|
14
|
-
*
|
|
15
|
-
* P3 — Gallery CRUD throughput: add → list → import → export → remove.
|
|
16
|
-
* Validates that the 10 new gallery operations land in <1 ms each.
|
|
17
|
-
*
|
|
18
|
-
* P4 — Plugin enumeration overhead: wasm_agent_compose with/without
|
|
19
|
-
* includePlugins. Measures manifest-lookup cost when the plugin
|
|
20
|
-
* directory does not exist (graceful no-op path).
|
|
21
|
-
*
|
|
22
|
-
* Output: docs/benchmarks/rvagent-baseline.json
|
|
23
|
-
*
|
|
24
|
-
* Usage:
|
|
25
|
-
* node v3/@claude-flow/cli/scripts/bench-rvagent.mjs [--tag=baseline] [--trials=5]
|
|
26
|
-
*
|
|
27
|
-
* Pattern: mirrors v3/@claude-flow/guidance/scripts/bench-phase-1.mjs.
|
|
28
|
-
* Standalone — does NOT require the test runner, only Node ≥20 + the WASM
|
|
29
|
-
* package (@ruvector/rvagent-wasm must be installed for realistic numbers;
|
|
30
|
-
* the bench gracefully degrades to timing the WASM-unavailable error path).
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
import { performance } from 'node:perf_hooks';
|
|
34
|
-
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
35
|
-
import { fileURLToPath } from 'node:url';
|
|
36
|
-
import { dirname, resolve } from 'node:path';
|
|
37
|
-
|
|
38
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
39
|
-
const REPO_ROOT = resolve(__dirname, '../../../..');
|
|
40
|
-
const OUT_DIR = resolve(REPO_ROOT, 'docs', 'benchmarks');
|
|
41
|
-
|
|
42
|
-
const args = Object.fromEntries(
|
|
43
|
-
process.argv.slice(2).map(a => {
|
|
44
|
-
const [k, v] = a.replace(/^--/, '').split('=');
|
|
45
|
-
return [k, v ?? true];
|
|
46
|
-
}),
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
const TAG = args.tag || 'baseline';
|
|
50
|
-
const TRIALS = Math.max(3, parseInt(args.trials || '5', 10));
|
|
51
|
-
|
|
52
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
53
|
-
// Timing harness — 5-trial median, same as bench-phase-1.mjs
|
|
54
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Time N async calls (or sync if fn returns non-Promise), return median ms.
|
|
58
|
-
*/
|
|
59
|
-
async function bench(name, fn, reps = 20) {
|
|
60
|
-
// Warmup — trigger any lazy init so it doesn't inflate the first trial.
|
|
61
|
-
for (let i = 0; i < Math.min(3, reps); i++) {
|
|
62
|
-
try { await fn(); } catch { /* ignore warmup errors */ }
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const latencies = [];
|
|
66
|
-
for (let t = 0; t < TRIALS; t++) {
|
|
67
|
-
const start = performance.now();
|
|
68
|
-
for (let i = 0; i < reps; i++) {
|
|
69
|
-
try { await fn(); } catch { /* measure call overhead, not success */ }
|
|
70
|
-
}
|
|
71
|
-
latencies.push((performance.now() - start) / reps);
|
|
72
|
-
}
|
|
73
|
-
latencies.sort((a, b) => a - b);
|
|
74
|
-
const median = latencies[Math.floor(TRIALS / 2)];
|
|
75
|
-
const min = latencies[0];
|
|
76
|
-
const max = latencies[TRIALS - 1];
|
|
77
|
-
|
|
78
|
-
return {
|
|
79
|
-
name,
|
|
80
|
-
trials: TRIALS,
|
|
81
|
-
reps,
|
|
82
|
-
medianMs: Math.round(median * 1000) / 1000,
|
|
83
|
-
minMs: Math.round(min * 1000) / 1000,
|
|
84
|
-
maxMs: Math.round(max * 1000) / 1000,
|
|
85
|
-
variance: Math.round(((max - min) / (median || 1)) * 1000) / 1000,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
90
|
-
// Load the live agent-wasm module (dist preferred, src fallback)
|
|
91
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
92
|
-
|
|
93
|
-
// dist layout: dist/src/**/*.js (tsc rootDir=.)
|
|
94
|
-
const DIST_SRC = resolve(__dirname, '../dist/src');
|
|
95
|
-
let wasmMod;
|
|
96
|
-
try {
|
|
97
|
-
wasmMod = await import(resolve(DIST_SRC, 'ruvector/agent-wasm.js'));
|
|
98
|
-
} catch {
|
|
99
|
-
console.warn('[bench] Could not load agent-wasm dist — using stub metrics only.');
|
|
100
|
-
wasmMod = null;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Load the wasm tools module to bench wasm_agent_compose handler directly
|
|
104
|
-
let composeHandler;
|
|
105
|
-
let galleryHandlers = {};
|
|
106
|
-
try {
|
|
107
|
-
const toolsMod = await import(resolve(DIST_SRC, 'mcp-tools/wasm-agent-tools.js'));
|
|
108
|
-
const tools = toolsMod.wasmAgentTools ?? toolsMod.default ?? [];
|
|
109
|
-
const findHandler = (name) => tools.find(t => t.name === name)?.handler;
|
|
110
|
-
composeHandler = findHandler('wasm_agent_compose');
|
|
111
|
-
galleryHandlers = {
|
|
112
|
-
add: findHandler('wasm_gallery_add_custom'),
|
|
113
|
-
list: findHandler('wasm_gallery_list'),
|
|
114
|
-
importFn: findHandler('wasm_gallery_import'),
|
|
115
|
-
exportFn: findHandler('wasm_gallery_export'),
|
|
116
|
-
remove: findHandler('wasm_gallery_remove_custom'),
|
|
117
|
-
categories: findHandler('wasm_gallery_categories'),
|
|
118
|
-
listByCategory: findHandler('wasm_gallery_list_by_category'),
|
|
119
|
-
loadRvf: findHandler('wasm_gallery_load_rvf'),
|
|
120
|
-
active: findHandler('wasm_gallery_active'),
|
|
121
|
-
config: findHandler('wasm_gallery_config'),
|
|
122
|
-
};
|
|
123
|
-
} catch {
|
|
124
|
-
// Handlers unavailable — bench will time the missing-module error path.
|
|
125
|
-
composeHandler = null;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
129
|
-
// P1 — Provider routing latency
|
|
130
|
-
//
|
|
131
|
-
// Baseline: echo-stub path (no keys set) — measures raw WASM call overhead.
|
|
132
|
-
// Provider: createWasmAgent with a fake ANTHROPIC_API_KEY. The key is 401'd
|
|
133
|
-
// by the Anthropic API before any tokens are billed, but the routing
|
|
134
|
-
// logic (attachJsModelProvider, JsModelProvider instantiation, provider
|
|
135
|
-
// lookup) runs synchronously before the network call. We measure the
|
|
136
|
-
// in-process portion only by timing createWasmAgent + promptWasmAgent
|
|
137
|
-
// with a deliberately short input and catching the 401 network error.
|
|
138
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
139
|
-
|
|
140
|
-
const originalKey = process.env.ANTHROPIC_API_KEY;
|
|
141
|
-
|
|
142
|
-
console.log('\nADR-129 rvagent benchmark suite');
|
|
143
|
-
console.log('================================');
|
|
144
|
-
console.log(`tag=${TAG} trials=${TRIALS} node=${process.version}`);
|
|
145
|
-
console.log('');
|
|
146
|
-
|
|
147
|
-
// P1a — echo-stub baseline (no key)
|
|
148
|
-
console.log('P1a: provider routing — echo-stub baseline (keyless)...');
|
|
149
|
-
delete process.env.ANTHROPIC_API_KEY;
|
|
150
|
-
delete process.env.OPENROUTER_API_KEY;
|
|
151
|
-
delete process.env.OLLAMA_API_KEY;
|
|
152
|
-
|
|
153
|
-
const r_p1_echo = await bench('P1-echo-stub: createWasmAgent (keyless)', async () => {
|
|
154
|
-
if (!wasmMod) return; // module unavailable — timing the absence
|
|
155
|
-
try {
|
|
156
|
-
const info = await wasmMod.createWasmAgent({ maxTurns: 1 });
|
|
157
|
-
wasmMod.terminateWasmAgent(info.id);
|
|
158
|
-
} catch { /* WASM unavailable is expected in keyless CI */ }
|
|
159
|
-
}, 5);
|
|
160
|
-
|
|
161
|
-
// P1b — provider-path: fake key triggers attachJsModelProvider logic
|
|
162
|
-
console.log('P1b: provider routing — with fake key (measures attach overhead)...');
|
|
163
|
-
process.env.ANTHROPIC_API_KEY = 'sk-ant-bench-fake-key-00000000000000000000000000';
|
|
164
|
-
|
|
165
|
-
const r_p1_provider = await bench('P1-provider-path: createWasmAgent (fake key)', async () => {
|
|
166
|
-
if (!wasmMod) return;
|
|
167
|
-
try {
|
|
168
|
-
const info = await wasmMod.createWasmAgent({ maxTurns: 1 });
|
|
169
|
-
wasmMod.terminateWasmAgent(info.id);
|
|
170
|
-
} catch { /* 401 expected */ }
|
|
171
|
-
}, 5);
|
|
172
|
-
|
|
173
|
-
// Restore original key state
|
|
174
|
-
if (originalKey !== undefined) {
|
|
175
|
-
process.env.ANTHROPIC_API_KEY = originalKey;
|
|
176
|
-
} else {
|
|
177
|
-
delete process.env.ANTHROPIC_API_KEY;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
181
|
-
// P2 — wasm_agent_compose throughput with N=10/50/100 MCP tools
|
|
182
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
183
|
-
|
|
184
|
-
console.log('P2: compose throughput — N=10/50/100 MCP tools...');
|
|
185
|
-
|
|
186
|
-
function makeMcpToolList(n) {
|
|
187
|
-
return Array.from({ length: n }, (_, i) => `memory_search_${i % 30 === 0 ? i : 'search'}`);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
async function timeCompose(toolCount) {
|
|
191
|
-
if (!composeHandler) return null;
|
|
192
|
-
const tools = makeMcpToolList(toolCount);
|
|
193
|
-
return bench(`P2-compose: ${toolCount} MCP tools`, async () => {
|
|
194
|
-
await composeHandler({ mcpTools: tools, skills: [], prompts: [], tools: [] });
|
|
195
|
-
}, 10);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const r_p2_10 = await timeCompose(10);
|
|
199
|
-
const r_p2_50 = await timeCompose(50);
|
|
200
|
-
const r_p2_100 = await timeCompose(100);
|
|
201
|
-
|
|
202
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
203
|
-
// P3 — Gallery CRUD throughput: full add → list → import → export → remove cycle
|
|
204
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
205
|
-
|
|
206
|
-
console.log('P3: gallery CRUD — add/list/import/export/remove cycle...');
|
|
207
|
-
|
|
208
|
-
const CUSTOM_TEMPLATE = JSON.stringify({
|
|
209
|
-
id: 'bench-custom-1',
|
|
210
|
-
name: 'bench-template',
|
|
211
|
-
description: 'Benchmark custom template',
|
|
212
|
-
category: 'testing',
|
|
213
|
-
tags: ['bench'],
|
|
214
|
-
version: '0.1.0',
|
|
215
|
-
author: 'bench',
|
|
216
|
-
builtin: false,
|
|
217
|
-
tools: [],
|
|
218
|
-
prompts: [],
|
|
219
|
-
skills: [],
|
|
220
|
-
mcp_tools: [],
|
|
221
|
-
capabilities: [],
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
const r_p3_cycle = await bench('P3-gallery-crud: add→list→import→export→remove', async () => {
|
|
225
|
-
const fns = galleryHandlers;
|
|
226
|
-
if (fns.add) await fns.add({ template: JSON.parse(CUSTOM_TEMPLATE) }).catch(() => {});
|
|
227
|
-
if (fns.list) await fns.list({}).catch(() => {});
|
|
228
|
-
if (fns.importFn) await fns.importFn({ templatesJson: `[${CUSTOM_TEMPLATE}]` }).catch(() => {});
|
|
229
|
-
if (fns.exportFn) await fns.exportFn({}).catch(() => {});
|
|
230
|
-
if (fns.remove) await fns.remove({ id: 'bench-custom-1' }).catch(() => {});
|
|
231
|
-
}, 5);
|
|
232
|
-
|
|
233
|
-
const r_p3_categories = await bench('P3-gallery-categories: getCategories', async () => {
|
|
234
|
-
if (galleryHandlers.categories) await galleryHandlers.categories({}).catch(() => {});
|
|
235
|
-
}, 10);
|
|
236
|
-
|
|
237
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
238
|
-
// P4 — Plugin enumeration: compose with/without includePlugins
|
|
239
|
-
//
|
|
240
|
-
// Tests the manifest-lookup path for plugins that don't exist on disk
|
|
241
|
-
// (graceful no-op / warning). This measures that skipping absent plugins
|
|
242
|
-
// doesn't add significant overhead.
|
|
243
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
244
|
-
|
|
245
|
-
console.log('P4: plugin enumeration — compose with/without includePlugins...');
|
|
246
|
-
|
|
247
|
-
const r_p4_without = await bench('P4-plugin-enum: compose WITHOUT includePlugins', async () => {
|
|
248
|
-
if (!composeHandler) return;
|
|
249
|
-
await composeHandler({ mcpTools: ['memory_search'], skills: [], prompts: [], tools: [] });
|
|
250
|
-
}, 10);
|
|
251
|
-
|
|
252
|
-
const r_p4_with = await bench('P4-plugin-enum: compose WITH includePlugins (absent plugins)', async () => {
|
|
253
|
-
if (!composeHandler) return;
|
|
254
|
-
await composeHandler({
|
|
255
|
-
mcpTools: ['memory_search'],
|
|
256
|
-
includePlugins: ['nonexistent-plugin-a', 'nonexistent-plugin-b'],
|
|
257
|
-
skills: [],
|
|
258
|
-
prompts: [],
|
|
259
|
-
tools: [],
|
|
260
|
-
});
|
|
261
|
-
}, 10);
|
|
262
|
-
|
|
263
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
264
|
-
// Emit results
|
|
265
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
266
|
-
|
|
267
|
-
const results = [
|
|
268
|
-
r_p1_echo,
|
|
269
|
-
r_p1_provider,
|
|
270
|
-
r_p2_10,
|
|
271
|
-
r_p2_50,
|
|
272
|
-
r_p2_100,
|
|
273
|
-
r_p3_cycle,
|
|
274
|
-
r_p3_categories,
|
|
275
|
-
r_p4_without,
|
|
276
|
-
r_p4_with,
|
|
277
|
-
].filter(Boolean);
|
|
278
|
-
|
|
279
|
-
const out = {
|
|
280
|
-
tag: TAG,
|
|
281
|
-
trials: TRIALS,
|
|
282
|
-
node: process.version,
|
|
283
|
-
platform: `${process.platform}-${process.arch}`,
|
|
284
|
-
capturedAt: new Date().toISOString(),
|
|
285
|
-
adr: 'ADR-129',
|
|
286
|
-
phases: ['P1-provider-routing', 'P2-compose-throughput', 'P3-gallery-crud', 'P4-plugin-enum'],
|
|
287
|
-
results,
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
mkdirSync(OUT_DIR, { recursive: true });
|
|
291
|
-
const outPath = resolve(OUT_DIR, `rvagent-${TAG}.json`);
|
|
292
|
-
writeFileSync(outPath, JSON.stringify(out, null, 2));
|
|
293
|
-
|
|
294
|
-
console.log(`\nWrote ${outPath}\n`);
|
|
295
|
-
|
|
296
|
-
const COL_NAME = 52;
|
|
297
|
-
const COL_MS = 10;
|
|
298
|
-
const COL_VAR = 8;
|
|
299
|
-
|
|
300
|
-
console.log(`| ${'Benchmark'.padEnd(COL_NAME)} | ${'Median ms'.padStart(COL_MS)} | ${'Variance'.padStart(COL_VAR)} |`);
|
|
301
|
-
console.log(`|${'-'.repeat(COL_NAME + 2)}|${'-'.repeat(COL_MS + 2)}|${'-'.repeat(COL_VAR + 2)}|`);
|
|
302
|
-
|
|
303
|
-
for (const r of results) {
|
|
304
|
-
const name = r.name.padEnd(COL_NAME).slice(0, COL_NAME);
|
|
305
|
-
const ms = String(r.medianMs).padStart(COL_MS);
|
|
306
|
-
const vari = String(r.variance).padStart(COL_VAR);
|
|
307
|
-
console.log(`| ${name} | ${ms} | ${vari} |`);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
console.log('');
|
|
311
|
-
console.log('Note: ms values measure in-process overhead including WASM unavailable error path.');
|
|
312
|
-
console.log('When @ruvector/rvagent-wasm is not installed, timings reflect the import error cost only.');
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ADR-129 rvagent benchmark suite.
|
|
4
|
+
*
|
|
5
|
+
* Measures the four performance wins introduced by ADR-129 Phases 1–4:
|
|
6
|
+
*
|
|
7
|
+
* P1 — Provider routing latency (JsModelProvider wiring).
|
|
8
|
+
* Compares echo-stub round-trip (keyless baseline) against provider
|
|
9
|
+
* attachment overhead (measured with a fake key that will 401 — we
|
|
10
|
+
* capture the latency to the WASM call boundary, not the network hop).
|
|
11
|
+
*
|
|
12
|
+
* P2 — wasm_agent_compose throughput with N=10/50/100 MCP tools.
|
|
13
|
+
* Shows cost of allowlist validation + descriptor building at scale.
|
|
14
|
+
*
|
|
15
|
+
* P3 — Gallery CRUD throughput: add → list → import → export → remove.
|
|
16
|
+
* Validates that the 10 new gallery operations land in <1 ms each.
|
|
17
|
+
*
|
|
18
|
+
* P4 — Plugin enumeration overhead: wasm_agent_compose with/without
|
|
19
|
+
* includePlugins. Measures manifest-lookup cost when the plugin
|
|
20
|
+
* directory does not exist (graceful no-op path).
|
|
21
|
+
*
|
|
22
|
+
* Output: docs/benchmarks/rvagent-baseline.json
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* node v3/@claude-flow/cli/scripts/bench-rvagent.mjs [--tag=baseline] [--trials=5]
|
|
26
|
+
*
|
|
27
|
+
* Pattern: mirrors v3/@claude-flow/guidance/scripts/bench-phase-1.mjs.
|
|
28
|
+
* Standalone — does NOT require the test runner, only Node ≥20 + the WASM
|
|
29
|
+
* package (@ruvector/rvagent-wasm must be installed for realistic numbers;
|
|
30
|
+
* the bench gracefully degrades to timing the WASM-unavailable error path).
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { performance } from 'node:perf_hooks';
|
|
34
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
35
|
+
import { fileURLToPath } from 'node:url';
|
|
36
|
+
import { dirname, resolve } from 'node:path';
|
|
37
|
+
|
|
38
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
const REPO_ROOT = resolve(__dirname, '../../../..');
|
|
40
|
+
const OUT_DIR = resolve(REPO_ROOT, 'docs', 'benchmarks');
|
|
41
|
+
|
|
42
|
+
const args = Object.fromEntries(
|
|
43
|
+
process.argv.slice(2).map(a => {
|
|
44
|
+
const [k, v] = a.replace(/^--/, '').split('=');
|
|
45
|
+
return [k, v ?? true];
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const TAG = args.tag || 'baseline';
|
|
50
|
+
const TRIALS = Math.max(3, parseInt(args.trials || '5', 10));
|
|
51
|
+
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
53
|
+
// Timing harness — 5-trial median, same as bench-phase-1.mjs
|
|
54
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Time N async calls (or sync if fn returns non-Promise), return median ms.
|
|
58
|
+
*/
|
|
59
|
+
async function bench(name, fn, reps = 20) {
|
|
60
|
+
// Warmup — trigger any lazy init so it doesn't inflate the first trial.
|
|
61
|
+
for (let i = 0; i < Math.min(3, reps); i++) {
|
|
62
|
+
try { await fn(); } catch { /* ignore warmup errors */ }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const latencies = [];
|
|
66
|
+
for (let t = 0; t < TRIALS; t++) {
|
|
67
|
+
const start = performance.now();
|
|
68
|
+
for (let i = 0; i < reps; i++) {
|
|
69
|
+
try { await fn(); } catch { /* measure call overhead, not success */ }
|
|
70
|
+
}
|
|
71
|
+
latencies.push((performance.now() - start) / reps);
|
|
72
|
+
}
|
|
73
|
+
latencies.sort((a, b) => a - b);
|
|
74
|
+
const median = latencies[Math.floor(TRIALS / 2)];
|
|
75
|
+
const min = latencies[0];
|
|
76
|
+
const max = latencies[TRIALS - 1];
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
name,
|
|
80
|
+
trials: TRIALS,
|
|
81
|
+
reps,
|
|
82
|
+
medianMs: Math.round(median * 1000) / 1000,
|
|
83
|
+
minMs: Math.round(min * 1000) / 1000,
|
|
84
|
+
maxMs: Math.round(max * 1000) / 1000,
|
|
85
|
+
variance: Math.round(((max - min) / (median || 1)) * 1000) / 1000,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
90
|
+
// Load the live agent-wasm module (dist preferred, src fallback)
|
|
91
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
// dist layout: dist/src/**/*.js (tsc rootDir=.)
|
|
94
|
+
const DIST_SRC = resolve(__dirname, '../dist/src');
|
|
95
|
+
let wasmMod;
|
|
96
|
+
try {
|
|
97
|
+
wasmMod = await import(resolve(DIST_SRC, 'ruvector/agent-wasm.js'));
|
|
98
|
+
} catch {
|
|
99
|
+
console.warn('[bench] Could not load agent-wasm dist — using stub metrics only.');
|
|
100
|
+
wasmMod = null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Load the wasm tools module to bench wasm_agent_compose handler directly
|
|
104
|
+
let composeHandler;
|
|
105
|
+
let galleryHandlers = {};
|
|
106
|
+
try {
|
|
107
|
+
const toolsMod = await import(resolve(DIST_SRC, 'mcp-tools/wasm-agent-tools.js'));
|
|
108
|
+
const tools = toolsMod.wasmAgentTools ?? toolsMod.default ?? [];
|
|
109
|
+
const findHandler = (name) => tools.find(t => t.name === name)?.handler;
|
|
110
|
+
composeHandler = findHandler('wasm_agent_compose');
|
|
111
|
+
galleryHandlers = {
|
|
112
|
+
add: findHandler('wasm_gallery_add_custom'),
|
|
113
|
+
list: findHandler('wasm_gallery_list'),
|
|
114
|
+
importFn: findHandler('wasm_gallery_import'),
|
|
115
|
+
exportFn: findHandler('wasm_gallery_export'),
|
|
116
|
+
remove: findHandler('wasm_gallery_remove_custom'),
|
|
117
|
+
categories: findHandler('wasm_gallery_categories'),
|
|
118
|
+
listByCategory: findHandler('wasm_gallery_list_by_category'),
|
|
119
|
+
loadRvf: findHandler('wasm_gallery_load_rvf'),
|
|
120
|
+
active: findHandler('wasm_gallery_active'),
|
|
121
|
+
config: findHandler('wasm_gallery_config'),
|
|
122
|
+
};
|
|
123
|
+
} catch {
|
|
124
|
+
// Handlers unavailable — bench will time the missing-module error path.
|
|
125
|
+
composeHandler = null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
129
|
+
// P1 — Provider routing latency
|
|
130
|
+
//
|
|
131
|
+
// Baseline: echo-stub path (no keys set) — measures raw WASM call overhead.
|
|
132
|
+
// Provider: createWasmAgent with a fake ANTHROPIC_API_KEY. The key is 401'd
|
|
133
|
+
// by the Anthropic API before any tokens are billed, but the routing
|
|
134
|
+
// logic (attachJsModelProvider, JsModelProvider instantiation, provider
|
|
135
|
+
// lookup) runs synchronously before the network call. We measure the
|
|
136
|
+
// in-process portion only by timing createWasmAgent + promptWasmAgent
|
|
137
|
+
// with a deliberately short input and catching the 401 network error.
|
|
138
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
const originalKey = process.env.ANTHROPIC_API_KEY;
|
|
141
|
+
|
|
142
|
+
console.log('\nADR-129 rvagent benchmark suite');
|
|
143
|
+
console.log('================================');
|
|
144
|
+
console.log(`tag=${TAG} trials=${TRIALS} node=${process.version}`);
|
|
145
|
+
console.log('');
|
|
146
|
+
|
|
147
|
+
// P1a — echo-stub baseline (no key)
|
|
148
|
+
console.log('P1a: provider routing — echo-stub baseline (keyless)...');
|
|
149
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
150
|
+
delete process.env.OPENROUTER_API_KEY;
|
|
151
|
+
delete process.env.OLLAMA_API_KEY;
|
|
152
|
+
|
|
153
|
+
const r_p1_echo = await bench('P1-echo-stub: createWasmAgent (keyless)', async () => {
|
|
154
|
+
if (!wasmMod) return; // module unavailable — timing the absence
|
|
155
|
+
try {
|
|
156
|
+
const info = await wasmMod.createWasmAgent({ maxTurns: 1 });
|
|
157
|
+
wasmMod.terminateWasmAgent(info.id);
|
|
158
|
+
} catch { /* WASM unavailable is expected in keyless CI */ }
|
|
159
|
+
}, 5);
|
|
160
|
+
|
|
161
|
+
// P1b — provider-path: fake key triggers attachJsModelProvider logic
|
|
162
|
+
console.log('P1b: provider routing — with fake key (measures attach overhead)...');
|
|
163
|
+
process.env.ANTHROPIC_API_KEY = 'sk-ant-bench-fake-key-00000000000000000000000000';
|
|
164
|
+
|
|
165
|
+
const r_p1_provider = await bench('P1-provider-path: createWasmAgent (fake key)', async () => {
|
|
166
|
+
if (!wasmMod) return;
|
|
167
|
+
try {
|
|
168
|
+
const info = await wasmMod.createWasmAgent({ maxTurns: 1 });
|
|
169
|
+
wasmMod.terminateWasmAgent(info.id);
|
|
170
|
+
} catch { /* 401 expected */ }
|
|
171
|
+
}, 5);
|
|
172
|
+
|
|
173
|
+
// Restore original key state
|
|
174
|
+
if (originalKey !== undefined) {
|
|
175
|
+
process.env.ANTHROPIC_API_KEY = originalKey;
|
|
176
|
+
} else {
|
|
177
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
181
|
+
// P2 — wasm_agent_compose throughput with N=10/50/100 MCP tools
|
|
182
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
183
|
+
|
|
184
|
+
console.log('P2: compose throughput — N=10/50/100 MCP tools...');
|
|
185
|
+
|
|
186
|
+
function makeMcpToolList(n) {
|
|
187
|
+
return Array.from({ length: n }, (_, i) => `memory_search_${i % 30 === 0 ? i : 'search'}`);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function timeCompose(toolCount) {
|
|
191
|
+
if (!composeHandler) return null;
|
|
192
|
+
const tools = makeMcpToolList(toolCount);
|
|
193
|
+
return bench(`P2-compose: ${toolCount} MCP tools`, async () => {
|
|
194
|
+
await composeHandler({ mcpTools: tools, skills: [], prompts: [], tools: [] });
|
|
195
|
+
}, 10);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const r_p2_10 = await timeCompose(10);
|
|
199
|
+
const r_p2_50 = await timeCompose(50);
|
|
200
|
+
const r_p2_100 = await timeCompose(100);
|
|
201
|
+
|
|
202
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
203
|
+
// P3 — Gallery CRUD throughput: full add → list → import → export → remove cycle
|
|
204
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
console.log('P3: gallery CRUD — add/list/import/export/remove cycle...');
|
|
207
|
+
|
|
208
|
+
const CUSTOM_TEMPLATE = JSON.stringify({
|
|
209
|
+
id: 'bench-custom-1',
|
|
210
|
+
name: 'bench-template',
|
|
211
|
+
description: 'Benchmark custom template',
|
|
212
|
+
category: 'testing',
|
|
213
|
+
tags: ['bench'],
|
|
214
|
+
version: '0.1.0',
|
|
215
|
+
author: 'bench',
|
|
216
|
+
builtin: false,
|
|
217
|
+
tools: [],
|
|
218
|
+
prompts: [],
|
|
219
|
+
skills: [],
|
|
220
|
+
mcp_tools: [],
|
|
221
|
+
capabilities: [],
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const r_p3_cycle = await bench('P3-gallery-crud: add→list→import→export→remove', async () => {
|
|
225
|
+
const fns = galleryHandlers;
|
|
226
|
+
if (fns.add) await fns.add({ template: JSON.parse(CUSTOM_TEMPLATE) }).catch(() => {});
|
|
227
|
+
if (fns.list) await fns.list({}).catch(() => {});
|
|
228
|
+
if (fns.importFn) await fns.importFn({ templatesJson: `[${CUSTOM_TEMPLATE}]` }).catch(() => {});
|
|
229
|
+
if (fns.exportFn) await fns.exportFn({}).catch(() => {});
|
|
230
|
+
if (fns.remove) await fns.remove({ id: 'bench-custom-1' }).catch(() => {});
|
|
231
|
+
}, 5);
|
|
232
|
+
|
|
233
|
+
const r_p3_categories = await bench('P3-gallery-categories: getCategories', async () => {
|
|
234
|
+
if (galleryHandlers.categories) await galleryHandlers.categories({}).catch(() => {});
|
|
235
|
+
}, 10);
|
|
236
|
+
|
|
237
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
238
|
+
// P4 — Plugin enumeration: compose with/without includePlugins
|
|
239
|
+
//
|
|
240
|
+
// Tests the manifest-lookup path for plugins that don't exist on disk
|
|
241
|
+
// (graceful no-op / warning). This measures that skipping absent plugins
|
|
242
|
+
// doesn't add significant overhead.
|
|
243
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
244
|
+
|
|
245
|
+
console.log('P4: plugin enumeration — compose with/without includePlugins...');
|
|
246
|
+
|
|
247
|
+
const r_p4_without = await bench('P4-plugin-enum: compose WITHOUT includePlugins', async () => {
|
|
248
|
+
if (!composeHandler) return;
|
|
249
|
+
await composeHandler({ mcpTools: ['memory_search'], skills: [], prompts: [], tools: [] });
|
|
250
|
+
}, 10);
|
|
251
|
+
|
|
252
|
+
const r_p4_with = await bench('P4-plugin-enum: compose WITH includePlugins (absent plugins)', async () => {
|
|
253
|
+
if (!composeHandler) return;
|
|
254
|
+
await composeHandler({
|
|
255
|
+
mcpTools: ['memory_search'],
|
|
256
|
+
includePlugins: ['nonexistent-plugin-a', 'nonexistent-plugin-b'],
|
|
257
|
+
skills: [],
|
|
258
|
+
prompts: [],
|
|
259
|
+
tools: [],
|
|
260
|
+
});
|
|
261
|
+
}, 10);
|
|
262
|
+
|
|
263
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
264
|
+
// Emit results
|
|
265
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
266
|
+
|
|
267
|
+
const results = [
|
|
268
|
+
r_p1_echo,
|
|
269
|
+
r_p1_provider,
|
|
270
|
+
r_p2_10,
|
|
271
|
+
r_p2_50,
|
|
272
|
+
r_p2_100,
|
|
273
|
+
r_p3_cycle,
|
|
274
|
+
r_p3_categories,
|
|
275
|
+
r_p4_without,
|
|
276
|
+
r_p4_with,
|
|
277
|
+
].filter(Boolean);
|
|
278
|
+
|
|
279
|
+
const out = {
|
|
280
|
+
tag: TAG,
|
|
281
|
+
trials: TRIALS,
|
|
282
|
+
node: process.version,
|
|
283
|
+
platform: `${process.platform}-${process.arch}`,
|
|
284
|
+
capturedAt: new Date().toISOString(),
|
|
285
|
+
adr: 'ADR-129',
|
|
286
|
+
phases: ['P1-provider-routing', 'P2-compose-throughput', 'P3-gallery-crud', 'P4-plugin-enum'],
|
|
287
|
+
results,
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
mkdirSync(OUT_DIR, { recursive: true });
|
|
291
|
+
const outPath = resolve(OUT_DIR, `rvagent-${TAG}.json`);
|
|
292
|
+
writeFileSync(outPath, JSON.stringify(out, null, 2));
|
|
293
|
+
|
|
294
|
+
console.log(`\nWrote ${outPath}\n`);
|
|
295
|
+
|
|
296
|
+
const COL_NAME = 52;
|
|
297
|
+
const COL_MS = 10;
|
|
298
|
+
const COL_VAR = 8;
|
|
299
|
+
|
|
300
|
+
console.log(`| ${'Benchmark'.padEnd(COL_NAME)} | ${'Median ms'.padStart(COL_MS)} | ${'Variance'.padStart(COL_VAR)} |`);
|
|
301
|
+
console.log(`|${'-'.repeat(COL_NAME + 2)}|${'-'.repeat(COL_MS + 2)}|${'-'.repeat(COL_VAR + 2)}|`);
|
|
302
|
+
|
|
303
|
+
for (const r of results) {
|
|
304
|
+
const name = r.name.padEnd(COL_NAME).slice(0, COL_NAME);
|
|
305
|
+
const ms = String(r.medianMs).padStart(COL_MS);
|
|
306
|
+
const vari = String(r.variance).padStart(COL_VAR);
|
|
307
|
+
console.log(`| ${name} | ${ms} | ${vari} |`);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
console.log('');
|
|
311
|
+
console.log('Note: ms values measure in-process overhead including WASM unavailable error path.');
|
|
312
|
+
console.log('When @ruvector/rvagent-wasm is not installed, timings reflect the import error cost only.');
|