agent-nuvira 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +891 -0
  3. package/dist/agent-sdk/src/agent.d.ts +118 -0
  4. package/dist/agent-sdk/src/agent.d.ts.map +1 -0
  5. package/dist/agent-sdk/src/agent.js +88 -0
  6. package/dist/agent-sdk/src/agent.js.map +1 -0
  7. package/dist/agent-sdk/src/index.d.ts +33 -0
  8. package/dist/agent-sdk/src/index.d.ts.map +1 -0
  9. package/dist/agent-sdk/src/index.js +32 -0
  10. package/dist/agent-sdk/src/index.js.map +1 -0
  11. package/dist/agent-sdk/src/register.d.ts +70 -0
  12. package/dist/agent-sdk/src/register.d.ts.map +1 -0
  13. package/dist/agent-sdk/src/register.js +181 -0
  14. package/dist/agent-sdk/src/register.js.map +1 -0
  15. package/dist/agent-sdk/src/scaffold.d.ts +50 -0
  16. package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
  17. package/dist/agent-sdk/src/scaffold.js +291 -0
  18. package/dist/agent-sdk/src/scaffold.js.map +1 -0
  19. package/dist/agent-sdk/src/testing.d.ts +187 -0
  20. package/dist/agent-sdk/src/testing.d.ts.map +1 -0
  21. package/dist/agent-sdk/src/testing.js +243 -0
  22. package/dist/agent-sdk/src/testing.js.map +1 -0
  23. package/dist/agent-sdk/src/types.d.ts +202 -0
  24. package/dist/agent-sdk/src/types.d.ts.map +1 -0
  25. package/dist/agent-sdk/src/types.js +11 -0
  26. package/dist/agent-sdk/src/types.js.map +1 -0
  27. package/dist/agents/agent.d.ts +132 -0
  28. package/dist/agents/agent.d.ts.map +1 -0
  29. package/dist/agents/agent.js +19 -0
  30. package/dist/agents/agent.js.map +1 -0
  31. package/dist/agents/agents/context-gatherer.d.ts +42 -0
  32. package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
  33. package/dist/agents/agents/context-gatherer.js +366 -0
  34. package/dist/agents/agents/context-gatherer.js.map +1 -0
  35. package/dist/agents/agents/debugger.d.ts +58 -0
  36. package/dist/agents/agents/debugger.d.ts.map +1 -0
  37. package/dist/agents/agents/debugger.js +257 -0
  38. package/dist/agents/agents/debugger.js.map +1 -0
  39. package/dist/agents/agents/git-agent.d.ts +34 -0
  40. package/dist/agents/agents/git-agent.d.ts.map +1 -0
  41. package/dist/agents/agents/git-agent.js +200 -0
  42. package/dist/agents/agents/git-agent.js.map +1 -0
  43. package/dist/agents/agents/github-release-agent.d.ts +65 -0
  44. package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
  45. package/dist/agents/agents/github-release-agent.js +439 -0
  46. package/dist/agents/agents/github-release-agent.js.map +1 -0
  47. package/dist/agents/agents/package-agent.d.ts +33 -0
  48. package/dist/agents/agents/package-agent.d.ts.map +1 -0
  49. package/dist/agents/agents/package-agent.js +233 -0
  50. package/dist/agents/agents/package-agent.js.map +1 -0
  51. package/dist/agents/agents/planner.d.ts +26 -0
  52. package/dist/agents/agents/planner.d.ts.map +1 -0
  53. package/dist/agents/agents/planner.js +222 -0
  54. package/dist/agents/agents/planner.js.map +1 -0
  55. package/dist/agents/agents/reviewer.d.ts +34 -0
  56. package/dist/agents/agents/reviewer.d.ts.map +1 -0
  57. package/dist/agents/agents/reviewer.js +159 -0
  58. package/dist/agents/agents/reviewer.js.map +1 -0
  59. package/dist/agents/agents/runner.d.ts +73 -0
  60. package/dist/agents/agents/runner.d.ts.map +1 -0
  61. package/dist/agents/agents/runner.js +299 -0
  62. package/dist/agents/agents/runner.js.map +1 -0
  63. package/dist/agents/agents/security-agent.d.ts +33 -0
  64. package/dist/agents/agents/security-agent.d.ts.map +1 -0
  65. package/dist/agents/agents/security-agent.js +184 -0
  66. package/dist/agents/agents/security-agent.js.map +1 -0
  67. package/dist/agents/agents/tester.d.ts +96 -0
  68. package/dist/agents/agents/tester.d.ts.map +1 -0
  69. package/dist/agents/agents/tester.js +410 -0
  70. package/dist/agents/agents/tester.js.map +1 -0
  71. package/dist/agents/agents/writer.d.ts +51 -0
  72. package/dist/agents/agents/writer.d.ts.map +1 -0
  73. package/dist/agents/agents/writer.js +384 -0
  74. package/dist/agents/agents/writer.js.map +1 -0
  75. package/dist/agents/context-vault.d.ts +49 -0
  76. package/dist/agents/context-vault.d.ts.map +1 -0
  77. package/dist/agents/context-vault.js +134 -0
  78. package/dist/agents/context-vault.js.map +1 -0
  79. package/dist/agents/orchestrator.d.ts +97 -0
  80. package/dist/agents/orchestrator.d.ts.map +1 -0
  81. package/dist/agents/orchestrator.js +696 -0
  82. package/dist/agents/orchestrator.js.map +1 -0
  83. package/dist/agents/utils/file-tree.d.ts +28 -0
  84. package/dist/agents/utils/file-tree.d.ts.map +1 -0
  85. package/dist/agents/utils/file-tree.js +93 -0
  86. package/dist/agents/utils/file-tree.js.map +1 -0
  87. package/dist/cli/agent.d.ts +25 -0
  88. package/dist/cli/agent.d.ts.map +1 -0
  89. package/dist/cli/agent.js +374 -0
  90. package/dist/cli/agent.js.map +1 -0
  91. package/dist/cli/benchmark.d.ts +24 -0
  92. package/dist/cli/benchmark.d.ts.map +1 -0
  93. package/dist/cli/benchmark.js +235 -0
  94. package/dist/cli/benchmark.js.map +1 -0
  95. package/dist/cli/cache.d.ts +12 -0
  96. package/dist/cli/cache.d.ts.map +1 -0
  97. package/dist/cli/cache.js +58 -0
  98. package/dist/cli/cache.js.map +1 -0
  99. package/dist/cli/chat.d.ts +37 -0
  100. package/dist/cli/chat.d.ts.map +1 -0
  101. package/dist/cli/chat.js +393 -0
  102. package/dist/cli/chat.js.map +1 -0
  103. package/dist/cli/commands.d.ts +24 -0
  104. package/dist/cli/commands.d.ts.map +1 -0
  105. package/dist/cli/commands.js +18 -0
  106. package/dist/cli/commands.js.map +1 -0
  107. package/dist/cli/config.d.ts +19 -0
  108. package/dist/cli/config.d.ts.map +1 -0
  109. package/dist/cli/config.js +162 -0
  110. package/dist/cli/config.js.map +1 -0
  111. package/dist/cli/dashboard.d.ts +34 -0
  112. package/dist/cli/dashboard.d.ts.map +1 -0
  113. package/dist/cli/dashboard.js +126 -0
  114. package/dist/cli/dashboard.js.map +1 -0
  115. package/dist/cli/doctor.d.ts +68 -0
  116. package/dist/cli/doctor.d.ts.map +1 -0
  117. package/dist/cli/doctor.js +585 -0
  118. package/dist/cli/doctor.js.map +1 -0
  119. package/dist/cli/edit.d.ts +11 -0
  120. package/dist/cli/edit.d.ts.map +1 -0
  121. package/dist/cli/edit.js +86 -0
  122. package/dist/cli/edit.js.map +1 -0
  123. package/dist/cli/execute.d.ts +25 -0
  124. package/dist/cli/execute.d.ts.map +1 -0
  125. package/dist/cli/execute.js +186 -0
  126. package/dist/cli/execute.js.map +1 -0
  127. package/dist/cli/federation.d.ts +31 -0
  128. package/dist/cli/federation.d.ts.map +1 -0
  129. package/dist/cli/federation.js +387 -0
  130. package/dist/cli/federation.js.map +1 -0
  131. package/dist/cli/history.d.ts +22 -0
  132. package/dist/cli/history.d.ts.map +1 -0
  133. package/dist/cli/history.js +140 -0
  134. package/dist/cli/history.js.map +1 -0
  135. package/dist/cli/init.d.ts +49 -0
  136. package/dist/cli/init.d.ts.map +1 -0
  137. package/dist/cli/init.js +423 -0
  138. package/dist/cli/init.js.map +1 -0
  139. package/dist/cli/learn.d.ts +31 -0
  140. package/dist/cli/learn.d.ts.map +1 -0
  141. package/dist/cli/learn.js +320 -0
  142. package/dist/cli/learn.js.map +1 -0
  143. package/dist/cli/memory.d.ts +38 -0
  144. package/dist/cli/memory.d.ts.map +1 -0
  145. package/dist/cli/memory.js +295 -0
  146. package/dist/cli/memory.js.map +1 -0
  147. package/dist/cli/model-picker.d.ts +18 -0
  148. package/dist/cli/model-picker.d.ts.map +1 -0
  149. package/dist/cli/model-picker.js +225 -0
  150. package/dist/cli/model-picker.js.map +1 -0
  151. package/dist/cli/models.d.ts +11 -0
  152. package/dist/cli/models.d.ts.map +1 -0
  153. package/dist/cli/models.js +132 -0
  154. package/dist/cli/models.js.map +1 -0
  155. package/dist/cli/plan.d.ts +11 -0
  156. package/dist/cli/plan.d.ts.map +1 -0
  157. package/dist/cli/plan.js +94 -0
  158. package/dist/cli/plan.js.map +1 -0
  159. package/dist/cli/plugins.d.ts +15 -0
  160. package/dist/cli/plugins.d.ts.map +1 -0
  161. package/dist/cli/plugins.js +123 -0
  162. package/dist/cli/plugins.js.map +1 -0
  163. package/dist/cli/router.d.ts +20 -0
  164. package/dist/cli/router.d.ts.map +1 -0
  165. package/dist/cli/router.js +142 -0
  166. package/dist/cli/router.js.map +1 -0
  167. package/dist/cli/run.d.ts +22 -0
  168. package/dist/cli/run.d.ts.map +1 -0
  169. package/dist/cli/run.js +110 -0
  170. package/dist/cli/run.js.map +1 -0
  171. package/dist/cli/sandbox.d.ts +27 -0
  172. package/dist/cli/sandbox.d.ts.map +1 -0
  173. package/dist/cli/sandbox.js +264 -0
  174. package/dist/cli/sandbox.js.map +1 -0
  175. package/dist/cli/sdk.d.ts +27 -0
  176. package/dist/cli/sdk.d.ts.map +1 -0
  177. package/dist/cli/sdk.js +204 -0
  178. package/dist/cli/sdk.js.map +1 -0
  179. package/dist/cli/stats.d.ts +18 -0
  180. package/dist/cli/stats.d.ts.map +1 -0
  181. package/dist/cli/stats.js +78 -0
  182. package/dist/cli/stats.js.map +1 -0
  183. package/dist/cli/team.d.ts +42 -0
  184. package/dist/cli/team.d.ts.map +1 -0
  185. package/dist/cli/team.js +473 -0
  186. package/dist/cli/team.js.map +1 -0
  187. package/dist/cli/workflow.d.ts +27 -0
  188. package/dist/cli/workflow.d.ts.map +1 -0
  189. package/dist/cli/workflow.js +347 -0
  190. package/dist/cli/workflow.js.map +1 -0
  191. package/dist/config/manager.d.ts +37 -0
  192. package/dist/config/manager.d.ts.map +1 -0
  193. package/dist/config/manager.js +147 -0
  194. package/dist/config/manager.js.map +1 -0
  195. package/dist/config/types.d.ts +53 -0
  196. package/dist/config/types.d.ts.map +1 -0
  197. package/dist/config/types.js +2 -0
  198. package/dist/config/types.js.map +1 -0
  199. package/dist/context/cache.d.ts +27 -0
  200. package/dist/context/cache.d.ts.map +1 -0
  201. package/dist/context/cache.js +116 -0
  202. package/dist/context/cache.js.map +1 -0
  203. package/dist/context/history.d.ts +87 -0
  204. package/dist/context/history.d.ts.map +1 -0
  205. package/dist/context/history.js +249 -0
  206. package/dist/context/history.js.map +1 -0
  207. package/dist/context/parser.d.ts +61 -0
  208. package/dist/context/parser.d.ts.map +1 -0
  209. package/dist/context/parser.js +194 -0
  210. package/dist/context/parser.js.map +1 -0
  211. package/dist/federation/client.d.ts +49 -0
  212. package/dist/federation/client.d.ts.map +1 -0
  213. package/dist/federation/client.js +239 -0
  214. package/dist/federation/client.js.map +1 -0
  215. package/dist/federation/protocol.d.ts +155 -0
  216. package/dist/federation/protocol.d.ts.map +1 -0
  217. package/dist/federation/protocol.js +57 -0
  218. package/dist/federation/protocol.js.map +1 -0
  219. package/dist/federation/server.d.ts +25 -0
  220. package/dist/federation/server.d.ts.map +1 -0
  221. package/dist/federation/server.js +401 -0
  222. package/dist/federation/server.js.map +1 -0
  223. package/dist/index.d.ts +67 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +93 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/inference/factory.d.ts +20 -0
  228. package/dist/inference/factory.d.ts.map +1 -0
  229. package/dist/inference/factory.js +46 -0
  230. package/dist/inference/factory.js.map +1 -0
  231. package/dist/inference/gemini-adapter.d.ts +17 -0
  232. package/dist/inference/gemini-adapter.d.ts.map +1 -0
  233. package/dist/inference/gemini-adapter.js +176 -0
  234. package/dist/inference/gemini-adapter.js.map +1 -0
  235. package/dist/inference/groq-adapter.d.ts +17 -0
  236. package/dist/inference/groq-adapter.d.ts.map +1 -0
  237. package/dist/inference/groq-adapter.js +103 -0
  238. package/dist/inference/groq-adapter.js.map +1 -0
  239. package/dist/inference/interface.d.ts +49 -0
  240. package/dist/inference/interface.d.ts.map +1 -0
  241. package/dist/inference/interface.js +2 -0
  242. package/dist/inference/interface.js.map +1 -0
  243. package/dist/inference/local-adapter.d.ts +35 -0
  244. package/dist/inference/local-adapter.d.ts.map +1 -0
  245. package/dist/inference/local-adapter.js +311 -0
  246. package/dist/inference/local-adapter.js.map +1 -0
  247. package/dist/inference/model-catalog.d.ts +53 -0
  248. package/dist/inference/model-catalog.d.ts.map +1 -0
  249. package/dist/inference/model-catalog.js +306 -0
  250. package/dist/inference/model-catalog.js.map +1 -0
  251. package/dist/inference/nim-adapter.d.ts +17 -0
  252. package/dist/inference/nim-adapter.d.ts.map +1 -0
  253. package/dist/inference/nim-adapter.js +103 -0
  254. package/dist/inference/nim-adapter.js.map +1 -0
  255. package/dist/inference/openrouter-adapter.d.ts +17 -0
  256. package/dist/inference/openrouter-adapter.d.ts.map +1 -0
  257. package/dist/inference/openrouter-adapter.js +105 -0
  258. package/dist/inference/openrouter-adapter.js.map +1 -0
  259. package/dist/inference/sse.d.ts +20 -0
  260. package/dist/inference/sse.d.ts.map +1 -0
  261. package/dist/inference/sse.js +91 -0
  262. package/dist/inference/sse.js.map +1 -0
  263. package/dist/learning/agent-stats.d.ts +109 -0
  264. package/dist/learning/agent-stats.d.ts.map +1 -0
  265. package/dist/learning/agent-stats.js +240 -0
  266. package/dist/learning/agent-stats.js.map +1 -0
  267. package/dist/learning/benchmark.d.ts +161 -0
  268. package/dist/learning/benchmark.d.ts.map +1 -0
  269. package/dist/learning/benchmark.js +589 -0
  270. package/dist/learning/benchmark.js.map +1 -0
  271. package/dist/learning/cost-tracker.d.ts +101 -0
  272. package/dist/learning/cost-tracker.d.ts.map +1 -0
  273. package/dist/learning/cost-tracker.js +224 -0
  274. package/dist/learning/cost-tracker.js.map +1 -0
  275. package/dist/learning/feedback.d.ts +88 -0
  276. package/dist/learning/feedback.d.ts.map +1 -0
  277. package/dist/learning/feedback.js +169 -0
  278. package/dist/learning/feedback.js.map +1 -0
  279. package/dist/learning/hybrid-router.d.ts +201 -0
  280. package/dist/learning/hybrid-router.d.ts.map +1 -0
  281. package/dist/learning/hybrid-router.js +450 -0
  282. package/dist/learning/hybrid-router.js.map +1 -0
  283. package/dist/learning/model-compare.d.ts +76 -0
  284. package/dist/learning/model-compare.d.ts.map +1 -0
  285. package/dist/learning/model-compare.js +252 -0
  286. package/dist/learning/model-compare.js.map +1 -0
  287. package/dist/learning/model-router.d.ts +68 -0
  288. package/dist/learning/model-router.d.ts.map +1 -0
  289. package/dist/learning/model-router.js +140 -0
  290. package/dist/learning/model-router.js.map +1 -0
  291. package/dist/learning/pattern-extractor.d.ts +99 -0
  292. package/dist/learning/pattern-extractor.d.ts.map +1 -0
  293. package/dist/learning/pattern-extractor.js +310 -0
  294. package/dist/learning/pattern-extractor.js.map +1 -0
  295. package/dist/learning/scorer.d.ts +51 -0
  296. package/dist/learning/scorer.d.ts.map +1 -0
  297. package/dist/learning/scorer.js +64 -0
  298. package/dist/learning/scorer.js.map +1 -0
  299. package/dist/learning/self-improver.d.ts +48 -0
  300. package/dist/learning/self-improver.d.ts.map +1 -0
  301. package/dist/learning/self-improver.js +161 -0
  302. package/dist/learning/self-improver.js.map +1 -0
  303. package/dist/memory/embedder.d.ts +65 -0
  304. package/dist/memory/embedder.d.ts.map +1 -0
  305. package/dist/memory/embedder.js +424 -0
  306. package/dist/memory/embedder.js.map +1 -0
  307. package/dist/memory/memory-integration.d.ts +56 -0
  308. package/dist/memory/memory-integration.d.ts.map +1 -0
  309. package/dist/memory/memory-integration.js +95 -0
  310. package/dist/memory/memory-integration.js.map +1 -0
  311. package/dist/memory/trajectory-store.d.ts +149 -0
  312. package/dist/memory/trajectory-store.d.ts.map +1 -0
  313. package/dist/memory/trajectory-store.js +476 -0
  314. package/dist/memory/trajectory-store.js.map +1 -0
  315. package/dist/memory/vector-store.d.ts +78 -0
  316. package/dist/memory/vector-store.d.ts.map +1 -0
  317. package/dist/memory/vector-store.js +186 -0
  318. package/dist/memory/vector-store.js.map +1 -0
  319. package/dist/plugins/agent-plugin.d.ts +73 -0
  320. package/dist/plugins/agent-plugin.d.ts.map +1 -0
  321. package/dist/plugins/agent-plugin.js +199 -0
  322. package/dist/plugins/agent-plugin.js.map +1 -0
  323. package/dist/plugins/registry.d.ts +61 -0
  324. package/dist/plugins/registry.d.ts.map +1 -0
  325. package/dist/plugins/registry.js +67 -0
  326. package/dist/plugins/registry.js.map +1 -0
  327. package/dist/sandbox/images.d.ts +31 -0
  328. package/dist/sandbox/images.d.ts.map +1 -0
  329. package/dist/sandbox/images.js +129 -0
  330. package/dist/sandbox/images.js.map +1 -0
  331. package/dist/sandbox/manager.d.ts +134 -0
  332. package/dist/sandbox/manager.d.ts.map +1 -0
  333. package/dist/sandbox/manager.js +470 -0
  334. package/dist/sandbox/manager.js.map +1 -0
  335. package/dist/sandbox/types.d.ts +113 -0
  336. package/dist/sandbox/types.d.ts.map +1 -0
  337. package/dist/sandbox/types.js +107 -0
  338. package/dist/sandbox/types.js.map +1 -0
  339. package/dist/security/scanner.d.ts +53 -0
  340. package/dist/security/scanner.d.ts.map +1 -0
  341. package/dist/security/scanner.js +271 -0
  342. package/dist/security/scanner.js.map +1 -0
  343. package/dist/team/config.d.ts +50 -0
  344. package/dist/team/config.d.ts.map +1 -0
  345. package/dist/team/config.js +108 -0
  346. package/dist/team/config.js.map +1 -0
  347. package/dist/team/memory.d.ts +63 -0
  348. package/dist/team/memory.d.ts.map +1 -0
  349. package/dist/team/memory.js +282 -0
  350. package/dist/team/memory.js.map +1 -0
  351. package/dist/team/review.d.ts +123 -0
  352. package/dist/team/review.d.ts.map +1 -0
  353. package/dist/team/review.js +293 -0
  354. package/dist/team/review.js.map +1 -0
  355. package/dist/utils/env.d.ts +19 -0
  356. package/dist/utils/env.d.ts.map +1 -0
  357. package/dist/utils/env.js +250 -0
  358. package/dist/utils/env.js.map +1 -0
  359. package/dist/utils/logger.d.ts +11 -0
  360. package/dist/utils/logger.d.ts.map +1 -0
  361. package/dist/utils/logger.js +45 -0
  362. package/dist/utils/logger.js.map +1 -0
  363. package/dist/web-dashboard/server.d.ts +59 -0
  364. package/dist/web-dashboard/server.d.ts.map +1 -0
  365. package/dist/web-dashboard/server.js +418 -0
  366. package/dist/web-dashboard/server.js.map +1 -0
  367. package/dist/workflow/registry.d.ts +127 -0
  368. package/dist/workflow/registry.d.ts.map +1 -0
  369. package/dist/workflow/registry.js +482 -0
  370. package/dist/workflow/registry.js.map +1 -0
  371. package/dist/workflow/templates.d.ts +93 -0
  372. package/dist/workflow/templates.d.ts.map +1 -0
  373. package/dist/workflow/templates.js +481 -0
  374. package/dist/workflow/templates.js.map +1 -0
  375. package/package.json +78 -0
  376. package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
  377. package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
  378. package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
  379. package/src/web-dashboard/public/index.html +13 -0
@@ -0,0 +1,201 @@
1
+ /**
2
+ * HybridModelRouter — Intelligent model selection engine.
3
+ *
4
+ * Enhances the existing ModelRouter with:
5
+ * 1. Task complexity analysis — detects complexity from goal/description
6
+ * 2. Cost budget awareness — respects user's cost limits per session
7
+ * 3. Multi-model consensus — runs critical tasks through multiple models
8
+ * 4. Automatic fallback chains — if primary fails, try alternatives
9
+ * 5. Routing decisions exposed for user override
10
+ *
11
+ * Integration:
12
+ * - The Orchestrator calls `resolveRouting()` before each agent step
13
+ * - Returns a `RoutingDecision` that the Orchestrator can inspect/override
14
+ * - In verbose mode, decisions are logged for user visibility
15
+ * - Users can set `--provider`/`--model` CLI flags to override any decision
16
+ */
17
+ /** Complexity levels for routing decisions */
18
+ export type ComplexityLevel = 'trivial' | 'simple' | 'moderate' | 'complex' | 'critical';
19
+ /** A single model candidate in a fallback chain */
20
+ export interface ModelCandidate {
21
+ provider: string;
22
+ model: string;
23
+ /** Estimated cost for this call (USD) */
24
+ estimatedCost: number;
25
+ /** Estimated quality score (0–1) from benchmark data */
26
+ qualityScore: number;
27
+ /** Reason this candidate was selected */
28
+ reason: string;
29
+ }
30
+ /** The final routing decision for a single LLM call */
31
+ export interface RoutingDecision {
32
+ /** The agent type this decision is for */
33
+ agentType: string;
34
+ /** Detected complexity level */
35
+ complexity: ComplexityLevel;
36
+ /** The selected provider */
37
+ provider: string;
38
+ /** The selected model */
39
+ model: string;
40
+ /** Full fallback chain (primary is first) */
41
+ fallbackChain: ModelCandidate[];
42
+ /** Whether multi-model consensus was used */
43
+ useConsensus: boolean;
44
+ /** Whether the user explicitly overrode this decision */
45
+ userOverridden: boolean;
46
+ /** Human-readable explanation of this decision */
47
+ explanation: string;
48
+ }
49
+ /** Options for the hybrid router */
50
+ export interface HybridRouterOptions {
51
+ /** User's cost budget for this session (USD) */
52
+ sessionBudget?: number;
53
+ /** Whether to use multi-model consensus for critical tasks */
54
+ enableConsensus?: boolean;
55
+ /** Whether the user has explicitly set --provider or --model */
56
+ userProvider?: string;
57
+ userModel?: string;
58
+ /** Whether logging is enabled */
59
+ verbose?: boolean;
60
+ }
61
+ /**
62
+ * Analyze a task description or user goal to determine its complexity level.
63
+ *
64
+ * @param text — The task description or user goal
65
+ * @returns The detected complexity level
66
+ */
67
+ export declare function analyzeComplexity(text: string): ComplexityLevel;
68
+ /**
69
+ * Build a fallback chain for a given agent type and complexity.
70
+ * The chain is ordered: primary → secondary → tertiary.
71
+ *
72
+ * @param agentType - The agent type (e.g., 'writer', 'planner')
73
+ * @param complexity - Detected complexity level
74
+ * @param options - Router options (budget, overrides)
75
+ * @returns An ordered array of model candidates
76
+ */
77
+ export declare function buildFallbackChain(agentType: string, complexity: ComplexityLevel, options?: HybridRouterOptions): ModelCandidate[];
78
+ /**
79
+ * Check if the session has remaining budget for a model call.
80
+ *
81
+ * @param options - Router options (includes sessionBudget)
82
+ * @param estimatedCost - Estimated cost of the proposed call
83
+ * @returns True if within budget, false if over
84
+ */
85
+ export declare function checkBudget(options: HybridRouterOptions, estimatedCost: number): {
86
+ withinBudget: boolean;
87
+ remainingBudget: number;
88
+ };
89
+ /**
90
+ * Results from a multi-model consensus run.
91
+ */
92
+ export interface ConsensusResult {
93
+ providerA: string;
94
+ modelA: string;
95
+ providerB: string;
96
+ modelB: string;
97
+ /** Whether the two models agreed */
98
+ agreed: boolean;
99
+ /** Combined/enhanced response (when agreed, uses A's response) */
100
+ combinedResponse: string;
101
+ /** Individual responses */
102
+ responseA: string;
103
+ responseB: string;
104
+ }
105
+ /**
106
+ * Compare two model outputs and determine if they agree at a high level.
107
+ * Simple heuristic: checks if key terms/sections overlap.
108
+ *
109
+ * @param responseA — Output from model A
110
+ * @param responseB — Output from model B
111
+ * @param threshold — Similarity threshold (0–1, default 0.3)
112
+ * @returns Whether the responses agree
113
+ */
114
+ export declare function checkConsensus(responseA: string, responseB: string, threshold?: number): boolean;
115
+ /**
116
+ * The main HybridModelRouter class.
117
+ *
118
+ * Usage:
119
+ * ```ts
120
+ * const router = new HybridModelRouter({ sessionBudget: 0.50, verbose: true });
121
+ * const decision = await router.resolveRouting('writer', 'Implement auth module');
122
+ * console.log(decision.explanation);
123
+ * // → "Moderate complexity: using groq/llama-3.3-70b-versatile. Budget remaining: $0.48"
124
+ *
125
+ * // For critical tasks with consensus:
126
+ * if (decision.useConsensus) {
127
+ * const consensus = await router.runConsensus(
128
+ * prompt,
129
+ * decision.fallbackChain[0],
130
+ * decision.fallbackChain[1],
131
+ * );
132
+ * }
133
+ * ```
134
+ */
135
+ export declare class HybridModelRouter {
136
+ private options;
137
+ constructor(options?: HybridRouterOptions);
138
+ /**
139
+ * Resolve the optimal routing decision for a given agent type and task.
140
+ *
141
+ * @param agentType — Agent type (e.g., 'writer', 'planner')
142
+ * @param taskDescription — The task description or user goal
143
+ * @param overrides — Optional per-call overrides
144
+ * @returns A RoutingDecision with provider, model, fallback chain, and explanation
145
+ */
146
+ resolveRouting(agentType: string, taskDescription: string, overrides?: Partial<HybridRouterOptions>): Promise<RoutingDecision>;
147
+ /**
148
+ * Run multi-model consensus for a critical task.
149
+ * Sends the same prompt to two different models and compares results.
150
+ *
151
+ * @param prompt — The LLM prompt
152
+ * @param primary — Primary model (used if agreement reached)
153
+ * @param secondary — Secondary model (for comparison)
154
+ * @param callLLM — Function to call a specific provider/model
155
+ * @returns Consensus result with combined response
156
+ */
157
+ runConsensus(prompt: string, primary: ModelCandidate, secondary: ModelCandidate, callLLM: (prompt: string, provider: string, model: string) => Promise<string>): Promise<ConsensusResult>;
158
+ /**
159
+ * Try the fallback chain for a single call.
160
+ * Returns the first successful result, or throws if all fail.
161
+ *
162
+ * @param prompt — The LLM prompt
163
+ * @param chain — Fallback chain of model candidates
164
+ * @param callLLM — Function to call a specific provider/model
165
+ * @returns The response from the first successful model
166
+ */
167
+ tryFallbackChain(prompt: string, chain: ModelCandidate[], callLLM: (prompt: string, provider: string, model: string) => Promise<string>): Promise<{
168
+ response: string;
169
+ usedCandidate: ModelCandidate;
170
+ }>;
171
+ /**
172
+ * Build a human-readable explanation of the routing decision.
173
+ */
174
+ private buildExplanation;
175
+ /**
176
+ * Update options (e.g., when user sets --budget).
177
+ */
178
+ updateOptions(options: Partial<HybridRouterOptions>): void;
179
+ /**
180
+ * Get current options.
181
+ */
182
+ getOptions(): HybridRouterOptions;
183
+ /**
184
+ * Get benchmark-driven recommendations for the best model for each agent type.
185
+ * Uses data from ModelCompare and BenchmarkRunner.
186
+ */
187
+ getBenchmarkRecommendations(): Array<{
188
+ agentType: string;
189
+ recommendedModel: string;
190
+ confidence: 'high' | 'medium' | 'low';
191
+ }>;
192
+ }
193
+ /**
194
+ * Get or create the default HybridModelRouter singleton.
195
+ */
196
+ export declare function getHybridRouter(): HybridModelRouter;
197
+ /**
198
+ * Reset the singleton (useful for testing).
199
+ */
200
+ export declare function resetHybridRouter(): void;
201
+ //# sourceMappingURL=hybrid-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-router.d.ts","sourceRoot":"","sources":["../../src/learning/hybrid-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,450 @@
1
+ /**
2
+ * HybridModelRouter — Intelligent model selection engine.
3
+ *
4
+ * Enhances the existing ModelRouter with:
5
+ * 1. Task complexity analysis — detects complexity from goal/description
6
+ * 2. Cost budget awareness — respects user's cost limits per session
7
+ * 3. Multi-model consensus — runs critical tasks through multiple models
8
+ * 4. Automatic fallback chains — if primary fails, try alternatives
9
+ * 5. Routing decisions exposed for user override
10
+ *
11
+ * Integration:
12
+ * - The Orchestrator calls `resolveRouting()` before each agent step
13
+ * - Returns a `RoutingDecision` that the Orchestrator can inspect/override
14
+ * - In verbose mode, decisions are logged for user visibility
15
+ * - Users can set `--provider`/`--model` CLI flags to override any decision
16
+ */
17
+ import { recommendModel } from './model-router.js';
18
+ import { getCostTracker, calculateCost } from './cost-tracker.js';
19
+ import { getBenchmarkRuns } from './benchmark.js';
20
+ import { logger } from '../utils/logger.js';
21
+ // ─── Complexity Analysis ────────────────────────────────────────────────────
22
+ /** Keywords that indicate task complexity */
23
+ const COMPLEXITY_KEYWORDS = {
24
+ trivial: [
25
+ /format|lint|comment|indent|rename/i,
26
+ /typo|spelling|trivial/i,
27
+ /simple\s+(change|fix|edit)/i,
28
+ ],
29
+ simple: [
30
+ /refactor|extract|inline|move/i,
31
+ /add\s+(method|function|route|endpoint)/i,
32
+ /fix\s+(bug|issue|error)/i,
33
+ /implement\s+(small|simple)/i,
34
+ ],
35
+ moderate: [
36
+ /implement|create|build|develop/i,
37
+ /add\s+(feature|module|component)/i,
38
+ /integrate|migrate|convert/i,
39
+ /auth|authentication|authorization|api/i,
40
+ ],
41
+ complex: [
42
+ /architecture|architect|design\s+system/i,
43
+ /security\s+(audit|review|scan)/i,
44
+ /optimize|performance|scale/i,
45
+ /multi[- ]?thread|concurrent|parallel/i,
46
+ /database|migration|schema/i,
47
+ /distributed|microservice/i,
48
+ ],
49
+ critical: [
50
+ /production|deploy|release|rollout/i,
51
+ /critical|urgent|emergency|p0|p1/i,
52
+ /security\s+(fix|patch|vulnerability)/i,
53
+ /consensus|vote|multiple\s+models/i,
54
+ /data\s+(loss|breach|corruption)/i,
55
+ ],
56
+ };
57
+ /**
58
+ * Analyze a task description or user goal to determine its complexity level.
59
+ *
60
+ * @param text — The task description or user goal
61
+ * @returns The detected complexity level
62
+ */
63
+ export function analyzeComplexity(text) {
64
+ // Check critical first (highest priority)
65
+ for (const keyword of COMPLEXITY_KEYWORDS.critical) {
66
+ if (keyword.test(text))
67
+ return 'critical';
68
+ }
69
+ // Check complex
70
+ for (const keyword of COMPLEXITY_KEYWORDS.complex) {
71
+ if (keyword.test(text))
72
+ return 'complex';
73
+ }
74
+ // Check moderate
75
+ for (const keyword of COMPLEXITY_KEYWORDS.moderate) {
76
+ if (keyword.test(text))
77
+ return 'moderate';
78
+ }
79
+ // Check simple
80
+ for (const keyword of COMPLEXITY_KEYWORDS.simple) {
81
+ if (keyword.test(text))
82
+ return 'simple';
83
+ }
84
+ // Check trivial
85
+ for (const keyword of COMPLEXITY_KEYWORDS.trivial) {
86
+ if (keyword.test(text))
87
+ return 'trivial';
88
+ }
89
+ // Default: moderate (safe default)
90
+ return 'moderate';
91
+ }
92
+ /**
93
+ * Get the recommended provider based on complexity.
94
+ */
95
+ function providerForComplexity(complexity) {
96
+ switch (complexity) {
97
+ case 'trivial': return 'local';
98
+ case 'simple': return 'groq';
99
+ case 'moderate': return 'groq';
100
+ case 'complex': return 'gemini';
101
+ case 'critical': return 'openrouter';
102
+ }
103
+ }
104
+ /**
105
+ * Estimate cost for a model call based on provider, model, and estimated token usage.
106
+ * Reuses CostTracker's calculateCost and estimateTokens for consistent pricing.
107
+ */
108
+ function estimateCallCost(provider, model, inputTokens, outputTokens) {
109
+ return calculateCost(provider, model, inputTokens ?? 1000, outputTokens ?? 500);
110
+ }
111
+ // ─── Fallback Chain Builder ─────────────────────────────────────────────────
112
+ /**
113
+ * Build a fallback chain for a given agent type and complexity.
114
+ * The chain is ordered: primary → secondary → tertiary.
115
+ *
116
+ * @param agentType - The agent type (e.g., 'writer', 'planner')
117
+ * @param complexity - Detected complexity level
118
+ * @param options - Router options (budget, overrides)
119
+ * @returns An ordered array of model candidates
120
+ */
121
+ export function buildFallbackChain(agentType, complexity, options = {}) {
122
+ const chain = [];
123
+ // If user explicitly set provider/model, that's the only option
124
+ if (options.userProvider && options.userModel) {
125
+ chain.push({
126
+ provider: options.userProvider,
127
+ model: options.userModel,
128
+ estimatedCost: estimateCallCost(options.userProvider, options.userModel),
129
+ qualityScore: 0.7,
130
+ reason: 'User-specified provider/model',
131
+ });
132
+ return chain;
133
+ }
134
+ // Get the recommended model from the existing ModelRouter
135
+ const recommendation = recommendModel(agentType);
136
+ // Build fallback chain based on complexity
137
+ const preferredProvider = options.userProvider || providerForComplexity(complexity);
138
+ // Primary: the complexity-matched or user-specified provider
139
+ const modelSuffix = recommendation.model ? `/${recommendation.model}` : '';
140
+ chain.push({
141
+ provider: preferredProvider,
142
+ model: recommendation.model || 'default',
143
+ estimatedCost: estimateCallCost(preferredProvider, recommendation.model || 'default'),
144
+ qualityScore: complexity === 'critical' ? 0.9 : complexity === 'complex' ? 0.8 : 0.7,
145
+ reason: `Primary choice for ${complexity} complexity`,
146
+ });
147
+ // Secondary fallback: swap provider
148
+ const secondaryProvider = preferredProvider === 'local' ? 'groq'
149
+ : preferredProvider === 'groq' ? 'nim'
150
+ : preferredProvider === 'nim' ? 'gemini'
151
+ : preferredProvider === 'gemini' ? 'openrouter'
152
+ : 'groq';
153
+ chain.push({
154
+ provider: secondaryProvider,
155
+ model: 'default',
156
+ estimatedCost: estimateCallCost(secondaryProvider, 'default'),
157
+ qualityScore: 0.6,
158
+ reason: `Fallback: switch to ${secondaryProvider}`,
159
+ });
160
+ // Tertiary fallback: a different model on the same provider (if available)
161
+ const tertiaryProvider = secondaryProvider === 'groq' ? 'gemini' : 'groq';
162
+ chain.push({
163
+ provider: tertiaryProvider,
164
+ model: 'default',
165
+ estimatedCost: estimateCallCost(tertiaryProvider, 'default'),
166
+ qualityScore: 0.5,
167
+ reason: `Final fallback: switch to ${tertiaryProvider}`,
168
+ });
169
+ return chain;
170
+ }
171
+ // ─── Budget Check ───────────────────────────────────────────────────────────
172
+ /**
173
+ * Check if the session has remaining budget for a model call.
174
+ *
175
+ * @param options - Router options (includes sessionBudget)
176
+ * @param estimatedCost - Estimated cost of the proposed call
177
+ * @returns True if within budget, false if over
178
+ */
179
+ export function checkBudget(options, estimatedCost) {
180
+ if (!options.sessionBudget) {
181
+ return { withinBudget: true, remainingBudget: Infinity };
182
+ }
183
+ const tracker = getCostTracker();
184
+ const summary = tracker.getSummary();
185
+ const spent = summary.sessionCost;
186
+ const remaining = options.sessionBudget - spent;
187
+ return {
188
+ withinBudget: estimatedCost <= remaining,
189
+ remainingBudget: remaining,
190
+ };
191
+ }
192
+ /**
193
+ * Select a model candidate from the fallback chain that fits the budget.
194
+ */
195
+ function selectWithinBudget(chain, options) {
196
+ for (const candidate of chain) {
197
+ const { withinBudget } = checkBudget(options, candidate.estimatedCost);
198
+ if (withinBudget)
199
+ return candidate;
200
+ }
201
+ // If nothing fits the budget, return the cheapest option
202
+ return chain.reduce((cheapest, candidate) => candidate.estimatedCost < cheapest.estimatedCost ? candidate : cheapest);
203
+ }
204
+ /**
205
+ * Compare two model outputs and determine if they agree at a high level.
206
+ * Simple heuristic: checks if key terms/sections overlap.
207
+ *
208
+ * @param responseA — Output from model A
209
+ * @param responseB — Output from model B
210
+ * @param threshold — Similarity threshold (0–1, default 0.3)
211
+ * @returns Whether the responses agree
212
+ */
213
+ export function checkConsensus(responseA, responseB, threshold = 0.3) {
214
+ // Tokenize into words (lowercase)
215
+ const tokensA = new Set(responseA.toLowerCase().split(/\W+/).filter((t) => t.length > 3));
216
+ const tokensB = new Set(responseB.toLowerCase().split(/\W+/).filter((t) => t.length > 3));
217
+ if (tokensA.size === 0 || tokensB.size === 0)
218
+ return true; // Fallback: assume agree
219
+ // Calculate Jaccard similarity
220
+ const intersection = new Set([...tokensA].filter((t) => tokensB.has(t)));
221
+ const union = new Set([...tokensA, ...tokensB]);
222
+ const similarity = intersection.size / union.size;
223
+ return similarity >= threshold;
224
+ }
225
+ // ─── Hybrid Model Router ────────────────────────────────────────────────────
226
+ /**
227
+ * The main HybridModelRouter class.
228
+ *
229
+ * Usage:
230
+ * ```ts
231
+ * const router = new HybridModelRouter({ sessionBudget: 0.50, verbose: true });
232
+ * const decision = await router.resolveRouting('writer', 'Implement auth module');
233
+ * console.log(decision.explanation);
234
+ * // → "Moderate complexity: using groq/llama-3.3-70b-versatile. Budget remaining: $0.48"
235
+ *
236
+ * // For critical tasks with consensus:
237
+ * if (decision.useConsensus) {
238
+ * const consensus = await router.runConsensus(
239
+ * prompt,
240
+ * decision.fallbackChain[0],
241
+ * decision.fallbackChain[1],
242
+ * );
243
+ * }
244
+ * ```
245
+ */
246
+ export class HybridModelRouter {
247
+ options;
248
+ constructor(options = {}) {
249
+ this.options = {
250
+ enableConsensus: true,
251
+ verbose: false,
252
+ ...options,
253
+ };
254
+ }
255
+ /**
256
+ * Resolve the optimal routing decision for a given agent type and task.
257
+ *
258
+ * @param agentType — Agent type (e.g., 'writer', 'planner')
259
+ * @param taskDescription — The task description or user goal
260
+ * @param overrides — Optional per-call overrides
261
+ * @returns A RoutingDecision with provider, model, fallback chain, and explanation
262
+ */
263
+ async resolveRouting(agentType, taskDescription, overrides) {
264
+ const opts = { ...this.options, ...overrides };
265
+ const complexity = analyzeComplexity(taskDescription);
266
+ const fallbackChain = buildFallbackChain(agentType, complexity, opts);
267
+ // Select within budget
268
+ const selected = selectWithinBudget(fallbackChain, opts);
269
+ // Determine if consensus is needed
270
+ const useConsensus = opts.enableConsensus !== false &&
271
+ complexity === 'critical' &&
272
+ !opts.userProvider;
273
+ // Build explanation
274
+ const explanation = this.buildExplanation(agentType, complexity, selected, fallbackChain, opts);
275
+ if (opts.verbose) {
276
+ logger.info(` 🔀 Routing: ${explanation}`);
277
+ }
278
+ return {
279
+ agentType,
280
+ complexity,
281
+ provider: selected.provider,
282
+ model: selected.model,
283
+ fallbackChain,
284
+ useConsensus,
285
+ userOverridden: !!opts.userProvider,
286
+ explanation,
287
+ };
288
+ }
289
+ /**
290
+ * Run multi-model consensus for a critical task.
291
+ * Sends the same prompt to two different models and compares results.
292
+ *
293
+ * @param prompt — The LLM prompt
294
+ * @param primary — Primary model (used if agreement reached)
295
+ * @param secondary — Secondary model (for comparison)
296
+ * @param callLLM — Function to call a specific provider/model
297
+ * @returns Consensus result with combined response
298
+ */
299
+ async runConsensus(prompt, primary, secondary, callLLM) {
300
+ logger.info(' 🔀 Running multi-model consensus for critical task...');
301
+ // Run both models in parallel
302
+ const [responseA, responseB] = await Promise.all([
303
+ callLLM(prompt, primary.provider, primary.model),
304
+ callLLM(prompt, secondary.provider, secondary.model),
305
+ ]);
306
+ const agreed = checkConsensus(responseA, responseB);
307
+ if (agreed) {
308
+ logger.success(' ✅ Models agree — using primary model result');
309
+ }
310
+ else {
311
+ logger.warn(' ⚠️ Models disagree — falling back to primary (higher quality score)');
312
+ }
313
+ return {
314
+ providerA: primary.provider,
315
+ modelA: primary.model,
316
+ providerB: secondary.provider,
317
+ modelB: secondary.model,
318
+ agreed,
319
+ combinedResponse: responseA,
320
+ responseA,
321
+ responseB,
322
+ };
323
+ }
324
+ /**
325
+ * Try the fallback chain for a single call.
326
+ * Returns the first successful result, or throws if all fail.
327
+ *
328
+ * @param prompt — The LLM prompt
329
+ * @param chain — Fallback chain of model candidates
330
+ * @param callLLM — Function to call a specific provider/model
331
+ * @returns The response from the first successful model
332
+ */
333
+ async tryFallbackChain(prompt, chain, callLLM) {
334
+ const errors = [];
335
+ for (const candidate of chain) {
336
+ try {
337
+ logger.debug(` 🔀 Trying fallback: ${candidate.provider}/${candidate.model}`);
338
+ const response = await callLLM(prompt, candidate.provider, candidate.model);
339
+ return { response, usedCandidate: candidate };
340
+ }
341
+ catch (err) {
342
+ const msg = err instanceof Error ? err.message : String(err);
343
+ errors.push(`${candidate.provider}/${candidate.model}: ${msg.slice(0, 100)}`);
344
+ logger.warn(` ⚠️ Fallback ${candidate.provider}/${candidate.model} failed: ${msg.slice(0, 100)}`);
345
+ continue;
346
+ }
347
+ }
348
+ throw new Error(`All models in fallback chain failed:\n${errors.join('\n')}`);
349
+ }
350
+ /**
351
+ * Build a human-readable explanation of the routing decision.
352
+ */
353
+ buildExplanation(agentType, complexity, selected, chain, opts) {
354
+ const parts = [];
355
+ // Complexity
356
+ const complexityLabels = {
357
+ trivial: '🟢 trivial',
358
+ simple: '🔵 simple',
359
+ moderate: '🟡 moderate',
360
+ complex: '🟠 complex',
361
+ critical: '🔴 critical',
362
+ };
363
+ parts.push(`${agentType} (${complexityLabels[complexity]})`);
364
+ // Selected model
365
+ parts.push(`→ ${selected.provider}/${selected.model}`);
366
+ // Budget info
367
+ if (opts.sessionBudget) {
368
+ const { remainingBudget } = checkBudget(opts, selected.estimatedCost);
369
+ parts.push(`$${remainingBudget.toFixed(4)} remaining`);
370
+ }
371
+ // Fallback chain summary
372
+ if (chain.length > 1) {
373
+ const fallbacks = chain.slice(1)
374
+ .map((c) => `${c.provider}/${c.model}`)
375
+ .join(' → ');
376
+ parts.push(`fallback: ${fallbacks}`);
377
+ }
378
+ // Consensus
379
+ if (complexity === 'critical' && opts.enableConsensus) {
380
+ parts.push('🔀 consensus enabled');
381
+ }
382
+ // User override
383
+ if (opts.userProvider) {
384
+ parts.push('👤 user override');
385
+ }
386
+ return parts.join(' | ');
387
+ }
388
+ /**
389
+ * Update options (e.g., when user sets --budget).
390
+ */
391
+ updateOptions(options) {
392
+ this.options = { ...this.options, ...options };
393
+ }
394
+ /**
395
+ * Get current options.
396
+ */
397
+ getOptions() {
398
+ return { ...this.options };
399
+ }
400
+ /**
401
+ * Get benchmark-driven recommendations for the best model for each agent type.
402
+ * Uses data from ModelCompare and BenchmarkRunner.
403
+ */
404
+ getBenchmarkRecommendations() {
405
+ const runs = getBenchmarkRuns();
406
+ if (runs.length === 0)
407
+ return [];
408
+ // Group runs by result characteristics (task IDs used as agent type proxy)
409
+ const byAgent = {};
410
+ for (const run of runs) {
411
+ const key = `${run.provider}/${run.model}`;
412
+ for (const result of run.results) {
413
+ // Use taskId as the agent type proxy
414
+ const agentType = result.taskId || 'default';
415
+ if (!byAgent[agentType])
416
+ byAgent[agentType] = [];
417
+ byAgent[agentType].push({ model: key, score: result.qualityScore });
418
+ }
419
+ }
420
+ return Object.entries(byAgent).map(([agentType, entries]) => {
421
+ const best = entries.sort((a, b) => b.score - a.score)[0];
422
+ const confidence = entries.length >= 10 ? 'high'
423
+ : entries.length >= 5 ? 'medium'
424
+ : 'low';
425
+ return {
426
+ agentType,
427
+ recommendedModel: best.model,
428
+ confidence,
429
+ };
430
+ });
431
+ }
432
+ }
433
+ // ─── Singleton ──────────────────────────────────────────────────────────────
434
+ let routerInstance = null;
435
+ /**
436
+ * Get or create the default HybridModelRouter singleton.
437
+ */
438
+ export function getHybridRouter() {
439
+ if (!routerInstance) {
440
+ routerInstance = new HybridModelRouter();
441
+ }
442
+ return routerInstance;
443
+ }
444
+ /**
445
+ * Reset the singleton (useful for testing).
446
+ */
447
+ export function resetHybridRouter() {
448
+ routerInstance = null;
449
+ }
450
+ //# sourceMappingURL=hybrid-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-router.js","sourceRoot":"","sources":["../../src/learning/hybrid-router.ts"],"names":[],"mappings":"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"}