@claude-flow/cli 3.32.2 → 3.32.3

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 (655) hide show
  1. package/.claude/helpers/helpers.manifest.json +3 -3
  2. package/.claude/helpers/statusline.cjs +38 -38
  3. package/catalog-manifest.json +2 -2
  4. package/package.json +2 -2
  5. package/plugins/ruflo-metaharness/scripts/smoke.sh +11 -11
  6. package/dist/src/agenticow/speculative-exploration.d.ts +0 -148
  7. package/dist/src/agenticow/speculative-exploration.js +0 -218
  8. package/dist/src/appliance/gguf-engine.d.ts +0 -91
  9. package/dist/src/appliance/gguf-engine.js +0 -425
  10. package/dist/src/appliance/ruvllm-bridge.d.ts +0 -102
  11. package/dist/src/appliance/ruvllm-bridge.js +0 -292
  12. package/dist/src/appliance/rvfa-builder.d.ts +0 -44
  13. package/dist/src/appliance/rvfa-builder.js +0 -329
  14. package/dist/src/appliance/rvfa-distribution.d.ts +0 -97
  15. package/dist/src/appliance/rvfa-distribution.js +0 -370
  16. package/dist/src/appliance/rvfa-format.d.ts +0 -111
  17. package/dist/src/appliance/rvfa-format.js +0 -393
  18. package/dist/src/appliance/rvfa-runner.d.ts +0 -69
  19. package/dist/src/appliance/rvfa-runner.js +0 -237
  20. package/dist/src/appliance/rvfa-signing.d.ts +0 -123
  21. package/dist/src/appliance/rvfa-signing.js +0 -347
  22. package/dist/src/autopilot-state.d.ts +0 -77
  23. package/dist/src/autopilot-state.js +0 -271
  24. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +0 -18
  25. package/dist/src/benchmarks/gaia-agent-planning.smoke.js +0 -253
  26. package/dist/src/benchmarks/gaia-agent.d.ts +0 -198
  27. package/dist/src/benchmarks/gaia-agent.js +0 -651
  28. package/dist/src/benchmarks/gaia-causal-memory.d.ts +0 -133
  29. package/dist/src/benchmarks/gaia-causal-memory.js +0 -281
  30. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +0 -22
  31. package/dist/src/benchmarks/gaia-causal-memory.smoke.js +0 -300
  32. package/dist/src/benchmarks/gaia-convergence.d.ts +0 -138
  33. package/dist/src/benchmarks/gaia-convergence.js +0 -260
  34. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +0 -19
  35. package/dist/src/benchmarks/gaia-convergence.smoke.js +0 -246
  36. package/dist/src/benchmarks/gaia-critic.d.ts +0 -123
  37. package/dist/src/benchmarks/gaia-critic.js +0 -312
  38. package/dist/src/benchmarks/gaia-critic.smoke.d.ts +0 -21
  39. package/dist/src/benchmarks/gaia-critic.smoke.js +0 -327
  40. package/dist/src/benchmarks/gaia-decomposer.d.ts +0 -125
  41. package/dist/src/benchmarks/gaia-decomposer.js +0 -350
  42. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +0 -21
  43. package/dist/src/benchmarks/gaia-decomposer.smoke.js +0 -228
  44. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +0 -27
  45. package/dist/src/benchmarks/gaia-e2e-smoke.js +0 -136
  46. package/dist/src/benchmarks/gaia-extract.smoke.d.ts +0 -45
  47. package/dist/src/benchmarks/gaia-extract.smoke.js +0 -242
  48. package/dist/src/benchmarks/gaia-hardness/features.d.ts +0 -46
  49. package/dist/src/benchmarks/gaia-hardness/features.js +0 -170
  50. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +0 -105
  51. package/dist/src/benchmarks/gaia-hardness/predictor.js +0 -260
  52. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +0 -20
  53. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +0 -235
  54. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +0 -51
  55. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +0 -179
  56. package/dist/src/benchmarks/gaia-judge.d.ts +0 -88
  57. package/dist/src/benchmarks/gaia-judge.js +0 -437
  58. package/dist/src/benchmarks/gaia-loader.d.ts +0 -87
  59. package/dist/src/benchmarks/gaia-loader.js +0 -326
  60. package/dist/src/benchmarks/gaia-tools/file_read.d.ts +0 -35
  61. package/dist/src/benchmarks/gaia-tools/file_read.js +0 -403
  62. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +0 -126
  63. package/dist/src/benchmarks/gaia-tools/grounded_query.js +0 -225
  64. package/dist/src/benchmarks/gaia-tools/index.d.ts +0 -32
  65. package/dist/src/benchmarks/gaia-tools/index.js +0 -36
  66. package/dist/src/benchmarks/gaia-tools/types.d.ts +0 -62
  67. package/dist/src/benchmarks/gaia-tools/types.js +0 -12
  68. package/dist/src/benchmarks/gaia-tools/web_search.d.ts +0 -30
  69. package/dist/src/benchmarks/gaia-tools/web_search.js +0 -210
  70. package/dist/src/benchmarks/gaia-voting.d.ts +0 -88
  71. package/dist/src/benchmarks/gaia-voting.js +0 -297
  72. package/dist/src/benchmarks/gaia-voting.smoke.d.ts +0 -20
  73. package/dist/src/benchmarks/gaia-voting.smoke.js +0 -332
  74. package/dist/src/benchmarks/pretrain/index.d.ts +0 -58
  75. package/dist/src/benchmarks/pretrain/index.js +0 -404
  76. package/dist/src/business-pods/bbs-budget-tracker.d.ts +0 -139
  77. package/dist/src/business-pods/bbs-budget-tracker.js +0 -358
  78. package/dist/src/business-pods/domain-affinity-policy.d.ts +0 -47
  79. package/dist/src/business-pods/domain-affinity-policy.js +0 -65
  80. package/dist/src/business-pods/pod-schema.d.ts +0 -96
  81. package/dist/src/business-pods/pod-schema.js +0 -225
  82. package/dist/src/commands/advisor.d.ts +0 -15
  83. package/dist/src/commands/advisor.js +0 -94
  84. package/dist/src/commands/agent-wasm.d.ts +0 -14
  85. package/dist/src/commands/agent-wasm.js +0 -333
  86. package/dist/src/commands/agent.d.ts +0 -8
  87. package/dist/src/commands/agent.js +0 -927
  88. package/dist/src/commands/analyze.d.ts +0 -19
  89. package/dist/src/commands/analyze.js +0 -2047
  90. package/dist/src/commands/announcements.d.ts +0 -17
  91. package/dist/src/commands/announcements.js +0 -0
  92. package/dist/src/commands/appliance-advanced.d.ts +0 -9
  93. package/dist/src/commands/appliance-advanced.js +0 -215
  94. package/dist/src/commands/appliance.d.ts +0 -8
  95. package/dist/src/commands/appliance.js +0 -404
  96. package/dist/src/commands/autopilot.d.ts +0 -15
  97. package/dist/src/commands/autopilot.js +0 -407
  98. package/dist/src/commands/benchmark.d.ts +0 -10
  99. package/dist/src/commands/benchmark.js +0 -460
  100. package/dist/src/commands/claims.d.ts +0 -10
  101. package/dist/src/commands/claims.js +0 -620
  102. package/dist/src/commands/cleanup.d.ts +0 -13
  103. package/dist/src/commands/cleanup.js +0 -250
  104. package/dist/src/commands/completions.d.ts +0 -10
  105. package/dist/src/commands/completions.js +0 -539
  106. package/dist/src/commands/config.d.ts +0 -8
  107. package/dist/src/commands/config.js +0 -428
  108. package/dist/src/commands/daemon.d.ts +0 -59
  109. package/dist/src/commands/daemon.js +0 -1733
  110. package/dist/src/commands/deployment.d.ts +0 -10
  111. package/dist/src/commands/deployment.js +0 -672
  112. package/dist/src/commands/doctor.d.ts +0 -10
  113. package/dist/src/commands/doctor.js +0 -1695
  114. package/dist/src/commands/eject.d.ts +0 -33
  115. package/dist/src/commands/eject.js +0 -195
  116. package/dist/src/commands/embeddings.d.ts +0 -18
  117. package/dist/src/commands/embeddings.js +0 -1623
  118. package/dist/src/commands/funnel.d.ts +0 -18
  119. package/dist/src/commands/funnel.js +0 -302
  120. package/dist/src/commands/gaia-bench.d.ts +0 -40
  121. package/dist/src/commands/gaia-bench.js +0 -597
  122. package/dist/src/commands/guidance.d.ts +0 -8
  123. package/dist/src/commands/guidance.js +0 -556
  124. package/dist/src/commands/hive-mind.d.ts +0 -11
  125. package/dist/src/commands/hive-mind.js +0 -1319
  126. package/dist/src/commands/hooks.d.ts +0 -8
  127. package/dist/src/commands/hooks.js +0 -4606
  128. package/dist/src/commands/index.d.ts +0 -118
  129. package/dist/src/commands/index.js +0 -364
  130. package/dist/src/commands/init.d.ts +0 -13
  131. package/dist/src/commands/init.js +0 -1297
  132. package/dist/src/commands/issues.d.ts +0 -21
  133. package/dist/src/commands/issues.js +0 -567
  134. package/dist/src/commands/mcp.d.ts +0 -11
  135. package/dist/src/commands/mcp.js +0 -732
  136. package/dist/src/commands/memory-backup.d.ts +0 -11
  137. package/dist/src/commands/memory-backup.js +0 -46
  138. package/dist/src/commands/memory-distill.d.ts +0 -27
  139. package/dist/src/commands/memory-distill.js +0 -374
  140. package/dist/src/commands/memory.d.ts +0 -8
  141. package/dist/src/commands/memory.js +0 -1596
  142. package/dist/src/commands/metaharness.d.ts +0 -39
  143. package/dist/src/commands/metaharness.js +0 -215
  144. package/dist/src/commands/migrate.d.ts +0 -8
  145. package/dist/src/commands/migrate.js +0 -742
  146. package/dist/src/commands/neural.d.ts +0 -10
  147. package/dist/src/commands/neural.js +0 -4331
  148. package/dist/src/commands/performance.d.ts +0 -10
  149. package/dist/src/commands/performance.js +0 -583
  150. package/dist/src/commands/plugins.d.ts +0 -11
  151. package/dist/src/commands/plugins.js +0 -826
  152. package/dist/src/commands/process.d.ts +0 -10
  153. package/dist/src/commands/process.js +0 -694
  154. package/dist/src/commands/progress.d.ts +0 -11
  155. package/dist/src/commands/progress.js +0 -259
  156. package/dist/src/commands/providers.d.ts +0 -10
  157. package/dist/src/commands/providers.js +0 -502
  158. package/dist/src/commands/proxy.d.ts +0 -21
  159. package/dist/src/commands/proxy.js +0 -310
  160. package/dist/src/commands/route.d.ts +0 -16
  161. package/dist/src/commands/route.js +0 -822
  162. package/dist/src/commands/ruvector/backup.d.ts +0 -11
  163. package/dist/src/commands/ruvector/backup.js +0 -747
  164. package/dist/src/commands/ruvector/benchmark.d.ts +0 -11
  165. package/dist/src/commands/ruvector/benchmark.js +0 -490
  166. package/dist/src/commands/ruvector/import.d.ts +0 -18
  167. package/dist/src/commands/ruvector/import.js +0 -373
  168. package/dist/src/commands/ruvector/index.d.ts +0 -29
  169. package/dist/src/commands/ruvector/index.js +0 -129
  170. package/dist/src/commands/ruvector/init.d.ts +0 -11
  171. package/dist/src/commands/ruvector/init.js +0 -467
  172. package/dist/src/commands/ruvector/migrate.d.ts +0 -11
  173. package/dist/src/commands/ruvector/migrate.js +0 -498
  174. package/dist/src/commands/ruvector/optimize.d.ts +0 -11
  175. package/dist/src/commands/ruvector/optimize.js +0 -505
  176. package/dist/src/commands/ruvector/pg-utils.d.ts +0 -14
  177. package/dist/src/commands/ruvector/pg-utils.js +0 -41
  178. package/dist/src/commands/ruvector/setup.d.ts +0 -18
  179. package/dist/src/commands/ruvector/setup.js +0 -765
  180. package/dist/src/commands/ruvector/status.d.ts +0 -11
  181. package/dist/src/commands/ruvector/status.js +0 -479
  182. package/dist/src/commands/security.d.ts +0 -10
  183. package/dist/src/commands/security.js +0 -1012
  184. package/dist/src/commands/session.d.ts +0 -8
  185. package/dist/src/commands/session.js +0 -757
  186. package/dist/src/commands/settings.d.ts +0 -19
  187. package/dist/src/commands/settings.js +0 -180
  188. package/dist/src/commands/spinner.d.ts +0 -16
  189. package/dist/src/commands/spinner.js +0 -329
  190. package/dist/src/commands/start.d.ts +0 -8
  191. package/dist/src/commands/start.js +0 -418
  192. package/dist/src/commands/status.d.ts +0 -8
  193. package/dist/src/commands/status.js +0 -608
  194. package/dist/src/commands/swarm.d.ts +0 -8
  195. package/dist/src/commands/swarm.js +0 -891
  196. package/dist/src/commands/task.d.ts +0 -8
  197. package/dist/src/commands/task.js +0 -675
  198. package/dist/src/commands/transfer-store.d.ts +0 -13
  199. package/dist/src/commands/transfer-store.js +0 -428
  200. package/dist/src/commands/update.d.ts +0 -8
  201. package/dist/src/commands/update.js +0 -276
  202. package/dist/src/commands/verify.d.ts +0 -19
  203. package/dist/src/commands/verify.js +0 -261
  204. package/dist/src/commands/version.d.ts +0 -42
  205. package/dist/src/commands/version.js +0 -106
  206. package/dist/src/commands/workflow.d.ts +0 -8
  207. package/dist/src/commands/workflow.js +0 -617
  208. package/dist/src/config/harness-feedback-applier.d.ts +0 -50
  209. package/dist/src/config/harness-feedback-applier.js +0 -122
  210. package/dist/src/config/proven-config-refresh.d.ts +0 -39
  211. package/dist/src/config/proven-config-refresh.js +0 -154
  212. package/dist/src/config/proven-config-rvfa.d.ts +0 -23
  213. package/dist/src/config/proven-config-rvfa.js +0 -73
  214. package/dist/src/config/proven-config.d.ts +0 -86
  215. package/dist/src/config/proven-config.js +0 -176
  216. package/dist/src/config-adapter.d.ts +0 -15
  217. package/dist/src/config-adapter.js +0 -186
  218. package/dist/src/encryption/vault.d.ts +0 -94
  219. package/dist/src/encryption/vault.js +0 -172
  220. package/dist/src/fs-secure.d.ts +0 -86
  221. package/dist/src/fs-secure.js +0 -133
  222. package/dist/src/funnel/advisor-tip.d.ts +0 -58
  223. package/dist/src/funnel/advisor-tip.js +0 -92
  224. package/dist/src/funnel/attribution.d.ts +0 -37
  225. package/dist/src/funnel/attribution.js +0 -101
  226. package/dist/src/funnel/consent.d.ts +0 -22
  227. package/dist/src/funnel/consent.js +0 -58
  228. package/dist/src/funnel/credit-errors.d.ts +0 -31
  229. package/dist/src/funnel/credit-errors.js +0 -88
  230. package/dist/src/funnel/credit-notifier.d.ts +0 -44
  231. package/dist/src/funnel/credit-notifier.js +0 -74
  232. package/dist/src/funnel/disclosure.d.ts +0 -47
  233. package/dist/src/funnel/disclosure.js +0 -109
  234. package/dist/src/funnel/enrollment.d.ts +0 -36
  235. package/dist/src/funnel/enrollment.js +0 -64
  236. package/dist/src/funnel/environment.d.ts +0 -17
  237. package/dist/src/funnel/environment.js +0 -39
  238. package/dist/src/funnel/event-transport.d.ts +0 -51
  239. package/dist/src/funnel/event-transport.js +0 -199
  240. package/dist/src/funnel/events.d.ts +0 -42
  241. package/dist/src/funnel/events.js +0 -150
  242. package/dist/src/funnel/index.d.ts +0 -21
  243. package/dist/src/funnel/index.js +0 -21
  244. package/dist/src/funnel/insights.d.ts +0 -50
  245. package/dist/src/funnel/insights.js +0 -120
  246. package/dist/src/funnel/local-signals.d.ts +0 -20
  247. package/dist/src/funnel/local-signals.js +0 -77
  248. package/dist/src/funnel/message-transport.d.ts +0 -51
  249. package/dist/src/funnel/message-transport.js +0 -149
  250. package/dist/src/funnel/messages.d.ts +0 -55
  251. package/dist/src/funnel/messages.js +0 -160
  252. package/dist/src/funnel/payout.d.ts +0 -40
  253. package/dist/src/funnel/payout.js +0 -60
  254. package/dist/src/funnel/power-saver-notifier.d.ts +0 -44
  255. package/dist/src/funnel/power-saver-notifier.js +0 -92
  256. package/dist/src/funnel/precedence.d.ts +0 -16
  257. package/dist/src/funnel/precedence.js +0 -85
  258. package/dist/src/funnel/promo.d.ts +0 -41
  259. package/dist/src/funnel/promo.js +0 -144
  260. package/dist/src/funnel/rate-limit-notifier.d.ts +0 -55
  261. package/dist/src/funnel/rate-limit-notifier.js +0 -102
  262. package/dist/src/funnel/rotation.d.ts +0 -19
  263. package/dist/src/funnel/rotation.js +0 -70
  264. package/dist/src/funnel/state.d.ts +0 -13
  265. package/dist/src/funnel/state.js +0 -52
  266. package/dist/src/funnel/toggle-cooldown.d.ts +0 -17
  267. package/dist/src/funnel/toggle-cooldown.js +0 -32
  268. package/dist/src/funnel/types.d.ts +0 -98
  269. package/dist/src/funnel/types.js +0 -26
  270. package/dist/src/index.d.ts +0 -81
  271. package/dist/src/index.js +0 -609
  272. package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
  273. package/dist/src/infrastructure/in-memory-repositories.js +0 -264
  274. package/dist/src/init/claudemd-generator.d.ts +0 -16
  275. package/dist/src/init/claudemd-generator.js +0 -368
  276. package/dist/src/init/executor.d.ts +0 -41
  277. package/dist/src/init/executor.js +0 -2142
  278. package/dist/src/init/helper-refresh.d.ts +0 -79
  279. package/dist/src/init/helper-refresh.js +0 -347
  280. package/dist/src/init/helper-signing.d.ts +0 -37
  281. package/dist/src/init/helper-signing.js +0 -67
  282. package/dist/src/init/helpers-generator.d.ts +0 -87
  283. package/dist/src/init/helpers-generator.js +0 -1456
  284. package/dist/src/init/index.d.ts +0 -13
  285. package/dist/src/init/index.js +0 -15
  286. package/dist/src/init/mcp-generator.d.ts +0 -26
  287. package/dist/src/init/mcp-generator.js +0 -126
  288. package/dist/src/init/memory-package-resolver.d.ts +0 -53
  289. package/dist/src/init/memory-package-resolver.js +0 -118
  290. package/dist/src/init/settings-generator.d.ts +0 -14
  291. package/dist/src/init/settings-generator.js +0 -462
  292. package/dist/src/init/statusline-generator.d.ts +0 -28
  293. package/dist/src/init/statusline-generator.js +0 -177
  294. package/dist/src/init/types.d.ts +0 -331
  295. package/dist/src/init/types.js +0 -276
  296. package/dist/src/log-filters.d.ts +0 -46
  297. package/dist/src/log-filters.js +0 -107
  298. package/dist/src/mcp-client.d.ts +0 -92
  299. package/dist/src/mcp-client.js +0 -397
  300. package/dist/src/mcp-server.d.ts +0 -163
  301. package/dist/src/mcp-server.js +0 -751
  302. package/dist/src/mcp-tools/agent-execute-core.d.ts +0 -115
  303. package/dist/src/mcp-tools/agent-execute-core.js +0 -587
  304. package/dist/src/mcp-tools/agent-tools.d.ts +0 -9
  305. package/dist/src/mcp-tools/agent-tools.js +0 -837
  306. package/dist/src/mcp-tools/agentbbs-tools.d.ts +0 -28
  307. package/dist/src/mcp-tools/agentbbs-tools.js +0 -394
  308. package/dist/src/mcp-tools/agentdb-tools.d.ts +0 -35
  309. package/dist/src/mcp-tools/agentdb-tools.js +0 -1473
  310. package/dist/src/mcp-tools/agenticow-loader.d.ts +0 -59
  311. package/dist/src/mcp-tools/agenticow-loader.js +0 -105
  312. package/dist/src/mcp-tools/agenticow-speculate-tools.d.ts +0 -24
  313. package/dist/src/mcp-tools/agenticow-speculate-tools.js +0 -209
  314. package/dist/src/mcp-tools/agenticow-tools.d.ts +0 -36
  315. package/dist/src/mcp-tools/agenticow-tools.js +0 -360
  316. package/dist/src/mcp-tools/analyze-tools.d.ts +0 -38
  317. package/dist/src/mcp-tools/analyze-tools.js +0 -346
  318. package/dist/src/mcp-tools/auto-install.d.ts +0 -83
  319. package/dist/src/mcp-tools/auto-install.js +0 -131
  320. package/dist/src/mcp-tools/autopilot-tools.d.ts +0 -12
  321. package/dist/src/mcp-tools/autopilot-tools.js +0 -231
  322. package/dist/src/mcp-tools/browser-intent-tools.d.ts +0 -162
  323. package/dist/src/mcp-tools/browser-intent-tools.js +0 -548
  324. package/dist/src/mcp-tools/browser-session-tools.d.ts +0 -27
  325. package/dist/src/mcp-tools/browser-session-tools.js +0 -398
  326. package/dist/src/mcp-tools/browser-tools.d.ts +0 -21
  327. package/dist/src/mcp-tools/browser-tools.js +0 -760
  328. package/dist/src/mcp-tools/business-pod-tools.d.ts +0 -20
  329. package/dist/src/mcp-tools/business-pod-tools.js +0 -169
  330. package/dist/src/mcp-tools/claims-tools.d.ts +0 -12
  331. package/dist/src/mcp-tools/claims-tools.js +0 -863
  332. package/dist/src/mcp-tools/config-tools.d.ts +0 -8
  333. package/dist/src/mcp-tools/config-tools.js +0 -411
  334. package/dist/src/mcp-tools/coordination-tools.d.ts +0 -13
  335. package/dist/src/mcp-tools/coordination-tools.js +0 -729
  336. package/dist/src/mcp-tools/daa-tools.d.ts +0 -13
  337. package/dist/src/mcp-tools/daa-tools.js +0 -534
  338. package/dist/src/mcp-tools/embeddings-tools.d.ts +0 -9
  339. package/dist/src/mcp-tools/embeddings-tools.js +0 -904
  340. package/dist/src/mcp-tools/github-tools.d.ts +0 -9
  341. package/dist/src/mcp-tools/github-tools.js +0 -659
  342. package/dist/src/mcp-tools/guidance-tools.d.ts +0 -15
  343. package/dist/src/mcp-tools/guidance-tools.js +0 -639
  344. package/dist/src/mcp-tools/hive-mind-tools.d.ts +0 -8
  345. package/dist/src/mcp-tools/hive-mind-tools.js +0 -953
  346. package/dist/src/mcp-tools/hooks-tools.d.ts +0 -65
  347. package/dist/src/mcp-tools/hooks-tools.js +0 -4836
  348. package/dist/src/mcp-tools/http-fetch-tools.d.ts +0 -55
  349. package/dist/src/mcp-tools/http-fetch-tools.js +0 -329
  350. package/dist/src/mcp-tools/index.d.ts +0 -34
  351. package/dist/src/mcp-tools/index.js +0 -40
  352. package/dist/src/mcp-tools/managed-agent-tools.d.ts +0 -22
  353. package/dist/src/mcp-tools/managed-agent-tools.js +0 -357
  354. package/dist/src/mcp-tools/memory-tools.d.ts +0 -14
  355. package/dist/src/mcp-tools/memory-tools.js +0 -1330
  356. package/dist/src/mcp-tools/metaharness-tools.d.ts +0 -51
  357. package/dist/src/mcp-tools/metaharness-tools.js +0 -684
  358. package/dist/src/mcp-tools/neural-tools.d.ts +0 -54
  359. package/dist/src/mcp-tools/neural-tools.js +0 -1168
  360. package/dist/src/mcp-tools/performance-tools.d.ts +0 -16
  361. package/dist/src/mcp-tools/performance-tools.js +0 -675
  362. package/dist/src/mcp-tools/progress-tools.d.ts +0 -14
  363. package/dist/src/mcp-tools/progress-tools.js +0 -348
  364. package/dist/src/mcp-tools/request-tracker.d.ts +0 -17
  365. package/dist/src/mcp-tools/request-tracker.js +0 -27
  366. package/dist/src/mcp-tools/ruvllm-tools.d.ts +0 -9
  367. package/dist/src/mcp-tools/ruvllm-tools.js +0 -355
  368. package/dist/src/mcp-tools/security-tools.d.ts +0 -18
  369. package/dist/src/mcp-tools/security-tools.js +0 -556
  370. package/dist/src/mcp-tools/session-tools.d.ts +0 -8
  371. package/dist/src/mcp-tools/session-tools.js +0 -517
  372. package/dist/src/mcp-tools/swarm-tools.d.ts +0 -37
  373. package/dist/src/mcp-tools/swarm-tools.js +0 -390
  374. package/dist/src/mcp-tools/system-tools.d.ts +0 -13
  375. package/dist/src/mcp-tools/system-tools.js +0 -688
  376. package/dist/src/mcp-tools/task-tools.d.ts +0 -8
  377. package/dist/src/mcp-tools/task-tools.js +0 -487
  378. package/dist/src/mcp-tools/terminal-tools.d.ts +0 -8
  379. package/dist/src/mcp-tools/terminal-tools.js +0 -306
  380. package/dist/src/mcp-tools/testgen-tools.d.ts +0 -26
  381. package/dist/src/mcp-tools/testgen-tools.js +0 -168
  382. package/dist/src/mcp-tools/tool-loop-guardrail.d.ts +0 -31
  383. package/dist/src/mcp-tools/tool-loop-guardrail.js +0 -71
  384. package/dist/src/mcp-tools/transfer-tools.d.ts +0 -14
  385. package/dist/src/mcp-tools/transfer-tools.js +0 -447
  386. package/dist/src/mcp-tools/types.d.ts +0 -8
  387. package/dist/src/mcp-tools/types.js +0 -8
  388. package/dist/src/mcp-tools/validate-input.d.ts +0 -9
  389. package/dist/src/mcp-tools/validate-input.js +0 -9
  390. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +0 -13
  391. package/dist/src/mcp-tools/wasm-agent-tools.js +0 -840
  392. package/dist/src/mcp-tools/workflow-tools.d.ts +0 -8
  393. package/dist/src/mcp-tools/workflow-tools.js +0 -884
  394. package/dist/src/memory/bge-embedder.d.ts +0 -25
  395. package/dist/src/memory/bge-embedder.js +0 -121
  396. package/dist/src/memory/cross-encoder-rerank.d.ts +0 -33
  397. package/dist/src/memory/cross-encoder-rerank.js +0 -123
  398. package/dist/src/memory/embedding-policy.d.ts +0 -21
  399. package/dist/src/memory/embedding-policy.js +0 -30
  400. package/dist/src/memory/embedding-quantization.d.ts +0 -62
  401. package/dist/src/memory/embedding-quantization.js +0 -156
  402. package/dist/src/memory/ewc-consolidation.d.ts +0 -305
  403. package/dist/src/memory/ewc-consolidation.js +0 -611
  404. package/dist/src/memory/graph-edge-writer.d.ts +0 -95
  405. package/dist/src/memory/graph-edge-writer.js +0 -217
  406. package/dist/src/memory/hybrid-retrieval.d.ts +0 -77
  407. package/dist/src/memory/hybrid-retrieval.js +0 -192
  408. package/dist/src/memory/intelligence.d.ts +0 -405
  409. package/dist/src/memory/intelligence.js +0 -1316
  410. package/dist/src/memory/lucene-bm25.d.ts +0 -19
  411. package/dist/src/memory/lucene-bm25.js +0 -308
  412. package/dist/src/memory/memory-bridge.d.ts +0 -537
  413. package/dist/src/memory/memory-bridge.js +0 -2460
  414. package/dist/src/memory/memory-initializer.d.ts +0 -556
  415. package/dist/src/memory/memory-initializer.js +0 -3021
  416. package/dist/src/memory/neural-package-bridge.d.ts +0 -48
  417. package/dist/src/memory/neural-package-bridge.js +0 -87
  418. package/dist/src/memory/rabitq-index.d.ts +0 -60
  419. package/dist/src/memory/rabitq-index.js +0 -242
  420. package/dist/src/memory/sona-optimizer.d.ts +0 -267
  421. package/dist/src/memory/sona-optimizer.js +0 -779
  422. package/dist/src/memory/structured-distill.d.ts +0 -48
  423. package/dist/src/memory/structured-distill.js +0 -125
  424. package/dist/src/output.d.ts +0 -9
  425. package/dist/src/output.js +0 -9
  426. package/dist/src/parser.d.ts +0 -89
  427. package/dist/src/parser.js +0 -516
  428. package/dist/src/plugins/manager.d.ts +0 -133
  429. package/dist/src/plugins/manager.js +0 -415
  430. package/dist/src/plugins/store/discovery.d.ts +0 -99
  431. package/dist/src/plugins/store/discovery.js +0 -1224
  432. package/dist/src/plugins/store/index.d.ts +0 -76
  433. package/dist/src/plugins/store/index.js +0 -141
  434. package/dist/src/plugins/store/search.d.ts +0 -46
  435. package/dist/src/plugins/store/search.js +0 -230
  436. package/dist/src/plugins/store/types.d.ts +0 -279
  437. package/dist/src/plugins/store/types.js +0 -7
  438. package/dist/src/plugins/tests/demo-plugin-store.d.ts +0 -7
  439. package/dist/src/plugins/tests/demo-plugin-store.js +0 -126
  440. package/dist/src/plugins/tests/standalone-test.d.ts +0 -12
  441. package/dist/src/plugins/tests/standalone-test.js +0 -188
  442. package/dist/src/plugins/tests/test-plugin-store.d.ts +0 -7
  443. package/dist/src/plugins/tests/test-plugin-store.js +0 -206
  444. package/dist/src/production/circuit-breaker.d.ts +0 -101
  445. package/dist/src/production/circuit-breaker.js +0 -241
  446. package/dist/src/production/error-handler.d.ts +0 -92
  447. package/dist/src/production/error-handler.js +0 -299
  448. package/dist/src/production/index.d.ts +0 -23
  449. package/dist/src/production/index.js +0 -18
  450. package/dist/src/production/monitoring.d.ts +0 -161
  451. package/dist/src/production/monitoring.js +0 -356
  452. package/dist/src/production/rate-limiter.d.ts +0 -80
  453. package/dist/src/production/rate-limiter.js +0 -201
  454. package/dist/src/production/retry.d.ts +0 -48
  455. package/dist/src/production/retry.js +0 -179
  456. package/dist/src/prompt.d.ts +0 -44
  457. package/dist/src/prompt.js +0 -501
  458. package/dist/src/runtime/headless.d.ts +0 -60
  459. package/dist/src/runtime/headless.js +0 -284
  460. package/dist/src/runtime/parent-death-watchdog.d.ts +0 -42
  461. package/dist/src/runtime/parent-death-watchdog.js +0 -70
  462. package/dist/src/ruvector/agent-wasm.d.ts +0 -228
  463. package/dist/src/ruvector/agent-wasm.js +0 -463
  464. package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
  465. package/dist/src/ruvector/ast-analyzer.js +0 -277
  466. package/dist/src/ruvector/codemods/engine.d.ts +0 -45
  467. package/dist/src/ruvector/codemods/engine.js +0 -291
  468. package/dist/src/ruvector/codemods/scope-analysis.d.ts +0 -29
  469. package/dist/src/ruvector/codemods/scope-analysis.js +0 -162
  470. package/dist/src/ruvector/coverage-router.d.ts +0 -160
  471. package/dist/src/ruvector/coverage-router.js +0 -531
  472. package/dist/src/ruvector/coverage-tools.d.ts +0 -33
  473. package/dist/src/ruvector/coverage-tools.js +0 -157
  474. package/dist/src/ruvector/diff-classifier.d.ts +0 -175
  475. package/dist/src/ruvector/diff-classifier.js +0 -699
  476. package/dist/src/ruvector/diskann-backend.d.ts +0 -78
  477. package/dist/src/ruvector/diskann-backend.js +0 -310
  478. package/dist/src/ruvector/enhanced-model-router.d.ts +0 -172
  479. package/dist/src/ruvector/enhanced-model-router.js +0 -577
  480. package/dist/src/ruvector/graph-analyzer.d.ts +0 -187
  481. package/dist/src/ruvector/graph-analyzer.js +0 -929
  482. package/dist/src/ruvector/graph-backend.d.ts +0 -79
  483. package/dist/src/ruvector/graph-backend.js +0 -220
  484. package/dist/src/ruvector/index.d.ts +0 -38
  485. package/dist/src/ruvector/index.js +0 -86
  486. package/dist/src/ruvector/lora-adapter.d.ts +0 -292
  487. package/dist/src/ruvector/lora-adapter.js +0 -710
  488. package/dist/src/ruvector/model-prices.d.ts +0 -50
  489. package/dist/src/ruvector/model-prices.js +0 -72
  490. package/dist/src/ruvector/model-router.d.ts +0 -408
  491. package/dist/src/ruvector/model-router.js +0 -1162
  492. package/dist/src/ruvector/neural-router.d.ts +0 -182
  493. package/dist/src/ruvector/neural-router.js +0 -825
  494. package/dist/src/ruvector/output-verifier.d.ts +0 -83
  495. package/dist/src/ruvector/output-verifier.js +0 -277
  496. package/dist/src/ruvector/q-learning-router.d.ts +0 -227
  497. package/dist/src/ruvector/q-learning-router.js +0 -721
  498. package/dist/src/ruvector/router-calibrator.d.ts +0 -65
  499. package/dist/src/ruvector/router-calibrator.js +0 -120
  500. package/dist/src/ruvector/router-parallel-recorder.d.ts +0 -127
  501. package/dist/src/ruvector/router-parallel-recorder.js +0 -183
  502. package/dist/src/ruvector/router-trajectory.d.ts +0 -194
  503. package/dist/src/ruvector/router-trajectory.js +0 -281
  504. package/dist/src/ruvector/run-transcript-recorder.d.ts +0 -154
  505. package/dist/src/ruvector/run-transcript-recorder.js +0 -209
  506. package/dist/src/ruvector/ruvllm-wasm.d.ts +0 -179
  507. package/dist/src/ruvector/ruvllm-wasm.js +0 -379
  508. package/dist/src/ruvector/semantic-router.d.ts +0 -77
  509. package/dist/src/ruvector/semantic-router.js +0 -178
  510. package/dist/src/ruvector/task-embedder.d.ts +0 -56
  511. package/dist/src/ruvector/task-embedder.js +0 -237
  512. package/dist/src/ruvector/trajectory-tree.d.ts +0 -113
  513. package/dist/src/ruvector/trajectory-tree.js +0 -237
  514. package/dist/src/ruvector/vector-db.d.ts +0 -73
  515. package/dist/src/ruvector/vector-db.js +0 -301
  516. package/dist/src/ruvector/wasm-embedder.d.ts +0 -13
  517. package/dist/src/ruvector/wasm-embedder.js +0 -143
  518. package/dist/src/security/builtin-aidefence.d.ts +0 -34
  519. package/dist/src/security/builtin-aidefence.js +0 -86
  520. package/dist/src/services/agentic-flow-bridge.d.ts +0 -50
  521. package/dist/src/services/agentic-flow-bridge.js +0 -95
  522. package/dist/src/services/ai-job-dedup.d.ts +0 -61
  523. package/dist/src/services/ai-job-dedup.js +0 -136
  524. package/dist/src/services/checkpoint-gate.d.ts +0 -140
  525. package/dist/src/services/checkpoint-gate.js +0 -223
  526. package/dist/src/services/claim-service.d.ts +0 -204
  527. package/dist/src/services/claim-service.js +0 -818
  528. package/dist/src/services/config-file-manager.d.ts +0 -37
  529. package/dist/src/services/config-file-manager.js +0 -224
  530. package/dist/src/services/container-worker-pool.d.ts +0 -204
  531. package/dist/src/services/container-worker-pool.js +0 -589
  532. package/dist/src/services/daemon-autostart.d.ts +0 -17
  533. package/dist/src/services/daemon-autostart.js +0 -102
  534. package/dist/src/services/distill-oracle.d.ts +0 -190
  535. package/dist/src/services/distill-oracle.js +0 -349
  536. package/dist/src/services/distill-tuning.d.ts +0 -111
  537. package/dist/src/services/distill-tuning.js +0 -510
  538. package/dist/src/services/evolve-proof.d.ts +0 -253
  539. package/dist/src/services/evolve-proof.js +0 -343
  540. package/dist/src/services/fable-harness.d.ts +0 -208
  541. package/dist/src/services/fable-harness.js +0 -388
  542. package/dist/src/services/git-workspace-identity.d.ts +0 -42
  543. package/dist/src/services/git-workspace-identity.js +0 -99
  544. package/dist/src/services/global-ai-budget.d.ts +0 -135
  545. package/dist/src/services/global-ai-budget.js +0 -415
  546. package/dist/src/services/harness-benchmark.d.ts +0 -68
  547. package/dist/src/services/harness-benchmark.js +0 -94
  548. package/dist/src/services/harness-canary.d.ts +0 -60
  549. package/dist/src/services/harness-canary.js +0 -69
  550. package/dist/src/services/harness-corpus-harvester.d.ts +0 -51
  551. package/dist/src/services/harness-corpus-harvester.js +0 -74
  552. package/dist/src/services/harness-flywheel-generations.d.ts +0 -115
  553. package/dist/src/services/harness-flywheel-generations.js +0 -360
  554. package/dist/src/services/harness-flywheel-runtime.d.ts +0 -25
  555. package/dist/src/services/harness-flywheel-runtime.js +0 -92
  556. package/dist/src/services/harness-flywheel.d.ts +0 -48
  557. package/dist/src/services/harness-flywheel.js +0 -207
  558. package/dist/src/services/harness-frozen-eval.d.ts +0 -22
  559. package/dist/src/services/harness-frozen-eval.js +0 -66
  560. package/dist/src/services/harness-hosts.d.ts +0 -40
  561. package/dist/src/services/harness-hosts.js +0 -88
  562. package/dist/src/services/harness-improvement-ledger.d.ts +0 -63
  563. package/dist/src/services/harness-improvement-ledger.js +0 -101
  564. package/dist/src/services/harness-loop.d.ts +0 -53
  565. package/dist/src/services/harness-loop.js +0 -85
  566. package/dist/src/services/harness-qualification.d.ts +0 -66
  567. package/dist/src/services/harness-qualification.js +0 -143
  568. package/dist/src/services/harness-replay.d.ts +0 -37
  569. package/dist/src/services/harness-replay.js +0 -92
  570. package/dist/src/services/harness-verify.d.ts +0 -33
  571. package/dist/src/services/harness-verify.js +0 -26
  572. package/dist/src/services/harness-worker.d.ts +0 -23
  573. package/dist/src/services/harness-worker.js +0 -66
  574. package/dist/src/services/headless-worker-executor.d.ts +0 -358
  575. package/dist/src/services/headless-worker-executor.js +0 -1269
  576. package/dist/src/services/index.d.ts +0 -13
  577. package/dist/src/services/index.js +0 -11
  578. package/dist/src/services/memory-backup.d.ts +0 -53
  579. package/dist/src/services/memory-backup.js +0 -198
  580. package/dist/src/services/memory-distillation.d.ts +0 -41
  581. package/dist/src/services/memory-distillation.js +0 -277
  582. package/dist/src/services/native-training.d.ts +0 -68
  583. package/dist/src/services/native-training.js +0 -141
  584. package/dist/src/services/registry-api.d.ts +0 -58
  585. package/dist/src/services/registry-api.js +0 -146
  586. package/dist/src/services/repo-supervisor.d.ts +0 -70
  587. package/dist/src/services/repo-supervisor.js +0 -228
  588. package/dist/src/services/ruvector-training.d.ts +0 -222
  589. package/dist/src/services/ruvector-training.js +0 -693
  590. package/dist/src/services/swarm-memory-branches.d.ts +0 -135
  591. package/dist/src/services/swarm-memory-branches.js +0 -213
  592. package/dist/src/services/weight-eft.d.ts +0 -305
  593. package/dist/src/services/weight-eft.js +0 -296
  594. package/dist/src/services/worker-daemon.d.ts +0 -439
  595. package/dist/src/services/worker-daemon.js +0 -1865
  596. package/dist/src/services/worker-queue.d.ts +0 -194
  597. package/dist/src/services/worker-queue.js +0 -513
  598. package/dist/src/services/workspace-lease.d.ts +0 -55
  599. package/dist/src/services/workspace-lease.js +0 -191
  600. package/dist/src/suggest.d.ts +0 -53
  601. package/dist/src/suggest.js +0 -200
  602. package/dist/src/transfer/anonymization/index.d.ts +0 -25
  603. package/dist/src/transfer/anonymization/index.js +0 -175
  604. package/dist/src/transfer/deploy-seraphine.d.ts +0 -13
  605. package/dist/src/transfer/deploy-seraphine.js +0 -205
  606. package/dist/src/transfer/export.d.ts +0 -25
  607. package/dist/src/transfer/export.js +0 -113
  608. package/dist/src/transfer/index.d.ts +0 -12
  609. package/dist/src/transfer/index.js +0 -31
  610. package/dist/src/transfer/ipfs/client.d.ts +0 -109
  611. package/dist/src/transfer/ipfs/client.js +0 -307
  612. package/dist/src/transfer/ipfs/upload.d.ts +0 -95
  613. package/dist/src/transfer/ipfs/upload.js +0 -413
  614. package/dist/src/transfer/models/seraphine.d.ts +0 -72
  615. package/dist/src/transfer/models/seraphine.js +0 -373
  616. package/dist/src/transfer/serialization/cfp.d.ts +0 -49
  617. package/dist/src/transfer/serialization/cfp.js +0 -183
  618. package/dist/src/transfer/storage/gcs.d.ts +0 -82
  619. package/dist/src/transfer/storage/gcs.js +0 -272
  620. package/dist/src/transfer/storage/index.d.ts +0 -6
  621. package/dist/src/transfer/storage/index.js +0 -6
  622. package/dist/src/transfer/store/discovery.d.ts +0 -84
  623. package/dist/src/transfer/store/discovery.js +0 -382
  624. package/dist/src/transfer/store/download.d.ts +0 -70
  625. package/dist/src/transfer/store/download.js +0 -334
  626. package/dist/src/transfer/store/index.d.ts +0 -84
  627. package/dist/src/transfer/store/index.js +0 -153
  628. package/dist/src/transfer/store/publish.d.ts +0 -76
  629. package/dist/src/transfer/store/publish.js +0 -294
  630. package/dist/src/transfer/store/registry.d.ts +0 -58
  631. package/dist/src/transfer/store/registry.js +0 -285
  632. package/dist/src/transfer/store/search.d.ts +0 -54
  633. package/dist/src/transfer/store/search.js +0 -232
  634. package/dist/src/transfer/store/tests/standalone-test.d.ts +0 -12
  635. package/dist/src/transfer/store/tests/standalone-test.js +0 -190
  636. package/dist/src/transfer/store/types.d.ts +0 -193
  637. package/dist/src/transfer/store/types.js +0 -6
  638. package/dist/src/transfer/test-seraphine.d.ts +0 -6
  639. package/dist/src/transfer/test-seraphine.js +0 -105
  640. package/dist/src/transfer/tests/test-store.d.ts +0 -7
  641. package/dist/src/transfer/tests/test-store.js +0 -214
  642. package/dist/src/transfer/types.d.ts +0 -245
  643. package/dist/src/transfer/types.js +0 -6
  644. package/dist/src/types.d.ts +0 -13
  645. package/dist/src/types.js +0 -13
  646. package/dist/src/update/checker.d.ts +0 -34
  647. package/dist/src/update/checker.js +0 -191
  648. package/dist/src/update/executor.d.ts +0 -33
  649. package/dist/src/update/executor.js +0 -217
  650. package/dist/src/update/index.d.ts +0 -33
  651. package/dist/src/update/index.js +0 -64
  652. package/dist/src/update/rate-limiter.d.ts +0 -20
  653. package/dist/src/update/rate-limiter.js +0 -96
  654. package/dist/src/update/validator.d.ts +0 -17
  655. package/dist/src/update/validator.js +0 -123
@@ -1,825 +0,0 @@
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