@claude-flow/cli 3.10.46 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +157 -157
- 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 +412 -412
- package/bin/cli.js +314 -314
- package/bin/mcp-server.js +224 -224
- package/bin/preinstall.cjs +2 -2
- package/dist/src/benchmarks/capability-tasks.d.ts +126 -0
- package/dist/src/benchmarks/capability-tasks.d.ts.map +1 -0
- package/dist/src/benchmarks/capability-tasks.js +147 -0
- package/dist/src/benchmarks/capability-tasks.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.d.ts +53 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.js +177 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent-gemini.d.ts +51 -0
- package/dist/src/benchmarks/gaia-agent-gemini.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent-gemini.js +352 -0
- package/dist/src/benchmarks/gaia-agent-gemini.js.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.d.ts +105 -0
- package/dist/src/benchmarks/gaia-claude-p.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.js +269 -0
- package/dist/src/benchmarks/gaia-claude-p.js.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.js +168 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent-runner.py +556 -0
- package/dist/src/benchmarks/gaia-codeagent.d.ts +129 -0
- package/dist/src/benchmarks/gaia-codeagent.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.js +590 -0
- package/dist/src/benchmarks/gaia-codeagent.js.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts +33 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.js +241 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-critic.js +24 -24
- package/dist/src/benchmarks/gaia-dag-pilot.d.ts +22 -0
- package/dist/src/benchmarks/gaia-dag-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag-pilot.js +158 -0
- package/dist/src/benchmarks/gaia-dag-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-dag.d.ts +110 -0
- package/dist/src/benchmarks/gaia-dag.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag.js +658 -0
- package/dist/src/benchmarks/gaia-dag.js.map +1 -0
- package/dist/src/benchmarks/gaia-dag.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-dag.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag.smoke.js +290 -0
- package/dist/src/benchmarks/gaia-dag.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts +17 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.js +106 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble.d.ts +103 -0
- package/dist/src/benchmarks/gaia-ensemble.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble.js +462 -0
- package/dist/src/benchmarks/gaia-ensemble.js.map +1 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.d.ts +17 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.js +168 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.d.ts +67 -0
- package/dist/src/benchmarks/gaia-mode-router.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.js +126 -0
- package/dist/src/benchmarks/gaia-mode-router.js.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts +15 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.js +131 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js +276 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.d.ts +45 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.js +222 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js +169 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts +27 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.js +226 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.d.ts +31 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.js +94 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts +13 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js +98 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts +52 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.js +304 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.d.ts +61 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.js +217 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts +26 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js +152 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.js +311 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts +25 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.js +304 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.js.map +1 -0
- package/dist/src/commands/completions.js +409 -409
- package/dist/src/commands/daemon.js +44 -44
- package/dist/src/commands/embeddings.js +26 -26
- package/dist/src/commands/hive-mind.js +97 -97
- package/dist/src/commands/hooks.js +9 -9
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +2351 -1
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance-capability.d.ts +30 -0
- package/dist/src/commands/performance-capability.d.ts.map +1 -0
- package/dist/src/commands/performance-capability.js +349 -0
- package/dist/src/commands/performance-capability.js.map +1 -0
- 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 +231 -231
- package/dist/src/init/executor.js +453 -453
- package/dist/src/init/helpers-generator.js +727 -727
- package/dist/src/init/statusline-generator.js +717 -717
- package/dist/src/mcp-tools/agent-execute-core.d.ts +23 -1
- package/dist/src/mcp-tools/agent-execute-core.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-execute-core.js +136 -9
- package/dist/src/mcp-tools/agent-execute-core.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +48 -4
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +15 -15
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +196 -0
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- 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/enhanced-model-router.d.ts +5 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.js +18 -1
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/model-prices.d.ts +50 -0
- package/dist/src/ruvector/model-prices.d.ts.map +1 -0
- package/dist/src/ruvector/model-prices.js +72 -0
- package/dist/src/ruvector/model-prices.js.map +1 -0
- package/dist/src/ruvector/model-router.d.ts +147 -8
- package/dist/src/ruvector/model-router.d.ts.map +1 -1
- package/dist/src/ruvector/model-router.js +418 -18
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/neural-router.d.ts +172 -39
- package/dist/src/ruvector/neural-router.d.ts.map +1 -1
- package/dist/src/ruvector/neural-router.js +780 -91
- package/dist/src/ruvector/neural-router.js.map +1 -1
- package/dist/src/ruvector/router-calibrator.d.ts +65 -0
- package/dist/src/ruvector/router-calibrator.d.ts.map +1 -0
- package/dist/src/ruvector/router-calibrator.js +120 -0
- package/dist/src/ruvector/router-calibrator.js.map +1 -0
- package/dist/src/ruvector/router-trajectory.d.ts +137 -45
- package/dist/src/ruvector/router-trajectory.d.ts.map +1 -1
- package/dist/src/ruvector/router-trajectory.js +226 -63
- package/dist/src/ruvector/router-trajectory.js.map +1 -1
- package/dist/src/ruvector/task-embedder.d.ts +56 -0
- package/dist/src/ruvector/task-embedder.d.ts.map +1 -0
- package/dist/src/ruvector/task-embedder.js +237 -0
- package/dist/src/ruvector/task-embedder.js.map +1 -0
- package/dist/src/services/headless-worker-executor.js +84 -84
- package/dist/src/transfer/deploy-seraphine.js +23 -23
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +136 -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 -324
- package/scripts/run-beir-hybrid.mjs +261 -261
- 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/ruvector/flash-attention.d.ts +0 -195
- package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
- package/dist/src/ruvector/flash-attention.js +0 -643
- package/dist/src/ruvector/flash-attention.js.map +0 -1
- package/dist/src/ruvector/moe-router.d.ts +0 -206
- package/dist/src/ruvector/moe-router.d.ts.map +0 -1
- package/dist/src/ruvector/moe-router.js +0 -626
- package/dist/src/ruvector/moe-router.js.map +0 -1
- package/dist/src/services/event-stream.d.ts +0 -25
- package/dist/src/services/event-stream.js +0 -27
- package/dist/src/services/loop-worker-runner.d.ts +0 -16
- package/dist/src/services/loop-worker-runner.js +0 -34
- package/dist/src/services/runtime-capabilities.d.ts +0 -22
- package/dist/src/services/runtime-capabilities.js +0 -45
|
@@ -22,17 +22,87 @@
|
|
|
22
22
|
*
|
|
23
23
|
* Note (#2329): An earlier design (ADR-026 + this file's previous header)
|
|
24
24
|
* described a Tiny-Dancer / FastGRNN neural router with embedding-based
|
|
25
|
-
* complexity scoring. That path was never wired in
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
25
|
+
* complexity scoring. That path was never wired in directly.
|
|
26
|
+
*
|
|
27
|
+
* Note (ADR-148, #2334): The cost-optimal neural router is now wired as an
|
|
28
|
+
* optional, gated addition via `./neural-router.ts` (which uses
|
|
29
|
+
* `@metaharness/router`, optionally accelerated by `@ruvector/tiny-dancer`).
|
|
30
|
+
* It is double-gated on `CLAUDE_FLOW_ROUTER_NEURAL=1` + an embedding being
|
|
31
|
+
* supplied + a corpus/artifact being loadable. When any gate is closed the
|
|
32
|
+
* shipped heuristic + bandit path runs unchanged and the result carries
|
|
33
|
+
* `routedBy: 'heuristic'` (default) or `'bandit-fallback'` (neural enabled
|
|
34
|
+
* but declined). When all gates are open and a backend resolves, the result
|
|
35
|
+
* carries `routedBy: 'metaharness-knn' | 'metaharness-krr' | 'fastgrnn'`.
|
|
31
36
|
*
|
|
32
37
|
* @module model-router
|
|
33
38
|
*/
|
|
34
39
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
35
40
|
import { dirname, join } from 'path';
|
|
41
|
+
// ----------------------------------------------------------------------------
|
|
42
|
+
// Lazy module loaders — initialised once per process. The dynamic-import calls
|
|
43
|
+
// keep these modules off the critical-path-cold-start, but we want subsequent
|
|
44
|
+
// route() calls to pay only a Map lookup, not a new Promise per call.
|
|
45
|
+
// ----------------------------------------------------------------------------
|
|
46
|
+
let _neuralRouterMod = null;
|
|
47
|
+
function loadNeuralRouter() {
|
|
48
|
+
if (_neuralRouterMod === null)
|
|
49
|
+
_neuralRouterMod = import('./neural-router.js');
|
|
50
|
+
return _neuralRouterMod;
|
|
51
|
+
}
|
|
52
|
+
let _trajectoryMod = null;
|
|
53
|
+
function loadTrajectoryRecorder() {
|
|
54
|
+
if (_trajectoryMod === null)
|
|
55
|
+
_trajectoryMod = import('./router-trajectory.js');
|
|
56
|
+
return _trajectoryMod;
|
|
57
|
+
}
|
|
58
|
+
let _altsCache = null;
|
|
59
|
+
let _altsProbeDone = false;
|
|
60
|
+
function loadOpenRouterAlts() {
|
|
61
|
+
if (_altsProbeDone)
|
|
62
|
+
return _altsCache;
|
|
63
|
+
_altsProbeDone = true;
|
|
64
|
+
try {
|
|
65
|
+
// Probe candidate paths: explicit env override, then asset locations
|
|
66
|
+
// relative to this file (src dev) and the dist build.
|
|
67
|
+
const explicit = process.env.CLAUDE_FLOW_ROUTER_OPENROUTER_ALTS;
|
|
68
|
+
const candidates = [];
|
|
69
|
+
if (explicit)
|
|
70
|
+
candidates.push(explicit);
|
|
71
|
+
// Probe asset dirs without using import.meta.url so this stays compatible
|
|
72
|
+
// with both CJS and ESM consumers of the compiled .js.
|
|
73
|
+
candidates.push(join(process.cwd(), 'v3', '@claude-flow', 'cli', 'assets', 'model-router', 'openrouter-alts.json'));
|
|
74
|
+
candidates.push(join(process.cwd(), 'assets', 'model-router', 'openrouter-alts.json'));
|
|
75
|
+
for (const p of candidates) {
|
|
76
|
+
if (existsSync(p)) {
|
|
77
|
+
_altsCache = JSON.parse(readFileSync(p, 'utf8'));
|
|
78
|
+
return _altsCache;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Silent — alts are optional.
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
/** Return the resolved provider + OpenRouter model for the picked tier. */
|
|
88
|
+
function resolveExecutionProvider(model) {
|
|
89
|
+
const explicit = process.env.CLAUDE_FLOW_ROUTER_PROVIDER?.toLowerCase();
|
|
90
|
+
// Default: anthropic unless explicitly set to openrouter, or OPENROUTER_API_KEY
|
|
91
|
+
// is the only credential present (matches agent-execute-core's selection).
|
|
92
|
+
const hasOpenRouter = !!process.env.OPENROUTER_API_KEY;
|
|
93
|
+
const hasAnthropic = !!process.env.ANTHROPIC_API_KEY;
|
|
94
|
+
const wantOR = explicit === 'openrouter' ||
|
|
95
|
+
(!hasAnthropic && hasOpenRouter && explicit !== 'anthropic');
|
|
96
|
+
if (!wantOR)
|
|
97
|
+
return { provider: 'anthropic' };
|
|
98
|
+
const alts = loadOpenRouterAlts();
|
|
99
|
+
if (!alts)
|
|
100
|
+
return { provider: 'openrouter' }; // OR provider but no alt slug
|
|
101
|
+
const entry = alts.tiers[model];
|
|
102
|
+
if (!entry?.openrouter_alt)
|
|
103
|
+
return { provider: 'openrouter' };
|
|
104
|
+
return { provider: 'openrouter', openrouterModel: entry.openrouter_alt };
|
|
105
|
+
}
|
|
36
106
|
/**
|
|
37
107
|
* Model capabilities and characteristics
|
|
38
108
|
*/
|
|
@@ -145,7 +215,7 @@ function sampleGamma(alpha) {
|
|
|
145
215
|
* X ~ Gamma(α), Y ~ Gamma(β). Returns the mean for degenerate α+β=0
|
|
146
216
|
* (shouldn't happen in practice but defensive).
|
|
147
217
|
*/
|
|
148
|
-
function sampleBeta(alpha, beta) {
|
|
218
|
+
export function sampleBeta(alpha, beta) {
|
|
149
219
|
if (alpha <= 0 || beta <= 0)
|
|
150
220
|
return 0.5;
|
|
151
221
|
const x = sampleGamma(alpha);
|
|
@@ -169,6 +239,11 @@ function defaultBanditPriors() {
|
|
|
169
239
|
function defaultBucketedPriors() {
|
|
170
240
|
return { low: defaultBanditPriors(), med: defaultBanditPriors(), high: defaultBanditPriors() };
|
|
171
241
|
}
|
|
242
|
+
/** ADR-149 — empty per-modelId shadow priors. Each bucket starts as `{}`; entries
|
|
243
|
+
* populate on first `recordOutcomeByModelId(task, modelId, outcome)` call. */
|
|
244
|
+
function defaultBucketedPriorsById() {
|
|
245
|
+
return { low: {}, med: {}, high: {} };
|
|
246
|
+
}
|
|
172
247
|
function clonePriors(p) {
|
|
173
248
|
return { haiku: { ...p.haiku }, sonnet: { ...p.sonnet }, opus: { ...p.opus }, inherit: { ...p.inherit } };
|
|
174
249
|
}
|
|
@@ -243,24 +318,191 @@ export class ModelRouter {
|
|
|
243
318
|
opus: 0,
|
|
244
319
|
inherit: 0,
|
|
245
320
|
};
|
|
321
|
+
/**
|
|
322
|
+
* ADR-148 — in-memory counters surfaced via `getStats()` and read by the
|
|
323
|
+
* `hooks_intelligence_stats` MCP tool. Process-local, not persisted (these
|
|
324
|
+
* are operational metrics, not authoritative state — see ADR-074/086).
|
|
325
|
+
*/
|
|
326
|
+
routedByCounts = {
|
|
327
|
+
heuristic: 0,
|
|
328
|
+
'bandit-fallback': 0,
|
|
329
|
+
hybrid: 0,
|
|
330
|
+
};
|
|
331
|
+
neuralBackendCounts = {
|
|
332
|
+
'metaharness-knn': 0,
|
|
333
|
+
'metaharness-krr': 0,
|
|
334
|
+
fastgrnn: 0,
|
|
335
|
+
};
|
|
336
|
+
abDisagreements = 0;
|
|
337
|
+
abComparisons = 0;
|
|
246
338
|
constructor(config = {}) {
|
|
247
339
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
248
340
|
this.state = this.loadState();
|
|
249
341
|
}
|
|
250
342
|
/**
|
|
251
|
-
* Route a task to the optimal model
|
|
343
|
+
* Route a task to the optimal model.
|
|
344
|
+
*
|
|
345
|
+
* When `embedding` is supplied and `CLAUDE_FLOW_ROUTER_NEURAL=1` is set,
|
|
346
|
+
* the cost-optimal neural backend (ADR-148) is consulted first; its
|
|
347
|
+
* decision is used when its `metBar` clears the configured quality bar
|
|
348
|
+
* and `routedBy` reflects which backend produced the decision. Otherwise
|
|
349
|
+
* the shipped heuristic + Thompson bandit path runs (byte-identical to
|
|
350
|
+
* the pre-ADR-148 behavior) and the result carries `routedBy:
|
|
351
|
+
* 'bandit-fallback'` (neural was enabled but declined) or
|
|
352
|
+
* `'heuristic'` (neural was disabled).
|
|
252
353
|
*/
|
|
253
354
|
async route(task, embedding) {
|
|
254
355
|
const startTime = performance.now();
|
|
255
356
|
// Analyze task complexity
|
|
256
357
|
const complexity = this.analyzeComplexity(task, embedding);
|
|
257
|
-
//
|
|
358
|
+
// ADR-148 — optional neural cost-optimal path (gated, opt-in).
|
|
359
|
+
//
|
|
360
|
+
// Hybrid math: we use the neural's per-candidate predicted quality as a
|
|
361
|
+
// weighted prior on the bandit's Beta(α,β) posterior, rather than
|
|
362
|
+
// overriding the bandit's pick. With weight=w (env-tunable, default 5)
|
|
363
|
+
// each candidate's Beta becomes Beta(α + q*w, β + (1-q)*w). Cold start
|
|
364
|
+
// → neural dominates (α+β ≈ 2 + w); many real outcomes → bandit
|
|
365
|
+
// dominates (α+β >> w). The persistent bandit state is unchanged.
|
|
366
|
+
//
|
|
367
|
+
// `bandit-fallback` is reserved for the case where neural was enabled
|
|
368
|
+
// but the backend returned no decision at all (artifact load failed,
|
|
369
|
+
// dim mismatch, etc.). In that case we route via pure bandit.
|
|
370
|
+
let neuralPrior = null;
|
|
371
|
+
let neuralBackend = undefined;
|
|
372
|
+
let neuralModelId = undefined;
|
|
373
|
+
let neuralDeclined = false;
|
|
374
|
+
// iter 46 — capture iter 45's ensemble-disagreement diagnostic so we can
|
|
375
|
+
// persist it to the trajectory below; downstream tuners (future) can
|
|
376
|
+
// analyze the distribution to recommend an iter 44 threshold.
|
|
377
|
+
let neuralEnsembleDisagreement = undefined;
|
|
378
|
+
if (embedding && embedding.length > 0 && process.env.CLAUDE_FLOW_ROUTER_NEURAL === '1') {
|
|
379
|
+
try {
|
|
380
|
+
const { tryCostOptimalRoute } = await loadNeuralRouter();
|
|
381
|
+
// ADR-149 iter 15 — pass the task's complexity bucket through so
|
|
382
|
+
// the neural-router's per-modelId Thompson (when gated on) can
|
|
383
|
+
// use the bucket-specific prior instead of marginalising.
|
|
384
|
+
const nr = await tryCostOptimalRoute(embedding, { complexityBucket: complexityBucket(complexity.score) });
|
|
385
|
+
if (nr) {
|
|
386
|
+
// ADR-149: capture the concrete picked model id (the cost-optimal
|
|
387
|
+
// pick across all candidates, not just within a tier).
|
|
388
|
+
neuralModelId = nr.modelId;
|
|
389
|
+
neuralEnsembleDisagreement = nr.ensembleDisagreement;
|
|
390
|
+
// Build per-tier quality map for the bandit prior. The neural
|
|
391
|
+
// backend returns per-model alternatives (e.g. 7 distinct slugs);
|
|
392
|
+
// for the Beta-prior bump we collapse to tier by taking the MAX
|
|
393
|
+
// predicted quality within each tier — the tier whose best
|
|
394
|
+
// candidate is best overall is the tier the bandit should favor.
|
|
395
|
+
// Then we apply rank-based scaling [1.0, 0.5, 0.2] across the
|
|
396
|
+
// three tiers so the Beta bumps are well-separated (raw KRR
|
|
397
|
+
// outputs are typically in a narrow band — see ADR-148 phase 1).
|
|
398
|
+
const sorted = [...nr.alternatives].sort((a, b) => b.predictedQuality - a.predictedQuality);
|
|
399
|
+
if (!sorted.find(s => s.model === nr.model)) {
|
|
400
|
+
sorted.unshift({ model: nr.model, modelId: nr.modelId, predictedQuality: nr.predictedQuality, costPerMTok: 0 });
|
|
401
|
+
}
|
|
402
|
+
// Collapse per-model alternatives → per-tier MAX quality, preserving
|
|
403
|
+
// first-occurrence order (which is best-quality first thanks to the sort).
|
|
404
|
+
const tierMaxQ = {};
|
|
405
|
+
const tierOrder = [];
|
|
406
|
+
for (const a of sorted) {
|
|
407
|
+
if (tierMaxQ[a.model] === undefined) {
|
|
408
|
+
tierMaxQ[a.model] = a.predictedQuality;
|
|
409
|
+
tierOrder.push(a.model);
|
|
410
|
+
}
|
|
411
|
+
else if (a.predictedQuality > (tierMaxQ[a.model] ?? 0)) {
|
|
412
|
+
tierMaxQ[a.model] = a.predictedQuality;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
const rankQ = [1.0, 0.5, 0.2];
|
|
416
|
+
const qualities = {};
|
|
417
|
+
for (let i = 0; i < tierOrder.length && i < rankQ.length; i++) {
|
|
418
|
+
qualities[tierOrder[i]] = rankQ[i];
|
|
419
|
+
}
|
|
420
|
+
const weight = parseFloat(process.env.CLAUDE_FLOW_ROUTER_NEURAL_WEIGHT ?? '5') || 5;
|
|
421
|
+
neuralPrior = { qualities, weight };
|
|
422
|
+
neuralBackend = nr.routedBy;
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
neuralDeclined = true;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// Silent — neural path is best-effort.
|
|
430
|
+
}
|
|
431
|
+
}
|
|
258
432
|
const scores = this.computeModelScores(complexity);
|
|
259
|
-
// Apply circuit breaker adjustments
|
|
260
433
|
const adjustedScores = this.applyCircuitBreaker(scores);
|
|
261
|
-
//
|
|
262
|
-
|
|
434
|
+
// A/B mode: compute the pure-bandit pick alongside the hybrid pick so
|
|
435
|
+
// we can log disagreement. Both samples are drawn from the same Beta
|
|
436
|
+
// posteriors but with/without the neural prior bump — useful for
|
|
437
|
+
// measuring real lift before flipping defaults.
|
|
438
|
+
//
|
|
439
|
+
// iter 37 — TWO knobs:
|
|
440
|
+
// CLAUDE_FLOW_ROUTER_AB=1 → A/B on every call (orig)
|
|
441
|
+
// CLAUDE_FLOW_ROUTER_AB_SAMPLE_RATE=<0..1> → A/B on a sampled subset,
|
|
442
|
+
// keyed deterministically by task_hash so the same task always falls
|
|
443
|
+
// in or out of the sample. Lets production accumulate ab_pair data
|
|
444
|
+
// passively at low overhead (e.g. 0.05 = 5% of decisions).
|
|
445
|
+
// Both set → SAMPLE_RATE wins (more specific).
|
|
446
|
+
const rateRaw = process.env.CLAUDE_FLOW_ROUTER_AB_SAMPLE_RATE;
|
|
447
|
+
const rate = rateRaw ? Math.max(0, Math.min(1, parseFloat(rateRaw) || 0)) : 0;
|
|
448
|
+
const allOn = process.env.CLAUDE_FLOW_ROUTER_AB === '1';
|
|
449
|
+
let inSample = false;
|
|
450
|
+
if (rate > 0) {
|
|
451
|
+
// Deterministic sample by FNV-1a-32 of the task text. Same task always
|
|
452
|
+
// gets the same A/B decision across re-runs (reproducible tests, stable
|
|
453
|
+
// population over time). Inlined to avoid the async router-trajectory
|
|
454
|
+
// import on the hot path.
|
|
455
|
+
let h = 0x811c9dc5 >>> 0;
|
|
456
|
+
for (let i = 0; i < task.length; i++) {
|
|
457
|
+
h ^= task.charCodeAt(i);
|
|
458
|
+
h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;
|
|
459
|
+
}
|
|
460
|
+
inSample = (h % 10000) / 10000 < rate;
|
|
461
|
+
}
|
|
462
|
+
const abEnabled = (rate > 0 ? inSample : allOn) && neuralPrior !== null;
|
|
463
|
+
let abPair;
|
|
464
|
+
if (abEnabled) {
|
|
465
|
+
// Pre-compute the bandit-only pick. Single extra Thompson sample per
|
|
466
|
+
// call — independent draws are noisy but cheap (~3 Beta samples ≈
|
|
467
|
+
// <10 μs). For a per-call disagreement signal one draw is fine; over
|
|
468
|
+
// N decisions the rate stabilises.
|
|
469
|
+
const banditOnly = this.selectModel(adjustedScores, complexity.score, undefined);
|
|
470
|
+
const picked = this.selectModel(adjustedScores, complexity.score, neuralPrior ?? undefined);
|
|
471
|
+
abPair = {
|
|
472
|
+
bandit_pick: banditOnly.model,
|
|
473
|
+
hybrid_pick: picked.model,
|
|
474
|
+
disagree: banditOnly.model !== picked.model,
|
|
475
|
+
};
|
|
476
|
+
this.abComparisons++;
|
|
477
|
+
if (abPair.disagree)
|
|
478
|
+
this.abDisagreements++;
|
|
479
|
+
var pickedForResult = picked; // eslint-disable-line no-var
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
var pickedForResult = this.selectModel(adjustedScores, complexity.score, neuralPrior ?? undefined); // eslint-disable-line no-var
|
|
483
|
+
}
|
|
484
|
+
const model = pickedForResult.model;
|
|
485
|
+
const confidence = pickedForResult.confidence;
|
|
486
|
+
const uncertainty = pickedForResult.uncertainty;
|
|
487
|
+
const routedBy = neuralPrior
|
|
488
|
+
? 'hybrid'
|
|
489
|
+
: neuralDeclined ? 'bandit-fallback' : 'heuristic';
|
|
263
490
|
const inferenceTimeUs = (performance.now() - startTime) * 1000;
|
|
491
|
+
// ADR-148 phase 2 — resolve OpenRouter alt for the picked tier when the
|
|
492
|
+
// execution provider is OpenRouter. Free of side effects on the bandit;
|
|
493
|
+
// purely advisory metadata for downstream agent-execute-core.
|
|
494
|
+
//
|
|
495
|
+
// ADR-149 — when the neural backend returned a concrete `modelId` that
|
|
496
|
+
// is NOT an Anthropic slug, we override the provider to 'openrouter'
|
|
497
|
+
// and use the modelId as the openrouterModel. Otherwise consumers
|
|
498
|
+
// dispatching on `model` would call the Anthropic SDK for a model id
|
|
499
|
+
// the SDK can't reach (e.g. 'inclusionai/ling-2.6-flash'), losing the
|
|
500
|
+
// cost-optimal pick. When the neural picked an Anthropic id we keep
|
|
501
|
+
// the standard provider resolution since the Anthropic SDK can serve it.
|
|
502
|
+
let exec = resolveExecutionProvider(model);
|
|
503
|
+
if (neuralModelId && !neuralModelId.startsWith('anthropic/')) {
|
|
504
|
+
exec = { provider: 'openrouter', openrouterModel: neuralModelId };
|
|
505
|
+
}
|
|
264
506
|
// Build result
|
|
265
507
|
const result = {
|
|
266
508
|
model,
|
|
@@ -274,9 +516,35 @@ export class ModelRouter {
|
|
|
274
516
|
.sort((a, b) => b.score - a.score),
|
|
275
517
|
inferenceTimeUs,
|
|
276
518
|
costMultiplier: MODEL_CAPABILITIES[model].costMultiplier,
|
|
519
|
+
routedBy,
|
|
520
|
+
...(neuralBackend ? { neuralBackend } : {}),
|
|
521
|
+
provider: exec.provider,
|
|
522
|
+
...(exec.openrouterModel ? { openrouterModel: exec.openrouterModel } : {}),
|
|
523
|
+
// ADR-149: surface the concrete neural pick when present. Prefer the
|
|
524
|
+
// explicit OpenRouter alt (resolveExecutionProvider) for execution,
|
|
525
|
+
// but expose the model id the neural backend chose so observers and
|
|
526
|
+
// consumers can see the cost-optimal decision.
|
|
527
|
+
...(neuralModelId ? { modelId: neuralModelId } : {}),
|
|
277
528
|
};
|
|
278
|
-
// Track decision
|
|
529
|
+
// Track decision (in-memory bandit state)
|
|
279
530
|
this.trackDecision(task, result);
|
|
531
|
+
// ADR-148 — opt-in DRACO-shaped trajectory collection
|
|
532
|
+
if (process.env.CLAUDE_FLOW_ROUTER_TRAJECTORY === '1') {
|
|
533
|
+
try {
|
|
534
|
+
const { recordDecision } = await loadTrajectoryRecorder();
|
|
535
|
+
recordDecision({
|
|
536
|
+
task, embedding, complexity: complexity.score,
|
|
537
|
+
model, confidence, uncertainty, routedBy,
|
|
538
|
+
neuralBackend, abPair,
|
|
539
|
+
provider: exec.provider,
|
|
540
|
+
openrouterModel: exec.openrouterModel,
|
|
541
|
+
ensembleDisagreement: neuralEnsembleDisagreement,
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
// Silent — trajectory recording must never break routing.
|
|
546
|
+
}
|
|
547
|
+
}
|
|
280
548
|
return result;
|
|
281
549
|
}
|
|
282
550
|
/**
|
|
@@ -418,15 +686,36 @@ export class ModelRouter {
|
|
|
418
686
|
* threshold tuning. Beta(1,1) = uniform on cold start so behavior matches
|
|
419
687
|
* the prior deterministic router until outcomes accumulate.
|
|
420
688
|
*/
|
|
421
|
-
selectModel(scores, complexityScore
|
|
689
|
+
selectModel(scores, complexityScore,
|
|
690
|
+
/**
|
|
691
|
+
* Optional neural prior (ADR-148 hybrid math). When supplied, each
|
|
692
|
+
* candidate's Beta(α, β) prior is perturbed by `weight` pseudo-counts of
|
|
693
|
+
* the neural's predicted quality before sampling. Cold start → neural
|
|
694
|
+
* dominates; many real outcomes → bandit dominates. The persistent
|
|
695
|
+
* bandit state is NOT modified — this is a per-call posterior bump only.
|
|
696
|
+
*/
|
|
697
|
+
neuralPrior) {
|
|
422
698
|
// Thompson sampling: combine deterministic score with bandit posterior,
|
|
423
699
|
// keyed by complexity bucket (ADR-142) so learning is task-type-local.
|
|
424
700
|
const bucketed = this.state.priors ?? defaultBucketedPriors();
|
|
425
701
|
const priors = bucketed[complexityBucket(complexityScore)] ?? defaultBanditPriors();
|
|
702
|
+
// Apply the optional neural prior: Beta(α + q*w, β + (1-q)*w). Per-call,
|
|
703
|
+
// does not persist. Clamp `q` into [0, 1] so a bogus backend reading
|
|
704
|
+
// cannot push the prior into invalid territory.
|
|
705
|
+
const bump = (a, b, q, w) => {
|
|
706
|
+
if (q === undefined || w <= 0)
|
|
707
|
+
return { alpha: a, beta: b };
|
|
708
|
+
const clamped = Math.min(1, Math.max(0, q));
|
|
709
|
+
return { alpha: a + clamped * w, beta: b + (1 - clamped) * w };
|
|
710
|
+
};
|
|
711
|
+
const w = neuralPrior?.weight ?? 0;
|
|
712
|
+
const ph = bump(priors.haiku.alpha, priors.haiku.beta, neuralPrior?.qualities.haiku, w);
|
|
713
|
+
const ps = bump(priors.sonnet.alpha, priors.sonnet.beta, neuralPrior?.qualities.sonnet, w);
|
|
714
|
+
const po = bump(priors.opus.alpha, priors.opus.beta, neuralPrior?.qualities.opus, w);
|
|
426
715
|
const sampledScores = {
|
|
427
|
-
haiku: scores.haiku * sampleBeta(
|
|
428
|
-
sonnet: scores.sonnet * sampleBeta(
|
|
429
|
-
opus: scores.opus * sampleBeta(
|
|
716
|
+
haiku: scores.haiku * sampleBeta(ph.alpha, ph.beta),
|
|
717
|
+
sonnet: scores.sonnet * sampleBeta(ps.alpha, ps.beta),
|
|
718
|
+
opus: scores.opus * sampleBeta(po.alpha, po.beta),
|
|
430
719
|
inherit: scores.inherit, // not bandit-controlled
|
|
431
720
|
};
|
|
432
721
|
// Get sorted models by sampled score (drops 'inherit' from selection)
|
|
@@ -469,7 +758,28 @@ export class ModelRouter {
|
|
|
469
758
|
// while honoring any non-trivial learning.
|
|
470
759
|
const selectedSamples = priors[bestModel].alpha + priors[bestModel].beta;
|
|
471
760
|
const selectedTrusted = selectedSamples >= 5 && selectedMean >= 0.45;
|
|
472
|
-
|
|
761
|
+
// ADR-148 — additional trust path: when the neural prior agrees with
|
|
762
|
+
// the bandit's pick (i.e. neuralPrior.qualities[bestModel] is the
|
|
763
|
+
// highest), the neural backend's signal is treated as a vote of
|
|
764
|
+
// confidence that lets us skip escalation. Without this, cold-start
|
|
765
|
+
// installations stay stuck in the structurally-high-uncertainty
|
|
766
|
+
// regime (#2250) and the neural's clear preference never reaches
|
|
767
|
+
// the final pick. The neural prior's top is computed as the max
|
|
768
|
+
// quality over the supplied candidates.
|
|
769
|
+
let neuralEndorsesPick = false;
|
|
770
|
+
if (neuralPrior) {
|
|
771
|
+
let bestNeuralQ = -1;
|
|
772
|
+
let neuralTop = null;
|
|
773
|
+
for (const [m, q] of Object.entries(neuralPrior.qualities)) {
|
|
774
|
+
if (q > bestNeuralQ) {
|
|
775
|
+
bestNeuralQ = q;
|
|
776
|
+
neuralTop = m;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
if (neuralTop === bestModel)
|
|
780
|
+
neuralEndorsesPick = true;
|
|
781
|
+
}
|
|
782
|
+
if (!targetWorse && !selectedTrusted && !neuralEndorsesPick) {
|
|
473
783
|
model = escalateTo;
|
|
474
784
|
}
|
|
475
785
|
}
|
|
@@ -499,6 +809,10 @@ export class ModelRouter {
|
|
|
499
809
|
this.state.totalDecisions++;
|
|
500
810
|
this.state.modelDistribution[result.model] =
|
|
501
811
|
(this.state.modelDistribution[result.model] || 0) + 1;
|
|
812
|
+
// ADR-148 — operational counters for hooks_intelligence_stats.
|
|
813
|
+
this.routedByCounts[result.routedBy]++;
|
|
814
|
+
if (result.neuralBackend)
|
|
815
|
+
this.neuralBackendCounts[result.neuralBackend]++;
|
|
502
816
|
// Update running averages
|
|
503
817
|
const n = this.state.totalDecisions;
|
|
504
818
|
this.state.avgComplexity =
|
|
@@ -552,6 +866,52 @@ export class ModelRouter {
|
|
|
552
866
|
bp[model].beta += 1 - reward;
|
|
553
867
|
this.saveState();
|
|
554
868
|
}
|
|
869
|
+
/**
|
|
870
|
+
* ADR-149 — record an outcome keyed by the CONCRETE model id (e.g.
|
|
871
|
+
* 'inclusionai/ling-2.6-flash') rather than the tier label. Updates the
|
|
872
|
+
* shadow `priorsById` state without affecting `priors` (tier priors).
|
|
873
|
+
*
|
|
874
|
+
* This is the per-model learning signal the bandit needs to eventually
|
|
875
|
+
* distinguish GPT-4.1 from Sonnet within the 'sonnet' tier. Selection
|
|
876
|
+
* currently still uses tier priors; this state accumulates so a future
|
|
877
|
+
* refactor can switch the selector over once there's enough data.
|
|
878
|
+
*
|
|
879
|
+
* Cost-adjusted reward semantics: cheap models get the highest reward on
|
|
880
|
+
* success (their successes are most cost-efficient). We map modelId to
|
|
881
|
+
* its closest tier for the reward table — the routing math doesn't have
|
|
882
|
+
* a per-modelId reward configuration yet.
|
|
883
|
+
*/
|
|
884
|
+
recordOutcomeByModelId(task, modelId, outcome) {
|
|
885
|
+
if (!modelId || typeof modelId !== 'string')
|
|
886
|
+
return;
|
|
887
|
+
const taskScore = this.analyzeComplexity(task).score;
|
|
888
|
+
const bucket = complexityBucket(taskScore);
|
|
889
|
+
if (!this.state.priorsById)
|
|
890
|
+
this.state.priorsById = defaultBucketedPriorsById();
|
|
891
|
+
let perBucket = this.state.priorsById[bucket];
|
|
892
|
+
if (!perBucket) {
|
|
893
|
+
perBucket = {};
|
|
894
|
+
this.state.priorsById[bucket] = perBucket;
|
|
895
|
+
}
|
|
896
|
+
if (!perBucket[modelId])
|
|
897
|
+
perBucket[modelId] = { alpha: 1, beta: 1 };
|
|
898
|
+
// Reward proxy: derive a tier-equivalent for cost weighting. Substring
|
|
899
|
+
// match keeps it cheap and accurate for the candidates in the registry.
|
|
900
|
+
const id = modelId.toLowerCase();
|
|
901
|
+
const tierProxy = id.includes('haiku') || id.includes('ling-') || id.includes('flash-lite')
|
|
902
|
+
|| id.includes('nemotron-nano') || id.includes('ministral')
|
|
903
|
+
|| id.includes('llama-3.2-3b') || id.includes('llama-3.1-8b')
|
|
904
|
+
? 'haiku'
|
|
905
|
+
: id.includes('opus') ? 'opus' : 'sonnet';
|
|
906
|
+
const reward = BANDIT_REWARDS[tierProxy]?.[outcome] ?? 0.5;
|
|
907
|
+
perBucket[modelId].alpha += reward;
|
|
908
|
+
perBucket[modelId].beta += 1 - reward;
|
|
909
|
+
// Bump the schema version on first per-modelId write so downstream
|
|
910
|
+
// tooling can see v3 was reached (the version field stays at 3 once set).
|
|
911
|
+
if ((this.state.version ?? 0) < 3)
|
|
912
|
+
this.state.version = 3;
|
|
913
|
+
this.saveState();
|
|
914
|
+
}
|
|
555
915
|
/**
|
|
556
916
|
* Get router statistics
|
|
557
917
|
*/
|
|
@@ -563,6 +923,15 @@ export class ModelRouter {
|
|
|
563
923
|
avgConfidence: this.state.avgConfidence,
|
|
564
924
|
circuitBreakerTrips: this.state.circuitBreakerTrips,
|
|
565
925
|
consecutiveFailures: { ...this.consecutiveFailures },
|
|
926
|
+
routedByCounts: { ...this.routedByCounts },
|
|
927
|
+
neuralBackendCounts: { ...this.neuralBackendCounts },
|
|
928
|
+
ab: {
|
|
929
|
+
comparisons: this.abComparisons,
|
|
930
|
+
disagreements: this.abDisagreements,
|
|
931
|
+
disagreementRate: this.abComparisons > 0 ? this.abDisagreements / this.abComparisons : 0,
|
|
932
|
+
},
|
|
933
|
+
stateVersion: this.state.version ?? 2,
|
|
934
|
+
...(this.state.priorsById ? { priorsById: this.state.priorsById } : {}),
|
|
566
935
|
};
|
|
567
936
|
}
|
|
568
937
|
/**
|
|
@@ -722,4 +1091,35 @@ export function recordModelOutcome(task, model, outcome) {
|
|
|
722
1091
|
const router = getModelRouter();
|
|
723
1092
|
router.recordOutcome(task, model, outcome);
|
|
724
1093
|
}
|
|
1094
|
+
/**
|
|
1095
|
+
* ADR-149 — record an outcome keyed by the concrete model id rather than
|
|
1096
|
+
* the tier label. Updates the shadow `priorsById` state. Selection logic
|
|
1097
|
+
* still uses tier priors; this data accumulates for a future per-modelId
|
|
1098
|
+
* selector refactor.
|
|
1099
|
+
*
|
|
1100
|
+
* Safe to call alongside `recordModelOutcome` — they update independent
|
|
1101
|
+
* state slices so double-counting is impossible.
|
|
1102
|
+
*/
|
|
1103
|
+
export function recordModelOutcomeByModelId(task, modelId, outcome) {
|
|
1104
|
+
const router = getModelRouter();
|
|
1105
|
+
router.recordOutcomeByModelId(task, modelId, outcome);
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* ADR-149 iter 14 — read-only access to the per-modelId Beta priors. The
|
|
1109
|
+
* neural-router consumes this to apply per-model Thompson sampling on top
|
|
1110
|
+
* of its predicted-quality vector when CLAUDE_FLOW_ROUTER_BANDIT_PER_MODEL=1.
|
|
1111
|
+
* Returns the legacy bucketed priors (`priorsById[bucket][modelId]`) when
|
|
1112
|
+
* present, else null.
|
|
1113
|
+
*/
|
|
1114
|
+
export function getModelRouterPriorsById() {
|
|
1115
|
+
const router = getModelRouter();
|
|
1116
|
+
const stats = router.getStats();
|
|
1117
|
+
return stats.priorsById ?? null;
|
|
1118
|
+
}
|
|
1119
|
+
/**
|
|
1120
|
+
* Re-export the complexity-bucket helper so the neural-router (which gets
|
|
1121
|
+
* the task text via the route() call) can map a complexity score to the
|
|
1122
|
+
* matching bandit bucket.
|
|
1123
|
+
*/
|
|
1124
|
+
export { complexityBucket };
|
|
725
1125
|
//# sourceMappingURL=model-router.js.map
|