onbuzz 3.3.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 (506) hide show
  1. package/LICENSE +267 -0
  2. package/README.md +425 -0
  3. package/bin/cli.js +556 -0
  4. package/bin/loxia-terminal-v2.js +162 -0
  5. package/bin/loxia-terminal.js +90 -0
  6. package/bin/start-with-terminal.js +200 -0
  7. package/node_modules/@isaacs/balanced-match/LICENSE.md +23 -0
  8. package/node_modules/@isaacs/balanced-match/README.md +60 -0
  9. package/node_modules/@isaacs/balanced-match/dist/commonjs/index.d.ts +9 -0
  10. package/node_modules/@isaacs/balanced-match/dist/commonjs/index.d.ts.map +1 -0
  11. package/node_modules/@isaacs/balanced-match/dist/commonjs/index.js +59 -0
  12. package/node_modules/@isaacs/balanced-match/dist/commonjs/index.js.map +1 -0
  13. package/node_modules/@isaacs/balanced-match/dist/commonjs/package.json +3 -0
  14. package/node_modules/@isaacs/balanced-match/dist/esm/index.d.ts +9 -0
  15. package/node_modules/@isaacs/balanced-match/dist/esm/index.d.ts.map +1 -0
  16. package/node_modules/@isaacs/balanced-match/dist/esm/index.js +54 -0
  17. package/node_modules/@isaacs/balanced-match/dist/esm/index.js.map +1 -0
  18. package/node_modules/@isaacs/balanced-match/dist/esm/package.json +3 -0
  19. package/node_modules/@isaacs/balanced-match/package.json +79 -0
  20. package/node_modules/@isaacs/brace-expansion/LICENSE +23 -0
  21. package/node_modules/@isaacs/brace-expansion/README.md +97 -0
  22. package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.d.ts +6 -0
  23. package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.d.ts.map +1 -0
  24. package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.js +199 -0
  25. package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.js.map +1 -0
  26. package/node_modules/@isaacs/brace-expansion/dist/commonjs/package.json +3 -0
  27. package/node_modules/@isaacs/brace-expansion/dist/esm/index.d.ts +6 -0
  28. package/node_modules/@isaacs/brace-expansion/dist/esm/index.d.ts.map +1 -0
  29. package/node_modules/@isaacs/brace-expansion/dist/esm/index.js +195 -0
  30. package/node_modules/@isaacs/brace-expansion/dist/esm/index.js.map +1 -0
  31. package/node_modules/@isaacs/brace-expansion/dist/esm/package.json +3 -0
  32. package/node_modules/@isaacs/brace-expansion/package.json +60 -0
  33. package/node_modules/glob/LICENSE.md +63 -0
  34. package/node_modules/glob/README.md +1177 -0
  35. package/node_modules/glob/dist/commonjs/glob.d.ts +388 -0
  36. package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -0
  37. package/node_modules/glob/dist/commonjs/glob.js +247 -0
  38. package/node_modules/glob/dist/commonjs/glob.js.map +1 -0
  39. package/node_modules/glob/dist/commonjs/has-magic.d.ts +14 -0
  40. package/node_modules/glob/dist/commonjs/has-magic.d.ts.map +1 -0
  41. package/node_modules/glob/dist/commonjs/has-magic.js +27 -0
  42. package/node_modules/glob/dist/commonjs/has-magic.js.map +1 -0
  43. package/node_modules/glob/dist/commonjs/ignore.d.ts +24 -0
  44. package/node_modules/glob/dist/commonjs/ignore.d.ts.map +1 -0
  45. package/node_modules/glob/dist/commonjs/ignore.js +119 -0
  46. package/node_modules/glob/dist/commonjs/ignore.js.map +1 -0
  47. package/node_modules/glob/dist/commonjs/index.d.ts +97 -0
  48. package/node_modules/glob/dist/commonjs/index.d.ts.map +1 -0
  49. package/node_modules/glob/dist/commonjs/index.js +68 -0
  50. package/node_modules/glob/dist/commonjs/index.js.map +1 -0
  51. package/node_modules/glob/dist/commonjs/index.min.js +4 -0
  52. package/node_modules/glob/dist/commonjs/index.min.js.map +7 -0
  53. package/node_modules/glob/dist/commonjs/package.json +3 -0
  54. package/node_modules/glob/dist/commonjs/pattern.d.ts +76 -0
  55. package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -0
  56. package/node_modules/glob/dist/commonjs/pattern.js +219 -0
  57. package/node_modules/glob/dist/commonjs/pattern.js.map +1 -0
  58. package/node_modules/glob/dist/commonjs/processor.d.ts +59 -0
  59. package/node_modules/glob/dist/commonjs/processor.d.ts.map +1 -0
  60. package/node_modules/glob/dist/commonjs/processor.js +301 -0
  61. package/node_modules/glob/dist/commonjs/processor.js.map +1 -0
  62. package/node_modules/glob/dist/commonjs/walker.d.ts +97 -0
  63. package/node_modules/glob/dist/commonjs/walker.d.ts.map +1 -0
  64. package/node_modules/glob/dist/commonjs/walker.js +387 -0
  65. package/node_modules/glob/dist/commonjs/walker.js.map +1 -0
  66. package/node_modules/glob/dist/esm/glob.d.ts +388 -0
  67. package/node_modules/glob/dist/esm/glob.d.ts.map +1 -0
  68. package/node_modules/glob/dist/esm/glob.js +243 -0
  69. package/node_modules/glob/dist/esm/glob.js.map +1 -0
  70. package/node_modules/glob/dist/esm/has-magic.d.ts +14 -0
  71. package/node_modules/glob/dist/esm/has-magic.d.ts.map +1 -0
  72. package/node_modules/glob/dist/esm/has-magic.js +23 -0
  73. package/node_modules/glob/dist/esm/has-magic.js.map +1 -0
  74. package/node_modules/glob/dist/esm/ignore.d.ts +24 -0
  75. package/node_modules/glob/dist/esm/ignore.d.ts.map +1 -0
  76. package/node_modules/glob/dist/esm/ignore.js +115 -0
  77. package/node_modules/glob/dist/esm/ignore.js.map +1 -0
  78. package/node_modules/glob/dist/esm/index.d.ts +97 -0
  79. package/node_modules/glob/dist/esm/index.d.ts.map +1 -0
  80. package/node_modules/glob/dist/esm/index.js +55 -0
  81. package/node_modules/glob/dist/esm/index.js.map +1 -0
  82. package/node_modules/glob/dist/esm/index.min.js +4 -0
  83. package/node_modules/glob/dist/esm/index.min.js.map +7 -0
  84. package/node_modules/glob/dist/esm/package.json +3 -0
  85. package/node_modules/glob/dist/esm/pattern.d.ts +76 -0
  86. package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -0
  87. package/node_modules/glob/dist/esm/pattern.js +215 -0
  88. package/node_modules/glob/dist/esm/pattern.js.map +1 -0
  89. package/node_modules/glob/dist/esm/processor.d.ts +59 -0
  90. package/node_modules/glob/dist/esm/processor.d.ts.map +1 -0
  91. package/node_modules/glob/dist/esm/processor.js +294 -0
  92. package/node_modules/glob/dist/esm/processor.js.map +1 -0
  93. package/node_modules/glob/dist/esm/walker.d.ts +97 -0
  94. package/node_modules/glob/dist/esm/walker.d.ts.map +1 -0
  95. package/node_modules/glob/dist/esm/walker.js +381 -0
  96. package/node_modules/glob/dist/esm/walker.js.map +1 -0
  97. package/node_modules/glob/node_modules/minimatch/LICENSE.md +55 -0
  98. package/node_modules/glob/node_modules/minimatch/README.md +453 -0
  99. package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
  100. package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
  101. package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
  102. package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
  103. package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
  104. package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
  105. package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js +591 -0
  106. package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
  107. package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
  108. package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
  109. package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
  110. package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
  111. package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts +15 -0
  112. package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
  113. package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js +30 -0
  114. package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
  115. package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts +94 -0
  116. package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
  117. package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js +1029 -0
  118. package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
  119. package/node_modules/glob/node_modules/minimatch/dist/commonjs/package.json +3 -0
  120. package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts +22 -0
  121. package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
  122. package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js +38 -0
  123. package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
  124. package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
  125. package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
  126. package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
  127. package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  128. package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
  129. package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
  130. package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js +587 -0
  131. package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  132. package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
  133. package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
  134. package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
  135. package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  136. package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts +15 -0
  137. package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
  138. package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js +26 -0
  139. package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  140. package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts +94 -0
  141. package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
  142. package/node_modules/glob/node_modules/minimatch/dist/esm/index.js +1016 -0
  143. package/node_modules/glob/node_modules/minimatch/dist/esm/index.js.map +1 -0
  144. package/node_modules/glob/node_modules/minimatch/dist/esm/package.json +3 -0
  145. package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts +22 -0
  146. package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
  147. package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js +34 -0
  148. package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  149. package/node_modules/glob/node_modules/minimatch/package.json +67 -0
  150. package/node_modules/glob/package.json +101 -0
  151. package/node_modules/minipass/LICENSE +15 -0
  152. package/node_modules/minipass/README.md +825 -0
  153. package/node_modules/minipass/dist/commonjs/index.d.ts +549 -0
  154. package/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -0
  155. package/node_modules/minipass/dist/commonjs/index.js +1028 -0
  156. package/node_modules/minipass/dist/commonjs/index.js.map +1 -0
  157. package/node_modules/minipass/dist/commonjs/package.json +3 -0
  158. package/node_modules/minipass/dist/esm/index.d.ts +549 -0
  159. package/node_modules/minipass/dist/esm/index.d.ts.map +1 -0
  160. package/node_modules/minipass/dist/esm/index.js +1018 -0
  161. package/node_modules/minipass/dist/esm/index.js.map +1 -0
  162. package/node_modules/minipass/dist/esm/package.json +3 -0
  163. package/node_modules/minipass/package.json +82 -0
  164. package/node_modules/package-json-from-dist/LICENSE.md +63 -0
  165. package/node_modules/package-json-from-dist/README.md +110 -0
  166. package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts +89 -0
  167. package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map +1 -0
  168. package/node_modules/package-json-from-dist/dist/commonjs/index.js +134 -0
  169. package/node_modules/package-json-from-dist/dist/commonjs/index.js.map +1 -0
  170. package/node_modules/package-json-from-dist/dist/commonjs/package.json +3 -0
  171. package/node_modules/package-json-from-dist/dist/esm/index.d.ts +89 -0
  172. package/node_modules/package-json-from-dist/dist/esm/index.d.ts.map +1 -0
  173. package/node_modules/package-json-from-dist/dist/esm/index.js +129 -0
  174. package/node_modules/package-json-from-dist/dist/esm/index.js.map +1 -0
  175. package/node_modules/package-json-from-dist/dist/esm/package.json +3 -0
  176. package/node_modules/package-json-from-dist/package.json +68 -0
  177. package/node_modules/path-scurry/LICENSE.md +55 -0
  178. package/node_modules/path-scurry/README.md +636 -0
  179. package/node_modules/path-scurry/dist/commonjs/index.d.ts +1115 -0
  180. package/node_modules/path-scurry/dist/commonjs/index.d.ts.map +1 -0
  181. package/node_modules/path-scurry/dist/commonjs/index.js +2018 -0
  182. package/node_modules/path-scurry/dist/commonjs/index.js.map +1 -0
  183. package/node_modules/path-scurry/dist/commonjs/package.json +3 -0
  184. package/node_modules/path-scurry/dist/esm/index.d.ts +1115 -0
  185. package/node_modules/path-scurry/dist/esm/index.d.ts.map +1 -0
  186. package/node_modules/path-scurry/dist/esm/index.js +1983 -0
  187. package/node_modules/path-scurry/dist/esm/index.js.map +1 -0
  188. package/node_modules/path-scurry/dist/esm/package.json +3 -0
  189. package/node_modules/path-scurry/node_modules/lru-cache/LICENSE.md +55 -0
  190. package/node_modules/path-scurry/node_modules/lru-cache/README.md +383 -0
  191. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts +1323 -0
  192. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts.map +1 -0
  193. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js +1589 -0
  194. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js.map +1 -0
  195. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js +2 -0
  196. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js.map +7 -0
  197. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/package.json +3 -0
  198. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts +1323 -0
  199. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts.map +1 -0
  200. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js +1585 -0
  201. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js.map +1 -0
  202. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js +2 -0
  203. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js.map +7 -0
  204. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/package.json +3 -0
  205. package/node_modules/path-scurry/node_modules/lru-cache/package.json +101 -0
  206. package/node_modules/path-scurry/package.json +88 -0
  207. package/node_modules/rimraf/LICENSE.md +55 -0
  208. package/node_modules/rimraf/README.md +226 -0
  209. package/node_modules/rimraf/dist/commonjs/default-tmp.d.ts +3 -0
  210. package/node_modules/rimraf/dist/commonjs/default-tmp.d.ts.map +1 -0
  211. package/node_modules/rimraf/dist/commonjs/default-tmp.js +58 -0
  212. package/node_modules/rimraf/dist/commonjs/default-tmp.js.map +1 -0
  213. package/node_modules/rimraf/dist/commonjs/error.d.ts +6 -0
  214. package/node_modules/rimraf/dist/commonjs/error.d.ts.map +1 -0
  215. package/node_modules/rimraf/dist/commonjs/error.js +10 -0
  216. package/node_modules/rimraf/dist/commonjs/error.js.map +1 -0
  217. package/node_modules/rimraf/dist/commonjs/fix-eperm.d.ts +3 -0
  218. package/node_modules/rimraf/dist/commonjs/fix-eperm.d.ts.map +1 -0
  219. package/node_modules/rimraf/dist/commonjs/fix-eperm.js +38 -0
  220. package/node_modules/rimraf/dist/commonjs/fix-eperm.js.map +1 -0
  221. package/node_modules/rimraf/dist/commonjs/fs.d.ts +15 -0
  222. package/node_modules/rimraf/dist/commonjs/fs.d.ts.map +1 -0
  223. package/node_modules/rimraf/dist/commonjs/fs.js +33 -0
  224. package/node_modules/rimraf/dist/commonjs/fs.js.map +1 -0
  225. package/node_modules/rimraf/dist/commonjs/ignore-enoent.d.ts +3 -0
  226. package/node_modules/rimraf/dist/commonjs/ignore-enoent.d.ts.map +1 -0
  227. package/node_modules/rimraf/dist/commonjs/ignore-enoent.js +24 -0
  228. package/node_modules/rimraf/dist/commonjs/ignore-enoent.js.map +1 -0
  229. package/node_modules/rimraf/dist/commonjs/index.d.ts +50 -0
  230. package/node_modules/rimraf/dist/commonjs/index.d.ts.map +1 -0
  231. package/node_modules/rimraf/dist/commonjs/index.js +78 -0
  232. package/node_modules/rimraf/dist/commonjs/index.js.map +1 -0
  233. package/node_modules/rimraf/dist/commonjs/opt-arg.d.ts +34 -0
  234. package/node_modules/rimraf/dist/commonjs/opt-arg.d.ts.map +1 -0
  235. package/node_modules/rimraf/dist/commonjs/opt-arg.js +53 -0
  236. package/node_modules/rimraf/dist/commonjs/opt-arg.js.map +1 -0
  237. package/node_modules/rimraf/dist/commonjs/package.json +3 -0
  238. package/node_modules/rimraf/dist/commonjs/path-arg.d.ts +4 -0
  239. package/node_modules/rimraf/dist/commonjs/path-arg.d.ts.map +1 -0
  240. package/node_modules/rimraf/dist/commonjs/path-arg.js +48 -0
  241. package/node_modules/rimraf/dist/commonjs/path-arg.js.map +1 -0
  242. package/node_modules/rimraf/dist/commonjs/readdir-or-error.d.ts +3 -0
  243. package/node_modules/rimraf/dist/commonjs/readdir-or-error.d.ts.map +1 -0
  244. package/node_modules/rimraf/dist/commonjs/readdir-or-error.js +19 -0
  245. package/node_modules/rimraf/dist/commonjs/readdir-or-error.js.map +1 -0
  246. package/node_modules/rimraf/dist/commonjs/retry-busy.d.ts +8 -0
  247. package/node_modules/rimraf/dist/commonjs/retry-busy.d.ts.map +1 -0
  248. package/node_modules/rimraf/dist/commonjs/retry-busy.js +65 -0
  249. package/node_modules/rimraf/dist/commonjs/retry-busy.js.map +1 -0
  250. package/node_modules/rimraf/dist/commonjs/rimraf-manual.d.ts +3 -0
  251. package/node_modules/rimraf/dist/commonjs/rimraf-manual.d.ts.map +1 -0
  252. package/node_modules/rimraf/dist/commonjs/rimraf-manual.js +8 -0
  253. package/node_modules/rimraf/dist/commonjs/rimraf-manual.js.map +1 -0
  254. package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.d.ts +4 -0
  255. package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.d.ts.map +1 -0
  256. package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.js +138 -0
  257. package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.js.map +1 -0
  258. package/node_modules/rimraf/dist/commonjs/rimraf-native.d.ts +4 -0
  259. package/node_modules/rimraf/dist/commonjs/rimraf-native.d.ts.map +1 -0
  260. package/node_modules/rimraf/dist/commonjs/rimraf-native.js +24 -0
  261. package/node_modules/rimraf/dist/commonjs/rimraf-native.js.map +1 -0
  262. package/node_modules/rimraf/dist/commonjs/rimraf-posix.d.ts +4 -0
  263. package/node_modules/rimraf/dist/commonjs/rimraf-posix.d.ts.map +1 -0
  264. package/node_modules/rimraf/dist/commonjs/rimraf-posix.js +103 -0
  265. package/node_modules/rimraf/dist/commonjs/rimraf-posix.js.map +1 -0
  266. package/node_modules/rimraf/dist/commonjs/rimraf-windows.d.ts +4 -0
  267. package/node_modules/rimraf/dist/commonjs/rimraf-windows.d.ts.map +1 -0
  268. package/node_modules/rimraf/dist/commonjs/rimraf-windows.js +159 -0
  269. package/node_modules/rimraf/dist/commonjs/rimraf-windows.js.map +1 -0
  270. package/node_modules/rimraf/dist/commonjs/use-native.d.ts +4 -0
  271. package/node_modules/rimraf/dist/commonjs/use-native.d.ts.map +1 -0
  272. package/node_modules/rimraf/dist/commonjs/use-native.js +18 -0
  273. package/node_modules/rimraf/dist/commonjs/use-native.js.map +1 -0
  274. package/node_modules/rimraf/dist/esm/bin.d.mts +3 -0
  275. package/node_modules/rimraf/dist/esm/bin.d.mts.map +1 -0
  276. package/node_modules/rimraf/dist/esm/bin.mjs +250 -0
  277. package/node_modules/rimraf/dist/esm/bin.mjs.map +1 -0
  278. package/node_modules/rimraf/dist/esm/default-tmp.d.ts +3 -0
  279. package/node_modules/rimraf/dist/esm/default-tmp.d.ts.map +1 -0
  280. package/node_modules/rimraf/dist/esm/default-tmp.js +55 -0
  281. package/node_modules/rimraf/dist/esm/default-tmp.js.map +1 -0
  282. package/node_modules/rimraf/dist/esm/error.d.ts +6 -0
  283. package/node_modules/rimraf/dist/esm/error.d.ts.map +1 -0
  284. package/node_modules/rimraf/dist/esm/error.js +5 -0
  285. package/node_modules/rimraf/dist/esm/error.js.map +1 -0
  286. package/node_modules/rimraf/dist/esm/fix-eperm.d.ts +3 -0
  287. package/node_modules/rimraf/dist/esm/fix-eperm.d.ts.map +1 -0
  288. package/node_modules/rimraf/dist/esm/fix-eperm.js +33 -0
  289. package/node_modules/rimraf/dist/esm/fix-eperm.js.map +1 -0
  290. package/node_modules/rimraf/dist/esm/fs.d.ts +15 -0
  291. package/node_modules/rimraf/dist/esm/fs.d.ts.map +1 -0
  292. package/node_modules/rimraf/dist/esm/fs.js +18 -0
  293. package/node_modules/rimraf/dist/esm/fs.js.map +1 -0
  294. package/node_modules/rimraf/dist/esm/ignore-enoent.d.ts +3 -0
  295. package/node_modules/rimraf/dist/esm/ignore-enoent.d.ts.map +1 -0
  296. package/node_modules/rimraf/dist/esm/ignore-enoent.js +19 -0
  297. package/node_modules/rimraf/dist/esm/ignore-enoent.js.map +1 -0
  298. package/node_modules/rimraf/dist/esm/index.d.ts +50 -0
  299. package/node_modules/rimraf/dist/esm/index.d.ts.map +1 -0
  300. package/node_modules/rimraf/dist/esm/index.js +70 -0
  301. package/node_modules/rimraf/dist/esm/index.js.map +1 -0
  302. package/node_modules/rimraf/dist/esm/opt-arg.d.ts +34 -0
  303. package/node_modules/rimraf/dist/esm/opt-arg.d.ts.map +1 -0
  304. package/node_modules/rimraf/dist/esm/opt-arg.js +46 -0
  305. package/node_modules/rimraf/dist/esm/opt-arg.js.map +1 -0
  306. package/node_modules/rimraf/dist/esm/package.json +3 -0
  307. package/node_modules/rimraf/dist/esm/path-arg.d.ts +4 -0
  308. package/node_modules/rimraf/dist/esm/path-arg.d.ts.map +1 -0
  309. package/node_modules/rimraf/dist/esm/path-arg.js +46 -0
  310. package/node_modules/rimraf/dist/esm/path-arg.js.map +1 -0
  311. package/node_modules/rimraf/dist/esm/readdir-or-error.d.ts +3 -0
  312. package/node_modules/rimraf/dist/esm/readdir-or-error.d.ts.map +1 -0
  313. package/node_modules/rimraf/dist/esm/readdir-or-error.js +14 -0
  314. package/node_modules/rimraf/dist/esm/readdir-or-error.js.map +1 -0
  315. package/node_modules/rimraf/dist/esm/retry-busy.d.ts +8 -0
  316. package/node_modules/rimraf/dist/esm/retry-busy.d.ts.map +1 -0
  317. package/node_modules/rimraf/dist/esm/retry-busy.js +60 -0
  318. package/node_modules/rimraf/dist/esm/retry-busy.js.map +1 -0
  319. package/node_modules/rimraf/dist/esm/rimraf-manual.d.ts +3 -0
  320. package/node_modules/rimraf/dist/esm/rimraf-manual.d.ts.map +1 -0
  321. package/node_modules/rimraf/dist/esm/rimraf-manual.js +5 -0
  322. package/node_modules/rimraf/dist/esm/rimraf-manual.js.map +1 -0
  323. package/node_modules/rimraf/dist/esm/rimraf-move-remove.d.ts +4 -0
  324. package/node_modules/rimraf/dist/esm/rimraf-move-remove.d.ts.map +1 -0
  325. package/node_modules/rimraf/dist/esm/rimraf-move-remove.js +133 -0
  326. package/node_modules/rimraf/dist/esm/rimraf-move-remove.js.map +1 -0
  327. package/node_modules/rimraf/dist/esm/rimraf-native.d.ts +4 -0
  328. package/node_modules/rimraf/dist/esm/rimraf-native.d.ts.map +1 -0
  329. package/node_modules/rimraf/dist/esm/rimraf-native.js +19 -0
  330. package/node_modules/rimraf/dist/esm/rimraf-native.js.map +1 -0
  331. package/node_modules/rimraf/dist/esm/rimraf-posix.d.ts +4 -0
  332. package/node_modules/rimraf/dist/esm/rimraf-posix.d.ts.map +1 -0
  333. package/node_modules/rimraf/dist/esm/rimraf-posix.js +98 -0
  334. package/node_modules/rimraf/dist/esm/rimraf-posix.js.map +1 -0
  335. package/node_modules/rimraf/dist/esm/rimraf-windows.d.ts +4 -0
  336. package/node_modules/rimraf/dist/esm/rimraf-windows.d.ts.map +1 -0
  337. package/node_modules/rimraf/dist/esm/rimraf-windows.js +154 -0
  338. package/node_modules/rimraf/dist/esm/rimraf-windows.js.map +1 -0
  339. package/node_modules/rimraf/dist/esm/use-native.d.ts +4 -0
  340. package/node_modules/rimraf/dist/esm/use-native.d.ts.map +1 -0
  341. package/node_modules/rimraf/dist/esm/use-native.js +15 -0
  342. package/node_modules/rimraf/dist/esm/use-native.js.map +1 -0
  343. package/node_modules/rimraf/package.json +92 -0
  344. package/package.json +152 -0
  345. package/scripts/install-scanners.js +258 -0
  346. package/scripts/watchdog.js +147 -0
  347. package/src/analyzers/CSSAnalyzer.js +297 -0
  348. package/src/analyzers/ConfigValidator.js +690 -0
  349. package/src/analyzers/ESLintAnalyzer.js +320 -0
  350. package/src/analyzers/JavaScriptAnalyzer.js +261 -0
  351. package/src/analyzers/PrettierFormatter.js +247 -0
  352. package/src/analyzers/PythonAnalyzer.js +283 -0
  353. package/src/analyzers/SecurityAnalyzer.js +729 -0
  354. package/src/analyzers/SparrowAnalyzer.js +341 -0
  355. package/src/analyzers/TypeScriptAnalyzer.js +247 -0
  356. package/src/analyzers/codeCloneDetector/analyzer.js +344 -0
  357. package/src/analyzers/codeCloneDetector/detector.js +250 -0
  358. package/src/analyzers/codeCloneDetector/index.js +192 -0
  359. package/src/analyzers/codeCloneDetector/parser.js +199 -0
  360. package/src/analyzers/codeCloneDetector/reporter.js +148 -0
  361. package/src/analyzers/codeCloneDetector/scanner.js +88 -0
  362. package/src/core/agentPool.js +1957 -0
  363. package/src/core/agentScheduler.js +3212 -0
  364. package/src/core/contextManager.js +709 -0
  365. package/src/core/flowExecutor.js +928 -0
  366. package/src/core/messageProcessor.js +808 -0
  367. package/src/core/orchestrator.js +584 -0
  368. package/src/core/stateManager.js +1500 -0
  369. package/src/index.js +972 -0
  370. package/src/interfaces/cli.js +553 -0
  371. package/src/interfaces/terminal/__tests__/smoke/advancedFeatures.test.js +208 -0
  372. package/src/interfaces/terminal/__tests__/smoke/agentControl.test.js +236 -0
  373. package/src/interfaces/terminal/__tests__/smoke/agents.test.js +138 -0
  374. package/src/interfaces/terminal/__tests__/smoke/components.test.js +137 -0
  375. package/src/interfaces/terminal/__tests__/smoke/connection.test.js +350 -0
  376. package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +156 -0
  377. package/src/interfaces/terminal/__tests__/smoke/imports.test.js +332 -0
  378. package/src/interfaces/terminal/__tests__/smoke/messages.test.js +256 -0
  379. package/src/interfaces/terminal/__tests__/smoke/tools.test.js +388 -0
  380. package/src/interfaces/terminal/api/apiClient.js +299 -0
  381. package/src/interfaces/terminal/api/messageRouter.js +262 -0
  382. package/src/interfaces/terminal/api/session.js +266 -0
  383. package/src/interfaces/terminal/api/websocket.js +497 -0
  384. package/src/interfaces/terminal/components/AgentCreator.js +705 -0
  385. package/src/interfaces/terminal/components/AgentEditor.js +678 -0
  386. package/src/interfaces/terminal/components/AgentSwitcher.js +330 -0
  387. package/src/interfaces/terminal/components/ErrorBoundary.js +92 -0
  388. package/src/interfaces/terminal/components/ErrorPanel.js +264 -0
  389. package/src/interfaces/terminal/components/Header.js +28 -0
  390. package/src/interfaces/terminal/components/HelpPanel.js +231 -0
  391. package/src/interfaces/terminal/components/InputBox.js +118 -0
  392. package/src/interfaces/terminal/components/Layout.js +603 -0
  393. package/src/interfaces/terminal/components/LoadingSpinner.js +71 -0
  394. package/src/interfaces/terminal/components/MessageList.js +281 -0
  395. package/src/interfaces/terminal/components/MultilineTextInput.js +251 -0
  396. package/src/interfaces/terminal/components/SearchPanel.js +265 -0
  397. package/src/interfaces/terminal/components/SettingsPanel.js +415 -0
  398. package/src/interfaces/terminal/components/StatusBar.js +65 -0
  399. package/src/interfaces/terminal/components/TextInput.js +127 -0
  400. package/src/interfaces/terminal/config/agentEditorConstants.js +227 -0
  401. package/src/interfaces/terminal/config/constants.js +393 -0
  402. package/src/interfaces/terminal/index.js +168 -0
  403. package/src/interfaces/terminal/state/useAgentControl.js +496 -0
  404. package/src/interfaces/terminal/state/useAgents.js +537 -0
  405. package/src/interfaces/terminal/state/useConnection.js +444 -0
  406. package/src/interfaces/terminal/state/useMessages.js +630 -0
  407. package/src/interfaces/terminal/state/useTools.js +554 -0
  408. package/src/interfaces/terminal/utils/debugLogger.js +44 -0
  409. package/src/interfaces/terminal/utils/settingsStorage.js +232 -0
  410. package/src/interfaces/terminal/utils/theme.js +85 -0
  411. package/src/interfaces/webServer.js +5457 -0
  412. package/src/modules/fileExplorer/controller.js +413 -0
  413. package/src/modules/fileExplorer/index.js +37 -0
  414. package/src/modules/fileExplorer/middleware.js +92 -0
  415. package/src/modules/fileExplorer/routes.js +158 -0
  416. package/src/modules/fileExplorer/types.js +44 -0
  417. package/src/services/agentActivityService.js +399 -0
  418. package/src/services/aiService.js +2618 -0
  419. package/src/services/apiKeyManager.js +334 -0
  420. package/src/services/benchmarkService.js +196 -0
  421. package/src/services/budgetService.js +565 -0
  422. package/src/services/contextInjectionService.js +268 -0
  423. package/src/services/conversationCompactionService.js +1103 -0
  424. package/src/services/credentialVault.js +685 -0
  425. package/src/services/errorHandler.js +810 -0
  426. package/src/services/fileAttachmentService.js +547 -0
  427. package/src/services/flowContextService.js +189 -0
  428. package/src/services/memoryService.js +521 -0
  429. package/src/services/modelRouterService.js +365 -0
  430. package/src/services/modelsService.js +323 -0
  431. package/src/services/ollamaService.js +452 -0
  432. package/src/services/portRegistry.js +336 -0
  433. package/src/services/portTracker.js +223 -0
  434. package/src/services/projectDetector.js +404 -0
  435. package/src/services/promptService.js +372 -0
  436. package/src/services/qualityInspector.js +796 -0
  437. package/src/services/scheduleService.js +725 -0
  438. package/src/services/serviceRegistry.js +386 -0
  439. package/src/services/skillsService.js +486 -0
  440. package/src/services/telegramService.js +920 -0
  441. package/src/services/tokenCountingService.js +316 -0
  442. package/src/services/visualEditorBridge.js +1033 -0
  443. package/src/services/visualEditorServer.js +1727 -0
  444. package/src/services/whatsappService.js +663 -0
  445. package/src/tools/__tests__/webTool.e2e.test.js +569 -0
  446. package/src/tools/__tests__/webTool.unit.test.js +195 -0
  447. package/src/tools/agentCommunicationTool.js +1343 -0
  448. package/src/tools/agentDelayTool.js +498 -0
  449. package/src/tools/asyncToolManager.js +604 -0
  450. package/src/tools/baseTool.js +887 -0
  451. package/src/tools/browserTool.js +897 -0
  452. package/src/tools/cloneDetectionTool.js +581 -0
  453. package/src/tools/codeMapTool.js +857 -0
  454. package/src/tools/dependencyResolverTool.js +1212 -0
  455. package/src/tools/docxTool.js +623 -0
  456. package/src/tools/excelTool.js +636 -0
  457. package/src/tools/fileContentReplaceTool.js +840 -0
  458. package/src/tools/fileTreeTool.js +833 -0
  459. package/src/tools/filesystemTool.js +1217 -0
  460. package/src/tools/helpTool.js +198 -0
  461. package/src/tools/imageTool.js +1034 -0
  462. package/src/tools/importAnalyzerTool.js +1056 -0
  463. package/src/tools/jobDoneTool.js +388 -0
  464. package/src/tools/memoryTool.js +554 -0
  465. package/src/tools/pdfTool.js +627 -0
  466. package/src/tools/seekTool.js +883 -0
  467. package/src/tools/skillsTool.js +276 -0
  468. package/src/tools/staticAnalysisTool.js +2146 -0
  469. package/src/tools/taskManagerTool.js +2836 -0
  470. package/src/tools/terminalTool.js +2486 -0
  471. package/src/tools/userPromptTool.js +474 -0
  472. package/src/tools/videoTool.js +1139 -0
  473. package/src/tools/visionTool.js +507 -0
  474. package/src/tools/visualEditorTool.js +1175 -0
  475. package/src/tools/webTool.js +3114 -0
  476. package/src/tools/whatsappTool.js +457 -0
  477. package/src/types/agent.js +519 -0
  478. package/src/types/contextReference.js +972 -0
  479. package/src/types/conversation.js +730 -0
  480. package/src/types/toolCommand.js +747 -0
  481. package/src/utilities/attachmentValidator.js +288 -0
  482. package/src/utilities/browserStealth.js +630 -0
  483. package/src/utilities/configManager.js +618 -0
  484. package/src/utilities/constants.js +870 -0
  485. package/src/utilities/directoryAccessManager.js +566 -0
  486. package/src/utilities/fileProcessor.js +307 -0
  487. package/src/utilities/humanBehavior.js +453 -0
  488. package/src/utilities/jsonRepair.js +242 -0
  489. package/src/utilities/logger.js +436 -0
  490. package/src/utilities/platformUtils.js +255 -0
  491. package/src/utilities/platformUtils.test.js +98 -0
  492. package/src/utilities/stealthConstants.js +377 -0
  493. package/src/utilities/structuredFileValidator.js +699 -0
  494. package/src/utilities/tagParser.js +878 -0
  495. package/src/utilities/toolConstants.js +415 -0
  496. package/src/utilities/userDataDir.js +300 -0
  497. package/web-ui/build/brands/autopilot/favicon.svg +1 -0
  498. package/web-ui/build/brands/autopilot/logo.webp +0 -0
  499. package/web-ui/build/brands/onbuzz/favicon.svg +1 -0
  500. package/web-ui/build/brands/onbuzz/logo-text.webp +0 -0
  501. package/web-ui/build/brands/onbuzz/logo.webp +0 -0
  502. package/web-ui/build/index.html +15 -0
  503. package/web-ui/build/logo.png +0 -0
  504. package/web-ui/build/logo2.png +0 -0
  505. package/web-ui/build/static/index-SmQFfvBs.js +746 -0
  506. package/web-ui/build/static/index-V2ySwjHp.css +1 -0
@@ -0,0 +1,365 @@
1
+ /**
2
+ * ModelRouterService - Uses PHI-4 to make intelligent model routing decisions
3
+ *
4
+ * Purpose:
5
+ * - Analyze incoming messages and conversation context
6
+ * - Use PHI-4 to determine optimal model for each message
7
+ * - Provide fallback to previous model on errors
8
+ * - Consider benchmark data and recent message history
9
+ */
10
+
11
+ import { MODEL_ROUTER_CONFIG, HTTP_STATUS, MODELS } from '../utilities/constants.js';
12
+
13
+ class ModelRouterService {
14
+ constructor(config, logger, benchmarkService, aiService) {
15
+ this.config = config;
16
+ this.logger = logger;
17
+ this.benchmarkService = benchmarkService;
18
+ this.aiService = aiService;
19
+
20
+ this.routerModel = MODEL_ROUTER_CONFIG.ROUTER_MODEL;
21
+ this.contextMessagesCount = MODEL_ROUTER_CONFIG.CONTEXT_MESSAGES_COUNT;
22
+ this.requestTimeout = MODEL_ROUTER_CONFIG.REQUEST_TIMEOUT;
23
+ }
24
+
25
+ /**
26
+ * Route message to optimal model using autopilot-model-router analysis
27
+ * @param {Object} message - Current message to route
28
+ * @param {Array} recentMessages - Recent conversation history
29
+ * @param {string} currentModel - Current model being used
30
+ * @param {Array} availableModels - Models available for routing
31
+ * @param {Object} context - Message context with API keys
32
+ * @returns {Promise<string>} Selected model name
33
+ */
34
+ async routeMessage(message, recentMessages = [], currentModel = '', availableModels = [], context = {}) {
35
+ try {
36
+ this.logger.debug('Starting model routing analysis', {
37
+ messageLength: message.content?.length || 0,
38
+ recentMessagesCount: recentMessages.length,
39
+ currentModel,
40
+ availableModelsCount: availableModels.length
41
+ });
42
+
43
+ // Build context for autopilot-model-router
44
+ const routingContext = this._buildRoutingContext(
45
+ message,
46
+ recentMessages,
47
+ currentModel,
48
+ availableModels
49
+ );
50
+
51
+ // Get benchmark data
52
+ const benchmarkTable = this.benchmarkService.getBenchmarkTable();
53
+
54
+ // Create routing prompt for autopilot-model-router
55
+ const routingPrompt = this._createRoutingPrompt(routingContext, benchmarkTable, context.routingStrategy);
56
+
57
+ // Send to autopilot-model-router for analysis
58
+ const routingDecision = await this._askForRouting(routingPrompt, context);
59
+
60
+ // Validate and return model selection
61
+ const selectedModel = this._validateModelSelection(routingDecision, availableModels, currentModel);
62
+
63
+ this.logger.info('Model routing completed', {
64
+ selectedModel,
65
+ previousModel: currentModel,
66
+ changed: selectedModel !== currentModel,
67
+ reasoning: routingDecision.reasoning?.substring(0, 100) || 'No reasoning provided'
68
+ });
69
+
70
+ // Return full routing result object for AgentScheduler
71
+ return {
72
+ selectedModel,
73
+ previousModel: currentModel,
74
+ changed: selectedModel !== currentModel,
75
+ reasoning: routingDecision.reasoning || 'No reasoning provided'
76
+ };
77
+
78
+ } catch (error) {
79
+ this.logger.error('Model routing failed, falling back to current model', {
80
+ error: error.message,
81
+ currentModel
82
+ });
83
+
84
+ // Fallback to current model on any error
85
+ const fallbackModel = currentModel || availableModels[0] || MODELS.ANTHROPIC_SONNET;
86
+ return {
87
+ selectedModel: fallbackModel,
88
+ previousModel: currentModel,
89
+ changed: false,
90
+ reasoning: 'Routing failed, using fallback model'
91
+ };
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Build routing context from message and conversation history
97
+ * @private
98
+ */
99
+ _buildRoutingContext(message, recentMessages, currentModel, availableModels) {
100
+ // Get recent messages (configurable count)
101
+ const contextMessages = recentMessages
102
+ .slice(-this.contextMessagesCount)
103
+ .map(msg => ({
104
+ role: msg.role,
105
+ content: msg.content?.substring(0, 500) || '', // Limit content length
106
+ timestamp: msg.timestamp
107
+ }));
108
+
109
+ return {
110
+ currentMessage: {
111
+ content: message.content?.substring(0, 1000) || '', // Limit current message
112
+ role: message.role || 'user',
113
+ hasContextReferences: !!(message.contextReferences?.length),
114
+ contextTypes: message.contextReferences?.map(ref => ref.type) || []
115
+ },
116
+ recentMessages: contextMessages,
117
+ currentModel,
118
+ availableModels: availableModels.map(model => {
119
+ const name = typeof model === 'string' ? model : (model.id || model.name);
120
+ const pricing = typeof model === 'object' ? model.pricing : null;
121
+ return {
122
+ name,
123
+ isCurrentModel: name === currentModel,
124
+ ...(pricing && { pricing })
125
+ };
126
+ }),
127
+ messageCount: recentMessages.length + 1,
128
+ timestamp: new Date().toISOString()
129
+ };
130
+ }
131
+
132
+ /**
133
+ * Create routing prompt for autopilot-model-router
134
+ * @private
135
+ */
136
+ _createRoutingPrompt(context, benchmarkTable, routingStrategy) {
137
+ const maxLen = MODEL_ROUTER_CONFIG.MAX_ROUTING_STRATEGY_LENGTH;
138
+ const strategySection = routingStrategy?.trim()
139
+ ? `\n## Agent-Specific Routing Strategy\n${routingStrategy.trim().substring(0, maxLen)}\n\nApply the above strategy when making your routing decision. It takes priority over the generic criteria.\n`
140
+ : '';
141
+
142
+ return `You are a model routing assistant. Your job is to analyze a conversation and select the optimal AI model for the next response.
143
+
144
+ ## Current Situation
145
+ - **Current Model**: ${context.currentModel || 'None'}
146
+ - **Message Count**: ${context.messageCount}
147
+ - **Available Models**:
148
+ ${context.availableModels.map(m => {
149
+ const pricingInfo = m.pricing
150
+ ? ` (input: $${m.pricing.input}/1K tokens, output: $${m.pricing.output}/1K tokens)`
151
+ : '';
152
+ return ` - ${m.name}${m.isCurrentModel ? ' [current]' : ''}${pricingInfo}`;
153
+ }).join('\n')}
154
+
155
+ ## Recent Conversation Context
156
+ ${this._formatRecentMessages(context.recentMessages)}
157
+
158
+ ## Current Message to Route
159
+ **Role**: ${context.currentMessage.role}
160
+ **Content**: ${context.currentMessage.content}
161
+ **Has Context References**: ${context.currentMessage.hasContextReferences}
162
+ ${context.currentMessage.contextTypes.length > 0 ? `**Context Types**: ${context.currentMessage.contextTypes.join(', ')}` : ''}
163
+
164
+ ## Model Benchmark Data
165
+ ${this._formatBenchmarkData(benchmarkTable)}
166
+
167
+ ## Routing Decision
168
+ Analyze the current message and conversation context to select the best model. Consider:
169
+
170
+ 1. **Task Type**: Infer from conversation content - is this coding, analysis, creative writing, or a quick task?
171
+ 2. **Complexity**: Does it require deep reasoning or is it straightforward?
172
+ 3. **Context**: Are there code files or technical references?
173
+ 4. **Conversation Flow**: What has been discussed recently to understand the overall task?
174
+ 5. **Efficiency**: Balance performance with cost/speed needs
175
+ ${strategySection}
176
+ Respond with JSON only:
177
+ {
178
+ "selectedModel": "model-name",
179
+ "taskType": "coding|analysis|creative|quick-tasks",
180
+ "confidence": 0.85,
181
+ "reasoning": "Brief explanation of why this model was chosen",
182
+ "factors": ["factor1", "factor2", "factor3"]
183
+ }`;
184
+ }
185
+
186
+ /**
187
+ * Format recent messages for prompt
188
+ * @private
189
+ */
190
+ _formatRecentMessages(messages) {
191
+ if (!messages.length) {
192
+ return 'No recent messages available.';
193
+ }
194
+
195
+ return messages.map((msg, i) =>
196
+ `${i + 1}. **${msg.role}**: ${msg.content}`
197
+ ).join('\n');
198
+ }
199
+
200
+ /**
201
+ * Format benchmark data for prompt
202
+ * @private
203
+ */
204
+ _formatBenchmarkData(benchmarkText) {
205
+ // Benchmark text is provided as-is from backend, no processing needed
206
+ if (!benchmarkText) {
207
+ return 'No benchmark data available.';
208
+ }
209
+ return benchmarkText;
210
+ }
211
+
212
+ /**
213
+ * Send routing request to autopilot-model-router
214
+ * @private
215
+ */
216
+ async _askForRouting(prompt, context = {}) {
217
+ try {
218
+ // Use AI service to send request to autopilot-model-router
219
+ const response = await this.aiService.sendMessage(
220
+ this.routerModel,
221
+ prompt,
222
+ {
223
+ agentId: 'model-router',
224
+ systemPrompt: 'You are a model routing expert. Analyze conversations and select optimal AI models. Always respond with valid JSON only.',
225
+ temperature: 0.3, // Low temperature for consistent routing decisions
226
+ maxTokens: 500,
227
+ timeout: this.requestTimeout,
228
+ sessionId: context.sessionId, // CRITICAL: Pass sessionId for API key retrieval
229
+ apiKey: context.apiKey || this.config.apiKey, // Fallback to API key from context if available
230
+ customApiKeys: context.customApiKeys,
231
+ platformProvided: true // autopilot-model-router is a platform model
232
+ }
233
+ );
234
+
235
+ if (!response.content) {
236
+ throw new Error('No response content from autopilot-model-router');
237
+ }
238
+
239
+ // Parse JSON response
240
+ const routingDecision = this._parseRoutingResponse(response.content);
241
+
242
+ return routingDecision;
243
+
244
+ } catch (error) {
245
+ this.logger.error('autopilot-model-router routing request failed', {
246
+ error: error.message,
247
+ routerModel: this.routerModel
248
+ });
249
+ throw error;
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Parse autopilot-model-router routing response
255
+ * @private
256
+ */
257
+ _parseRoutingResponse(content) {
258
+ try {
259
+ // Try to extract JSON from response
260
+ const jsonMatch = content.match(/\{[\s\S]*\}/);
261
+ if (!jsonMatch) {
262
+ throw new Error('No JSON found in autopilot-model-router response');
263
+ }
264
+
265
+ const parsed = JSON.parse(jsonMatch[0]);
266
+
267
+ // Validate required fields
268
+ if (!parsed.selectedModel) {
269
+ throw new Error('Missing selectedModel in autopilot-model-router response');
270
+ }
271
+
272
+ return {
273
+ selectedModel: parsed.selectedModel,
274
+ taskType: parsed.taskType || 'unknown',
275
+ confidence: parsed.confidence || 0.5,
276
+ reasoning: parsed.reasoning || 'No reasoning provided',
277
+ factors: parsed.factors || []
278
+ };
279
+
280
+ } catch (error) {
281
+ this.logger.warn('Failed to parse autopilot-model-router routing response', {
282
+ error: error.message,
283
+ content: content.substring(0, 200)
284
+ });
285
+
286
+ // Return default response on parse error
287
+ return {
288
+ selectedModel: null,
289
+ taskType: 'unknown',
290
+ confidence: 0.0,
291
+ reasoning: 'Failed to parse routing response',
292
+ factors: ['parsing-error']
293
+ };
294
+ }
295
+ }
296
+
297
+ /**
298
+ * Validate model selection against available models
299
+ * @private
300
+ */
301
+ _validateModelSelection(routingDecision, availableModels, currentModel) {
302
+ const { selectedModel } = routingDecision;
303
+
304
+ // If no model selected or parsing failed, use current model
305
+ if (!selectedModel) {
306
+ this.logger.debug('No model selected by router, using current model');
307
+ return currentModel;
308
+ }
309
+
310
+ // Check if selected model is available (supports both string arrays and object arrays)
311
+ const modelNames = availableModels.map(m => typeof m === 'string' ? m : (m.id || m.name));
312
+ if (!modelNames.includes(selectedModel)) {
313
+ this.logger.warn('Router selected unavailable model, using current model', {
314
+ selectedModel,
315
+ availableModels: modelNames
316
+ });
317
+ return currentModel;
318
+ }
319
+
320
+ // Model is valid
321
+ return selectedModel;
322
+ }
323
+
324
+ /**
325
+ * Get router service status
326
+ */
327
+ getStatus() {
328
+ return {
329
+ routerModel: this.routerModel,
330
+ contextMessagesCount: this.contextMessagesCount,
331
+ requestTimeout: this.requestTimeout,
332
+ benchmarkServiceStatus: this.benchmarkService.getStatus(),
333
+ isAvailable: true
334
+ };
335
+ }
336
+
337
+ /**
338
+ * Test router with sample data
339
+ */
340
+ async testRouter() {
341
+ try {
342
+ const testMessage = {
343
+ content: 'Can you help me debug this JavaScript function?',
344
+ role: 'user'
345
+ };
346
+
347
+ const testResult = await this.routeMessage(
348
+ testMessage,
349
+ [],
350
+ MODELS.ANTHROPIC_SONNET,
351
+ [MODELS.ANTHROPIC_SONNET, MODELS.GPT_4, MODELS.GPT_5_1_CODEX_MINI, MODELS.DEEPSEEK_R1],
352
+ { apiKey: 'test-key' } // Mock context for testing
353
+ );
354
+
355
+ this.logger.info('Router test completed', { selectedModel: testResult });
356
+ return { success: true, selectedModel: testResult };
357
+
358
+ } catch (error) {
359
+ this.logger.error('Router test failed', { error: error.message });
360
+ return { success: false, error: error.message };
361
+ }
362
+ }
363
+ }
364
+
365
+ export default ModelRouterService;
@@ -0,0 +1,323 @@
1
+ /**
2
+ * ModelsService - Manages available models from the backend API
3
+ *
4
+ * Purpose:
5
+ * - Fetch available models from /api/llm/models endpoint
6
+ * - Cache models for the session
7
+ * - Provide model names for routing
8
+ * - Show errors when API is unavailable
9
+ */
10
+
11
+ class ModelsService {
12
+ constructor(config, logger) {
13
+ this.config = config;
14
+ this.logger = logger;
15
+
16
+ this.models = null;
17
+ this.lastFetched = null;
18
+ this.isLoading = false;
19
+ this.cacheExpiry = 5 * 60 * 1000; // 5 minutes cache
20
+
21
+ // Use config backend URL (set via LOXIA_BACKEND_URL env var), fallback to local server
22
+ this.backendUrl = config.backend?.baseUrl || config.backendUrl || 'http://localhost:8080';
23
+
24
+ // Retry configuration
25
+ this.retryAttempts = 0;
26
+ this.maxRetries = 3;
27
+ this.retryDelay = 2000; // Start with 2 seconds
28
+ this.retryTimer = null;
29
+ this.lastError = null;
30
+
31
+ // API Key Manager reference (will be set by LoxiaSystem)
32
+ this.apiKeyManager = null;
33
+ }
34
+
35
+ /**
36
+ * Set API key manager instance
37
+ * @param {ApiKeyManager} apiKeyManager - API key manager instance
38
+ */
39
+ setApiKeyManager(apiKeyManager) {
40
+ this.apiKeyManager = apiKeyManager;
41
+
42
+ this.logger?.info('API key manager set for models service', {
43
+ hasManager: !!apiKeyManager
44
+ });
45
+ }
46
+
47
+ /**
48
+ * Initialize the models service and fetch initial data
49
+ */
50
+ async initialize() {
51
+ try {
52
+ await this.fetchModels();
53
+ this.logger.info('Models service initialized', {
54
+ modelCount: this.models?.length || 0
55
+ });
56
+ } catch (error) {
57
+ this.lastError = error.message;
58
+ this.logger.error('Failed to initialize models service - NO FALLBACK AVAILABLE', {
59
+ error: error.message,
60
+ endpoint: this.backendUrl,
61
+ willRetry: true
62
+ });
63
+ // Schedule retry instead of using hardcoded fallback
64
+ this._scheduleRetry();
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Get available model names for routing
70
+ */
71
+ getAvailableModelNames() {
72
+ if (!this.models || this.models.length === 0) {
73
+ this.logger.error('No models available - API fetch failed', {
74
+ lastError: this.lastError,
75
+ endpoint: this.backendUrl,
76
+ retryAttempt: this.retryAttempts,
77
+ maxRetries: this.maxRetries
78
+ });
79
+ return [];
80
+ }
81
+
82
+ return this.models.map(model => model.name);
83
+ }
84
+
85
+ /**
86
+ * Get all model information
87
+ */
88
+ getModels() {
89
+ if (!this.models || this.models.length === 0) {
90
+ this.logger.error('No models available - API fetch failed', {
91
+ lastError: this.lastError,
92
+ endpoint: this.backendUrl
93
+ });
94
+ return [];
95
+ }
96
+ return this.models;
97
+ }
98
+
99
+ /**
100
+ * Fetch models from backend API
101
+ * @param {Object} context - Optional context with API key
102
+ */
103
+ async fetchModels(context = null) {
104
+ if (this.isLoading) {
105
+ this.logger.debug('Models fetch already in progress');
106
+ return;
107
+ }
108
+
109
+ this.isLoading = true;
110
+ // Local server uses /api prefix, Azure backend doesn't
111
+ const isLocalServer = this.backendUrl.includes('localhost') || this.backendUrl.includes('127.0.0.1');
112
+ const url = isLocalServer ? `${this.backendUrl}/api/llm/models` : `${this.backendUrl}/llm/models`;
113
+
114
+ try {
115
+
116
+ // Get API key from multiple sources
117
+ let apiKey = null;
118
+
119
+ // First try to get from API key manager (global storage)
120
+ if (this.apiKeyManager) {
121
+ const keys = this.apiKeyManager.getKeysForRequest(null, {
122
+ platformProvided: true, // Models endpoint uses platform key
123
+ vendor: null
124
+ });
125
+ apiKey = keys.loxiaApiKey;
126
+ }
127
+
128
+ // Fallback to context, config, then environment
129
+ if (!apiKey && context && context.apiKey) {
130
+ apiKey = context.apiKey;
131
+ } else if (!apiKey && this.config.apiKey) {
132
+ apiKey = this.config.apiKey;
133
+ } else if (!apiKey && process.env.LOXIA_API_KEY) {
134
+ apiKey = process.env.LOXIA_API_KEY;
135
+ }
136
+
137
+ // Use AbortController for timeout (Node.js fetch doesn't support timeout option)
138
+ const controller = new AbortController();
139
+ const timeoutId = setTimeout(() => controller.abort(), 10000);
140
+
141
+ const fetchOptions = {
142
+ method: 'GET',
143
+ headers: {
144
+ 'Content-Type': 'application/json',
145
+ ...(apiKey && { 'Authorization': `Bearer ${apiKey}` })
146
+ },
147
+ signal: controller.signal
148
+ };
149
+
150
+ this.logger.debug('Fetching models from backend', {
151
+ url,
152
+ hasApiKey: !!apiKey,
153
+ apiKeySource: context?.apiKey ? 'context' : this.config.apiKey ? 'config' : process.env.LOXIA_API_KEY ? 'env' : 'none'
154
+ });
155
+
156
+ let response;
157
+ try {
158
+ response = await fetch(url, fetchOptions);
159
+ clearTimeout(timeoutId);
160
+ } catch (fetchError) {
161
+ clearTimeout(timeoutId);
162
+ if (fetchError.name === 'AbortError') {
163
+ throw new Error('Request timeout after 10 seconds');
164
+ }
165
+ throw fetchError;
166
+ }
167
+
168
+ if (!response.ok) {
169
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
170
+ }
171
+
172
+ const data = await response.json();
173
+
174
+ if (data.models && Array.isArray(data.models)) {
175
+ this.models = data.models;
176
+ this.lastFetched = new Date();
177
+ this.needsRefresh = false;
178
+
179
+ this.logger.info('Models fetched from backend', {
180
+ modelCount: this.models.length,
181
+ models: this.models.map(m => m.name)
182
+ });
183
+ } else {
184
+ throw new Error('Invalid response format from models API');
185
+ }
186
+
187
+ } catch (error) {
188
+ this.lastError = error.message;
189
+ this.logger.error('Failed to fetch models from backend - NO FALLBACK', {
190
+ error: error.message,
191
+ endpoint: url,
192
+ retryAttempt: this.retryAttempts,
193
+ maxRetries: this.maxRetries
194
+ });
195
+
196
+ // Schedule retry instead of using fallback
197
+ this._scheduleRetry(context);
198
+
199
+ // Rethrow if this was initial fetch and we have no models yet
200
+ if (!this.models) {
201
+ throw error;
202
+ }
203
+
204
+ } finally {
205
+ this.isLoading = false;
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Check if models cache needs refresh
211
+ */
212
+ needsRefresh() {
213
+ if (!this.lastFetched) return true;
214
+
215
+ const timeSinceUpdate = Date.now() - this.lastFetched.getTime();
216
+ return timeSinceUpdate > this.cacheExpiry;
217
+ }
218
+
219
+ /**
220
+ * Force refresh models from backend
221
+ * @param {Object} context - Optional context with API key
222
+ */
223
+ async refresh(context = null) {
224
+ this.logger.info('Force refreshing models');
225
+ await this.fetchModels(context);
226
+ }
227
+
228
+ /**
229
+ * Refresh models with API key context if needed
230
+ * @param {Object} context - Context with API key
231
+ */
232
+ async refreshWithContext(context) {
233
+ // Only refresh if we haven't successfully fetched or if we need a refresh
234
+ if (this.needsRefresh || !this.lastFetched) {
235
+ this.logger.debug('Refreshing models with API key context');
236
+ await this.fetchModels(context);
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Schedule retry for failed model fetch
242
+ * Implements exponential backoff
243
+ * @private
244
+ */
245
+ _scheduleRetry(context = null) {
246
+ // Clear any existing retry timer
247
+ if (this.retryTimer) {
248
+ clearTimeout(this.retryTimer);
249
+ this.retryTimer = null;
250
+ }
251
+
252
+ // Check if we've exceeded max retries
253
+ if (this.retryAttempts >= this.maxRetries) {
254
+ this.logger.error('Max retry attempts reached for model fetch', {
255
+ attempts: this.retryAttempts,
256
+ maxRetries: this.maxRetries,
257
+ lastError: this.lastError
258
+ });
259
+ return;
260
+ }
261
+
262
+ // Calculate delay with exponential backoff: 2s, 4s, 8s, etc.
263
+ const delay = this.retryDelay * Math.pow(2, this.retryAttempts);
264
+ this.retryAttempts++;
265
+
266
+ this.logger.info('Scheduling model fetch retry', {
267
+ attempt: this.retryAttempts,
268
+ maxRetries: this.maxRetries,
269
+ delayMs: delay
270
+ });
271
+
272
+ // Schedule retry
273
+ this.retryTimer = setTimeout(async () => {
274
+ this.logger.info('Executing scheduled model fetch retry', {
275
+ attempt: this.retryAttempts
276
+ });
277
+
278
+ try {
279
+ await this.fetchModels(context);
280
+ // Success - reset retry counter
281
+ this.retryAttempts = 0;
282
+ this.lastError = null;
283
+ } catch (error) {
284
+ // fetchModels will handle scheduling next retry
285
+ this.logger.warn('Retry attempt failed', {
286
+ attempt: this.retryAttempts,
287
+ error: error.message
288
+ });
289
+ }
290
+ }, delay);
291
+ }
292
+
293
+ /**
294
+ * Cancel any pending retry
295
+ * @private
296
+ */
297
+ _cancelRetry() {
298
+ if (this.retryTimer) {
299
+ clearTimeout(this.retryTimer);
300
+ this.retryTimer = null;
301
+ this.logger.debug('Cancelled pending model fetch retry');
302
+ }
303
+ }
304
+
305
+ /**
306
+ * Get service status
307
+ */
308
+ getStatus() {
309
+ return {
310
+ initialized: !!this.models,
311
+ lastFetched: this.lastFetched?.toISOString() || null,
312
+ modelCount: this.models?.length || 0,
313
+ isLoading: this.isLoading,
314
+ needsRefresh: this.needsRefresh(),
315
+ error: this.lastError || null,
316
+ retryAttempts: this.retryAttempts,
317
+ maxRetries: this.maxRetries,
318
+ hasError: !!this.lastError
319
+ };
320
+ }
321
+ }
322
+
323
+ export default ModelsService;