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,603 @@
1
+ /**
2
+ * Main Layout Component
3
+ * Integrates all state management hooks and renders the complete UI
4
+ */
5
+
6
+ import React, { useState, useEffect } from 'react';
7
+ import { Box, useInput, useStdout } from 'ink';
8
+ import { debugLog } from '../utils/debugLogger.js';
9
+
10
+ // Import state management hooks
11
+ import { SessionManager } from '../api/session.js';
12
+ import { WebSocketManager } from '../api/websocket.js';
13
+ import { MessageRouter } from '../api/messageRouter.js';
14
+ import { useConnection } from '../state/useConnection.js';
15
+ import { useAgents } from '../state/useAgents.js';
16
+ import { useMessages } from '../state/useMessages.js';
17
+ import { useAgentControl } from '../state/useAgentControl.js';
18
+ import { useTools } from '../state/useTools.js';
19
+
20
+ // Import settings storage utility
21
+ import { loadSettings, saveSettings, hasLoxiaApiKey } from '../utils/settingsStorage.js';
22
+
23
+ // Import child components
24
+ import Header from './Header.js';
25
+ import StatusBar from './StatusBar.js';
26
+ import MessageList from './MessageList.js';
27
+ import InputBox from './InputBox.js';
28
+
29
+ // Import Phase 10 advanced components
30
+ import AgentSwitcher from './AgentSwitcher.js';
31
+ import AgentCreator from './AgentCreator.js';
32
+ import AgentEditor from './AgentEditor.js';
33
+ import SettingsPanel from './SettingsPanel.js';
34
+ import SearchPanel from './SearchPanel.js';
35
+ import HelpPanel from './HelpPanel.js';
36
+ import ErrorPanel from './ErrorPanel.js';
37
+
38
+ /**
39
+ * Main Layout Component
40
+ */
41
+ export function Layout({ host = 'localhost', port = 8080 }) {
42
+ // Get terminal dimensions for responsive layout
43
+ const { stdout } = useStdout();
44
+ const terminalHeight = stdout?.rows || 24; // Default to 24 rows if not available
45
+ const terminalWidth = stdout?.columns || 80; // Default to 80 columns if not available
46
+
47
+ // Calculate compact mode: hide header/statusbar if terminal is too small
48
+ // Minimum comfortable height: 15 rows (3 for input, 12+ for messages)
49
+ const compactMode = terminalHeight < 15;
50
+
51
+ // Phase 10: Settings state - Load from persistent storage (must load before creating managers)
52
+ const [settings, setSettings] = useState(() => loadSettings());
53
+
54
+ // Initialize managers (with settings)
55
+ const [sessionManager] = useState(() => new SessionManager(host, port));
56
+ const [wsManager] = useState(() => new WebSocketManager(host, port, {
57
+ reconnectDelay: settings.reconnectDelay,
58
+ heartbeatInterval: settings.heartbeatInterval,
59
+ }));
60
+ const [messageRouter] = useState(() => new MessageRouter(wsManager));
61
+
62
+ // Current agent state
63
+ const [currentAgent, setCurrentAgent] = useState(null);
64
+
65
+ // Phase 10: Overlay state
66
+ const [activeOverlay, setActiveOverlay] = useState(null); // 'switcher', 'creator', 'editor', 'settings', 'search', 'help', 'errors'
67
+
68
+ // Agent being edited
69
+ const [agentToEdit, setAgentToEdit] = useState(null);
70
+
71
+ // Error tracking state
72
+ const [errors, setErrors] = useState([]);
73
+
74
+ // Add error to the error log
75
+ const addError = (type, message, stack) => {
76
+ const error = {
77
+ timestamp: Date.now(),
78
+ type: type || 'ERROR',
79
+ message: message || 'Unknown error',
80
+ stack: stack || '',
81
+ };
82
+
83
+ setErrors(prev => {
84
+ // Keep max 50 errors
85
+ const newErrors = [error, ...prev].slice(0, 50);
86
+ return newErrors;
87
+ });
88
+ };
89
+
90
+ // Clear all errors
91
+ const clearErrors = () => {
92
+ setErrors([]);
93
+ };
94
+
95
+ // Dismiss a single error
96
+ const dismissError = (index) => {
97
+ setErrors(prev => prev.filter((_, i) => i !== index));
98
+ };
99
+
100
+ // Set up global error listeners
101
+ useEffect(() => {
102
+ const handleError = (error) => {
103
+ addError('UNCAUGHT EXCEPTION', error.message, error.stack);
104
+ };
105
+
106
+ const handleRejection = (reason) => {
107
+ const message = reason?.message || String(reason);
108
+ const stack = reason?.stack || '';
109
+ addError('UNHANDLED REJECTION', message, stack);
110
+ };
111
+
112
+ // Capture console.error calls (suppress output to prevent UI corruption)
113
+ const originalConsoleError = console.error;
114
+ console.error = (...args) => {
115
+ const message = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
116
+ addError('CONSOLE ERROR', message);
117
+ // DON'T call original console.error to prevent errors appearing above UI
118
+ };
119
+
120
+ process.on('uncaughtException', handleError);
121
+ process.on('unhandledRejection', handleRejection);
122
+
123
+ return () => {
124
+ process.removeListener('uncaughtException', handleError);
125
+ process.removeListener('unhandledRejection', handleRejection);
126
+ console.error = originalConsoleError;
127
+ };
128
+ }, []);
129
+
130
+ // Connection state
131
+ const connection = useConnection(sessionManager, wsManager);
132
+
133
+ // Agent management
134
+ const agents = useAgents(sessionManager, messageRouter);
135
+
136
+ // Messages management
137
+ const messages = useMessages(sessionManager, messageRouter, currentAgent?.agentId);
138
+
139
+ // Agent control (mode, model)
140
+ const agentControl = useAgentControl(sessionManager, messageRouter, currentAgent);
141
+
142
+ // Tools management
143
+ const tools = useTools(sessionManager, messageRouter, currentAgent?.agentId);
144
+
145
+ // Initialize connection on mount
146
+ useEffect(() => {
147
+ connection.connect();
148
+
149
+ return () => {
150
+ connection.disconnect();
151
+ };
152
+ }, []);
153
+
154
+ // Load agents when connected
155
+ useEffect(() => {
156
+ if (connection.isConnected && agents.agents.length === 0) {
157
+ agents.fetchAgents();
158
+ }
159
+ // eslint-disable-next-line react-hooks/exhaustive-deps
160
+ }, [connection.isConnected, agents.agents.length]);
161
+
162
+ // Set current agent when agents are loaded
163
+ useEffect(() => {
164
+ if (agents.agents.length > 0 && !currentAgent) {
165
+ setCurrentAgent(agents.agents[0]);
166
+ }
167
+ // eslint-disable-next-line react-hooks/exhaustive-deps
168
+ }, [agents.agents.length, currentAgent]);
169
+
170
+ // Onboarding: Auto-show settings if no Loxia API key is configured
171
+ useEffect(() => {
172
+ if (!hasLoxiaApiKey()) {
173
+ // Delay slightly to allow UI to initialize
174
+ const timer = setTimeout(() => {
175
+ setActiveOverlay('settings');
176
+ }, 500);
177
+ return () => clearTimeout(timer);
178
+ }
179
+ }, []);
180
+
181
+ // Register API keys with SessionManager on connection
182
+ useEffect(() => {
183
+ const registerApiKeys = async () => {
184
+ if (connection.isConnected && settings.apiKeys) {
185
+ try {
186
+ await sessionManager.setApiKeys(
187
+ settings.apiKeys.loxia,
188
+ {
189
+ anthropic: settings.apiKeys.anthropic,
190
+ openai: settings.apiKeys.openai,
191
+ deepseek: settings.apiKeys.deepseek,
192
+ }
193
+ );
194
+ } catch (error) {
195
+ // Silently fail - user will see errors when making requests
196
+ addError('API KEY ERROR', `Failed to register API keys on startup: ${error.message}`);
197
+ }
198
+ }
199
+ };
200
+
201
+ registerApiKeys();
202
+ // eslint-disable-next-line react-hooks/exhaustive-deps
203
+ }, [connection.isConnected]);
204
+
205
+ // Keyboard shortcuts - only enable if raw mode is supported
206
+ const isRawModeSupported = process.stdin.isTTY && typeof process.stdin.setRawMode === 'function';
207
+
208
+ useInput((char, key) => {
209
+ // Skip if raw mode is not supported
210
+ if (!isRawModeSupported) {
211
+ return;
212
+ }
213
+
214
+ // Don't handle shortcuts if an overlay is active (overlays handle their own input)
215
+ if (activeOverlay) {
216
+ return;
217
+ }
218
+
219
+ // Phase 10: Advanced feature shortcuts
220
+ // Ctrl+S - Agent Switcher
221
+ if (key.ctrl && char === 's') {
222
+ setActiveOverlay('switcher');
223
+ }
224
+ // Ctrl+N - New Agent Creator
225
+ else if (key.ctrl && char === 'n') {
226
+ setActiveOverlay('creator');
227
+ }
228
+ // Alt+S - Settings Panel (changed from Ctrl+, to avoid Windows settings conflict)
229
+ else if (key.meta && char === 's') {
230
+ setActiveOverlay('settings');
231
+ }
232
+ // Ctrl+F - Search Panel
233
+ else if (key.ctrl && char === 'f') {
234
+ setActiveOverlay('search');
235
+ }
236
+ // Ctrl+E - Error Panel
237
+ else if (key.ctrl && char === 'e') {
238
+ setActiveOverlay('errors');
239
+ }
240
+ // Alt+H - Help Panel (Ctrl+H conflicts with backspace, F1 doesn't work in remote terminals)
241
+ else if (key.meta && char === 'h') {
242
+ setActiveOverlay('help');
243
+ }
244
+
245
+ // Phase 9: Existing shortcuts
246
+ // Ctrl+R - Refresh/Reconnect
247
+ else if (key.ctrl && char === 'r') {
248
+ if (connection.isConnected) {
249
+ connection.reconnect();
250
+ } else {
251
+ connection.connect();
252
+ }
253
+ }
254
+ // Ctrl+L - Clear messages
255
+ else if (key.ctrl && char === 'l') {
256
+ messages.clearMessages();
257
+ }
258
+ // Ctrl+A - Reload agents
259
+ else if (key.ctrl && char === 'a') {
260
+ agents.fetchAgents();
261
+ }
262
+ // Ctrl+T - Reload tools
263
+ else if (key.ctrl && char === 't') {
264
+ if (currentAgent) {
265
+ tools.fetchTools();
266
+ }
267
+ }
268
+ }, { isActive: isRawModeSupported });
269
+
270
+ // Send message handler
271
+ const handleSendMessage = async (content) => {
272
+ // DEBUG: Log received content
273
+ debugLog('Layout handleSendMessage', ' Called with content:', JSON.stringify(content));
274
+ debugLog('Layout handleSendMessage', ' content type:', typeof content);
275
+ debugLog('Layout handleSendMessage', ' content value:', content);
276
+
277
+ // Defensive validation: ensure content is a non-empty string
278
+ if (typeof content !== 'string' || !content || content.trim().length === 0) {
279
+ debugLog('Layout handleSendMessage', ' VALIDATION FAILED - content is invalid');
280
+ debugLog('Layout handleSendMessage', ' typeof content:', typeof content);
281
+ debugLog('Layout handleSendMessage', ' !content:', !content);
282
+ debugLog('Layout handleSendMessage', ' trim length:', typeof content === 'string' ? content.trim().length : 'N/A');
283
+ addError('MESSAGE ERROR', 'Cannot send message: content is empty or invalid');
284
+ return;
285
+ }
286
+
287
+ debugLog('Layout handleSendMessage', ' Validation PASSED, currentAgent:', currentAgent?.name);
288
+
289
+ if (!currentAgent) {
290
+ debugLog('Layout handleSendMessage', ' BLOCKED: No current agent');
291
+ return;
292
+ }
293
+
294
+ try {
295
+ debugLog('Layout handleSendMessage', ' Calling messages.sendMessage with:', JSON.stringify(content));
296
+ await messages.sendMessage(content);
297
+ debugLog('Layout handleSendMessage', ' messages.sendMessage completed successfully');
298
+ } catch (error) {
299
+ // Add to error panel instead of console
300
+ debugLog('Layout handleSendMessage', ' ERROR:', error.message);
301
+ addError('MESSAGE ERROR', `Failed to send message: ${error.message}`, error.stack);
302
+ }
303
+ };
304
+
305
+ // Handle errors from MessageList
306
+ const handleMessageError = (errorMessage) => {
307
+ addError('MESSAGE ERROR', errorMessage);
308
+ };
309
+
310
+ // Agent switching handler
311
+ const handleSwitchAgent = async (agent) => {
312
+ if (!agent) return;
313
+
314
+ setActiveOverlay(null);
315
+
316
+ // Check if agent is loaded - if not, use switchAgent to load it first
317
+ if (!agent.isLoaded) {
318
+ try {
319
+ const result = await agents.switchAgent(agent.agentId);
320
+ if (result.success) {
321
+ // Get the updated agent after import
322
+ const updatedAgent = agents.agents.find(a => a.agentId === agent.agentId) || agent;
323
+ setCurrentAgent({ ...updatedAgent, isLoaded: true });
324
+ } else {
325
+ addError('AGENT ERROR', `Failed to load agent: ${result.error || 'Unknown error'}`);
326
+ }
327
+ } catch (err) {
328
+ addError('AGENT ERROR', `Failed to load agent: ${err.message}`);
329
+ }
330
+ } else {
331
+ setCurrentAgent(agent);
332
+ }
333
+ };
334
+
335
+ // Agent editing handler
336
+ const handleEditAgent = (agent) => {
337
+ if (agent) {
338
+ setAgentToEdit(agent);
339
+ setActiveOverlay('editor');
340
+ }
341
+ };
342
+
343
+ // Agent save handler (from editor)
344
+ const handleSaveAgent = async (agentId, updates) => {
345
+ try {
346
+ // Call useAgents hook's updateAgentConfig method
347
+ await agents.updateAgentConfig(agentId, updates);
348
+
349
+ // Update currentAgent if it was the one being edited
350
+ if (currentAgent?.agentId === agentId) {
351
+ setCurrentAgent({ ...currentAgent, ...updates });
352
+ }
353
+
354
+ // Refresh agent list to ensure consistency
355
+ await agents.fetchAgents();
356
+
357
+ // Close editor overlay
358
+ setActiveOverlay(null);
359
+ setAgentToEdit(null);
360
+ } catch (error) {
361
+ // Re-throw to let AgentEditor handle the error display
362
+ throw error;
363
+ }
364
+ };
365
+
366
+ // Agent deletion handler
367
+ const handleDeleteAgent = async (agent) => {
368
+ try {
369
+ // Call useAgents hook's deleteAgent method
370
+ await agents.deleteAgent(agent.agentId);
371
+
372
+ // If the deleted agent was current, update currentAgent to the new current one from agents hook
373
+ if (currentAgent?.agentId === agent.agentId) {
374
+ // useAgents already switched to another agent, just update local state
375
+ const remainingAgents = agents.agents.filter(a => a.agentId !== agent.agentId);
376
+ if (remainingAgents.length > 0) {
377
+ setCurrentAgent(remainingAgents[0]);
378
+ } else {
379
+ setCurrentAgent(null);
380
+ }
381
+ }
382
+
383
+ // Refresh agent list to ensure consistency
384
+ await agents.fetchAgents();
385
+ } catch (error) {
386
+ addError('AGENT DELETION ERROR', `Failed to delete agent: ${error.message}`, error.stack);
387
+ }
388
+ };
389
+
390
+ // Phase 10: Overlay handlers
391
+ const handleCreateAgent = async (formData) => {
392
+ console.log('[DEBUG handleCreateAgent] Called with formData:', formData);
393
+ try {
394
+ console.log('[DEBUG handleCreateAgent] Calling agents.createAgent...');
395
+ // Create agent using useAgents hook
396
+ const result = await agents.createAgent({
397
+ name: formData.name,
398
+ model: formData.model,
399
+ mode: formData.mode || 'AGENT',
400
+ systemPrompt: formData.systemPrompt || '',
401
+ dynamicModelRouting: formData.dynamicModelRouting !== undefined ? formData.dynamicModelRouting : true, // User choice or default to enabled
402
+ platformProvided: true, // Use platform routing (not direct API access)
403
+ capabilities: formData.capabilities || [], // User-selected capabilities
404
+ switchTo: true, // Automatically switch to newly created agent
405
+ });
406
+
407
+ console.log('[DEBUG handleCreateAgent] Result:', result);
408
+ console.log('[DEBUG handleCreateAgent] result.success:', result.success, 'result.agent:', result.agent);
409
+
410
+ if (result.success && result.agent) {
411
+ // Agent was created and added to the list automatically by useAgents hook
412
+ // The hook also set it as current agent (switchTo: true)
413
+ console.log('[DEBUG handleCreateAgent] SUCCESS! Setting current agent and closing overlay');
414
+ setCurrentAgent(result.agent);
415
+ setActiveOverlay(null);
416
+ console.log('[DEBUG handleCreateAgent] setActiveOverlay(null) called');
417
+ } else {
418
+ console.log('[DEBUG handleCreateAgent] FAILED! result.success or result.agent is falsy');
419
+ addError('AGENT CREATION ERROR', 'Failed to create agent: Unknown error');
420
+ // Close overlay anyway so user isn't stuck - they can see error in error panel (Ctrl+E)
421
+ setActiveOverlay(null);
422
+ }
423
+ } catch (error) {
424
+ console.log('[DEBUG handleCreateAgent] EXCEPTION:', error.message, error.stack);
425
+ addError('AGENT CREATION ERROR', `Failed to create agent: ${error.message}`, error.stack);
426
+ // Close overlay anyway so user isn't stuck - they can see error in error panel (Ctrl+E)
427
+ setActiveOverlay(null);
428
+ }
429
+ };
430
+
431
+ const handleSaveSettings = async (newSettings) => {
432
+ try {
433
+ // Persist settings to disk
434
+ const success = saveSettings(newSettings);
435
+ if (!success) {
436
+ addError('SETTINGS ERROR', 'Failed to save settings to disk');
437
+ return;
438
+ }
439
+
440
+ // Update local state
441
+ setSettings(newSettings);
442
+
443
+ // Register API keys with SessionManager if provided
444
+ if (newSettings.apiKeys) {
445
+ try {
446
+ await sessionManager.setApiKeys(
447
+ newSettings.apiKeys.loxia,
448
+ {
449
+ anthropic: newSettings.apiKeys.anthropic,
450
+ openai: newSettings.apiKeys.openai,
451
+ deepseek: newSettings.apiKeys.deepseek,
452
+ }
453
+ );
454
+ } catch (error) {
455
+ // API key registration failed, but settings were saved
456
+ addError('API KEY ERROR', `Settings saved but failed to register API keys: ${error.message}`);
457
+ }
458
+ }
459
+
460
+ // Close settings overlay
461
+ setActiveOverlay(null);
462
+ } catch (error) {
463
+ addError('SETTINGS ERROR', `Failed to save settings: ${error.message}`, error.stack);
464
+ }
465
+ };
466
+
467
+ const handleSelectMessage = (message) => {
468
+ // Scroll to or highlight the selected message
469
+ console.log('Selected message:', message.id);
470
+ setActiveOverlay(null);
471
+ };
472
+
473
+ const handleCloseOverlay = () => {
474
+ setActiveOverlay(null);
475
+ setAgentToEdit(null); // Clear agent to edit when closing
476
+ };
477
+
478
+ // Conditional rendering: if overlay is active, render ONLY the overlay
479
+ // This is the Ink-native way to handle modals (no absolute positioning support)
480
+ if (activeOverlay === 'switcher') {
481
+ return React.createElement(AgentSwitcher, {
482
+ agents: agents.agents,
483
+ currentAgentId: currentAgent?.agentId,
484
+ onSelect: handleSwitchAgent,
485
+ onClose: handleCloseOverlay,
486
+ onDelete: handleDeleteAgent, // Pass delete handler
487
+ onEdit: handleEditAgent, // Pass edit handler
488
+ terminalHeight, // Pass terminal dimensions for fullscreen rendering
489
+ terminalWidth,
490
+ });
491
+ }
492
+
493
+ if (activeOverlay === 'editor') {
494
+ return React.createElement(AgentEditor, {
495
+ agent: agentToEdit,
496
+ onSave: handleSaveAgent,
497
+ onClose: handleCloseOverlay,
498
+ availableModels: ['anthropic-sonnet', 'anthropic-haiku', 'gpt-4', 'gpt-4-mini', 'gpt-5.1-codex-mini', 'deepseek-r1', 'phi-4', 'phi-4-reasoning'],
499
+ terminalHeight, // Pass terminal dimensions for fullscreen rendering
500
+ terminalWidth,
501
+ });
502
+ }
503
+
504
+ if (activeOverlay === 'creator') {
505
+ return React.createElement(AgentCreator, {
506
+ sessionManager,
507
+ onCancel: handleCloseOverlay,
508
+ onCreate: handleCreateAgent,
509
+ terminalHeight, // Pass terminal dimensions for fullscreen rendering
510
+ terminalWidth,
511
+ });
512
+ }
513
+
514
+ if (activeOverlay === 'settings') {
515
+ return React.createElement(SettingsPanel, {
516
+ settings,
517
+ onSave: handleSaveSettings,
518
+ onCancel: handleCloseOverlay,
519
+ terminalHeight, // Pass terminal dimensions for fullscreen rendering
520
+ terminalWidth,
521
+ });
522
+ }
523
+
524
+ if (activeOverlay === 'search') {
525
+ return React.createElement(SearchPanel, {
526
+ messages: messages.messages,
527
+ onSelect: handleSelectMessage,
528
+ onClose: handleCloseOverlay,
529
+ terminalHeight, // Pass terminal dimensions for fullscreen rendering
530
+ terminalWidth,
531
+ });
532
+ }
533
+
534
+ if (activeOverlay === 'help') {
535
+ return React.createElement(HelpPanel, {
536
+ onClose: handleCloseOverlay,
537
+ terminalHeight, // Pass terminal dimensions for fullscreen rendering
538
+ terminalWidth,
539
+ });
540
+ }
541
+
542
+ if (activeOverlay === 'errors') {
543
+ return React.createElement(ErrorPanel, {
544
+ errors,
545
+ onClose: handleCloseOverlay,
546
+ onClear: clearErrors,
547
+ onDismiss: dismissError,
548
+ terminalHeight, // Pass terminal dimensions for fullscreen rendering
549
+ terminalWidth,
550
+ });
551
+ }
552
+
553
+ // Default: render normal UI layout (responsive based on terminal height)
554
+ return React.createElement(
555
+ Box,
556
+ { flexDirection: 'column', minHeight: terminalHeight, maxHeight: terminalHeight },
557
+ // Header (hidden in compact mode)
558
+ !compactMode && React.createElement(Header, {
559
+ currentAgent,
560
+ connectionStatus: connection.connectionStatus,
561
+ isConnected: connection.isConnected,
562
+ }),
563
+
564
+ // Main content area (message list) - fills remaining space
565
+ React.createElement(MessageList, {
566
+ messages: messages.messages,
567
+ loading: messages.loading,
568
+ error: messages.error,
569
+ onError: handleMessageError,
570
+ compactMode, // Pass compact mode flag
571
+ currentAgent, // Pass current agent for compact mode display
572
+ isConnected: connection.isConnected, // Pass connection status for compact mode
573
+ terminalHeight, // Pass terminal height for scroll calculation
574
+ terminalWidth, // Pass terminal width for responsive rendering
575
+ showTimestamps: settings.showTimestamps, // Pass showTimestamps setting
576
+ colorScheme: settings.colorScheme, // Pass colorScheme setting
577
+ }),
578
+
579
+ // Input box
580
+ React.createElement(InputBox, {
581
+ onSubmit: handleSendMessage,
582
+ disabled: !connection.isConnected || !currentAgent,
583
+ placeholder: currentAgent
584
+ ? `Message ${currentAgent.name}...`
585
+ : 'No agent selected',
586
+ }),
587
+
588
+ // Status bar (hidden in compact mode)
589
+ !compactMode && React.createElement(StatusBar, {
590
+ connectionStatus: connection.connectionStatus,
591
+ connectionUptime: connection.connectionUptime,
592
+ currentAgent,
593
+ currentMode: agentControl.currentMode,
594
+ messageCount: messages.messages.length,
595
+ activeAgentCount: agents.agents.filter(a => a.isLoaded).length,
596
+ totalAgentCount: agents.agents.length,
597
+ toolCount: tools.tools.length,
598
+ errorCount: errors.length,
599
+ })
600
+ );
601
+ }
602
+
603
+ export default Layout;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * LoadingSpinner Component
3
+ * Displays an animated spinner for loading states
4
+ */
5
+
6
+ import React, { useState, useEffect } from 'react';
7
+ import { Box, Text } from 'ink';
8
+
9
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
10
+ const DOTS_FRAMES = ['. ', '.. ', '...', ' '];
11
+ const BAR_FRAMES = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█', '▇', '▆', '▅', '▄', '▃', '▂'];
12
+
13
+ /**
14
+ * LoadingSpinner Component
15
+ * @param {Object} props
16
+ * @param {string} props.label - Label text to display
17
+ * @param {string} props.type - Spinner type: 'spinner', 'dots', 'bar'
18
+ * @param {string} props.color - Text color
19
+ * @param {number} props.interval - Animation interval in ms
20
+ */
21
+ export function LoadingSpinner({
22
+ label = 'Loading',
23
+ type = 'spinner',
24
+ color = 'cyan',
25
+ interval = 80,
26
+ }) {
27
+ const [frame, setFrame] = useState(0);
28
+
29
+ useEffect(() => {
30
+ const timer = setInterval(() => {
31
+ setFrame((prev) => {
32
+ const frames = type === 'spinner' ? SPINNER_FRAMES : type === 'bar' ? BAR_FRAMES : DOTS_FRAMES;
33
+ return (prev + 1) % frames.length;
34
+ });
35
+ }, interval);
36
+
37
+ return () => clearInterval(timer);
38
+ }, [type, interval]);
39
+
40
+ const frames = type === 'spinner' ? SPINNER_FRAMES : type === 'bar' ? BAR_FRAMES : DOTS_FRAMES;
41
+ const currentFrame = frames[frame];
42
+
43
+ return React.createElement(
44
+ Box,
45
+ {},
46
+ React.createElement(Text, { color }, currentFrame + ' ' + label)
47
+ );
48
+ }
49
+
50
+ /**
51
+ * Inline loading indicator (no box wrapper)
52
+ */
53
+ export function InlineSpinner({ type = 'spinner', color = 'cyan' }) {
54
+ const [frame, setFrame] = useState(0);
55
+
56
+ useEffect(() => {
57
+ const timer = setInterval(() => {
58
+ setFrame((prev) => {
59
+ const frames = type === 'spinner' ? SPINNER_FRAMES : type === 'bar' ? BAR_FRAMES : DOTS_FRAMES;
60
+ return (prev + 1) % frames.length;
61
+ });
62
+ }, 80);
63
+
64
+ return () => clearInterval(timer);
65
+ }, [type]);
66
+
67
+ const frames = type === 'spinner' ? SPINNER_FRAMES : type === 'bar' ? BAR_FRAMES : DOTS_FRAMES;
68
+ return React.createElement(Text, { color }, frames[frame]);
69
+ }
70
+
71
+ export default LoadingSpinner;