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,334 @@
1
+ /**
2
+ * API Key Manager - Persistent API key storage
3
+ *
4
+ * Purpose:
5
+ * - Store API keys with encrypted persistence to disk
6
+ * - Manage both platform (Loxia) and vendor-specific keys
7
+ * - Provide keys to AI services based on model requirements
8
+ * - Survive backend restarts by loading persisted keys
9
+ *
10
+ * Note: API keys are stored globally (not per-session) since there's
11
+ * only one user using the local backend. Session IDs are ephemeral
12
+ * and change on every restart, so session-based storage doesn't make sense.
13
+ */
14
+
15
+ import { promises as fs } from 'fs';
16
+ import path from 'path';
17
+ import crypto from 'crypto';
18
+ import os from 'os';
19
+ import { getUserDataPaths, ensureUserDataDirs } from '../utilities/userDataDir.js';
20
+
21
+ // Encryption configuration
22
+ const ALGORITHM = 'aes-256-gcm';
23
+ const KEY_LENGTH = 32; // 256 bits
24
+ const IV_LENGTH = 16;
25
+ const AUTH_TAG_LENGTH = 16;
26
+ const SALT_LENGTH = 32;
27
+ const PBKDF2_ITERATIONS = 100000;
28
+
29
+ class ApiKeyManager {
30
+ constructor(logger) {
31
+ this.logger = logger;
32
+
33
+ // Global API keys (persisted)
34
+ this.keys = {
35
+ loxiaApiKey: null,
36
+ vendorKeys: {}
37
+ };
38
+
39
+ // Persistence configuration
40
+ this.persistenceFile = null;
41
+ this.encryptionKey = null;
42
+ this.initialized = false;
43
+ }
44
+
45
+ /**
46
+ * Initialize persistence - must be called before using persistence features
47
+ * @returns {Promise<void>}
48
+ */
49
+ async initialize() {
50
+ if (this.initialized) return;
51
+
52
+ try {
53
+ await ensureUserDataDirs();
54
+ const paths = getUserDataPaths();
55
+ this.persistenceFile = path.join(paths.settings, 'api-keys.enc');
56
+
57
+ // Generate or load machine-specific encryption key
58
+ this.encryptionKey = await this._getOrCreateEncryptionKey(paths.settings);
59
+
60
+ // Load persisted keys
61
+ await this.loadFromDisk();
62
+
63
+ this.initialized = true;
64
+ this.logger?.info('[ApiKeyManager] Initialized with persistence', {
65
+ hasLoxiaKey: !!this.keys.loxiaApiKey
66
+ });
67
+ } catch (error) {
68
+ this.logger?.warn('[ApiKeyManager] Persistence initialization failed, using memory-only mode', {
69
+ error: error.message
70
+ });
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Get or create a machine-specific encryption key
76
+ * @param {string} settingsDir - Settings directory path
77
+ * @returns {Promise<Buffer>} Encryption key
78
+ */
79
+ async _getOrCreateEncryptionKey(settingsDir) {
80
+ const saltFile = path.join(settingsDir, '.key-salt');
81
+ let salt;
82
+
83
+ try {
84
+ salt = await fs.readFile(saltFile);
85
+ } catch (error) {
86
+ // Generate new salt
87
+ salt = crypto.randomBytes(SALT_LENGTH);
88
+ await fs.writeFile(saltFile, salt, { mode: 0o600 });
89
+ this.logger?.info('[ApiKeyManager] Generated new encryption salt');
90
+ }
91
+
92
+ // Derive key from salt + machine-specific data
93
+ const machineData = this._getMachineIdentifier();
94
+ const key = crypto.pbkdf2Sync(
95
+ machineData,
96
+ salt,
97
+ PBKDF2_ITERATIONS,
98
+ KEY_LENGTH,
99
+ 'sha256'
100
+ );
101
+
102
+ return key;
103
+ }
104
+
105
+ /**
106
+ * Get a machine-specific identifier for key derivation
107
+ * @returns {string}
108
+ */
109
+ _getMachineIdentifier() {
110
+ const parts = [
111
+ os.hostname(),
112
+ os.homedir(),
113
+ os.userInfo().username,
114
+ process.platform,
115
+ 'loxia-api-key-encryption-v1'
116
+ ];
117
+ return parts.join(':');
118
+ }
119
+
120
+ /**
121
+ * Encrypt data using AES-256-GCM
122
+ * @param {string} plaintext - Data to encrypt
123
+ * @returns {string} Encrypted data as base64
124
+ */
125
+ _encrypt(plaintext) {
126
+ if (!this.encryptionKey) {
127
+ throw new Error('Encryption key not initialized');
128
+ }
129
+
130
+ const iv = crypto.randomBytes(IV_LENGTH);
131
+ const cipher = crypto.createCipheriv(ALGORITHM, this.encryptionKey, iv);
132
+
133
+ let encrypted = cipher.update(plaintext, 'utf8', 'base64');
134
+ encrypted += cipher.final('base64');
135
+
136
+ const authTag = cipher.getAuthTag();
137
+
138
+ // Combine IV + authTag + encrypted data
139
+ const combined = Buffer.concat([
140
+ iv,
141
+ authTag,
142
+ Buffer.from(encrypted, 'base64')
143
+ ]);
144
+
145
+ return combined.toString('base64');
146
+ }
147
+
148
+ /**
149
+ * Decrypt data using AES-256-GCM
150
+ * @param {string} encryptedData - Encrypted data as base64
151
+ * @returns {string} Decrypted plaintext
152
+ */
153
+ _decrypt(encryptedData) {
154
+ if (!this.encryptionKey) {
155
+ throw new Error('Encryption key not initialized');
156
+ }
157
+
158
+ const combined = Buffer.from(encryptedData, 'base64');
159
+
160
+ // Extract IV, authTag, and encrypted data
161
+ const iv = combined.subarray(0, IV_LENGTH);
162
+ const authTag = combined.subarray(IV_LENGTH, IV_LENGTH + AUTH_TAG_LENGTH);
163
+ const encrypted = combined.subarray(IV_LENGTH + AUTH_TAG_LENGTH);
164
+
165
+ const decipher = crypto.createDecipheriv(ALGORITHM, this.encryptionKey, iv);
166
+ decipher.setAuthTag(authTag);
167
+
168
+ let decrypted = decipher.update(encrypted.toString('base64'), 'base64', 'utf8');
169
+ decrypted += decipher.final('utf8');
170
+
171
+ return decrypted;
172
+ }
173
+
174
+ /**
175
+ * Persist keys to encrypted file
176
+ * @returns {Promise<void>}
177
+ */
178
+ async persist() {
179
+ if (!this.persistenceFile || !this.encryptionKey) {
180
+ return; // Persistence not initialized
181
+ }
182
+
183
+ try {
184
+ const data = {
185
+ version: 2,
186
+ savedAt: new Date().toISOString(),
187
+ keys: this.keys
188
+ };
189
+
190
+ const encrypted = this._encrypt(JSON.stringify(data));
191
+ await fs.writeFile(this.persistenceFile, encrypted, { mode: 0o600 });
192
+
193
+ this.logger?.debug('[ApiKeyManager] Keys persisted to disk');
194
+ } catch (error) {
195
+ this.logger?.warn('[ApiKeyManager] Failed to persist keys', { error: error.message });
196
+ }
197
+ }
198
+
199
+ /**
200
+ * Load persisted keys from disk
201
+ * @returns {Promise<void>}
202
+ */
203
+ async loadFromDisk() {
204
+ if (!this.persistenceFile || !this.encryptionKey) {
205
+ return; // Persistence not initialized
206
+ }
207
+
208
+ try {
209
+ const encrypted = await fs.readFile(this.persistenceFile, 'utf8');
210
+ const decrypted = this._decrypt(encrypted);
211
+ const data = JSON.parse(decrypted);
212
+
213
+ // Handle both v1 (session-based) and v2 (global) formats
214
+ if (data.version === 2 && data.keys) {
215
+ // New format: direct global keys
216
+ this.keys = data.keys;
217
+ } else if (data.globalKeys) {
218
+ // Old format: migrate from globalKeys
219
+ this.keys = data.globalKeys;
220
+ }
221
+
222
+ this.logger?.info('[ApiKeyManager] Loaded persisted keys', {
223
+ hasLoxiaKey: !!this.keys.loxiaApiKey,
224
+ vendorKeys: Object.keys(this.keys.vendorKeys || {}),
225
+ savedAt: data.savedAt
226
+ });
227
+ } catch (error) {
228
+ if (error.code === 'ENOENT') {
229
+ this.logger?.debug('[ApiKeyManager] No persisted keys found');
230
+ } else {
231
+ this.logger?.warn('[ApiKeyManager] Failed to load persisted keys', {
232
+ error: error.message
233
+ });
234
+ }
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Set API keys (sessionId parameter kept for API compatibility but ignored)
240
+ * @param {string} sessionId - Ignored, kept for API compatibility
241
+ * @param {Object} keys - API keys object
242
+ * @param {string} keys.loxiaApiKey - Loxia platform API key
243
+ * @param {Object} keys.vendorKeys - Vendor-specific keys
244
+ */
245
+ async setSessionKeys(sessionId, keys) {
246
+ if (keys.loxiaApiKey) {
247
+ this.keys.loxiaApiKey = keys.loxiaApiKey;
248
+ }
249
+ if (keys.vendorKeys) {
250
+ this.keys.vendorKeys = { ...this.keys.vendorKeys, ...keys.vendorKeys };
251
+ }
252
+
253
+ this.logger?.info('[ApiKeyManager] API keys updated', {
254
+ hasLoxiaKey: !!this.keys.loxiaApiKey,
255
+ vendorKeys: Object.keys(this.keys.vendorKeys || {})
256
+ });
257
+
258
+ await this.persist();
259
+ }
260
+
261
+ /**
262
+ * Get API keys (sessionId parameter kept for API compatibility but ignored)
263
+ * @param {string} sessionId - Ignored, kept for API compatibility
264
+ * @returns {Object} API keys object
265
+ */
266
+ getSessionKeys(sessionId) {
267
+ return this.keys;
268
+ }
269
+
270
+ /**
271
+ * Get the appropriate API key for a model/request
272
+ * @param {string} sessionId - Ignored, kept for API compatibility
273
+ * @param {Object} options - Request options
274
+ * @param {boolean} options.platformProvided - Whether this is a platform-provided model
275
+ * @param {string} options.vendor - Vendor name (anthropic, openai, etc.)
276
+ * @returns {Object} { loxiaApiKey, vendorApiKey }
277
+ */
278
+ getKeysForRequest(sessionId, options = {}) {
279
+ const result = {
280
+ loxiaApiKey: this.keys.loxiaApiKey,
281
+ vendorApiKey: null
282
+ };
283
+
284
+ // For direct access models, also include vendor-specific key
285
+ if (!options.platformProvided && options.vendor && this.keys.vendorKeys) {
286
+ result.vendorApiKey = this.keys.vendorKeys[options.vendor];
287
+ }
288
+
289
+ return result;
290
+ }
291
+
292
+ /**
293
+ * Remove API keys (clears all keys)
294
+ * @param {string} sessionId - Ignored, kept for API compatibility
295
+ */
296
+ async removeSessionKeys(sessionId) {
297
+ const hadKeys = !!this.keys.loxiaApiKey;
298
+ this.keys = {
299
+ loxiaApiKey: null,
300
+ vendorKeys: {}
301
+ };
302
+
303
+ if (hadKeys) {
304
+ this.logger?.info('[ApiKeyManager] API keys removed');
305
+ await this.persist();
306
+ }
307
+ return hadKeys;
308
+ }
309
+
310
+ /**
311
+ * Set global API keys (same as setSessionKeys, kept for API compatibility)
312
+ * @param {Object} keys - API keys
313
+ */
314
+ async setGlobalKeys(keys) {
315
+ return this.setSessionKeys(null, keys);
316
+ }
317
+
318
+ /**
319
+ * Get active sessions info (returns empty for compatibility)
320
+ * @returns {Array}
321
+ */
322
+ getActiveSessions() {
323
+ return [];
324
+ }
325
+
326
+ /**
327
+ * Cleanup (no-op, kept for API compatibility)
328
+ */
329
+ cleanupExpiredSessions() {
330
+ return 0;
331
+ }
332
+ }
333
+
334
+ export default ApiKeyManager;
@@ -0,0 +1,196 @@
1
+ /**
2
+ * BenchmarkService - Fetches model benchmark text for routing decisions
3
+ *
4
+ * Purpose:
5
+ * - Fetch benchmark text from Azure backend
6
+ * - Refresh benchmarks periodically
7
+ * - Supply benchmark text to model router (as-is, no processing)
8
+ */
9
+
10
+ import { MODEL_ROUTER_CONFIG } from '../utilities/constants.js';
11
+
12
+ class BenchmarkService {
13
+ constructor(config, logger) {
14
+ this.config = config;
15
+ this.logger = logger;
16
+
17
+ this.benchmarkText = null;
18
+ this.lastUpdated = null;
19
+ this.isLoading = false;
20
+ this.endpointAvailable = true; // Set to false on 404 to stop retrying
21
+
22
+ // Use config backend URL with default fallback
23
+ this.azureBackendUrl = config.backend?.baseUrl || 'https://loxia-api-g7hrb8bxdae8a2h7.z02.azurefd.net';
24
+ this.refreshInterval = MODEL_ROUTER_CONFIG.BENCHMARK_REFRESH_INTERVAL;
25
+ }
26
+
27
+ /**
28
+ * Initialize benchmark service and load initial data
29
+ */
30
+ async initialize() {
31
+ try {
32
+ await this.loadBenchmarks();
33
+ this._scheduleRefresh();
34
+ this.logger.info('Benchmark service initialized');
35
+ } catch (error) {
36
+ this.logger.error('Failed to initialize benchmark service', { error: error.message });
37
+ this.benchmarkText = null;
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Get current benchmark text
43
+ */
44
+ getBenchmarks() {
45
+ if (!this.benchmarkText) {
46
+ this.logger.warn('No benchmark data available');
47
+ return null;
48
+ }
49
+ return this.benchmarkText;
50
+ }
51
+
52
+ /**
53
+ * Get benchmark text for router prompt (alias for consistency)
54
+ */
55
+ getBenchmarkTable() {
56
+ return this.getBenchmarks();
57
+ }
58
+
59
+ /**
60
+ * Load benchmarks from Azure backend
61
+ */
62
+ async loadBenchmarks() {
63
+ if (this.isLoading) {
64
+ this.logger.debug('Benchmark loading already in progress');
65
+ return;
66
+ }
67
+
68
+ if (!this.endpointAvailable) {
69
+ return;
70
+ }
71
+
72
+ this.isLoading = true;
73
+
74
+ try {
75
+ const text = await this._fetchFromAzureBackend();
76
+
77
+ if (text) {
78
+ this.benchmarkText = text;
79
+ this.lastUpdated = new Date();
80
+ this.logger.info('Benchmarks loaded from Azure backend');
81
+ } else {
82
+ throw new Error('No benchmark data received from backend');
83
+ }
84
+
85
+ } catch (error) {
86
+ // If the endpoint doesn't exist (404), stop retrying — it won't appear later
87
+ if (error.message.includes('404')) {
88
+ this.endpointAvailable = false;
89
+ this.logger.warn('Benchmark endpoint not available (404) — disabled until restart');
90
+ } else {
91
+ this.logger.error('Failed to fetch benchmarks from Azure backend', {
92
+ error: error.message
93
+ });
94
+ }
95
+
96
+ if (!this.benchmarkText) {
97
+ this.benchmarkText = null;
98
+ }
99
+
100
+ } finally {
101
+ this.isLoading = false;
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Check if benchmarks need refresh
107
+ */
108
+ needsRefresh() {
109
+ if (!this.lastUpdated) return true;
110
+
111
+ const timeSinceUpdate = Date.now() - this.lastUpdated.getTime();
112
+ return timeSinceUpdate > this.refreshInterval;
113
+ }
114
+
115
+ /**
116
+ * Fetch benchmarks from Azure backend as plain text
117
+ * @private
118
+ */
119
+ async _fetchFromAzureBackend() {
120
+ const url = `${this.azureBackendUrl}/llm/model-benchmarks`;
121
+
122
+ let apiKey = null;
123
+ if (this.config.apiKey) {
124
+ apiKey = this.config.apiKey;
125
+ }
126
+
127
+ // Use AbortController for timeout (Node.js fetch doesn't support timeout option)
128
+ const controller = new AbortController();
129
+ const timeoutId = setTimeout(() => controller.abort(), 10000);
130
+
131
+ const fetchOptions = {
132
+ method: 'GET',
133
+ headers: {
134
+ 'Accept': 'text/plain',
135
+ ...(apiKey && { 'Authorization': `Bearer ${apiKey}` })
136
+ },
137
+ signal: controller.signal
138
+ };
139
+
140
+ this.logger.debug('Fetching benchmarks from Azure backend', { url });
141
+
142
+ try {
143
+ const response = await fetch(url, fetchOptions);
144
+ clearTimeout(timeoutId);
145
+
146
+ if (!response.ok) {
147
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
148
+ }
149
+
150
+ const text = await response.text();
151
+ return text;
152
+ } catch (error) {
153
+ clearTimeout(timeoutId);
154
+ if (error.name === 'AbortError') {
155
+ throw new Error('Request timeout after 10 seconds');
156
+ }
157
+ throw error;
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Schedule periodic refresh
163
+ * @private
164
+ */
165
+ _scheduleRefresh() {
166
+ setInterval(async () => {
167
+ if (this.needsRefresh()) {
168
+ this.logger.debug('Refreshing benchmark data');
169
+ await this.loadBenchmarks();
170
+ }
171
+ }, this.refreshInterval);
172
+ }
173
+
174
+ /**
175
+ * Force refresh benchmarks
176
+ */
177
+ async forceRefresh() {
178
+ this.logger.info('Force refreshing benchmark data');
179
+ await this.loadBenchmarks();
180
+ }
181
+
182
+ /**
183
+ * Get service status
184
+ */
185
+ getStatus() {
186
+ return {
187
+ initialized: !!this.benchmarkText,
188
+ lastUpdated: this.lastUpdated?.toISOString() || null,
189
+ isLoading: this.isLoading,
190
+ needsRefresh: this.needsRefresh(),
191
+ hasData: !!this.benchmarkText
192
+ };
193
+ }
194
+ }
195
+
196
+ export default BenchmarkService;