@claude-flow/cli 3.32.3 → 3.32.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (683) hide show
  1. package/.claude/helpers/helpers.manifest.json +2 -2
  2. package/catalog-manifest.json +2 -2
  3. package/dist/src/agenticow/speculative-exploration.d.ts +148 -0
  4. package/dist/src/agenticow/speculative-exploration.js +218 -0
  5. package/dist/src/appliance/gguf-engine.d.ts +91 -0
  6. package/dist/src/appliance/gguf-engine.js +425 -0
  7. package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
  8. package/dist/src/appliance/ruvllm-bridge.js +292 -0
  9. package/dist/src/appliance/rvfa-builder.d.ts +44 -0
  10. package/dist/src/appliance/rvfa-builder.js +329 -0
  11. package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
  12. package/dist/src/appliance/rvfa-distribution.js +370 -0
  13. package/dist/src/appliance/rvfa-format.d.ts +111 -0
  14. package/dist/src/appliance/rvfa-format.js +393 -0
  15. package/dist/src/appliance/rvfa-runner.d.ts +69 -0
  16. package/dist/src/appliance/rvfa-runner.js +237 -0
  17. package/dist/src/appliance/rvfa-signing.d.ts +123 -0
  18. package/dist/src/appliance/rvfa-signing.js +347 -0
  19. package/dist/src/auth/client.d.ts +89 -0
  20. package/dist/src/auth/client.js +242 -0
  21. package/dist/src/auth/constants.d.ts +7 -0
  22. package/dist/src/auth/constants.js +7 -0
  23. package/dist/src/auth/scopes.d.ts +14 -0
  24. package/dist/src/auth/scopes.js +21 -0
  25. package/dist/src/auth/security-bridge.d.ts +36 -0
  26. package/dist/src/auth/security-bridge.js +42 -0
  27. package/dist/src/auth/session.d.ts +20 -0
  28. package/dist/src/auth/session.js +32 -0
  29. package/dist/src/auth/state.d.ts +19 -0
  30. package/dist/src/auth/state.js +53 -0
  31. package/dist/src/auth/types.d.ts +27 -0
  32. package/dist/src/auth/types.js +11 -0
  33. package/dist/src/autopilot-state.d.ts +77 -0
  34. package/dist/src/autopilot-state.js +271 -0
  35. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
  36. package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
  37. package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
  38. package/dist/src/benchmarks/gaia-agent.js +651 -0
  39. package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
  40. package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
  41. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
  42. package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
  43. package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
  44. package/dist/src/benchmarks/gaia-convergence.js +260 -0
  45. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
  46. package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
  47. package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
  48. package/dist/src/benchmarks/gaia-critic.js +312 -0
  49. package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
  50. package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
  51. package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
  52. package/dist/src/benchmarks/gaia-decomposer.js +350 -0
  53. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
  54. package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
  55. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
  56. package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
  57. package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
  58. package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
  59. package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
  60. package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
  61. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
  62. package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
  63. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
  64. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
  65. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
  66. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
  67. package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
  68. package/dist/src/benchmarks/gaia-judge.js +437 -0
  69. package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
  70. package/dist/src/benchmarks/gaia-loader.js +326 -0
  71. package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
  72. package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
  73. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
  74. package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
  75. package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
  76. package/dist/src/benchmarks/gaia-tools/index.js +36 -0
  77. package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
  78. package/dist/src/benchmarks/gaia-tools/types.js +12 -0
  79. package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
  80. package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
  81. package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
  82. package/dist/src/benchmarks/gaia-voting.js +297 -0
  83. package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
  84. package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
  85. package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
  86. package/dist/src/benchmarks/pretrain/index.js +404 -0
  87. package/dist/src/business-pods/bbs-budget-tracker.d.ts +139 -0
  88. package/dist/src/business-pods/bbs-budget-tracker.js +358 -0
  89. package/dist/src/business-pods/domain-affinity-policy.d.ts +47 -0
  90. package/dist/src/business-pods/domain-affinity-policy.js +65 -0
  91. package/dist/src/business-pods/pod-schema.d.ts +96 -0
  92. package/dist/src/business-pods/pod-schema.js +225 -0
  93. package/dist/src/commands/advisor.d.ts +15 -0
  94. package/dist/src/commands/advisor.js +94 -0
  95. package/dist/src/commands/agent-wasm.d.ts +14 -0
  96. package/dist/src/commands/agent-wasm.js +333 -0
  97. package/dist/src/commands/agent.d.ts +8 -0
  98. package/dist/src/commands/agent.js +927 -0
  99. package/dist/src/commands/analyze.d.ts +19 -0
  100. package/dist/src/commands/analyze.js +2047 -0
  101. package/dist/src/commands/announcements.d.ts +17 -0
  102. package/dist/src/commands/announcements.js +0 -0
  103. package/dist/src/commands/appliance-advanced.d.ts +9 -0
  104. package/dist/src/commands/appliance-advanced.js +215 -0
  105. package/dist/src/commands/appliance.d.ts +8 -0
  106. package/dist/src/commands/appliance.js +404 -0
  107. package/dist/src/commands/auth.d.ts +15 -0
  108. package/dist/src/commands/auth.js +244 -0
  109. package/dist/src/commands/autopilot.d.ts +15 -0
  110. package/dist/src/commands/autopilot.js +407 -0
  111. package/dist/src/commands/benchmark.d.ts +10 -0
  112. package/dist/src/commands/benchmark.js +460 -0
  113. package/dist/src/commands/claims.d.ts +10 -0
  114. package/dist/src/commands/claims.js +620 -0
  115. package/dist/src/commands/cleanup.d.ts +13 -0
  116. package/dist/src/commands/cleanup.js +250 -0
  117. package/dist/src/commands/completions.d.ts +10 -0
  118. package/dist/src/commands/completions.js +539 -0
  119. package/dist/src/commands/config.d.ts +8 -0
  120. package/dist/src/commands/config.js +428 -0
  121. package/dist/src/commands/daemon.d.ts +59 -0
  122. package/dist/src/commands/daemon.js +1733 -0
  123. package/dist/src/commands/deployment.d.ts +10 -0
  124. package/dist/src/commands/deployment.js +672 -0
  125. package/dist/src/commands/doctor.d.ts +10 -0
  126. package/dist/src/commands/doctor.js +1902 -0
  127. package/dist/src/commands/eject.d.ts +33 -0
  128. package/dist/src/commands/eject.js +195 -0
  129. package/dist/src/commands/embeddings.d.ts +18 -0
  130. package/dist/src/commands/embeddings.js +1623 -0
  131. package/dist/src/commands/funnel.d.ts +18 -0
  132. package/dist/src/commands/funnel.js +302 -0
  133. package/dist/src/commands/gaia-bench.d.ts +40 -0
  134. package/dist/src/commands/gaia-bench.js +597 -0
  135. package/dist/src/commands/guidance.d.ts +8 -0
  136. package/dist/src/commands/guidance.js +556 -0
  137. package/dist/src/commands/hive-mind.d.ts +11 -0
  138. package/dist/src/commands/hive-mind.js +1319 -0
  139. package/dist/src/commands/hooks.d.ts +8 -0
  140. package/dist/src/commands/hooks.js +4606 -0
  141. package/dist/src/commands/index.d.ts +118 -0
  142. package/dist/src/commands/index.js +366 -0
  143. package/dist/src/commands/init.d.ts +13 -0
  144. package/dist/src/commands/init.js +1297 -0
  145. package/dist/src/commands/issues.d.ts +21 -0
  146. package/dist/src/commands/issues.js +567 -0
  147. package/dist/src/commands/mcp.d.ts +11 -0
  148. package/dist/src/commands/mcp.js +732 -0
  149. package/dist/src/commands/memory-backup.d.ts +11 -0
  150. package/dist/src/commands/memory-backup.js +46 -0
  151. package/dist/src/commands/memory-distill.d.ts +27 -0
  152. package/dist/src/commands/memory-distill.js +374 -0
  153. package/dist/src/commands/memory.d.ts +8 -0
  154. package/dist/src/commands/memory.js +1596 -0
  155. package/dist/src/commands/metaharness.d.ts +39 -0
  156. package/dist/src/commands/metaharness.js +215 -0
  157. package/dist/src/commands/migrate.d.ts +8 -0
  158. package/dist/src/commands/migrate.js +742 -0
  159. package/dist/src/commands/neural.d.ts +10 -0
  160. package/dist/src/commands/neural.js +4331 -0
  161. package/dist/src/commands/performance.d.ts +10 -0
  162. package/dist/src/commands/performance.js +583 -0
  163. package/dist/src/commands/plugins.d.ts +11 -0
  164. package/dist/src/commands/plugins.js +826 -0
  165. package/dist/src/commands/process.d.ts +10 -0
  166. package/dist/src/commands/process.js +694 -0
  167. package/dist/src/commands/progress.d.ts +11 -0
  168. package/dist/src/commands/progress.js +259 -0
  169. package/dist/src/commands/providers.d.ts +10 -0
  170. package/dist/src/commands/providers.js +502 -0
  171. package/dist/src/commands/proxy-lifecycle.d.ts +12 -0
  172. package/dist/src/commands/proxy-lifecycle.js +232 -0
  173. package/dist/src/commands/proxy.d.ts +21 -0
  174. package/dist/src/commands/proxy.js +398 -0
  175. package/dist/src/commands/route.d.ts +16 -0
  176. package/dist/src/commands/route.js +822 -0
  177. package/dist/src/commands/ruvector/backup.d.ts +11 -0
  178. package/dist/src/commands/ruvector/backup.js +747 -0
  179. package/dist/src/commands/ruvector/benchmark.d.ts +11 -0
  180. package/dist/src/commands/ruvector/benchmark.js +490 -0
  181. package/dist/src/commands/ruvector/import.d.ts +18 -0
  182. package/dist/src/commands/ruvector/import.js +373 -0
  183. package/dist/src/commands/ruvector/index.d.ts +29 -0
  184. package/dist/src/commands/ruvector/index.js +129 -0
  185. package/dist/src/commands/ruvector/init.d.ts +11 -0
  186. package/dist/src/commands/ruvector/init.js +467 -0
  187. package/dist/src/commands/ruvector/migrate.d.ts +11 -0
  188. package/dist/src/commands/ruvector/migrate.js +498 -0
  189. package/dist/src/commands/ruvector/optimize.d.ts +11 -0
  190. package/dist/src/commands/ruvector/optimize.js +505 -0
  191. package/dist/src/commands/ruvector/pg-utils.d.ts +14 -0
  192. package/dist/src/commands/ruvector/pg-utils.js +41 -0
  193. package/dist/src/commands/ruvector/setup.d.ts +18 -0
  194. package/dist/src/commands/ruvector/setup.js +765 -0
  195. package/dist/src/commands/ruvector/status.d.ts +11 -0
  196. package/dist/src/commands/ruvector/status.js +479 -0
  197. package/dist/src/commands/security.d.ts +10 -0
  198. package/dist/src/commands/security.js +1012 -0
  199. package/dist/src/commands/session.d.ts +8 -0
  200. package/dist/src/commands/session.js +757 -0
  201. package/dist/src/commands/settings.d.ts +19 -0
  202. package/dist/src/commands/settings.js +180 -0
  203. package/dist/src/commands/spinner.d.ts +16 -0
  204. package/dist/src/commands/spinner.js +329 -0
  205. package/dist/src/commands/start.d.ts +8 -0
  206. package/dist/src/commands/start.js +418 -0
  207. package/dist/src/commands/status.d.ts +8 -0
  208. package/dist/src/commands/status.js +608 -0
  209. package/dist/src/commands/swarm.d.ts +8 -0
  210. package/dist/src/commands/swarm.js +891 -0
  211. package/dist/src/commands/task.d.ts +8 -0
  212. package/dist/src/commands/task.js +675 -0
  213. package/dist/src/commands/transfer-store.d.ts +13 -0
  214. package/dist/src/commands/transfer-store.js +428 -0
  215. package/dist/src/commands/update.d.ts +8 -0
  216. package/dist/src/commands/update.js +276 -0
  217. package/dist/src/commands/verify.d.ts +19 -0
  218. package/dist/src/commands/verify.js +261 -0
  219. package/dist/src/commands/version.d.ts +42 -0
  220. package/dist/src/commands/version.js +106 -0
  221. package/dist/src/commands/workflow.d.ts +8 -0
  222. package/dist/src/commands/workflow.js +617 -0
  223. package/dist/src/config/harness-feedback-applier.d.ts +50 -0
  224. package/dist/src/config/harness-feedback-applier.js +122 -0
  225. package/dist/src/config/proven-config-refresh.d.ts +39 -0
  226. package/dist/src/config/proven-config-refresh.js +154 -0
  227. package/dist/src/config/proven-config-rvfa.d.ts +23 -0
  228. package/dist/src/config/proven-config-rvfa.js +73 -0
  229. package/dist/src/config/proven-config.d.ts +86 -0
  230. package/dist/src/config/proven-config.js +176 -0
  231. package/dist/src/config-adapter.d.ts +15 -0
  232. package/dist/src/config-adapter.js +186 -0
  233. package/dist/src/encryption/vault.d.ts +94 -0
  234. package/dist/src/encryption/vault.js +172 -0
  235. package/dist/src/fs-secure.d.ts +86 -0
  236. package/dist/src/fs-secure.js +133 -0
  237. package/dist/src/funnel/advisor-tip.d.ts +58 -0
  238. package/dist/src/funnel/advisor-tip.js +92 -0
  239. package/dist/src/funnel/attribution.d.ts +37 -0
  240. package/dist/src/funnel/attribution.js +101 -0
  241. package/dist/src/funnel/consent.d.ts +22 -0
  242. package/dist/src/funnel/consent.js +58 -0
  243. package/dist/src/funnel/credit-errors.d.ts +31 -0
  244. package/dist/src/funnel/credit-errors.js +88 -0
  245. package/dist/src/funnel/credit-notifier.d.ts +44 -0
  246. package/dist/src/funnel/credit-notifier.js +74 -0
  247. package/dist/src/funnel/disclosure.d.ts +47 -0
  248. package/dist/src/funnel/disclosure.js +109 -0
  249. package/dist/src/funnel/enrollment.d.ts +36 -0
  250. package/dist/src/funnel/enrollment.js +64 -0
  251. package/dist/src/funnel/environment.d.ts +17 -0
  252. package/dist/src/funnel/environment.js +39 -0
  253. package/dist/src/funnel/event-transport.d.ts +51 -0
  254. package/dist/src/funnel/event-transport.js +199 -0
  255. package/dist/src/funnel/events.d.ts +42 -0
  256. package/dist/src/funnel/events.js +150 -0
  257. package/dist/src/funnel/index.d.ts +21 -0
  258. package/dist/src/funnel/index.js +21 -0
  259. package/dist/src/funnel/insights.d.ts +50 -0
  260. package/dist/src/funnel/insights.js +120 -0
  261. package/dist/src/funnel/local-signals.d.ts +20 -0
  262. package/dist/src/funnel/local-signals.js +77 -0
  263. package/dist/src/funnel/message-transport.d.ts +51 -0
  264. package/dist/src/funnel/message-transport.js +149 -0
  265. package/dist/src/funnel/messages.d.ts +55 -0
  266. package/dist/src/funnel/messages.js +160 -0
  267. package/dist/src/funnel/payout.d.ts +40 -0
  268. package/dist/src/funnel/payout.js +60 -0
  269. package/dist/src/funnel/power-saver-notifier.d.ts +44 -0
  270. package/dist/src/funnel/power-saver-notifier.js +92 -0
  271. package/dist/src/funnel/precedence.d.ts +16 -0
  272. package/dist/src/funnel/precedence.js +85 -0
  273. package/dist/src/funnel/promo.d.ts +41 -0
  274. package/dist/src/funnel/promo.js +144 -0
  275. package/dist/src/funnel/rate-limit-notifier.d.ts +55 -0
  276. package/dist/src/funnel/rate-limit-notifier.js +102 -0
  277. package/dist/src/funnel/rotation.d.ts +19 -0
  278. package/dist/src/funnel/rotation.js +70 -0
  279. package/dist/src/funnel/state.d.ts +13 -0
  280. package/dist/src/funnel/state.js +52 -0
  281. package/dist/src/funnel/toggle-cooldown.d.ts +17 -0
  282. package/dist/src/funnel/toggle-cooldown.js +32 -0
  283. package/dist/src/funnel/types.d.ts +98 -0
  284. package/dist/src/funnel/types.js +26 -0
  285. package/dist/src/index.d.ts +81 -0
  286. package/dist/src/index.js +609 -0
  287. package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
  288. package/dist/src/infrastructure/in-memory-repositories.js +264 -0
  289. package/dist/src/init/claudemd-generator.d.ts +16 -0
  290. package/dist/src/init/claudemd-generator.js +368 -0
  291. package/dist/src/init/executor.d.ts +41 -0
  292. package/dist/src/init/executor.js +2142 -0
  293. package/dist/src/init/helper-refresh.d.ts +79 -0
  294. package/dist/src/init/helper-refresh.js +347 -0
  295. package/dist/src/init/helper-signing.d.ts +37 -0
  296. package/dist/src/init/helper-signing.js +67 -0
  297. package/dist/src/init/helpers-generator.d.ts +87 -0
  298. package/dist/src/init/helpers-generator.js +1456 -0
  299. package/dist/src/init/index.d.ts +13 -0
  300. package/dist/src/init/index.js +15 -0
  301. package/dist/src/init/mcp-generator.d.ts +26 -0
  302. package/dist/src/init/mcp-generator.js +126 -0
  303. package/dist/src/init/memory-package-resolver.d.ts +53 -0
  304. package/dist/src/init/memory-package-resolver.js +118 -0
  305. package/dist/src/init/settings-generator.d.ts +14 -0
  306. package/dist/src/init/settings-generator.js +462 -0
  307. package/dist/src/init/statusline-generator.d.ts +28 -0
  308. package/dist/src/init/statusline-generator.js +177 -0
  309. package/dist/src/init/types.d.ts +331 -0
  310. package/dist/src/init/types.js +276 -0
  311. package/dist/src/log-filters.d.ts +46 -0
  312. package/dist/src/log-filters.js +107 -0
  313. package/dist/src/mcp-client.d.ts +92 -0
  314. package/dist/src/mcp-client.js +397 -0
  315. package/dist/src/mcp-server.d.ts +163 -0
  316. package/dist/src/mcp-server.js +751 -0
  317. package/dist/src/mcp-tools/agent-execute-core.d.ts +115 -0
  318. package/dist/src/mcp-tools/agent-execute-core.js +587 -0
  319. package/dist/src/mcp-tools/agent-tools.d.ts +9 -0
  320. package/dist/src/mcp-tools/agent-tools.js +837 -0
  321. package/dist/src/mcp-tools/agentbbs-tools.d.ts +28 -0
  322. package/dist/src/mcp-tools/agentbbs-tools.js +394 -0
  323. package/dist/src/mcp-tools/agentdb-tools.d.ts +35 -0
  324. package/dist/src/mcp-tools/agentdb-tools.js +1473 -0
  325. package/dist/src/mcp-tools/agenticow-loader.d.ts +59 -0
  326. package/dist/src/mcp-tools/agenticow-loader.js +105 -0
  327. package/dist/src/mcp-tools/agenticow-speculate-tools.d.ts +24 -0
  328. package/dist/src/mcp-tools/agenticow-speculate-tools.js +209 -0
  329. package/dist/src/mcp-tools/agenticow-tools.d.ts +36 -0
  330. package/dist/src/mcp-tools/agenticow-tools.js +360 -0
  331. package/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
  332. package/dist/src/mcp-tools/analyze-tools.js +346 -0
  333. package/dist/src/mcp-tools/auto-install.d.ts +83 -0
  334. package/dist/src/mcp-tools/auto-install.js +131 -0
  335. package/dist/src/mcp-tools/autopilot-tools.d.ts +12 -0
  336. package/dist/src/mcp-tools/autopilot-tools.js +231 -0
  337. package/dist/src/mcp-tools/browser-intent-tools.d.ts +162 -0
  338. package/dist/src/mcp-tools/browser-intent-tools.js +548 -0
  339. package/dist/src/mcp-tools/browser-session-tools.d.ts +27 -0
  340. package/dist/src/mcp-tools/browser-session-tools.js +398 -0
  341. package/dist/src/mcp-tools/browser-tools.d.ts +21 -0
  342. package/dist/src/mcp-tools/browser-tools.js +760 -0
  343. package/dist/src/mcp-tools/business-pod-tools.d.ts +20 -0
  344. package/dist/src/mcp-tools/business-pod-tools.js +169 -0
  345. package/dist/src/mcp-tools/claims-tools.d.ts +12 -0
  346. package/dist/src/mcp-tools/claims-tools.js +863 -0
  347. package/dist/src/mcp-tools/config-tools.d.ts +8 -0
  348. package/dist/src/mcp-tools/config-tools.js +411 -0
  349. package/dist/src/mcp-tools/coordination-tools.d.ts +13 -0
  350. package/dist/src/mcp-tools/coordination-tools.js +729 -0
  351. package/dist/src/mcp-tools/daa-tools.d.ts +13 -0
  352. package/dist/src/mcp-tools/daa-tools.js +534 -0
  353. package/dist/src/mcp-tools/embeddings-tools.d.ts +9 -0
  354. package/dist/src/mcp-tools/embeddings-tools.js +904 -0
  355. package/dist/src/mcp-tools/github-tools.d.ts +9 -0
  356. package/dist/src/mcp-tools/github-tools.js +659 -0
  357. package/dist/src/mcp-tools/guidance-tools.d.ts +15 -0
  358. package/dist/src/mcp-tools/guidance-tools.js +639 -0
  359. package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
  360. package/dist/src/mcp-tools/hive-mind-tools.js +953 -0
  361. package/dist/src/mcp-tools/hooks-tools.d.ts +65 -0
  362. package/dist/src/mcp-tools/hooks-tools.js +4836 -0
  363. package/dist/src/mcp-tools/http-fetch-tools.d.ts +55 -0
  364. package/dist/src/mcp-tools/http-fetch-tools.js +329 -0
  365. package/dist/src/mcp-tools/index.d.ts +34 -0
  366. package/dist/src/mcp-tools/index.js +40 -0
  367. package/dist/src/mcp-tools/managed-agent-tools.d.ts +22 -0
  368. package/dist/src/mcp-tools/managed-agent-tools.js +357 -0
  369. package/dist/src/mcp-tools/memory-tools.d.ts +14 -0
  370. package/dist/src/mcp-tools/memory-tools.js +1330 -0
  371. package/dist/src/mcp-tools/metaharness-tools.d.ts +51 -0
  372. package/dist/src/mcp-tools/metaharness-tools.js +684 -0
  373. package/dist/src/mcp-tools/neural-tools.d.ts +54 -0
  374. package/dist/src/mcp-tools/neural-tools.js +1168 -0
  375. package/dist/src/mcp-tools/performance-tools.d.ts +16 -0
  376. package/dist/src/mcp-tools/performance-tools.js +675 -0
  377. package/dist/src/mcp-tools/progress-tools.d.ts +14 -0
  378. package/dist/src/mcp-tools/progress-tools.js +348 -0
  379. package/dist/src/mcp-tools/request-tracker.d.ts +17 -0
  380. package/dist/src/mcp-tools/request-tracker.js +27 -0
  381. package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
  382. package/dist/src/mcp-tools/ruvllm-tools.js +355 -0
  383. package/dist/src/mcp-tools/security-tools.d.ts +18 -0
  384. package/dist/src/mcp-tools/security-tools.js +556 -0
  385. package/dist/src/mcp-tools/session-tools.d.ts +8 -0
  386. package/dist/src/mcp-tools/session-tools.js +517 -0
  387. package/dist/src/mcp-tools/swarm-tools.d.ts +37 -0
  388. package/dist/src/mcp-tools/swarm-tools.js +390 -0
  389. package/dist/src/mcp-tools/system-tools.d.ts +13 -0
  390. package/dist/src/mcp-tools/system-tools.js +688 -0
  391. package/dist/src/mcp-tools/task-tools.d.ts +8 -0
  392. package/dist/src/mcp-tools/task-tools.js +487 -0
  393. package/dist/src/mcp-tools/terminal-tools.d.ts +8 -0
  394. package/dist/src/mcp-tools/terminal-tools.js +306 -0
  395. package/dist/src/mcp-tools/testgen-tools.d.ts +26 -0
  396. package/dist/src/mcp-tools/testgen-tools.js +168 -0
  397. package/dist/src/mcp-tools/tool-loop-guardrail.d.ts +31 -0
  398. package/dist/src/mcp-tools/tool-loop-guardrail.js +71 -0
  399. package/dist/src/mcp-tools/transfer-tools.d.ts +14 -0
  400. package/dist/src/mcp-tools/transfer-tools.js +447 -0
  401. package/dist/src/mcp-tools/types.d.ts +8 -0
  402. package/dist/src/mcp-tools/types.js +8 -0
  403. package/dist/src/mcp-tools/validate-input.d.ts +9 -0
  404. package/dist/src/mcp-tools/validate-input.js +9 -0
  405. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +13 -0
  406. package/dist/src/mcp-tools/wasm-agent-tools.js +840 -0
  407. package/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
  408. package/dist/src/mcp-tools/workflow-tools.js +884 -0
  409. package/dist/src/memory/bge-embedder.d.ts +25 -0
  410. package/dist/src/memory/bge-embedder.js +121 -0
  411. package/dist/src/memory/cross-encoder-rerank.d.ts +33 -0
  412. package/dist/src/memory/cross-encoder-rerank.js +123 -0
  413. package/dist/src/memory/embedding-policy.d.ts +21 -0
  414. package/dist/src/memory/embedding-policy.js +30 -0
  415. package/dist/src/memory/embedding-quantization.d.ts +62 -0
  416. package/dist/src/memory/embedding-quantization.js +156 -0
  417. package/dist/src/memory/ewc-consolidation.d.ts +305 -0
  418. package/dist/src/memory/ewc-consolidation.js +611 -0
  419. package/dist/src/memory/graph-edge-writer.d.ts +95 -0
  420. package/dist/src/memory/graph-edge-writer.js +217 -0
  421. package/dist/src/memory/hybrid-retrieval.d.ts +77 -0
  422. package/dist/src/memory/hybrid-retrieval.js +192 -0
  423. package/dist/src/memory/intelligence.d.ts +405 -0
  424. package/dist/src/memory/intelligence.js +1316 -0
  425. package/dist/src/memory/lucene-bm25.d.ts +19 -0
  426. package/dist/src/memory/lucene-bm25.js +308 -0
  427. package/dist/src/memory/memory-bridge.d.ts +537 -0
  428. package/dist/src/memory/memory-bridge.js +2460 -0
  429. package/dist/src/memory/memory-initializer.d.ts +556 -0
  430. package/dist/src/memory/memory-initializer.js +3021 -0
  431. package/dist/src/memory/neural-package-bridge.d.ts +48 -0
  432. package/dist/src/memory/neural-package-bridge.js +87 -0
  433. package/dist/src/memory/rabitq-index.d.ts +60 -0
  434. package/dist/src/memory/rabitq-index.js +242 -0
  435. package/dist/src/memory/sona-optimizer.d.ts +267 -0
  436. package/dist/src/memory/sona-optimizer.js +779 -0
  437. package/dist/src/memory/structured-distill.d.ts +48 -0
  438. package/dist/src/memory/structured-distill.js +125 -0
  439. package/dist/src/output.d.ts +9 -0
  440. package/dist/src/output.js +9 -0
  441. package/dist/src/parser.d.ts +89 -0
  442. package/dist/src/parser.js +516 -0
  443. package/dist/src/plugins/manager.d.ts +133 -0
  444. package/dist/src/plugins/manager.js +415 -0
  445. package/dist/src/plugins/store/discovery.d.ts +99 -0
  446. package/dist/src/plugins/store/discovery.js +1224 -0
  447. package/dist/src/plugins/store/index.d.ts +76 -0
  448. package/dist/src/plugins/store/index.js +141 -0
  449. package/dist/src/plugins/store/search.d.ts +46 -0
  450. package/dist/src/plugins/store/search.js +230 -0
  451. package/dist/src/plugins/store/types.d.ts +279 -0
  452. package/dist/src/plugins/store/types.js +7 -0
  453. package/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
  454. package/dist/src/plugins/tests/demo-plugin-store.js +126 -0
  455. package/dist/src/plugins/tests/standalone-test.d.ts +12 -0
  456. package/dist/src/plugins/tests/standalone-test.js +188 -0
  457. package/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
  458. package/dist/src/plugins/tests/test-plugin-store.js +206 -0
  459. package/dist/src/production/circuit-breaker.d.ts +101 -0
  460. package/dist/src/production/circuit-breaker.js +241 -0
  461. package/dist/src/production/error-handler.d.ts +92 -0
  462. package/dist/src/production/error-handler.js +299 -0
  463. package/dist/src/production/index.d.ts +23 -0
  464. package/dist/src/production/index.js +18 -0
  465. package/dist/src/production/monitoring.d.ts +161 -0
  466. package/dist/src/production/monitoring.js +356 -0
  467. package/dist/src/production/rate-limiter.d.ts +80 -0
  468. package/dist/src/production/rate-limiter.js +201 -0
  469. package/dist/src/production/retry.d.ts +48 -0
  470. package/dist/src/production/retry.js +179 -0
  471. package/dist/src/prompt.d.ts +44 -0
  472. package/dist/src/prompt.js +501 -0
  473. package/dist/src/proxy/install.d.ts +29 -0
  474. package/dist/src/proxy/install.js +135 -0
  475. package/dist/src/proxy/lifecycle.d.ts +61 -0
  476. package/dist/src/proxy/lifecycle.js +249 -0
  477. package/dist/src/proxy/paths.d.ts +34 -0
  478. package/dist/src/proxy/paths.js +70 -0
  479. package/dist/src/proxy/release.d.ts +47 -0
  480. package/dist/src/proxy/release.js +138 -0
  481. package/dist/src/proxy/token-bridge.d.ts +5 -0
  482. package/dist/src/proxy/token-bridge.js +61 -0
  483. package/dist/src/proxy/verify.d.ts +44 -0
  484. package/dist/src/proxy/verify.js +68 -0
  485. package/dist/src/runtime/headless.d.ts +60 -0
  486. package/dist/src/runtime/headless.js +284 -0
  487. package/dist/src/runtime/parent-death-watchdog.d.ts +42 -0
  488. package/dist/src/runtime/parent-death-watchdog.js +70 -0
  489. package/dist/src/ruvector/agent-wasm.d.ts +228 -0
  490. package/dist/src/ruvector/agent-wasm.js +463 -0
  491. package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
  492. package/dist/src/ruvector/ast-analyzer.js +277 -0
  493. package/dist/src/ruvector/codemods/engine.d.ts +45 -0
  494. package/dist/src/ruvector/codemods/engine.js +291 -0
  495. package/dist/src/ruvector/codemods/scope-analysis.d.ts +29 -0
  496. package/dist/src/ruvector/codemods/scope-analysis.js +162 -0
  497. package/dist/src/ruvector/coverage-router.d.ts +160 -0
  498. package/dist/src/ruvector/coverage-router.js +531 -0
  499. package/dist/src/ruvector/coverage-tools.d.ts +33 -0
  500. package/dist/src/ruvector/coverage-tools.js +157 -0
  501. package/dist/src/ruvector/diff-classifier.d.ts +175 -0
  502. package/dist/src/ruvector/diff-classifier.js +699 -0
  503. package/dist/src/ruvector/diskann-backend.d.ts +78 -0
  504. package/dist/src/ruvector/diskann-backend.js +310 -0
  505. package/dist/src/ruvector/enhanced-model-router.d.ts +172 -0
  506. package/dist/src/ruvector/enhanced-model-router.js +577 -0
  507. package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
  508. package/dist/src/ruvector/graph-analyzer.js +929 -0
  509. package/dist/src/ruvector/graph-backend.d.ts +79 -0
  510. package/dist/src/ruvector/graph-backend.js +220 -0
  511. package/dist/src/ruvector/index.d.ts +38 -0
  512. package/dist/src/ruvector/index.js +86 -0
  513. package/dist/src/ruvector/lora-adapter.d.ts +292 -0
  514. package/dist/src/ruvector/lora-adapter.js +710 -0
  515. package/dist/src/ruvector/model-prices.d.ts +50 -0
  516. package/dist/src/ruvector/model-prices.js +72 -0
  517. package/dist/src/ruvector/model-router.d.ts +408 -0
  518. package/dist/src/ruvector/model-router.js +1162 -0
  519. package/dist/src/ruvector/neural-router.d.ts +182 -0
  520. package/dist/src/ruvector/neural-router.js +825 -0
  521. package/dist/src/ruvector/output-verifier.d.ts +83 -0
  522. package/dist/src/ruvector/output-verifier.js +277 -0
  523. package/dist/src/ruvector/q-learning-router.d.ts +227 -0
  524. package/dist/src/ruvector/q-learning-router.js +721 -0
  525. package/dist/src/ruvector/router-calibrator.d.ts +65 -0
  526. package/dist/src/ruvector/router-calibrator.js +120 -0
  527. package/dist/src/ruvector/router-parallel-recorder.d.ts +127 -0
  528. package/dist/src/ruvector/router-parallel-recorder.js +183 -0
  529. package/dist/src/ruvector/router-trajectory.d.ts +194 -0
  530. package/dist/src/ruvector/router-trajectory.js +281 -0
  531. package/dist/src/ruvector/run-transcript-recorder.d.ts +154 -0
  532. package/dist/src/ruvector/run-transcript-recorder.js +209 -0
  533. package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
  534. package/dist/src/ruvector/ruvllm-wasm.js +379 -0
  535. package/dist/src/ruvector/semantic-router.d.ts +77 -0
  536. package/dist/src/ruvector/semantic-router.js +178 -0
  537. package/dist/src/ruvector/task-embedder.d.ts +56 -0
  538. package/dist/src/ruvector/task-embedder.js +237 -0
  539. package/dist/src/ruvector/trajectory-tree.d.ts +113 -0
  540. package/dist/src/ruvector/trajectory-tree.js +237 -0
  541. package/dist/src/ruvector/vector-db.d.ts +73 -0
  542. package/dist/src/ruvector/vector-db.js +301 -0
  543. package/dist/src/ruvector/wasm-embedder.d.ts +13 -0
  544. package/dist/src/ruvector/wasm-embedder.js +143 -0
  545. package/dist/src/security/builtin-aidefence.d.ts +34 -0
  546. package/dist/src/security/builtin-aidefence.js +86 -0
  547. package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
  548. package/dist/src/services/agentic-flow-bridge.js +95 -0
  549. package/dist/src/services/ai-job-dedup.d.ts +61 -0
  550. package/dist/src/services/ai-job-dedup.js +136 -0
  551. package/dist/src/services/checkpoint-gate.d.ts +140 -0
  552. package/dist/src/services/checkpoint-gate.js +223 -0
  553. package/dist/src/services/claim-service.d.ts +204 -0
  554. package/dist/src/services/claim-service.js +818 -0
  555. package/dist/src/services/config-file-manager.d.ts +37 -0
  556. package/dist/src/services/config-file-manager.js +224 -0
  557. package/dist/src/services/container-worker-pool.d.ts +204 -0
  558. package/dist/src/services/container-worker-pool.js +589 -0
  559. package/dist/src/services/daemon-autostart.d.ts +17 -0
  560. package/dist/src/services/daemon-autostart.js +102 -0
  561. package/dist/src/services/distill-oracle.d.ts +190 -0
  562. package/dist/src/services/distill-oracle.js +349 -0
  563. package/dist/src/services/distill-tuning.d.ts +111 -0
  564. package/dist/src/services/distill-tuning.js +510 -0
  565. package/dist/src/services/evolve-proof.d.ts +253 -0
  566. package/dist/src/services/evolve-proof.js +343 -0
  567. package/dist/src/services/fable-harness.d.ts +208 -0
  568. package/dist/src/services/fable-harness.js +388 -0
  569. package/dist/src/services/git-workspace-identity.d.ts +42 -0
  570. package/dist/src/services/git-workspace-identity.js +99 -0
  571. package/dist/src/services/global-ai-budget.d.ts +135 -0
  572. package/dist/src/services/global-ai-budget.js +415 -0
  573. package/dist/src/services/harness-benchmark.d.ts +68 -0
  574. package/dist/src/services/harness-benchmark.js +94 -0
  575. package/dist/src/services/harness-canary.d.ts +60 -0
  576. package/dist/src/services/harness-canary.js +69 -0
  577. package/dist/src/services/harness-corpus-harvester.d.ts +51 -0
  578. package/dist/src/services/harness-corpus-harvester.js +74 -0
  579. package/dist/src/services/harness-flywheel-generations.d.ts +115 -0
  580. package/dist/src/services/harness-flywheel-generations.js +360 -0
  581. package/dist/src/services/harness-flywheel-runtime.d.ts +25 -0
  582. package/dist/src/services/harness-flywheel-runtime.js +92 -0
  583. package/dist/src/services/harness-flywheel.d.ts +48 -0
  584. package/dist/src/services/harness-flywheel.js +207 -0
  585. package/dist/src/services/harness-frozen-eval.d.ts +22 -0
  586. package/dist/src/services/harness-frozen-eval.js +66 -0
  587. package/dist/src/services/harness-hosts.d.ts +40 -0
  588. package/dist/src/services/harness-hosts.js +88 -0
  589. package/dist/src/services/harness-improvement-ledger.d.ts +63 -0
  590. package/dist/src/services/harness-improvement-ledger.js +101 -0
  591. package/dist/src/services/harness-loop.d.ts +53 -0
  592. package/dist/src/services/harness-loop.js +85 -0
  593. package/dist/src/services/harness-qualification.d.ts +66 -0
  594. package/dist/src/services/harness-qualification.js +143 -0
  595. package/dist/src/services/harness-replay.d.ts +37 -0
  596. package/dist/src/services/harness-replay.js +92 -0
  597. package/dist/src/services/harness-verify.d.ts +33 -0
  598. package/dist/src/services/harness-verify.js +26 -0
  599. package/dist/src/services/harness-worker.d.ts +23 -0
  600. package/dist/src/services/harness-worker.js +66 -0
  601. package/dist/src/services/headless-worker-executor.d.ts +358 -0
  602. package/dist/src/services/headless-worker-executor.js +1269 -0
  603. package/dist/src/services/index.d.ts +13 -0
  604. package/dist/src/services/index.js +11 -0
  605. package/dist/src/services/memory-backup.d.ts +53 -0
  606. package/dist/src/services/memory-backup.js +198 -0
  607. package/dist/src/services/memory-distillation.d.ts +41 -0
  608. package/dist/src/services/memory-distillation.js +277 -0
  609. package/dist/src/services/native-training.d.ts +68 -0
  610. package/dist/src/services/native-training.js +141 -0
  611. package/dist/src/services/registry-api.d.ts +58 -0
  612. package/dist/src/services/registry-api.js +146 -0
  613. package/dist/src/services/repo-supervisor.d.ts +70 -0
  614. package/dist/src/services/repo-supervisor.js +228 -0
  615. package/dist/src/services/ruvector-training.d.ts +222 -0
  616. package/dist/src/services/ruvector-training.js +693 -0
  617. package/dist/src/services/swarm-memory-branches.d.ts +135 -0
  618. package/dist/src/services/swarm-memory-branches.js +213 -0
  619. package/dist/src/services/weight-eft.d.ts +305 -0
  620. package/dist/src/services/weight-eft.js +296 -0
  621. package/dist/src/services/worker-daemon.d.ts +439 -0
  622. package/dist/src/services/worker-daemon.js +1865 -0
  623. package/dist/src/services/worker-queue.d.ts +194 -0
  624. package/dist/src/services/worker-queue.js +513 -0
  625. package/dist/src/services/workspace-lease.d.ts +55 -0
  626. package/dist/src/services/workspace-lease.js +191 -0
  627. package/dist/src/suggest.d.ts +53 -0
  628. package/dist/src/suggest.js +200 -0
  629. package/dist/src/transfer/anonymization/index.d.ts +25 -0
  630. package/dist/src/transfer/anonymization/index.js +175 -0
  631. package/dist/src/transfer/deploy-seraphine.d.ts +13 -0
  632. package/dist/src/transfer/deploy-seraphine.js +205 -0
  633. package/dist/src/transfer/export.d.ts +25 -0
  634. package/dist/src/transfer/export.js +113 -0
  635. package/dist/src/transfer/index.d.ts +12 -0
  636. package/dist/src/transfer/index.js +31 -0
  637. package/dist/src/transfer/ipfs/client.d.ts +109 -0
  638. package/dist/src/transfer/ipfs/client.js +307 -0
  639. package/dist/src/transfer/ipfs/upload.d.ts +95 -0
  640. package/dist/src/transfer/ipfs/upload.js +413 -0
  641. package/dist/src/transfer/models/seraphine.d.ts +72 -0
  642. package/dist/src/transfer/models/seraphine.js +373 -0
  643. package/dist/src/transfer/serialization/cfp.d.ts +49 -0
  644. package/dist/src/transfer/serialization/cfp.js +183 -0
  645. package/dist/src/transfer/storage/gcs.d.ts +82 -0
  646. package/dist/src/transfer/storage/gcs.js +272 -0
  647. package/dist/src/transfer/storage/index.d.ts +6 -0
  648. package/dist/src/transfer/storage/index.js +6 -0
  649. package/dist/src/transfer/store/discovery.d.ts +84 -0
  650. package/dist/src/transfer/store/discovery.js +382 -0
  651. package/dist/src/transfer/store/download.d.ts +70 -0
  652. package/dist/src/transfer/store/download.js +334 -0
  653. package/dist/src/transfer/store/index.d.ts +84 -0
  654. package/dist/src/transfer/store/index.js +153 -0
  655. package/dist/src/transfer/store/publish.d.ts +76 -0
  656. package/dist/src/transfer/store/publish.js +294 -0
  657. package/dist/src/transfer/store/registry.d.ts +58 -0
  658. package/dist/src/transfer/store/registry.js +285 -0
  659. package/dist/src/transfer/store/search.d.ts +54 -0
  660. package/dist/src/transfer/store/search.js +232 -0
  661. package/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
  662. package/dist/src/transfer/store/tests/standalone-test.js +190 -0
  663. package/dist/src/transfer/store/types.d.ts +193 -0
  664. package/dist/src/transfer/store/types.js +6 -0
  665. package/dist/src/transfer/test-seraphine.d.ts +6 -0
  666. package/dist/src/transfer/test-seraphine.js +105 -0
  667. package/dist/src/transfer/tests/test-store.d.ts +7 -0
  668. package/dist/src/transfer/tests/test-store.js +214 -0
  669. package/dist/src/transfer/types.d.ts +245 -0
  670. package/dist/src/transfer/types.js +6 -0
  671. package/dist/src/types.d.ts +13 -0
  672. package/dist/src/types.js +13 -0
  673. package/dist/src/update/checker.d.ts +34 -0
  674. package/dist/src/update/checker.js +191 -0
  675. package/dist/src/update/executor.d.ts +33 -0
  676. package/dist/src/update/executor.js +217 -0
  677. package/dist/src/update/index.d.ts +33 -0
  678. package/dist/src/update/index.js +64 -0
  679. package/dist/src/update/rate-limiter.d.ts +20 -0
  680. package/dist/src/update/rate-limiter.js +96 -0
  681. package/dist/src/update/validator.d.ts +17 -0
  682. package/dist/src/update/validator.js +123 -0
  683. package/package.json +1 -1
@@ -0,0 +1,825 @@
1
+ /**
2
+ * neural-router.ts — Optional cost-optimal neural routing path (ADR-148).
3
+ *
4
+ * Wires `@metaharness/router` (pure-TS k-NN/KRR + optional FastGRNN via
5
+ * `@ruvector/tiny-dancer`) into the model-routing path as a graceful, gated
6
+ * addition. The shipped heuristic + Thompson bandit stays as the default;
7
+ * this module only contributes a decision when:
8
+ *
9
+ * 1. `CLAUDE_FLOW_ROUTER_NEURAL=1` is set
10
+ * 2. Either a trained artifact path resolves (`CLAUDE_FLOW_ROUTER_MODEL_PATH`)
11
+ * OR the bundled seed corpus loads
12
+ * 3. The dynamic `import('@metaharness/router')` succeeds
13
+ *
14
+ * Otherwise `tryCostOptimalRoute(...)` returns `null` and the caller falls
15
+ * back to the bandit path with `routedBy: 'bandit-fallback'`.
16
+ *
17
+ * Observability — `routedBy` is returned on every result and must never be
18
+ * inferred from "did the import resolve?" (ADR-074, ADR-086). It carries
19
+ * exactly one of:
20
+ * - 'metaharness-knn' pure-TS k-NN, no training (uses raw seed examples)
21
+ * - 'metaharness-krr' pure-TS KRR with LOO-CV λ (TrainedRouter JSON)
22
+ * - 'fastgrnn' native FastGRNN via tiny-dancer (NativeRouter)
23
+ *
24
+ * Performance — module-level caches resolve the backend, seed corpus and
25
+ * router once per process. Hot path is a single `route(embedding)` call.
26
+ *
27
+ * @module neural-router
28
+ */
29
+ import { existsSync, readFileSync } from 'node:fs';
30
+ import { fileURLToPath } from 'node:url';
31
+ import { dirname, join, resolve as resolvePath } from 'node:path';
32
+ let _config = null;
33
+ let _backend = null;
34
+ let _initPromise = null;
35
+ const PRICES = {
36
+ haiku: 1, sonnet: 3, opus: 15, inherit: 3,
37
+ };
38
+ // ADR-149 iter 12 — lazy load measured per-model latency (mean ms) from the
39
+ // most-recent FULL seed-corpus measurement file. Cached per-process.
40
+ // Returns an empty map if no measurement is available.
41
+ let _latencyMapPromise = null;
42
+ function loadLatencyMap() {
43
+ if (_latencyMapPromise !== null)
44
+ return _latencyMapPromise;
45
+ _latencyMapPromise = (async () => {
46
+ const result = {};
47
+ try {
48
+ const fs = await import('node:fs');
49
+ const path = await import('node:path');
50
+ const benchDir = path.resolve(process.cwd(), 'docs', 'benchmarks', 'runs');
51
+ if (!fs.existsSync(benchDir))
52
+ return result;
53
+ const files = fs.readdirSync(benchDir)
54
+ .filter(f => f.startsWith('seed-corpus-') && f.endsWith('.json'))
55
+ .sort().reverse();
56
+ // Prefer a file with all three tiers populated (full measurement run);
57
+ // fall back to newest if none qualify.
58
+ let chosen = null;
59
+ for (const f of files) {
60
+ try {
61
+ const data = JSON.parse(fs.readFileSync(path.join(benchDir, f), 'utf8'));
62
+ const sample = data.perCandidate?.[0];
63
+ if (sample && sample.cheap_avg_score != null && sample.mid_avg_score != null && sample.strong_avg_score != null) {
64
+ chosen = data;
65
+ break;
66
+ }
67
+ if (!chosen)
68
+ chosen = data;
69
+ }
70
+ catch { /* skip */ }
71
+ }
72
+ for (const r of chosen?.perCandidate ?? []) {
73
+ if (typeof r.latency_mean_ms === 'number' && r.latency_mean_ms > 0) {
74
+ result[r.id] = r.latency_mean_ms;
75
+ }
76
+ }
77
+ }
78
+ catch { /* best-effort */ }
79
+ return result;
80
+ })();
81
+ return _latencyMapPromise;
82
+ }
83
+ /**
84
+ * ADR-149 — map a concrete OpenRouter / Anthropic model id back to the
85
+ * closest ClaudeModel tier label for back-compat. Used to populate the
86
+ * `model: ClaudeModel` field when the actual picked `modelId` is e.g.
87
+ * `openai/gpt-4.1` or `inclusionai/ling-2.6-flash`.
88
+ *
89
+ * Mapping rule: substring-based. Anthropic ids carry the tier name;
90
+ * other providers map to the tier whose role they play (cheap, mid, strong).
91
+ * The map is intentionally non-exhaustive — unknown ids default to 'sonnet'
92
+ * (the safest middle ground for an unrecognised candidate).
93
+ */
94
+ function tierLabelForModelId(modelId) {
95
+ const id = modelId.toLowerCase();
96
+ if (id.includes('haiku') || id.includes('ling-') || id.includes('flash-lite')
97
+ || id.includes('nemotron-nano') || id.includes('ministral')
98
+ || id.includes('llama-3.2-3b') || id.includes('llama-3.1-8b')) {
99
+ return 'haiku';
100
+ }
101
+ if (id.includes('opus'))
102
+ return 'opus';
103
+ // Mid-tier: sonnet, gpt-4.1, gemini-flash, llama-70b, nemotron-super, etc.
104
+ return 'sonnet';
105
+ }
106
+ // ============================================================================
107
+ // Config resolution
108
+ // ============================================================================
109
+ function getConfig() {
110
+ if (_config !== null)
111
+ return _config;
112
+ // Default seed-corpus path: bundled with the package. We resolve relative to
113
+ // this file's location so it works both in src (tsc dev) and in the dist.
114
+ // dist layout: dist/src/ruvector/neural-router.js → assets at dist/assets/...
115
+ // src layout: src/ruvector/neural-router.ts → assets at assets/...
116
+ // We probe both candidate locations.
117
+ let assetsDir;
118
+ try {
119
+ const here = dirname(fileURLToPath(import.meta.url));
120
+ const candidates = [
121
+ resolvePath(here, '..', '..', 'assets', 'model-router'), // src/ruvector → src/assets/...
122
+ resolvePath(here, '..', '..', '..', 'assets', 'model-router'), // dist/src/ruvector → dist/assets/...
123
+ resolvePath(here, '..', '..', '..', '..', 'assets', 'model-router'), // safety net
124
+ ];
125
+ assetsDir = candidates.find(existsSync) ?? candidates[0];
126
+ }
127
+ catch {
128
+ assetsDir = resolvePath(process.cwd(), 'v3', '@claude-flow', 'cli', 'assets', 'model-router');
129
+ }
130
+ _config = {
131
+ enabled: process.env.CLAUDE_FLOW_ROUTER_NEURAL === '1',
132
+ modelPath: process.env.CLAUDE_FLOW_ROUTER_MODEL_PATH || undefined,
133
+ bundledKrrPath: join(assetsDir, 'seed-router.krr.json'),
134
+ // ADR-149 v2 — measured against the richer code-context corpus
135
+ // (gen-seed-corpus-v2.mjs). On that corpus, cheap models (Ling 2.6
136
+ // Flash) deliver 75-93% on cheap/mid tasks and ~54% on strong tasks;
137
+ // expensive models deliver 56-89% across tiers. Bar=0.50 lets cheap
138
+ // models win cheap+mid (cost-optimal) but escalates to capable models
139
+ // on strong queries where cheap predictions fall below the bar.
140
+ // Override per-installation; 0.25 = always-cheapest, 0.70 = quality-strict.
141
+ qualityBar: parseFloat(process.env.CLAUDE_FLOW_ROUTER_QUALITY_BAR ?? '0.50') || 0.50,
142
+ seedCorpusPath: process.env.CLAUDE_FLOW_ROUTER_SEED_CORPUS
143
+ ?? join(assetsDir, 'seed-rows.json'),
144
+ k: parseInt(process.env.CLAUDE_FLOW_ROUTER_KNN_K ?? '5', 10) || 5,
145
+ latencyBudgetMs: Math.max(0, parseInt(process.env.CLAUDE_FLOW_ROUTER_LATENCY_BUDGET_MS ?? '0', 10) || 0),
146
+ // ADR-149 iter 24 — DEFAULT ON. Opt out with `=0`. Iter 23 OOS
147
+ // validation: ECE 0.1604 → 0.0335 (-79%), well-calibrated.
148
+ calibrateEnabled: process.env.CLAUDE_FLOW_ROUTER_CALIBRATE !== '0',
149
+ // ADR-149 iter 29 — orthogonal selector mode. Blended $/Mtok ceiling;
150
+ // 0 disables (preserves cost-optimal-above-bar). Typical values:
151
+ // $5 → cheap+mid tier only (Ling 2.6, Gemini Flash Lite, Llama 3.3, GPT-4.1)
152
+ // $20 → exclude Sonnet ($48 blended) and Opus ($240)
153
+ // $50 → exclude Opus only
154
+ costCeilingPerMTok: Math.max(0, parseFloat(process.env.CLAUDE_FLOW_ROUTER_COST_CEILING_USD_PER_MTOK ?? '0') || 0),
155
+ // iter 44 — ensemble disagreement threshold; 0 disables.
156
+ ensembleUncertaintyThreshold: Math.max(0, parseFloat(process.env.CLAUDE_FLOW_ROUTER_ENSEMBLE_UNCERTAINTY_THRESHOLD ?? '0') || 0),
157
+ calibratorPath: process.env.CLAUDE_FLOW_ROUTER_CALIBRATOR_PATH
158
+ ?? join(assetsDir, 'seed-router.calibrator.json'),
159
+ };
160
+ return _config;
161
+ }
162
+ function loadSeedCorpus(path) {
163
+ if (!existsSync(path))
164
+ return null;
165
+ try {
166
+ const raw = readFileSync(path, 'utf8');
167
+ const data = JSON.parse(raw);
168
+ if (!Array.isArray(data))
169
+ return null;
170
+ // Light-touch validation: each row must have a numeric-array embedding and
171
+ // a non-empty scores map. We do not coerce types — bad data should be
172
+ // visible as a config bug, not silently routed around.
173
+ for (const row of data) {
174
+ if (!row || !Array.isArray(row.embedding) || row.embedding.length === 0)
175
+ return null;
176
+ if (!row.scores || typeof row.scores !== 'object')
177
+ return null;
178
+ }
179
+ return data;
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }
185
+ async function resolveBackend(cfg) {
186
+ // 1. Optional dep present? Indirect the specifier through a string variable
187
+ // so tsc doesn't statically resolve `@metaharness/router` at build time
188
+ // (TS2307 when the optional dep isn't installed — #2586 pattern).
189
+ const metaharnessRouterPkg = '@metaharness/router';
190
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- optional dep; surface is fluid across upstream versions
191
+ let mh;
192
+ try {
193
+ mh = await import(metaharnessRouterPkg);
194
+ }
195
+ catch {
196
+ return { available: false, router: null, routedBy: null, reason: '@metaharness/router not installed' };
197
+ }
198
+ // 2. If a trained-model path is set AND tiny-dancer is loadable, prefer FastGRNN.
199
+ // Load the NativeRouter ONCE here; reuse on every route() call.
200
+ if (cfg.modelPath && existsSync(cfg.modelPath)) {
201
+ const backend = await mh.resolveRouterBackend('auto');
202
+ if (backend === 'native') {
203
+ try {
204
+ const nativeRouter = await mh.NativeRouter.load({ modelPath: cfg.modelPath });
205
+ // Build per-candidate embeddings once. NativeRouter requires non-empty
206
+ // candidate embeddings; we use a one-hot signature so the three tiers
207
+ // are distinct in the FastGRNN's feature engineering. Dim is probed
208
+ // from the seed corpus or falls back to 384 (MiniLM default).
209
+ const seed = loadSeedCorpus(cfg.seedCorpusPath);
210
+ const dim = seed?.[0]?.embedding.length ?? 384;
211
+ const candidates = ['haiku', 'sonnet', 'opus'].map((id, i) => {
212
+ const v = new Array(dim).fill(0);
213
+ v[i % dim] = 1;
214
+ return { id, embedding: v, costPerMTok: PRICES[id] };
215
+ });
216
+ return {
217
+ available: true,
218
+ router: null, // The native path uses the `native` field below, not `router`.
219
+ native: { router: nativeRouter, candidates },
220
+ routedBy: 'fastgrnn',
221
+ reason: `native router loaded from ${cfg.modelPath}`,
222
+ };
223
+ }
224
+ catch (e) {
225
+ // Fall through to pure-TS paths
226
+ }
227
+ }
228
+ }
229
+ // 3. Trained KRR JSON artifact path?
230
+ if (cfg.modelPath && existsSync(cfg.modelPath) && cfg.modelPath.endsWith('.json')) {
231
+ try {
232
+ const json = JSON.parse(readFileSync(cfg.modelPath, 'utf8'));
233
+ const trained = mh.TrainedRouter.fromJSON(json);
234
+ // Pre-extract candidate ids+costs for predictAll
235
+ const cands = json.candidates.map((c) => ({ id: c.id, costPerMTok: c.costPerMTok }));
236
+ return {
237
+ available: true,
238
+ router: {
239
+ route: (e) => {
240
+ const r = trained.route(e);
241
+ return { id: r.id, predictedQuality: r.predictedQuality, costPerMTok: r.costPerMTok, metBar: r.metBar };
242
+ },
243
+ predictAll: (e) => cands.map((c) => ({
244
+ id: c.id, predictedQuality: trained.predict(c.id, e), costPerMTok: c.costPerMTok,
245
+ })).sort((a, b) => a.costPerMTok - b.costPerMTok),
246
+ },
247
+ routedBy: 'metaharness-krr',
248
+ reason: `KRR artifact loaded from ${cfg.modelPath}`,
249
+ };
250
+ }
251
+ catch {
252
+ // Fall through to k-NN
253
+ }
254
+ }
255
+ // 3.5. No user artifact → try the bundled pre-trained KRR (~96kB, ~0.020 ms/route).
256
+ if (existsSync(cfg.bundledKrrPath)) {
257
+ try {
258
+ let unifiedCalibrator = null;
259
+ const calibratorByBucket = {};
260
+ const loadedCalibrators = [];
261
+ if (cfg.calibrateEnabled) {
262
+ const { IsotonicCalibrator } = await import('./router-calibrator.js');
263
+ const loadCal = (path) => {
264
+ if (!existsSync(path))
265
+ return null;
266
+ try {
267
+ return IsotonicCalibrator.fromJSON(JSON.parse(readFileSync(path, 'utf8')));
268
+ }
269
+ catch {
270
+ return null;
271
+ }
272
+ };
273
+ unifiedCalibrator = loadCal(cfg.calibratorPath);
274
+ if (unifiedCalibrator)
275
+ loadedCalibrators.push('unified');
276
+ // Per-tier — paths follow the iter 16 KRR specialist convention.
277
+ const calDir = cfg.calibratorPath.replace(/seed-router\.calibrator\.json$/, '');
278
+ for (const bucket of ['low', 'med', 'high']) {
279
+ const c = loadCal(`${calDir}seed-router.calibrator.${bucket}.json`);
280
+ if (c) {
281
+ calibratorByBucket[bucket] = c;
282
+ loadedCalibrators.push(bucket);
283
+ }
284
+ }
285
+ }
286
+ const wrapWithCalibrator = (r, cal) => {
287
+ if (!cal)
288
+ return r;
289
+ return {
290
+ route: (e) => {
291
+ const result = r.route(e);
292
+ return { ...result, predictedQuality: cal.transform(result.predictedQuality) };
293
+ },
294
+ predictAll: (e) => r.predictAll(e).map(c => ({ ...c, predictedQuality: cal.transform(c.predictedQuality) })),
295
+ };
296
+ };
297
+ // Helper: load a TrainedRouter from a path and wrap it as a PureRouter.
298
+ const loadKrr = (path) => {
299
+ if (!existsSync(path))
300
+ return null;
301
+ try {
302
+ const json = JSON.parse(readFileSync(path, 'utf8'));
303
+ const trained = mh.TrainedRouter.fromJSON(json);
304
+ const cands = json.candidates.map((c) => ({ id: c.id, costPerMTok: c.costPerMTok }));
305
+ return {
306
+ route: (e) => {
307
+ const r = trained.route(e);
308
+ return { id: r.id, predictedQuality: r.predictedQuality, costPerMTok: r.costPerMTok, metBar: r.metBar };
309
+ },
310
+ predictAll: (e) => cands.map((c) => ({
311
+ id: c.id, predictedQuality: trained.predict(c.id, e), costPerMTok: c.costPerMTok,
312
+ })).sort((a, b) => a.costPerMTok - b.costPerMTok),
313
+ };
314
+ }
315
+ catch {
316
+ return null;
317
+ }
318
+ };
319
+ const unifiedRaw = loadKrr(cfg.bundledKrrPath);
320
+ if (!unifiedRaw)
321
+ throw new Error('failed to load unified KRR');
322
+ const unified = wrapWithCalibrator(unifiedRaw, unifiedCalibrator);
323
+ // ADR-149 iter 16 — load per-bucket specialists if present. Each is a
324
+ // KRR fit only to its tier's rows (cheap → low.json, mid → med.json,
325
+ // strong → high.json). When tryCostOptimalRoute is called with a
326
+ // complexityBucket, the matching specialist is preferred over the
327
+ // unified router.
328
+ const bucketDir = cfg.bundledKrrPath.replace(/seed-router\.krr\.json$/, '');
329
+ const routerByBucket = {};
330
+ const loadedBuckets = [];
331
+ for (const bucket of ['low', 'med', 'high']) {
332
+ const r = loadKrr(`${bucketDir}seed-router.krr.${bucket}.json`);
333
+ if (r) {
334
+ // iter 25 — prefer tier-specific calibrator for this bucket;
335
+ // fall back to the unified calibrator when no specialist exists.
336
+ routerByBucket[bucket] = wrapWithCalibrator(r, calibratorByBucket[bucket] ?? unifiedCalibrator);
337
+ loadedBuckets.push(bucket);
338
+ }
339
+ }
340
+ const calibratedNote = loadedCalibrators.length > 0
341
+ ? ` (calibrated: ${loadedCalibrators.join('+')})`
342
+ : '';
343
+ const reason = loadedBuckets.length > 0
344
+ ? `bundled KRR loaded from ${cfg.bundledKrrPath} + ${loadedBuckets.length} bucket specialist(s): ${loadedBuckets.join(', ')}${calibratedNote}`
345
+ : `bundled KRR artifact loaded from ${cfg.bundledKrrPath}${calibratedNote}`;
346
+ return {
347
+ available: true,
348
+ router: unified,
349
+ ...(loadedBuckets.length > 0 ? { routerByBucket } : {}),
350
+ routedBy: 'metaharness-krr',
351
+ reason,
352
+ };
353
+ }
354
+ catch {
355
+ // Fall through to k-NN
356
+ }
357
+ }
358
+ // 4. Pure-TS k-NN over the bundled seed corpus.
359
+ const seed = loadSeedCorpus(cfg.seedCorpusPath);
360
+ if (!seed || seed.length === 0) {
361
+ return { available: true, router: null, routedBy: null, reason: `seed corpus missing or invalid at ${cfg.seedCorpusPath}` };
362
+ }
363
+ const router = mh.Router.fromExamples(seed, PRICES, { qualityBar: cfg.qualityBar, k: cfg.k });
364
+ // Pre-build per-candidate views ONCE so predictAll() doesn't re-allocate
365
+ // O(seed.length) objects per call. Sort by cost so the result is already in
366
+ // cheapest-first order.
367
+ const candIds = Object.keys(PRICES).filter(id => id !== 'inherit');
368
+ const candidateViews = candIds
369
+ .map(id => ({
370
+ id,
371
+ costPerMTok: PRICES[id],
372
+ examples: seed.map(r => ({ embedding: r.embedding, quality: r.scores[id] ?? 0 })),
373
+ }))
374
+ .sort((a, b) => a.costPerMTok - b.costPerMTok);
375
+ return {
376
+ available: true,
377
+ router: {
378
+ route: (e) => {
379
+ const r = router.route(e);
380
+ return { id: r.id, predictedQuality: r.predictedQuality, costPerMTok: r.costPerMTok, metBar: r.metBar };
381
+ },
382
+ predictAll: (e) => candidateViews.map(c => ({
383
+ id: c.id, predictedQuality: router.predict(c, e), costPerMTok: c.costPerMTok,
384
+ })),
385
+ },
386
+ routedBy: 'metaharness-knn',
387
+ reason: `k-NN over ${seed.length} seed rows`,
388
+ };
389
+ }
390
+ async function getBackend() {
391
+ if (_backend !== null)
392
+ return _backend;
393
+ if (_initPromise !== null)
394
+ return _initPromise;
395
+ const cfg = getConfig();
396
+ _initPromise = resolveBackend(cfg).then(b => { _backend = b; return b; });
397
+ return _initPromise;
398
+ }
399
+ // ============================================================================
400
+ // Public function
401
+ // ============================================================================
402
+ /**
403
+ * Cost-optimal route via the optional neural backend. Returns `null` when the
404
+ * neural path is disabled (gate closed), unavailable (deps missing), or
405
+ * unconfigured (no corpus / artifact). Callers must fall back to the
406
+ * heuristic+bandit path on null and tag the result `routedBy: 'bandit-fallback'`.
407
+ *
408
+ * @param embedding 384-dim (or matching corpus dim) query embedding
409
+ * @returns NeuralRouteResult on success, or `null` when the path is inactive
410
+ */
411
+ export async function tryCostOptimalRoute(embedding, opts) {
412
+ const cfg = getConfig();
413
+ if (!cfg.enabled)
414
+ return null;
415
+ if (!Array.isArray(embedding) || embedding.length === 0)
416
+ return null;
417
+ const backend = await getBackend();
418
+ if (!backend.available || backend.routedBy === null)
419
+ return null;
420
+ const t0 = Number(process.hrtime.bigint() / 1000n); // microseconds
421
+ try {
422
+ if (backend.routedBy === 'fastgrnn') {
423
+ // Native path: NativeRouter was loaded once at resolveBackend time;
424
+ // candidates were precomputed. Hot path is one .route() call.
425
+ if (!backend.native)
426
+ return null;
427
+ const res = await backend.native.router.route(embedding, backend.native.candidates);
428
+ const modelId = res.id;
429
+ const t1 = Number(process.hrtime.bigint() / 1000n);
430
+ return {
431
+ model: tierLabelForModelId(modelId),
432
+ modelId,
433
+ predictedQuality: 1 - res.uncertainty, // FastGRNN reports uncertainty, not quality directly
434
+ metBar: !res.useLightweight && res.confidence >= cfg.qualityBar,
435
+ alternatives: backend.native.candidates.map(c => ({
436
+ model: tierLabelForModelId(c.id),
437
+ modelId: c.id,
438
+ predictedQuality: c.id === modelId ? res.confidence : 0,
439
+ costPerMTok: c.costPerMTok,
440
+ })),
441
+ routedBy: 'fastgrnn',
442
+ inferenceTimeUs: t1 - t0,
443
+ };
444
+ }
445
+ // Pure-TS paths (k-NN or KRR) — ADR-149: ids are arbitrary strings,
446
+ // not ClaudeModel tier names. `tierLabelForModelId` derives the
447
+ // back-compat tier; `modelId` carries the concrete pick.
448
+ //
449
+ // ADR-149 iter 16 — when the caller supplies a complexity bucket AND a
450
+ // per-bucket specialist KRR was loaded at backend resolution, prefer
451
+ // the specialist over the unified router. Each specialist is trained
452
+ // only on its tier's rows (looQuality 0.94 for cheap vs 0.71 unified)
453
+ // so its predictions are sharper for queries in that band.
454
+ const activeRouter = (opts?.complexityBucket && backend.routerByBucket?.[opts.complexityBucket])
455
+ ?? backend.router;
456
+ if (!activeRouter)
457
+ return null;
458
+ const allRaw = activeRouter.predictAll(embedding);
459
+ // ADR-149 iter 14 — per-modelId Thompson sampling. When
460
+ // CLAUDE_FLOW_ROUTER_BANDIT_PER_MODEL=1, perturb each candidate's
461
+ // predicted quality by a Beta sample from its persisted per-modelId
462
+ // prior. Lets the bandit learn "Ling outperforms Haiku-4.5 within
463
+ // the cheap tier" without changing the neural backend's prediction.
464
+ //
465
+ // Density guard: only apply the perturbation when (α+β) > 4 for that
466
+ // modelId (≥2 outcomes accumulated; cold-start Beta(1,1) gives α+β=2).
467
+ // Otherwise the bandit's signal is uninformative noise and we'd
468
+ // sabotage the well-trained neural prediction.
469
+ let all = allRaw;
470
+ if (process.env.CLAUDE_FLOW_ROUTER_BANDIT_PER_MODEL === '1') {
471
+ try {
472
+ const { getModelRouterPriorsById, sampleBeta } = await import('./model-router.js');
473
+ const priorsById = getModelRouterPriorsById();
474
+ const bucket = opts?.complexityBucket; // ADR-149 iter 15
475
+ if (priorsById) {
476
+ // Cross-bucket shrinkage configuration (iter 57). When λ > 0,
477
+ // bucket-specific priors with few samples blend toward the
478
+ // marginal-across-buckets prior. Classic James-Stein-style
479
+ // shrinkage: rich cells trust themselves, thin cells borrow
480
+ // strength from neighbors. Default λ = 4 (set =0 to disable).
481
+ const shrinkageLambda = Math.max(0, parseFloat(process.env.CLAUDE_FLOW_ROUTER_BANDIT_SHRINKAGE_LAMBDA ?? '4') || 0);
482
+ all = allRaw.map(a => {
483
+ // Compute marginal-across-buckets prior for this modelId ONCE
484
+ // (used either as the primary prior OR as the shrinkage anchor).
485
+ let alphaMarginal = 1, betaMarginal = 1;
486
+ let marginalFound = false;
487
+ for (const b of ['low', 'med', 'high']) {
488
+ const p = priorsById[b]?.[a.id];
489
+ if (p) {
490
+ alphaMarginal += p.alpha - 1;
491
+ betaMarginal += p.beta - 1;
492
+ marginalFound = true;
493
+ }
494
+ }
495
+ let alpha, beta;
496
+ if (bucket && priorsById[bucket]?.[a.id]) {
497
+ // Bucket-specific prior exists — use it as the primary signal
498
+ // (iter 15 sharpness). Iter 57: when shrinkage is enabled,
499
+ // blend toward the marginal anchor based on specific-cell
500
+ // sample richness. w_s = (n_s + 1) / (n_s + 1 + λ). At n_s=0
501
+ // → mostly marginal; at n_s=large → mostly specific.
502
+ const p = priorsById[bucket][a.id];
503
+ const nSpecific = p.alpha + p.beta - 2;
504
+ if (shrinkageLambda > 0 && marginalFound) {
505
+ const wSpecific = (nSpecific + 1) / (nSpecific + 1 + shrinkageLambda);
506
+ alpha = wSpecific * p.alpha + (1 - wSpecific) * alphaMarginal;
507
+ beta = wSpecific * p.beta + (1 - wSpecific) * betaMarginal;
508
+ }
509
+ else {
510
+ alpha = p.alpha;
511
+ beta = p.beta;
512
+ }
513
+ }
514
+ else if (marginalFound) {
515
+ // Marginal fallback (iter 14) — no bucket-specific prior at all.
516
+ alpha = alphaMarginal;
517
+ beta = betaMarginal;
518
+ }
519
+ else {
520
+ return a;
521
+ }
522
+ const samples = alpha + beta;
523
+ if (samples <= 2)
524
+ return a; // hard floor — uniform prior has no signal
525
+ // iter 52 — continuous warmup curve. Replaces iter 14's binary
526
+ // density guard. Two curves available:
527
+ // default (iter 52): blendFactor = 0.5 * min(1, (s-2)/WARMUP)
528
+ // Capped at 0.5 → matches iter 14's
529
+ // 50/50 baseline at saturation.
530
+ // iter 53 opt-in: blendFactor = (s-2) / (s + WARMUP)
531
+ // Asymptotes to 1.0 as samples → ∞.
532
+ // At s=1000 → bandit ~99% influence.
533
+ // Use when you have lots of bandit data
534
+ // and want it to dominate the neural prior.
535
+ // Gate: CLAUDE_FLOW_ROUTER_BANDIT_FULL_INFLUENCE=1.
536
+ const warmupRange = Math.max(1, parseFloat(process.env.CLAUDE_FLOW_ROUTER_BANDIT_WARMUP_RANGE ?? '8') || 8);
537
+ const fullInfluence = process.env.CLAUDE_FLOW_ROUTER_BANDIT_FULL_INFLUENCE === '1';
538
+ const banditScore = sampleBeta(alpha, beta);
539
+ const blendFactor = fullInfluence
540
+ ? (samples - 2) / (samples + warmupRange)
541
+ : 0.5 * Math.min(1, (samples - 2) / warmupRange);
542
+ return { ...a, predictedQuality: (1 - blendFactor) * a.predictedQuality + blendFactor * banditScore };
543
+ });
544
+ }
545
+ }
546
+ catch { /* best-effort */ }
547
+ }
548
+ // ADR-149 iter 12 — latency-aware filtering. When CLAUDE_FLOW_ROUTER_
549
+ // LATENCY_BUDGET_MS is set, drop candidates whose measured latency
550
+ // exceeds the budget BEFORE the cost-optimal pick. The unfiltered
551
+ // alternatives stay on the result for observability — only the chosen
552
+ // `modelId` is constrained.
553
+ let main = activeRouter.route(embedding);
554
+ // Re-derive `main` from the post-Thompson `all` list when per-modelId
555
+ // is on (otherwise the bandit adjustment is invisible to the selector).
556
+ if (process.env.CLAUDE_FLOW_ROUTER_BANDIT_PER_MODEL === '1') {
557
+ const clearing = all.filter(a => a.predictedQuality >= cfg.qualityBar)
558
+ .sort((a, b) => a.costPerMTok - b.costPerMTok);
559
+ const pick = clearing[0] ?? [...all].sort((a, b) => b.predictedQuality - a.predictedQuality)[0];
560
+ if (pick) {
561
+ main = { id: pick.id, predictedQuality: pick.predictedQuality, costPerMTok: pick.costPerMTok, metBar: pick.predictedQuality >= cfg.qualityBar };
562
+ }
563
+ }
564
+ if (cfg.latencyBudgetMs > 0) {
565
+ const latency = await loadLatencyMap();
566
+ const eligible = all.filter(a => {
567
+ const lat = latency[a.id];
568
+ return lat === undefined || lat <= cfg.latencyBudgetMs;
569
+ });
570
+ if (eligible.length > 0) {
571
+ // Re-pick cheapest-clearing-bar among eligible
572
+ const clearing = eligible.filter(a => a.predictedQuality >= cfg.qualityBar)
573
+ .sort((a, b) => a.costPerMTok - b.costPerMTok);
574
+ const pick = clearing[0] ?? [...eligible].sort((a, b) => b.predictedQuality - a.predictedQuality)[0];
575
+ main = { id: pick.id, predictedQuality: pick.predictedQuality, costPerMTok: pick.costPerMTok, metBar: pick.predictedQuality >= cfg.qualityBar };
576
+ }
577
+ // else: every candidate exceeds the budget → fall back to the original pick
578
+ // (better to return a slow answer than no answer)
579
+ }
580
+ // ADR-149 iter 29 — quality-best-under-budget mode. When the cost
581
+ // ceiling is set, OVERRIDE the cost-optimal-above-bar pick:
582
+ // 1. filter candidates by costPerMTok ≤ ceiling
583
+ // 2. sort by predictedQuality DESC
584
+ // 3. pick the top one
585
+ // qualityBar still informs `metBar` on the result for observability,
586
+ // but does NOT filter the selection — the operator's hard constraint
587
+ // is cost, and they want the best quality they can get under it.
588
+ // If no candidate fits the ceiling, fall through to the existing pick
589
+ // (better to return something than nothing — same policy as the
590
+ // latency-budget fallback above).
591
+ if (cfg.costCeilingPerMTok > 0) {
592
+ const affordable = all.filter(a => a.costPerMTok <= cfg.costCeilingPerMTok);
593
+ if (affordable.length > 0) {
594
+ const pick = [...affordable].sort((a, b) => b.predictedQuality - a.predictedQuality)[0];
595
+ main = {
596
+ id: pick.id,
597
+ predictedQuality: pick.predictedQuality,
598
+ costPerMTok: pick.costPerMTok,
599
+ metBar: pick.predictedQuality >= cfg.qualityBar,
600
+ };
601
+ }
602
+ }
603
+ // ADR-149 iter 44+45 — ensemble disagreement diagnostic + uncertainty-
604
+ // aware fallback. When both the unified router and a bucket specialist
605
+ // are loaded AND a bucket was supplied, compute the picked model's
606
+ // prediction disagreement across both backends. ALWAYS surface it on
607
+ // the result (iter 45 — observable signal for tuning the threshold).
608
+ // If iter 44's threshold is > 0 AND the disagreement exceeds it, return
609
+ // null so the caller falls back to the pure bandit path (same as 429/5xx
610
+ // — uncertainty is a kind of soft failure).
611
+ let ensembleDisagreement;
612
+ if (opts?.complexityBucket
613
+ && backend.routerByBucket?.[opts.complexityBucket]
614
+ && backend.router
615
+ && activeRouter !== backend.router // we used the specialist; cross-check vs unified
616
+ ) {
617
+ const unifiedAlts = backend.router.predictAll(embedding);
618
+ const specialistQ = main.predictedQuality;
619
+ const unifiedQ = unifiedAlts.find(a => a.id === main.id)?.predictedQuality ?? specialistQ;
620
+ ensembleDisagreement = Math.abs(unifiedQ - specialistQ);
621
+ if (cfg.ensembleUncertaintyThreshold > 0 && ensembleDisagreement > cfg.ensembleUncertaintyThreshold) {
622
+ return null;
623
+ }
624
+ }
625
+ const t1 = Number(process.hrtime.bigint() / 1000n);
626
+ return {
627
+ model: tierLabelForModelId(main.id),
628
+ modelId: main.id,
629
+ predictedQuality: main.predictedQuality,
630
+ metBar: main.metBar,
631
+ alternatives: all.map(a => ({
632
+ model: tierLabelForModelId(a.id),
633
+ modelId: a.id,
634
+ predictedQuality: a.predictedQuality,
635
+ costPerMTok: a.costPerMTok,
636
+ })),
637
+ routedBy: backend.routedBy,
638
+ inferenceTimeUs: t1 - t0,
639
+ ...(ensembleDisagreement !== undefined ? { ensembleDisagreement } : {}),
640
+ };
641
+ }
642
+ catch {
643
+ // Any runtime failure is silently swallowed → caller's bandit-fallback engages.
644
+ return null;
645
+ }
646
+ }
647
+ /**
648
+ * Batch counterpart to `tryCostOptimalRoute`. Routes a list of embeddings
649
+ * in one go, sharing backend resolution + (for the pure-TS paths)
650
+ * candidate-view setup across the batch. The native FastGRNN path still
651
+ * dispatches per-call (xenova's worker doesn't support array inputs for
652
+ * tiny-dancer's Router.route).
653
+ *
654
+ * Order of the output array matches the input order. Each slot is either
655
+ * a NeuralRouteResult or null (gate closed, backend unavailable, etc. —
656
+ * mirrors the single-call contract).
657
+ *
658
+ * For harness-style callers (batch evals, GAIA runs, parallel agent
659
+ * dispatch) this amortizes backend init across N queries — first-call
660
+ * cold-load (~10 ms) becomes a fixed cost regardless of batch size.
661
+ */
662
+ export async function tryCostOptimalRouteBatch(embeddings) {
663
+ const out = new Array(embeddings.length).fill(null);
664
+ const cfg = getConfig();
665
+ if (!cfg.enabled)
666
+ return out;
667
+ const backend = await getBackend();
668
+ if (!backend.available || backend.routedBy === null)
669
+ return out;
670
+ // FastGRNN path: per-call native dispatch. The native router doesn't
671
+ // expose a batch entry point. We still share the loaded NativeRouter
672
+ // instance + candidate embeddings, which is most of the per-call cost.
673
+ if (backend.routedBy === 'fastgrnn') {
674
+ if (!backend.native)
675
+ return out;
676
+ const native = backend.native;
677
+ const tasks = embeddings.map(async (e, i) => {
678
+ if (!Array.isArray(e) || e.length === 0)
679
+ return null;
680
+ try {
681
+ const t0 = Number(process.hrtime.bigint() / 1000n);
682
+ const res = await native.router.route(e, native.candidates);
683
+ const modelId = res.id;
684
+ const t1 = Number(process.hrtime.bigint() / 1000n);
685
+ const result = {
686
+ model: tierLabelForModelId(modelId),
687
+ modelId,
688
+ predictedQuality: 1 - res.uncertainty,
689
+ metBar: !res.useLightweight && res.confidence >= cfg.qualityBar,
690
+ alternatives: native.candidates.map(c => ({
691
+ model: tierLabelForModelId(c.id),
692
+ modelId: c.id,
693
+ predictedQuality: c.id === modelId ? res.confidence : 0,
694
+ costPerMTok: c.costPerMTok,
695
+ })),
696
+ routedBy: 'fastgrnn',
697
+ inferenceTimeUs: t1 - t0,
698
+ };
699
+ out[i] = result;
700
+ }
701
+ catch {
702
+ out[i] = null;
703
+ }
704
+ return null;
705
+ });
706
+ await Promise.all(tasks);
707
+ return out;
708
+ }
709
+ // Pure-TS path (k-NN or KRR): same shared router + candidate views,
710
+ // tight loop. predictAll is cheap (already-pre-built per-candidate
711
+ // examples) so we avoid re-allocating per call.
712
+ if (!backend.router)
713
+ return out;
714
+ for (let i = 0; i < embeddings.length; i++) {
715
+ const e = embeddings[i];
716
+ if (!Array.isArray(e) || e.length === 0) {
717
+ out[i] = null;
718
+ continue;
719
+ }
720
+ try {
721
+ const t0 = Number(process.hrtime.bigint() / 1000n);
722
+ const main = backend.router.route(e);
723
+ const all = backend.router.predictAll(e);
724
+ const t1 = Number(process.hrtime.bigint() / 1000n);
725
+ out[i] = {
726
+ model: tierLabelForModelId(main.id),
727
+ modelId: main.id,
728
+ predictedQuality: main.predictedQuality,
729
+ metBar: main.metBar,
730
+ alternatives: all.map(a => ({
731
+ model: tierLabelForModelId(a.id),
732
+ modelId: a.id,
733
+ predictedQuality: a.predictedQuality,
734
+ costPerMTok: a.costPerMTok,
735
+ })),
736
+ routedBy: backend.routedBy,
737
+ inferenceTimeUs: t1 - t0,
738
+ };
739
+ }
740
+ catch {
741
+ out[i] = null;
742
+ }
743
+ }
744
+ return out;
745
+ }
746
+ /**
747
+ * Diagnostic surface — returns the active backend without performing a route.
748
+ * Used by the bench and by `claude-flow neural router status` (future CLI).
749
+ */
750
+ export async function neuralRouterStatus() {
751
+ const cfg = getConfig();
752
+ if (!cfg.enabled)
753
+ return { enabled: false, available: false, routedBy: null, reason: 'CLAUDE_FLOW_ROUTER_NEURAL!=1', config: cfg };
754
+ const backend = await getBackend();
755
+ return { enabled: true, available: backend.available, routedBy: backend.routedBy, reason: backend.reason, config: cfg };
756
+ }
757
+ /**
758
+ * ADR-149 iter 7 — fallback selector for retry-on-failure. Returns the
759
+ * cheapest candidate predicted to clear the quality bar (or the best-
760
+ * predicted if none do) that is NOT in `excludeModelIds`. Used by
761
+ * `executeAgentTask` to retry with a different model after a 429/5xx.
762
+ *
763
+ * Returns `null` when:
764
+ * - the gate is closed (mirrors tryCostOptimalRoute)
765
+ * - the embedding is missing or empty
766
+ * - the backend isn't loadable
767
+ * - every candidate is excluded (all retries exhausted)
768
+ *
769
+ * Selection is per-candidate via predictAll, then filter by exclude,
770
+ * then cheapest-clearing-bar (falling back to best-predicted).
771
+ */
772
+ export async function nextCostOptimalAlternative(embedding, excludeModelIds) {
773
+ const cfg = getConfig();
774
+ if (!cfg.enabled)
775
+ return null;
776
+ if (!Array.isArray(embedding) || embedding.length === 0)
777
+ return null;
778
+ const backend = await getBackend();
779
+ if (!backend.available || backend.router === null || backend.routedBy === null)
780
+ return null;
781
+ const exclude = new Set(excludeModelIds);
782
+ const t0 = Number(process.hrtime.bigint() / 1000n);
783
+ // Pure-TS path only — fallback retries are too rare to be worth threading
784
+ // through the FastGRNN candidate-embedding rebuild dance.
785
+ try {
786
+ const all = backend.router.predictAll(embedding);
787
+ const remaining = all.filter(a => !exclude.has(a.id));
788
+ if (remaining.length === 0)
789
+ return null;
790
+ // Cheapest predicted to clear qualityBar, else best-predicted among
791
+ // remaining. Mirrors @metaharness/router's qualityBar semantics.
792
+ const clearing = remaining.filter(a => a.predictedQuality >= cfg.qualityBar)
793
+ .sort((a, b) => a.costPerMTok - b.costPerMTok);
794
+ const pick = clearing[0] ?? [...remaining].sort((a, b) => b.predictedQuality - a.predictedQuality)[0];
795
+ const t1 = Number(process.hrtime.bigint() / 1000n);
796
+ return {
797
+ model: tierLabelForModelId(pick.id),
798
+ modelId: pick.id,
799
+ predictedQuality: pick.predictedQuality,
800
+ metBar: pick.predictedQuality >= cfg.qualityBar,
801
+ alternatives: remaining.map(a => ({
802
+ model: tierLabelForModelId(a.id),
803
+ modelId: a.id,
804
+ predictedQuality: a.predictedQuality,
805
+ costPerMTok: a.costPerMTok,
806
+ })),
807
+ routedBy: backend.routedBy,
808
+ inferenceTimeUs: t1 - t0,
809
+ };
810
+ }
811
+ catch {
812
+ return null;
813
+ }
814
+ }
815
+ /**
816
+ * Test seam — reset module-level caches so unit tests can simulate cold init.
817
+ * Not exported from the package's barrel.
818
+ */
819
+ export function __resetNeuralRouterForTests() {
820
+ _config = null;
821
+ _backend = null;
822
+ _initPromise = null;
823
+ _latencyMapPromise = null;
824
+ }
825
+ //# sourceMappingURL=neural-router.js.map